 2af510328e
			
		
	
	2af510328e
	
	
	
		
			
			* rename references to `Multiworld` in core to `multiworld` instead of `world` * fix smz3 * fix oot * fix low hanging fruit * revert mysteriously broken spacing in world api.md * fix more randomly broken spacing * hate * that better be all of it * begrudgingly move over smw * ._. * missed some worlds * this is getting tedious now * Missed some self.world definitions Co-authored-by: espeon65536 <espeon65536@gmail.com> Co-authored-by: Zach Parks <zach@alliware.com>
		
			
				
	
	
		
			726 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			726 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import typing
 | |
| 
 | |
| from BaseClasses import MultiWorld, Region, Entrance
 | |
| from .Items import SA2BItem
 | |
| from .Locations import SA2BLocation, boss_gate_location_table, boss_gate_set
 | |
| from .Names import LocationName, ItemName
 | |
| from .GateBosses import get_boss_name, all_gate_bosses_table, king_boom_boo
 | |
| 
 | |
| 
 | |
| class LevelGate:
 | |
|     gate_levels: typing.List[int]
 | |
|     gate_emblem_count: int
 | |
| 
 | |
|     def __init__(self, emblems):
 | |
|         self.gate_emblem_count = emblems
 | |
|         self.gate_levels = list()
 | |
| 
 | |
| 
 | |
| shuffleable_regions = [
 | |
|     LocationName.city_escape_region,
 | |
|     LocationName.wild_canyon_region,
 | |
|     LocationName.prison_lane_region,
 | |
|     LocationName.metal_harbor_region,
 | |
|     LocationName.green_forest_region,
 | |
|     LocationName.pumpkin_hill_region,
 | |
|     LocationName.mission_street_region,
 | |
|     LocationName.aquatic_mine_region,
 | |
|     LocationName.route_101_region,
 | |
|     LocationName.hidden_base_region,
 | |
|     LocationName.pyramid_cave_region,
 | |
|     LocationName.death_chamber_region,
 | |
|     LocationName.eternal_engine_region,
 | |
|     LocationName.meteor_herd_region,
 | |
|     LocationName.crazy_gadget_region,
 | |
|     LocationName.final_rush_region,
 | |
|     LocationName.iron_gate_region,
 | |
|     LocationName.dry_lagoon_region,
 | |
|     LocationName.sand_ocean_region,
 | |
|     LocationName.radical_highway_region,
 | |
|     LocationName.egg_quarters_region,
 | |
|     LocationName.lost_colony_region,
 | |
|     LocationName.weapons_bed_region,
 | |
|     LocationName.security_hall_region,
 | |
|     LocationName.white_jungle_region,
 | |
|     LocationName.route_280_region,
 | |
|     LocationName.sky_rail_region,
 | |
|     LocationName.mad_space_region,
 | |
|     LocationName.cosmic_wall_region,
 | |
|     LocationName.final_chase_region,
 | |
| ]
 | |
| 
 | |
| gate_0_blacklist_regions = [
 | |
|     LocationName.hidden_base_region,
 | |
|     LocationName.eternal_engine_region,
 | |
|     LocationName.crazy_gadget_region,
 | |
|     LocationName.security_hall_region,
 | |
|     LocationName.cosmic_wall_region,
 | |
| ]
 | |
| 
 | |
| gate_0_whitelist_regions = [
 | |
|     LocationName.city_escape_region,
 | |
|     LocationName.wild_canyon_region,
 | |
|     LocationName.prison_lane_region,
 | |
|     LocationName.metal_harbor_region,
 | |
|     LocationName.green_forest_region,
 | |
|     LocationName.pumpkin_hill_region,
 | |
|     LocationName.mission_street_region,
 | |
|     LocationName.aquatic_mine_region,
 | |
|     LocationName.route_101_region,
 | |
|     LocationName.pyramid_cave_region,
 | |
|     LocationName.death_chamber_region,
 | |
|     LocationName.meteor_herd_region,
 | |
|     LocationName.final_rush_region,
 | |
|     LocationName.iron_gate_region,
 | |
|     LocationName.dry_lagoon_region,
 | |
|     LocationName.sand_ocean_region,
 | |
|     LocationName.radical_highway_region,
 | |
|     LocationName.egg_quarters_region,
 | |
|     LocationName.lost_colony_region,
 | |
|     LocationName.weapons_bed_region,
 | |
|     LocationName.white_jungle_region,
 | |
|     LocationName.route_280_region,
 | |
|     LocationName.sky_rail_region,
 | |
|     LocationName.mad_space_region,
 | |
|     LocationName.final_chase_region,
 | |
| ]
 | |
| 
 | |
| 
 | |
| def create_regions(world, player: int, active_locations):
 | |
|     menu_region = create_region(world, player, active_locations, 'Menu', None, None)
 | |
|     gate_0_region = create_region(world, player, active_locations, 'Gate 0', None, None)
 | |
