diff --git a/worlds/zork_grand_inquisitor/client.py b/worlds/zork_grand_inquisitor/client.py index c86c3bc356ad..87dd0b840257 100644 --- a/worlds/zork_grand_inquisitor/client.py +++ b/worlds/zork_grand_inquisitor/client.py @@ -8,8 +8,11 @@ from .data_funcs import ( item_names_to_id, + item_names_to_item, location_names_to_id, + id_to_deathsanity, id_to_items, + id_to_landmarksanity, id_to_locations, id_to_goals, id_to_starting_locations, @@ -100,15 +103,27 @@ def on_package(self, cmd: str, _args: Any) -> None: # Options self.game_controller.option_goal = id_to_goals()[_args["slot_data"]["goal"]] - self.game_controller.option_deathsanity = _args["slot_data"]["deathsanity"] == 1 + + self.game_controller.option_starting_location = ( + id_to_starting_locations()[_args["slot_data"]["starting_location"]] + ) + + self.game_controller.option_deathsanity = ( + id_to_deathsanity()[_args["slot_data"]["deathsanity"]] + ) + + self.game_controller.option_landmarksanity = ( + id_to_landmarksanity()[_args["slot_data"]["landmarksanity"]] + ) self.game_controller.option_grant_missable_location_checks = ( _args["slot_data"]["grant_missable_location_checks"] == 1 ) - self.game_controller.option_starting_location = ( - id_to_starting_locations()[_args["slot_data"]["starting_location"]] - ) + # Initial Totemizer Destination + self.game_controller.initial_totemizer_destination = item_names_to_item()[ + _args["slot_data"]["initial_totemizer_destination"] + ] async def controller(self): while not self.exit_event.is_set(): diff --git a/worlds/zork_grand_inquisitor/data/entrance_rule_data.py b/worlds/zork_grand_inquisitor/data/entrance_rule_data.py index 2a048cf906b9..532bec7aafe4 100644 --- a/worlds/zork_grand_inquisitor/data/entrance_rule_data.py +++ b/worlds/zork_grand_inquisitor/data/entrance_rule_data.py @@ -1,6 +1,11 @@ from typing import Dict, Tuple, Union -from ..enums import ZorkGrandInquisitorEvents, ZorkGrandInquisitorItems, ZorkGrandInquisitorRegions +from ..enums import ( + ZorkGrandInquisitorEvents, + ZorkGrandInquisitorGoals, + ZorkGrandInquisitorItems, + ZorkGrandInquisitorRegions, +) entrance_rule_data: Dict[ @@ -33,7 +38,7 @@ ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, ), ), - (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.GUE_TECH): ( + (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE): ( ( ZorkGrandInquisitorItems.SPELL_REZROV, ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR, @@ -51,7 +56,12 @@ ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES, ), ), - (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.PORT_FOOZLE): None, + (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.PORT_FOOZLE): ( + ( + ZorkGrandInquisitorItems.WELL_ROPE, + ZorkGrandInquisitorItems.HOTSPOT_BUCKET, + ), + ), (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): ( ( ZorkGrandInquisitorItems.MAP, @@ -101,18 +111,22 @@ ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY, ), ), - (ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.DM_LAIR): None, + (ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.DM_LAIR): ( + ( + ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_HOUSE_EXIT, + ), + ), (ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.WALKING_CASTLE): ( ( ZorkGrandInquisitorItems.HOTSPOT_BLINDS, - ZorkGrandInquisitorEvents.KNOWS_OBIDIL, + ZorkGrandInquisitorItems.SPELL_OBIDIL, ), ), (ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.WHITE_HOUSE): ( ( ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR, ZorkGrandInquisitorItems.SPELL_NARWILE, - ZorkGrandInquisitorEvents.KNOWS_YASTARD, + ZorkGrandInquisitorItems.SPELL_YASTARD, ), ), (ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON): ( @@ -123,30 +137,9 @@ ), (ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, ZorkGrandInquisitorRegions.HADES_BEYOND_GATES): None, (ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO): None, - (ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, ZorkGrandInquisitorRegions.ENDGAME): ( - ( - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH, - ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS, - ZorkGrandInquisitorRegions.WHITE_HOUSE, - ZorkGrandInquisitorItems.TOTEM_BROG, # Needed here since White House is not broken down in 2 regions - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, - ZorkGrandInquisitorItems.BROGS_PLANK, - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE, - ), + (ZorkGrandInquisitorRegions.GUE_TECH, ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE): ( + (ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_WINDOWS,), ), - (ZorkGrandInquisitorRegions.GUE_TECH, ZorkGrandInquisitorRegions.CROSSROADS): None, (ZorkGrandInquisitorRegions.GUE_TECH, ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY): ( ( ZorkGrandInquisitorItems.SPELL_IGRAM, @@ -156,6 +149,10 @@ (ZorkGrandInquisitorRegions.GUE_TECH, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): ( (ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR,), ), + (ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE, ZorkGrandInquisitorRegions.CROSSROADS): None, + (ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE, ZorkGrandInquisitorRegions.GUE_TECH): ( + (ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_WINDOWS,), + ), (ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, ZorkGrandInquisitorRegions.GUE_TECH): None, (ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): ( ( @@ -164,7 +161,10 @@ ), ), (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.CROSSROADS): ( - (ZorkGrandInquisitorItems.MAP,), + ( + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS, + ), ), (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.DM_LAIR): ( ( @@ -172,7 +172,9 @@ ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, ), ), - (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.GUE_TECH): None, + (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.GUE_TECH): ( + (ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_WINDOWS,), + ), (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.HADES_SHORE): ( ( ZorkGrandInquisitorItems.MAP, @@ -193,7 +195,7 @@ ), (ZorkGrandInquisitorRegions.HADES, ZorkGrandInquisitorRegions.HADES_BEYOND_GATES): ( ( - ZorkGrandInquisitorEvents.KNOWS_SNAVIG, + ZorkGrandInquisitorItems.SPELL_SNAVIG, ZorkGrandInquisitorItems.TOTEM_BROG, # Visually hiding this totem is tied to owning it; no choice ), ), @@ -203,12 +205,15 @@ (ZorkGrandInquisitorRegions.HADES_BEYOND_GATES, ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO): ( ( ZorkGrandInquisitorItems.SPELL_NARWILE, - ZorkGrandInquisitorEvents.KNOWS_YASTARD, + ZorkGrandInquisitorItems.SPELL_YASTARD, ), ), (ZorkGrandInquisitorRegions.HADES_BEYOND_GATES, ZorkGrandInquisitorRegions.HADES): None, (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.CROSSROADS): ( - (ZorkGrandInquisitorItems.MAP,), + ( + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS, + ), ), (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.DM_LAIR): ( ( @@ -235,7 +240,9 @@ ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB, ), ), - (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): None, + (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): ( + (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_CROSSROADS,), + ), (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM): ( (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM,), ), @@ -264,19 +271,16 @@ ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT, ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER, ZorkGrandInquisitorItems.SPELL_NARWILE, - ZorkGrandInquisitorEvents.KNOWS_YASTARD, + ZorkGrandInquisitorItems.SPELL_YASTARD, ), ), (ZorkGrandInquisitorRegions.PORT_FOOZLE, ZorkGrandInquisitorRegions.CROSSROADS): ( - ( - ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE, - ZorkGrandInquisitorItems.ROPE, - ZorkGrandInquisitorItems.HOTSPOT_WELL, - ), + (ZorkGrandInquisitorItems.WELL_ROPE,), ), (ZorkGrandInquisitorRegions.PORT_FOOZLE, ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP): ( ( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, + ZorkGrandInquisitorItems.CIGAR, + ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR, ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL, ), ), @@ -288,33 +292,13 @@ ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR, ), ), - (ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, ZorkGrandInquisitorRegions.ENDGAME): ( - ( - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS, - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH, - ZorkGrandInquisitorRegions.WHITE_HOUSE, - ZorkGrandInquisitorItems.TOTEM_BROG, # Needed here since White House is not broken down in 2 regions - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, - ZorkGrandInquisitorItems.BROGS_PLANK, - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE, - ), - ), (ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST): None, (ZorkGrandInquisitorRegions.SPELL_LAB, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): None, (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.CROSSROADS): ( - (ZorkGrandInquisitorItems.MAP,), + ( + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS, + ), ), (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.DM_LAIR): ( ( @@ -328,7 +312,11 @@ ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH, ), ), - (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY): None, + (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY): ( + ( + ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_BRIDGE_EXIT, + ), + ), (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.HADES_SHORE): ( ( ZorkGrandInquisitorItems.MAP, @@ -372,47 +360,88 @@ (ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, ZorkGrandInquisitorRegions.HADES_SHORE): ( (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES,), ), - (ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): None, + (ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): ( + (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_CROSSROADS,), + ), (ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): ( (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY,), ), + (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.CROSSROADS): ( + ( + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS, + ), + ), (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.HADES_SHORE): ( (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES,), ), (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.MONASTERY): ( - ( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorEvents.ROPE_GLORFABLE, - ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT, - ), + (ZorkGrandInquisitorItems.MONASTERY_ROPE,), + ), + (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): ( + (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_CROSSROADS,), ), - (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): None, (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM): ( (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM,), ), (ZorkGrandInquisitorRegions.WALKING_CASTLE, ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR): None, (ZorkGrandInquisitorRegions.WHITE_HOUSE, ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR): None, - (ZorkGrandInquisitorRegions.WHITE_HOUSE, ZorkGrandInquisitorRegions.ENDGAME): ( + (ZorkGrandInquisitorRegions.WHITE_HOUSE, ZorkGrandInquisitorRegions.WHITE_HOUSE_INTERIOR): ( ( - ZorkGrandInquisitorItems.TOTEM_BROG, # Needed here since White House is not broken down in 2 regions + ZorkGrandInquisitorItems.TOTEM_BROG, ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, - ZorkGrandInquisitorItems.BROGS_PLANK, - ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE, - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, - ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, - ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, - ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS, - ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH, - ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, - ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, - ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY, - ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS, ), ), + (ZorkGrandInquisitorRegions.WHITE_HOUSE_INTERIOR, ZorkGrandInquisitorRegions.WHITE_HOUSE): None, +} + +endgame_entrance_data_by_goal: Dict[ + ZorkGrandInquisitorGoals, + Dict[ + Tuple[ + ZorkGrandInquisitorRegions, + ZorkGrandInquisitorRegions, + ], + Union[ + Tuple[ + Tuple[ + Union[ + ZorkGrandInquisitorEvents, + ZorkGrandInquisitorItems, + ZorkGrandInquisitorRegions, + ], + ..., + ], + ..., + ], + None, + ], + ], +] = { + ZorkGrandInquisitorGoals.THREE_ARTIFACTS: { + (ZorkGrandInquisitorRegions.MENU, ZorkGrandInquisitorRegions.ENDGAME): ( + ( + ZorkGrandInquisitorItems.COCONUT_OF_QUENDOR, + ZorkGrandInquisitorItems.CUBE_OF_FOUNDATION, + ZorkGrandInquisitorItems.SKULL_OF_YORUK, + ), + ) + }, + # ZorkGrandInquisitorGoals.SPELL_HEIST: { + # (ZorkGrandInquisitorRegions.PORT_FOOZLE, ZorkGrandInquisitorRegions.ENDGAME): ( + # ( + # ZorkGrandInquisitorItems.SPELL_BEBURTT, + # ZorkGrandInquisitorItems.SPELL_GLORF, + # ZorkGrandInquisitorItems.SPELL_GOLGATEM, + # ZorkGrandInquisitorItems.SPELL_IGRAM, + # ZorkGrandInquisitorItems.SPELL_KENDALL, + # ZorkGrandInquisitorItems.SPELL_OBIDIL, + # ZorkGrandInquisitorItems.SPELL_NARWILE, + # ZorkGrandInquisitorItems.SPELL_REZROV, + # ZorkGrandInquisitorItems.SPELL_SNAVIG, + # ZorkGrandInquisitorItems.SPELL_THROCK, + # ZorkGrandInquisitorItems.SPELL_YASTARD, + # ), + # ) + # }, } diff --git a/worlds/zork_grand_inquisitor/data/item_data.py b/worlds/zork_grand_inquisitor/data/item_data.py index 1ffe8dd6b566..010781d38271 100644 --- a/worlds/zork_grand_inquisitor/data/item_data.py +++ b/worlds/zork_grand_inquisitor/data/item_data.py @@ -41,207 +41,195 @@ class ZorkGrandInquisitorItemData(NamedTuple): classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), - ZorkGrandInquisitorItems.FLATHEADIA_FUDGE: ZorkGrandInquisitorItemData( - statemap_keys=(54,), + ZorkGrandInquisitorItems.CIGAR: ZorkGrandInquisitorItemData( + statemap_keys=(1,), archipelago_id=ITEM_OFFSET + 4, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), + ZorkGrandInquisitorItems.COCOA_INGREDIENTS: ZorkGrandInquisitorItemData( + statemap_keys=None, + archipelago_id=ITEM_OFFSET + 5, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), + ), ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP: ZorkGrandInquisitorItemData( statemap_keys=(86,), - archipelago_id=ITEM_OFFSET + 5, + archipelago_id=ITEM_OFFSET + 6, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH: ZorkGrandInquisitorItemData( statemap_keys=(84,), - archipelago_id=ITEM_OFFSET + 6, + archipelago_id=ITEM_OFFSET + 7, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT: ZorkGrandInquisitorItemData( statemap_keys=(9,), - archipelago_id=ITEM_OFFSET + 7, + archipelago_id=ITEM_OFFSET + 8, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN: ZorkGrandInquisitorItemData( statemap_keys=(16,), - archipelago_id=ITEM_OFFSET + 8, + archipelago_id=ITEM_OFFSET + 9, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.HAMMER: ZorkGrandInquisitorItemData( statemap_keys=(23,), - archipelago_id=ITEM_OFFSET + 9, + archipelago_id=ITEM_OFFSET + 10, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.HUNGUS_LARD: ZorkGrandInquisitorItemData( statemap_keys=(55,), - archipelago_id=ITEM_OFFSET + 10, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.JAR_OF_HOTBUGS: ZorkGrandInquisitorItemData( - statemap_keys=(56,), archipelago_id=ITEM_OFFSET + 11, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), - ZorkGrandInquisitorItems.LANTERN: ZorkGrandInquisitorItemData( - statemap_keys=(4,), - archipelago_id=ITEM_OFFSET + 12, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER: ZorkGrandInquisitorItemData( statemap_keys=(88,), - archipelago_id=ITEM_OFFSET + 13, + archipelago_id=ITEM_OFFSET + 12, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1: ZorkGrandInquisitorItemData( statemap_keys=(116,), # With fly = 120 - archipelago_id=ITEM_OFFSET + 14, + archipelago_id=ITEM_OFFSET + 13, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2: ZorkGrandInquisitorItemData( statemap_keys=(117,), # With fly = 121 - archipelago_id=ITEM_OFFSET + 15, + archipelago_id=ITEM_OFFSET + 14, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3: ZorkGrandInquisitorItemData( statemap_keys=(118,), # With fly = 122 - archipelago_id=ITEM_OFFSET + 16, + archipelago_id=ITEM_OFFSET + 15, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4: ZorkGrandInquisitorItemData( statemap_keys=(119,), # With fly = 123 - archipelago_id=ITEM_OFFSET + 17, + archipelago_id=ITEM_OFFSET + 16, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.MAP: ZorkGrandInquisitorItemData( statemap_keys=(6,), - archipelago_id=ITEM_OFFSET + 18, + archipelago_id=ITEM_OFFSET + 17, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.MEAD_LIGHT: ZorkGrandInquisitorItemData( statemap_keys=(2,), - archipelago_id=ITEM_OFFSET + 19, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.MOSS_OF_MAREILON: ZorkGrandInquisitorItemData( - statemap_keys=(57,), - archipelago_id=ITEM_OFFSET + 20, + archipelago_id=ITEM_OFFSET + 18, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), - ZorkGrandInquisitorItems.MUG: ZorkGrandInquisitorItemData( - statemap_keys=(35,), - archipelago_id=ITEM_OFFSET + 21, + ZorkGrandInquisitorItems.MONASTERY_ROPE: ZorkGrandInquisitorItemData( + statemap_keys=None, + archipelago_id=ITEM_OFFSET + 19, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.OLD_SCRATCH_CARD: ZorkGrandInquisitorItemData( statemap_keys=(17,), - archipelago_id=ITEM_OFFSET + 22, + archipelago_id=ITEM_OFFSET + 20, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.PERMA_SUCK_MACHINE: ZorkGrandInquisitorItemData( statemap_keys=(36,), - archipelago_id=ITEM_OFFSET + 23, + archipelago_id=ITEM_OFFSET + 21, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER: ZorkGrandInquisitorItemData( statemap_keys=(3,), - archipelago_id=ITEM_OFFSET + 24, + archipelago_id=ITEM_OFFSET + 22, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS: ZorkGrandInquisitorItemData( - statemap_keys=(5827,), - archipelago_id=ITEM_OFFSET + 25, + statemap_keys=None, + archipelago_id=ITEM_OFFSET + 23, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.PROZORK_TABLET: ZorkGrandInquisitorItemData( statemap_keys=(65,), - archipelago_id=ITEM_OFFSET + 26, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), - ), - ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB: ZorkGrandInquisitorItemData( - statemap_keys=(53,), - archipelago_id=ITEM_OFFSET + 27, + archipelago_id=ITEM_OFFSET + 24, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), - ZorkGrandInquisitorItems.ROPE: ZorkGrandInquisitorItemData( - statemap_keys=(83,), - archipelago_id=ITEM_OFFSET + 28, + ZorkGrandInquisitorItems.SANDWITCH_WRAPPER: ZorkGrandInquisitorItemData( + statemap_keys=(34,), + archipelago_id=ITEM_OFFSET + 25, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS: ZorkGrandInquisitorItemData( statemap_keys=(101,), # SNA = 41 - archipelago_id=ITEM_OFFSET + 29, + archipelago_id=ITEM_OFFSET + 26, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV: ZorkGrandInquisitorItemData( statemap_keys=(102,), # VIG = 48 - archipelago_id=ITEM_OFFSET + 30, + archipelago_id=ITEM_OFFSET + 27, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.SHOVEL: ZorkGrandInquisitorItemData( statemap_keys=(49,), - archipelago_id=ITEM_OFFSET + 31, + archipelago_id=ITEM_OFFSET + 28, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.SNAPDRAGON: ZorkGrandInquisitorItemData( statemap_keys=(50,), - archipelago_id=ITEM_OFFSET + 32, + archipelago_id=ITEM_OFFSET + 29, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.STUDENT_ID: ZorkGrandInquisitorItemData( statemap_keys=(39,), - archipelago_id=ITEM_OFFSET + 33, + archipelago_id=ITEM_OFFSET + 30, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.SUBWAY_TOKEN: ZorkGrandInquisitorItemData( statemap_keys=(20,), - archipelago_id=ITEM_OFFSET + 34, + archipelago_id=ITEM_OFFSET + 31, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.SWORD: ZorkGrandInquisitorItemData( statemap_keys=(21,), - archipelago_id=ITEM_OFFSET + 35, + archipelago_id=ITEM_OFFSET + 32, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), + ), + ZorkGrandInquisitorItems.WELL_ROPE: ZorkGrandInquisitorItemData( + statemap_keys=None, + archipelago_id=ITEM_OFFSET + 33, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.ZIMDOR_SCROLL: ZorkGrandInquisitorItemData( statemap_keys=(25,), - archipelago_id=ITEM_OFFSET + 36, + archipelago_id=ITEM_OFFSET + 34, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), ZorkGrandInquisitorItems.ZORK_ROCKS: ZorkGrandInquisitorItemData( statemap_keys=(37,), - archipelago_id=ITEM_OFFSET + 37, + archipelago_id=ITEM_OFFSET + 35, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,), ), @@ -270,129 +258,141 @@ class ZorkGrandInquisitorItemData(NamedTuple): classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), + ZorkGrandInquisitorItems.HOTSPOT_BUCKET: ZorkGrandInquisitorItemData( + statemap_keys=(13928,), + archipelago_id=ITEM_OFFSET + 100 + 4, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.HOTSPOT,), + ), ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS: ZorkGrandInquisitorItemData( statemap_keys=(12691, 12692, 12693, 12694, 12695, 12696, 12697, 12698, 12699, 12700, 12701), - archipelago_id=ITEM_OFFSET + 100 + 4, + archipelago_id=ITEM_OFFSET + 100 + 5, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT: ZorkGrandInquisitorItemData( statemap_keys=(12702,), - archipelago_id=ITEM_OFFSET + 100 + 5, + archipelago_id=ITEM_OFFSET + 100 + 6, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_VACUUM_SLOT: ZorkGrandInquisitorItemData( statemap_keys=(12909,), - archipelago_id=ITEM_OFFSET + 100 + 6, + archipelago_id=ITEM_OFFSET + 100 + 7, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_CHANGE_MACHINE_SLOT: ZorkGrandInquisitorItemData( statemap_keys=(12900,), - archipelago_id=ITEM_OFFSET + 100 + 7, + archipelago_id=ITEM_OFFSET + 100 + 8, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR: ZorkGrandInquisitorItemData( statemap_keys=(5010,), - archipelago_id=ITEM_OFFSET + 100 + 8, + archipelago_id=ITEM_OFFSET + 100 + 9, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT: ZorkGrandInquisitorItemData( statemap_keys=(9539,), - archipelago_id=ITEM_OFFSET + 100 + 9, + archipelago_id=ITEM_OFFSET + 100 + 10, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER: ZorkGrandInquisitorItemData( statemap_keys=(19712,), - archipelago_id=ITEM_OFFSET + 100 + 10, + archipelago_id=ITEM_OFFSET + 100 + 11, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT: ZorkGrandInquisitorItemData( statemap_keys=(2586,), - archipelago_id=ITEM_OFFSET + 100 + 11, + archipelago_id=ITEM_OFFSET + 100 + 12, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_DENTED_LOCKER: ZorkGrandInquisitorItemData( statemap_keys=(11878,), - archipelago_id=ITEM_OFFSET + 100 + 12, + archipelago_id=ITEM_OFFSET + 100 + 13, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND: ZorkGrandInquisitorItemData( statemap_keys=(11751,), - archipelago_id=ITEM_OFFSET + 100 + 13, + archipelago_id=ITEM_OFFSET + 100 + 14, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH: ZorkGrandInquisitorItemData( statemap_keys=(15147, 15153), - archipelago_id=ITEM_OFFSET + 100 + 14, + archipelago_id=ITEM_OFFSET + 100 + 15, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW: ZorkGrandInquisitorItemData( statemap_keys=(1705,), - archipelago_id=ITEM_OFFSET + 100 + 15, + archipelago_id=ITEM_OFFSET + 100 + 16, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS: ZorkGrandInquisitorItemData( statemap_keys=(1425, 1426), - archipelago_id=ITEM_OFFSET + 100 + 16, + archipelago_id=ITEM_OFFSET + 100 + 17, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.HOTSPOT,), + ), + ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_HOUSE_EXIT: ZorkGrandInquisitorItemData( + statemap_keys=(4791,), + archipelago_id=ITEM_OFFSET + 100 + 18, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE: ZorkGrandInquisitorItemData( statemap_keys=(13106,), - archipelago_id=ITEM_OFFSET + 100 + 17, + archipelago_id=ITEM_OFFSET + 100 + 19, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS: ZorkGrandInquisitorItemData( statemap_keys=(13219, 13220, 13221, 13222), - archipelago_id=ITEM_OFFSET + 100 + 18, + archipelago_id=ITEM_OFFSET + 100 + 20, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS: ZorkGrandInquisitorItemData( statemap_keys=(14327, 14332, 14337, 14342), - archipelago_id=ITEM_OFFSET + 100 + 19, + archipelago_id=ITEM_OFFSET + 100 + 21, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT: ZorkGrandInquisitorItemData( statemap_keys=(12528,), - archipelago_id=ITEM_OFFSET + 100 + 20, + archipelago_id=ITEM_OFFSET + 100 + 22, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS: ZorkGrandInquisitorItemData( statemap_keys=(12523, 12524, 12525), - archipelago_id=ITEM_OFFSET + 100 + 21, + archipelago_id=ITEM_OFFSET + 100 + 23, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE: ZorkGrandInquisitorItemData( statemap_keys=(13002,), - archipelago_id=ITEM_OFFSET + 100 + 22, + archipelago_id=ITEM_OFFSET + 100 + 24, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL: ZorkGrandInquisitorItemData( statemap_keys=(10726,), - archipelago_id=ITEM_OFFSET + 100 + 23, + archipelago_id=ITEM_OFFSET + 100 + 25, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR: ZorkGrandInquisitorItemData( statemap_keys=(12280,), - archipelago_id=ITEM_OFFSET + 100 + 24, + archipelago_id=ITEM_OFFSET + 100 + 26, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), @@ -420,286 +420,322 @@ class ZorkGrandInquisitorItemData(NamedTuple): 17726, 17727 ), - archipelago_id=ITEM_OFFSET + 100 + 25, + archipelago_id=ITEM_OFFSET + 100 + 27, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.HOTSPOT,), + ), + ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_WINDOWS: ZorkGrandInquisitorItemData( + statemap_keys=(11543, 12256, 11720), + archipelago_id=ITEM_OFFSET + 100 + 28, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS: ZorkGrandInquisitorItemData( statemap_keys=(8448, 8449, 8450, 8451, 8452, 8453, 8454, 8455, 8456, 8457, 8458, 8459), - archipelago_id=ITEM_OFFSET + 100 + 26, + archipelago_id=ITEM_OFFSET + 100 + 29, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER: ZorkGrandInquisitorItemData( statemap_keys=(8446,), - archipelago_id=ITEM_OFFSET + 100 + 27, + archipelago_id=ITEM_OFFSET + 100 + 30, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_HARRY: ZorkGrandInquisitorItemData( statemap_keys=(4260,), - archipelago_id=ITEM_OFFSET + 100 + 28, + archipelago_id=ITEM_OFFSET + 100 + 31, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY: ZorkGrandInquisitorItemData( statemap_keys=(18026,), - archipelago_id=ITEM_OFFSET + 100 + 29, + archipelago_id=ITEM_OFFSET + 100 + 32, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH: ZorkGrandInquisitorItemData( statemap_keys=(17623,), - archipelago_id=ITEM_OFFSET + 100 + 30, + archipelago_id=ITEM_OFFSET + 100 + 33, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR: ZorkGrandInquisitorItemData( statemap_keys=(13140,), - archipelago_id=ITEM_OFFSET + 100 + 31, + archipelago_id=ITEM_OFFSET + 100 + 34, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR: ZorkGrandInquisitorItemData( statemap_keys=(10441,), - archipelago_id=ITEM_OFFSET + 100 + 32, + archipelago_id=ITEM_OFFSET + 100 + 35, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS: ZorkGrandInquisitorItemData( statemap_keys=(19632, 19627), - archipelago_id=ITEM_OFFSET + 100 + 33, + archipelago_id=ITEM_OFFSET + 100 + 36, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR: ZorkGrandInquisitorItemData( statemap_keys=(3025,), - archipelago_id=ITEM_OFFSET + 100 + 34, + archipelago_id=ITEM_OFFSET + 100 + 37, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG: ZorkGrandInquisitorItemData( statemap_keys=(3036,), - archipelago_id=ITEM_OFFSET + 100 + 35, + archipelago_id=ITEM_OFFSET + 100 + 38, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_MIRROR: ZorkGrandInquisitorItemData( statemap_keys=(5031,), - archipelago_id=ITEM_OFFSET + 100 + 36, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), - ), - ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT: ZorkGrandInquisitorItemData( - statemap_keys=(13597,), - archipelago_id=ITEM_OFFSET + 100 + 37, + archipelago_id=ITEM_OFFSET + 100 + 39, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_MOSSY_GRATE: ZorkGrandInquisitorItemData( statemap_keys=(13390,), - archipelago_id=ITEM_OFFSET + 100 + 38, + archipelago_id=ITEM_OFFSET + 100 + 40, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR: ZorkGrandInquisitorItemData( statemap_keys=(2455, 2447), - archipelago_id=ITEM_OFFSET + 100 + 39, + archipelago_id=ITEM_OFFSET + 100 + 41, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS: ZorkGrandInquisitorItemData( statemap_keys=(12389, 12390), - archipelago_id=ITEM_OFFSET + 100 + 40, + archipelago_id=ITEM_OFFSET + 100 + 42, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE: ZorkGrandInquisitorItemData( statemap_keys=(4302,), - archipelago_id=ITEM_OFFSET + 100 + 41, + archipelago_id=ITEM_OFFSET + 100 + 43, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE: ZorkGrandInquisitorItemData( statemap_keys=(16383, 16384), - archipelago_id=ITEM_OFFSET + 100 + 42, + archipelago_id=ITEM_OFFSET + 100 + 44, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE: ZorkGrandInquisitorItemData( statemap_keys=(2769,), - archipelago_id=ITEM_OFFSET + 100 + 43, + archipelago_id=ITEM_OFFSET + 100 + 45, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON: ZorkGrandInquisitorItemData( statemap_keys=(4149,), - archipelago_id=ITEM_OFFSET + 100 + 44, + archipelago_id=ITEM_OFFSET + 100 + 46, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS: ZorkGrandInquisitorItemData( statemap_keys=(12584, 12585, 12586, 12587), - archipelago_id=ITEM_OFFSET + 100 + 45, + archipelago_id=ITEM_OFFSET + 100 + 47, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT: ZorkGrandInquisitorItemData( statemap_keys=(12574,), - archipelago_id=ITEM_OFFSET + 100 + 46, + archipelago_id=ITEM_OFFSET + 100 + 48, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT: ZorkGrandInquisitorItemData( statemap_keys=(13412,), - archipelago_id=ITEM_OFFSET + 100 + 47, + archipelago_id=ITEM_OFFSET + 100 + 49, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER: ZorkGrandInquisitorItemData( statemap_keys=(12170,), - archipelago_id=ITEM_OFFSET + 100 + 48, + archipelago_id=ITEM_OFFSET + 100 + 50, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.HOTSPOT,), + ), + ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_BRIDGE_EXIT: ZorkGrandInquisitorItemData( + statemap_keys=(12045,), + archipelago_id=ITEM_OFFSET + 100 + 51, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM: ZorkGrandInquisitorItemData( statemap_keys=(16382,), - archipelago_id=ITEM_OFFSET + 100 + 49, + archipelago_id=ITEM_OFFSET + 100 + 52, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM: ZorkGrandInquisitorItemData( statemap_keys=(4209,), - archipelago_id=ITEM_OFFSET + 100 + 50, + archipelago_id=ITEM_OFFSET + 100 + 53, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE: ZorkGrandInquisitorItemData( statemap_keys=(11973,), - archipelago_id=ITEM_OFFSET + 100 + 51, + archipelago_id=ITEM_OFFSET + 100 + 54, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT: ZorkGrandInquisitorItemData( statemap_keys=(13168,), - archipelago_id=ITEM_OFFSET + 100 + 52, + archipelago_id=ITEM_OFFSET + 100 + 55, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY: ZorkGrandInquisitorItemData( statemap_keys=(15396,), - archipelago_id=ITEM_OFFSET + 100 + 53, + archipelago_id=ITEM_OFFSET + 100 + 56, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH: ZorkGrandInquisitorItemData( statemap_keys=(9706,), - archipelago_id=ITEM_OFFSET + 100 + 54, + archipelago_id=ITEM_OFFSET + 100 + 57, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS: ZorkGrandInquisitorItemData( statemap_keys=(9728, 9729, 9730), - archipelago_id=ITEM_OFFSET + 100 + 55, + archipelago_id=ITEM_OFFSET + 100 + 58, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.HOTSPOT,), ), - ZorkGrandInquisitorItems.HOTSPOT_WELL: ZorkGrandInquisitorItemData( - statemap_keys=(10314,), - archipelago_id=ITEM_OFFSET + 100 + 56, + # Spells + ZorkGrandInquisitorItems.SPELL_BEBURTT: ZorkGrandInquisitorItemData( + statemap_keys=(194,), + archipelago_id=ITEM_OFFSET + 200 + 0, classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.HOTSPOT,), + tags=(ZorkGrandInquisitorTags.SPELL,), ), - # Spells ZorkGrandInquisitorItems.SPELL_GLORF: ZorkGrandInquisitorItemData( statemap_keys=(202,), - archipelago_id=ITEM_OFFSET + 200 + 0, + archipelago_id=ITEM_OFFSET + 200 + 1, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.SPELL,), ), ZorkGrandInquisitorItems.SPELL_GOLGATEM: ZorkGrandInquisitorItemData( statemap_keys=(192,), - archipelago_id=ITEM_OFFSET + 200 + 1, + archipelago_id=ITEM_OFFSET + 200 + 2, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.SPELL,), ), ZorkGrandInquisitorItems.SPELL_IGRAM: ZorkGrandInquisitorItemData( statemap_keys=(199,), - archipelago_id=ITEM_OFFSET + 200 + 2, + archipelago_id=ITEM_OFFSET + 200 + 3, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.SPELL,), ), ZorkGrandInquisitorItems.SPELL_KENDALL: ZorkGrandInquisitorItemData( statemap_keys=(196,), - archipelago_id=ITEM_OFFSET + 200 + 3, + archipelago_id=ITEM_OFFSET + 200 + 4, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.SPELL,), + ), + ZorkGrandInquisitorItems.SPELL_OBIDIL: ZorkGrandInquisitorItemData( + statemap_keys=(193,), + archipelago_id=ITEM_OFFSET + 200 + 5, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.SPELL,), ), ZorkGrandInquisitorItems.SPELL_NARWILE: ZorkGrandInquisitorItemData( statemap_keys=(197,), - archipelago_id=ITEM_OFFSET + 200 + 4, + archipelago_id=ITEM_OFFSET + 200 + 6, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.SPELL,), ), ZorkGrandInquisitorItems.SPELL_REZROV: ZorkGrandInquisitorItemData( statemap_keys=(195,), - archipelago_id=ITEM_OFFSET + 200 + 5, + archipelago_id=ITEM_OFFSET + 200 + 7, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.SPELL,), + ), + ZorkGrandInquisitorItems.SPELL_SNAVIG: ZorkGrandInquisitorItemData( + statemap_keys=(201,), + archipelago_id=ITEM_OFFSET + 200 + 8, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.SPELL,), ), ZorkGrandInquisitorItems.SPELL_THROCK: ZorkGrandInquisitorItemData( statemap_keys=(200,), - archipelago_id=ITEM_OFFSET + 200 + 6, + archipelago_id=ITEM_OFFSET + 200 + 9, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.SPELL,), + ), + ZorkGrandInquisitorItems.SPELL_YASTARD: ZorkGrandInquisitorItemData( + statemap_keys=(198,), + archipelago_id=ITEM_OFFSET + 200 + 10, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.SPELL,), ), # Subway Destinations + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_CROSSROADS: ZorkGrandInquisitorItemData( + statemap_keys=(13760, 13323, 13512, 13651), + archipelago_id=ITEM_OFFSET + 300 + 0, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.SUBWAY_DESTINATION,), + ), ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM: ZorkGrandInquisitorItemData( statemap_keys=(13757, 13297, 13486, 13625), - archipelago_id=ITEM_OFFSET + 300 + 0, + archipelago_id=ITEM_OFFSET + 300 + 1, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.SUBWAY_DESTINATION,), ), ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES: ZorkGrandInquisitorItemData( statemap_keys=(13758, 13309, 13498, 13637), - archipelago_id=ITEM_OFFSET + 300 + 1, + archipelago_id=ITEM_OFFSET + 300 + 2, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.SUBWAY_DESTINATION,), ), ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY: ZorkGrandInquisitorItemData( statemap_keys=(13759, 13316, 13505, 13644), - archipelago_id=ITEM_OFFSET + 300 + 2, + archipelago_id=ITEM_OFFSET + 300 + 3, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.SUBWAY_DESTINATION,), ), - # Teleporter Destinations + # Teleporter Destination + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS: ZorkGrandInquisitorItemData( + statemap_keys=(12918,), + archipelago_id=ITEM_OFFSET + 400 + 0, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), + ), ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR: ZorkGrandInquisitorItemData( statemap_keys=(2203,), - archipelago_id=ITEM_OFFSET + 400 + 0, + archipelago_id=ITEM_OFFSET + 400 + 1, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), ), ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH: ZorkGrandInquisitorItemData( statemap_keys=(7132,), - archipelago_id=ITEM_OFFSET + 400 + 1, + archipelago_id=ITEM_OFFSET + 400 + 2, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), ), ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES: ZorkGrandInquisitorItemData( statemap_keys=(7119,), - archipelago_id=ITEM_OFFSET + 400 + 2, + archipelago_id=ITEM_OFFSET + 400 + 3, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), ), ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY: ZorkGrandInquisitorItemData( statemap_keys=(7148,), - archipelago_id=ITEM_OFFSET + 400 + 3, + archipelago_id=ITEM_OFFSET + 400 + 4, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), ), ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB: ZorkGrandInquisitorItemData( statemap_keys=(16545,), - archipelago_id=ITEM_OFFSET + 400 + 4, + archipelago_id=ITEM_OFFSET + 400 + 5, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,), ), @@ -713,19 +749,25 @@ class ZorkGrandInquisitorItemData(NamedTuple): ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY: ZorkGrandInquisitorItemData( statemap_keys=(9666,), archipelago_id=ITEM_OFFSET + 500 + 1, - classification=ItemClassification.filler, + classification=ItemClassification.progression, + tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,), + ), + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_NEWARK_NEW_JERSEY: ZorkGrandInquisitorItemData( + statemap_keys=(9664,), + archipelago_id=ITEM_OFFSET + 500 + 2, + classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,), ), ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL: ZorkGrandInquisitorItemData( statemap_keys=(9668,), - archipelago_id=ITEM_OFFSET + 500 + 2, + archipelago_id=ITEM_OFFSET + 500 + 3, classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,), ), ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ: ZorkGrandInquisitorItemData( statemap_keys=(9662,), - archipelago_id=ITEM_OFFSET + 500 + 3, - classification=ItemClassification.filler, + archipelago_id=ITEM_OFFSET + 500 + 4, + classification=ItemClassification.progression, tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,), ), # Totems @@ -783,65 +825,23 @@ class ZorkGrandInquisitorItemData(NamedTuple): tags=(ZorkGrandInquisitorTags.FILLER,), maximum_quantity=None, ), - # Logic Helpers - These virtual items are granted to the player conditionally to simplify logic where possible - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_CROSSROADS: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 900 + 0, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.LOGIC_HELPER,), - ), - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_DM_LAIR: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 900 + 1, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.LOGIC_HELPER,), - ), - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_DM_LAIR_INTERIOR: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 900 + 2, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.LOGIC_HELPER,), - ), - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_GUE_TECH: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 900 + 3, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.LOGIC_HELPER,), - ), - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_HADES_SHORE: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 900 + 4, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.LOGIC_HELPER,), - ), - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_MONASTERY: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 900 + 5, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.LOGIC_HELPER,), - ), - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_MONASTERY_EXHIBIT: ZorkGrandInquisitorItemData( - statemap_keys=None, - archipelago_id=ITEM_OFFSET + 900 + 6, - classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.LOGIC_HELPER,), - ), - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_PORT_FOOZLE: ZorkGrandInquisitorItemData( + # Goal Items + ZorkGrandInquisitorItems.COCONUT_OF_QUENDOR: ZorkGrandInquisitorItemData( statemap_keys=None, - archipelago_id=ITEM_OFFSET + 900 + 7, + archipelago_id=ITEM_OFFSET + 800 + 0, classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.LOGIC_HELPER,), + tags=(ZorkGrandInquisitorTags.GOAL_THREE_ARTIFACTS,), ), - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_SPELL_LAB: ZorkGrandInquisitorItemData( + ZorkGrandInquisitorItems.CUBE_OF_FOUNDATION: ZorkGrandInquisitorItemData( statemap_keys=None, - archipelago_id=ITEM_OFFSET + 900 + 8, + archipelago_id=ITEM_OFFSET + 800 + 1, classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.LOGIC_HELPER,), + tags=(ZorkGrandInquisitorTags.GOAL_THREE_ARTIFACTS,), ), - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_SUBWAY_FLOOD_CONTROL_DAM: ZorkGrandInquisitorItemData( + ZorkGrandInquisitorItems.SKULL_OF_YORUK: ZorkGrandInquisitorItemData( statemap_keys=None, - archipelago_id=ITEM_OFFSET + 900 + 9, + archipelago_id=ITEM_OFFSET + 800 + 2, classification=ItemClassification.progression, - tags=(ZorkGrandInquisitorTags.LOGIC_HELPER,), + tags=(ZorkGrandInquisitorTags.GOAL_THREE_ARTIFACTS,), ), } diff --git a/worlds/zork_grand_inquisitor/data/location_data.py b/worlds/zork_grand_inquisitor/data/location_data.py index 8b4e57392de8..e259a467bf29 100644 --- a/worlds/zork_grand_inquisitor/data/location_data.py +++ b/worlds/zork_grand_inquisitor/data/location_data.py @@ -16,6 +16,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): Tuple[str, str], Tuple[int, int], Tuple[int, Tuple[int, ...]], + Tuple[Tuple[int, ...], int], ], ..., ] @@ -61,8 +62,8 @@ class ZorkGrandInquisitorLocationData(NamedTuple): region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL, + ZorkGrandInquisitorItems.CIGAR, ), ), ZorkGrandInquisitorLocations.ARTIFACTS_EXPLAINED: ZorkGrandInquisitorLocationData( @@ -76,7 +77,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): archipelago_id=LOCATION_OFFSET + 3, region=ZorkGrandInquisitorRegions.HADES, tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.KNOWS_OBIDIL,), + requirements=(ZorkGrandInquisitorItems.SPELL_OBIDIL,), ), ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE: ZorkGrandInquisitorLocationData( game_state_trigger=((9124, 1),), @@ -155,46 +156,34 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ZorkGrandInquisitorLocations.BROG_DO_GOOD: ZorkGrandInquisitorLocationData( game_state_trigger=((2644, 1),), archipelago_id=LOCATION_OFFSET + 12, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, + region=ZorkGrandInquisitorRegions.WHITE_HOUSE_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( - ZorkGrandInquisitorItems.TOTEM_BROG, ZorkGrandInquisitorItems.BROGS_GRUE_EGG, ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, ) ), ZorkGrandInquisitorLocations.BROG_EAT_ROCKS: ZorkGrandInquisitorLocationData( game_state_trigger=((2629, 1),), archipelago_id=LOCATION_OFFSET + 13, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, + region=ZorkGrandInquisitorRegions.WHITE_HOUSE_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_BROG, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ) ), ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB: ZorkGrandInquisitorLocationData( game_state_trigger=((2650, 1),), archipelago_id=LOCATION_OFFSET + 14, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, + region=ZorkGrandInquisitorRegions.WHITE_HOUSE_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.TOTEM_BROG, - ZorkGrandInquisitorItems.BROGS_GRUE_EGG, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, - ) + requirements=(ZorkGrandInquisitorItems.BROGS_GRUE_EGG,), ), ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME: ZorkGrandInquisitorLocationData( game_state_trigger=((15715, 1),), archipelago_id=LOCATION_OFFSET + 15, - region=ZorkGrandInquisitorRegions.WHITE_HOUSE, + region=ZorkGrandInquisitorRegions.WHITE_HOUSE_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( - ZorkGrandInquisitorItems.TOTEM_BROG, ZorkGrandInquisitorItems.BROGS_GRUE_EGG, ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, - ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, ZorkGrandInquisitorItems.BROGS_PLANK, ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE, ) @@ -218,9 +207,22 @@ class ZorkGrandInquisitorLocationData(NamedTuple): region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, tags=(ZorkGrandInquisitorTags.CORE,), ), + ZorkGrandInquisitorLocations.COME_TO_PAPA_YOU_NUT: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "cd6k"), (1673, 1), (1660, 1), (1312, 1)), + archipelago_id=LOCATION_OFFSET + 19, + region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, + tags=(ZorkGrandInquisitorTags.CORE,), + requirements=( + ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP, + ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT, + ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN, + ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS, + ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH, + ), + ), ZorkGrandInquisitorLocations.CRISIS_AVERTED: ZorkGrandInquisitorLocationData( game_state_trigger=((11769, 1),), - archipelago_id=LOCATION_OFFSET + 19, + archipelago_id=LOCATION_OFFSET + 20, region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -232,13 +234,13 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.CUT_THAT_OUT_YOU_LITTLE_CREEP: ZorkGrandInquisitorLocationData( game_state_trigger=((19350, 1),), - archipelago_id=LOCATION_OFFSET + 20, + archipelago_id=LOCATION_OFFSET + 21, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER: ZorkGrandInquisitorLocationData( game_state_trigger=((17632, 1),), - archipelago_id=LOCATION_OFFSET + 21, + archipelago_id=LOCATION_OFFSET + 22, region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=( @@ -246,12 +248,6 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ZorkGrandInquisitorItems.SPELL_GOLGATEM, ), ), - ZorkGrandInquisitorLocations.DESPERATELY_SEEKING_TUTOR: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2q"),), - archipelago_id=LOCATION_OFFSET + 22, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "hp5e"), (8919, 2), (9, 100)), archipelago_id=LOCATION_OFFSET + 23, @@ -335,8 +331,8 @@ class ZorkGrandInquisitorLocationData(NamedTuple): region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL, + ZorkGrandInquisitorItems.CIGAR, ), ), ZorkGrandInquisitorLocations.FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE: ZorkGrandInquisitorLocationData( @@ -379,33 +375,27 @@ class ZorkGrandInquisitorLocationData(NamedTuple): region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), ), - ZorkGrandInquisitorLocations.GUE_TECH_DEANS_LIST: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2k"),), + ZorkGrandInquisitorLocations.GOOD_PUZZLE_SMART_BROG: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "sg6e"), (17103, 1), (15715, 1), (15707, 1)), archipelago_id=LOCATION_OFFSET + 39, - region=ZorkGrandInquisitorRegions.GUE_TECH, + region=ZorkGrandInquisitorRegions.WHITE_HOUSE_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), + requirements=( + ZorkGrandInquisitorItems.BROGS_GRUE_EGG, + ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, + ZorkGrandInquisitorItems.BROGS_PLANK, + ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE, + ) ), ZorkGrandInquisitorLocations.GUE_TECH_ENTRANCE_EXAM: ZorkGrandInquisitorLocationData( game_state_trigger=((11082, 1), (11307, 1), (11536, 1)), archipelago_id=LOCATION_OFFSET + 40, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.GUE_TECH_HEALTH_MEMO: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2j"),), - archipelago_id=LOCATION_OFFSET + 41, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.GUE_TECH_MAGEMEISTERS: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2n"),), - archipelago_id=LOCATION_OFFSET + 42, - region=ZorkGrandInquisitorRegions.GUE_TECH, + region=ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY: ZorkGrandInquisitorLocationData( game_state_trigger=((8443, 1),), - archipelago_id=LOCATION_OFFSET + 43, + archipelago_id=LOCATION_OFFSET + 41, region=ZorkGrandInquisitorRegions.HADES_SHORE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -415,13 +405,13 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.HELLO_THIS_IS_SHONA_FROM_GURTH_PUBLISHING: ZorkGrandInquisitorLocationData( game_state_trigger=((4698, 1),), - archipelago_id=LOCATION_OFFSET + 44, + archipelago_id=LOCATION_OFFSET + 42, region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE: ZorkGrandInquisitorLocationData( game_state_trigger=((10421, 1),), - archipelago_id=LOCATION_OFFSET + 45, + archipelago_id=LOCATION_OFFSET + 43, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -431,7 +421,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.HEY_FREE_DIRT: ZorkGrandInquisitorLocationData( game_state_trigger=((11747, 1),), - archipelago_id=LOCATION_OFFSET + 46, + archipelago_id=LOCATION_OFFSET + 44, region=ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -439,40 +429,28 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ZorkGrandInquisitorItems.SHOVEL, ), ), - ZorkGrandInquisitorLocations.HI_MY_NAME_IS_DOUG: ZorkGrandInquisitorLocationData( - game_state_trigger=((4698, 2),), - archipelago_id=LOCATION_OFFSET + 47, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), ZorkGrandInquisitorLocations.HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "mt2h"),), - archipelago_id=LOCATION_OFFSET + 48, + archipelago_id=LOCATION_OFFSET + 45, region=ZorkGrandInquisitorRegions.MONASTERY, tags=(ZorkGrandInquisitorTags.CORE,), ), - ZorkGrandInquisitorLocations.HOLD_ON_FOR_AN_IMPORTANT_MESSAGE: ZorkGrandInquisitorLocationData( - game_state_trigger=((4698, 5),), - archipelago_id=LOCATION_OFFSET + 49, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), ZorkGrandInquisitorLocations.HOW_TO_HYPNOTIZE_YOURSELF: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "uh1e"),), - archipelago_id=LOCATION_OFFSET + 50, + archipelago_id=LOCATION_OFFSET + 46, region=ZorkGrandInquisitorRegions.HADES_SHORE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.HOW_TO_WIN_AT_DOUBLE_FANUCCI: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "th3s"),), - archipelago_id=LOCATION_OFFSET + 51, + archipelago_id=LOCATION_OFFSET + 47, region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, tags=(ZorkGrandInquisitorTags.CORE,), requirements=(ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE,), ), ZorkGrandInquisitorLocations.IMBUE_BEBURTT: ZorkGrandInquisitorLocationData( - game_state_trigger=((194, 1),), - archipelago_id=LOCATION_OFFSET + 52, + game_state_trigger=((12166, 1),), + archipelago_id=LOCATION_OFFSET + 48, region=ZorkGrandInquisitorRegions.SPELL_LAB, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -482,13 +460,13 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.IM_COMPLETELY_NUDE: ZorkGrandInquisitorLocationData( game_state_trigger=((19344, 1),), - archipelago_id=LOCATION_OFFSET + 53, + archipelago_id=LOCATION_OFFSET + 49, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE: ZorkGrandInquisitorLocationData( game_state_trigger=((13060, 1),), - archipelago_id=LOCATION_OFFSET + 54, + archipelago_id=LOCATION_OFFSET + 50, region=ZorkGrandInquisitorRegions.CROSSROADS, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -498,14 +476,14 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.INVISIBLE_FLOWERS: ZorkGrandInquisitorLocationData( game_state_trigger=((12967, 1),), - archipelago_id=LOCATION_OFFSET + 55, + archipelago_id=LOCATION_OFFSET + 51, region=ZorkGrandInquisitorRegions.CROSSROADS, tags=(ZorkGrandInquisitorTags.CORE,), requirements=(ZorkGrandInquisitorItems.SPELL_IGRAM,), ), ZorkGrandInquisitorLocations.IN_CASE_OF_ADVENTURE: ZorkGrandInquisitorLocationData( game_state_trigger=((12931, 1),), - archipelago_id=LOCATION_OFFSET + 56, + archipelago_id=LOCATION_OFFSET + 52, region=ZorkGrandInquisitorRegions.CROSSROADS, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -515,7 +493,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST: ZorkGrandInquisitorLocationData( game_state_trigger=((13062, 1),), - archipelago_id=LOCATION_OFFSET + 57, + archipelago_id=LOCATION_OFFSET + 53, region=ZorkGrandInquisitorRegions.CROSSROADS, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -525,13 +503,13 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.ITS_ONE_OF_THOSE_ADVENTURERS_AGAIN: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "pe3j"),), - archipelago_id=LOCATION_OFFSET + 58, + archipelago_id=LOCATION_OFFSET + 54, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY: ZorkGrandInquisitorLocationData( game_state_trigger=((3816, 1008),), - archipelago_id=LOCATION_OFFSET + 59, + archipelago_id=LOCATION_OFFSET + 55, region=ZorkGrandInquisitorRegions.DM_LAIR, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=( @@ -541,24 +519,13 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.I_DONT_WANT_NO_TROUBLE: ZorkGrandInquisitorLocationData( game_state_trigger=((10694, 1),), - archipelago_id=LOCATION_OFFSET + 60, + archipelago_id=LOCATION_OFFSET + 56, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), ), - ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE: ZorkGrandInquisitorLocationData( - game_state_trigger=((9637, 1),), - archipelago_id=LOCATION_OFFSET + 61, - region=ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, - tags=(ZorkGrandInquisitorTags.CORE,), - requirements=( - ZorkGrandInquisitorItems.SWORD, - ZorkGrandInquisitorEvents.ROPE_GLORFABLE, - ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT, - ), - ), ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE: ZorkGrandInquisitorLocationData( game_state_trigger=((16374, 1),), - archipelago_id=LOCATION_OFFSET + 62, + archipelago_id=LOCATION_OFFSET + 57, region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -571,32 +538,32 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "tp1e"), (9, 87), (1011, 1)), - archipelago_id=LOCATION_OFFSET + 63, + archipelago_id=LOCATION_OFFSET + 58, region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,), ), ZorkGrandInquisitorLocations.LIT_SUNFLOWERS: ZorkGrandInquisitorLocationData( game_state_trigger=((4129, 1),), - archipelago_id=LOCATION_OFFSET + 64, + archipelago_id=LOCATION_OFFSET + 59, region=ZorkGrandInquisitorRegions.DM_LAIR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=(ZorkGrandInquisitorItems.SPELL_THROCK,), ), - ZorkGrandInquisitorLocations.MAGIC_FOREVER: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "pc1e"), (10304, 1), (5221, 1)), - archipelago_id=LOCATION_OFFSET + 65, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, + ZorkGrandInquisitorLocations.LOOK_AN_ICE_CREAM_BAR: ZorkGrandInquisitorLocationData( + game_state_trigger=((12517, 1),), + archipelago_id=LOCATION_OFFSET + 60, + region=ZorkGrandInquisitorRegions.GUE_TECH, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( - ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE, - ZorkGrandInquisitorItems.ROPE, - ZorkGrandInquisitorItems.HOTSPOT_WELL, - ), + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT, + ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS, + ) ), ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL: ZorkGrandInquisitorLocationData( game_state_trigger=((2498, (1, 2)),), - archipelago_id=LOCATION_OFFSET + 66, + archipelago_id=LOCATION_OFFSET + 61, region=ZorkGrandInquisitorRegions.WHITE_HOUSE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -606,8 +573,8 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ), ZorkGrandInquisitorLocations.MAKE_LOVE_NOT_WAR: ZorkGrandInquisitorLocationData( - game_state_trigger=((8623, 21),), - archipelago_id=LOCATION_OFFSET + 67, + game_state_trigger=(((8623, 8734), 21),), + archipelago_id=LOCATION_OFFSET + 62, region=ZorkGrandInquisitorRegions.HADES_SHORE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -617,7 +584,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.MEAD_LIGHT: ZorkGrandInquisitorLocationData( game_state_trigger=((10485, 1),), - archipelago_id=LOCATION_OFFSET + 68, + archipelago_id=LOCATION_OFFSET + 63, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=( @@ -627,13 +594,13 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.MIKES_PANTS: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "tr2p"),), - archipelago_id=LOCATION_OFFSET + 69, + archipelago_id=LOCATION_OFFSET + 64, region=ZorkGrandInquisitorRegions.GUE_TECH, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED: ZorkGrandInquisitorLocationData( game_state_trigger=((4217, 1),), - archipelago_id=LOCATION_OFFSET + 70, + archipelago_id=LOCATION_OFFSET + 65, region=ZorkGrandInquisitorRegions.DM_LAIR, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=( @@ -643,7 +610,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.NATIONAL_TREASURE: ZorkGrandInquisitorLocationData( game_state_trigger=((14318, 1),), - archipelago_id=LOCATION_OFFSET + 71, + archipelago_id=LOCATION_OFFSET + 66, region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -654,13 +621,13 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.NATURAL_AND_SUPERNATURAL_CREATURES_OF_QUENDOR: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "dv1p"),), - archipelago_id=LOCATION_OFFSET + 72, + archipelago_id=LOCATION_OFFSET + 67, region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO: ZorkGrandInquisitorLocationData( game_state_trigger=((12706, 1),), - archipelago_id=LOCATION_OFFSET + 73, + archipelago_id=LOCATION_OFFSET + 68, region=ZorkGrandInquisitorRegions.GUE_TECH, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -671,51 +638,51 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.NOTHIN_LIKE_A_GOOD_STOGIE: ZorkGrandInquisitorLocationData( game_state_trigger=((4237, 1),), - archipelago_id=LOCATION_OFFSET + 74, + archipelago_id=LOCATION_OFFSET + 69, region=ZorkGrandInquisitorRegions.DM_LAIR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY, + ZorkGrandInquisitorItems.CIGAR, ), ), ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT: ZorkGrandInquisitorLocationData( game_state_trigger=((8935, 1),), - archipelago_id=LOCATION_OFFSET + 75, + archipelago_id=LOCATION_OFFSET + 70, region=ZorkGrandInquisitorRegions.HADES, tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.KNOWS_SNAVIG,), + requirements=(ZorkGrandInquisitorItems.SPELL_SNAVIG,), ), ZorkGrandInquisitorLocations.NO_AUTOGRAPHS: ZorkGrandInquisitorLocationData( game_state_trigger=((10476, 1),), - archipelago_id=LOCATION_OFFSET + 76, + archipelago_id=LOCATION_OFFSET + 71, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=(ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR,), ), ZorkGrandInquisitorLocations.NO_BONDAGE: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "pe2e"), (10262, 2), (15150, 83)), - archipelago_id=LOCATION_OFFSET + 77, + archipelago_id=LOCATION_OFFSET + 72, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=( - ZorkGrandInquisitorItems.ROPE, + ZorkGrandInquisitorEvents.ROPE_GLORFABLE, ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH, ), ), ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP: ZorkGrandInquisitorLocationData( game_state_trigger=((12164, 1),), - archipelago_id=LOCATION_OFFSET + 78, + archipelago_id=LOCATION_OFFSET + 73, region=ZorkGrandInquisitorRegions.SPELL_LAB, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL, ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, + ZorkGrandInquisitorItems.SANDWITCH_WRAPPER, ), ), ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON: ZorkGrandInquisitorLocationData( game_state_trigger=((1300, 1),), - archipelago_id=LOCATION_OFFSET + 79, + archipelago_id=LOCATION_OFFSET + 74, region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -727,7 +694,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS: ZorkGrandInquisitorLocationData( game_state_trigger=((2448, 1),), - archipelago_id=LOCATION_OFFSET + 80, + archipelago_id=LOCATION_OFFSET + 75, region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -737,41 +704,40 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU: ZorkGrandInquisitorLocationData( game_state_trigger=((4869, 1),), - archipelago_id=LOCATION_OFFSET + 81, + archipelago_id=LOCATION_OFFSET + 76, region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( - ZorkGrandInquisitorItems.FLATHEADIA_FUDGE, + ZorkGrandInquisitorItems.COCOA_INGREDIENTS, ZorkGrandInquisitorItems.HUNGUS_LARD, - ZorkGrandInquisitorItems.JAR_OF_HOTBUGS, - ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB, - ZorkGrandInquisitorItems.MOSS_OF_MAREILON, - ZorkGrandInquisitorItems.MUG, ), ), ZorkGrandInquisitorLocations.OLD_SCRATCH_WINNER: ZorkGrandInquisitorLocationData( game_state_trigger=((4512, 32),), - archipelago_id=LOCATION_OFFSET + 82, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, # This can be done anywhere if the item requirement is met + archipelago_id=LOCATION_OFFSET + 77, + region=ZorkGrandInquisitorRegions.ANYWHERE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=(ZorkGrandInquisitorItems.OLD_SCRATCH_CARD,), ), ZorkGrandInquisitorLocations.ONLY_YOU_CAN_PREVENT_FOOZLE_FIRES: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "pe5n"),), - archipelago_id=LOCATION_OFFSET + 83, + archipelago_id=LOCATION_OFFSET + 78, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL: ZorkGrandInquisitorLocationData( game_state_trigger=((8730, 1),), - archipelago_id=LOCATION_OFFSET + 84, + archipelago_id=LOCATION_OFFSET + 79, region=ZorkGrandInquisitorRegions.HADES, tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.KNOWS_SNAVIG,), + requirements=( + ZorkGrandInquisitorItems.SPELL_SNAVIG, + ZorkGrandInquisitorItems.TOTEM_BROG, # Visually hiding this totem is tied to owning it; no choice + ), ), ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES: ZorkGrandInquisitorLocationData( game_state_trigger=((4241, 1),), - archipelago_id=LOCATION_OFFSET + 85, + archipelago_id=LOCATION_OFFSET + 80, region=ZorkGrandInquisitorRegions.DM_LAIR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -782,25 +748,25 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.PERMASEAL: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "mt1g"),), - archipelago_id=LOCATION_OFFSET + 86, + archipelago_id=LOCATION_OFFSET + 81, region=ZorkGrandInquisitorRegions.MONASTERY, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.PLANETFALL: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "pp1j"),), - archipelago_id=LOCATION_OFFSET + 87, + archipelago_id=LOCATION_OFFSET + 82, region=ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.PLEASE_DONT_THROCK_THE_GRASS: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "te1g"),), - archipelago_id=LOCATION_OFFSET + 88, - region=ZorkGrandInquisitorRegions.GUE_TECH, + archipelago_id=LOCATION_OFFSET + 83, + region=ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL: ZorkGrandInquisitorLocationData( game_state_trigger=((9404, 1),), - archipelago_id=LOCATION_OFFSET + 89, + archipelago_id=LOCATION_OFFSET + 84, region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -812,7 +778,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.PROZORKED: ZorkGrandInquisitorLocationData( game_state_trigger=((4115, 1),), - archipelago_id=LOCATION_OFFSET + 90, + archipelago_id=LOCATION_OFFSET + 85, region=ZorkGrandInquisitorRegions.DM_LAIR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -822,7 +788,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG: ZorkGrandInquisitorLocationData( game_state_trigger=((4512, 98),), - archipelago_id=LOCATION_OFFSET + 91, + archipelago_id=LOCATION_OFFSET + 86, region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -831,27 +797,15 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ZorkGrandInquisitorItems.HOTSPOT_MIRROR, ), ), - ZorkGrandInquisitorLocations.RESTOCKED_ON_GRUESDAY: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "tr2h"),), - archipelago_id=LOCATION_OFFSET + 92, - region=ZorkGrandInquisitorRegions.GUE_TECH, - tags=(ZorkGrandInquisitorTags.CORE,), - ), ZorkGrandInquisitorLocations.RIGHT_HELLO_YES_UH_THIS_IS_SNEFFLE: ZorkGrandInquisitorLocationData( game_state_trigger=((4698, 3),), - archipelago_id=LOCATION_OFFSET + 93, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - tags=(ZorkGrandInquisitorTags.CORE,), - ), - ZorkGrandInquisitorLocations.RIGHT_UH_SORRY_ITS_ME_AGAIN_SNEFFLE: ZorkGrandInquisitorLocationData( - game_state_trigger=((4698, 4),), - archipelago_id=LOCATION_OFFSET + 94, + archipelago_id=LOCATION_OFFSET + 87, region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.SNAVIG_REPAIRED: ZorkGrandInquisitorLocationData( - game_state_trigger=((201, 1),), - archipelago_id=LOCATION_OFFSET + 95, + game_state_trigger=((12161, 1),), + archipelago_id=LOCATION_OFFSET + 88, region=ZorkGrandInquisitorRegions.SPELL_LAB, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -861,7 +815,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.SOUVENIR: ZorkGrandInquisitorLocationData( game_state_trigger=((13408, 1),), - archipelago_id=LOCATION_OFFSET + 96, + archipelago_id=LOCATION_OFFSET + 89, region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -871,7 +825,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL: ZorkGrandInquisitorLocationData( game_state_trigger=((9719, 1),), - archipelago_id=LOCATION_OFFSET + 97, + archipelago_id=LOCATION_OFFSET + 90, region=ZorkGrandInquisitorRegions.MONASTERY, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -882,7 +836,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER: ZorkGrandInquisitorLocationData( game_state_trigger=((14511, 1), (14524, 5)), - archipelago_id=LOCATION_OFFSET + 98, + archipelago_id=LOCATION_OFFSET + 91, region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -896,31 +850,33 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.SUCKING_ROCKS: ZorkGrandInquisitorLocationData( game_state_trigger=((12859, 1),), - archipelago_id=LOCATION_OFFSET + 99, + archipelago_id=LOCATION_OFFSET + 92, region=ZorkGrandInquisitorRegions.GUE_TECH, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( - ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE, + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT, + ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS, ZorkGrandInquisitorItems.PERMA_SUCK_MACHINE, ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_VACUUM_SLOT, ), ), ZorkGrandInquisitorLocations.TALK_TO_ME_GRAND_INQUISITOR: ZorkGrandInquisitorLocationData( game_state_trigger=((10299, 1),), - archipelago_id=LOCATION_OFFSET + 100, + archipelago_id=LOCATION_OFFSET + 93, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=(ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL,), ), ZorkGrandInquisitorLocations.TAMING_YOUR_SNAPDRAGON: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "dv1h"),), - archipelago_id=LOCATION_OFFSET + 101, + archipelago_id=LOCATION_OFFSET + 94, region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.THAR_SHE_BLOWS: ZorkGrandInquisitorLocationData( game_state_trigger=((1311, 1), (1312, 1)), - archipelago_id=LOCATION_OFFSET + 102, + archipelago_id=LOCATION_OFFSET + 95, region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -933,61 +889,71 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.THATS_A_ROPE: ZorkGrandInquisitorLocationData( game_state_trigger=((10486, 1),), - archipelago_id=LOCATION_OFFSET + 103, + archipelago_id=LOCATION_OFFSET + 96, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=( - ZorkGrandInquisitorItems.ROPE, + ZorkGrandInquisitorEvents.ROPE_GLORFABLE, ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR, ), ), ZorkGrandInquisitorLocations.THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS: ZorkGrandInquisitorLocationData( game_state_trigger=((13805, 1),), - archipelago_id=LOCATION_OFFSET + 104, + archipelago_id=LOCATION_OFFSET + 97, region=ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), ), ZorkGrandInquisitorLocations.THATS_STILL_A_ROPE: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "tp1e"), (9, 83), (1011, 1)), - archipelago_id=LOCATION_OFFSET + 105, + archipelago_id=LOCATION_OFFSET + 98, region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=(ZorkGrandInquisitorEvents.ROPE_GLORFABLE,), ), ZorkGrandInquisitorLocations.THATS_THE_SPIRIT: ZorkGrandInquisitorLocationData( game_state_trigger=((10341, 95),), - archipelago_id=LOCATION_OFFSET + 106, + archipelago_id=LOCATION_OFFSET + 99, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=(ZorkGrandInquisitorItems.HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS,), ), ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE: ZorkGrandInquisitorLocationData( game_state_trigger=((9459, 1),), - archipelago_id=LOCATION_OFFSET + 107, + archipelago_id=LOCATION_OFFSET + 100, region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE: ZorkGrandInquisitorLocationData( game_state_trigger=((9473, 1),), - archipelago_id=LOCATION_OFFSET + 108, + archipelago_id=LOCATION_OFFSET + 101, region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO: ZorkGrandInquisitorLocationData( game_state_trigger=((9520, 1),), - archipelago_id=LOCATION_OFFSET + 109, + archipelago_id=LOCATION_OFFSET + 102, region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, tags=(ZorkGrandInquisitorTags.CORE,), ), + ZorkGrandInquisitorLocations.THE_ONLY_WAY_TO_WIN_IS_NOT_TO_PLAY: ZorkGrandInquisitorLocationData( + game_state_trigger=((16286, 1),), + archipelago_id=LOCATION_OFFSET + 103, + region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, + tags=(ZorkGrandInquisitorTags.CORE,), + requirements=( + ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE, + ZorkGrandInquisitorItems.SPELL_KENDALL, + ), + ), ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "me1j"),), - archipelago_id=LOCATION_OFFSET + 110, + archipelago_id=LOCATION_OFFSET + 104, region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND: ZorkGrandInquisitorLocationData( game_state_trigger=((13167, 1),), - archipelago_id=LOCATION_OFFSET + 111, + archipelago_id=LOCATION_OFFSET + 105, region=ZorkGrandInquisitorRegions.CROSSROADS, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -997,14 +963,14 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "cd60"), (1524, 1)), - archipelago_id=LOCATION_OFFSET + 112, + archipelago_id=LOCATION_OFFSET + 106, region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, tags=(ZorkGrandInquisitorTags.CORE,), requirements=(ZorkGrandInquisitorItems.TOTEM_LUCY,), ), ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED: ZorkGrandInquisitorLocationData( game_state_trigger=((4219, 1),), - archipelago_id=LOCATION_OFFSET + 113, + archipelago_id=LOCATION_OFFSET + 107, region=ZorkGrandInquisitorRegions.DM_LAIR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -1015,34 +981,34 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.TIME_TRAVEL_FOR_DUMMIES: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "th3z"),), - archipelago_id=LOCATION_OFFSET + 114, + archipelago_id=LOCATION_OFFSET + 108, region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, tags=(ZorkGrandInquisitorTags.CORE,), requirements=(ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE,), ), ZorkGrandInquisitorLocations.TOTEMIZED_DAILY_BILLBOARD: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "px1h"),), - archipelago_id=LOCATION_OFFSET + 115, + archipelago_id=LOCATION_OFFSET + 109, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "cd60"), (1520, 1)), - archipelago_id=LOCATION_OFFSET + 116, + archipelago_id=LOCATION_OFFSET + 110, region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, tags=(ZorkGrandInquisitorTags.CORE,), requirements=(ZorkGrandInquisitorItems.TOTEM_BROG,), ), ZorkGrandInquisitorLocations.UMBRELLA_FLOWERS: ZorkGrandInquisitorLocationData( game_state_trigger=((12926, 1),), - archipelago_id=LOCATION_OFFSET + 117, + archipelago_id=LOCATION_OFFSET + 111, region=ZorkGrandInquisitorRegions.CROSSROADS, tags=(ZorkGrandInquisitorTags.CORE,), - requirements=(ZorkGrandInquisitorEvents.KNOWS_BEBURTT,), + requirements=(ZorkGrandInquisitorItems.SPELL_BEBURTT,), ), ZorkGrandInquisitorLocations.UP: ZorkGrandInquisitorLocationData( game_state_trigger=((3619, 5200),), - archipelago_id=LOCATION_OFFSET + 118, + archipelago_id=LOCATION_OFFSET + 112, region=ZorkGrandInquisitorRegions.WHITE_HOUSE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -1052,14 +1018,14 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.USELESS_BUT_FUN: ZorkGrandInquisitorLocationData( game_state_trigger=((14321, 1),), - archipelago_id=LOCATION_OFFSET + 119, + archipelago_id=LOCATION_OFFSET + 113, region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, tags=(ZorkGrandInquisitorTags.CORE,), requirements=(ZorkGrandInquisitorItems.SPELL_GOLGATEM,), ), ZorkGrandInquisitorLocations.UUUUUP: ZorkGrandInquisitorLocationData( game_state_trigger=((3619, 3500),), - archipelago_id=LOCATION_OFFSET + 120, + archipelago_id=LOCATION_OFFSET + 114, region=ZorkGrandInquisitorRegions.WHITE_HOUSE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -1069,13 +1035,13 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.VOYAGE_OF_CAPTAIN_ZAHAB: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "uh1h"),), - archipelago_id=LOCATION_OFFSET + 121, + archipelago_id=LOCATION_OFFSET + 115, region=ZorkGrandInquisitorRegions.HADES_SHORE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO: ZorkGrandInquisitorLocationData( game_state_trigger=((4034, 1),), - archipelago_id=LOCATION_OFFSET + 122, + archipelago_id=LOCATION_OFFSET + 116, region=ZorkGrandInquisitorRegions.DM_LAIR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -1087,7 +1053,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE: ZorkGrandInquisitorLocationData( game_state_trigger=((2461, 1),), - archipelago_id=LOCATION_OFFSET + 123, + archipelago_id=LOCATION_OFFSET + 117, region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -1097,7 +1063,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER: ZorkGrandInquisitorLocationData( game_state_trigger=((15472, 1),), - archipelago_id=LOCATION_OFFSET + 124, + archipelago_id=LOCATION_OFFSET + 118, region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -1111,7 +1077,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.WHAT_ARE_YOU_STUPID: ZorkGrandInquisitorLocationData( game_state_trigger=((10484, 1),), - archipelago_id=LOCATION_OFFSET + 125, + archipelago_id=LOCATION_OFFSET + 119, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=( @@ -1121,7 +1087,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL: ZorkGrandInquisitorLocationData( game_state_trigger=((4983, 1),), - archipelago_id=LOCATION_OFFSET + 126, + archipelago_id=LOCATION_OFFSET + 120, region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -1131,20 +1097,20 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "dc10"), (1596, 1)), - archipelago_id=LOCATION_OFFSET + 127, + archipelago_id=LOCATION_OFFSET + 121, region=ZorkGrandInquisitorRegions.WALKING_CASTLE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "dm2g"),), - archipelago_id=LOCATION_OFFSET + 128, + archipelago_id=LOCATION_OFFSET + 122, region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=(ZorkGrandInquisitorItems.HOTSPOT_MIRROR,), ), ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "dg4e"), (4266, 1), (9, 21), (4035, 1)), - archipelago_id=LOCATION_OFFSET + 129, + archipelago_id=LOCATION_OFFSET + 123, region=ZorkGrandInquisitorRegions.DM_LAIR, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=( @@ -1154,14 +1120,14 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER: ZorkGrandInquisitorLocationData( game_state_trigger=((16405, 1),), - archipelago_id=LOCATION_OFFSET + 130, + archipelago_id=LOCATION_OFFSET + 124, region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=(ZorkGrandInquisitorItems.SPELL_REZROV,), ), ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS: ZorkGrandInquisitorLocationData( game_state_trigger=((16342, 1),), - archipelago_id=LOCATION_OFFSET + 131, + archipelago_id=LOCATION_OFFSET + 125, region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, tags=(ZorkGrandInquisitorTags.CORE,), requirements=( @@ -1169,15 +1135,29 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE, ), ), + ZorkGrandInquisitorLocations.YOU_LOSE_MUFFET_ANTE_UP: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "qs1e"), (14511, 1), (14524, 5)), + archipelago_id=LOCATION_OFFSET + 126, + region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN, + tags=(ZorkGrandInquisitorTags.CORE,), + requirements=( + ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1, + ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2, + ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3, + ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4, + ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY, + ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS, + ), + ), ZorkGrandInquisitorLocations.YOU_ONE_OF_THEM_AGITATORS_AINT_YA: ZorkGrandInquisitorLocationData( game_state_trigger=((10586, 1),), - archipelago_id=LOCATION_OFFSET + 132, + archipelago_id=LOCATION_OFFSET + 127, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE,), ), ZorkGrandInquisitorLocations.YOU_WANT_A_PIECE_OF_ME_DOCK_BOY: ZorkGrandInquisitorLocationData( game_state_trigger=((15151, 1),), - archipelago_id=LOCATION_OFFSET + 133, + archipelago_id=LOCATION_OFFSET + 128, region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE), requirements=(ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH,), @@ -1189,8 +1169,8 @@ class ZorkGrandInquisitorLocationData(NamedTuple): region=ZorkGrandInquisitorRegions.PORT_FOOZLE, tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL, + ZorkGrandInquisitorItems.CIGAR, ), ), ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES: ZorkGrandInquisitorLocationData( @@ -1208,21 +1188,24 @@ class ZorkGrandInquisitorLocationData(NamedTuple): archipelago_id=LOCATION_OFFSET + 200 + 2, region=ZorkGrandInquisitorRegions.CROSSROADS, tags=(ZorkGrandInquisitorTags.DEATHSANITY,), + requirements=(ZorkGrandInquisitorItems.WELL_ROPE,), ), ZorkGrandInquisitorLocations.DEATH_EATEN_BY_A_GRUE: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "gjde"), (2201, 18)), archipelago_id=LOCATION_OFFSET + 200 + 3, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), + region=ZorkGrandInquisitorRegions.WHITE_HOUSE, + tags=(ZorkGrandInquisitorTags.DEATHSANITY,), requirements=( - ZorkGrandInquisitorItems.ROPE, - ZorkGrandInquisitorItems.HOTSPOT_WELL, + ( + ZorkGrandInquisitorItems.TOTEM_GRIFF, + ZorkGrandInquisitorItems.TOTEM_LUCY, + ), ), ), ZorkGrandInquisitorLocations.DEATH_JUMPED_IN_BOTTOMLESS_PIT: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "gjde"), (2201, 3)), archipelago_id=LOCATION_OFFSET + 200 + 4, - region=ZorkGrandInquisitorRegions.GUE_TECH, + region=ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE, tags=(ZorkGrandInquisitorTags.DEATHSANITY,), ), ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER: ZorkGrandInquisitorLocationData( @@ -1242,7 +1225,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ZorkGrandInquisitorLocations.DEATH_LOST_SOUL_TO_OLD_SCRATCH: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "gjde"), (2201, 23)), archipelago_id=LOCATION_OFFSET + 200 + 6, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, + region=ZorkGrandInquisitorRegions.ANYWHERE, tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), requirements=(ZorkGrandInquisitorItems.OLD_SCRATCH_CARD,), ), @@ -1288,44 +1271,253 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "gjde"), (2201, 34)), archipelago_id=LOCATION_OFFSET + 200 + 11, - region=ZorkGrandInquisitorRegions.GUE_TECH, + region=ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE, tags=(ZorkGrandInquisitorTags.DEATHSANITY,), requirements=( ZorkGrandInquisitorItems.SPELL_THROCK, ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_GRASS, ), ), - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, (9, 32, 33))), + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_INFINITY: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "gjde"), (2201, 9)), archipelago_id=LOCATION_OFFSET + 200 + 12, region=ZorkGrandInquisitorRegions.MONASTERY, tags=(ZorkGrandInquisitorTags.DEATHSANITY,), requirements=( + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY, ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, ), ), - ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY: ZorkGrandInquisitorLocationData( - game_state_trigger=(("location", "gjde"), (2201, (5, 6, 7, 8, 13))), + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_NEWARK_NEW_JERSEY: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "gjde"), (2201, 33)), archipelago_id=LOCATION_OFFSET + 200 + 13, region=ZorkGrandInquisitorRegions.MONASTERY, tags=(ZorkGrandInquisitorTags.DEATHSANITY,), - requirements=(ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH,), + requirements=( + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_NEWARK_NEW_JERSEY, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ), + ), + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY_HALLS_OF_INQUISITION: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "gjde"), (2201, 8)), + archipelago_id=LOCATION_OFFSET + 200 + 14, + region=ZorkGrandInquisitorRegions.MONASTERY, + tags=(ZorkGrandInquisitorTags.DEATHSANITY,), + requirements=( + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ), + ), + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY_INFINITY: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "gjde"), (2201, 7)), + archipelago_id=LOCATION_OFFSET + 200 + 15, + region=ZorkGrandInquisitorRegions.MONASTERY, + tags=(ZorkGrandInquisitorTags.DEATHSANITY,), + requirements=( + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ), + ), + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY_NEWARK_NEW_JERSEY: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "gjde"), (2201, 6)), + archipelago_id=LOCATION_OFFSET + 200 + 16, + region=ZorkGrandInquisitorRegions.MONASTERY, + tags=(ZorkGrandInquisitorTags.DEATHSANITY,), + requirements=( + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_NEWARK_NEW_JERSEY, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ), + ), + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY_STRAIGHT_TO_HELL: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "gjde"), (2201, 5)), + archipelago_id=LOCATION_OFFSET + 200 + 17, + region=ZorkGrandInquisitorRegions.MONASTERY, + tags=(ZorkGrandInquisitorTags.DEATHSANITY,), + requirements=( + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ), + ), + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY_SURFACE_OF_MERZ: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "gjde"), (2201, 13)), + archipelago_id=LOCATION_OFFSET + 200 + 18, + region=ZorkGrandInquisitorRegions.MONASTERY, + tags=(ZorkGrandInquisitorTags.DEATHSANITY,), + requirements=( + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ), + ), + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_SURFACE_OF_MERZ: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "gjde"), (2201, 32)), + archipelago_id=LOCATION_OFFSET + 200 + 19, + region=ZorkGrandInquisitorRegions.MONASTERY, + tags=(ZorkGrandInquisitorTags.DEATHSANITY,), + requirements=( + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ), ), ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "gjde"), (2201, 10)), - archipelago_id=LOCATION_OFFSET + 200 + 14, + archipelago_id=LOCATION_OFFSET + 200 + 20, region=ZorkGrandInquisitorRegions.HADES, tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), - requirements=(ZorkGrandInquisitorEvents.KNOWS_SNAVIG,), + requirements=(ZorkGrandInquisitorItems.SPELL_SNAVIG,), ), ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED: ZorkGrandInquisitorLocationData( game_state_trigger=(("location", "gjde"), (2201, 19)), - archipelago_id=LOCATION_OFFSET + 200 + 15, + archipelago_id=LOCATION_OFFSET + 200 + 21, region=ZorkGrandInquisitorRegions.GUE_TECH, tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE), requirements=(ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED,), ), + # Landmarksanity + ZorkGrandInquisitorLocations.LANDMARK_DRAGON_ARCHIPELAGO: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "cd60"),), + archipelago_id=LOCATION_OFFSET + 300 + 0, + region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + requirements=( + ( + ZorkGrandInquisitorItems.TOTEM_BROG, + ZorkGrandInquisitorItems.TOTEM_GRIFF, + ZorkGrandInquisitorItems.TOTEM_LUCY, + ), + ), + ), + ZorkGrandInquisitorLocations.LANDMARK_DUNGEON_MASTERS_HOUSE: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "dg40"),), + archipelago_id=LOCATION_OFFSET + 300 + 1, + region=ZorkGrandInquisitorRegions.DM_LAIR, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_FLOOD_CONTROL_DAM_3: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "ue1e"),), + archipelago_id=LOCATION_OFFSET + 300 + 2, + region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_GATES_OF_HELL: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "hp50"),), + archipelago_id=LOCATION_OFFSET + 300 + 3, + region=ZorkGrandInquisitorRegions.HADES, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_GREAT_UNDERGROUND_EMPIRE_ENTRANCE: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "uw10"),), + archipelago_id=LOCATION_OFFSET + 300 + 4, + region=ZorkGrandInquisitorRegions.CROSSROADS, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_GUE_TECH_FOUNTAIN_INSIDE: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "tr10"),), + archipelago_id=LOCATION_OFFSET + 300 + 5, + region=ZorkGrandInquisitorRegions.GUE_TECH, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_GUE_TECH_FOUNTAIN_OUTSIDE: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "te50"),), + archipelago_id=LOCATION_OFFSET + 300 + 6, + region=ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_HADES_SHORE: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "hp10"),), + archipelago_id=LOCATION_OFFSET + 300 + 7, + region=ZorkGrandInquisitorRegions.HADES_SHORE, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_INFINITE_CORRIDOR: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "th10"),), + archipelago_id=LOCATION_OFFSET + 300 + 8, + region=ZorkGrandInquisitorRegions.GUE_TECH, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_INQUISITION_HEADQUARTERS: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "px10"),), + archipelago_id=LOCATION_OFFSET + 300 + 9, + region=ZorkGrandInquisitorRegions.PORT_FOOZLE, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_JACKS_SHOP: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "pp10"),), + archipelago_id=LOCATION_OFFSET + 300 + 10, + region=ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_MIRROR_ROOM: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "dm10"),), + archipelago_id=LOCATION_OFFSET + 300 + 11, + region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + requirements=(ZorkGrandInquisitorItems.HOTSPOT_MIRROR,), + ), + ZorkGrandInquisitorLocations.LANDMARK_PAST_PORT_FOOZLE: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "qe10"),), + archipelago_id=LOCATION_OFFSET + 300 + 12, + region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + requirements=( + ( + ZorkGrandInquisitorItems.TOTEM_BROG, + ZorkGrandInquisitorItems.TOTEM_GRIFF, + ZorkGrandInquisitorItems.TOTEM_LUCY, + ), + ), + ), + ZorkGrandInquisitorLocations.LANDMARK_PORT_FOOZLE: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "pe10"),), + archipelago_id=LOCATION_OFFSET + 300 + 13, + region=ZorkGrandInquisitorRegions.PORT_FOOZLE, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_SPELL_CHECKER: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "tp40"),), + archipelago_id=LOCATION_OFFSET + 300 + 14, + region=ZorkGrandInquisitorRegions.SPELL_LAB, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_TOTEMIZER: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "mt10"),), + archipelago_id=LOCATION_OFFSET + 300 + 15, + region=ZorkGrandInquisitorRegions.MONASTERY, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_UMBRELLA_TREE: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "uc1e"),), + archipelago_id=LOCATION_OFFSET + 300 + 16, + region=ZorkGrandInquisitorRegions.CROSSROADS, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_UNDERGROUND_UNDERGROUND_ENTRANCE: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "uc60"),), + archipelago_id=LOCATION_OFFSET + 300 + 17, + region=ZorkGrandInquisitorRegions.CROSSROADS, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_WALKING_CASTLES_HEART: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "dc1h"), (1596, 1)), + archipelago_id=LOCATION_OFFSET + 300 + 18, + region=ZorkGrandInquisitorRegions.WALKING_CASTLE, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + ), + ZorkGrandInquisitorLocations.LANDMARK_WHITE_HOUSE: ZorkGrandInquisitorLocationData( + game_state_trigger=(("location", "sw40"),), + archipelago_id=LOCATION_OFFSET + 300 + 19, + region=ZorkGrandInquisitorRegions.WHITE_HOUSE, + tags=(ZorkGrandInquisitorTags.LANDMARKSANITY,), + requirements=( + ( + ZorkGrandInquisitorItems.TOTEM_BROG, + ZorkGrandInquisitorItems.TOTEM_GRIFF, + ZorkGrandInquisitorItems.TOTEM_LUCY, + ), + ), + ), # Events ZorkGrandInquisitorEvents.CHARON_CALLED: ZorkGrandInquisitorLocationData( game_state_trigger=None, @@ -1337,16 +1529,6 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), event_item_name=ZorkGrandInquisitorEvents.CHARON_CALLED.value, ), - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - requirements=( - ZorkGrandInquisitorItems.LANTERN, - ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR, - ), - event_item_name=ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE.value, - ), ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE: ZorkGrandInquisitorLocationData( game_state_trigger=None, archipelago_id=None, @@ -1386,8 +1568,8 @@ class ZorkGrandInquisitorLocationData(NamedTuple): archipelago_id=None, region=ZorkGrandInquisitorRegions.DM_LAIR, requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY, + ZorkGrandInquisitorItems.CIGAR, ), event_item_name=ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR.value, ), @@ -1424,65 +1606,14 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), event_item_name=ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value, ), - ZorkGrandInquisitorEvents.KNOWS_BEBURTT: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.SPELL_LAB, - requirements=( - ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, - ), - event_item_name=ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value, - ), - ZorkGrandInquisitorEvents.KNOWS_OBIDIL: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.SPELL_LAB, - requirements=( - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, - ), - event_item_name=ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value, - ), - ZorkGrandInquisitorEvents.KNOWS_SNAVIG: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.SPELL_LAB, - requirements=( - ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG, - ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, - ), - event_item_name=ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value, - ), - ZorkGrandInquisitorEvents.KNOWS_YASTARD: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - requirements=( - ZorkGrandInquisitorItems.FLATHEADIA_FUDGE, - ZorkGrandInquisitorItems.HUNGUS_LARD, - ZorkGrandInquisitorItems.JAR_OF_HOTBUGS, - ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB, - ZorkGrandInquisitorItems.MOSS_OF_MAREILON, - ZorkGrandInquisitorItems.MUG, - ), - event_item_name=ZorkGrandInquisitorEvents.KNOWS_YASTARD.value, - ), - ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, - requirements=( - ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE, - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL, - ), - event_item_name=ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE.value, - ), ZorkGrandInquisitorEvents.ROPE_GLORFABLE: ZorkGrandInquisitorLocationData( game_state_trigger=None, archipelago_id=None, region=ZorkGrandInquisitorRegions.CROSSROADS, - requirements=(ZorkGrandInquisitorItems.SPELL_GLORF,), + requirements=( + ZorkGrandInquisitorItems.WELL_ROPE, + ZorkGrandInquisitorItems.SPELL_GLORF, + ), event_item_name=ZorkGrandInquisitorEvents.ROPE_GLORFABLE.value, ), ZorkGrandInquisitorEvents.VICTORY: ZorkGrandInquisitorLocationData( @@ -1505,7 +1636,7 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ZorkGrandInquisitorEvents.ZORKMID_BILL_ACCESSIBLE: ZorkGrandInquisitorLocationData( game_state_trigger=None, archipelago_id=None, - region=ZorkGrandInquisitorRegions.PORT_FOOZLE, + region=ZorkGrandInquisitorRegions.ANYWHERE, requirements=(ZorkGrandInquisitorItems.OLD_SCRATCH_CARD,), event_item_name=ZorkGrandInquisitorEvents.ZORKMID_BILL_ACCESSIBLE.value, ), @@ -1521,15 +1652,4 @@ class ZorkGrandInquisitorLocationData(NamedTuple): ), event_item_name=ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value, ), - ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE: ZorkGrandInquisitorLocationData( - game_state_trigger=None, - archipelago_id=None, - region=ZorkGrandInquisitorRegions.GUE_TECH, - requirements=( - ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT, - ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS, - ), - event_item_name=ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value, - ), } diff --git a/worlds/zork_grand_inquisitor/data/mapping_data.py b/worlds/zork_grand_inquisitor/data/mapping_data.py index 56ef627779aa..0c920e2864ac 100644 --- a/worlds/zork_grand_inquisitor/data/mapping_data.py +++ b/worlds/zork_grand_inquisitor/data/mapping_data.py @@ -1,44 +1,412 @@ -from typing import Dict +from typing import Dict, Optional, Tuple from ..enums import ( + ZorkGrandInquisitorGoals, ZorkGrandInquisitorItems, ZorkGrandInquisitorRegions, ZorkGrandInquisitorStartingLocations, ) +# Avoid spells in early items to prevent clash with craftable spells +early_items_for_starting_location: Dict[ + ZorkGrandInquisitorStartingLocations, Optional[Tuple[Tuple[ZorkGrandInquisitorItems, ...], ...]] +] = { + ZorkGrandInquisitorStartingLocations.PORT_FOOZLE: ( + ( + ZorkGrandInquisitorItems.WELL_ROPE, + ), + ), + ZorkGrandInquisitorStartingLocations.CROSSROADS: None, + ZorkGrandInquisitorStartingLocations.DM_LAIR: None, + ZorkGrandInquisitorStartingLocations.DM_LAIR_INTERIOR: ( + ( + ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_HOUSE_EXIT, + ), + ), + ZorkGrandInquisitorStartingLocations.GUE_TECH: None, + ZorkGrandInquisitorStartingLocations.SPELL_LAB: None, + ZorkGrandInquisitorStartingLocations.HADES_SHORE: None, + ZorkGrandInquisitorStartingLocations.SUBWAY_FLOOD_CONTROL_DAM: None, + ZorkGrandInquisitorStartingLocations.MONASTERY: None, + ZorkGrandInquisitorStartingLocations.MONASTERY_EXHIBIT: None, +} + +endgame_connecting_regions_for_goal: Dict[ + ZorkGrandInquisitorGoals, + ZorkGrandInquisitorRegions, +] = { + ZorkGrandInquisitorGoals.THREE_ARTIFACTS: ZorkGrandInquisitorRegions.MENU, + ZorkGrandInquisitorGoals.ARTIFACT_OF_MAGIC_HUNT: ZorkGrandInquisitorRegions.WALKING_CASTLE, + ZorkGrandInquisitorGoals.SPELL_HEIST: ZorkGrandInquisitorRegions.PORT_FOOZLE, + ZorkGrandInquisitorGoals.ZORK_TOUR: ZorkGrandInquisitorRegions.PORT_FOOZLE, + ZorkGrandInquisitorGoals.NECROMANCER_OF_THE_GREAT_UNDERGROUND_EMPIRE: ( + ZorkGrandInquisitorRegions.HADES_BEYOND_GATES, + ), +} -starting_location_to_logic_helper_item: Dict[ - ZorkGrandInquisitorStartingLocations, ZorkGrandInquisitorItems +starter_kits_for_starting_location: Dict[ + ZorkGrandInquisitorStartingLocations, Optional[Tuple[Tuple[ZorkGrandInquisitorItems, ...], ...]] ] = { ZorkGrandInquisitorStartingLocations.PORT_FOOZLE: ( - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_PORT_FOOZLE + ( + ZorkGrandInquisitorItems.HOTSPOT_BUCKET, + ), ), ZorkGrandInquisitorStartingLocations.CROSSROADS: ( - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_CROSSROADS + ( + ZorkGrandInquisitorItems.WELL_ROPE, + ZorkGrandInquisitorItems.HOTSPOT_BUCKET, + ), + ( + ZorkGrandInquisitorItems.SPELL_BEBURTT, + ZorkGrandInquisitorItems.SUBWAY_TOKEN, + ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT, + ZorkGrandInquisitorItems.OLD_SCRATCH_CARD, + ), + ( + ZorkGrandInquisitorItems.SPELL_REZROV, + ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR, + ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_WINDOWS, + ), + ( + ZorkGrandInquisitorItems.HAMMER, + ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE, + ZorkGrandInquisitorItems.SWORD, + ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE, + ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM, + ZorkGrandInquisitorItems.SPELL_THROCK, + ), + ( + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES, + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS, + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER, + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_CROSSROADS, + ), ), ZorkGrandInquisitorStartingLocations.DM_LAIR: ( - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_DM_LAIR + ( + ZorkGrandInquisitorItems.SWORD, + ZorkGrandInquisitorItems.HOTSPOT_HARRY, + ZorkGrandInquisitorItems.HUNGUS_LARD, + ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE, + ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE, + ), + ( + ZorkGrandInquisitorItems.HAMMER, + ZorkGrandInquisitorItems.SPELL_THROCK, + ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON, + ZorkGrandInquisitorItems.SNAPDRAGON, + ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM, + ), + ( + ZorkGrandInquisitorItems.SWORD, + ZorkGrandInquisitorItems.HOTSPOT_HARRY, + ZorkGrandInquisitorItems.CIGAR, + ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY, + ZorkGrandInquisitorItems.OLD_SCRATCH_CARD, + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES, + ), + ( + ZorkGrandInquisitorItems.SWORD, + ZorkGrandInquisitorItems.HOTSPOT_HARRY, + ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE, + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH, + ZorkGrandInquisitorItems.SHOVEL, + ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND, + ), + ( + ZorkGrandInquisitorItems.SWORD, + ZorkGrandInquisitorItems.HOTSPOT_HARRY, + ZorkGrandInquisitorItems.CIGAR, + ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY, + ZorkGrandInquisitorItems.MEAD_LIGHT, + ZorkGrandInquisitorItems.ZIMDOR_SCROLL, + ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH, + ), ), ZorkGrandInquisitorStartingLocations.DM_LAIR_INTERIOR: ( - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_DM_LAIR_INTERIOR + ( + ZorkGrandInquisitorItems.HOTSPOT_BLINDS, + ZorkGrandInquisitorItems.SPELL_GOLGATEM, + ZorkGrandInquisitorItems.SPELL_OBIDIL, + ZorkGrandInquisitorItems.OLD_SCRATCH_CARD, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_MIRROR, + ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS, + ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV, + ZorkGrandInquisitorItems.COCOA_INGREDIENTS, + ZorkGrandInquisitorItems.HUNGUS_LARD, + ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR, + ZorkGrandInquisitorItems.SPELL_NARWILE, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR, + ZorkGrandInquisitorItems.SPELL_NARWILE, + ZorkGrandInquisitorItems.SPELL_YASTARD, + ZorkGrandInquisitorItems.TOTEM_GRIFF, + ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG, + ZorkGrandInquisitorItems.HOTSPOT_MIRROR, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR, + ZorkGrandInquisitorItems.SPELL_NARWILE, + ZorkGrandInquisitorItems.SPELL_YASTARD, + ZorkGrandInquisitorItems.TOTEM_LUCY, + ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG, + ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR, + ZorkGrandInquisitorItems.SPELL_NARWILE, + ZorkGrandInquisitorItems.SPELL_YASTARD, + ZorkGrandInquisitorItems.TOTEM_BROG, + ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH, + ZorkGrandInquisitorItems.BROGS_GRUE_EGG, + ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT, + ), ), ZorkGrandInquisitorStartingLocations.GUE_TECH: ( - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_GUE_TECH + ( + ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR, + ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND, + ZorkGrandInquisitorItems.SHOVEL, + ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_WINDOWS, + ), + ( + ZorkGrandInquisitorItems.OLD_SCRATCH_CARD, + ZorkGrandInquisitorItems.HOTSPOT_CHANGE_MACHINE_SLOT, + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS, + ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT, + ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT, + ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS, + ), + ( + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS, + ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT, + ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_VACUUM_SLOT, + ZorkGrandInquisitorItems.PERMA_SUCK_MACHINE, + ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS, + ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT, + ZorkGrandInquisitorItems.ZORK_ROCKS, + ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT, + ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS, + ), + ( + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS, + ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT, + ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS, + ZorkGrandInquisitorItems.SPELL_IGRAM, + ), + ( + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS, + ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT, + ZorkGrandInquisitorItems.ZORK_ROCKS, + ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS, + ZorkGrandInquisitorItems.SPELL_IGRAM, + ZorkGrandInquisitorItems.HOTSPOT_DENTED_LOCKER, + ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE, + ZorkGrandInquisitorItems.STUDENT_ID, + ), ), ZorkGrandInquisitorStartingLocations.SPELL_LAB: ( - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_SPELL_LAB + ( + ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, + ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX, + ZorkGrandInquisitorItems.SANDWITCH_WRAPPER, + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY, + ZorkGrandInquisitorItems.MONASTERY_ROPE, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, + ZorkGrandInquisitorItems.SANDWITCH_WRAPPER, + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES, + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER, + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS, + ZorkGrandInquisitorItems.SWORD, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, + ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX, + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY, + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM, + ZorkGrandInquisitorItems.SPELL_GOLGATEM, + ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT, + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.OLD_SCRATCH_CARD, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER, + ZorkGrandInquisitorItems.SANDWITCH_WRAPPER, + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.SPELL_IGRAM, + ZorkGrandInquisitorItems.SPELL_REZROV, + ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_BRIDGE_EXIT, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_BRIDGE_EXIT, + ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS, + ZorkGrandInquisitorItems.SPELL_IGRAM, + ), ), ZorkGrandInquisitorStartingLocations.HADES_SHORE: ( - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_HADES_SHORE + ( + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER, + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS, + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.SWORD, + ZorkGrandInquisitorItems.SPELL_SNAVIG, + ZorkGrandInquisitorItems.TOTEM_BROG, + ZorkGrandInquisitorItems.SPELL_NARWILE, + ZorkGrandInquisitorItems.SPELL_YASTARD, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER, + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS, + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.SWORD, + ZorkGrandInquisitorItems.SPELL_OBIDIL, + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM, + ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT, + ZorkGrandInquisitorItems.SPELL_GOLGATEM, + ), + ( + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_CROSSROADS, + ZorkGrandInquisitorItems.OLD_SCRATCH_CARD, + ZorkGrandInquisitorItems.SPELL_KENDALL, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER, + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS, + ZorkGrandInquisitorItems.SWORD, + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY, + ZorkGrandInquisitorItems.MONASTERY_ROPE, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL, + ), + ( + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, + ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE, + ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON, + ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM, + ZorkGrandInquisitorItems.HAMMER, + ), ), ZorkGrandInquisitorStartingLocations.SUBWAY_FLOOD_CONTROL_DAM: ( - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_SUBWAY_FLOOD_CONTROL_DAM + ( + ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS, + ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS, + ZorkGrandInquisitorItems.SPELL_REZROV, + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY, + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB, + ), + ( + ZorkGrandInquisitorItems.SPELL_GOLGATEM, + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_CROSSROADS, + ZorkGrandInquisitorItems.OLD_SCRATCH_CARD, + ), + ( + ZorkGrandInquisitorItems.SPELL_THROCK, + ZorkGrandInquisitorItems.HOTSPOT_MOSSY_GRATE, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY, + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, + ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON, + ), + ( + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT, + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY, + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH, + ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_WINDOWS, + ), + ( + ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS, + ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT, + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES, + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER, + ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS, + ZorkGrandInquisitorItems.SWORD, + ), ), ZorkGrandInquisitorStartingLocations.MONASTERY: ( - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_MONASTERY + ( + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION, + ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT, + ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER, + ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER, + ZorkGrandInquisitorItems.SPELL_NARWILE, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL, + ZorkGrandInquisitorItems.OLD_SCRATCH_CARD, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_CROSSROADS, + ZorkGrandInquisitorItems.SUBWAY_TOKEN, + ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT, + ), + ( + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB, + ZorkGrandInquisitorItems.SPELL_REZROV, + ), + ( + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, + ZorkGrandInquisitorItems.HOTSPOT_HARRY, + ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE, + ZorkGrandInquisitorItems.SWORD, + ), ), ZorkGrandInquisitorStartingLocations.MONASTERY_EXHIBIT: ( - ZorkGrandInquisitorItems.LOGIC_HELPER_STARTING_LOCATION_MONASTERY_EXHIBIT + ( + ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT, + ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER, + ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER, + ZorkGrandInquisitorItems.SPELL_NARWILE, + ZorkGrandInquisitorItems.SPELL_YASTARD, + ZorkGrandInquisitorItems.TOTEM_GRIFF, + ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR, + ), + ( + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES, + ), + ( + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM, + ), + ( + ZorkGrandInquisitorItems.MAP, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS, + ), + ( + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS, + ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH, + ), ), } diff --git a/worlds/zork_grand_inquisitor/data/missable_location_grant_conditions_data.py b/worlds/zork_grand_inquisitor/data/missable_location_data.py similarity index 56% rename from worlds/zork_grand_inquisitor/data/missable_location_grant_conditions_data.py rename to worlds/zork_grand_inquisitor/data/missable_location_data.py index ef6eacb78ceb..67271e7c28d8 100644 --- a/worlds/zork_grand_inquisitor/data/missable_location_grant_conditions_data.py +++ b/worlds/zork_grand_inquisitor/data/missable_location_data.py @@ -4,7 +4,8 @@ class ZorkGrandInquisitorMissableLocationGrantConditionsData(NamedTuple): - location_condition: ZorkGrandInquisitorLocations + game_location_condition: Optional[str] + location_condition: Tuple[ZorkGrandInquisitorLocations, ...] item_conditions: Optional[Tuple[ZorkGrandInquisitorItems, ...]] @@ -13,187 +14,226 @@ class ZorkGrandInquisitorMissableLocationGrantConditionsData(NamedTuple): ] = { ZorkGrandInquisitorLocations.BOING_BOING_BOING: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON, + game_location_condition="dg3e", + location_condition=(ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON,), item_conditions=None, ) , ZorkGrandInquisitorLocations.BONK: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.PROZORKED, + game_location_condition="dg2f", + location_condition=(ZorkGrandInquisitorLocations.PROZORKED,), item_conditions=(ZorkGrandInquisitorItems.HAMMER,), ) , ZorkGrandInquisitorLocations.DEATH_ARRESTED_WITH_JACK: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.ARREST_THE_VANDAL, + game_location_condition="pe6e", + location_condition=(ZorkGrandInquisitorLocations.ARREST_THE_VANDAL,), item_conditions=None, ) , ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES, - item_conditions=None, - ) - , - ZorkGrandInquisitorLocations.DEATH_EATEN_BY_A_GRUE: - ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.MAGIC_FOREVER, + game_location_condition="dg4f", + location_condition=(ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES,), item_conditions=None, ) , ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER, + game_location_condition="qs1e", + location_condition=(ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER,), item_conditions=None, ) , ZorkGrandInquisitorLocations.DEATH_LOST_SOUL_TO_OLD_SCRATCH: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.OLD_SCRATCH_WINNER, + game_location_condition=None, + location_condition=(ZorkGrandInquisitorLocations.OLD_SCRATCH_WINNER,), item_conditions=None, ) , ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES, + game_location_condition="dg4f", + location_condition=(ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES,), item_conditions=None, ) , ZorkGrandInquisitorLocations.DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS, + game_location_condition="tp1e", + location_condition=(ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS,), item_conditions=None, ) , ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.A_SMALLWAY, + game_location_condition="th10", + location_condition=(ZorkGrandInquisitorLocations.A_SMALLWAY,), item_conditions=None, ) , ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.THAR_SHE_BLOWS, + game_location_condition="cd20", + location_condition=(ZorkGrandInquisitorLocations.THAR_SHE_BLOWS,), item_conditions=None, ) , ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL, + game_location_condition="hp60", + location_condition=(ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL,), item_conditions=None, ) , ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.CRISIS_AVERTED, + game_location_condition="th3j", + location_condition=(ZorkGrandInquisitorLocations.CRISIS_AVERTED,), item_conditions=None, ) , ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE, + game_location_condition="dc10", + location_condition=(ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE,), item_conditions=(ZorkGrandInquisitorItems.SPELL_GOLGATEM,), ) , ZorkGrandInquisitorLocations.EMERGENCY_MAGICATRONIC_MESSAGE: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.ARTIFACTS_EXPLAINED, + game_location_condition="th10", + location_condition=(ZorkGrandInquisitorLocations.ARTIFACTS_EXPLAINED,), item_conditions=None, ) , ZorkGrandInquisitorLocations.FAT_LOT_OF_GOOD_THATLL_DO_YA: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS, + game_location_condition="tp1e", + location_condition=(ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS,), item_conditions=(ZorkGrandInquisitorItems.SPELL_IGRAM,), ) , ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.PROZORKED, + game_location_condition="dg2f", + location_condition=(ZorkGrandInquisitorLocations.PROZORKED,), item_conditions=(ZorkGrandInquisitorItems.SPELL_THROCK,), ) , ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS, + game_location_condition="tp1e", + location_condition=(ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS,), item_conditions=(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,), ) , ZorkGrandInquisitorLocations.MEAD_LIGHT: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE, + game_location_condition="pe1e", + location_condition=( + ZorkGrandInquisitorLocations.FIRE_FIRE, + ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO, + ), item_conditions=(ZorkGrandInquisitorItems.MEAD_LIGHT,), ) , ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED, + game_location_condition="dg3e", + location_condition=(ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED,), item_conditions=None, ) , ZorkGrandInquisitorLocations.NO_AUTOGRAPHS: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE, + game_location_condition="pe1e", + location_condition=(ZorkGrandInquisitorLocations.FIRE_FIRE,), item_conditions=None, ) , ZorkGrandInquisitorLocations.NO_BONDAGE: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE, - item_conditions=(ZorkGrandInquisitorItems.ROPE,), + game_location_condition="pe20", + location_condition=(ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE,), + item_conditions=( + ZorkGrandInquisitorItems.WELL_ROPE, + ZorkGrandInquisitorItems.SPELL_GLORF, + ), ) , ZorkGrandInquisitorLocations.TALK_TO_ME_GRAND_INQUISITOR: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE, + game_location_condition="pe5e", + location_condition=(ZorkGrandInquisitorLocations.FIRE_FIRE,), item_conditions=None, ) , ZorkGrandInquisitorLocations.THATS_A_ROPE: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE, - item_conditions=(ZorkGrandInquisitorItems.ROPE,), + game_location_condition="pe1e", + location_condition=(ZorkGrandInquisitorLocations.FIRE_FIRE,), + item_conditions=( + ZorkGrandInquisitorItems.WELL_ROPE, + ZorkGrandInquisitorItems.SPELL_GLORF, + ), ) , ZorkGrandInquisitorLocations.THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP, + game_location_condition="us2e", + location_condition=(ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP,), item_conditions=None, ) , ZorkGrandInquisitorLocations.THATS_STILL_A_ROPE: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS, - item_conditions=(ZorkGrandInquisitorItems.SPELL_GLORF,), + game_location_condition="tp1e", + location_condition=(ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS,), + item_conditions=( + ZorkGrandInquisitorItems.WELL_ROPE, + ZorkGrandInquisitorItems.SPELL_GLORF, + ), ) , ZorkGrandInquisitorLocations.WHAT_ARE_YOU_STUPID: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE, + game_location_condition="pe1e", + location_condition=( + ZorkGrandInquisitorLocations.FIRE_FIRE, + ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE, + ), item_conditions=(ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER,), ) , ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG, + game_location_condition="dw10", + location_condition=(ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG,), item_conditions=None, ) , ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO, + game_location_condition="dv10", + location_condition=(ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO,), item_conditions=(ZorkGrandInquisitorItems.SWORD, ZorkGrandInquisitorItems.HOTSPOT_HARRY), ) , ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS, + game_location_condition="tp1e", + location_condition=(ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS,), item_conditions=(ZorkGrandInquisitorItems.SPELL_REZROV,), ) , ZorkGrandInquisitorLocations.YOU_WANT_A_PIECE_OF_ME_DOCK_BOY: ZorkGrandInquisitorMissableLocationGrantConditionsData( - location_condition=ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE, + game_location_condition="pe20", + location_condition=(ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE,), item_conditions=None, ) , diff --git a/worlds/zork_grand_inquisitor/data/region_data.py b/worlds/zork_grand_inquisitor/data/region_data.py index 308d37f4536d..14f2c992f73e 100644 --- a/worlds/zork_grand_inquisitor/data/region_data.py +++ b/worlds/zork_grand_inquisitor/data/region_data.py @@ -8,10 +8,11 @@ class ZorkGrandInquisitorRegionData(NamedTuple): region_data: Dict[ZorkGrandInquisitorRegions, ZorkGrandInquisitorRegionData] = { + ZorkGrandInquisitorRegions.ANYWHERE: ZorkGrandInquisitorRegionData(exits=None), ZorkGrandInquisitorRegions.CROSSROADS: ZorkGrandInquisitorRegionData( exits=( ZorkGrandInquisitorRegions.DM_LAIR, - ZorkGrandInquisitorRegions.GUE_TECH, + ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.PORT_FOOZLE, @@ -44,19 +45,22 @@ class ZorkGrandInquisitorRegionData(NamedTuple): ) ), ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, - ZorkGrandInquisitorRegions.ENDGAME, - ) + exits=(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO,) ), ZorkGrandInquisitorRegions.ENDGAME: ZorkGrandInquisitorRegionData(exits=None), ZorkGrandInquisitorRegions.GUE_TECH: ZorkGrandInquisitorRegionData( exits=( - ZorkGrandInquisitorRegions.CROSSROADS, + ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE, ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ) ), + ZorkGrandInquisitorRegions.GUE_TECH_ENTRANCE: ZorkGrandInquisitorRegionData( + exits=( + ZorkGrandInquisitorRegions.CROSSROADS, + ZorkGrandInquisitorRegions.GUE_TECH, + ) + ), ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY: ZorkGrandInquisitorRegionData( exits=( ZorkGrandInquisitorRegions.GUE_TECH, @@ -126,10 +130,7 @@ class ZorkGrandInquisitorRegionData(NamedTuple): ) ), ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN: ZorkGrandInquisitorRegionData( - exits=( - ZorkGrandInquisitorRegions.ENDGAME, - ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, - ) + exits=(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST,) ), ZorkGrandInquisitorRegions.SPELL_LAB: ZorkGrandInquisitorRegionData( exits=(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,) @@ -174,7 +175,10 @@ class ZorkGrandInquisitorRegionData(NamedTuple): ZorkGrandInquisitorRegions.WHITE_HOUSE: ZorkGrandInquisitorRegionData( exits=( ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, - ZorkGrandInquisitorRegions.ENDGAME, + ZorkGrandInquisitorRegions.WHITE_HOUSE_INTERIOR, ) ), + ZorkGrandInquisitorRegions.WHITE_HOUSE_INTERIOR: ZorkGrandInquisitorRegionData( + exits=(ZorkGrandInquisitorRegions.WHITE_HOUSE,) + ), } diff --git a/worlds/zork_grand_inquisitor/data/transform_data.py b/worlds/zork_grand_inquisitor/data/transform_data.py new file mode 100644 index 000000000000..f6b5228d4062 --- /dev/null +++ b/worlds/zork_grand_inquisitor/data/transform_data.py @@ -0,0 +1,180 @@ +from typing import Dict, Optional, Tuple, Union + +from ..enums import ( + ZorkGrandInquisitorDeathsanity, + ZorkGrandInquisitorGoals, + ZorkGrandInquisitorItemTransforms, + ZorkGrandInquisitorItems, + ZorkGrandInquisitorLandmarksanity, + ZorkGrandInquisitorLocations, + ZorkGrandInquisitorLocationTransforms, + ZorkGrandInquisitorStartingLocations, +) + + +item_data_transforms: Dict[ + Union[ + ZorkGrandInquisitorStartingLocations, + ZorkGrandInquisitorGoals, + ZorkGrandInquisitorDeathsanity, + ZorkGrandInquisitorLandmarksanity, + ], + Optional[Dict[ZorkGrandInquisitorItemTransforms, Tuple[ZorkGrandInquisitorItems, ...]]] +] = { + ZorkGrandInquisitorStartingLocations.PORT_FOOZLE: { + ZorkGrandInquisitorItemTransforms.MAKE_FILLER: ( + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS, + ) + }, + ZorkGrandInquisitorStartingLocations.CROSSROADS: { + ZorkGrandInquisitorItemTransforms.MAKE_FILLER: ( + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS, + ) + }, + ZorkGrandInquisitorStartingLocations.DM_LAIR: { + ZorkGrandInquisitorItemTransforms.MAKE_FILLER: ( + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, + ) + }, + ZorkGrandInquisitorStartingLocations.DM_LAIR_INTERIOR: { + ZorkGrandInquisitorItemTransforms.MAKE_FILLER: ( + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR, + ) + }, + ZorkGrandInquisitorStartingLocations.GUE_TECH: None, + ZorkGrandInquisitorStartingLocations.SPELL_LAB: { + ZorkGrandInquisitorItemTransforms.MAKE_FILLER: ( + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB, + ) + }, + ZorkGrandInquisitorStartingLocations.HADES_SHORE: { + ZorkGrandInquisitorItemTransforms.MAKE_FILLER: ( + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES, + ) + }, + ZorkGrandInquisitorStartingLocations.SUBWAY_FLOOD_CONTROL_DAM: { + ZorkGrandInquisitorItemTransforms.MAKE_FILLER: ( + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM, + ) + }, + ZorkGrandInquisitorStartingLocations.MONASTERY: { + ZorkGrandInquisitorItemTransforms.MAKE_FILLER: ( + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY, + ) + }, + ZorkGrandInquisitorStartingLocations.MONASTERY_EXHIBIT: { + ZorkGrandInquisitorItemTransforms.MAKE_FILLER: ( + ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY, + ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY, + ) + }, + ZorkGrandInquisitorGoals.THREE_ARTIFACTS: None, + ZorkGrandInquisitorGoals.ARTIFACT_OF_MAGIC_HUNT: None, + ZorkGrandInquisitorGoals.SPELL_HEIST: None, + ZorkGrandInquisitorGoals.ZORK_TOUR: None, + ZorkGrandInquisitorGoals.NECROMANCER_OF_THE_GREAT_UNDERGROUND_EMPIRE: None, + ZorkGrandInquisitorDeathsanity.OFF: { + ZorkGrandInquisitorItemTransforms.MAKE_FILLER: ( + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_NEWARK_NEW_JERSEY, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY, + ) + }, + ZorkGrandInquisitorDeathsanity.ON: None, + ZorkGrandInquisitorLandmarksanity.OFF: None, + ZorkGrandInquisitorLandmarksanity.ON: None, +} + +location_data_transforms: Dict[ + Union[ + ZorkGrandInquisitorStartingLocations, + ZorkGrandInquisitorGoals, + ZorkGrandInquisitorDeathsanity, + ZorkGrandInquisitorLandmarksanity, + ], + Optional[Dict[ZorkGrandInquisitorLocationTransforms, Tuple[ZorkGrandInquisitorLocations, ...]]] +] = { + ZorkGrandInquisitorStartingLocations.PORT_FOOZLE: None, + ZorkGrandInquisitorStartingLocations.CROSSROADS: None, + ZorkGrandInquisitorStartingLocations.DM_LAIR: None, + ZorkGrandInquisitorStartingLocations.DM_LAIR_INTERIOR: None, + ZorkGrandInquisitorStartingLocations.GUE_TECH: { + ZorkGrandInquisitorLocationTransforms.REMOVE: ( + ZorkGrandInquisitorLocations.LANDMARK_GUE_TECH_FOUNTAIN_INSIDE, + ) + }, + ZorkGrandInquisitorStartingLocations.SPELL_LAB: None, + ZorkGrandInquisitorStartingLocations.HADES_SHORE: { + ZorkGrandInquisitorLocationTransforms.REMOVE: ( + ZorkGrandInquisitorLocations.LANDMARK_HADES_SHORE, + ) + }, + ZorkGrandInquisitorStartingLocations.SUBWAY_FLOOD_CONTROL_DAM: None, + ZorkGrandInquisitorStartingLocations.MONASTERY: { + ZorkGrandInquisitorLocationTransforms.REMOVE: ( + ZorkGrandInquisitorLocations.LANDMARK_TOTEMIZER, + ) + }, + ZorkGrandInquisitorStartingLocations.MONASTERY_EXHIBIT: None, + ZorkGrandInquisitorGoals.THREE_ARTIFACTS: None, + ZorkGrandInquisitorGoals.ARTIFACT_OF_MAGIC_HUNT: None, # TODO: Remember to remove 3 locations of artifacts + ZorkGrandInquisitorGoals.SPELL_HEIST: None, + ZorkGrandInquisitorGoals.ZORK_TOUR: None, + ZorkGrandInquisitorGoals.NECROMANCER_OF_THE_GREAT_UNDERGROUND_EMPIRE: None, + ZorkGrandInquisitorDeathsanity.OFF: { + ZorkGrandInquisitorLocationTransforms.REMOVE: ( + ZorkGrandInquisitorLocations.DEATH_ARRESTED_WITH_JACK, + ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES, + ZorkGrandInquisitorLocations.DEATH_CLIMBED_OUT_OF_THE_WELL, + ZorkGrandInquisitorLocations.DEATH_EATEN_BY_A_GRUE, + ZorkGrandInquisitorLocations.DEATH_JUMPED_IN_BOTTOMLESS_PIT, + ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER, + ZorkGrandInquisitorLocations.DEATH_LOST_SOUL_TO_OLD_SCRATCH, + ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES, + ZorkGrandInquisitorLocations.DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD, + ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE, + ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON, + ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS, + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_INFINITY, + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_NEWARK_NEW_JERSEY, + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY_HALLS_OF_INQUISITION, + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY_INFINITY, + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY_NEWARK_NEW_JERSEY, + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY_STRAIGHT_TO_HELL, + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY_SURFACE_OF_MERZ, + ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_SURFACE_OF_MERZ, + ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON, + ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED, + ), + }, + ZorkGrandInquisitorDeathsanity.ON: None, + ZorkGrandInquisitorLandmarksanity.OFF: { + ZorkGrandInquisitorLocationTransforms.REMOVE: ( + ZorkGrandInquisitorLocations.LANDMARK_DRAGON_ARCHIPELAGO, + ZorkGrandInquisitorLocations.LANDMARK_DUNGEON_MASTERS_HOUSE, + ZorkGrandInquisitorLocations.LANDMARK_FLOOD_CONTROL_DAM_3, + ZorkGrandInquisitorLocations.LANDMARK_GATES_OF_HELL, + ZorkGrandInquisitorLocations.LANDMARK_GREAT_UNDERGROUND_EMPIRE_ENTRANCE, + ZorkGrandInquisitorLocations.LANDMARK_GUE_TECH_FOUNTAIN_INSIDE, + ZorkGrandInquisitorLocations.LANDMARK_GUE_TECH_FOUNTAIN_OUTSIDE, + ZorkGrandInquisitorLocations.LANDMARK_HADES_SHORE, + ZorkGrandInquisitorLocations.LANDMARK_INFINITE_CORRIDOR, + ZorkGrandInquisitorLocations.LANDMARK_INQUISITION_HEADQUARTERS, + ZorkGrandInquisitorLocations.LANDMARK_JACKS_SHOP, + ZorkGrandInquisitorLocations.LANDMARK_MIRROR_ROOM, + ZorkGrandInquisitorLocations.LANDMARK_PAST_PORT_FOOZLE, + ZorkGrandInquisitorLocations.LANDMARK_PORT_FOOZLE, + ZorkGrandInquisitorLocations.LANDMARK_SPELL_CHECKER, + ZorkGrandInquisitorLocations.LANDMARK_TOTEMIZER, + ZorkGrandInquisitorLocations.LANDMARK_UMBRELLA_TREE, + ZorkGrandInquisitorLocations.LANDMARK_UNDERGROUND_UNDERGROUND_ENTRANCE, + ZorkGrandInquisitorLocations.LANDMARK_WALKING_CASTLES_HEART, + ZorkGrandInquisitorLocations.LANDMARK_WHITE_HOUSE, + ), + }, + ZorkGrandInquisitorLandmarksanity.ON: None, +} diff --git a/worlds/zork_grand_inquisitor/data_funcs.py b/worlds/zork_grand_inquisitor/data_funcs.py index 6fa35a58b426..e3c48b641f1d 100644 --- a/worlds/zork_grand_inquisitor/data_funcs.py +++ b/worlds/zork_grand_inquisitor/data_funcs.py @@ -1,15 +1,22 @@ -from typing import Dict, List, Set, Tuple, Union +from typing import Any, Dict, List, Optional, Set, Tuple, Union -from .data.entrance_rule_data import entrance_rule_data +from BaseClasses import ItemClassification + +from .data.entrance_rule_data import entrance_rule_data, endgame_entrance_data_by_goal from .data.item_data import item_data, ZorkGrandInquisitorItemData from .data.location_data import location_data, ZorkGrandInquisitorLocationData -from .data.mapping_data import starting_location_to_logic_item +from .data.transform_data import item_data_transforms, location_data_transforms from .enums import ( + ZorkGrandInquisitorCraftableSpellBehaviors, + ZorkGrandInquisitorDeathsanity, ZorkGrandInquisitorEvents, ZorkGrandInquisitorGoals, ZorkGrandInquisitorItems, + ZorkGrandInquisitorItemTransforms, + ZorkGrandInquisitorLandmarksanity, ZorkGrandInquisitorLocations, + ZorkGrandInquisitorLocationTransforms, ZorkGrandInquisitorRegions, ZorkGrandInquisitorStartingLocations, ZorkGrandInquisitorTags, @@ -24,7 +31,7 @@ def item_names_to_item() -> Dict[str, ZorkGrandInquisitorItems]: return {item.value: item for item in item_data} -def location_names_to_id() -> Dict[str, int]: +def location_names_to_id() -> Dict[Any, int]: return { location.value: data.archipelago_id for location, data in location_data.items() @@ -32,7 +39,7 @@ def location_names_to_id() -> Dict[str, int]: } -def location_names_to_location() -> Dict[str, ZorkGrandInquisitorLocations]: +def location_names_to_location() -> Dict[Any, ZorkGrandInquisitorLocations]: return { location.value: location for location, data in location_data.items() @@ -40,6 +47,14 @@ def location_names_to_location() -> Dict[str, ZorkGrandInquisitorLocations]: } +def id_to_craftable_spell_behaviors() -> Dict[int, ZorkGrandInquisitorCraftableSpellBehaviors]: + return {behavior.value: behavior for behavior in ZorkGrandInquisitorCraftableSpellBehaviors} + + +def id_to_deathsanity() -> Dict[int, ZorkGrandInquisitorDeathsanity]: + return {deathsanity.value: deathsanity for deathsanity in ZorkGrandInquisitorDeathsanity} + + def id_to_goals() -> Dict[int, ZorkGrandInquisitorGoals]: return {goal.value: goal for goal in ZorkGrandInquisitorGoals} @@ -48,6 +63,10 @@ def id_to_items() -> Dict[int, ZorkGrandInquisitorItems]: return {data.archipelago_id: item for item, data in item_data.items()} +def id_to_landmarksanity() -> Dict[int, ZorkGrandInquisitorLandmarksanity]: + return {landmarksanity.value: landmarksanity for landmarksanity in ZorkGrandInquisitorLandmarksanity} + + def id_to_locations() -> Dict[int, ZorkGrandInquisitorLocations]: return { data.archipelago_id: location @@ -57,7 +76,10 @@ def id_to_locations() -> Dict[int, ZorkGrandInquisitorLocations]: def id_to_starting_locations() -> Dict[int, ZorkGrandInquisitorStartingLocations]: - return {starting_location.value: starting_location for starting_location in ZorkGrandInquisitorStartingLocations} + return { + starting_location.value: starting_location + for starting_location in ZorkGrandInquisitorStartingLocations + } def item_groups() -> Dict[str, List[str]]: @@ -115,9 +137,12 @@ def location_groups() -> Dict[str, List[str]]: return {k: v for k, v in groups.items() if len(v)} -def locations_by_region(include_deathsanity: bool = False) -> Dict[ - ZorkGrandInquisitorRegions, List[ZorkGrandInquisitorLocations] -]: +def locations_by_region_for_world( + world_location_data: Dict[ + Union[ZorkGrandInquisitorLocations, ZorkGrandInquisitorEvents], + ZorkGrandInquisitorLocationData, + ] +) -> Dict[ZorkGrandInquisitorRegions, List[ZorkGrandInquisitorLocations]]: mapping: Dict[ZorkGrandInquisitorRegions, List[ZorkGrandInquisitorLocations]] = dict() region: ZorkGrandInquisitorRegions @@ -126,12 +151,7 @@ def locations_by_region(include_deathsanity: bool = False) -> Dict[ location: ZorkGrandInquisitorLocations data: ZorkGrandInquisitorLocationData - for location, data in location_data.items(): - if not include_deathsanity and ZorkGrandInquisitorTags.DEATHSANITY in ( - data.tags or tuple() - ): - continue - + for location, data in world_location_data.items(): mapping[data.region].append(location) return mapping @@ -144,10 +164,86 @@ def locations_with_tag(tag: ZorkGrandInquisitorTags) -> Set[ZorkGrandInquisitorL return {location for location, data in location_data.items() if data.tags is not None and tag in data.tags} -def starting_location_to_logic_helper_item( +def prepare_item_data( starting_location: ZorkGrandInquisitorStartingLocations, -) -> ZorkGrandInquisitorItems: - return starting_location_to_logic_item[starting_location] + goal: ZorkGrandInquisitorGoals, + deathsanity: ZorkGrandInquisitorDeathsanity, + landmarksanity: ZorkGrandInquisitorLandmarksanity, +) -> Dict[ZorkGrandInquisitorItems, ZorkGrandInquisitorItemData]: + transformed_item_data: Dict[ZorkGrandInquisitorItems, ZorkGrandInquisitorItemData] = dict() + + # Filter items + item: ZorkGrandInquisitorItems + data: ZorkGrandInquisitorItemData + for item, data in item_data.items(): + # Filter here... + transformed_item_data[item] = data + + # Apply transformations + items_to_make_filler: Set[ZorkGrandInquisitorItems] = set() + + for context in (starting_location, goal, deathsanity, landmarksanity): + if item_data_transforms[context] is not None: + transform: ZorkGrandInquisitorItemTransforms + items: Tuple[ZorkGrandInquisitorItems, ...] + for transform, items in item_data_transforms[context].items(): + if transform == ZorkGrandInquisitorItemTransforms.MAKE_FILLER: + item: ZorkGrandInquisitorItems + for item in items: + items_to_make_filler.add(item) + + item: ZorkGrandInquisitorItems + for item in items_to_make_filler: + transformed_item_data[item] = transformed_item_data[item]._replace( + classification=ItemClassification.filler + ) + + return transformed_item_data + + +def prepare_location_data( + starting_location: ZorkGrandInquisitorStartingLocations, + goal: ZorkGrandInquisitorGoals, + deathsanity: ZorkGrandInquisitorDeathsanity, + landmarksanity: ZorkGrandInquisitorLandmarksanity, +) -> Dict[ + Union[ZorkGrandInquisitorLocations, ZorkGrandInquisitorEvents], ZorkGrandInquisitorLocationData +]: + transformed_location_data: Dict[ + Union[ZorkGrandInquisitorLocations, ZorkGrandInquisitorEvents], ZorkGrandInquisitorLocationData + ] = dict() + + # Force certain options depending on goal + if goal == ZorkGrandInquisitorGoals.NECROMANCER_OF_THE_GREAT_UNDERGROUND_EMPIRE: + deathsanity = ZorkGrandInquisitorDeathsanity.ON + elif goal == ZorkGrandInquisitorGoals.ZORK_TOUR: + landmarksanity = ZorkGrandInquisitorLandmarksanity.ON + + # Filter locations + location: Union[ZorkGrandInquisitorLocations, ZorkGrandInquisitorEvents] + data: ZorkGrandInquisitorLocationData + for location, data in location_data.items(): + # Filter here... + transformed_location_data[location] = data + + # Apply transformations + locations_to_remove: List[ZorkGrandInquisitorLocations] = list() + + for context in (starting_location, goal, deathsanity, landmarksanity): + if location_data_transforms[context] is not None: + transform: ZorkGrandInquisitorLocationTransforms + locations: Tuple[ZorkGrandInquisitorLocations, ...] + for transform, locations in location_data_transforms[context].items(): + if transform == ZorkGrandInquisitorLocationTransforms.REMOVE: + location: ZorkGrandInquisitorLocations + for location in locations: + locations_to_remove.append(location) + + location: ZorkGrandInquisitorLocations + for location in locations_to_remove: + del transformed_location_data[location] + + return transformed_location_data def location_access_rule_for(location: ZorkGrandInquisitorLocations, player: int) -> str: @@ -196,8 +292,33 @@ def location_access_rule_for(location: ZorkGrandInquisitorLocations, player: int def entrance_access_rule_for( region_origin: ZorkGrandInquisitorRegions, region_destination: ZorkGrandInquisitorRegions, - player: int + player: int, + dataset: Optional[ + Dict[ + Tuple[ + ZorkGrandInquisitorRegions, + ZorkGrandInquisitorRegions, + ], + Union[ + Tuple[ + Tuple[ + Union[ + ZorkGrandInquisitorEvents, + ZorkGrandInquisitorItems, + ZorkGrandInquisitorRegions, + ], + ..., + ], + ..., + ], + None, + ], + ] + ] = None ) -> str: + if dataset is None: + dataset = entrance_rule_data + data: Union[ Tuple[ Tuple[ @@ -211,7 +332,7 @@ def entrance_access_rule_for( ..., ], None, - ] = entrance_rule_data[(region_origin, region_destination)] + ] = dataset[(region_origin, region_destination)] if data is None: return "lambda state: True" @@ -257,3 +378,16 @@ def entrance_access_rule_for( lambda_string += " or " return lambda_string + + +def goal_access_rule_for( + region: ZorkGrandInquisitorRegions, + goal: ZorkGrandInquisitorGoals, + player: int, +) -> str: + return entrance_access_rule_for( + region, + ZorkGrandInquisitorRegions.ENDGAME, + player, + dataset=endgame_entrance_data_by_goal[goal], + ) diff --git a/worlds/zork_grand_inquisitor/enums.py b/worlds/zork_grand_inquisitor/enums.py index 4ef6af51d122..82ec8853c980 100644 --- a/worlds/zork_grand_inquisitor/enums.py +++ b/worlds/zork_grand_inquisitor/enums.py @@ -1,9 +1,19 @@ import enum +class ZorkGrandInquisitorCraftableSpellBehaviors(enum.Enum): + VANILLA = 0 + ANY_SPELL = 1 + ANYTHING = 2 + + +class ZorkGrandInquisitorDeathsanity(enum.Enum): + OFF = 0 + ON = 1 + + class ZorkGrandInquisitorEvents(enum.Enum): CHARON_CALLED = "Event: Charon Called" - CIGAR_ACCESSIBLE = "Event: Cigar Accessible" DALBOZ_LOCKER_OPENABLE = "Event: Dalboz Locker Openable" DAM_DESTROYED = "Event: Dam Destroyed" DOOR_DRANK_MEAD = "Event: Door Drank Mead" @@ -11,21 +21,19 @@ class ZorkGrandInquisitorEvents(enum.Enum): DUNCE_LOCKER_OPENABLE = "Event: Dunce Locker Openable" HAS_REPAIRABLE_OBIDIL = "Event: Has Repairable OBIDIL" HAS_REPAIRABLE_SNAVIG = "Event: Has Repairable SNAVIG" - KNOWS_BEBURTT = "Event: Knows BEBURTT" - KNOWS_OBIDIL = "Event: Knows OBIDIL" - KNOWS_SNAVIG = "Event: Knows SNAVIG" - KNOWS_YASTARD = "Event: Knows YASTARD" - LANTERN_DALBOZ_ACCESSIBLE = "Event: Lantern (Dalboz) Accessible" ROPE_GLORFABLE = "Event: Rope GLORFable" VICTORY = "Victory" WHITE_HOUSE_LETTER_MAILABLE = "Event: White House Letter Mailable" ZORKMID_BILL_ACCESSIBLE = "Event: 500 Zorkmid Bill Accessible" ZORK_ROCKS_ACTIVATED = "Event: Zork Rocks Activated" - ZORK_ROCKS_SUCKABLE = "Event: Zork Rocks Suckable" class ZorkGrandInquisitorGoals(enum.Enum): THREE_ARTIFACTS = 0 + ARTIFACT_OF_MAGIC_HUNT = 1 + SPELL_HEIST = 2 + ZORK_TOUR = 3 + NECROMANCER_OF_THE_GREAT_UNDERGROUND_EMPIRE = 4 class ZorkGrandInquisitorItems(enum.Enum): @@ -33,12 +41,15 @@ class ZorkGrandInquisitorItems(enum.Enum): BROGS_FLICKERING_TORCH = "Brog's Flickering Torch" BROGS_GRUE_EGG = "Brog's Grue Egg" BROGS_PLANK = "Brog's Plank" + CIGAR = "Cigar" + COCOA_INGREDIENTS = "Cocoa Ingredients" + COCONUT_OF_QUENDOR = "Coconut of Quendor" + CUBE_OF_FOUNDATION = "Cube of Foundation" FILLER_FROBOZZ_ELECTRIC_GADGET = "Frobozz Electric Gadget" FILLER_INQUISITION_PROPAGANDA_FLYER = "Inquisition Propaganda Flyer" FILLER_MAGIC_CONTRABAND = "Magic Contraband" FILLER_NONSENSICAL_INQUISITION_PAPERWORK = "Nonsensical Inquisition Paperwork" FILLER_UNREADABLE_SPELL_SCROLL = "Unreadable Spell Scroll" - FLATHEADIA_FUDGE = "Flatheadia Fudge" GRIFFS_AIR_PUMP = "Griff's Air Pump" GRIFFS_DRAGON_TOOTH = "Griff's Dragon Tooth" GRIFFS_INFLATABLE_RAFT = "Griff's Inflatable Raft" @@ -48,6 +59,7 @@ class ZorkGrandInquisitorItems(enum.Enum): HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS = "Hotspot: Alpine's Quandry Card Slots" HOTSPOT_BLANK_SCROLL_BOX = "Hotspot: Blank Scroll Box" HOTSPOT_BLINDS = "Hotspot: Blinds" + HOTSPOT_BUCKET = "Hotspot: Bucket" HOTSPOT_CANDY_MACHINE_BUTTONS = "Hotspot: Candy Machine Buttons" HOTSPOT_CANDY_MACHINE_COIN_SLOT = "Hotspot: Candy Machine Coin Slot" HOTSPOT_CANDY_MACHINE_VACUUM_SLOT = "Hotspot: Candy Machine Vacuum Slot" @@ -62,6 +74,7 @@ class ZorkGrandInquisitorItems(enum.Enum): HOTSPOT_DRAGON_CLAW = "Hotspot: Dragon Claw" HOTSPOT_DRAGON_NOSTRILS = "Hotspot: Dragon Nostrils" HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE = "Hotspot: Dungeon Master's Lair Entrance" + HOTSPOT_DUNGEON_MASTERS_HOUSE_EXIT = "Hotspot: Dungeon Master's House Exit" HOTSPOT_FLOOD_CONTROL_BUTTONS = "Hotspot: Flood Control Buttons" HOTSPOT_FLOOD_CONTROL_DOORS = "Hotspot: Flood Control Doors" HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT = "Hotspot: Frozen Treat Machine Coin Slot" @@ -70,6 +83,7 @@ class ZorkGrandInquisitorItems(enum.Enum): HOTSPOT_GRAND_INQUISITOR_DOLL = "Hotspot: Grand Inquisitor Doll" HOTSPOT_GUE_TECH_DOOR = "Hotspot: GUE Tech Door" HOTSPOT_GUE_TECH_GRASS = "Hotspot: GUE Tech Grass" + HOTSPOT_GUE_TECH_WINDOWS = "Hotspot: GUE Tech Windows" HOTSPOT_HADES_PHONE_BUTTONS = "Hotspot: Hades Phone Buttons" HOTSPOT_HADES_PHONE_RECEIVER = "Hotspot: Hades Phone Receiver" HOTSPOT_HARRY = "Hotspot: Harry" @@ -81,7 +95,6 @@ class ZorkGrandInquisitorItems(enum.Enum): HOTSPOT_MAILBOX_DOOR = "Hotspot: Mailbox Door" HOTSPOT_MAILBOX_FLAG = "Hotspot: Mailbox Flag" HOTSPOT_MIRROR = "Hotspot: Mirror" - HOTSPOT_MONASTERY_VENT = "Hotspot: Monastery Vent" HOTSPOT_MOSSY_GRATE = "Hotspot: Mossy Grate" HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR = "Hotspot: Port Foozle Past Tavern Door" HOTSPOT_PURPLE_WORDS = "Hotspot: Purple Words" @@ -93,6 +106,7 @@ class ZorkGrandInquisitorItems(enum.Enum): HOTSPOT_SODA_MACHINE_COIN_SLOT = "Hotspot: Soda Machine Coin Slot" HOTSPOT_SOUVENIR_COIN_SLOT = "Hotspot: Souvenir Coin Slot" HOTSPOT_SPELL_CHECKER = "Hotspot: Spell Checker" + HOTSPOT_SPELL_LAB_BRIDGE_EXIT = "Hotspot: Spell Lab Bridge Exit" HOTSPOT_SPELL_LAB_CHASM = "Hotspot: Spell Lab Chasm" HOTSPOT_SPRING_MUSHROOM = "Hotspot: Spring Mushroom" HOTSPOT_STUDENT_ID_MACHINE = "Hotspot: Student ID Machine" @@ -100,53 +114,45 @@ class ZorkGrandInquisitorItems(enum.Enum): HOTSPOT_TAVERN_FLY = "Hotspot: Tavern Fly" HOTSPOT_TOTEMIZER_SWITCH = "Hotspot: Totemizer Switch" HOTSPOT_TOTEMIZER_WHEELS = "Hotspot: Totemizer Wheels" - HOTSPOT_WELL = "Hotspot: Well" HUNGUS_LARD = "Hungus Lard" - JAR_OF_HOTBUGS = "Jar of Hotbugs" - LANTERN = "Lantern" LARGE_TELEGRAPH_HAMMER = "Large Telegraph Hammer" - LOGIC_HELPER_STARTING_LOCATION_CROSSROADS = "Starting Location: Crossroads" - LOGIC_HELPER_STARTING_LOCATION_DM_LAIR = "Starting Location: Dungeon Master's Lair" - LOGIC_HELPER_STARTING_LOCATION_DM_LAIR_INTERIOR = "Starting Location: Dungeon Master's House" - LOGIC_HELPER_STARTING_LOCATION_GUE_TECH = "Starting Location: GUE Tech" - LOGIC_HELPER_STARTING_LOCATION_HADES_SHORE = "Starting Location: Hades Shore" - LOGIC_HELPER_STARTING_LOCATION_MONASTERY = "Starting Location: Monastery Totemizer" - LOGIC_HELPER_STARTING_LOCATION_MONASTERY_EXHIBIT = "Starting Location: Monastery Exhibit" - LOGIC_HELPER_STARTING_LOCATION_PORT_FOOZLE = "Starting Location: Port Foozle" - LOGIC_HELPER_STARTING_LOCATION_SPELL_LAB = "Starting Location: Spell Lab" - LOGIC_HELPER_STARTING_LOCATION_SUBWAY_FLOOD_CONTROL_DAM = "Starting Location: Flood Control Dam #3" LUCYS_PLAYING_CARD_1 = "Lucy's Playing Card: 1 Pip" LUCYS_PLAYING_CARD_2 = "Lucy's Playing Card: 2 Pips" LUCYS_PLAYING_CARD_3 = "Lucy's Playing Card: 3 Pips" LUCYS_PLAYING_CARD_4 = "Lucy's Playing Card: 4 Pips" MAP = "Map" MEAD_LIGHT = "Mead Light" - MOSS_OF_MAREILON = "Moss of Mareilon" - MUG = "Mug" + MONASTERY_ROPE = "Monastery Rope" OLD_SCRATCH_CARD = "Old Scratch Card" PERMA_SUCK_MACHINE = "Perma-Suck Machine" PLASTIC_SIX_PACK_HOLDER = "Plastic Six-Pack Holder" POUCH_OF_ZORKMIDS = "Pouch of Zorkmids" PROZORK_TABLET = "Prozork Tablet" - QUELBEE_HONEYCOMB = "Quelbee Honeycomb" - ROPE = "Rope" + SANDWITCH_WRAPPER = "Sandwitch Wrapper" SCROLL_FRAGMENT_ANS = "Scroll Fragment: ANS" SCROLL_FRAGMENT_GIV = "Scroll Fragment: GIV" SHOVEL = "Shovel" + SKULL_OF_YORUK = "Skull of Yoruk" SNAPDRAGON = "Snapdragon" + SPELL_BEBURTT = "Spell: BEBURTT" SPELL_GLORF = "Spell: GLORF" SPELL_GOLGATEM = "Spell: GOLGATEM" SPELL_IGRAM = "Spell: IGRAM" SPELL_KENDALL = "Spell: KENDALL" + SPELL_OBIDIL = "Spell: OBIDIL" SPELL_NARWILE = "Spell: NARWILE" SPELL_REZROV = "Spell: REZROV" + SPELL_SNAVIG = "Spell: SNAVIG" SPELL_THROCK = "Spell: THROCK" + SPELL_YASTARD = "Spell: YASTARD" STUDENT_ID = "Student ID" + SUBWAY_DESTINATION_CROSSROADS = "Subway Destination: Crossroads" SUBWAY_DESTINATION_FLOOD_CONTROL_DAM = "Subway Destination: Flood Control Dam #3" SUBWAY_DESTINATION_HADES = "Subway Destination: Hades" SUBWAY_DESTINATION_MONASTERY = "Subway Destination: Monastery" SUBWAY_TOKEN = "Subway Token" SWORD = "Sword" + TELEPORTER_DESTINATION_CROSSROADS = "Teleporter Destination: Crossroads" TELEPORTER_DESTINATION_DM_LAIR = "Teleporter Destination: Dungeon Master's Lair" TELEPORTER_DESTINATION_GUE_TECH = "Teleporter Destination: GUE Tech" TELEPORTER_DESTINATION_HADES = "Teleporter Destination: Hades" @@ -157,12 +163,23 @@ class ZorkGrandInquisitorItems(enum.Enum): TOTEM_LUCY = "Totem: Lucy" TOTEMIZER_DESTINATION_HALL_OF_INQUISITION = "Totemizer Destination: Hall of Inquisition" TOTEMIZER_DESTINATION_INFINITY = "Totemizer Destination: Infinity" + TOTEMIZER_DESTINATION_NEWARK_NEW_JERSEY = "Totemizer Destination: Newark, New Jersey" TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL = "Totemizer Destination: Straight to Hell" TOTEMIZER_DESTINATION_SURFACE_OF_MERZ = "Totemizer Destination: Surface of Merz" + WELL_ROPE = "Well Rope" ZIMDOR_SCROLL = "ZIMDOR Scroll" ZORK_ROCKS = "Zork Rocks" +class ZorkGrandInquisitorItemTransforms(enum.Enum): + MAKE_FILLER = "Make Filler" + + +class ZorkGrandInquisitorLandmarksanity(enum.Enum): + OFF = 0 + ON = 1 + + class ZorkGrandInquisitorLocations(enum.Enum): ALARM_SYSTEM_IS_DOWN = "Alarm System is Down" ARREST_THE_VANDAL = "Arrest the Vandal!" @@ -183,26 +200,32 @@ class ZorkGrandInquisitorLocations(enum.Enum): CASTLE_WATCHING_A_FIELD_GUIDE = "Castle Watching: A Field Guide" CAVES_NOTES = "Cave's Notes" CLOSING_THE_TIME_TUNNELS = "Closing the Time Tunnels" + COME_TO_PAPA_YOU_NUT = "Come to Papa. You Nut" CRISIS_AVERTED = "Crisis Averted" CUT_THAT_OUT_YOU_LITTLE_CREEP = "Cut That Out You Little Creep!" - DEATH_ARRESTED_WITH_JACK = "Death: Arrested With Jack" - DEATH_ATTACKED_THE_QUELBEES = "Death: Attacked the Quelbees" - DEATH_CLIMBED_OUT_OF_THE_WELL = "Death: Climbed Out of the Well" - DEATH_EATEN_BY_A_GRUE = "Death: Eaten by a Grue" - DEATH_JUMPED_IN_BOTTOMLESS_PIT = "Death: Jumped in Bottomless Pit" - DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER = "Death: Lost Game of Strip Grue, Fire, Water" - DEATH_LOST_SOUL_TO_OLD_SCRATCH = "Death: Lost Soul to Old Scratch" - DEATH_OUTSMARTED_BY_THE_QUELBEES = "Death: Outsmarted by the Quelbees" - DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD = "Death: Sliced up by the Invisible Guard" - DEATH_STEPPED_INTO_THE_INFINITE = "Death: Step Into the Infinite" - DEATH_SWALLOWED_BY_A_DRAGON = "Death: Swallowed by a Dragon" - DEATH_THROCKED_THE_GRASS = "Death: THROCKed the Grass" - DEATH_TOTEMIZED = "Death: Totemized?" - DEATH_TOTEMIZED_PERMANENTLY = "Death: Totemized... Permanently" - DEATH_YOURE_NOT_CHARON = "Death: You're Not Charon!?" - DEATH_ZORK_ROCKS_EXPLODED = "Death: Zork Rocks Exploded" + DEATH_ARRESTED_WITH_JACK = "Death: Interesting Philosophical Thought" + DEATH_ATTACKED_THE_QUELBEES = "Death: Just Under Half a Second" + DEATH_CLIMBED_OUT_OF_THE_WELL = "Death: Breaking Curfew" + DEATH_EATEN_BY_A_GRUE = "Death: Pitch Black Cave in a Zork Game" + DEATH_JUMPED_IN_BOTTOMLESS_PIT = "Death: Old Age" + DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER = "Death: Mind-Boggling Unlucky Streak" + DEATH_LOST_SOUL_TO_OLD_SCRATCH = "Death: Contractually Obligated" + DEATH_OUTSMARTED_BY_THE_QUELBEES = "Death: Antennae Nose Plugs" + DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD = "Death: Chop, Slice, Puree" + DEATH_STEPPED_INTO_THE_INFINITE = "Death: Tiny Step for Mankind" + DEATH_SWALLOWED_BY_A_DRAGON = "Death: Spare Loft Behind Uvula" + DEATH_THROCKED_THE_GRASS = "Death: Expressly Forbidden" + DEATH_TOTEMIZED_INFINITY = "Death: Airless Expanse of the Cosmos" + DEATH_TOTEMIZED_NEWARK_NEW_JERSEY = "Death: Arteriosclerosis" + DEATH_TOTEMIZED_PERMANENTLY_HALLS_OF_INQUISITION = "Death: Ms. Peeper's Paperweight" + DEATH_TOTEMIZED_PERMANENTLY_INFINITY = "Death: S.S. Feinstein's Tractor Beam" + DEATH_TOTEMIZED_PERMANENTLY_NEWARK_NEW_JERSEY = "Death: Manhole Cover in New Jersey" + DEATH_TOTEMIZED_PERMANENTLY_STRAIGHT_TO_HELL = "Death: Evil Spawn's Plaything" + DEATH_TOTEMIZED_PERMANENTLY_SURFACE_OF_MERZ = "Death: Eternity Gazing at the Scenic Vista" + DEATH_TOTEMIZED_SURFACE_OF_MERZ = "Death: Very, Very Pretty" + DEATH_YOURE_NOT_CHARON = "Death: Not Charon" + DEATH_ZORK_ROCKS_EXPLODED = "Death: Pretty Painless" DENIED_BY_THE_LAKE_MONSTER = "Denied by the Lake Monster" - DESPERATELY_SEEKING_TUTOR = "Desperately Seeking Tutor" DONT_EVEN_START_WITH_US_SPARKY = "Don't Even Start With Us, Sparky" DOOOOOOWN = "Doooooown" DOWN = "Down" @@ -219,17 +242,13 @@ class ZorkGrandInquisitorLocations(enum.Enum): FROBUARY_3_UNDERGROUNDHOG_DAY = "Frobruary 3 - Undergroundhog Day" GETTING_SOME_CHANGE = "Getting Some Change" GO_AWAY = "GO AWAY!" - GUE_TECH_DEANS_LIST = "GUE Tech Dean's List" + GOOD_PUZZLE_SMART_BROG = "Good Puzzle. Smart Brog" GUE_TECH_ENTRANCE_EXAM = "GUE Tech Entrance Exam" - GUE_TECH_HEALTH_MEMO = "GUE Tech Health Memo" - GUE_TECH_MAGEMEISTERS = "GUE Tech Magemeisters" HAVE_A_HELL_OF_A_DAY = "Have a Hell of a Day!" HELLO_THIS_IS_SHONA_FROM_GURTH_PUBLISHING = "Hello, This is Shona from Gurth Publishing" HELP_ME_CANT_BREATHE = "Help... Me. Can't... Breathe" HEY_FREE_DIRT = "Hey, Free Dirt!" - HI_MY_NAME_IS_DOUG = "Hi, My Name is Doug" HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING = "Hmmm. Informative. Yet Deeply Disturbing" - HOLD_ON_FOR_AN_IMPORTANT_MESSAGE = "Hold on for an Important Message" HOW_TO_HYPNOTIZE_YOURSELF = "How to Hypnotize Yourself" HOW_TO_WIN_AT_DOUBLE_FANUCCI = "How to Win at Double Fanucci" IMBUE_BEBURTT = "Imbue BEBURTT" @@ -241,11 +260,30 @@ class ZorkGrandInquisitorLocations(enum.Enum): ITS_ONE_OF_THOSE_ADVENTURERS_AGAIN = "It's One of Those Adventurers Again..." I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY = "I Don't Think You Would've Wanted That to Work Anyway" I_DONT_WANT_NO_TROUBLE = "I Don't Want No Trouble!" - I_HOPE_YOU_CAN_CLIMB_UP_THERE = "I Hope You Can Climb Up There With All This Junk" I_LIKE_YOUR_STYLE = "I Like Your Style!" I_SPIT_ON_YOUR_FILTHY_COINAGE = "I Spit on Your Filthy Coinage" + LANDMARK_DRAGON_ARCHIPELAGO = "Landmark Visited: Dragon Archipelago" + LANDMARK_DUNGEON_MASTERS_HOUSE = "Landmark Visited: Dungeon Master's House" + LANDMARK_FLOOD_CONTROL_DAM_3 = "Landmark Visited: Flood Control Dam #3" + LANDMARK_GATES_OF_HELL = "Landmark Visited: Gates of Hell" + LANDMARK_GREAT_UNDERGROUND_EMPIRE_ENTRANCE = "Landmark Visited: Great Underground Empire Entrance" + LANDMARK_GUE_TECH_FOUNTAIN_INSIDE = "Landmark Visited: GUE Tech Fountain (Inside)" + LANDMARK_GUE_TECH_FOUNTAIN_OUTSIDE = "Landmark Visited: GUE Tech Fountain (Outside)" + LANDMARK_HADES_SHORE = "Landmark Visited: Hades Shore" + LANDMARK_INFINITE_CORRIDOR = "Landmark Visited: Infinite Corridor" + LANDMARK_INQUISITION_HEADQUARTERS = "Landmark Visited: Inquisition Headquarters" + LANDMARK_JACKS_SHOP = "Landmark Visited: Jack's Shop" + LANDMARK_MIRROR_ROOM = "Landmark Visited: Mirror Room" + LANDMARK_PAST_PORT_FOOZLE = "Landmark Visited: Past Port Foozle" + LANDMARK_PORT_FOOZLE = "Landmark Visited: Port Foozle" + LANDMARK_SPELL_CHECKER = "Landmark Visited: Spell Checker" + LANDMARK_TOTEMIZER = "Landmark Visited: Totemizer" + LANDMARK_UMBRELLA_TREE = "Landmark Visited: Umbrella Tree" + LANDMARK_UNDERGROUND_UNDERGROUND_ENTRANCE = "Landmark Visited: Underground Underground Entrance" + LANDMARK_WALKING_CASTLES_HEART = "Landmark Visited: Walking Castle's Heart" + LANDMARK_WHITE_HOUSE = "Landmark Visited: White House" LIT_SUNFLOWERS = "Lit Sunflowers" - MAGIC_FOREVER = "Magic Forever!" + LOOK_AN_ICE_CREAM_BAR = "Look! An Ice Cream Bar" MAILED_IT_TO_HELL = "Mailed it to Hell" MAKE_LOVE_NOT_WAR = "Make Love, Not War" MEAD_LIGHT = "Mead Light?" @@ -272,9 +310,7 @@ class ZorkGrandInquisitorLocations(enum.Enum): PORT_FOOZLE_TIME_TUNNEL = "Port Foozle Time Tunnel" PROZORKED = "Prozorked" REASSEMBLE_SNAVIG = "Reassemble SNAVIG" - RESTOCKED_ON_GRUESDAY = "Restocked on Gruesday" RIGHT_HELLO_YES_UH_THIS_IS_SNEFFLE = "Right. Hello. Yes. Uh, This is Sneffle" - RIGHT_UH_SORRY_ITS_ME_AGAIN_SNEFFLE = "Right. Uh, Sorry. It's Me Again. Sneffle" SNAVIG_REPAIRED = "SNAVIG, Repaired" SOUVENIR = "Souvenir" STRAIGHT_TO_HELL = "Straight to Hell" @@ -290,6 +326,7 @@ class ZorkGrandInquisitorLocations(enum.Enum): THE_ALCHEMICAL_DEBACLE = "The Alchemical Debacle" THE_ENDLESS_FIRE = "The Endless Fire" THE_FLATHEADIAN_FUDGE_FIASCO = "The Flatheadian Fudge Fiasco" + THE_ONLY_WAY_TO_WIN_IS_NOT_TO_PLAY = "The Only Way to Win is Not to Play" THE_PERILS_OF_MAGIC = "The Perils of Magic" THE_UNDERGROUND_UNDERGROUND = "The Underground Underground" THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE = "This Doesn't Look Anything Like the Brochure" @@ -312,11 +349,17 @@ class ZorkGrandInquisitorLocations(enum.Enum): YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY = "Your Puny Weapons Don't Phase Me, Baby!" YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER = "You Don't Go Messing With a Man's Zipper" YOU_GAINED_86_EXPERIENCE_POINTS = "You Gained 86 Experience Points" + YOU_LOSE_MUFFET_ANTE_UP = "You Lose, Muffet. Ante Up" YOU_ONE_OF_THEM_AGITATORS_AINT_YA = "You One of Them Agitators, Ain't Ya?" YOU_WANT_A_PIECE_OF_ME_DOCK_BOY = "You Want a Piece of Me, Dock Boy? or Girl" +class ZorkGrandInquisitorLocationTransforms(enum.Enum): + REMOVE = "Remove" + + class ZorkGrandInquisitorRegions(enum.Enum): + ANYWHERE = "Anywhere" CROSSROADS = "Crossroads" DM_LAIR = "Dungeon Master's Lair" DM_LAIR_INTERIOR = "Dungeon Master's Lair - Interior" @@ -324,6 +367,7 @@ class ZorkGrandInquisitorRegions(enum.Enum): DRAGON_ARCHIPELAGO_DRAGON = "Dragon Archipelago - Dragon" ENDGAME = "Endgame" GUE_TECH = "GUE Tech" + GUE_TECH_ENTRANCE = "GUE Tech - Entrance" GUE_TECH_HALLWAY = "GUE Tech - Hallway" GUE_TECH_OUTSIDE = "GUE Tech - Outside" HADES = "Hades" @@ -343,6 +387,7 @@ class ZorkGrandInquisitorRegions(enum.Enum): SUBWAY_MONASTERY = "Subway Platform - Monastery" WALKING_CASTLE = "Walking Castle" WHITE_HOUSE = "White House" + WHITE_HOUSE_INTERIOR = "White House - Interior" class ZorkGrandInquisitorStartingLocations(enum.Enum): @@ -362,9 +407,10 @@ class ZorkGrandInquisitorTags(enum.Enum): CORE = "Core" DEATHSANITY = "Deathsanity" FILLER = "Filler" + GOAL_THREE_ARTIFACTS = "Goal: Three Artifacts" HOTSPOT = "Hotspot" INVENTORY_ITEM = "Inventory Item" - LOGIC_HELPER = "Logic Helper" + LANDMARKSANITY = "Landmarksanity" MISSABLE = "Missable" SPELL = "Spell" SUBWAY_DESTINATION = "Subway Destination" diff --git a/worlds/zork_grand_inquisitor/game_controller.py b/worlds/zork_grand_inquisitor/game_controller.py index 8743855c74ea..cb7933518ec7 100644 --- a/worlds/zork_grand_inquisitor/game_controller.py +++ b/worlds/zork_grand_inquisitor/game_controller.py @@ -1,13 +1,14 @@ import collections import functools import logging +import traceback # TODO: Only in dev -from typing import Dict, Optional, Set, Tuple, Union +from typing import Dict, List, Optional, Set, Tuple, Union from .data.item_data import item_data, ZorkGrandInquisitorItemData from .data.location_data import location_data, ZorkGrandInquisitorLocationData -from .data.missable_location_grant_conditions_data import ( +from .data.missable_location_data import ( missable_location_grant_conditions_data, ZorkGrandInquisitorMissableLocationGrantConditionsData, ) @@ -15,8 +16,10 @@ from .data_funcs import game_id_to_items, items_with_tag, locations_with_tag from .enums import ( + ZorkGrandInquisitorDeathsanity, ZorkGrandInquisitorGoals, ZorkGrandInquisitorItems, + ZorkGrandInquisitorLandmarksanity, ZorkGrandInquisitorLocations, ZorkGrandInquisitorStartingLocations, ZorkGrandInquisitorTags, @@ -47,9 +50,12 @@ class GameController: goal_completed: bool option_goal: Optional[ZorkGrandInquisitorGoals] - option_deathsanity: Optional[bool] - option_grant_missable_location_checks: Optional[bool] option_starting_location: Optional[ZorkGrandInquisitorStartingLocations] + option_deathsanity: Optional[ZorkGrandInquisitorDeathsanity] + option_landmarksanity: Optional[ZorkGrandInquisitorLandmarksanity] + option_grant_missable_location_checks: Optional[bool] + + initial_totemizer_destination: Optional[ZorkGrandInquisitorItems] def __init__(self, logger=None) -> None: self.logger = logger @@ -81,9 +87,12 @@ def __init__(self, logger=None) -> None: self.goal_completed = False self.option_goal = None + self.option_starting_location = None self.option_deathsanity = None + self.option_landmarksanity = None self.option_grant_missable_location_checks = None - self.option_starting_location = None + + self.initial_totemizer_destination = None @functools.cached_property def brog_items(self) -> Set[ZorkGrandInquisitorItems]: @@ -120,6 +129,10 @@ def totem_items(self) -> Set[ZorkGrandInquisitorItems]: def missable_locations(self) -> Set[ZorkGrandInquisitorLocations]: return locations_with_tag(ZorkGrandInquisitorTags.MISSABLE) + @functools.cached_property + def is_deathsanity(self) -> bool: + return self.option_deathsanity == ZorkGrandInquisitorDeathsanity.ON + def log(self, message) -> None: if self.logger: self.logger.info(message) @@ -197,6 +210,7 @@ def update(self) -> None: self.game_state_manager.refresh_game_location() self._apply_starting_location() + self._apply_initial_totemizer_destination() self._apply_permanent_game_state() self._apply_conditional_game_state() @@ -218,8 +232,12 @@ def update(self) -> None: self._check_for_victory() except Exception as e: self.log_debug(e) + traceback.print_exc() def _apply_starting_location(self, force: bool = False) -> None: + if self.option_starting_location is None: + return None + if self._read_game_state_value_for(19985) == 0 or force: if self.option_starting_location == ZorkGrandInquisitorStartingLocations.PORT_FOOZLE: self.game_state_manager.set_game_location("ps10", 825) @@ -232,7 +250,7 @@ def _apply_starting_location(self, force: bool = False) -> None: elif self.option_starting_location == ZorkGrandInquisitorStartingLocations.GUE_TECH: self.game_state_manager.set_game_location("tr10", 150) elif self.option_starting_location == ZorkGrandInquisitorStartingLocations.SPELL_LAB: - self.game_state_manager.set_game_location("tp10", 0) + self.game_state_manager.set_game_location("tp20", 1244) elif self.option_starting_location == ZorkGrandInquisitorStartingLocations.HADES_SHORE: self.game_state_manager.set_game_location("hp10", 534) elif self.option_starting_location == ZorkGrandInquisitorStartingLocations.SUBWAY_FLOOD_CONTROL_DAM: @@ -244,10 +262,28 @@ def _apply_starting_location(self, force: bool = False) -> None: self._write_game_state_value_for(19985, 1) + def _apply_initial_totemizer_destination(self) -> None: + if self.initial_totemizer_destination is None: + return None + + if self._read_game_state_value_for(19986) == 0: + mapping: Dict[ZorkGrandInquisitorItems, int] = { + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION: 0, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ: 1, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_NEWARK_NEW_JERSEY: 2, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY: 3, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL: 4, + } + + self._write_game_state_value_for(9617, mapping[self.initial_totemizer_destination]) + self._write_game_state_value_for(19986, 1) + def _apply_permanent_game_state(self) -> None: self._write_game_state_value_for(10934, 1) # Rope Taken self._write_game_state_value_for(10418, 1) # Mead Light Taken self._write_game_state_value_for(10275, 0) # Lantern in Crate + self._write_game_state_value_for(10297, 0) # Lantern on Jack's Table + self._write_game_state_value_for(5221, 1) # Player has Lantern self._write_game_state_value_for(13929, 1) # Great Underground Door Open self._write_game_state_value_for(13968, 1) # Subway Token Taken self._write_game_state_value_for(12930, 1) # Hammer Taken @@ -293,55 +329,57 @@ def _apply_permanent_game_state(self) -> None: self._write_game_state_value_for(13934, 1) # Skip Well Cutscenes self._write_game_state_value_for(13935, 1) # Skip Well Cutscenes self._write_game_state_value_for(13384, 1) # Skip Meanwhile... Cutscene + self._write_game_state_value_for(18275, 1) # Skip Flashback Cutscene self._write_game_state_value_for(8620, 1) # First Coin Paid to Charon self._write_game_state_value_for(8731, 1) # First Coin Paid to Charon self._write_game_state_value_for(191, 1) # VOXAM Learned + self._write_game_state_value_for(15384, 0) # Never Consider All Artifacts to be Placed def _apply_conditional_game_state(self): - # Can teleport to Dungeon Master's Lair + # Teleporter Destinations + if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_CROSSROADS): + self._write_game_state_value_for(12918, 1) + else: + self._write_game_state_value_for(12918, 0) + if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR): self._write_game_state_value_for(2203, 1) else: self._write_game_state_value_for(2203, 0) - # Can teleport to GUE Tech if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH): self._write_game_state_value_for(7132, 1) else: self._write_game_state_value_for(7132, 0) - # Can Teleport to Spell Lab if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB): self._write_game_state_value_for(16545, 1) else: self._write_game_state_value_for(16545, 0) - # Can Teleport to Hades if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES): self._write_game_state_value_for(7119, 1) else: self._write_game_state_value_for(7119, 0) - # Can Teleport to Monastery Station if self._player_has(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY): self._write_game_state_value_for(7148, 1) else: self._write_game_state_value_for(7148, 0) - # Initial Totemizer Destination - should_force_initial_totemizer_destination: bool = True - - if self._player_has(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION): - should_force_initial_totemizer_destination = False - elif self._player_has(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL): - should_force_initial_totemizer_destination = False - elif self._player_has(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY): - should_force_initial_totemizer_destination = False - elif self._player_has(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ): - should_force_initial_totemizer_destination = False + # Monastery Rope + if self._player_has(ZorkGrandInquisitorItems.MONASTERY_ROPE): + self._write_game_state_value_for(9637, 1) + else: + self._write_game_state_value_for(9637, 0) - if should_force_initial_totemizer_destination: - self._write_game_state_value_for(9617, 2) + # Well Rope + if self._player_has(ZorkGrandInquisitorItems.WELL_ROPE): + self._write_game_state_value_for(10304, 1) + self._write_game_state_value_for(13938, 0) + else: + self._write_game_state_value_for(10304, 0) + self._write_game_state_value_for(13938, 1) # Pouch of Zorkmids if self._player_has(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS): @@ -349,6 +387,22 @@ def _apply_conditional_game_state(self): else: self._write_game_state_value_for(5827, 0) + # Cocoa Ingredients + is_cocoa_brewed: bool = ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU in self.completed_locations + + if self._player_has(ZorkGrandInquisitorItems.COCOA_INGREDIENTS) and not is_cocoa_brewed: + self._write_game_state_value_for(4750, 1) # Jar of Hotbugs + self._write_game_state_value_for(4763, 1) # Moss of Mareilon + self._write_game_state_value_for(4766, 1) # Flatheadia Fudge + self._write_game_state_value_for(4772, 1) # Mug + self._write_game_state_value_for(4769, 1) # Quelbee Honeycomb + else: + self._write_game_state_value_for(4750, 0) + self._write_game_state_value_for(4763, 0) + self._write_game_state_value_for(4766, 0) + self._write_game_state_value_for(4772, 0) + self._write_game_state_value_for(4769, 0) + # Brog Torches if self._player_is_brog() and self._player_has(ZorkGrandInquisitorItems.BROGS_BICKERING_TORCH): self._write_game_state_value_for(10999, 1) @@ -360,22 +414,26 @@ def _apply_conditional_game_state(self): else: self._write_game_state_value_for(10998, 0) - # Monastery Rope - if ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE in self.completed_locations: - self._write_game_state_value_for(9637, 1) - def _apply_permanent_game_flags(self) -> None: + self._write_game_flags_value_for(13597, 2) # Monastery Vent self._write_game_flags_value_for(9437, 2) # Monastery Exhibit Door to Outside self._write_game_flags_value_for(3074, 2) # White House Door self._write_game_flags_value_for(13005, 2) # Map self._write_game_flags_value_for(13006, 2) # Sword self._write_game_flags_value_for(13007, 2) # Sword + self._write_game_flags_value_for(4854, 2) # Hungus Lard self._write_game_flags_value_for(13389, 2) # Moss of Mareilon self._write_game_flags_value_for(4301, 2) # Quelbee Honeycomb self._write_game_flags_value_for(12895, 2) # Change Machine Money self._write_game_flags_value_for(4150, 2) # Prozorked Snapdragon self._write_game_flags_value_for(13413, 2) # Letter Opener self._write_game_flags_value_for(15403, 2) # Lucy's Cards + self._write_game_flags_value_for(4876, 2) # Cocoa Ingredient - Jar of Hotbugs + self._write_game_flags_value_for(4877, 2) # Cocoa Ingredient - Moss of Mareilon + self._write_game_flags_value_for(4874, 2) # Cocoa Ingredient - Flatheadia Fudge + self._write_game_flags_value_for(4875, 2) # Cocoa Ingredient - Mug + self._write_game_flags_value_for(4873, 2) # Cocoa Ingredient - Quelbee Honeycomb + self._write_game_flags_value_for(10809, 2) # Back of Jack's Shop def _check_for_completed_locations(self) -> None: location: ZorkGrandInquisitorLocations @@ -388,7 +446,7 @@ def _check_for_completed_locations(self) -> None: is_location_completed: bool = True - trigger: [Union[str, int]] + trigger: Union[str, int, Tuple[int, ...]] value: Union[str, int, Tuple[int, ...]] for trigger, value in data.game_state_trigger: if trigger == "location": @@ -407,6 +465,12 @@ def _check_for_completed_locations(self) -> None: else: is_location_completed = False break + elif isinstance(trigger, tuple): + game_state_values: List[int] = [self._read_game_state_value_for(key) for key in trigger] + + if value not in game_state_values: + is_location_completed = False + break else: is_location_completed = False break @@ -415,6 +479,15 @@ def _check_for_completed_locations(self) -> None: self.completed_locations.add(location) self.completed_locations_queue.append(location) + self._after_location_completed(location) + + def _after_location_completed(self, location: ZorkGrandInquisitorLocations) -> None: + # Write certain events to unused game state that otherwise don't have a permanent way to track + if location == ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP: + self._write_game_state_value_for(19951, 1) + elif location == ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG: + self._write_game_state_value_for(19952, 1) + def _check_for_missable_locations_to_grant(self) -> None: missable_location: ZorkGrandInquisitorLocations for missable_location in self.missable_locations: @@ -423,7 +496,7 @@ def _check_for_missable_locations_to_grant(self) -> None: data: ZorkGrandInquisitorLocationData = location_data[missable_location] - if ZorkGrandInquisitorTags.DEATHSANITY in data.tags and not self.option_deathsanity: + if ZorkGrandInquisitorTags.DEATHSANITY in data.tags and not self.is_deathsanity: continue condition_data: ZorkGrandInquisitorMissableLocationGrantConditionsData = ( @@ -434,7 +507,15 @@ def _check_for_missable_locations_to_grant(self) -> None: self.log_debug(f"Missable Location {missable_location.value} has no grant conditions") continue - if condition_data.location_condition in self.completed_locations: + if condition_data.game_location_condition is not None: + if not self._player_is_at(condition_data.game_location_condition): + continue + + location_condition_intersection: Set[ZorkGrandInquisitorLocations] = ( + set(condition_data.location_condition) & self.completed_locations + ) + + if len(location_condition_intersection): grant_location: bool = True item: ZorkGrandInquisitorItems @@ -505,6 +586,11 @@ def _manage_hotspots(self) -> None: self._write_game_flags_value_for(4799, 0) else: self._write_game_flags_value_for(4799, 2) + elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_BUCKET: + has_well_rope: bool = self._player_has(ZorkGrandInquisitorItems.WELL_ROPE) + + if self.game_state_manager.game_location == "uw10" and has_well_rope: + self._write_game_flags_value_for(13928, 0) elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS: if self.game_state_manager.game_location == "tr5g": key: int @@ -595,6 +681,9 @@ def _manage_hotspots(self) -> None: self._write_game_flags_value_for(1426, 2) else: self._write_game_flags_value_for(1426, 0) + elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_HOUSE_EXIT: + if self.game_state_manager.game_location == "dv10": + self._write_game_flags_value_for(4791, 0) elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE: if self.game_state_manager.game_location == "uc3e": if self._read_game_state_value_for(13060) == 0: @@ -661,6 +750,14 @@ def _manage_hotspots(self) -> None: key: int for key in data.statemap_keys: self._write_game_flags_value_for(key, 0) + elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_WINDOWS: + if self.game_state_manager.game_location == "te3e": + if self._read_game_state_value_for(11536) == 1: + self._write_game_flags_value_for(11543, 0) + elif self.game_state_manager.game_location == "tr1g": + self._write_game_flags_value_for(12256, 0) + elif self.game_state_manager.game_location == "te40": + self._write_game_flags_value_for(11720, 0) elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS: if self.game_state_manager.game_location == "hp1e": if self._read_game_state_value_for(8431) == 1: @@ -723,12 +820,6 @@ def _manage_hotspots(self) -> None: elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_MIRROR: if self.game_state_manager.game_location == "dw1f": self._write_game_flags_value_for(5031, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT: - if self.game_state_manager.game_location == "um1e": - if self._read_game_state_value_for(9637) == 0: - self._write_game_flags_value_for(13597, 0) - else: - self._write_game_flags_value_for(13597, 2) elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_MOSSY_GRATE: if self.game_state_manager.game_location == "ue2g": if self._read_game_state_value_for(13278) == 0: @@ -798,6 +889,9 @@ def _manage_hotspots(self) -> None: elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER: if self.game_state_manager.game_location == "tp4g": self._write_game_flags_value_for(12170, 0) + elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_BRIDGE_EXIT: + if self.game_state_manager.game_location == "tp10": + self._write_game_flags_value_for(12045, 0) elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM: if self.game_state_manager.game_location == "tp1e": if self._read_game_state_value_for(16342) == 1 and self._read_game_state_value_for(16374) == 0: @@ -827,9 +921,15 @@ def _manage_hotspots(self) -> None: self._write_game_flags_value_for(9728, 0) self._write_game_flags_value_for(9729, 0) self._write_game_flags_value_for(9730, 0) - elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_WELL: - if self.game_state_manager.game_location == "pc1e": - self._write_game_flags_value_for(10314, 0) + elif hotspot_item == ZorkGrandInquisitorItems.SUBWAY_DESTINATION_CROSSROADS: + if self.game_state_manager.game_location == "us2e": + self._write_game_flags_value_for(13760, 0) + elif self.game_state_manager.game_location == "ue2e": + self._write_game_flags_value_for(13323, 0) + elif self.game_state_manager.game_location == "uh2e": + self._write_game_flags_value_for(13512, 0) + elif self.game_state_manager.game_location == "um2e": + self._write_game_flags_value_for(13651, 0) elif hotspot_item == ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM: if self.game_state_manager.game_location == "us2e": self._write_game_flags_value_for(13757, 0) @@ -860,15 +960,18 @@ def _manage_hotspots(self) -> None: elif hotspot_item == ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION: if self.game_state_manager.game_location == "mt1f": self._write_game_flags_value_for(9660, 0) + elif hotspot_item == ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ: + if self.game_state_manager.game_location == "mt1f": + self._write_game_flags_value_for(9662, 0) + elif hotspot_item == ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_NEWARK_NEW_JERSEY: + if self.game_state_manager.game_location == "mt1f": + self._write_game_flags_value_for(9664, 0) elif hotspot_item == ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY: if self.game_state_manager.game_location == "mt1f": self._write_game_flags_value_for(9666, 0) elif hotspot_item == ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL: if self.game_state_manager.game_location == "mt1f": self._write_game_flags_value_for(9668, 0) - elif hotspot_item == ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ: - if self.game_state_manager.game_location == "mt1f": - self._write_game_flags_value_for(9662, 0) def _manage_items(self) -> None: if self._player_is_afgncaap(): @@ -926,22 +1029,34 @@ def _manage_items(self) -> None: seen_items.add(item) def _apply_conditional_teleports(self) -> None: + # Skip Well Cutscene if self._player_is_at("uw1x"): self.game_state_manager.set_game_location("uw10", 0) - if self._player_is_at("uw1k") and self._read_game_state_value_for(13938) == 0: - self.game_state_manager.set_game_location("pc10", 250) + # Skip Y'Gael Cutscene + if self._player_is_at("ej10"): + self.game_state_manager.set_game_location("uc10", 1200) + # Skip Power Outage Cutscene if self._player_is_at("ue1q"): self.game_state_manager.set_game_location("ue1e", 0) - if self._player_is_at("ej10"): - self.game_state_manager.set_game_location("uc10", 1200) + # Bucket -> Surface + if self._player_is_at("uw1k") and self._read_game_state_value_for(13938) == 0: + self.game_state_manager.set_game_location("pc10", 250) + + # Monastery Subway Station -> Monastery + if self._player_is_at("um1e") and self._read_game_state_value_for(9637) == 1: + self.game_state_manager.set_game_location("mt10", 1531) # VOXAM Cast + zork_rocks_inert = self._read_game_state_value_for(11767) == 0 + if self._read_game_state_value_for(9) == 224: self._write_game_state_value_for(9, 0) - self._apply_starting_location(force=True) + + if zork_rocks_inert: + self._apply_starting_location(force=True) def _check_for_victory(self) -> None: if self.option_goal == ZorkGrandInquisitorGoals.THREE_ARTIFACTS: @@ -1001,11 +1116,11 @@ def _determine_game_state_inventory(self) -> Set[ZorkGrandInquisitorItems]: return game_state_inventory def _add_to_inventory(self, item: ZorkGrandInquisitorItems) -> None: - if item == ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS: - return None - data: ZorkGrandInquisitorItemData = item_data[item] + if data.statemap_keys is None: + return None + if ZorkGrandInquisitorTags.INVENTORY_ITEM in data.tags: if len(self.available_inventory_slots): # Inventory slot overflow protection inventory_slot: int = self.available_inventory_slots.pop() @@ -1016,11 +1131,11 @@ def _add_to_inventory(self, item: ZorkGrandInquisitorItems) -> None: self._write_game_state_value_for(data.statemap_keys[0], 1) def _remove_from_inventory(self, item: ZorkGrandInquisitorItems) -> None: - if item == ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS: - return None - data: ZorkGrandInquisitorItemData = item_data[item] + if data.statemap_keys is None: + return None + if ZorkGrandInquisitorTags.INVENTORY_ITEM in data.tags: inventory_slot: Optional[int] = self._inventory_slot_for(item) @@ -1092,12 +1207,7 @@ def _filter_received_inventory_items( item: ZorkGrandInquisitorItems for item in received_inventory_items: - if item == ZorkGrandInquisitorItems.FLATHEADIA_FUDGE: - if self._read_game_state_value_for(4766) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4869) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.HUNGUS_LARD: + if item == ZorkGrandInquisitorItems.HUNGUS_LARD: if self._read_game_state_value_for(4870) == 1: to_filter_inventory_items.add(item) elif ( @@ -1105,16 +1215,6 @@ def _filter_received_inventory_items( and self._read_game_state_value_for(4309) == 0 ): to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.JAR_OF_HOTBUGS: - if self._read_game_state_value_for(4750) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4869) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.LANTERN: - if self._read_game_state_value_for(10477) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(5221) == 1: - to_filter_inventory_items.add(item) elif item == ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER: if self._read_game_state_value_for(9491) == 3: to_filter_inventory_items.add(item) @@ -1128,16 +1228,6 @@ def _filter_received_inventory_items( to_filter_inventory_items.add(item) elif self._read_game_state_value_for(4034) == 1: to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.MOSS_OF_MAREILON: - if self._read_game_state_value_for(4763) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4869) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.MUG: - if self._read_game_state_value_for(4772) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4869) == 1: - to_filter_inventory_items.add(item) elif item == ZorkGrandInquisitorItems.OLD_SCRATCH_CARD: if 32 in inventory_item_values: to_filter_inventory_items.add(item) @@ -1154,36 +1244,18 @@ def _filter_received_inventory_items( elif item == ZorkGrandInquisitorItems.PROZORK_TABLET: if self._read_game_state_value_for(4115) == 1: to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB: - if self._read_game_state_value_for(4769) == 1: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(4869) == 1: - to_filter_inventory_items.add(item) - elif item == ZorkGrandInquisitorItems.ROPE: - if 22 in inventory_item_values: - to_filter_inventory_items.add(item) - elif 111 in inventory_item_values: - to_filter_inventory_items.add(item) - elif ( - self._read_game_state_value_for(10304) == 1 - and not self._read_game_state_value_for(13938) == 1 - ): - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(15150) == 83: + elif item == ZorkGrandInquisitorItems.SANDWITCH_WRAPPER: + if self._read_game_state_value_for(19951) == 1: to_filter_inventory_items.add(item) elif item == ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS: if 41 in inventory_item_values: to_filter_inventory_items.add(item) - elif 98 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(201) == 1: + elif self._read_game_state_value_for(19952) == 1: to_filter_inventory_items.add(item) elif item == ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV: if 48 in inventory_item_values: to_filter_inventory_items.add(item) - elif 98 in inventory_item_values: - to_filter_inventory_items.add(item) - elif self._read_game_state_value_for(201) == 1: + elif self._read_game_state_value_for(19952) == 1: to_filter_inventory_items.add(item) elif item == ZorkGrandInquisitorItems.SNAPDRAGON: if self._read_game_state_value_for(4199) == 1: diff --git a/worlds/zork_grand_inquisitor/options.py b/worlds/zork_grand_inquisitor/options.py index 8937e54f8af5..cd97c4c21a5f 100644 --- a/worlds/zork_grand_inquisitor/options.py +++ b/worlds/zork_grand_inquisitor/options.py @@ -11,14 +11,32 @@ class Goal(Choice): """ display_name: str = "Goal" - default: int = 0 option_three_artifacts: int = 0 + default = 0 -class QuickPortFoozle(DefaultOnToggle): - """If true, the items needed to go down the well will be found in early locations for a smoother early game""" - display_name: str = "Quick Port Foozle" +class StartingLocation(Choice): + """ + Determines the in-game location the player will start at. The player always starts with VOXAM, which can be used to + teleport back to the starting location at any time. Depending on the starting location, the player may also be given + a starter kit of items to help them get going + """ + + display_name: str = "Starting Location" + + option_port_foozle: int = 0 + option_crossroads: int = 1 + option_dm_lair: int = 2 + option_dm_lair_house: int = 3 + option_gue_tech: int = 4 + option_spell_lab: int = 5 + option_hades_shore: int = 6 + option_flood_control_dam_3: int = 7 + option_monastery_totemizer: int = 8 + option_monastery_exhibit: int = 9 + + default = 0 class StartWithHotspotItems(DefaultOnToggle): @@ -33,12 +51,43 @@ class StartWithHotspotItems(DefaultOnToggle): display_name: str = "Start with Hotspot Items" +class CraftableSpells(Choice): + """ + Determines the behavior when craftable spells (BEBURTT, OBIDIL, SNAVIG, YASTARD) are obtained. + Spells in a starting location's starter kit always have precedence over this option + + Vanilla: After crafting a spell, the player will be given that exact spell + Any Spell: After crafting a spell, the player will be given a random spell + Anything: After crafting a spell, a random item from the multiworld will be unlocked + """ + + display_name: str = "Craftable Spells" + + option_vanilla: int = 0 + option_any_spell: int = 1 + option_anything: int = 2 + + default = 2 + + class Deathsanity(Toggle): - """If true, adds 16 player death locations to the world""" + """If true, adds 22 unique player death locations to the world""" # TODO: Add note about it being forced in Necro goal display_name: str = "Deathsanity" +class Landmarksanity(DefaultOnToggle): + """If true, adds 20 landmark locations to the world""" # TODO: Add note about it being forced in Zork Tour goal + + display_name: str = "Landmarksanity" + + +class PlaceEarlyItemsLocally(Toggle): + """If true, items to be placed early in the multiworld (when applicable) will be placed locally""" + + display_name: str = "Place Early Items Locally" + + class GrantMissableLocationChecks(Toggle): """ If true, performing an irreversible action will grant the locations checks that would have become unobtainable as a @@ -52,33 +101,13 @@ class GrantMissableLocationChecks(Toggle): display_name: str = "Grant Missable Checks" -class StartingLocation(Choice): - """ - Determines the in-game location the player will start at. The player always starts with VOXAM, which can be used to - teleport back to the starting location at any time - """ - - display_name: str = "Starting Location" - - option_port_foozle: int = 0 - option_crossroads: int = 1 - option_dm_lair: int = 2 - option_dm_lair_house: int = 3 - option_gue_tech: int = 4 - option_spell_lab: int = 5 - option_hades_shore: int = 6 - option_flood_control_dam_3: int = 7 - option_monastery_totemizer: int = 8 - option_monastery_exhibit: int = 9 - - default = "random" - - @dataclass class ZorkGrandInquisitorOptions(PerGameCommonOptions): goal: Goal - quick_port_foozle: QuickPortFoozle + starting_location: StartingLocation start_with_hotspot_items: StartWithHotspotItems + craftable_spells: CraftableSpells deathsanity: Deathsanity + landmarksanity: Landmarksanity + place_early_items_locally: PlaceEarlyItemsLocally grant_missable_location_checks: GrantMissableLocationChecks - starting_location: StartingLocation diff --git a/worlds/zork_grand_inquisitor/world.py b/worlds/zork_grand_inquisitor/world.py index 20e4fb8ffa53..413089b4c708 100644 --- a/worlds/zork_grand_inquisitor/world.py +++ b/worlds/zork_grand_inquisitor/world.py @@ -1,30 +1,48 @@ -from typing import Any, Dict, List, Tuple +from typing import Any, Dict, List, Set, Tuple, Union from BaseClasses import Item, ItemClassification, Location, Region, Tutorial from worlds.AutoWorld import WebWorld, World -from .data.item_data import item_data, ZorkGrandInquisitorItemData -from .data.location_data import location_data, ZorkGrandInquisitorLocationData -from .data.mapping_data import starting_location_to_logic_helper_item, starting_location_to_region +from .data.item_data import ZorkGrandInquisitorItemData +from .data.location_data import ZorkGrandInquisitorLocationData + +from .data.mapping_data import ( + early_items_for_starting_location, + endgame_connecting_regions_for_goal, + starter_kits_for_starting_location, + starting_location_to_region, +) + from .data.region_data import region_data from .data_funcs import ( item_names_to_id, item_names_to_item, location_names_to_id, + id_to_craftable_spell_behaviors, + id_to_deathsanity, + id_to_goals, + id_to_landmarksanity, id_to_starting_locations, item_groups, items_with_tag, location_groups, - locations_by_region, + locations_by_region_for_world, + prepare_item_data, + prepare_location_data, location_access_rule_for, entrance_access_rule_for, + goal_access_rule_for, ) from .enums import ( + ZorkGrandInquisitorCraftableSpellBehaviors, + ZorkGrandInquisitorDeathsanity, ZorkGrandInquisitorEvents, + ZorkGrandInquisitorGoals, ZorkGrandInquisitorItems, + ZorkGrandInquisitorLandmarksanity, ZorkGrandInquisitorLocations, ZorkGrandInquisitorRegions, ZorkGrandInquisitorStartingLocations, @@ -81,16 +99,74 @@ class ZorkGrandInquisitorWorld(World): web = ZorkGrandInquisitorWebWorld() + craftable_spells: ZorkGrandInquisitorCraftableSpellBehaviors + deathsanity: ZorkGrandInquisitorDeathsanity + early_items: Tuple[ZorkGrandInquisitorItems, ...] filler_item_names: List[str] = item_groups()["Filler"] + goal: ZorkGrandInquisitorGoals + grant_missable_location_checks: bool + initial_totemizer_destination: ZorkGrandInquisitorItems + item_data: Dict[ZorkGrandInquisitorItems, ZorkGrandInquisitorItemData] item_name_to_item: Dict[str, ZorkGrandInquisitorItems] = item_names_to_item() + landmarksanity: ZorkGrandInquisitorLandmarksanity + + location_data: Dict[ + Union[ZorkGrandInquisitorLocations, ZorkGrandInquisitorEvents], ZorkGrandInquisitorLocationData + ] + + locked_items: Dict[ZorkGrandInquisitorLocations, ZorkGrandInquisitorItems] + place_early_items_locally: bool + start_with_hotspot_items: bool + starter_kit: Tuple[ZorkGrandInquisitorItems, ...] starting_location: ZorkGrandInquisitorStartingLocations def generate_early(self) -> None: + self.goal = id_to_goals()[self.options.goal.value] self.starting_location = id_to_starting_locations()[self.options.starting_location.value] - def create_regions(self) -> None: - deathsanity: bool = bool(self.options.deathsanity) + self.starter_kit = tuple() + + if starter_kits_for_starting_location[self.starting_location] is not None: + self.starter_kit = self.random.choice( + starter_kits_for_starting_location[self.starting_location] + ) + + self.early_items = tuple() + + if early_items_for_starting_location[self.starting_location] is not None: + self.early_items = self.random.choice( + early_items_for_starting_location[self.starting_location] + ) + + self.start_with_hotspot_items = bool(self.options.start_with_hotspot_items) + + self.craftable_spells = id_to_craftable_spell_behaviors()[self.options.craftable_spells.value] + + self.deathsanity = id_to_deathsanity()[self.options.deathsanity] + self.landmarksanity = id_to_landmarksanity()[self.options.landmarksanity] + self.place_early_items_locally = bool(self.options.place_early_items_locally) + self.grant_missable_location_checks = bool(self.options.grant_missable_location_checks) + + self.item_data = prepare_item_data( + self.starting_location, + self.goal, + self.deathsanity, + self.landmarksanity, + ) + + self.location_data = prepare_location_data( + self.starting_location, + self.goal, + self.deathsanity, + self.landmarksanity, + ) + + self.locked_items = self._prepare_locked_items() + + self.initial_totemizer_destination = self._select_initial_totemizer_destination() + + def create_regions(self) -> None: region_mapping: Dict[ZorkGrandInquisitorRegions, Region] = dict() region_enum_item: ZorkGrandInquisitorRegions @@ -98,7 +174,9 @@ def create_regions(self) -> None: region_mapping[region_enum_item] = Region(region_enum_item.value, self.player, self.multiworld) region_locations_mapping: Dict[ZorkGrandInquisitorRegions, List[ZorkGrandInquisitorLocations]] - region_locations_mapping = locations_by_region(include_deathsanity=deathsanity) + region_locations_mapping = locations_by_region_for_world(self.location_data) + + region_connecting_endgame: ZorkGrandInquisitorRegions = endgame_connecting_regions_for_goal[self.goal] region_enum_item: ZorkGrandInquisitorRegions region: Region @@ -108,7 +186,7 @@ def create_regions(self) -> None: # Locations location_enum_item: ZorkGrandInquisitorLocations for location_enum_item in regions_locations: - data: ZorkGrandInquisitorLocationData = location_data[location_enum_item] + data: ZorkGrandInquisitorLocationData = self.location_data[location_enum_item] location: ZorkGrandInquisitorLocation = ZorkGrandInquisitorLocation( self.player, @@ -117,7 +195,10 @@ def create_regions(self) -> None: region_mapping[data.region], ) - if isinstance(location_enum_item, ZorkGrandInquisitorEvents): + # Locked Items + if location_enum_item in self.locked_items: + location.place_locked_item(self.create_item(self.locked_items[location_enum_item].value)) + elif isinstance(location_enum_item, ZorkGrandInquisitorEvents): location.place_locked_item( ZorkGrandInquisitorItem( data.event_item_name, @@ -127,6 +208,7 @@ def create_regions(self) -> None: ) ) + # Access Rules location_access_rule: str = location_access_rule_for(location_enum_item, self.player) if location_access_rule != "lambda state: True": @@ -144,32 +226,64 @@ def create_regions(self) -> None: else: region.connect(region_mapping[region_exit], rule=eval(entrance_access_rule)) + if region_enum_item == region_connecting_endgame: + goal_access_rule: str = goal_access_rule_for(region_enum_item, self.goal, self.player) + region.connect(region_mapping[ZorkGrandInquisitorRegions.ENDGAME], rule=eval(goal_access_rule)) + self.multiworld.regions.append(region) - # Connect "Menu" region to starting location + # Connect "Menu" region to starting location and to endgame when applicable region_menu: Region = Region("Menu", self.player, self.multiworld) region_starting_location: ZorkGrandInquisitorRegions = starting_location_to_region[self.starting_location] + region_menu.connect(region_mapping[ZorkGrandInquisitorRegions.ANYWHERE]) region_menu.connect(region_mapping[region_starting_location]) + if region_connecting_endgame == ZorkGrandInquisitorRegions.MENU: + goal_access_rule: str = goal_access_rule_for(ZorkGrandInquisitorRegions.MENU, self.goal, self.player) + region_menu.connect(region_mapping[ZorkGrandInquisitorRegions.ENDGAME], rule=eval(goal_access_rule)) + self.multiworld.regions.append(region_menu) def create_items(self) -> None: - quick_port_foozle: bool = bool(self.options.quick_port_foozle) - start_with_hotspot_items: bool = bool(self.options.start_with_hotspot_items) + items_to_ignore: Set[ZorkGrandInquisitorItems] = set() + items_to_precollect: Set[ZorkGrandInquisitorItems] = set() + items_to_place_early: Set[ZorkGrandInquisitorItems] + item: ZorkGrandInquisitorItems + + for item in items_with_tag(ZorkGrandInquisitorTags.FILLER): + items_to_ignore.add(item) + + for item in items_with_tag(ZorkGrandInquisitorTags.GOAL_THREE_ARTIFACTS): + items_to_ignore.add(item) + + for item in self.locked_items.values(): + items_to_ignore.add(item) + + for item in self.starter_kit: + items_to_precollect.add(item) + + if self.start_with_hotspot_items: + for item in items_with_tag(ZorkGrandInquisitorTags.HOTSPOT): + items_to_precollect.add(item) + + items_to_precollect.add(self.initial_totemizer_destination) + + if self.starting_location != ZorkGrandInquisitorStartingLocations.DM_LAIR_INTERIOR: + items_to_precollect.add(ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_HOUSE_EXIT) + + if self.starting_location != ZorkGrandInquisitorStartingLocations.SPELL_LAB: + items_to_precollect.add(ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_BRIDGE_EXIT) + + items_to_place_early = set(self.early_items) - items_to_precollect + + # Create Item Pool item_pool: List[ZorkGrandInquisitorItem] = list() - item: ZorkGrandInquisitorItems data: ZorkGrandInquisitorItemData - for item, data in item_data.items(): - tags: Tuple[ZorkGrandInquisitorTags, ...] = data.tags or tuple() - - if ZorkGrandInquisitorTags.FILLER in tags: - continue - elif ZorkGrandInquisitorTags.HOTSPOT in tags and start_with_hotspot_items: - continue - elif ZorkGrandInquisitorTags.LOGIC_HELPER in tags: + for item, data in self.item_data.items(): + if item in items_to_ignore or item in items_to_precollect: continue item_pool.append(self.create_item(item.value)) @@ -179,30 +293,21 @@ def create_items(self) -> None: self.multiworld.itempool += item_pool - if quick_port_foozle: - self.multiworld.early_items[self.player][ZorkGrandInquisitorItems.ROPE.value] = 1 - self.multiworld.early_items[self.player][ZorkGrandInquisitorItems.LANTERN.value] = 1 + # Precollect Items + for item in items_to_precollect: + self.multiworld.push_precollected(self.create_item(item.value)) - if not start_with_hotspot_items: - self.multiworld.early_items[self.player][ZorkGrandInquisitorItems.HOTSPOT_WELL.value] = 1 - self.multiworld.early_items[self.player][ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value] = 1 - - self.multiworld.early_items[self.player][ - ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value - ] = 1 - - if start_with_hotspot_items: - item: ZorkGrandInquisitorItems - for item in items_with_tag(ZorkGrandInquisitorTags.HOTSPOT): - self.multiworld.push_precollected(self.create_item(item.value)) + # Set Early Items + # TODO: Does this even work? Needs testing + if len(items_to_place_early): + early: Dict[int, Dict[str, int]] + early = self.multiworld.local_early_items if self.place_early_items_locally else self.multiworld.early_items - # Logic Helper Items - self.multiworld.push_precollected( - self.create_item(starting_location_to_logic_helper_item[self.starting_location].value) - ) + for item in items_to_place_early: + early[self.player][item.value] = 1 def create_item(self, name: str) -> ZorkGrandInquisitorItem: - data: ZorkGrandInquisitorItemData = item_data[self.item_name_to_item[name]] + data: ZorkGrandInquisitorItemData = self.item_data[self.item_name_to_item[name]] return ZorkGrandInquisitorItem( name, @@ -215,14 +320,116 @@ def generate_basic(self) -> None: self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) def fill_slot_data(self) -> Dict[str, Any]: - return self.options.as_dict( + slot_data: Dict[str, Any] = self.options.as_dict( "goal", - "quick_port_foozle", + "starting_location", "start_with_hotspot_items", + "craftable_spells", "deathsanity", + "landmarksanity", "grant_missable_location_checks", - "starting_location", ) + slot_data["initial_totemizer_destination"] = self.initial_totemizer_destination.value + + return slot_data + def get_filler_item_name(self) -> str: return self.random.choice(self.filler_item_names) + + def _prepare_locked_items( + self, + ) -> Dict[ZorkGrandInquisitorLocations, ZorkGrandInquisitorItems]: + locked_items: Dict[ZorkGrandInquisitorLocations, ZorkGrandInquisitorItems] = dict() + + # Goal Items + if self.goal == ZorkGrandInquisitorGoals.THREE_ARTIFACTS: + locked_items[ + ZorkGrandInquisitorLocations.COME_TO_PAPA_YOU_NUT + ] = ZorkGrandInquisitorItems.COCONUT_OF_QUENDOR + + locked_items[ + ZorkGrandInquisitorLocations.GOOD_PUZZLE_SMART_BROG + ] = ZorkGrandInquisitorItems.SKULL_OF_YORUK + + locked_items[ + ZorkGrandInquisitorLocations.YOU_LOSE_MUFFET_ANTE_UP + ] = ZorkGrandInquisitorItems.CUBE_OF_FOUNDATION + + # Craftable Spells + if self.craftable_spells == ZorkGrandInquisitorCraftableSpellBehaviors.VANILLA: + if ZorkGrandInquisitorItems.SPELL_BEBURTT not in self.starter_kit: + locked_items[ + ZorkGrandInquisitorLocations.IMBUE_BEBURTT + ] = ZorkGrandInquisitorItems.SPELL_BEBURTT + + if ZorkGrandInquisitorItems.SPELL_OBIDIL not in self.starter_kit: + locked_items[ + ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP + ] = ZorkGrandInquisitorItems.SPELL_OBIDIL + + if ZorkGrandInquisitorItems.SPELL_SNAVIG not in self.starter_kit: + locked_items[ + ZorkGrandInquisitorLocations.SNAVIG_REPAIRED + ] = ZorkGrandInquisitorItems.SPELL_SNAVIG + + if ZorkGrandInquisitorItems.SPELL_YASTARD not in self.starter_kit: + locked_items[ + ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU + ] = ZorkGrandInquisitorItems.SPELL_YASTARD + elif self.craftable_spells == ZorkGrandInquisitorCraftableSpellBehaviors.ANY_SPELL: + allowable_spells: Set[ZorkGrandInquisitorItems] = { + ZorkGrandInquisitorItems.SPELL_BEBURTT, + ZorkGrandInquisitorItems.SPELL_GLORF, + ZorkGrandInquisitorItems.SPELL_GOLGATEM, + ZorkGrandInquisitorItems.SPELL_IGRAM, + ZorkGrandInquisitorItems.SPELL_KENDALL, + ZorkGrandInquisitorItems.SPELL_OBIDIL, + ZorkGrandInquisitorItems.SPELL_NARWILE, + ZorkGrandInquisitorItems.SPELL_REZROV, + ZorkGrandInquisitorItems.SPELL_SNAVIG, + ZorkGrandInquisitorItems.SPELL_THROCK, + ZorkGrandInquisitorItems.SPELL_YASTARD, + } + + allowable_spells -= set(self.starter_kit) + + allowable_spells_yastard: List[str] = sorted([item.value for item in allowable_spells]) + + spell_yastard: ZorkGrandInquisitorItems = self.item_name_to_item[ + self.random.choice(allowable_spells_yastard) + ] + + locked_items[ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU] = spell_yastard + + allowable_spells -= {spell_yastard} + + if self.starting_location != ZorkGrandInquisitorStartingLocations.SPELL_LAB: + allowable_spells -= { + ZorkGrandInquisitorItems.SPELL_GOLGATEM, + ZorkGrandInquisitorItems.SPELL_REZROV, + } + + allowable_spells_spell_lab: List[str] = sorted( + [item.value for item in allowable_spells] + ) + + spells_to_lock: List[ZorkGrandInquisitorItems] = [ + self.item_name_to_item[item] + for item in self.random.sample(allowable_spells_spell_lab, 3) + ] + + locked_items[ZorkGrandInquisitorLocations.IMBUE_BEBURTT] = spells_to_lock[0] + locked_items[ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP] = spells_to_lock[1] + locked_items[ZorkGrandInquisitorLocations.SNAVIG_REPAIRED] = spells_to_lock[2] + + return locked_items + + def _select_initial_totemizer_destination(self) -> ZorkGrandInquisitorItems: + return self.random.choice(( + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_SURFACE_OF_MERZ, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_NEWARK_NEW_JERSEY, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY, + ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL, + ))