diff --git a/worlds/zork_grand_inquisitor/client.py b/worlds/zork_grand_inquisitor/client.py index ec4c6f03452c..40ba8a6a483f 100644 --- a/worlds/zork_grand_inquisitor/client.py +++ b/worlds/zork_grand_inquisitor/client.py @@ -211,9 +211,7 @@ async def controller(self): # Enqueue Received Item Delta goal_item_count: int = 0 - trap_item_counts: Dict[ZorkGrandInquisitorItems, int] = { - item: 0 for item in self.game_controller.all_trap_items - } + received_traps: List[ZorkGrandInquisitorItems] = list() network_item: NetUtils.NetworkItem for network_item in self.items_received: @@ -223,7 +221,7 @@ async def controller(self): goal_item_count += 1 continue elif item in self.game_controller.all_trap_items: - trap_item_counts[item] += 1 + received_traps.append(item) continue elif item not in self.game_controller.received_items: if item not in self.game_controller.received_items_queue: @@ -233,7 +231,7 @@ async def controller(self): self.game_controller.goal_item_count = goal_item_count self.game_controller.output_goal_item_update() - self.game_controller.trap_counters = trap_item_counts + self.game_controller.received_traps = received_traps # Game Controller Update if self.game_controller.is_process_running(): diff --git a/worlds/zork_grand_inquisitor/data/mapping_data.py b/worlds/zork_grand_inquisitor/data/mapping_data.py index 9eae2a87579b..4219d291fdc4 100644 --- a/worlds/zork_grand_inquisitor/data/mapping_data.py +++ b/worlds/zork_grand_inquisitor/data/mapping_data.py @@ -757,13 +757,6 @@ ZorkGrandInquisitorStartingLocations.MONASTERY_EXHIBIT: ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, } -traps_to_game_state_key: Dict[ZorkGrandInquisitorItems, int] = { - ZorkGrandInquisitorItems.TRAP_INFINITE_CORRIDOR: 19990, - ZorkGrandInquisitorItems.TRAP_REVERSE_CONTROLS: 19991, - ZorkGrandInquisitorItems.TRAP_TELEPORT: 19992, - ZorkGrandInquisitorItems.TRAP_ZVISION: 19993, -} - voxam_cast_game_locations: Dict[ ZorkGrandInquisitorStartingLocations, Tuple[Tuple[str, int], ...] diff --git a/worlds/zork_grand_inquisitor/game_controller.py b/worlds/zork_grand_inquisitor/game_controller.py index 56c5accdea45..47f32b3fcccf 100644 --- a/worlds/zork_grand_inquisitor/game_controller.py +++ b/worlds/zork_grand_inquisitor/game_controller.py @@ -15,7 +15,6 @@ death_cause_labels, hotspots_for_regional_hotspot, labels_for_enum_items, - traps_to_game_state_key, voxam_cast_game_locations, ) @@ -87,7 +86,7 @@ class GameController: starter_kit: Optional[List[str]] initial_totemizer_destination: Optional[ZorkGrandInquisitorItems] - trap_counters: Dict[ZorkGrandInquisitorItems, int] + received_traps: List[ZorkGrandInquisitorItems] active_trap: Optional[ZorkGrandInquisitorItems] active_trap_until: Optional[datetime.datetime] @@ -164,12 +163,7 @@ def __init__(self, logger=None) -> None: self.starter_kit = None self.initial_totemizer_destination = None - self.trap_counters = { - ZorkGrandInquisitorItems.TRAP_INFINITE_CORRIDOR: 0, - ZorkGrandInquisitorItems.TRAP_REVERSE_CONTROLS: 0, - ZorkGrandInquisitorItems.TRAP_TELEPORT: 0, - ZorkGrandInquisitorItems.TRAP_ZVISION: 0, - } + self.received_traps = list() self.active_trap = None self.active_trap_until = None @@ -471,12 +465,7 @@ def reset(self) -> None: self.starter_kit = None self.initial_totemizer_destination = None - self.trap_counters = { - ZorkGrandInquisitorItems.TRAP_INFINITE_CORRIDOR: 0, - ZorkGrandInquisitorItems.TRAP_REVERSE_CONTROLS: 0, - ZorkGrandInquisitorItems.TRAP_TELEPORT: 0, - ZorkGrandInquisitorItems.TRAP_ZVISION: 0, - } + self.received_traps = list() self.active_trap = None self.active_trap_until = None @@ -1447,29 +1436,56 @@ def _manage_traps(self) -> None: return None + processed_trap_counters: Dict[ZorkGrandInquisitorItems, int] = { + ZorkGrandInquisitorItems.TRAP_INFINITE_CORRIDOR: self._read_game_state_value_for(19990), + ZorkGrandInquisitorItems.TRAP_REVERSE_CONTROLS: self._read_game_state_value_for(19991), + ZorkGrandInquisitorItems.TRAP_TELEPORT: self._read_game_state_value_for(19992), + ZorkGrandInquisitorItems.TRAP_ZVISION: self._read_game_state_value_for(19993), + } + + traps_remaining: int = len(self.received_traps) - sum(processed_trap_counters.values()) - 1 + traps_remaining_message: str = f"Traps remaining: {traps_remaining}" if traps_remaining else "" + trap: ZorkGrandInquisitorItems - count: int - for trap, count in self.trap_counters.items(): - game_count: int = self._read_game_state_value_for(traps_to_game_state_key[trap]) - - if game_count < count: - if trap == ZorkGrandInquisitorItems.TRAP_INFINITE_CORRIDOR: - self._activate_trap_infinite_corridor() - elif trap == ZorkGrandInquisitorItems.TRAP_REVERSE_CONTROLS: - self.active_trap = ZorkGrandInquisitorItems.TRAP_REVERSE_CONTROLS - self.active_trap_until = datetime.datetime.now() + datetime.timedelta(seconds=30) - - self._activate_trap_reverse_controls() - elif trap == ZorkGrandInquisitorItems.TRAP_TELEPORT: - self._activate_trap_teleport() - elif trap == ZorkGrandInquisitorItems.TRAP_ZVISION: - self.active_trap = ZorkGrandInquisitorItems.TRAP_ZVISION - self.active_trap_until = datetime.datetime.now() + datetime.timedelta(seconds=30) - - self._activate_trap_zvision() - - self._write_game_state_value_for(traps_to_game_state_key[trap], game_count + 1) - break + for trap in self.received_traps: + if processed_trap_counters[trap]: + processed_trap_counters[trap] -= 1 + continue + + game_state_key: int = -1 + if trap == ZorkGrandInquisitorItems.TRAP_INFINITE_CORRIDOR: + game_state_key = 19990 + self._activate_trap_infinite_corridor() + + self.log(f"Infinite Corridor Trap! {traps_remaining_message}") + elif trap == ZorkGrandInquisitorItems.TRAP_REVERSE_CONTROLS: + game_state_key = 19991 + + self.active_trap = ZorkGrandInquisitorItems.TRAP_REVERSE_CONTROLS + self.active_trap_until = datetime.datetime.now() + datetime.timedelta(seconds=30) + + self._activate_trap_reverse_controls() + + self.log(f"Reverse Controls Trap for 30 seconds! {traps_remaining_message}") + elif trap == ZorkGrandInquisitorItems.TRAP_TELEPORT: + game_state_key = 19992 + self._activate_trap_teleport() + + self.log(f"Teleport Trap! {traps_remaining_message}") + elif trap == ZorkGrandInquisitorItems.TRAP_ZVISION: + game_state_key = 19993 + + self.active_trap = ZorkGrandInquisitorItems.TRAP_ZVISION + self.active_trap_until = datetime.datetime.now() + datetime.timedelta(seconds=30) + + self._activate_trap_zvision() + + self.log(f"ZVision Trap for 30 seconds! {traps_remaining_message}") + + current_count: int = self._read_game_state_value_for(game_state_key) + self._write_game_state_value_for(game_state_key, current_count + 1) + + break def _activate_trap_infinite_corridor(self) -> None: depth = random.randint(10, 20)