|     gate_1_region = create_region(world, player, active_locations, 'Gate 1', None, None)
 | |
|     gate_2_region = create_region(world, player, active_locations, 'Gate 2', None, None)
 | |
|     gate_3_region = create_region(world, player, active_locations, 'Gate 3', None, None)
 | |
|     gate_4_region = create_region(world, player, active_locations, 'Gate 4', None, None)
 | |
|     gate_5_region = create_region(world, player, active_locations, 'Gate 5', None, None)
 | |
|     gate_1_boss_region = create_region(world, player, active_locations, 'Gate 1 Boss', [LocationName.gate_1_boss], None)
 | |
|     gate_2_boss_region = create_region(world, player, active_locations, 'Gate 2 Boss', [LocationName.gate_2_boss], None)
 | |
|     gate_3_boss_region = create_region(world, player, active_locations, 'Gate 3 Boss', [LocationName.gate_3_boss], None)
 | |
|     gate_4_boss_region = create_region(world, player, active_locations, 'Gate 4 Boss', [LocationName.gate_4_boss], None)
 | |
|     gate_5_boss_region = create_region(world, player, active_locations, 'Gate 5 Boss', [LocationName.gate_5_boss], None)
 | |
| 
 | |
|     city_escape_region_locations = [
 | |
|         LocationName.city_escape_1,
 | |
|         LocationName.city_escape_2,
 | |
|         LocationName.city_escape_3,
 | |
|         LocationName.city_escape_4,
 | |
|         LocationName.city_escape_5,
 | |
|         LocationName.city_escape_upgrade,
 | |
|     ]
 | |
|     city_escape_region = create_region(world, player, active_locations, LocationName.city_escape_region,
 | |
|                                        city_escape_region_locations, None)
 | |
| 
 | |
|     metal_harbor_region_locations = [
 | |
|         LocationName.metal_harbor_1,
 | |
|         LocationName.metal_harbor_2,
 | |
|         LocationName.metal_harbor_3,
 | |
|         LocationName.metal_harbor_4,
 | |
|         LocationName.metal_harbor_5,
 | |
|         LocationName.metal_harbor_upgrade,
 | |
|     ]
 | |
|     metal_harbor_region = create_region(world, player, active_locations, LocationName.metal_harbor_region,
 | |
|                                         metal_harbor_region_locations, None)
 | |
| 
 | |
|     green_forest_region_locations = [
 | |
|         LocationName.green_forest_1,
 | |
|         LocationName.green_forest_2,
 | |
|         LocationName.green_forest_3,
 | |
|         LocationName.green_forest_4,
 | |
|         LocationName.green_forest_5,
 | |
|         LocationName.green_forest_upgrade,
 | |
|     ]
 | |
|     green_forest_region = create_region(world, player, active_locations, LocationName.green_forest_region,
 | |
|                                         green_forest_region_locations, None)
 | |
| 
 | |
|     pyramid_cave_region_locations = [
 | |
|         LocationName.pyramid_cave_1,
 | |
|         LocationName.pyramid_cave_2,
 | |
|         LocationName.pyramid_cave_3,
 | |
|         LocationName.pyramid_cave_4,
 | |
|         LocationName.pyramid_cave_5,
 | |
|         LocationName.pyramid_cave_upgrade,
 | |
|     ]
 | |
|     pyramid_cave_region = create_region(world, player, active_locations, LocationName.pyramid_cave_region,
 | |
|                                         pyramid_cave_region_locations, None)
 | |
| 
 | |
|     crazy_gadget_region_locations = [
 | |
|         LocationName.crazy_gadget_1,
 | |
|         LocationName.crazy_gadget_2,
 | |
|         LocationName.crazy_gadget_3,
 | |
|         LocationName.crazy_gadget_4,
 | |
|         LocationName.crazy_gadget_5,
 | |
|         LocationName.crazy_gadget_upgrade,
 | |
|     ]
 | |
|     crazy_gadget_region = create_region(world, player, active_locations, LocationName.crazy_gadget_region,
 | |
|                                         crazy_gadget_region_locations, None)
 | |
| 
 | |
|     final_rush_region_locations = [
 | |
|         LocationName.final_rush_1,
 | |
|         LocationName.final_rush_2,
 | |
|         LocationName.final_rush_3,
 | |
|         LocationName.final_rush_4,
 | |
|         LocationName.final_rush_5,
 | |
|         LocationName.final_rush_upgrade,
 | |
|     ]
 | |
|     final_rush_region = create_region(world, player, active_locations, LocationName.final_rush_region,
 | |
|                                       final_rush_region_locations, None)
 | |
| 
 | |
|     prison_lane_region_locations = [
 | |
|         LocationName.prison_lane_1,
 | |
|         LocationName.prison_lane_2,
 | |
|         LocationName.prison_lane_3,
 | |
|         LocationName.prison_lane_4,
 | |
|         LocationName.prison_lane_5,
 | |
|         LocationName.prison_lane_upgrade,
 | |
|     ]
 | |
