129 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			129 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from typing import TYPE_CHECKING, Dict, List, Optional, Set, Union
							 | 
						||
| 
								 | 
							
								from BaseClasses import CollectionState, LocationProgressType, Region
							 | 
						||
| 
								 | 
							
								from worlds.generic.Rules import add_rule, set_rule
							 | 
						||
| 
								 | 
							
								from .Data import (
							 | 
						||
| 
								 | 
							
								    get_boosts_data,
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								from .Enum import EraType
							 | 
						||
| 
								 | 
							
								from .Locations import GOODY_HUT_LOCATION_NAMES, CivVILocation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if TYPE_CHECKING:
							 | 
						||
| 
								 | 
							
								    from . import CivVIWorld
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def has_progressive_eras(
							 | 
						||
| 
								 | 
							
								    state: CollectionState, era: EraType, world: "CivVIWorld"
							 | 
						||
| 
								 | 
							
								) -> bool:
							 | 
						||
| 
								 | 
							
								    return state.has(
							 | 
						||
| 
								 | 
							
								        "Progressive Era", world.player, world.era_required_progressive_era_counts[era]
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def has_non_progressive_items(
							 | 
						||
| 
								 | 
							
								    state: CollectionState, era: EraType, world: "CivVIWorld"
							 | 
						||
| 
								 | 
							
								) -> bool:
							 | 
						||
| 
								 | 
							
								    return state.has_all(world.era_required_non_progressive_items[era], world.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def has_progressive_items(
							 | 
						||
| 
								 | 
							
								    state: CollectionState, era: EraType, world: "CivVIWorld"
							 | 
						||
| 
								 | 
							
								) -> bool:
							 | 
						||
| 
								 | 
							
								    return state.has_all_counts(
							 | 
						||
| 
								 | 
							
								        world.era_required_progressive_items_counts[era], world.player
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def create_regions(world: "CivVIWorld"):
							 | 
						||
| 
								 | 
							
								    menu = Region("Menu", world.player, world.multiworld)
							 | 
						||
| 
								 | 
							
								    world.multiworld.regions.append(menu)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    optional_location_inclusions: Dict[str, Union[bool, int]] = {
							 | 
						||
| 
								 | 
							
								        "ERA": world.options.progression_style
							 | 
						||
| 
								 | 
							
								        == world.options.progression_style.option_eras_and_districts,
							 | 
						||
| 
								 | 
							
								        "GOODY": world.options.shuffle_goody_hut_rewards.value,
							 | 
						||
| 
								 | 
							
								        "BOOST": world.options.boostsanity.value,
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    regions: List[Region] = []
							 | 
						||
| 
								 | 
							
								    previous_era: EraType = EraType.ERA_ANCIENT
							 | 
						||
| 
								 | 
							
								    for era in EraType:
							 | 
						||
| 
								 | 
							
								        era_region = Region(era.value, world.player, world.multiworld)
							 | 
						||
| 
								 | 
							
								        era_locations: Dict[str, Optional[int]] = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        for key, location in world.location_by_era[era.value].items():
							 | 
						||
| 
								 | 
							
								            category = key.split("_")[0]
							 | 
						||
| 
								 | 
							
								            if optional_location_inclusions.get(category, True):
							 | 
						||
| 
								 | 
							
								                era_locations[location.name] = location.code
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        era_region.add_locations(era_locations, CivVILocation)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        regions.append(era_region)
							 | 
						||
| 
								 | 
							
								        world.multiworld.regions.append(era_region)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Connect era to previous era if not ancient era
							 | 
						||
| 
								 | 
							
								        if era == EraType.ERA_ANCIENT:
							 | 
						||
| 
								 | 
							
								            menu.connect(world.get_region(EraType.ERA_ANCIENT.value))
							 | 
						||
| 
								 | 
							
								            continue
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        connection = world.get_region(previous_era.value).connect(
							 | 
						||
| 
								 | 
							
								            world.get_region(era.value)
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #  Access rules for eras
							 | 
						||
| 
								 | 
							
								        add_rule(
							 | 
						||
| 
								 | 
							
								            connection,
							 | 
						||
| 
								 | 
							
								            lambda state, previous_era=previous_era, world=world: has_non_progressive_items(
							 | 
						||
| 
								 | 
							
								                state, previous_era, world
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								        if world.options.progression_style == "eras_and_districts":
							 | 
						||
| 
								 | 
							
								            add_rule(
							 | 
						||
| 
								 | 
							
								                connection,
							 | 
						||
| 
								 | 
							
								                lambda state, previous_era=previous_era, world=world: has_progressive_eras(
							 | 
						||
| 
								 | 
							
								                    state, previous_era, world
							 | 
						||
| 
								 | 
							
								                ),
							 | 
						||
| 
								 | 
							
								            )
							 | 
						||
| 
								 | 
							
								        if world.options.progression_style != "none":
							 | 
						||
| 
								 | 
							
								            add_rule(
							 | 
						||
| 
								 | 
							
								                connection,
							 | 
						||
| 
								 | 
							
								                lambda state, previous_era=previous_era, world=world: has_progressive_items(
							 | 
						||
| 
								 | 
							
								                    state, previous_era, world
							 | 
						||
| 
								 | 
							
								                ),
							 | 
						||
| 
								 | 
							
								            )
							 | 
						||
| 
								 | 
							
								        previous_era = era
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    future_era = world.get_region(EraType.ERA_FUTURE.value)
							 | 
						||
| 
								 | 
							
								    victory = CivVILocation(world.player, "Complete a victory type", None, future_era)
							 | 
						||
| 
								 | 
							
								    victory.place_locked_item(world.create_event("Victory"))
							 | 
						||
| 
								 | 
							
								    future_era.locations.append(victory)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    set_rule(
							 | 
						||
| 
								 | 
							
								        victory,
							 | 
						||
| 
								 | 
							
								        lambda state: state.can_reach_region(EraType.ERA_FUTURE.value, world.player),
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    world.multiworld.completion_condition[world.player] = lambda state: state.has(
							 | 
						||
| 
								 | 
							
								        "Victory", world.player
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    exclude_necessary_locations(world)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def exclude_necessary_locations(world: "CivVIWorld"):
							 | 
						||
| 
								 | 
							
								    forced_excluded_location_names: Set[str] = set()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if world.options.shuffle_goody_hut_rewards:
							 | 
						||
| 
								 | 
							
								        forced_excluded_location_names.update(GOODY_HUT_LOCATION_NAMES)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if world.options.boostsanity:
							 | 
						||
| 
								 | 
							
								        boost_data_list = get_boosts_data()
							 | 
						||
| 
								 | 
							
								        excluded_boosts = {
							 | 
						||
| 
								 | 
							
								            boost_data.Type
							 | 
						||
| 
								 | 
							
								            for boost_data in boost_data_list
							 | 
						||
| 
								 | 
							
								            if boost_data.Classification == "EXCLUDED"
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        forced_excluded_location_names.update(excluded_boosts)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for location_name in forced_excluded_location_names:
							 | 
						||
| 
								 | 
							
								        location = world.get_location(location_name)
							 | 
						||
| 
								 | 
							
								        location.progress_type = LocationProgressType.EXCLUDED
							 |