50 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			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
							 |