|     prison_lane_region = create_region(world, player, active_locations, LocationName.prison_lane_region,
 | |
|                                        prison_lane_region_locations, None)
 | |
| 
 | |
|     mission_street_region_locations = [
 | |
|         LocationName.mission_street_1,
 | |
|         LocationName.mission_street_2,
 | |
|         LocationName.mission_street_3,
 | |
|         LocationName.mission_street_4,
 | |
|         LocationName.mission_street_5,
 | |
|         LocationName.mission_street_upgrade,
 | |
|     ]
 | |
|     mission_street_region = create_region(world, player, active_locations, LocationName.mission_street_region,
 | |
|                                           mission_street_region_locations, None)
 | |
| 
 | |
|     route_101_region_locations = [
 | |
|         LocationName.route_101_1,
 | |
|         LocationName.route_101_2,
 | |
|         LocationName.route_101_3,
 | |
|         LocationName.route_101_4,
 | |
|         LocationName.route_101_5,
 | |
|     ]
 | |
|     route_101_region = create_region(world, player, active_locations, LocationName.route_101_region,
 | |
|                                      route_101_region_locations, None)
 | |
| 
 | |
|     hidden_base_region_locations = [
 | |
|         LocationName.hidden_base_1,
 | |
|         LocationName.hidden_base_2,
 | |
|         LocationName.hidden_base_3,
 | |
|         LocationName.hidden_base_4,
 | |
|         LocationName.hidden_base_5,
 | |
|         LocationName.hidden_base_upgrade,
 | |
|     ]
 | |
|     hidden_base_region = create_region(world, player, active_locations, LocationName.hidden_base_region,
 | |
|                                        hidden_base_region_locations, None)
 | |
| 
 | |
|     eternal_engine_region_locations = [
 | |
|         LocationName.eternal_engine_1,
 | |
|         LocationName.eternal_engine_2,
 | |
|         LocationName.eternal_engine_3,
 | |
|         LocationName.eternal_engine_4,
 | |
|         LocationName.eternal_engine_5,
 | |
|         LocationName.eternal_engine_upgrade,
 | |
|     ]
 | |
|     eternal_engine_region = create_region(world, player, active_locations, LocationName.eternal_engine_region,
 | |
|                                           eternal_engine_region_locations, None)
 | |
| 
 | |
|     wild_canyon_region_locations = [
 | |
|         LocationName.wild_canyon_1,
 | |
|         LocationName.wild_canyon_2,
 | |
|         LocationName.wild_canyon_3,
 | |
|         LocationName.wild_canyon_4,
 | |
|         LocationName.wild_canyon_5,
 | |
|         LocationName.wild_canyon_upgrade,
 | |
|     ]
 | |
|     wild_canyon_region = create_region(world, player, active_locations, LocationName.wild_canyon_region,
 | |
|                                        wild_canyon_region_locations, None)
 | |
| 
 | |
|     pumpkin_hill_region_locations = [
 | |
|         LocationName.pumpkin_hill_1,
 | |
|         LocationName.pumpkin_hill_2,
 | |
|         LocationName.pumpkin_hill_3,
 | |
|         LocationName.pumpkin_hill_4,
 | |
|         LocationName.pumpkin_hill_5,
 | |
|         LocationName.pumpkin_hill_upgrade,
 | |
|     ]
 | |
|     pumpkin_hill_region = create_region(world, player, active_locations, LocationName.pumpkin_hill_region,
 | |
|                                         pumpkin_hill_region_locations, None)
 | |
| 
 | |
|     aquatic_mine_region_locations = [
 | |
|         LocationName.aquatic_mine_1,
 | |
|         LocationName.aquatic_mine_2,
 | |
|         LocationName.aquatic_mine_3,
 | |
|         LocationName.aquatic_mine_4,
 | |
|         LocationName.aquatic_mine_5,
 | |
|         LocationName.aquatic_mine_upgrade,
 | |
|     ]
 | |
|     aquatic_mine_region = create_region(world, player, active_locations, LocationName.aquatic_mine_region,
 | |
|                                         aquatic_mine_region_locations, None)
 | |
| 
 | |
|     death_chamber_region_locations = [
 | |
|         LocationName.death_chamber_1,
 | |
|         LocationName.death_chamber_2,
 | |
|         LocationName.death_chamber_3,
 | |
|         LocationName.death_chamber_4,
 | |
|         LocationName.death_chamber_5,
 | |
|         LocationName.death_chamber_upgrade,
 | |
|     ]
 | |
|     death_chamber_region = create_region(world, player, active_locations, LocationName.death_chamber_region,
 | |
|                                          death_chamber_region_locations, None)
 | |
| 
 | |
|     meteor_herd_region_locations = [
 | |
|         LocationName.meteor_herd_1,
 | |
|         LocationName.meteor_herd_2,
 | |
|         LocationName.meteor_herd_3,
 | |
|         LocationName.meteor_herd_4,
 | |
|         LocationName.meteor_herd_5,
 | |
|         LocationName.meteor_herd_upgrade,
 | |
|     ]
 | |
