mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
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
|