Archipelago/worlds/pokemon_emerald/regions.py

50 lines
1.8 KiB
Python

"""
Functions related to AP regions for Pokemon Emerald (see ./data/regions for region definitions)
"""
from typing import TYPE_CHECKING, Dict, List, Tuple
from BaseClasses import ItemClassification, Region
from .data import data
from .items import PokemonEmeraldItem
from .locations import PokemonEmeraldLocation
if TYPE_CHECKING:
from . import PokemonEmeraldWorld
def create_regions(world: "PokemonEmeraldWorld") -> Dict[str, Region]:
"""
Iterates through regions created from JSON to create regions and adds them to the multiworld.
Also creates and places events and connects regions via warps and the exits defined in the JSON.
"""
regions: Dict[str, Region] = {}
connections: List[Tuple[str, str, str]] = []
for region_name, region_data in data.regions.items():
new_region = Region(region_name, world.player, world.multiworld)
for event_data in region_data.events:
event = PokemonEmeraldLocation(world.player, event_data.name, None, new_region)
event.place_locked_item(PokemonEmeraldItem(event_data.name, ItemClassification.progression, None, world.player))
new_region.locations.append(event)
for region_exit in region_data.exits:
connections.append((f"{region_name} -> {region_exit}", region_name, region_exit))
for warp in region_data.warps:
dest_warp = data.warps[data.warp_map[warp]]
if dest_warp.parent_region is None:
continue
connections.append((warp, region_name, dest_warp.parent_region))
regions[region_name] = new_region
for name, source, dest in connections:
regions[source].connect(regions[dest], name)
regions["Menu"] = Region("Menu", world.player, world.multiworld)
regions["Menu"].connect(regions["REGION_LITTLEROOT_TOWN/MAIN"], "Start Game")
return regions