|     meteor_herd_region = create_region(world, player, active_locations, LocationName.meteor_herd_region,
 | |
|                                        meteor_herd_region_locations, None)
 | |
| 
 | |
|     radical_highway_region_locations = [
 | |
|         LocationName.radical_highway_1,
 | |
|         LocationName.radical_highway_2,
 | |
|         LocationName.radical_highway_3,
 | |
|         LocationName.radical_highway_4,
 | |
|         LocationName.radical_highway_5,
 | |
|         LocationName.radical_highway_upgrade,
 | |
|     ]
 | |
|     radical_highway_region = create_region(world, player, active_locations, LocationName.radical_highway_region,
 | |
|                                            radical_highway_region_locations, None)
 | |
| 
 | |
|     white_jungle_region_locations = [
 | |
|         LocationName.white_jungle_1,
 | |
|         LocationName.white_jungle_2,
 | |
|         LocationName.white_jungle_3,
 | |
|         LocationName.white_jungle_4,
 | |
|         LocationName.white_jungle_5,
 | |
|         LocationName.white_jungle_upgrade,
 | |
|     ]
 | |
|     white_jungle_region = create_region(world, player, active_locations, LocationName.white_jungle_region,
 | |
|                                         white_jungle_region_locations, None)
 | |
| 
 | |
|     sky_rail_region_locations = [
 | |
|         LocationName.sky_rail_1,
 | |
|         LocationName.sky_rail_2,
 | |
|         LocationName.sky_rail_3,
 | |
|         LocationName.sky_rail_4,
 | |
|         LocationName.sky_rail_5,
 | |
|         LocationName.sky_rail_upgrade,
 | |
|     ]
 | |
|     sky_rail_region = create_region(world, player, active_locations, LocationName.sky_rail_region,
 | |
|                                     sky_rail_region_locations, None)
 | |
| 
 | |
|     final_chase_region_locations = [
 | |
|         LocationName.final_chase_1,
 | |
|         LocationName.final_chase_2,
 | |
|         LocationName.final_chase_3,
 | |
|         LocationName.final_chase_4,
 | |
|         LocationName.final_chase_5,
 | |
|         LocationName.final_chase_upgrade,
 | |
|     ]
 | |
|     final_chase_region = create_region(world, player, active_locations, LocationName.final_chase_region,
 | |
|                                        final_chase_region_locations, None)
 | |
| 
 | |
|     iron_gate_region_locations = [
 | |
|         LocationName.iron_gate_1,
 | |
|         LocationName.iron_gate_2,
 | |
|         LocationName.iron_gate_3,
 | |
|         LocationName.iron_gate_4,
 | |
|         LocationName.iron_gate_5,
 | |
|         LocationName.iron_gate_upgrade,
 | |
|     ]
 | |
|     iron_gate_region = create_region(world, player, active_locations, LocationName.iron_gate_region,
 | |
|                                      iron_gate_region_locations, None)
 | |
| 
 | |
|     sand_ocean_region_locations = [
 | |
|         LocationName.sand_ocean_1,
 | |
|         LocationName.sand_ocean_2,
 | |
|         LocationName.sand_ocean_3,
 | |
|         LocationName.sand_ocean_4,
 | |
|         LocationName.sand_ocean_5,
 | |
|         LocationName.sand_ocean_upgrade,
 | |
|     ]
 | |
|     sand_ocean_region = create_region(world, player, active_locations, LocationName.sand_ocean_region,
 | |
|                                       sand_ocean_region_locations, None)
 | |
| 
 | |
|     lost_colony_region_locations = [
 | |
|         LocationName.lost_colony_1,
 | |
|         LocationName.lost_colony_2,
 | |
|         LocationName.lost_colony_3,
 | |
|         LocationName.lost_colony_4,
 | |
|         LocationName.lost_colony_5,
 | |
|         LocationName.lost_colony_upgrade,
 | |
|     ]
 | |
|     lost_colony_region = create_region(world, player, active_locations, LocationName.lost_colony_region,
 | |
|                                        lost_colony_region_locations, None)
 | |
| 
 | |
|     weapons_bed_region_locations = [
 | |
|         LocationName.weapons_bed_1,
 | |
|         LocationName.weapons_bed_2,
 | |
|         LocationName.weapons_bed_3,
 | |
|         LocationName.weapons_bed_4,
 | |
|         LocationName.weapons_bed_5,
 | |
|         LocationName.weapons_bed_upgrade,
 | |
|     ]
 | |
|     weapons_bed_region = create_region(world, player, active_locations, LocationName.weapons_bed_region,
 | |
|                                        weapons_bed_region_locations, None)
 | |
| 
 | |
