111 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from typing import List, Dict
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from BaseClasses import MultiWorld, Region, Entrance
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from . import Locations
							 | 
						||
| 
								 | 
							
								from .Constants import *
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								region_dict: Dict[str, List[str]] = {
							 | 
						||
| 
								 | 
							
								    REGION_MENU: [],
							 | 
						||
| 
								 | 
							
								    REGION_CAVE: [
							 | 
						||
| 
								 | 
							
								        LOCATION_CAVE_AMMO,
							 | 
						||
| 
								 | 
							
								        LOCATION_CAVE_RELOAD,
							 | 
						||
| 
								 | 
							
								        LOCATION_CAVE_HEALTH,
							 | 
						||
| 
								 | 
							
								        LOCATION_CAVE_WEAPON,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_CAVE_MINIBOSS,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_CAVE_BOSS,
							 | 
						||
| 
								 | 
							
								        EVENT_LOCATION_GUARD_GONE,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    REGION_VOLCANIC: [
							 | 
						||
| 
								 | 
							
								        LOCATION_VOLCANIC_RELOAD,
							 | 
						||
| 
								 | 
							
								        LOCATION_VOLCANIC_HEALTH,
							 | 
						||
| 
								 | 
							
								        LOCATION_VOLCANIC_AMMO,
							 | 
						||
| 
								 | 
							
								        LOCATION_VOLCANIC_WEAPON,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_VOLCANIC_BOSS,
							 | 
						||
| 
								 | 
							
								        EVENT_LOCATION_CLIFF_GONE,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    REGION_ARCTIC: [
							 | 
						||
| 
								 | 
							
								        LOCATION_ARCTIC_AMMO,
							 | 
						||
| 
								 | 
							
								        LOCATION_ARCTIC_RELOAD,
							 | 
						||
| 
								 | 
							
								        LOCATION_ARCTIC_HEALTH,
							 | 
						||
| 
								 | 
							
								        LOCATION_ARCTIC_WEAPON,
							 | 
						||
| 
								 | 
							
								        LOCATION_JACKET,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_ARCTIC_BOSS,
							 | 
						||
| 
								 | 
							
								        EVENT_LOCATION_ACE_GONE,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    REGION_HUB: [
							 | 
						||
| 
								 | 
							
								        LOCATION_HUB_AMMO,
							 | 
						||
| 
								 | 
							
								        LOCATION_HUB_HEALTH,
							 | 
						||
| 
								 | 
							
								        LOCATION_HUB_RELOAD,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_HUB_CONSOLE,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_HUB_NINJA_SCARE,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    REGION_SWAMP: [
							 | 
						||
| 
								 | 
							
								        LOCATION_SWAMP_AMMO,
							 | 
						||
| 
								 | 
							
								        LOCATION_SWAMP_HEALTH,
							 | 
						||
| 
								 | 
							
								        LOCATION_SWAMP_RELOAD,
							 | 
						||
| 
								 | 
							
								        LOCATION_SWAMP_SPECIAL,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_SWAMP_BOSS,
							 | 
						||
| 
								 | 
							
								        EVENT_LOCATION_SNAKE_GONE,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    REGION_ELECTRICAL: [
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_ELEVATOR_NINJA_FIGHT,
							 | 
						||
| 
								 | 
							
								        LOCATION_ELECTRICAL_WEAPON,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_ELECTRICAL_MINIBOSS,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_ELECTRICAL_EXTRA,
							 | 
						||
| 
								 | 
							
								        EVENT_LOCATION_POWER_ON,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    REGION_ELECTRICAL_POWERED: [
							 | 
						||
| 
								 | 
							
								        LOCATION_ELECTRICAL_RELOAD,
							 | 
						||
| 
								 | 
							
								        LOCATION_ELECTRICAL_HEALTH,
							 | 
						||
| 
								 | 
							
								        LOCATION_ELECTRICAL_AMMO,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_ELECTRICAL_BOSS,
							 | 
						||
| 
								 | 
							
								        EP_LOCATION_ELECTRICAL_FINAL_BOSS,
							 | 
						||
| 
								 | 
							
								        EVENT_LOCATION_VICTORY,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def set_region_locations(region: Region, location_names: List[str], is_pool_expanded: bool):
							 | 
						||
| 
								 | 
							
								    location_pool = {**Locations.location_dict_base, **Locations.location_dict_events}
							 | 
						||
| 
								 | 
							
								    if is_pool_expanded:
							 | 
						||
| 
								 | 
							
								        location_pool = {**Locations.location_dict_expanded, **Locations.location_dict_event_expanded}
							 | 
						||
| 
								 | 
							
								    region.locations = [
							 | 
						||
| 
								 | 
							
								        Locations.SavingPrincessLocation(
							 | 
						||
| 
								 | 
							
								            region.player,
							 | 
						||
| 
								 | 
							
								            name,
							 | 
						||
| 
								 | 
							
								            Locations.location_dict[name].code,
							 | 
						||
| 
								 | 
							
								            region
							 | 
						||
| 
								 | 
							
								        ) for name in location_names if name in location_pool.keys()
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def create_regions(multiworld: MultiWorld, player: int, is_pool_expanded: bool):
							 | 
						||
| 
								 | 
							
								    for region_name, location_names in region_dict.items():
							 | 
						||
| 
								 | 
							
								        region = Region(region_name, player, multiworld)
							 | 
						||
| 
								 | 
							
								        set_region_locations(region, location_names, is_pool_expanded)
							 | 
						||
| 
								 | 
							
								        multiworld.regions.append(region)
							 | 
						||
| 
								 | 
							
								    connect_regions(multiworld, player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def connect_regions(multiworld: MultiWorld, player: int):
							 | 
						||
| 
								 | 
							
								    # and add a connection from the menu to the hub region
							 | 
						||
| 
								 | 
							
								    menu = multiworld.get_region(REGION_MENU, player)
							 | 
						||
| 
								 | 
							
								    hub = multiworld.get_region(REGION_HUB, player)
							 | 
						||
| 
								 | 
							
								    connection = Entrance(player, f"{REGION_HUB} entrance", menu)
							 | 
						||
| 
								 | 
							
								    menu.exits.append(connection)
							 | 
						||
| 
								 | 
							
								    connection.connect(hub)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # now add an entrance from every other region to hub
							 | 
						||
| 
								 | 
							
								    for region_name in [REGION_CAVE, REGION_VOLCANIC, REGION_ARCTIC, REGION_SWAMP, REGION_ELECTRICAL]:
							 | 
						||
| 
								 | 
							
								        connection = Entrance(player, f"{region_name} entrance", hub)
							 | 
						||
| 
								 | 
							
								        hub.exits.append(connection)
							 | 
						||
| 
								 | 
							
								        connection.connect(multiworld.get_region(region_name, player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # and finally, the connection between the final region and its powered version
							 | 
						||
| 
								 | 
							
								    electrical = multiworld.get_region(REGION_ELECTRICAL, player)
							 | 
						||
| 
								 | 
							
								    connection = Entrance(player, f"{REGION_ELECTRICAL_POWERED} entrance", electrical)
							 | 
						||
| 
								 | 
							
								    electrical.exits.append(connection)
							 | 
						||
| 
								 | 
							
								    connection.connect(multiworld.get_region(REGION_ELECTRICAL_POWERED, player))
							 |