Skip to content

Commit

Permalink
universal tracker entrance randomizer support
Browse files Browse the repository at this point in the history
  • Loading branch information
nbrochu committed Feb 27, 2025
1 parent b4b1c87 commit 8c79a0f
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 4 deletions.
7 changes: 6 additions & 1 deletion worlds/zork_grand_inquisitor/game_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -1473,7 +1473,7 @@ def _apply_conditional_teleports(self) -> None:
self.game_state_manager.set_game_location("mt10", 1531)

# VOXAM Cast
zork_rocks_inert = self._read_game_state_value_for(11767) == 0
zork_rocks_inert: bool = self._read_game_state_value_for(11767) == 0

if self._read_game_state_value_for(9) == 224:
time.sleep(0.1)
Expand Down Expand Up @@ -1515,6 +1515,11 @@ def _manage_traps(self) -> None:
if not self._player_is_afgncaap() or self._read_game_state_value_for(19985) == 0:
return None

zork_rocks_inert: bool = self._read_game_state_value_for(11767) == 0

if not zork_rocks_inert:
return None

if self.active_trap_until:
if datetime.datetime.now() > self.active_trap_until:
if self.active_trap == ZorkGrandInquisitorItems.TRAP_REVERSE_CONTROLS:
Expand Down
49 changes: 46 additions & 3 deletions worlds/zork_grand_inquisitor/world.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ class ZorkGrandInquisitorWorld(World):
Tuple[ZorkGrandInquisitorRegions, ZorkGrandInquisitorRegions],
]

entrance_randomizer_pairings_ut: Dict[str, str]
entrance_rule_data: EntranceRuleData
filler_item_names: List[str] = item_groups()["Filler"]
goal: ZorkGrandInquisitorGoals
Expand All @@ -154,6 +155,10 @@ class ZorkGrandInquisitorWorld(World):
trap_percentage: int
trap_weights: Tuple[int, ...]

@property
def is_universal_tracker(self) -> bool:
return hasattr(self.multiworld, "re_gen_passthrough")

def generate_early(self) -> None:
self.goal = id_to_goals()[self.options.goal.value]

Expand Down Expand Up @@ -235,6 +240,9 @@ def generate_early(self) -> None:
"has the entrance randomizer enabled. Disabling the grantinmg of missable location checks..."
)

self.entrance_randomizer_pairings = dict()
self.entrance_randomizer_pairings_ut = dict()

self.entrance_rule_data = entrance_rule_data

self.item_data = prepare_item_data(
Expand Down Expand Up @@ -271,8 +279,8 @@ def generate_early(self) -> None:
)

# Universal Tracker Support
if hasattr(self.multiworld, "re_gen_passthrough"):
self._apply_ut_passthrough()
if self.is_universal_tracker:
self._apply_universal_tracker_passthrough()

def create_regions(self) -> None:
entrances_by_region: Dict[ZorkGrandInquisitorRegions, List[Entrance]] = entrances_by_region_for_world(
Expand Down Expand Up @@ -504,6 +512,12 @@ def connect_entrances(self) -> None:
entrance.randomization_type = EntranceType.TWO_WAY
disconnect_entrance_for_randomization(entrance)

if self.is_universal_tracker:
self._reconnect_entrances_for_universal_tracker()
visualize_regions(self.multiworld.get_region("Menu", self.player), "zgi-er-ut.puml")

return

entrance_randomizer_pairings: List[Tuple[str, str]] = randomize_entrances(
self,
self.entrance_randomizer == ZorkGrandInquisitorEntranceRandomizer.COUPLED,
Expand Down Expand Up @@ -560,10 +574,15 @@ def fill_slot_data(self) -> Dict[str, Any]:
if slot_data["landmarksanity"] != self.landmarksanity.value:
slot_data["landmarksanity"] = self.landmarksanity.value

if slot_data["grant_missable_location_checks"] != self.grant_missable_location_checks:
slot_data["grant_missable_location_checks"] = self.grant_missable_location_checks

slot_data["entrance_randomizer_data"] = dict()
slot_data["entrance_randomizer_data_ut"] = dict()

if self.entrance_randomizer != ZorkGrandInquisitorEntranceRandomizer.DISABLED:
slot_data["entrance_randomizer_data"] = self._prepare_entrance_randomizer_slot_data()
slot_data["entrance_randomizer_data_ut"] = self._prepare_entrance_randomizer_slot_data_ut()

return slot_data

Expand Down Expand Up @@ -640,7 +659,7 @@ def interpret_slot_data(slot_data: Dict[str, Any]) -> Dict[str, Any]:

return slot_data

def _apply_ut_passthrough(self) -> None:
def _apply_universal_tracker_passthrough(self) -> None:
if "Zork Grand Inquisitor" in self.multiworld.re_gen_passthrough:
passthrough: Dict[str, Any] = self.multiworld.re_gen_passthrough["Zork Grand Inquisitor"]

Expand All @@ -661,6 +680,8 @@ def _apply_ut_passthrough(self) -> None:
"entrance_randomizer_include_subway_destinations"
]

self.entrance_randomizer_pairings_ut = passthrough["entrance_randomizer_data_ut"]

self.item_data = prepare_item_data(
self.starting_location,
self.goal,
Expand Down Expand Up @@ -695,6 +716,16 @@ def _prepare_entrance_randomizer_slot_data(self) -> Dict[str, str]:

return entrance_randomizer_slot_data

def _prepare_entrance_randomizer_slot_data_ut(self) -> Dict[str, str]:
entrance_randomizer_slot_data_ut: Dict[str, str] = dict()

entrance_from: Tuple[ZorkGrandInquisitorRegions, ZorkGrandInquisitorRegions]
entrance_to: Tuple[ZorkGrandInquisitorRegions, ZorkGrandInquisitorRegions]
for entrance_from, entrance_to in self.entrance_randomizer_pairings.items():
entrance_randomizer_slot_data_ut[entrance_names[entrance_from]] = entrance_names[entrance_to]

return entrance_randomizer_slot_data_ut

def _prepare_locked_items(
self,
) -> Dict[ZorkGrandInquisitorLocations, ZorkGrandInquisitorItems]:
Expand Down Expand Up @@ -818,6 +849,18 @@ def _process_entrance_randomizer_pairings(pairings: List[Tuple[str, str]]) -> Di

return entrance_randomizer_pairings

def _reconnect_entrances_for_universal_tracker(self) -> None:
entrance_from: Entrance
for entrance_from in self.get_entrances():
if entrance_from.name in self.entrance_randomizer_pairings_ut:
entrance_to_name: str = self.entrance_randomizer_pairings_ut[entrance_from.name]

entrance_to_region_pair: Tuple[ZorkGrandInquisitorRegions, ZorkGrandInquisitorRegions] = (
entrance_names_reverse[entrance_to_name]
)

entrance_from.connect(self.get_region(entrance_to_region_pair[1].value))

def _select_initial_totemizer_destination(self) -> ZorkGrandInquisitorItems:
return self.random.choice((
ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION,
Expand Down

0 comments on commit 8c79a0f

Please sign in to comment.