|     cosmic_wall_region_locations = [
 | |
|         LocationName.cosmic_wall_1,
 | |
|         LocationName.cosmic_wall_2,
 | |
|         LocationName.cosmic_wall_3,
 | |
|         LocationName.cosmic_wall_4,
 | |
|         LocationName.cosmic_wall_5,
 | |
|         LocationName.cosmic_wall_upgrade,
 | |
|     ]
 | |
|     cosmic_wall_region = create_region(world, player, active_locations, LocationName.cosmic_wall_region,
 | |
|                                        cosmic_wall_region_locations, None)
 | |
| 
 | |
|     dry_lagoon_region_locations = [
 | |
|         LocationName.dry_lagoon_1,
 | |
|         LocationName.dry_lagoon_2,
 | |
|         LocationName.dry_lagoon_3,
 | |
|         LocationName.dry_lagoon_4,
 | |
|         LocationName.dry_lagoon_5,
 | |
|         LocationName.dry_lagoon_upgrade,
 | |
|     ]
 | |
|     dry_lagoon_region = create_region(world, player, active_locations, LocationName.dry_lagoon_region,
 | |
|                                       dry_lagoon_region_locations, None)
 | |
| 
 | |
|     egg_quarters_region_locations = [
 | |
|         LocationName.egg_quarters_1,
 | |
|         LocationName.egg_quarters_2,
 | |
|         LocationName.egg_quarters_3,
 | |
|         LocationName.egg_quarters_4,
 | |
|         LocationName.egg_quarters_5,
 | |
|         LocationName.egg_quarters_upgrade,
 | |
|     ]
 | |
|     egg_quarters_region = create_region(world, player, active_locations, LocationName.egg_quarters_region,
 | |
|                                         egg_quarters_region_locations, None)
 | |
| 
 | |
|     security_hall_region_locations = [
 | |
|         LocationName.security_hall_1,
 | |
|         LocationName.security_hall_2,
 | |
|         LocationName.security_hall_3,
 | |
|         LocationName.security_hall_4,
 | |
|         LocationName.security_hall_5,
 | |
|         LocationName.security_hall_upgrade,
 | |
|     ]
 | |
|     security_hall_region = create_region(world, player, active_locations, LocationName.security_hall_region,
 | |
|                                          security_hall_region_locations, None)
 | |
| 
 | |
|     route_280_region_locations = [
 | |
|         LocationName.route_280_1,
 | |
|         LocationName.route_280_2,
 | |
|         LocationName.route_280_3,
 | |
|         LocationName.route_280_4,
 | |
|         LocationName.route_280_5,
 | |
|     ]
 | |
|     route_280_region = create_region(world, player, active_locations, LocationName.route_280_region,
 | |
|                                      route_280_region_locations, None)
 | |
| 
 | |
|     mad_space_region_locations = [
 | |
|         LocationName.mad_space_1,
 | |
|         LocationName.mad_space_2,
 | |
|         LocationName.mad_space_3,
 | |
|         LocationName.mad_space_4,
 | |
|         LocationName.mad_space_5,
 | |
|         LocationName.mad_space_upgrade,
 | |
|     ]
 | |
|     mad_space_region = create_region(world, player, active_locations, LocationName.mad_space_region,
 | |
|                                      mad_space_region_locations, None)
 | |
| 
 | |
|     cannon_core_region_locations = [
 | |
|         LocationName.cannon_core_1,
 | |
|         LocationName.cannon_core_2,
 | |
|         LocationName.cannon_core_3,
 | |
|         LocationName.cannon_core_4,
 | |
|         LocationName.cannon_core_5,
 | |
|     ]
 | |
|     cannon_core_region = create_region(world, player, active_locations, LocationName.cannon_core_region,
 | |
|                                        cannon_core_region_locations, None)
 | |
| 
 | |
|     chao_garden_beginner_region_locations = [
 | |
|         LocationName.chao_race_crab_pool_1,
 | |
|         LocationName.chao_race_crab_pool_2,
 | |
|         LocationName.chao_race_crab_pool_3,
 | |
|         LocationName.chao_race_stump_valley_1,
 | |
|         LocationName.chao_race_stump_valley_2,
 | |
|         LocationName.chao_race_stump_valley_3,
 | |
|         LocationName.chao_race_mushroom_forest_1,
 | |
|         LocationName.chao_race_mushroom_forest_2,
 | |
|         LocationName.chao_race_mushroom_forest_3,
 | |
|         LocationName.chao_race_block_canyon_1,
 | |
|         LocationName.chao_race_block_canyon_2,
 | |
|         LocationName.chao_race_block_canyon_3,
 | |
| 
 | |
|         LocationName.chao_beginner_karate,
 | |
|     ]
 | |
|     chao_garden_beginner_region = create_region(world, player, active_locations, LocationName.chao_garden_beginner_region,
 | |
|                                                 chao_garden_beginner_region_locations, None)
 | |
| 
 | |
