mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 12:11:33 -06:00
74 lines
3.9 KiB
Python
74 lines
3.9 KiB
Python
from BaseClasses import Region
|
|
from entrance_rando import ERPlacementState
|
|
from .model import ConnectionData, RandomizationFlag, reverse_connection_name, RegionData
|
|
from ..content import StardewContent
|
|
from ..options import EntranceRandomization
|
|
|
|
|
|
def create_player_randomization_flag(entrance_randomization_choice: EntranceRandomization, content: StardewContent):
|
|
"""Return the flag that a connection is expected to have to be randomized. Only the bit corresponding to the player randomization choice will be enabled.
|
|
|
|
Other bits for content exclusion might also be enabled, tho the preferred solution to exclude content should be to not create those regions at alls, when possible.
|
|
"""
|
|
flag = RandomizationFlag.NOT_RANDOMIZED
|
|
|
|
if entrance_randomization_choice.value == EntranceRandomization.option_disabled:
|
|
return flag
|
|
|
|
if entrance_randomization_choice == EntranceRandomization.option_pelican_town:
|
|
flag |= RandomizationFlag.BIT_PELICAN_TOWN
|
|
elif entrance_randomization_choice == EntranceRandomization.option_non_progression:
|
|
flag |= RandomizationFlag.BIT_NON_PROGRESSION
|
|
elif entrance_randomization_choice in (
|
|
EntranceRandomization.option_buildings,
|
|
EntranceRandomization.option_buildings_without_house,
|
|
EntranceRandomization.option_chaos
|
|
):
|
|
flag |= RandomizationFlag.BIT_BUILDINGS
|
|
|
|
if not content.features.skill_progression.are_masteries_shuffled:
|
|
flag |= RandomizationFlag.EXCLUDE_MASTERIES
|
|
|
|
return flag
|
|
|
|
|
|
def connect_regions(region_data_by_name: dict[str, RegionData], connection_data_by_name: dict[str, ConnectionData], regions_by_name: dict[str, Region],
|
|
player_randomization_flag: RandomizationFlag) -> None:
|
|
for region_name, region_data in region_data_by_name.items():
|
|
origin_region = regions_by_name[region_name]
|
|
|
|
for exit_name in region_data.exits:
|
|
connection_data = connection_data_by_name[exit_name]
|
|
destination_region = regions_by_name[connection_data.destination]
|
|
|
|
if connection_data.is_eligible_for_randomization(player_randomization_flag):
|
|
create_entrance_rando_target(origin_region, destination_region, connection_data)
|
|
else:
|
|
origin_region.connect(destination_region, connection_data.name)
|
|
|
|
|
|
def create_entrance_rando_target(origin: Region, destination: Region, connection_data: ConnectionData) -> None:
|
|
"""We need our own function to create the GER targets, because the Stardew Mod have very specific expectations for the name of the entrances.
|
|
We need to know exactly which entrances to swap in both directions."""
|
|
origin.create_exit(connection_data.name)
|
|
destination.create_er_target(connection_data.reverse)
|
|
|
|
|
|
def prepare_mod_data(placements: ERPlacementState) -> dict[str, str]:
|
|
"""Take the placements from GER and prepare the data for the mod.
|
|
The mod require a dictionary detailing which connections need to be swapped. It acts as if the connections are decoupled, so both directions are required.
|
|
|
|
For instance, GER will provide placements like (Town to Community Center, Hospital to Town), meaning that the door of the Community Center will instead lead
|
|
to the Hospital, and that the exit of the Hospital will lead to the Town by the Community Center door. The StardewAP mod need to know both swaps, being the
|
|
original destination of the "Town to Community Center" connection is to be replaced by the original destination of "Town to Hospital", and the original
|
|
destination of "Hospital to Town" is to be replaced by the original destination of "Community Center to Town".
|
|
"""
|
|
|
|
swapped_connections = {}
|
|
|
|
for entrance, exit_ in placements.pairings:
|
|
swapped_connections[entrance] = reverse_connection_name(exit_)
|
|
swapped_connections[exit_] = reverse_connection_name(entrance)
|
|
|
|
return swapped_connections
|