|     chao_garden_intermediate_region_locations = [
 | |
|         LocationName.chao_race_aquamarine_1,
 | |
|         LocationName.chao_race_aquamarine_2,
 | |
|         LocationName.chao_race_aquamarine_3,
 | |
|         LocationName.chao_race_aquamarine_4,
 | |
|         LocationName.chao_race_aquamarine_5,
 | |
|         LocationName.chao_race_topaz_1,
 | |
|         LocationName.chao_race_topaz_2,
 | |
|         LocationName.chao_race_topaz_3,
 | |
|         LocationName.chao_race_topaz_4,
 | |
|         LocationName.chao_race_topaz_5,
 | |
|         LocationName.chao_race_peridot_1,
 | |
|         LocationName.chao_race_peridot_2,
 | |
|         LocationName.chao_race_peridot_3,
 | |
|         LocationName.chao_race_peridot_4,
 | |
|         LocationName.chao_race_peridot_5,
 | |
|         LocationName.chao_race_garnet_1,
 | |
|         LocationName.chao_race_garnet_2,
 | |
|         LocationName.chao_race_garnet_3,
 | |
|         LocationName.chao_race_garnet_4,
 | |
|         LocationName.chao_race_garnet_5,
 | |
|         LocationName.chao_race_onyx_1,
 | |
|         LocationName.chao_race_onyx_2,
 | |
|         LocationName.chao_race_onyx_3,
 | |
|         LocationName.chao_race_onyx_4,
 | |
|         LocationName.chao_race_onyx_5,
 | |
|         LocationName.chao_race_diamond_1,
 | |
|         LocationName.chao_race_diamond_2,
 | |
|         LocationName.chao_race_diamond_3,
 | |
|         LocationName.chao_race_diamond_4,
 | |
|         LocationName.chao_race_diamond_5,
 | |
| 
 | |
|         LocationName.chao_standard_karate,
 | |
|     ]
 | |
|     chao_garden_intermediate_region = create_region(world, player, active_locations, LocationName.chao_garden_intermediate_region,
 | |
|                                                     chao_garden_intermediate_region_locations, None)
 | |
| 
 | |
|     chao_garden_expert_region_locations = [
 | |
|         LocationName.chao_race_challenge_1,
 | |
|         LocationName.chao_race_challenge_2,
 | |
|         LocationName.chao_race_challenge_3,
 | |
|         LocationName.chao_race_challenge_4,
 | |
|         LocationName.chao_race_challenge_5,
 | |
|         LocationName.chao_race_challenge_6,
 | |
|         LocationName.chao_race_challenge_7,
 | |
|         LocationName.chao_race_challenge_8,
 | |
|         LocationName.chao_race_challenge_9,
 | |
|         LocationName.chao_race_challenge_10,
 | |
|         LocationName.chao_race_challenge_11,
 | |
|         LocationName.chao_race_challenge_12,
 | |
| 
 | |
|         LocationName.chao_race_hero_1,
 | |
|         LocationName.chao_race_hero_2,
 | |
|         LocationName.chao_race_hero_3,
 | |
|         LocationName.chao_race_hero_4,
 | |
| 
 | |
|         LocationName.chao_race_dark_1,
 | |
|         LocationName.chao_race_dark_2,
 | |
|         LocationName.chao_race_dark_3,
 | |
|         LocationName.chao_race_dark_4,
 | |
| 
 | |
|         LocationName.chao_expert_karate,
 | |
|         LocationName.chao_super_karate,
 | |
|     ]
 | |
|     chao_garden_expert_region = create_region(world, player, active_locations, LocationName.chao_garden_expert_region,
 | |
|                                               chao_garden_expert_region_locations, None)
 | |
| 
 | |
|     biolizard_region_locations = [
 | |
|         LocationName.biolizard,
 | |
|     ]
 | |
|     biolizard_region = create_region(world, player, active_locations, LocationName.biolizard_region,
 | |
|                                      biolizard_region_locations, None)
 | |
| 
 | |
|     # Set up the regions correctly.
 | |
|     world.regions += [
 | |
|         menu_region,
 | |
|         gate_0_region,
 | |
|         gate_1_region,
 | |
|         gate_2_region,
 | |
|         gate_3_region,
 | |
|         gate_4_region,
 | |
|         gate_5_region,
 | |
|         gate_1_boss_region,
 | |
|         gate_2_boss_region,
 | |
|         gate_3_boss_region,
 | |
|         gate_4_boss_region,
 | |
|         gate_5_boss_region,
 | |
|         city_escape_region,
 | |
|         metal_harbor_region,
 | |
|         green_forest_region,
 | |
|         pyramid_cave_region,
 | |
|         crazy_gadget_region,
 | |
|         final_rush_region,
 | |
|         prison_lane_region,
 | |
|         mission_street_region,
 | |
|         route_101_region,
 | |
|         hidden_base_region,
 | |
|         eternal_engine_region,
 | |
|         wild_canyon_region,
 | |
|         pumpkin_hill_region,
 | |
|         aquatic_mine_region,
 | |
|         death_chamber_region,
 | |
|         meteor_herd_region,
 | |
|         radical_highway_region,
 | |
|         white_jungle_region,
 | |
|         sky_rail_region,
 | |
|         final_chase_region,
 | |
|         iron_gate_region,
 | |
|         sand_ocean_region,
 | |
|         lost_colony_region,
 | |
|         weapons_bed_region,
 | |
|         cosmic_wall_region,
 | |
|         dry_lagoon_region,
 | |
|         egg_quarters_region,
 | |
|         security_hall_region,
 | |
|         route_280_region,
 | |
|         mad_space_region,
 | |
|         cannon_core_region,
 | |
|         chao_garden_beginner_region,
 | |
|         chao_garden_intermediate_region,
 | |
|         chao_garden_expert_region,
 | |
|         biolizard_region,
 | |
|     ]
 | |
| 
 | |
| 
 | |
| def connect_regions(world, player, gates: typing.List[LevelGate], cannon_core_emblems, gate_bosses):
 | |
|     names: typing.Dict[str, int] = {}
 | |
| 
 | |
|     connect(world, player, names, 'Menu', LocationName.gate_0_region)
 | |
|     connect(world, player, names, LocationName.gate_0_region, LocationName.cannon_core_region,
 | |
|             lambda state: (state.has(ItemName.emblem, player, cannon_core_emblems)))
 | |
| 
 | |
|     connect(world, player, names, LocationName.cannon_core_region, LocationName.biolizard_region,
 | |
|             lambda state: (state.can_reach(LocationName.cannon_core_1, "Location", player)))
 | |
| 
 | |
|     for i in range(len(gates[0].gate_levels)):
 | |
|         connect(world, player, names, LocationName.gate_0_region, shuffleable_regions[gates[0].gate_levels[i]])
 | |
| 
 | |
|     gates_len = len(gates)
 | |
|     if gates_len >= 2:
 | |
|         connect(world, player, names, 'Menu', LocationName.gate_1_boss_region,
 | |
|                 lambda state: (state.has(ItemName.emblem, player, gates[1].gate_emblem_count)))
 | |
| 
 | |
|         if gate_bosses[1] == all_gate_bosses_table[king_boom_boo]:
 | |
|             connect(world, player, names, LocationName.gate_1_boss_region, LocationName.gate_1_region,
 | |
|                     lambda state: (state.has(ItemName.knuckles_shovel_claws, player)))
 | |
|         else:
 | |
|             connect(world, player, names, LocationName.gate_1_boss_region, LocationName.gate_1_region)
 | |
| 
 | |
|         for i in range(len(gates[1].gate_levels)):
 | |
|             connect(world, player, names, LocationName.gate_1_region, shuffleable_regions[gates[1].gate_levels[i]])
 | |
| 
 | |
|     if gates_len >= 3:
 | |
|         connect(world, player, names, 'Menu', LocationName.gate_2_boss_region,
 | |
|                 lambda state: (state.has(ItemName.emblem, player, gates[2].gate_emblem_count)))
 | |
| 
 | |
|         if gate_bosses[2] == all_gate_bosses_table[king_boom_boo]:
 | |
|             connect(world, player, names, LocationName.gate_2_boss_region, LocationName.gate_2_region,
 | |
|                     lambda state: (state.has(ItemName.knuckles_shovel_claws, player)))
 | |
|         else:
 | |
|             connect(world, player, names, LocationName.gate_2_boss_region, LocationName.gate_2_region)
 | |
| 
 | |
|         for i in range(len(gates[2].gate_levels)):
 | |
|             connect(world, player, names, LocationName.gate_2_region, shuffleable_regions[gates[2].gate_levels[i]])
 | |
| 
 | |
|     if gates_len >= 4:
 | |
|         connect(world, player, names, 'Menu', LocationName.gate_3_boss_region,
 | |
|                 lambda state: (state.has(ItemName.emblem, player, gates[3].gate_emblem_count)))
 | |
| 
 | |
|         if gate_bosses[3] == all_gate_bosses_table[king_boom_boo]:
 | |
|             connect(world, player, names, LocationName.gate_3_boss_region, LocationName.gate_3_region,
 | |
|                     lambda state: (state.has(ItemName.knuckles_shovel_claws, player)))
 | |
|         else:
 | |
|             connect(world, player, names, LocationName.gate_3_boss_region, LocationName.gate_3_region)
 | |
| 
 | |
|         for i in range(len(gates[3].gate_levels)):
 | |
|             connect(world, player, names, LocationName.gate_3_region, shuffleable_regions[gates[3].gate_levels[i]])
 | |
| 
 | |
|     if gates_len >= 5:
 | |
|         connect(world, player, names, 'Menu', LocationName.gate_4_boss_region,
 | |
|                 lambda state: (state.has(ItemName.emblem, player, gates[4].gate_emblem_count)))
 | |
| 
 | |
|         if gate_bosses[4] == all_gate_bosses_table[king_boom_boo]:
 | |
|             connect(world, player, names, LocationName.gate_4_boss_region, LocationName.gate_4_region,
 | |
|                     lambda state: (state.has(ItemName.knuckles_shovel_claws, player)))
 | |
|         else:
 | |
|             connect(world, player, names, LocationName.gate_4_boss_region, LocationName.gate_4_region)
 | |
| 
 | |
|         for i in range(len(gates[4].gate_levels)):
 | |
|             connect(world, player, names, LocationName.gate_4_region, shuffleable_regions[gates[4].gate_levels[i]])
 | |
| 
 | |
|     if gates_len >= 6:
 | |
|         connect(world, player, names, 'Menu', LocationName.gate_5_boss_region,
 | |
|                 lambda state: (state.has(ItemName.emblem, player, gates[5].gate_emblem_count)))
 | |
| 
 | |
|         if gate_bosses[5] == all_gate_bosses_table[king_boom_boo]:
 | |
|             connect(world, player, names, LocationName.gate_5_boss_region, LocationName.gate_5_region,
 | |
|                     lambda state: (state.has(ItemName.knuckles_shovel_claws, player)))
 | |
|         else:
 | |
|             connect(world, player, names, LocationName.gate_5_boss_region, LocationName.gate_5_region)
 | |
| 
 | |
|         for i in range(len(gates[5].gate_levels)):
 | |
|             connect(world, player, names, LocationName.gate_5_region, shuffleable_regions[gates[5].gate_levels[i]])
 | |
| 
 | |
|     if gates_len == 1:
 | |
|         connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_beginner_region)
 | |
|         connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_intermediate_region)
 | |
|         connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_expert_region)
 | |
|     elif gates_len == 2:
 | |
|         connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_beginner_region)
 | |
|         connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_intermediate_region)
 | |
|         connect(world, player, names, LocationName.gate_1_region, LocationName.chao_garden_expert_region)
 | |
|     elif gates_len == 3:
 | |
|         connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_beginner_region)
 | |
|         connect(world, player, names, LocationName.gate_1_region, LocationName.chao_garden_intermediate_region)
 | |
|         connect(world, player, names, LocationName.gate_2_region, LocationName.chao_garden_expert_region)
 | |
|     elif gates_len == 4:
 | |
|         connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_beginner_region)
 | |
|         connect(world, player, names, LocationName.gate_1_region, LocationName.chao_garden_intermediate_region)
 | |
|         connect(world, player, names, LocationName.gate_3_region, LocationName.chao_garden_expert_region)
 | |
|     elif gates_len == 5:
 | |
|         connect(world, player, names, LocationName.gate_1_region, LocationName.chao_garden_beginner_region)
 | |
|         connect(world, player, names, LocationName.gate_2_region, LocationName.chao_garden_intermediate_region)
 | |
|         connect(world, player, names, LocationName.gate_3_region, LocationName.chao_garden_expert_region)
 | |
|     elif gates_len >= 6:
 | |
|         connect(world, player, names, LocationName.gate_1_region, LocationName.chao_garden_beginner_region)
 | |
|         connect(world, player, names, LocationName.gate_2_region, LocationName.chao_garden_intermediate_region)
 | |
|         connect(world, player, names, LocationName.gate_4_region, LocationName.chao_garden_expert_region)
 | |
| 
 | |
| 
 | |
| def create_region(world: MultiWorld, player: int, active_locations, name: str, locations=None, exits=None):
 | |
|     # Shamelessly stolen from the ROR2 definition
 | |
|     ret = Region(name, None, name, player)
 | |
|     ret.multiworld = world
 | |
|     if locations:
 | |
|         for location in locations:
 | |
|             loc_id = active_locations.get(location, 0)
 | |
|             if loc_id:
 | |
|                 location = SA2BLocation(player, location, loc_id, ret)
 | |
|                 ret.locations.append(location)
 | |
|     if exits:
 | |
|         for exit in exits:
 | |
|             ret.exits.append(Entrance(player, exit, ret))
 | |
| 
 | |
|     return ret
 | |
| 
 | |
| 
 | |
| def connect(world: MultiWorld, player: int, used_names: typing.Dict[str, int], source: str, target: str,
 | |
|             rule: typing.Optional[typing.Callable] = None):
 | |
|     source_region = world.get_region(source, player)
 | |
|     target_region = world.get_region(target, player)
 | |
| 
 | |
|     if target not in used_names:
 | |
|         used_names[target] = 1
 | |
|         name = target
 | |
|     else:
 | |
|         used_names[target] += 1
 | |
|         name = target + (' ' * used_names[target])
 | |
| 
 | |
|     connection = Entrance(player, name, source_region)
 | |
| 
 | |
|     if rule:
 | |
|         connection.access_rule = rule
 | |
| 
 | |
|     source_region.exits.append(connection)
 | |
|     connection.connect(target_region)
 |