diff --git a/WebHostLib/templates/playerOptions/playerOptions.html b/WebHostLib/templates/playerOptions/playerOptions.html
index 7e2f0ee11cb4..5e82342126f7 100644
--- a/WebHostLib/templates/playerOptions/playerOptions.html
+++ b/WebHostLib/templates/playerOptions/playerOptions.html
@@ -93,8 +93,10 @@
{% elif issubclass(option, Options.FreeText) %}
{{ inputs.FreeText(option_name, option) }}
- {% elif issubclass(option, Options.ItemDict) and option.verify_item_name %}
- {{ inputs.ItemDict(option_name, option) }}
+ {% elif issubclass(option, Options.OptionCounter) and (
+ option.valid_keys or option.verify_item_name or option.verify_location_name
+ ) %}
+ {{ inputs.OptionCounter(option_name, option) }}
{% elif issubclass(option, Options.OptionList) and option.valid_keys %}
{{ inputs.OptionList(option_name, option) }}
@@ -133,8 +135,10 @@
{% elif issubclass(option, Options.FreeText) %}
{{ inputs.FreeText(option_name, option) }}
- {% elif issubclass(option, Options.ItemDict) and option.verify_item_name %}
- {{ inputs.ItemDict(option_name, option) }}
+ {% elif issubclass(option, Options.OptionCounter) and (
+ option.valid_keys or option.verify_item_name or option.verify_location_name
+ ) %}
+ {{ inputs.OptionCounter(option_name, option) }}
{% elif issubclass(option, Options.OptionList) and option.valid_keys %}
{{ inputs.OptionList(option_name, option) }}
diff --git a/WebHostLib/templates/weightedOptions/macros.html b/WebHostLib/templates/weightedOptions/macros.html
index d18d0f0b8957..89ba0a0e6e7a 100644
--- a/WebHostLib/templates/weightedOptions/macros.html
+++ b/WebHostLib/templates/weightedOptions/macros.html
@@ -113,9 +113,18 @@
{{ TextChoice(option_name, option) }}
{% endmacro %}
-{% macro ItemDict(option_name, option, world) %}
+{% macro OptionCounter(option_name, option, world) %}
+ {% set relevant_keys = option.valid_keys %}
+ {% if not relevant_keys %}
+ {% if option.verify_item_name %}
+ {% set relevant_keys = world.item_names %}
+ {% elif option.verify_location_name %}
+ {% set relevant_keys = world.location_names %}
+ {% endif %}
+ {% endif %}
+
- {% for item_name in (option.valid_keys|sort if (option.valid_keys|length > 0) else world.item_names|sort) %}
+ {% for item_name in (relevant_keys if relevant_keys is ordered else relevant_keys|sort) %}
{{ item_name }}
{{ option.display_name|default(option_name) }}
{% elif issubclass(option, Options.FreeText) %}
{{ inputs.FreeText(option_name, option) }}
- {% elif issubclass(option, Options.ItemDict) and option.verify_item_name %}
- {{ inputs.ItemDict(option_name, option, world) }}
+ {% elif issubclass(option, Options.OptionCounter) and (
+ option.valid_keys or option.verify_item_name or option.verify_location_name
+ ) %}
+ {{ inputs.OptionCounter(option_name, option, world) }}
{% elif issubclass(option, Options.OptionList) and option.valid_keys %}
{{ inputs.OptionList(option_name, option) }}
diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS
index 29de6bbfb627..88b5060dcc61 100644
--- a/docs/CODEOWNERS
+++ b/docs/CODEOWNERS
@@ -232,10 +232,6 @@
# Zillion
/worlds/zillion/ @beauxq
-# Zork Grand Inquisitor
-/worlds/zork_grand_inquisitor/ @nbrochu
-
-
## Active Unmaintained Worlds
# The following worlds in this repo are currently unmaintained, but currently still work in core. If any update breaks
diff --git a/docs/options api.md b/docs/options api.md
index 453cbc7e2d36..037b9edb8711 100644
--- a/docs/options api.md
+++ b/docs/options api.md
@@ -352,8 +352,15 @@ template. If you set a [Schema](https://pypi.org/project/schema/) on the class w
options system will automatically validate the user supplied data against the schema to ensure it's in the correct
format.
+### OptionCounter
+This is a special case of OptionDict where the dictionary values can only be integers.
+It returns a [collections.Counter](https://docs.python.org/3/library/collections.html#collections.Counter).
+This means that if you access a key that isn't present, its value will be 0.
+The upside of using an OptionCounter (instead of an OptionDict with integer values) is that an OptionCounter can be
+displayed on the Options page on WebHost.
+
### ItemDict
-Like OptionDict, except this will verify that every key in the dictionary is a valid name for an item for your world.
+An OptionCounter that will verify that every key in the dictionary is a valid name for an item for your world.
### OptionList
This option defines a List, where the user can add any number of strings to said list, allowing duplicate values. You
diff --git a/test/general/test_ids.py b/test/general/test_ids.py
index e51a070c1fd7..ad8aad11d15c 100644
--- a/test/general/test_ids.py
+++ b/test/general/test_ids.py
@@ -47,13 +47,39 @@ def test_duplicate_item_ids(self):
"""Test that a game doesn't have item id overlap within its own datapackage"""
for gamename, world_type in AutoWorldRegister.world_types.items():
with self.subTest(game=gamename):
- self.assertEqual(len(world_type.item_id_to_name), len(world_type.item_name_to_id))
+ len_item_id_to_name = len(world_type.item_id_to_name)
+ len_item_name_to_id = len(world_type.item_name_to_id)
+
+ if len_item_id_to_name != len_item_name_to_id:
+ self.assertCountEqual(
+ world_type.item_id_to_name.values(),
+ world_type.item_name_to_id.keys(),
+ "\nThese items have overlapping ids with other items in its own world")
+ self.assertCountEqual(
+ world_type.item_id_to_name.keys(),
+ world_type.item_name_to_id.values(),
+ "\nThese items have overlapping names with other items in its own world")
+
+ self.assertEqual(len_item_id_to_name, len_item_name_to_id)
def test_duplicate_location_ids(self):
"""Test that a game doesn't have location id overlap within its own datapackage"""
for gamename, world_type in AutoWorldRegister.world_types.items():
with self.subTest(game=gamename):
- self.assertEqual(len(world_type.location_id_to_name), len(world_type.location_name_to_id))
+ len_location_id_to_name = len(world_type.location_id_to_name)
+ len_location_name_to_id = len(world_type.location_name_to_id)
+
+ if len_location_id_to_name != len_location_name_to_id:
+ self.assertCountEqual(
+ world_type.location_id_to_name.values(),
+ world_type.location_name_to_id.keys(),
+ "\nThese locations have overlapping ids with other locations in its own world")
+ self.assertCountEqual(
+ world_type.location_id_to_name.keys(),
+ world_type.location_name_to_id.values(),
+ "\nThese locations have overlapping names with other locations in its own world")
+
+ self.assertEqual(len_location_id_to_name, len_location_name_to_id)
def test_postgen_datapackage(self):
"""Generates a solo multiworld and checks that the datapackage is still valid"""
diff --git a/test/general/test_items.py b/test/general/test_items.py
index f9488e1b250b..1b376b28385c 100644
--- a/test/general/test_items.py
+++ b/test/general/test_items.py
@@ -1,7 +1,11 @@
import unittest
+from argparse import Namespace
+from typing import Type
-from BaseClasses import CollectionState
-from worlds.AutoWorld import AutoWorldRegister, call_all
+from BaseClasses import CollectionState, MultiWorld
+from Fill import distribute_items_restrictive
+from Options import ItemLinks
+from worlds.AutoWorld import AutoWorldRegister, World, call_all
from . import setup_solo_multiworld
@@ -83,6 +87,47 @@ def test_items_in_datapackage(self):
multiworld = setup_solo_multiworld(world_type)
for item in multiworld.itempool:
self.assertIn(item.name, world_type.item_name_to_id)
+
+ def test_item_links(self) -> None:
+ """
+ Tests item link creation by creating a multiworld of 2 worlds for every game and linking their items together.
+ """
+ def setup_link_multiworld(world: Type[World], link_replace: bool) -> None:
+ multiworld = MultiWorld(2)
+ multiworld.game = {1: world.game, 2: world.game}
+ multiworld.player_name = {1: "Linker 1", 2: "Linker 2"}
+ multiworld.set_seed()
+ item_link_group = [{
+ "name": "ItemLinkTest",
+ "item_pool": ["Everything"],
+ "link_replacement": link_replace,
+ "replacement_item": None,
+ }]
+ args = Namespace()
+ for name, option in world.options_dataclass.type_hints.items():
+ setattr(args, name, {1: option.from_any(option.default), 2: option.from_any(option.default)})
+ setattr(args, "item_links",
+ {1: ItemLinks.from_any(item_link_group), 2: ItemLinks.from_any(item_link_group)})
+ multiworld.set_options(args)
+ multiworld.set_item_links()
+ # groups get added to state during its constructor so this has to be after item links are set
+ multiworld.state = CollectionState(multiworld)
+ gen_steps = ("generate_early", "create_regions", "create_items", "set_rules", "connect_entrances", "generate_basic")
+ for step in gen_steps:
+ call_all(multiworld, step)
+ # link the items together and attempt to fill
+ multiworld.link_items()
+ multiworld._all_state = None
+ call_all(multiworld, "pre_fill")
+ distribute_items_restrictive(multiworld)
+ call_all(multiworld, "post_fill")
+ self.assertTrue(multiworld.can_beat_game(CollectionState(multiworld)), f"seed = {multiworld.seed}")
+
+ for game_name, world_type in AutoWorldRegister.world_types.items():
+ with self.subTest("Can generate with link replacement", game=game_name):
+ setup_link_multiworld(world_type, True)
+ with self.subTest("Can generate without link replacement", game=game_name):
+ setup_link_multiworld(world_type, False)
def test_itempool_not_modified(self):
"""Test that worlds don't modify the itempool after `create_items`"""
diff --git a/test/webhost/test_option_presets.py b/test/webhost/test_option_presets.py
index 7105c7f80593..efacddb22e6a 100644
--- a/test/webhost/test_option_presets.py
+++ b/test/webhost/test_option_presets.py
@@ -2,7 +2,7 @@
from BaseClasses import PlandoOptions
from worlds import AutoWorldRegister
-from Options import ItemDict, NamedRange, NumericOption, OptionList, OptionSet
+from Options import OptionCounter, NamedRange, NumericOption, OptionList, OptionSet
class TestOptionPresets(unittest.TestCase):
@@ -19,7 +19,7 @@ def test_option_presets_have_valid_options(self):
# pass in all plando options in case a preset wants to require certain plando options
# for some reason
option.verify(world_type, "Test Player", PlandoOptions(sum(PlandoOptions)))
- supported_types = [NumericOption, OptionSet, OptionList, ItemDict]
+ supported_types = [NumericOption, OptionSet, OptionList, OptionCounter]
if not any([issubclass(option.__class__, t) for t in supported_types]):
self.fail(f"'{option_name}' in preset '{preset_name}' for game '{game_name}' "
f"is not a supported type for webhost. "
diff --git a/worlds/alttp/ItemPool.py b/worlds/alttp/ItemPool.py
index 0bcc189f9c3b..57ad01b9e408 100644
--- a/worlds/alttp/ItemPool.py
+++ b/worlds/alttp/ItemPool.py
@@ -490,12 +490,16 @@ def cut_item(items, item_to_cut, minimum_items):
# Otherwise, logic has some branches where having 4 hearts is one possible requirement (of several alternatives)
# rather than making all hearts/heart pieces progression items (which slows down generation considerably)
# We mark one random heart container as an advancement item (or 4 heart pieces in expert mode)
- if world.options.item_pool in ['easy', 'normal', 'hard'] and not (multiworld.custom and multiworld.customitemarray[30] == 0):
- next(item for item in items if item.name == 'Boss Heart Container').classification = ItemClassification.progression
- elif world.options.item_pool in ['expert'] and not (multiworld.custom and multiworld.customitemarray[29] < 4):
+ try:
+ next(item for item in items if item.name == 'Boss Heart Container').classification \
+ |= ItemClassification.progression
+ except StopIteration:
adv_heart_pieces = (item for item in items if item.name == 'Piece of Heart')
for i in range(4):
- next(adv_heart_pieces).classification = ItemClassification.progression
+ try:
+ next(adv_heart_pieces).classification |= ItemClassification.progression
+ except StopIteration:
+ break # logically health tanking is an option, so rules should still resolve to something beatable
world.required_medallions = (world.options.misery_mire_medallion.current_key.title(),
world.options.turtle_rock_medallion.current_key.title())
diff --git a/worlds/lingo/options.py b/worlds/lingo/options.py
index f9d04f68fc8e..faf5316e903c 100644
--- a/worlds/lingo/options.py
+++ b/worlds/lingo/options.py
@@ -2,7 +2,7 @@
from schema import And, Schema
-from Options import Toggle, Choice, DefaultOnToggle, Range, PerGameCommonOptions, StartInventoryPool, OptionDict, \
+from Options import Toggle, Choice, DefaultOnToggle, Range, PerGameCommonOptions, StartInventoryPool, OptionCounter, \
OptionGroup
from .items import TRAP_ITEMS
@@ -222,13 +222,14 @@ class TrapPercentage(Range):
default = 20
-class TrapWeights(OptionDict):
+class TrapWeights(OptionCounter):
"""Specify the distribution of traps that should be placed into the pool.
If you don't want a specific type of trap, set the weight to zero.
"""
display_name = "Trap Weights"
- schema = Schema({trap_name: And(int, lambda n: n >= 0) for trap_name in TRAP_ITEMS})
+ valid_keys = TRAP_ITEMS
+ min = 0
default = {trap_name: 1 for trap_name in TRAP_ITEMS}
diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py
index 4b1ff2ad5673..4257f856c83d 100644
--- a/worlds/stardew_valley/rules.py
+++ b/worlds/stardew_valley/rules.py
@@ -3,7 +3,7 @@
from typing import List, Dict, Set
from BaseClasses import MultiWorld, CollectionState
-from worlds.generic import Rules as MultiWorldRules
+from worlds.generic.Rules import set_rule
from . import locations
from .bundles.bundle_room import BundleRoom
from .content import StardewContent
@@ -98,28 +98,28 @@ def set_rules(world):
def set_isolated_locations_rules(logic: StardewLogic, multiworld, player):
- MultiWorldRules.add_rule(multiworld.get_location("Old Master Cannoli", player),
- logic.has(Fruit.sweet_gem_berry))
- MultiWorldRules.add_rule(multiworld.get_location("Galaxy Sword Shrine", player),
- logic.has("Prismatic Shard"))
- MultiWorldRules.add_rule(multiworld.get_location("Krobus Stardrop", player),
- logic.money.can_spend(20000))
- MultiWorldRules.add_rule(multiworld.get_location("Demetrius's Breakthrough", player),
- logic.money.can_have_earned_total(25000))
- MultiWorldRules.add_rule(multiworld.get_location("Pot Of Gold", player),
- logic.season.has(Season.spring))
+ set_rule(multiworld.get_location("Old Master Cannoli", player),
+ logic.has(Fruit.sweet_gem_berry))
+ set_rule(multiworld.get_location("Galaxy Sword Shrine", player),
+ logic.has("Prismatic Shard"))
+ set_rule(multiworld.get_location("Krobus Stardrop", player),
+ logic.money.can_spend(20000))
+ set_rule(multiworld.get_location("Demetrius's Breakthrough", player),
+ logic.money.can_have_earned_total(25000))
+ set_rule(multiworld.get_location("Pot Of Gold", player),
+ logic.season.has(Season.spring))
def set_tool_rules(logic: StardewLogic, multiworld, player, content: StardewContent):
if not content.features.tool_progression.is_progressive:
return
- MultiWorldRules.add_rule(multiworld.get_location("Purchase Fiberglass Rod", player),
- (logic.skill.has_level(Skill.fishing, 2) & logic.money.can_spend(1800)))
- MultiWorldRules.add_rule(multiworld.get_location("Purchase Iridium Rod", player),
- (logic.skill.has_level(Skill.fishing, 6) & logic.money.can_spend(7500)))
+ set_rule(multiworld.get_location("Purchase Fiberglass Rod", player),
+ (logic.skill.has_level(Skill.fishing, 2) & logic.money.can_spend(1800)))
+ set_rule(multiworld.get_location("Purchase Iridium Rod", player),
+ (logic.skill.has_level(Skill.fishing, 6) & logic.money.can_spend(7500)))
- MultiWorldRules.add_rule(multiworld.get_location("Copper Pan Cutscene", player), logic.received("Glittering Boulder Removed"))
+ set_rule(multiworld.get_location("Copper Pan Cutscene", player), logic.received("Glittering Boulder Removed"))
materials = [None, "Copper", "Iron", "Gold", "Iridium"]
tool = [Tool.hoe, Tool.pickaxe, Tool.axe, Tool.watering_can, Tool.trash_can, Tool.pan]
@@ -127,7 +127,7 @@ def set_tool_rules(logic: StardewLogic, multiworld, player, content: StardewCont
if previous is None:
continue
tool_upgrade_location = multiworld.get_location(f"{material} {tool} Upgrade", player)
- MultiWorldRules.set_rule(tool_upgrade_location, logic.tool.has_tool(tool, previous))
+ set_rule(tool_upgrade_location, logic.tool.has_tool(tool, previous))
def set_building_rules(logic: StardewLogic, multiworld, player, content: StardewContent):
@@ -141,8 +141,8 @@ def set_building_rules(logic: StardewLogic, multiworld, player, content: Stardew
location_name = building_progression.to_location_name(building.name)
- MultiWorldRules.set_rule(multiworld.get_location(location_name, player),
- logic.building.can_build(building.name))
+ set_rule(multiworld.get_location(location_name, player),
+ logic.building.can_build(building.name))
def set_bundle_rules(bundle_rooms: List[BundleRoom], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions):
@@ -160,11 +160,11 @@ def set_bundle_rules(bundle_rooms: List[BundleRoom], logic: StardewLogic, multiw
previous_bundle_name = f"Raccoon Request {num - 1}"
bundle_rules = bundle_rules & logic.region.can_reach_location(previous_bundle_name)
room_rules.append(bundle_rules)
- MultiWorldRules.set_rule(location, bundle_rules)
+ set_rule(location, bundle_rules)
if bundle_room.name == CCRoom.abandoned_joja_mart or bundle_room.name == CCRoom.raccoon_requests:
continue
room_location = f"Complete {bundle_room.name}"
- MultiWorldRules.add_rule(multiworld.get_location(room_location, player), And(*room_rules))
+ set_rule(multiworld.get_location(room_location, player), And(*room_rules))
def set_skills_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, content: StardewContent):
@@ -176,12 +176,12 @@ def set_skills_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, c
for level, level_name in skill_progression.get_randomized_level_names_by_level(skill):
rule = logic.skill.can_earn_level(skill.name, level)
location = multiworld.get_location(level_name, player)
- MultiWorldRules.set_rule(location, rule)
+ set_rule(location, rule)
if skill_progression.is_mastery_randomized(skill):
rule = logic.skill.can_earn_mastery(skill.name)
location = multiworld.get_location(skill.mastery_name, player)
- MultiWorldRules.set_rule(location, rule)
+ set_rule(location, rule)
def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions):
@@ -339,20 +339,20 @@ def set_ginger_island_rules(logic: StardewLogic, multiworld, player, world_optio
set_boat_repair_rules(logic, multiworld, player)
set_island_parrot_rules(logic, multiworld, player)
- MultiWorldRules.add_rule(multiworld.get_location("Open Professor Snail Cave", player),
- logic.has(Bomb.cherry_bomb))
- MultiWorldRules.add_rule(multiworld.get_location("Complete Island Field Office", player),
- logic.walnut.can_complete_field_office())
+ set_rule(multiworld.get_location("Open Professor Snail Cave", player),
+ logic.has(Bomb.cherry_bomb))
+ set_rule(multiworld.get_location("Complete Island Field Office", player),
+ logic.walnut.can_complete_field_office())
set_walnut_rules(logic, multiworld, player, world_options)
def set_boat_repair_rules(logic: StardewLogic, multiworld, player):
- MultiWorldRules.add_rule(multiworld.get_location("Repair Boat Hull", player),
- logic.has(Material.hardwood))
- MultiWorldRules.add_rule(multiworld.get_location("Repair Boat Anchor", player),
- logic.has(MetalBar.iridium))
- MultiWorldRules.add_rule(multiworld.get_location("Repair Ticket Machine", player),
- logic.has(ArtisanGood.battery_pack))
+ set_rule(multiworld.get_location("Repair Boat Hull", player),
+ logic.has(Material.hardwood))
+ set_rule(multiworld.get_location("Repair Boat Anchor", player),
+ logic.has(MetalBar.iridium))
+ set_rule(multiworld.get_location("Repair Ticket Machine", player),
+ logic.has(ArtisanGood.battery_pack))
def set_island_entrances_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions):
@@ -403,29 +403,29 @@ def set_island_parrot_rules(logic: StardewLogic, multiworld, player):
has_5_walnut = logic.walnut.has_walnut(15)
has_10_walnut = logic.walnut.has_walnut(40)
has_20_walnut = logic.walnut.has_walnut(60)
- MultiWorldRules.add_rule(multiworld.get_location("Leo's Parrot", player),
- has_walnut)
- MultiWorldRules.add_rule(multiworld.get_location("Island West Turtle", player),
- has_10_walnut & logic.received("Island North Turtle"))
- MultiWorldRules.add_rule(multiworld.get_location("Island Farmhouse", player),
- has_20_walnut)
- MultiWorldRules.add_rule(multiworld.get_location("Island Mailbox", player),
- has_5_walnut & logic.received("Island Farmhouse"))
- MultiWorldRules.add_rule(multiworld.get_location(Transportation.farm_obelisk, player),
- has_20_walnut & logic.received("Island Mailbox"))
- MultiWorldRules.add_rule(multiworld.get_location("Dig Site Bridge", player),
- has_10_walnut & logic.received("Island West Turtle"))
- MultiWorldRules.add_rule(multiworld.get_location("Island Trader", player),
- has_10_walnut & logic.received("Island Farmhouse"))
- MultiWorldRules.add_rule(multiworld.get_location("Volcano Bridge", player),
- has_5_walnut & logic.received("Island West Turtle") &
- logic.region.can_reach(Region.volcano_floor_10))
- MultiWorldRules.add_rule(multiworld.get_location("Volcano Exit Shortcut", player),
- has_5_walnut & logic.received("Island West Turtle"))
- MultiWorldRules.add_rule(multiworld.get_location("Island Resort", player),
- has_20_walnut & logic.received("Island Farmhouse"))
- MultiWorldRules.add_rule(multiworld.get_location(Transportation.parrot_express, player),
- has_10_walnut)
+ set_rule(multiworld.get_location("Leo's Parrot", player),
+ has_walnut)
+ set_rule(multiworld.get_location("Island West Turtle", player),
+ has_10_walnut & logic.received("Island North Turtle"))
+ set_rule(multiworld.get_location("Island Farmhouse", player),
+ has_20_walnut)
+ set_rule(multiworld.get_location("Island Mailbox", player),
+ has_5_walnut & logic.received("Island Farmhouse"))
+ set_rule(multiworld.get_location(Transportation.farm_obelisk, player),
+ has_20_walnut & logic.received("Island Mailbox"))
+ set_rule(multiworld.get_location("Dig Site Bridge", player),
+ has_10_walnut & logic.received("Island West Turtle"))
+ set_rule(multiworld.get_location("Island Trader", player),
+ has_10_walnut & logic.received("Island Farmhouse"))
+ set_rule(multiworld.get_location("Volcano Bridge", player),
+ has_5_walnut & logic.received("Island West Turtle") &
+ logic.region.can_reach(Region.volcano_floor_10))
+ set_rule(multiworld.get_location("Volcano Exit Shortcut", player),
+ has_5_walnut & logic.received("Island West Turtle"))
+ set_rule(multiworld.get_location("Island Resort", player),
+ has_20_walnut & logic.received("Island Farmhouse"))
+ set_rule(multiworld.get_location(Transportation.parrot_express, player),
+ has_10_walnut)
def set_walnut_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions):
@@ -442,27 +442,27 @@ def set_walnut_puzzle_rules(logic: StardewLogic, multiworld, player, world_optio
if WalnutsanityOptionName.puzzles not in world_options.walnutsanity:
return
- MultiWorldRules.add_rule(multiworld.get_location("Open Golden Coconut", player), logic.has(Geode.golden_coconut))
- MultiWorldRules.add_rule(multiworld.get_location("Banana Altar", player), logic.has(Fruit.banana))
- MultiWorldRules.add_rule(multiworld.get_location("Leo's Tree", player), logic.tool.has_tool(Tool.axe))
- MultiWorldRules.add_rule(multiworld.get_location("Gem Birds Shrine", player), logic.has(Mineral.amethyst) & logic.has(Mineral.aquamarine) &
- logic.has(Mineral.emerald) & logic.has(Mineral.ruby) & logic.has(Mineral.topaz) &
- logic.region.can_reach_all((Region.island_north, Region.island_west, Region.island_east, Region.island_south)))
- MultiWorldRules.add_rule(multiworld.get_location("Gourmand Frog Melon", player), logic.has(Fruit.melon) & logic.region.can_reach(Region.island_west))
- MultiWorldRules.add_rule(multiworld.get_location("Gourmand Frog Wheat", player), logic.has(Vegetable.wheat) &
- logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Gourmand Frog Melon"))
- MultiWorldRules.add_rule(multiworld.get_location("Gourmand Frog Garlic", player), logic.has(Vegetable.garlic) &
- logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Gourmand Frog Wheat"))
- MultiWorldRules.add_rule(multiworld.get_location("Whack A Mole", player), logic.tool.has_tool(Tool.watering_can, ToolMaterial.iridium))
- MultiWorldRules.add_rule(multiworld.get_location("Complete Large Animal Collection", player), logic.walnut.can_complete_large_animal_collection())
- MultiWorldRules.add_rule(multiworld.get_location("Complete Snake Collection", player), logic.walnut.can_complete_snake_collection())
- MultiWorldRules.add_rule(multiworld.get_location("Complete Mummified Frog Collection", player), logic.walnut.can_complete_frog_collection())
- MultiWorldRules.add_rule(multiworld.get_location("Complete Mummified Bat Collection", player), logic.walnut.can_complete_bat_collection())
- MultiWorldRules.add_rule(multiworld.get_location("Purple Flowers Island Survey", player), logic.walnut.can_start_field_office)
- MultiWorldRules.add_rule(multiworld.get_location("Purple Starfish Island Survey", player), logic.walnut.can_start_field_office)
- MultiWorldRules.add_rule(multiworld.get_location("Protruding Tree Walnut", player), logic.combat.has_slingshot)
- MultiWorldRules.add_rule(multiworld.get_location("Starfish Tide Pool", player), logic.tool.has_fishing_rod(1))
- MultiWorldRules.add_rule(multiworld.get_location("Mermaid Song", player), logic.has(Furniture.flute_block))
+ set_rule(multiworld.get_location("Open Golden Coconut", player), logic.has(Geode.golden_coconut))
+ set_rule(multiworld.get_location("Banana Altar", player), logic.has(Fruit.banana))
+ set_rule(multiworld.get_location("Leo's Tree", player), logic.tool.has_tool(Tool.axe))
+ set_rule(multiworld.get_location("Gem Birds Shrine", player), logic.has(Mineral.amethyst) & logic.has(Mineral.aquamarine) &
+ logic.has(Mineral.emerald) & logic.has(Mineral.ruby) & logic.has(Mineral.topaz) &
+ logic.region.can_reach_all((Region.island_north, Region.island_west, Region.island_east, Region.island_south)))
+ set_rule(multiworld.get_location("Gourmand Frog Melon", player), logic.has(Fruit.melon) & logic.region.can_reach(Region.island_west))
+ set_rule(multiworld.get_location("Gourmand Frog Wheat", player), logic.has(Vegetable.wheat) &
+ logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Gourmand Frog Melon"))
+ set_rule(multiworld.get_location("Gourmand Frog Garlic", player), logic.has(Vegetable.garlic) &
+ logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Gourmand Frog Wheat"))
+ set_rule(multiworld.get_location("Whack A Mole", player), logic.tool.has_tool(Tool.watering_can, ToolMaterial.iridium))
+ set_rule(multiworld.get_location("Complete Large Animal Collection", player), logic.walnut.can_complete_large_animal_collection())
+ set_rule(multiworld.get_location("Complete Snake Collection", player), logic.walnut.can_complete_snake_collection())
+ set_rule(multiworld.get_location("Complete Mummified Frog Collection", player), logic.walnut.can_complete_frog_collection())
+ set_rule(multiworld.get_location("Complete Mummified Bat Collection", player), logic.walnut.can_complete_bat_collection())
+ set_rule(multiworld.get_location("Purple Flowers Island Survey", player), logic.walnut.can_start_field_office)
+ set_rule(multiworld.get_location("Purple Starfish Island Survey", player), logic.walnut.can_start_field_office)
+ set_rule(multiworld.get_location("Protruding Tree Walnut", player), logic.combat.has_slingshot)
+ set_rule(multiworld.get_location("Starfish Tide Pool", player), logic.tool.has_fishing_rod(1))
+ set_rule(multiworld.get_location("Mermaid Song", player), logic.has(Furniture.flute_block))
def set_walnut_bushes_rules(logic, multiworld, player, world_options):
@@ -482,20 +482,20 @@ def set_walnut_dig_spot_rules(logic, multiworld, player, world_options):
rule = rule & logic.has(Forageable.journal_scrap)
if "Starfish Diamond" in dig_spot_walnut.name:
rule = rule & logic.tool.has_tool(Tool.pickaxe, ToolMaterial.iron)
- MultiWorldRules.set_rule(multiworld.get_location(dig_spot_walnut.name, player), rule)
+ set_rule(multiworld.get_location(dig_spot_walnut.name, player), rule)
def set_walnut_repeatable_rules(logic, multiworld, player, world_options):
if WalnutsanityOptionName.repeatables not in world_options.walnutsanity:
return
for i in range(1, 6):
- MultiWorldRules.set_rule(multiworld.get_location(f"Fishing Walnut {i}", player), logic.tool.has_fishing_rod(1))
- MultiWorldRules.set_rule(multiworld.get_location(f"Harvesting Walnut {i}", player), logic.skill.can_get_farming_xp)
- MultiWorldRules.set_rule(multiworld.get_location(f"Mussel Node Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe))
- MultiWorldRules.set_rule(multiworld.get_location(f"Volcano Rocks Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe))
- MultiWorldRules.set_rule(multiworld.get_location(f"Volcano Monsters Walnut {i}", player), logic.combat.has_galaxy_weapon)
- MultiWorldRules.set_rule(multiworld.get_location(f"Volcano Crates Walnut {i}", player), logic.combat.has_any_weapon)
- MultiWorldRules.set_rule(multiworld.get_location(f"Tiger Slime Walnut", player), logic.monster.can_kill(Monster.tiger_slime))
+ set_rule(multiworld.get_location(f"Fishing Walnut {i}", player), logic.tool.has_fishing_rod(1))
+ set_rule(multiworld.get_location(f"Harvesting Walnut {i}", player), logic.skill.can_get_farming_xp)
+ set_rule(multiworld.get_location(f"Mussel Node Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe))
+ set_rule(multiworld.get_location(f"Volcano Rocks Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe))
+ set_rule(multiworld.get_location(f"Volcano Monsters Walnut {i}", player), logic.combat.has_galaxy_weapon)
+ set_rule(multiworld.get_location(f"Volcano Crates Walnut {i}", player), logic.combat.has_any_weapon)
+ set_rule(multiworld.get_location(f"Tiger Slime Walnut", player), logic.monster.can_kill(Monster.tiger_slime))
def set_cropsanity_rules(logic: StardewLogic, multiworld, player, world_content: StardewContent):
@@ -505,7 +505,7 @@ def set_cropsanity_rules(logic: StardewLogic, multiworld, player, world_content:
for item in world_content.find_tagged_items(ItemTag.CROPSANITY):
location = world_content.features.cropsanity.to_location_name(item.name)
harvest_sources = (source for source in item.sources if isinstance(source, (HarvestFruitTreeSource, HarvestCropSource)))
- MultiWorldRules.set_rule(multiworld.get_location(location, player), logic.source.has_access_to_any(harvest_sources))
+ set_rule(multiworld.get_location(location, player), logic.source.has_access_to_any(harvest_sources))
def set_story_quests_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions):
@@ -513,8 +513,8 @@ def set_story_quests_rules(all_location_names: Set[str], logic: StardewLogic, mu
return
for quest in locations.locations_by_tag[LocationTags.STORY_QUEST]:
if quest.name in all_location_names and (quest.mod_name is None or quest.mod_name in world_options.mods):
- MultiWorldRules.set_rule(multiworld.get_location(quest.name, player),
- logic.registry.quest_rules[quest.name])
+ set_rule(multiworld.get_location(quest.name, player),
+ logic.registry.quest_rules[quest.name])
def set_special_order_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player,
@@ -524,7 +524,7 @@ def set_special_order_rules(all_location_names: Set[str], logic: StardewLogic, m
for board_order in locations.locations_by_tag[LocationTags.SPECIAL_ORDER_BOARD]:
if board_order.name in all_location_names:
order_rule = board_rule & logic.registry.special_order_rules[board_order.name]
- MultiWorldRules.set_rule(multiworld.get_location(board_order.name, player), order_rule)
+ set_rule(multiworld.get_location(board_order.name, player), order_rule)
if world_options.exclude_ginger_island == ExcludeGingerIsland.option_true:
return
@@ -533,7 +533,7 @@ def set_special_order_rules(all_location_names: Set[str], logic: StardewLogic, m
for qi_order in locations.locations_by_tag[LocationTags.SPECIAL_ORDER_QI]:
if qi_order.name in all_location_names:
order_rule = qi_rule & logic.registry.special_order_rules[qi_order.name]
- MultiWorldRules.set_rule(multiworld.get_location(qi_order.name, player), order_rule)
+ set_rule(multiworld.get_location(qi_order.name, player), order_rule)
help_wanted_prefix = "Help Wanted:"
@@ -565,22 +565,22 @@ def set_help_wanted_quests_rules(logic: StardewLogic, multiworld, player, world_
def set_help_wanted_delivery_rule(multiworld, player, month_rule, quest_number):
location_name = f"{help_wanted_prefix} {item_delivery} {quest_number}"
- MultiWorldRules.set_rule(multiworld.get_location(location_name, player), month_rule)
+ set_rule(multiworld.get_location(location_name, player), month_rule)
def set_help_wanted_gathering_rule(multiworld, player, month_rule, quest_number):
location_name = f"{help_wanted_prefix} {gathering} {quest_number}"
- MultiWorldRules.set_rule(multiworld.get_location(location_name, player), month_rule)
+ set_rule(multiworld.get_location(location_name, player), month_rule)
def set_help_wanted_fishing_rule(multiworld, player, month_rule, quest_number):
location_name = f"{help_wanted_prefix} {fishing} {quest_number}"
- MultiWorldRules.set_rule(multiworld.get_location(location_name, player), month_rule)
+ set_rule(multiworld.get_location(location_name, player), month_rule)
def set_help_wanted_slay_monsters_rule(multiworld, player, month_rule, quest_number):
location_name = f"{help_wanted_prefix} {slay_monsters} {quest_number}"
- MultiWorldRules.set_rule(multiworld.get_location(location_name, player), month_rule)
+ set_rule(multiworld.get_location(location_name, player), month_rule)
def set_fishsanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld: MultiWorld, player: int):
@@ -588,8 +588,8 @@ def set_fishsanity_rules(all_location_names: Set[str], logic: StardewLogic, mult
for fish_location in locations.locations_by_tag[LocationTags.FISHSANITY]:
if fish_location.name in all_location_names:
fish_name = fish_location.name[len(fish_prefix):]
- MultiWorldRules.set_rule(multiworld.get_location(fish_location.name, player),
- logic.has(fish_name))
+ set_rule(multiworld.get_location(fish_location.name, player),
+ logic.has(fish_name))
def set_museumsanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld: MultiWorld, player: int,
@@ -612,8 +612,8 @@ def set_museum_individual_donations_rules(all_location_names, logic: StardewLogi
donation_name = museum_location.name[len(museum_prefix):]
required_detectors = counter * 3 // number_donations
rule = logic.museum.can_find_museum_item(all_museum_items_by_name[donation_name]) & logic.received(Wallet.metal_detector, required_detectors)
- MultiWorldRules.set_rule(multiworld.get_location(museum_location.name, player),
- rule)
+ set_rule(multiworld.get_location(museum_location.name, player),
+ rule)
counter += 1
@@ -643,7 +643,7 @@ def set_museum_milestone_rule(logic: StardewLogic, multiworld: MultiWorld, museu
rule = logic.museum.can_find_museum_item(Artifact.ancient_seed) & logic.received(metal_detector, 2)
if rule is None:
return
- MultiWorldRules.set_rule(multiworld.get_location(museum_milestone.name, player), rule)
+ set_rule(multiworld.get_location(museum_milestone.name, player), rule)
def get_museum_item_count_rule(logic: StardewLogic, suffix, milestone_name, accepted_items, donation_func):
@@ -656,14 +656,14 @@ def get_museum_item_count_rule(logic: StardewLogic, suffix, milestone_name, acce
def set_backpack_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions):
if world_options.backpack_progression != BackpackProgression.option_vanilla:
- MultiWorldRules.set_rule(multiworld.get_location("Large Pack", player),
- logic.money.can_spend(2000))
- MultiWorldRules.set_rule(multiworld.get_location("Deluxe Pack", player),
- (logic.money.can_spend(10000) & logic.received("Progressive Backpack")))
+ set_rule(multiworld.get_location("Large Pack", player),
+ logic.money.can_spend(2000))
+ set_rule(multiworld.get_location("Deluxe Pack", player),
+ (logic.money.can_spend(10000) & logic.received("Progressive Backpack")))
if ModNames.big_backpack in world_options.mods:
- MultiWorldRules.set_rule(multiworld.get_location("Premium Pack", player),
- (logic.money.can_spend(150000) &
- logic.received("Progressive Backpack", 2)))
+ set_rule(multiworld.get_location("Premium Pack", player),
+ (logic.money.can_spend(150000) &
+ logic.received("Progressive Backpack", 2)))
def set_festival_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player):
@@ -672,8 +672,8 @@ def set_festival_rules(all_location_names: Set[str], logic: StardewLogic, multiw
festival_locations.extend(locations.locations_by_tag[LocationTags.FESTIVAL_HARD])
for festival in festival_locations:
if festival.name in all_location_names:
- MultiWorldRules.set_rule(multiworld.get_location(festival.name, player),
- logic.registry.festival_rules[festival.name])
+ set_rule(multiworld.get_location(festival.name, player),
+ logic.registry.festival_rules[festival.name])
monster_eradication_prefix = "Monster Eradication: "
@@ -705,7 +705,7 @@ def set_monstersanity_monster_rules(all_location_names: Set[str], logic: Stardew
rule = logic.monster.can_kill_many(logic.monster.all_monsters_by_name[monster_name])
else:
rule = logic.monster.can_kill(logic.monster.all_monsters_by_name[monster_name])
- MultiWorldRules.set_rule(location, rule)
+ set_rule(location, rule)
def set_monstersanity_progressive_category_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player):
@@ -732,7 +732,7 @@ def set_monstersanity_progressive_category_rule(all_location_names: Set[str], lo
rule = logic.monster.can_kill_any(logic.monster.all_monsters_by_category[monster_category], goal_index + 1)
else:
rule = logic.monster.can_kill_any(logic.monster.all_monsters_by_category[monster_category], goal_index * 2)
- MultiWorldRules.set_rule(location, rule)
+ set_rule(location, rule)
def get_monster_eradication_number(location_name, monster_category) -> int:
@@ -753,7 +753,7 @@ def set_monstersanity_category_rules(all_location_names: Set[str], logic: Starde
rule = logic.monster.can_kill_any(logic.monster.all_monsters_by_category[monster_category])
else:
rule = logic.monster.can_kill_any(logic.monster.all_monsters_by_category[monster_category], MAX_MONTHS)
- MultiWorldRules.set_rule(location, rule)
+ set_rule(location, rule)
def set_shipsanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions):
@@ -766,7 +766,7 @@ def set_shipsanity_rules(all_location_names: Set[str], logic: StardewLogic, mult
if location.name not in all_location_names:
continue
item_to_ship = location.name[len(shipsanity_prefix):]
- MultiWorldRules.set_rule(multiworld.get_location(location.name, player), logic.shipping.can_ship(item_to_ship))
+ set_rule(multiworld.get_location(location.name, player), logic.shipping.can_ship(item_to_ship))
def set_cooksanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions):
@@ -781,7 +781,7 @@ def set_cooksanity_rules(all_location_names: Set[str], logic: StardewLogic, mult
recipe_name = location.name[len(cooksanity_prefix):]
recipe = all_cooking_recipes_by_name[recipe_name]
cook_rule = logic.cooking.can_cook(recipe)
- MultiWorldRules.set_rule(multiworld.get_location(location.name, player), cook_rule)
+ set_rule(multiworld.get_location(location.name, player), cook_rule)
def set_chefsanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions):
@@ -796,7 +796,7 @@ def set_chefsanity_rules(all_location_names: Set[str], logic: StardewLogic, mult
recipe_name = location.name[:-len(chefsanity_suffix)]
recipe = all_cooking_recipes_by_name[recipe_name]
learn_rule = logic.cooking.can_learn_recipe(recipe.source)
- MultiWorldRules.set_rule(multiworld.get_location(location.name, player), learn_rule)
+ set_rule(multiworld.get_location(location.name, player), learn_rule)
def set_craftsanity_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions):
@@ -817,7 +817,7 @@ def set_craftsanity_rules(all_location_names: Set[str], logic: StardewLogic, mul
recipe_name = location.name[len(craft_prefix):]
recipe = all_crafting_recipes_by_name[recipe_name]
craft_rule = logic.crafting.can_craft(recipe)
- MultiWorldRules.set_rule(multiworld.get_location(location.name, player), craft_rule)
+ set_rule(multiworld.get_location(location.name, player), craft_rule)
def set_booksanity_rules(logic: StardewLogic, multiworld, player, content: StardewContent):
@@ -827,12 +827,12 @@ def set_booksanity_rules(logic: StardewLogic, multiworld, player, content: Stard
for book in content.find_tagged_items(ItemTag.BOOK):
if booksanity.is_included(book):
- MultiWorldRules.set_rule(multiworld.get_location(booksanity.to_location_name(book.name), player), logic.has(book.name))
+ set_rule(multiworld.get_location(booksanity.to_location_name(book.name), player), logic.has(book.name))
for i, book in enumerate(booksanity.get_randomized_lost_books()):
if i <= 0:
continue
- MultiWorldRules.set_rule(multiworld.get_location(booksanity.to_location_name(book), player), logic.received(booksanity.progressive_lost_book, i))
+ set_rule(multiworld.get_location(booksanity.to_location_name(book), player), logic.received(booksanity.progressive_lost_book, i))
def set_traveling_merchant_day_rules(logic: StardewLogic, multiworld: MultiWorld, player: int):
@@ -856,102 +856,102 @@ def set_arcade_machine_rules(logic: StardewLogic, multiworld: MultiWorld, player
set_entrance_rule(multiworld, player, Entrance.play_journey_of_the_prairie_king, logic.has("JotPK Small Buff"))
set_entrance_rule(multiworld, player, Entrance.reach_jotpk_world_2, logic.has("JotPK Medium Buff"))
set_entrance_rule(multiworld, player, Entrance.reach_jotpk_world_3, logic.has("JotPK Big Buff"))
- MultiWorldRules.add_rule(multiworld.get_location("Journey of the Prairie King Victory", player),
- logic.has("JotPK Max Buff"))
+ set_rule(multiworld.get_location("Journey of the Prairie King Victory", player),
+ logic.has("JotPK Max Buff"))
def set_friendsanity_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, content: StardewContent):
if not content.features.friendsanity.is_enabled:
return
- MultiWorldRules.add_rule(multiworld.get_location("Spouse Stardrop", player),
- logic.relationship.has_hearts_with_any_bachelor(13))
- MultiWorldRules.add_rule(multiworld.get_location("Have a Baby", player),
- logic.relationship.can_reproduce(1))
- MultiWorldRules.add_rule(multiworld.get_location("Have Another Baby", player),
- logic.relationship.can_reproduce(2))
+ set_rule(multiworld.get_location("Spouse Stardrop", player),
+ logic.relationship.has_hearts_with_any_bachelor(13))
+ set_rule(multiworld.get_location("Have a Baby", player),
+ logic.relationship.can_reproduce(1))
+ set_rule(multiworld.get_location("Have Another Baby", player),
+ logic.relationship.can_reproduce(2))
for villager in content.villagers.values():
for heart in content.features.friendsanity.get_randomized_hearts(villager):
rule = logic.relationship.can_earn_relationship(villager.name, heart)
location_name = friendsanity.to_location_name(villager.name, heart)
- MultiWorldRules.set_rule(multiworld.get_location(location_name, player), rule)
+ set_rule(multiworld.get_location(location_name, player), rule)
for heart in content.features.friendsanity.get_pet_randomized_hearts():
rule = logic.pet.can_befriend_pet(heart)
location_name = friendsanity.to_location_name(NPC.pet, heart)
- MultiWorldRules.set_rule(multiworld.get_location(location_name, player), rule)
+ set_rule(multiworld.get_location(location_name, player), rule)
def set_deepwoods_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions):
if ModNames.deepwoods in world_options.mods:
- MultiWorldRules.add_rule(multiworld.get_location("Breaking Up Deep Woods Gingerbread House", player),
- logic.tool.has_tool(Tool.axe, "Gold"))
- MultiWorldRules.add_rule(multiworld.get_location("Chop Down a Deep Woods Iridium Tree", player),
- logic.tool.has_tool(Tool.axe, "Iridium"))
+ set_rule(multiworld.get_location("Breaking Up Deep Woods Gingerbread House", player),
+ logic.tool.has_tool(Tool.axe, "Gold"))
+ set_rule(multiworld.get_location("Chop Down a Deep Woods Iridium Tree", player),
+ logic.tool.has_tool(Tool.axe, "Iridium"))
set_entrance_rule(multiworld, player, DeepWoodsEntrance.use_woods_obelisk, logic.received("Woods Obelisk"))
for depth in range(10, 100 + 10, 10):
set_entrance_rule(multiworld, player, move_to_woods_depth(depth), logic.mod.deepwoods.can_chop_to_depth(depth))
- MultiWorldRules.add_rule(multiworld.get_location("The Sword in the Stone", player),
- logic.mod.deepwoods.can_pull_sword() & logic.mod.deepwoods.can_chop_to_depth(100))
+ set_rule(multiworld.get_location("The Sword in the Stone", player),
+ logic.mod.deepwoods.can_pull_sword() & logic.mod.deepwoods.can_chop_to_depth(100))
def set_magic_spell_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions):
if ModNames.magic not in world_options.mods:
return
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Clear Debris", player),
- (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic")))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Till", player),
- logic.tool.has_tool("Hoe", "Basic"))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Water", player),
- logic.tool.has_tool("Watering Can", "Basic"))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze All Toil School Locations", player),
- (logic.tool.has_tool("Watering Can", "Basic") & logic.tool.has_tool("Hoe", "Basic")
- & (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic"))))
+ set_rule(multiworld.get_location("Analyze: Clear Debris", player),
+ (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic")))
+ set_rule(multiworld.get_location("Analyze: Till", player),
+ logic.tool.has_tool("Hoe", "Basic"))
+ set_rule(multiworld.get_location("Analyze: Water", player),
+ logic.tool.has_tool("Watering Can", "Basic"))
+ set_rule(multiworld.get_location("Analyze All Toil School Locations", player),
+ (logic.tool.has_tool("Watering Can", "Basic") & logic.tool.has_tool("Hoe", "Basic")
+ & (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic"))))
# Do I *want* to add boots into logic when you get them even in vanilla without effort? idk
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Evac", player),
- logic.ability.can_mine_perfectly())
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Haste", player),
- logic.has("Coffee"))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Heal", player),
- logic.has("Life Elixir"))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze All Life School Locations", player),
- (logic.has("Coffee") & logic.has("Life Elixir")
- & logic.ability.can_mine_perfectly()))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Descend", player),
- logic.region.can_reach(Region.mines))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Fireball", player),
- logic.has("Fire Quartz"))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Frostbolt", player),
- logic.region.can_reach(Region.mines_floor_60) & logic.skill.can_fish(difficulty=85))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze All Elemental School Locations", player),
- logic.has("Fire Quartz") & logic.region.can_reach(Region.mines_floor_60) & logic.skill.can_fish(difficulty=85))
- # MultiWorldRules.add_rule(multiworld.get_location("Analyze: Lantern", player),)
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Tendrils", player),
- logic.region.can_reach(Region.farm))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Shockwave", player),
- logic.has("Earth Crystal"))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze All Nature School Locations", player),
- (logic.has("Earth Crystal") & logic.region.can_reach("Farm"))),
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Meteor", player),
- (logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12))),
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Lucksteal", player),
- logic.region.can_reach(Region.witch_hut))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze: Bloodmana", player),
- logic.region.can_reach(Region.mines_floor_100))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze All Eldritch School Locations", player),
- (logic.region.can_reach(Region.witch_hut) &
- logic.region.can_reach(Region.mines_floor_100) &
- logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12)))
- MultiWorldRules.add_rule(multiworld.get_location("Analyze Every Magic School Location", player),
- (logic.tool.has_tool("Watering Can", "Basic") & logic.tool.has_tool("Hoe", "Basic")
- & (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic")) &
- logic.has("Coffee") & logic.has("Life Elixir")
- & logic.ability.can_mine_perfectly() & logic.has("Earth Crystal") &
- logic.has("Fire Quartz") & logic.skill.can_fish(difficulty=85) &
- logic.region.can_reach(Region.witch_hut) &
- logic.region.can_reach(Region.mines_floor_100) &
- logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12)))
+ set_rule(multiworld.get_location("Analyze: Evac", player),
+ logic.ability.can_mine_perfectly())
+ set_rule(multiworld.get_location("Analyze: Haste", player),
+ logic.has("Coffee"))
+ set_rule(multiworld.get_location("Analyze: Heal", player),
+ logic.has("Life Elixir"))
+ set_rule(multiworld.get_location("Analyze All Life School Locations", player),
+ (logic.has("Coffee") & logic.has("Life Elixir")
+ & logic.ability.can_mine_perfectly()))
+ set_rule(multiworld.get_location("Analyze: Descend", player),
+ logic.region.can_reach(Region.mines))
+ set_rule(multiworld.get_location("Analyze: Fireball", player),
+ logic.has("Fire Quartz"))
+ set_rule(multiworld.get_location("Analyze: Frostbolt", player),
+ logic.region.can_reach(Region.mines_floor_60) & logic.skill.can_fish(difficulty=85))
+ set_rule(multiworld.get_location("Analyze All Elemental School Locations", player),
+ logic.has("Fire Quartz") & logic.region.can_reach(Region.mines_floor_60) & logic.skill.can_fish(difficulty=85))
+ # set_rule(multiworld.get_location("Analyze: Lantern", player),)
+ set_rule(multiworld.get_location("Analyze: Tendrils", player),
+ logic.region.can_reach(Region.farm))
+ set_rule(multiworld.get_location("Analyze: Shockwave", player),
+ logic.has("Earth Crystal"))
+ set_rule(multiworld.get_location("Analyze All Nature School Locations", player),
+ (logic.has("Earth Crystal") & logic.region.can_reach("Farm"))),
+ set_rule(multiworld.get_location("Analyze: Meteor", player),
+ (logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12))),
+ set_rule(multiworld.get_location("Analyze: Lucksteal", player),
+ logic.region.can_reach(Region.witch_hut))
+ set_rule(multiworld.get_location("Analyze: Bloodmana", player),
+ logic.region.can_reach(Region.mines_floor_100))
+ set_rule(multiworld.get_location("Analyze All Eldritch School Locations", player),
+ (logic.region.can_reach(Region.witch_hut) &
+ logic.region.can_reach(Region.mines_floor_100) &
+ logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12)))
+ set_rule(multiworld.get_location("Analyze Every Magic School Location", player),
+ (logic.tool.has_tool("Watering Can", "Basic") & logic.tool.has_tool("Hoe", "Basic")
+ & (logic.tool.has_tool("Axe", "Basic") | logic.tool.has_tool("Pickaxe", "Basic")) &
+ logic.has("Coffee") & logic.has("Life Elixir")
+ & logic.ability.can_mine_perfectly() & logic.has("Earth Crystal") &
+ logic.has("Fire Quartz") & logic.skill.can_fish(difficulty=85) &
+ logic.region.can_reach(Region.witch_hut) &
+ logic.region.can_reach(Region.mines_floor_100) &
+ logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12)))
def set_sve_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions):
@@ -980,8 +980,8 @@ def set_sve_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, worl
set_entrance_rule(multiworld, player, SVEEntrance.to_aurora_basement, logic.mod.quest.has_completed_aurora_vineyard_bundle())
logic.mod.sve.initialize_rules()
for location in logic.registry.sve_location_rules:
- MultiWorldRules.set_rule(multiworld.get_location(location, player),
- logic.registry.sve_location_rules[location])
+ set_rule(multiworld.get_location(location, player),
+ logic.registry.sve_location_rules[location])
set_sve_ginger_island_rules(logic, multiworld, player, world_options)
set_boarding_house_rules(logic, multiworld, player, world_options)
@@ -1010,7 +1010,7 @@ def set_entrance_rule(multiworld, player, entrance: str, rule: StardewRule):
logger.debug(f"Registering indirect condition for {region} -> {entrance}")
multiworld.register_indirect_condition(multiworld.get_region(region, player), multiworld.get_entrance(entrance, player))
- MultiWorldRules.set_rule(multiworld.get_entrance(entrance, player), rule)
+ set_rule(multiworld.get_entrance(entrance, player), rule)
except KeyError as ex:
logger.error(f"""Failed to evaluate indirect connection in: {explain(rule, CollectionState(multiworld))}""")
raise ex
diff --git a/worlds/witness/data/WitnessLogic.txt b/worlds/witness/data/WitnessLogic.txt
index edc45222b51e..3eea52b85e8d 100644
--- a/worlds/witness/data/WitnessLogic.txt
+++ b/worlds/witness/data/WitnessLogic.txt
@@ -52,11 +52,11 @@ Outside Tutorial Vault (Outside Tutorial):
158651 - 0x03481 (Vault Box) - True - True
Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170:
-158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots
+158011 - 0x0A171 (Outpost Entry Panel) - True - Full Dots
Door - 0x0A170 (Outpost Entry) - 0x0A171
Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3:
-158012 - 0x04CA4 (Outpost Exit Panel) - True - Dots & Black/White Squares & Full Dots
+158012 - 0x04CA4 (Outpost Exit Panel) - True - Black/White Squares & Full Dots
Door - 0x04CA3 (Outpost Exit) - 0x04CA4
158600 - 0x17CFB (Discard) - True - Triangles
@@ -136,12 +136,12 @@ Door - 0x18269 (Upper) - 0x1C349
159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True
Symmetry Island Upper (Symmetry Island):
-158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots
-158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots
-158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots
-158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots
-158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots
-158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots
+158065 - 0x00A52 (Laser Yellow 1) - True - Colored Dots
+158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Colored Dots
+158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Colored Dots
+158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Colored Dots
+158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Colored Dots
+158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Colored Dots
158700 - 0x0360D (Laser Panel) - 0x00A68 - True
Laser - 0x00509 (Laser) - 0x0360D
159001 - 0x03367 (Glass Factory Black Line EP) - True - True
@@ -157,7 +157,7 @@ Desert Obelisk (Desert) - Entry - True:
159709 - 0x00359 (Obelisk) - True - True
Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444:
-158652 - 0x0CC7B (Vault Panel) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots
+158652 - 0x0CC7B (Vault Panel) - True - Shapers & Rotated Shapers & Negative Shapers & Full Dots
Door - 0x03444 (Vault Door) - 0x0CC7B
158602 - 0x17CE7 (Discard) - True - Triangles
158076 - 0x00698 (Surface 1) - True - True
@@ -335,13 +335,13 @@ Quarry Boathouse Upper Middle (Quarry Boathouse) - Quarry Boathouse Upper Back -
Quarry Boathouse Upper Back (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x3865F:
158155 - 0x38663 (Second Barrier Panel) - True - True
Door - 0x3865F (Second Barrier) - 0x38663
-158156 - 0x021B5 (Back First Row 1) - True - Stars & Stars + Same Colored Symbol & Eraser
-158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars & Stars + Same Colored Symbol & Eraser
-158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars & Stars + Same Colored Symbol & Eraser
-158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars & Stars + Same Colored Symbol & Eraser
-158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars & Stars + Same Colored Symbol & Eraser
-158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars & Stars + Same Colored Symbol & Eraser
-158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars & Stars + Same Colored Symbol & Eraser
+158156 - 0x021B5 (Back First Row 1) - True - Stars + Same Colored Symbol & Eraser
+158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars + Same Colored Symbol & Eraser
+158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars + Same Colored Symbol & Eraser
+158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars + Same Colored Symbol & Eraser
+158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars + Same Colored Symbol & Eraser
+158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars + Same Colored Symbol & Eraser
+158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars + Same Colored Symbol & Eraser
158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Stars & Eraser & Shapers
158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Stars & Eraser & Shapers
158165 - 0x275FA (Hook Control) - True - Shapers & Eraser
@@ -421,7 +421,7 @@ Door - 0x01A0E (Hedge Maze 4 Exit) - 0x01A0F
Keep 2nd Pressure Plate (Keep) - Keep 3rd Pressure Plate - True:
158199 - 0x0A3B9 (Reset Pressure Plates 2) - True - True
-158200 - 0x01BE9 (Pressure Plates 2) - 0x0A3B9 - Stars & Stars + Same Colored Symbol & Black/White Squares
+158200 - 0x01BE9 (Pressure Plates 2) - 0x0A3B9 - Stars + Same Colored Symbol & Black/White Squares
Door - 0x01BEA (Pressure Plates 2 Exit) - 0x01BE9
Keep 3rd Pressure Plate (Keep) - Keep 4th Pressure Plate - 0x01CD5:
@@ -441,7 +441,7 @@ Keep Tower (Keep) - Keep - 0x04F8F:
158206 - 0x0361B (Tower Shortcut Panel) - True - True
Door - 0x04F8F (Tower Shortcut) - 0x0361B
158704 - 0x0360E (Laser Panel Hedges) - 0x01A0F & 0x019E7 & 0x019DC & 0x00139 - True
-158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Dots
+158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Dots
Laser - 0x014BB (Laser) - 0x0360E | 0x03317
159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True
159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True
@@ -537,11 +537,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
158221 - 0x28AE3 (Vines) - 0x18590 - True
158222 - 0x28938 (Apple Tree) - 0x28AE3 - True
158223 - 0x079DF (Triple Exit) - 0x28938 - True
-158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Dots & Full Dots
-158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Dots & Full Dots
-158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Dots & Full Dots
-158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots & Full Dots
-158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots
+158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Full Dots
+158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Full Dots
+158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Full Dots
+158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Full Dots
+158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Full Dots
Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1
158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers
Door - 0x28A61 (RGB House Entry) - 0x28998
@@ -575,7 +575,7 @@ Town Red Rooftop (Town):
158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True
Town Wooden Rooftop (Town):
-158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Rotated Shapers & Dots & Eraser & Full Dots
+158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Rotated Shapers & Eraser & Full Dots
Town Church (Town):
158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True
@@ -934,29 +934,29 @@ Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17
158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars & Colored Squares
Treehouse Left Orange Bridge (Treehouse) - Treehouse Laser Room Front Platform - 0x17DDB - Treehouse Laser Room Back Platform - 0x17DDB - Treehouse Burned House - 0x17DDB:
-158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol
-158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars & Black/White Squares & Stars + Same Colored Symbol
-158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars & Black/White Squares & Stars + Same Colored Symbol
-158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars & Black/White Squares & Stars + Same Colored Symbol
-158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
-158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
-158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
-158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Stars & Colored Squares & Stars + Same Colored Symbol
-158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Stars & Colored Squares & Stars + Same Colored Symbol
-158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars & Colored Squares & Stars + Same Colored Symbol
-158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars & Colored Squares & Stars + Same Colored Symbol
-158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Stars & Black/White Squares & Stars + Same Colored Symbol
-158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Stars & Black/White Squares & Stars + Same Colored Symbol
-158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Stars & Black/White Squares & Stars + Same Colored Symbol
-158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars & Black/White Squares & Stars + Same Colored Symbol
+158376 - 0x17DB3 (Left Orange Bridge 1) - True - Black/White Squares & Stars + Same Colored Symbol
+158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Black/White Squares & Stars + Same Colored Symbol
+158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Black/White Squares & Stars + Same Colored Symbol
+158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Black/White Squares & Stars + Same Colored Symbol
+158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Colored Squares & Stars + Same Colored Symbol
+158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Colored Squares & Stars + Same Colored Symbol
+158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Colored Squares & Stars + Same Colored Symbol
+158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Colored Squares & Stars + Same Colored Symbol
+158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Black/White Squares & Stars + Same Colored Symbol
+158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Black/White Squares & Stars + Same Colored Symbol
+158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Black/White Squares & Stars + Same Colored Symbol
+158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Black/White Squares & Stars + Same Colored Symbol
Treehouse Green Bridge (Treehouse) - Treehouse Green Bridge Front House - 0x17E61 - Treehouse Green Bridge Left House - 0x17E61:
158369 - 0x17E3C (Green Bridge 1) - True - Stars & Shapers
158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Stars & Shapers
158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Stars & Shapers & Rotated Shapers
158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Stars & Rotated Shapers
-158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Stars & Shapers & Stars + Same Colored Symbol
-158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
+158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Shapers & Stars + Same Colored Symbol
+158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Shapers & Negative Shapers & Stars + Same Colored Symbol
158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Stars & Shapers & Rotated Shapers
Treehouse Green Bridge Front House (Treehouse):
@@ -1005,7 +1005,7 @@ Mountainside Vault (Mountainside):
Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34:
158405 - 0x0042D (River Shape) - True - True
158406 - 0x09F7F (Box Short) - 7 Lasers + Redirect - True
-158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol
+158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Black/White Squares & Stars + Same Colored Symbol
158800 - 0xFFF00 (Box Long) - 11 Lasers + Redirect & 0x17C34 - True
159300 - 0x001A3 (River Shape EP) - True - True
159320 - 0x3370E (Arch Black EP) - True - True
@@ -1023,11 +1023,11 @@ Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneW
158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Dots
158412 - 0x09E69 (Right Row 4) - 0x09E72 - Black/White Squares & Dots
158413 - 0x09E7B (Right Row 5) - 0x09E69 - Black/White Squares & Dots
-158414 - 0x09E73 (Left Row 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol
-158415 - 0x09E75 (Left Row 2) - 0x09E73 - Stars & Black/White Squares & Stars + Same Colored Symbol
+158414 - 0x09E73 (Left Row 1) - True - Black/White Squares & Stars + Same Colored Symbol
+158415 - 0x09E75 (Left Row 2) - 0x09E73 - Black/White Squares & Stars + Same Colored Symbol
158416 - 0x09E78 (Left Row 3) - 0x09E75 - Shapers
158417 - 0x09E79 (Left Row 4) - 0x09E78 - Shapers & Rotated Shapers
-158418 - 0x09E6C (Left Row 5) - 0x09E79 - Stars & Black/White Squares & Stars + Same Colored Symbol
+158418 - 0x09E6C (Left Row 5) - 0x09E79 - Black/White Squares & Stars + Same Colored Symbol
158419 - 0x09E6F (Left Row 6) - 0x09E6C - Stars & Rotated Shapers & Shapers
158420 - 0x09E6B (Left Row 7) - 0x09E6F - Stars & Dots
158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers
@@ -1044,10 +1044,10 @@ Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54:
Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B
Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 Above The Abyss - True - Mountain Pink Bridge EP - TrueOneWay:
-158426 - 0x09FD3 (Near Row 1) - True - Stars & Colored Squares & Stars + Same Colored Symbol
-158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Stars & Colored Squares & Stars + Same Colored Symbol
-158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Colored Squares & Stars + Same Colored Symbol
-158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers
+158426 - 0x09FD3 (Near Row 1) - True - Colored Squares & Stars + Same Colored Symbol
+158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Colored Squares & Stars + Same Colored Symbol
+158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Colored Squares & Stars + Same Colored Symbol
+158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Colored Squares & Stars + Same Colored Symbol & Shapers
158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Symmetry & Colored Dots
Door - 0x09FFB (Staircase Near) - 0x09FD8
@@ -1055,19 +1055,19 @@ Mountain Floor 2 Above The Abyss (Mountain Floor 2) - Mountain Floor 2 Elevator
Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86
Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2):
-158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser
+158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars + Same Colored Symbol & Rotated Shapers & Eraser
Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay - Mountain Floor 2 - 0x09ED8:
158432 - 0x09FCC (Far Row 1) - True - Dots
158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares
158434 - 0x09FCF (Far Row 3) - 0x09FCE - Stars
158435 - 0x09FD0 (Far Row 4) - 0x09FCF - Rotated Shapers
-158436 - 0x09FD1 (Far Row 5) - 0x09FD0 - Stars & Colored Squares & Stars + Same Colored Symbol
+158436 - 0x09FD1 (Far Row 5) - 0x09FD0 - Colored Squares & Stars + Same Colored Symbol
158437 - 0x09FD2 (Far Row 6) - 0x09FD1 - Shapers
Door - 0x09E07 (Staircase Far) - 0x09FD2
Mountain Floor 2 Light Bridge Room Far (Mountain Floor 2):
-158438 - 0x09ED8 (Light Bridge Controller Far) - True - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser
+158438 - 0x09ED8 (Light Bridge Controller Far) - True - Stars + Same Colored Symbol & Rotated Shapers & Eraser
Mountain Floor 2 Elevator Room (Mountain Floor 2) - Mountain Floor 2 Elevator - TrueOneWay:
158613 - 0x17F93 (Elevator Discard) - True - Triangles
@@ -1095,7 +1095,7 @@ Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1
Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961:
158522 - 0x0383A (Right Pillar 1) - True - Stars
158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Stars & Dots
-158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Full Dots
+158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Full Dots
158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Dots & Symmetry
158526 - 0x0383D (Left Pillar 1) - True - Dots
158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares
@@ -1127,16 +1127,16 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01
158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares
158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares
158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots
-158454 - 0x00190 (Blue Tunnel Right First 1) - True - Dots & Triangles & Full Dots
-158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Dots & Triangles & Full Dots
-158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Dots & Triangles & Full Dots
-158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Dots & Triangles & Full Dots
+158454 - 0x00190 (Blue Tunnel Right First 1) - True - Triangles & Full Dots
+158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Triangles & Full Dots
+158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Triangles & Full Dots
+158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Triangles & Full Dots
158458 - 0x01A0D (Blue Tunnel Left First 1) - True - Symmetry & Triangles
158459 - 0x008B8 (Blue Tunnel Left Second 1) - True - Black/White Squares & Triangles
158460 - 0x00973 (Blue Tunnel Left Second 2) - 0x008B8 - Stars & Triangles
-158461 - 0x0097B (Blue Tunnel Left Second 3) - 0x00973 - Stars & Triangles & Stars + Same Colored Symbol
-158462 - 0x0097D (Blue Tunnel Left Second 4) - 0x0097B - Stars & Black/White Squares & Stars + Same Colored Symbol & Triangles
-158463 - 0x0097E (Blue Tunnel Left Second 5) - 0x0097D - Stars & Black/White Squares & Stars + Same Colored Symbol & Colored Squares
+158461 - 0x0097B (Blue Tunnel Left Second 3) - 0x00973 - Triangles & Stars + Same Colored Symbol
+158462 - 0x0097D (Blue Tunnel Left Second 4) - 0x0097B - Black/White Squares & Stars + Same Colored Symbol & Triangles
+158463 - 0x0097E (Blue Tunnel Left Second 5) - 0x0097D - Black/White Squares & Stars + Same Colored Symbol & Colored Squares
158464 - 0x00994 (Blue Tunnel Right Second 1) - True - Rotated Shapers & Triangles
158465 - 0x334D5 (Blue Tunnel Right Second 2) - 0x00994 - Rotated Shapers & Triangles
158466 - 0x00995 (Blue Tunnel Right Second 3) - 0x334D5 - Rotated Shapers & Triangles
@@ -1146,40 +1146,40 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01
158470 - 0x018A0 (Blue Tunnel Right Third 1) - True - Shapers & Symmetry
158471 - 0x00A72 (Blue Tunnel Left Fourth 1) - True - Shapers & Negative Shapers
158472 - 0x32962 (First Floor Left) - True - Rotated Shapers
-158473 - 0x32966 (First Floor Grounded) - True - Stars & Black/White Squares & Stars + Same Colored Symbol
+158473 - 0x32966 (First Floor Grounded) - True - Black/White Squares & Stars + Same Colored Symbol
158474 - 0x01A31 (First Floor Middle) - True - Colored Squares
-158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars & Stars + Same Colored Symbol & Eraser
+158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars + Same Colored Symbol & Eraser
158478 - 0x288EA (First Wooden Beam) - True - Shapers
158479 - 0x288FC (Second Wooden Beam) - True - Black/White Squares & Shapers & Rotated Shapers
158480 - 0x289E7 (Third Wooden Beam) - True - Stars & Black/White Squares
158481 - 0x288AA (Fourth Wooden Beam) - True - Stars & Shapers
-158482 - 0x17FB9 (Left Upstairs Single) - True - Shapers & Dots & Negative Shapers & Full Dots
-158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots & Full Dots
-158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Stars & Dots & Full Dots
-158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Black/White Squares & Stars + Same Colored Symbol & Stars & Full Dots
-158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Shapers & Dots & Full Dots
-158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Rotated Shapers & Dots & Full Dots
-158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots & Invisible Dots
-158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Dots & Invisible Dots
-158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Dots & Invisible Dots
-158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Dots & Invisible Dots
-158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Dots & Invisible Dots
-158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Dots & Invisible Dots
-158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Dots & Invisible Dots
-158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Invisible Dots
-158496 - 0x00027 (Right Upstairs Right Row 1) - True - Dots & Invisible Dots & Symmetry
-158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Dots & Invisible Dots & Symmetry
-158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Dots & Invisible Dots & Symmetry
+158482 - 0x17FB9 (Left Upstairs Single) - True - Shapers & Negative Shapers & Full Dots
+158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Full Dots
+158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Stars & Full Dots
+158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Black/White Squares & Stars + Same Colored Symbol & Full Dots
+158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Shapers & Full Dots
+158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Rotated Shapers & Full Dots
+158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots
+158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Dots
+158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Dots
+158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Dots
+158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Dots
+158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Dots
+158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Dots
+158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots
+158496 - 0x00027 (Right Upstairs Right Row 1) - True - Dots & Symmetry
+158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Dots & Symmetry
+158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Dots & Symmetry
158476 - 0x09DD5 (Lone Pillar) - True - Triangles
Door - 0x019A5 (Pillar Door) - 0x09DD5
-158449 - 0x021D7 (Mountain Shortcut Panel) - True - Triangles & Stars & Stars + Same Colored Symbol
+158449 - 0x021D7 (Mountain Shortcut Panel) - True - Triangles & Stars + Same Colored Symbol
Door - 0x2D73F (Mountain Shortcut Door) - 0x021D7
158450 - 0x17CF2 (Swamp Shortcut Panel) - True - Triangles
Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2
159341 - 0x3397C (Skylight EP) - True - True
Caves Path to Challenge (Caves) - Challenge - 0x0A19A:
-158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol
+158477 - 0x0A16E (Challenge Entry Panel) - True - Shapers & Stars + Same Colored Symbol
Door - 0x0A19A (Challenge Entry) - 0x0A16E
==Challenge==
diff --git a/worlds/witness/data/WitnessLogicExpert.txt b/worlds/witness/data/WitnessLogicExpert.txt
index 23521dddeb5b..936001c243ad 100644
--- a/worlds/witness/data/WitnessLogicExpert.txt
+++ b/worlds/witness/data/WitnessLogicExpert.txt
@@ -13,8 +13,8 @@ Tutorial (Tutorial) - Outside Tutorial - True:
158002 - 0x00293 (Front Center) - True - Dots
158003 - 0x00295 (Center Left) - 0x00293 - Dots
158004 - 0x002C2 (Front Left) - 0x00295 - Dots
-158005 - 0x0A3B5 (Back Left) - True - Dots & Full Dots
-158006 - 0x0A3B2 (Back Right) - True - Dots & Full Dots
+158005 - 0x0A3B5 (Back Left) - True - Full Dots
+158006 - 0x0A3B2 (Back Right) - True - Full Dots
158007 - 0x03629 (Gate Open) - 0x002C2 - Symmetry & Dots
158008 - 0x03505 (Gate Close) - 0x2FAF6 & 0x03629 - True
158009 - 0x0C335 (Pillar) - True - Triangles
@@ -26,22 +26,22 @@ Tutorial (Tutorial) - Outside Tutorial - True:
==Tutorial (Outside)==
Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2 - Outside Tutorial Vault - 0x033D0:
-158650 - 0x033D4 (Vault Panel) - True - Dots & Full Dots & Squares & Black/White Squares
+158650 - 0x033D4 (Vault Panel) - True - Full Dots & Black/White Squares
Door - 0x033D0 (Vault Door) - 0x033D4
-158013 - 0x0005D (Shed Row 1) - True - Dots & Full Dots
-158014 - 0x0005E (Shed Row 2) - 0x0005D - Dots & Full Dots
-158015 - 0x0005F (Shed Row 3) - 0x0005E - Dots & Full Dots
-158016 - 0x00060 (Shed Row 4) - 0x0005F - Dots & Full Dots
-158017 - 0x00061 (Shed Row 5) - 0x00060 - Dots & Full Dots
-158018 - 0x018AF (Tree Row 1) - True - Squares & Black/White Squares
-158019 - 0x0001B (Tree Row 2) - 0x018AF - Squares & Black/White Squares
-158020 - 0x012C9 (Tree Row 3) - 0x0001B - Squares & Black/White Squares
-158021 - 0x0001C (Tree Row 4) - 0x012C9 - Squares & Black/White Squares & Dots
-158022 - 0x0001D (Tree Row 5) - 0x0001C - Squares & Black/White Squares & Dots
-158023 - 0x0001E (Tree Row 6) - 0x0001D - Squares & Black/White Squares & Dots
-158024 - 0x0001F (Tree Row 7) - 0x0001E - Squares & Black/White Squares & Dots & Full Dots
-158025 - 0x00020 (Tree Row 8) - 0x0001F - Squares & Black/White Squares & Dots & Full Dots
-158026 - 0x00021 (Tree Row 9) - 0x00020 - Squares & Black/White Squares & Dots & Full Dots
+158013 - 0x0005D (Shed Row 1) - True - Full Dots
+158014 - 0x0005E (Shed Row 2) - 0x0005D - Full Dots
+158015 - 0x0005F (Shed Row 3) - 0x0005E - Full Dots
+158016 - 0x00060 (Shed Row 4) - 0x0005F - Full Dots
+158017 - 0x00061 (Shed Row 5) - 0x00060 - Full Dots
+158018 - 0x018AF (Tree Row 1) - True - Black/White Squares
+158019 - 0x0001B (Tree Row 2) - 0x018AF - Black/White Squares
+158020 - 0x012C9 (Tree Row 3) - 0x0001B - Black/White Squares
+158021 - 0x0001C (Tree Row 4) - 0x012C9 - Black/White Squares & Dots
+158022 - 0x0001D (Tree Row 5) - 0x0001C - Black/White Squares & Dots
+158023 - 0x0001E (Tree Row 6) - 0x0001D - Black/White Squares & Dots
+158024 - 0x0001F (Tree Row 7) - 0x0001E - Black/White Squares & Full Dots
+158025 - 0x00020 (Tree Row 8) - 0x0001F - Black/White Squares & Full Dots
+158026 - 0x00021 (Tree Row 9) - 0x00020 - Black/White Squares & Full Dots
Door - 0x03BA2 (Outpost Path) - 0x0A3B5
159511 - 0x03D06 (Garden EP) - True - True
159514 - 0x28A2F (Town Sewer EP) - True - True
@@ -52,11 +52,11 @@ Outside Tutorial Vault (Outside Tutorial):
158651 - 0x03481 (Vault Box) - True - True
Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170:
-158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots & Triangles
+158011 - 0x0A171 (Outpost Entry Panel) - True - Full Dots & Triangles
Door - 0x0A170 (Outpost Entry) - 0x0A171
Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3:
-158012 - 0x04CA4 (Outpost Exit Panel) - True - Dots & Full Dots & Shapers & Rotated Shapers
+158012 - 0x04CA4 (Outpost Exit Panel) - True - Full Dots & Shapers & Rotated Shapers
Door - 0x04CA3 (Outpost Exit) - 0x04CA4
158600 - 0x17CFB (Discard) - True - Arrows
@@ -136,12 +136,12 @@ Door - 0x18269 (Upper) - 0x1C349
159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True
Symmetry Island Upper (Symmetry Island):
-158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots
-158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots
-158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots
-158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots
-158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots
-158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots
+158065 - 0x00A52 (Laser Yellow 1) - True - Colored Dots
+158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Colored Dots
+158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Colored Dots
+158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Colored Dots
+158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Colored Dots
+158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Colored Dots
158700 - 0x0360D (Laser Panel) - 0x00A68 - True
Laser - 0x00509 (Laser) - 0x0360D
159001 - 0x03367 (Glass Factory Black Line EP) - True - True
@@ -157,7 +157,7 @@ Desert Obelisk (Desert) - Entry - True:
159709 - 0x00359 (Obelisk) - True - True
Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444:
-158652 - 0x0CC7B (Vault Panel) - True - Dots & Full Dots & Stars & Stars + Same Colored Symbol & Eraser & Triangles & Shapers & Negative Shapers & Colored Squares
+158652 - 0x0CC7B (Vault Panel) - True - Full Dots & Stars + Same Colored Symbol & Eraser & Triangles & Shapers & Negative Shapers & Colored Squares
Door - 0x03444 (Vault Door) - 0x0CC7B
158602 - 0x17CE7 (Discard) - True - Arrows
158076 - 0x00698 (Surface 1) - True - True
@@ -249,9 +249,9 @@ Quarry Obelisk (Quarry) - Entry - True:
159749 - 0x22073 (Obelisk) - True - True
Outside Quarry (Quarry) - Main Island - True - Quarry Between Entry Doors - 0x09D6F - Quarry Elevator - 0xFFD00 & 0xFFD01:
-158118 - 0x09E57 (Entry 1 Panel) - True - Squares & Black/White Squares & Triangles
+158118 - 0x09E57 (Entry 1 Panel) - True - Black/White Squares & Triangles
158603 - 0x17CF0 (Discard) - True - Arrows
-158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Triangles & Stars & Stars + Same Colored Symbol
+158702 - 0x03612 (Laser Panel) - 0x0A3D0 & 0x0367C - Eraser & Triangles & Stars + Same Colored Symbol
Laser - 0x01539 (Laser) - 0x03612
Door - 0x09D6F (Entry 1) - 0x09E57
159404 - 0x28A4A (Shore EP) - True - True
@@ -270,7 +270,7 @@ Door - 0x17C07 (Entry 2) - 0x17C09
Quarry (Quarry) - Quarry Stoneworks Ground Floor - 0x02010:
159802 - 0xFFD01 (Inside Reached Independently) - True - True
-158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Squares & Black/White Squares & Stars & Stars + Same Colored Symbol
+158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Black/White Squares & Stars + Same Colored Symbol
158122 - 0x01E59 (Stoneworks Entry Right Panel) - True - Triangles
Door - 0x02010 (Stoneworks Entry) - 0x01E59 & 0x01E5A
@@ -295,23 +295,23 @@ Quarry Stoneworks Lift (Quarry Stoneworks) - Quarry Stoneworks Middle Floor - 0x
Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - 0x03675 - Quarry Stoneworks Ground Floor - 0x0368A:
158132 - 0x03676 (Upper Ramp Control) - True - Dots & Eraser
158133 - 0x03675 (Upper Lift Control) - True - Dots & Eraser
-158134 - 0x00557 (Upper Row 1) - True - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
-158135 - 0x005F1 (Upper Row 2) - 0x00557 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
-158136 - 0x00620 (Upper Row 3) - 0x005F1 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
-158137 - 0x009F5 (Upper Row 4) - 0x00620 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
-158138 - 0x0146C (Upper Row 5) - 0x009F5 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
-158139 - 0x3C12D (Upper Row 6) - 0x0146C - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
-158140 - 0x03686 (Upper Row 7) - 0x3C12D - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
-158141 - 0x014E9 (Upper Row 8) - 0x03686 - Squares & Colored Squares & Eraser & Stars & Stars + Same Colored Symbol
-158142 - 0x03677 (Stairs Panel) - True - Squares & Colored Squares & Eraser
+158134 - 0x00557 (Upper Row 1) - True - Colored Squares & Eraser & Stars + Same Colored Symbol
+158135 - 0x005F1 (Upper Row 2) - 0x00557 - Colored Squares & Eraser & Stars + Same Colored Symbol
+158136 - 0x00620 (Upper Row 3) - 0x005F1 - Colored Squares & Eraser & Stars + Same Colored Symbol
+158137 - 0x009F5 (Upper Row 4) - 0x00620 - Colored Squares & Eraser & Stars + Same Colored Symbol
+158138 - 0x0146C (Upper Row 5) - 0x009F5 - Colored Squares & Eraser & Stars + Same Colored Symbol
+158139 - 0x3C12D (Upper Row 6) - 0x0146C - Colored Squares & Eraser & Stars + Same Colored Symbol
+158140 - 0x03686 (Upper Row 7) - 0x3C12D - Colored Squares & Eraser & Stars + Same Colored Symbol
+158141 - 0x014E9 (Upper Row 8) - 0x03686 - Colored Squares & Eraser & Stars + Same Colored Symbol
+158142 - 0x03677 (Stairs Panel) - True - Colored Squares & Eraser
Door - 0x0368A (Stairs) - 0x03677
-158143 - 0x3C125 (Control Room Left) - 0x014E9 - Squares & Black/White Squares & Dots & Full Dots & Eraser
-158144 - 0x0367C (Control Room Right) - 0x014E9 - Squares & Colored Squares & Triangles & Eraser & Stars & Stars + Same Colored Symbol
+158143 - 0x3C125 (Control Room Left) - 0x014E9 - Black/White Squares & Full Dots & Eraser
+158144 - 0x0367C (Control Room Right) - 0x014E9 - Colored Squares & Triangles & Eraser & Stars + Same Colored Symbol
159411 - 0x0069D (Ramp EP) - 0x03676 & 0x275FF - True
159413 - 0x00614 (Lift EP) - 0x275FF & 0x03675 - True
Quarry Boathouse (Quarry Boathouse) - Quarry - True - Quarry Boathouse Upper Front - 0x03852 - Quarry Boathouse Behind Staircase - 0x2769B:
-158146 - 0x034D4 (Intro Left) - True - Stars & Stars + Same Colored Symbol & Eraser
+158146 - 0x034D4 (Intro Left) - True - Stars + Same Colored Symbol & Eraser
158147 - 0x021D5 (Intro Right) - True - Shapers & Eraser
158148 - 0x03852 (Ramp Height Control) - 0x034D4 & 0x021D5 - Rotated Shapers
158166 - 0x17CA6 (Boat Spawn) - True - Boat
@@ -335,19 +335,19 @@ Quarry Boathouse Upper Middle (Quarry Boathouse) - Quarry Boathouse Upper Back -
Quarry Boathouse Upper Back (Quarry Boathouse) - Quarry Boathouse Upper Middle - 0x3865F:
158155 - 0x38663 (Second Barrier Panel) - True - True
Door - 0x3865F (Second Barrier) - 0x38663
-158156 - 0x021B5 (Back First Row 1) - True - Stars & Stars + Same Colored Symbol & Eraser
-158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars & Stars + Same Colored Symbol & Eraser
-158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars & Stars + Same Colored Symbol & Eraser
-158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars & Stars + Same Colored Symbol & Eraser
-158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars & Stars + Same Colored Symbol & Eraser
+158156 - 0x021B5 (Back First Row 1) - True - Stars + Same Colored Symbol & Eraser
+158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars + Same Colored Symbol & Eraser
+158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars + Same Colored Symbol & Eraser
+158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars + Same Colored Symbol & Eraser
+158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars + Same Colored Symbol & Eraser
158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Eraser & Shapers
158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Eraser & Shapers
-158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Eraser & Shapers & Stars & Stars + Same Colored Symbol
-158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Eraser & Shapers & Stars & Stars + Same Colored Symbol
+158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Eraser & Shapers & Stars + Same Colored Symbol
+158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Eraser & Shapers & Stars + Same Colored Symbol
158165 - 0x275FA (Hook Control) - True - Shapers & Eraser
-158167 - 0x0A3CB (Back Second Row 1) - 0x09DB4 - Stars & Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158168 - 0x0A3CC (Back Second Row 2) - 0x0A3CB - Stars & Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Stars & Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol
+158167 - 0x0A3CB (Back Second Row 1) - 0x09DB4 - Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol
+158168 - 0x0A3CC (Back Second Row 2) - 0x0A3CB - Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol
+158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Eraser & Shapers & Negative Shapers & Stars + Same Colored Symbol
159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True
==Shadows==
@@ -400,7 +400,7 @@ Outside Keep (Keep) - Main Island - True:
Keep (Keep) - Outside Keep - True - Keep 2nd Maze - 0x01954 - Keep 2nd Pressure Plate - 0x01BEC:
158193 - 0x00139 (Hedge Maze 1) - True - True
158197 - 0x0A3A8 (Reset Pressure Plates 1) - True - True
-158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Colored Squares & Triangles & Stars & Stars + Same Colored Symbol
+158198 - 0x033EA (Pressure Plates 1) - 0x0A3A8 - Colored Squares & Triangles & Stars + Same Colored Symbol
Door - 0x01954 (Hedge Maze 1 Exit) - 0x00139
Door - 0x01BEC (Pressure Plates 1 Exit) - 0x033EA
@@ -421,7 +421,7 @@ Door - 0x01A0E (Hedge Maze 4 Exit) - 0x01A0F
Keep 2nd Pressure Plate (Keep) - Keep 3rd Pressure Plate - True:
158199 - 0x0A3B9 (Reset Pressure Plates 2) - True - True
-158200 - 0x01BE9 (Pressure Plates 2) - PP2 Weirdness - Stars & Stars + Same Colored Symbol & Squares & Black/White Squares & Shapers & Rotated Shapers
+158200 - 0x01BE9 (Pressure Plates 2) - PP2 Weirdness - Stars + Same Colored Symbol & Black/White Squares & Shapers & Rotated Shapers
Door - 0x01BEA (Pressure Plates 2 Exit) - 0x01BE9
Keep 3rd Pressure Plate (Keep) - Keep 4th Pressure Plate - 0x01CD5:
@@ -431,7 +431,7 @@ Door - 0x01CD5 (Pressure Plates 3 Exit) - 0x01CD3
Keep 4th Pressure Plate (Keep) - Shadows - 0x09E3D - Keep Tower - 0x01D40:
158203 - 0x0A3AD (Reset Pressure Plates 4) - True - True
-158204 - 0x01D3F (Pressure Plates 4) - 0x0A3AD - Shapers & Triangles & Stars & Stars + Same Colored Symbol
+158204 - 0x01D3F (Pressure Plates 4) - 0x0A3AD - Shapers & Triangles & Stars + Same Colored Symbol
Door - 0x01D40 (Pressure Plates 4 Exit) - 0x01D3F
158604 - 0x17D27 (Discard) - True - Arrows
158205 - 0x09E49 (Shadows Shortcut Panel) - True - True
@@ -441,7 +441,7 @@ Keep Tower (Keep) - Keep - 0x04F8F:
158206 - 0x0361B (Tower Shortcut Panel) - True - True
Door - 0x04F8F (Tower Shortcut) - 0x0361B
158704 - 0x0360E (Laser Panel Hedges) - 0x01A0F & 0x019E7 & 0x019DC & 0x00139 - True
-158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Rotated Shapers & Triangles & Stars & Stars + Same Colored Symbol & Colored Squares & Black/White Squares
+158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Shapers & Rotated Shapers & Triangles & Stars + Same Colored Symbol & Colored Squares & Black/White Squares
Laser - 0x014BB (Laser) - 0x0360E | 0x03317
159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True
159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True
@@ -530,20 +530,20 @@ Town Obelisk (Town) - Entry - True:
Town (Town) - Main Island - True - The Ocean - 0x0A054 - Town Maze Rooftop - 0x28AA2 - Town Church - True - Town Wooden Rooftop - 0x034F5 - Town RGB House - 0x28A61 - Town Inside Cargo Box - 0x0A0C9 - Outside Windmill - True:
158218 - 0x0A054 (Boat Spawn) - 0x17CA6 | 0x17CDF | 0x09DB8 | 0x17C95 - Boat
-158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Squares & Black/White Squares & Shapers & Triangles
+158219 - 0x0A0C8 (Cargo Box Entry Panel) - True - Black/White Squares & Shapers & Triangles
Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
158707 - 0x09F98 (Desert Laser Redirect Control) - True - True
158220 - 0x18590 (Transparent) - True - Symmetry
158221 - 0x28AE3 (Vines) - 0x18590 - True
158222 - 0x28938 (Apple Tree) - 0x28AE3 - True
158223 - 0x079DF (Triple Exit) - 0x28938 - True
-158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Triangles & Dots & Full Dots
-158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Triangles & Dots & Full Dots
-158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Triangles & Dots & Full Dots
-158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Triangles & Dots & Full Dots
-158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Triangles & Dots & Full Dots
+158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Triangles & Full Dots
+158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Triangles & Full Dots
+158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Triangles & Full Dots
+158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Triangles & Full Dots
+158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Triangles & Full Dots
Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1
-158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers & Stars + Same Colored Symbol
+158225 - 0x28998 (RGB House Entry Panel) - True - Rotated Shapers & Stars + Same Colored Symbol
Door - 0x28A61 (RGB House Entry) - 0x28A0D
158226 - 0x28A0D (Church Entry Panel) - 0x28998 - Stars
Door - 0x03BB0 (Church Entry) - 0x03C08
@@ -575,7 +575,7 @@ Town Red Rooftop (Town):
158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True
Town Wooden Rooftop (Town):
-158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Triangles & Dots & Full Dots & Eraser
+158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Triangles & Full Dots & Eraser
Town Church (Town):
158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True
@@ -587,8 +587,8 @@ Town RGB House (Town RGB House) - Town RGB House Upstairs - 0x2897B:
Door - 0x2897B (Stairs) - 0x034E4 & 0x034E3
Town RGB House Upstairs (Town RGB House Upstairs):
-158244 - 0x334D8 (RGB Control) - True - Rotated Shapers & Squares & Colored Squares & Triangles
-158245 - 0x03C0C (Left) - 0x334D8 - Squares & Colored Squares & Black/White Squares & Eraser
+158244 - 0x334D8 (RGB Control) - True - Rotated Shapers & Colored Squares & Triangles
+158245 - 0x03C0C (Left) - 0x334D8 - Colored Squares & Black/White Squares & Eraser
158246 - 0x03C08 (Right) - 0x334D8 & 0x03C0C - Symmetry & Dots & Colored Dots & Triangles
Town Tower Bottom (Town Tower) - Town - True - Town Tower After First Door - 0x27799:
@@ -620,7 +620,7 @@ Door - 0x1845B (Entry) - 0x17F5F
Windmill Interior (Windmill) - Theater - 0x17F88:
158247 - 0x17D02 (Turn Control) - True - Dots
-158248 - 0x17F89 (Theater Entry Panel) - True - Squares & Black/White Squares & Eraser & Triangles
+158248 - 0x17F89 (Theater Entry Panel) - True - Black/White Squares & Eraser & Triangles
Door - 0x17F88 (Theater Entry) - 0x17F89
Theater (Theater) - Town - 0x0A16D | 0x3CCDF:
@@ -631,7 +631,7 @@ Theater (Theater) - Town - 0x0A16D | 0x3CCDF:
158660 - 0x03549 (Challenge Video) - 0x00815 & 0x0356B - True
158661 - 0x0354F (Shipwreck Video) - 0x00815 & 0x03535 - True
158662 - 0x03545 (Mountain Video) - 0x00815 & 0x03542 - True
-158249 - 0x0A168 (Exit Left Panel) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Eraser
+158249 - 0x0A168 (Exit Left Panel) - True - Black/White Squares & Stars + Same Colored Symbol & Eraser
158250 - 0x33AB2 (Exit Right Panel) - True - Eraser & Triangles & Shapers
Door - 0x0A16D (Exit Left) - 0x0A168
Door - 0x3CCDF (Exit Right) - 0x33AB2
@@ -693,33 +693,33 @@ Jungle Vault (Jungle):
==Bunker==
Outside Bunker (Bunker) - Main Island - True - Bunker - 0x0C2A4:
-158268 - 0x17C2E (Entry Panel) - True - Squares & Black/White Squares
+158268 - 0x17C2E (Entry Panel) - True - Black/White Squares
Door - 0x0C2A4 (Entry) - 0x17C2E
Bunker (Bunker) - Bunker Glass Room - 0x17C79:
-158269 - 0x09F7D (Intro Left 1) - True - Squares & Colored Squares
-158270 - 0x09FDC (Intro Left 2) - 0x09F7D - Squares & Colored Squares & Black/White Squares
-158271 - 0x09FF7 (Intro Left 3) - 0x09FDC - Squares & Colored Squares & Black/White Squares
-158272 - 0x09F82 (Intro Left 4) - 0x09FF7 - Squares & Colored Squares & Black/White Squares
-158273 - 0x09FF8 (Intro Left 5) - 0x09F82 - Squares & Colored Squares & Black/White Squares
-158274 - 0x09D9F (Intro Back 1) - 0x09FF8 - Squares & Colored Squares & Black/White Squares
-158275 - 0x09DA1 (Intro Back 2) - 0x09D9F - Squares & Colored Squares
-158276 - 0x09DA2 (Intro Back 3) - 0x09DA1 - Squares & Colored Squares
-158277 - 0x09DAF (Intro Back 4) - 0x09DA2 - Squares & Colored Squares
+158269 - 0x09F7D (Intro Left 1) - True - Colored Squares
+158270 - 0x09FDC (Intro Left 2) - 0x09F7D - Colored Squares & Black/White Squares
+158271 - 0x09FF7 (Intro Left 3) - 0x09FDC - Colored Squares & Black/White Squares
+158272 - 0x09F82 (Intro Left 4) - 0x09FF7 - Colored Squares & Black/White Squares
+158273 - 0x09FF8 (Intro Left 5) - 0x09F82 - Colored Squares & Black/White Squares
+158274 - 0x09D9F (Intro Back 1) - 0x09FF8 - Colored Squares & Black/White Squares
+158275 - 0x09DA1 (Intro Back 2) - 0x09D9F - Colored Squares
+158276 - 0x09DA2 (Intro Back 3) - 0x09DA1 - Colored Squares
+158277 - 0x09DAF (Intro Back 4) - 0x09DA2 - Colored Squares
158278 - 0x0A099 (Tinted Glass Door Panel) - 0x09DAF - True
Door - 0x17C79 (Tinted Glass Door) - 0x0A099
Bunker Glass Room (Bunker) - Bunker Ultraviolet Room - 0x0C2A3:
-158279 - 0x0A010 (Glass Room 1) - 0x17C79 - Squares & Colored Squares
-158280 - 0x0A01B (Glass Room 2) - 0x17C79 & 0x0A010 - Squares & Colored Squares & Black/White Squares
-158281 - 0x0A01F (Glass Room 3) - 0x17C79 & 0x0A01B - Squares & Colored Squares & Black/White Squares
+158279 - 0x0A010 (Glass Room 1) - 0x17C79 - Colored Squares
+158280 - 0x0A01B (Glass Room 2) - 0x17C79 & 0x0A010 - Colored Squares & Black/White Squares
+158281 - 0x0A01F (Glass Room 3) - 0x17C79 & 0x0A01B - Colored Squares & Black/White Squares
Door - 0x0C2A3 (UV Room Entry) - 0x0A01F
Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D:
158282 - 0x34BC5 (Drop-Down Door Open) - True - True
158283 - 0x34BC6 (Drop-Down Door Close) - 0x34BC5 - True
-158284 - 0x17E63 (UV Room 1) - 0x34BC5 - Squares & Colored Squares
-158285 - 0x17E67 (UV Room 2) - 0x17E63 & 0x34BC6 - Squares & Colored Squares & Black/White Squares
+158284 - 0x17E63 (UV Room 1) - 0x34BC5 - Colored Squares
+158285 - 0x17E67 (UV Room 2) - 0x17E63 & 0x34BC6 - Colored Squares & Black/White Squares
Door - 0x0A08D (Elevator Room Entry) - 0x17E67
Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay - Bunker Under Elevator - 0x0A079 | Bunker Green Room | Bunker Cyan Room | Bunker Laser Platform:
@@ -797,31 +797,31 @@ Swamp Between Bridges Near (Swamp) - Swamp Between Bridges Far - 0x18507:
Door - 0x18507 (Between Bridges Second Door) - 0x009A1
Swamp Between Bridges Far (Swamp) - Swamp Red Underwater - 0x183F2 - Swamp Rotating Bridge - TrueOneWay:
-158319 - 0x00007 (Between Bridges Far Row 1) - 0x009A1 - Rotated Shapers & Dots & Full Dots
-158320 - 0x00008 (Between Bridges Far Row 2) - 0x00007 - Rotated Shapers & Dots & Full Dots
-158321 - 0x00009 (Between Bridges Far Row 3) - 0x00008 - Rotated Shapers & Shapers & Dots & Full Dots
-158322 - 0x0000A (Between Bridges Far Row 4) - 0x00009 - Rotated Shapers & Shapers & Dots & Full Dots
+158319 - 0x00007 (Between Bridges Far Row 1) - 0x009A1 - Rotated Shapers & Full Dots
+158320 - 0x00008 (Between Bridges Far Row 2) - 0x00007 - Rotated Shapers & Full Dots
+158321 - 0x00009 (Between Bridges Far Row 3) - 0x00008 - Rotated Shapers & Shapers & Full Dots
+158322 - 0x0000A (Between Bridges Far Row 4) - 0x00009 - Rotated Shapers & Shapers & Full Dots
Door - 0x183F2 (Red Water Pump) - 0x00596
Swamp Red Underwater (Swamp) - Swamp Maze - 0x305D5:
-158323 - 0x00001 (Red Underwater 1) - True - Shapers & Negative Shapers & Dots & Full Dots
-158324 - 0x014D2 (Red Underwater 2) - True - Shapers & Negative Shapers & Dots & Full Dots
-158325 - 0x014D4 (Red Underwater 3) - True - Shapers & Negative Shapers & Dots & Full Dots
-158326 - 0x014D1 (Red Underwater 4) - True - Shapers & Negative Shapers & Dots & Full Dots
+158323 - 0x00001 (Red Underwater 1) - True - Shapers & Negative Shapers & Full Dots
+158324 - 0x014D2 (Red Underwater 2) - True - Shapers & Negative Shapers & Full Dots
+158325 - 0x014D4 (Red Underwater 3) - True - Shapers & Negative Shapers & Full Dots
+158326 - 0x014D1 (Red Underwater 4) - True - Shapers & Negative Shapers & Full Dots
Door - 0x305D5 (Red Underwater Exit) - 0x014D1
Swamp Rotating Bridge (Swamp) - Swamp Between Bridges Far - 0x181F5 - Swamp Near Boat - 0x181F5 - Swamp Purple Area - 0x181F5:
-158327 - 0x181F5 (Rotating Bridge) - True - Rotated Shapers & Shapers & Stars & Colored Squares & Triangles & Stars + Same Colored Symbol
+158327 - 0x181F5 (Rotating Bridge) - True - Rotated Shapers & Shapers & Colored Squares & Triangles & Stars + Same Colored Symbol
159331 - 0x016B2 (Rotating Bridge CCW EP) - 0x181F5 - True
159334 - 0x036CE (Rotating Bridge CW EP) - 0x181F5 - True
Swamp Near Boat (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Blue Underwater - 0x18482 - Swamp Long Bridge - 0xFFD00 & 0xFFD02 - The Ocean - 0x09DB8:
159803 - 0xFFD02 (Beyond Rotating Bridge Reached Independently) - True - True
158328 - 0x09DB8 (Boat Spawn) - True - Boat
-158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Shapers & Dots & Full Dots
-158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers & Shapers & Dots & Full Dots
-158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Shapers & Dots & Full Dots
-158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Shapers & Dots & Full Dots
+158329 - 0x003B2 (Beyond Rotating Bridge 1) - 0x0000A - Shapers & Full Dots
+158330 - 0x00A1E (Beyond Rotating Bridge 2) - 0x003B2 - Rotated Shapers & Shapers & Full Dots
+158331 - 0x00C2E (Beyond Rotating Bridge 3) - 0x00A1E - Shapers & Full Dots
+158332 - 0x00E3A (Beyond Rotating Bridge 4) - 0x00C2E - Shapers & Full Dots
Door - 0x18482 (Blue Water Pump) - 0x00E3A
159332 - 0x3365F (Boat EP) - 0x09DB8 - True
159333 - 0x03731 (Long Bridge Side EP) - 0x17E2B - True
@@ -833,7 +833,7 @@ Swamp Purple Area (Swamp) - Swamp Rotating Bridge - TrueOneWay - Swamp Purple Un
Door - 0x0A1D6 (Purple Water Pump) - 0x00E3A
Swamp Purple Underwater (Swamp):
-158333 - 0x009A6 (Purple Underwater) - True - Shapers & Triangles & Black/White Squares & Rotated Shapers & Dots & Full Dots
+158333 - 0x009A6 (Purple Underwater) - True - Shapers & Triangles & Black/White Squares & Rotated Shapers & Full Dots
159330 - 0x03A9E (Purple Underwater Right EP) - True - True
159336 - 0x03A93 (Purple Underwater Left EP) - True - True
@@ -851,8 +851,8 @@ Swamp Maze (Swamp) - Swamp Laser Area - 0x17C0A & 0x17E07:
Swamp Laser Area (Swamp) - Outside Swamp - 0x2D880:
158711 - 0x03615 (Laser Panel) - True - True
Laser - 0x00BF6 (Laser) - 0x03615
-158341 - 0x17C05 (Laser Shortcut Left Panel) - True - Shapers & Stars & Negative Shapers & Stars + Same Colored Symbol
-158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Stars & Stars + Same Colored Symbol
+158341 - 0x17C05 (Laser Shortcut Left Panel) - True - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Negative Shapers & Stars + Same Colored Symbol
Door - 0x2D880 (Laser Shortcut) - 0x17C02
==Treehouse==
@@ -873,91 +873,91 @@ Treehouse Beach (Treehouse Beach) - Main Island - True:
Treehouse Entry Area (Treehouse) - Treehouse Between Entry Doors - 0x0C309 - The Ocean - 0x17C95:
158343 - 0x17C95 (Boat Spawn) - True - Boat
-158344 - 0x0288C (First Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles
+158344 - 0x0288C (First Door Panel) - True - Stars + Same Colored Symbol & Triangles
Door - 0x0C309 (First Door) - 0x0288C
159210 - 0x33721 (Buoy EP) - 0x17C95 - True
Treehouse Between Entry Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310:
-158345 - 0x02886 (Second Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles
+158345 - 0x02886 (Second Door Panel) - True - Stars + Same Colored Symbol & Triangles
Door - 0x0C310 (Second Door) - 0x02886
Treehouse Yellow Bridge (Treehouse) - Treehouse After Yellow Bridge - 0x17DC4:
-158346 - 0x17D72 (Yellow Bridge 1) - True - Stars & Stars + Same Colored Symbol & Triangles
-158347 - 0x17D8F (Yellow Bridge 2) - 0x17D72 - Stars & Stars + Same Colored Symbol & Triangles
-158348 - 0x17D74 (Yellow Bridge 3) - 0x17D8F - Stars & Stars + Same Colored Symbol & Triangles
-158349 - 0x17DAC (Yellow Bridge 4) - 0x17D74 - Stars & Stars + Same Colored Symbol & Triangles
-158350 - 0x17D9E (Yellow Bridge 5) - 0x17DAC - Stars & Stars + Same Colored Symbol & Triangles
-158351 - 0x17DB9 (Yellow Bridge 6) - 0x17D9E - Stars & Stars + Same Colored Symbol & Triangles
-158352 - 0x17D9C (Yellow Bridge 7) - 0x17DB9 - Stars & Stars + Same Colored Symbol & Triangles
-158353 - 0x17DC2 (Yellow Bridge 8) - 0x17D9C - Stars & Stars + Same Colored Symbol & Triangles
-158354 - 0x17DC4 (Yellow Bridge 9) - 0x17DC2 - Stars & Stars + Same Colored Symbol & Triangles
+158346 - 0x17D72 (Yellow Bridge 1) - True - Stars + Same Colored Symbol & Triangles
+158347 - 0x17D8F (Yellow Bridge 2) - 0x17D72 - Stars + Same Colored Symbol & Triangles
+158348 - 0x17D74 (Yellow Bridge 3) - 0x17D8F - Stars + Same Colored Symbol & Triangles
+158349 - 0x17DAC (Yellow Bridge 4) - 0x17D74 - Stars + Same Colored Symbol & Triangles
+158350 - 0x17D9E (Yellow Bridge 5) - 0x17DAC - Stars + Same Colored Symbol & Triangles
+158351 - 0x17DB9 (Yellow Bridge 6) - 0x17D9E - Stars + Same Colored Symbol & Triangles
+158352 - 0x17D9C (Yellow Bridge 7) - 0x17DB9 - Stars + Same Colored Symbol & Triangles
+158353 - 0x17DC2 (Yellow Bridge 8) - 0x17D9C - Stars + Same Colored Symbol & Triangles
+158354 - 0x17DC4 (Yellow Bridge 9) - 0x17DC2 - Stars + Same Colored Symbol & Triangles
Treehouse After Yellow Bridge (Treehouse) - Treehouse Junction - 0x0A181:
-158355 - 0x0A182 (Third Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles & Colored Squares
+158355 - 0x0A182 (Third Door Panel) - True - Stars + Same Colored Symbol & Triangles & Colored Squares
Door - 0x0A181 (Third Door) - 0x0A182
Treehouse Junction (Treehouse) - Treehouse Right Orange Bridge - True - Treehouse First Purple Bridge - True - Treehouse Green Bridge - True:
158356 - 0x2700B (Laser House Door Timer Outside) - True - True
Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x17D6C:
-158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Dots & Full Dots
-158358 - 0x17DC7 (First Purple Bridge 2) - 0x17DC8 - Stars & Dots & Full Dots
-158359 - 0x17CE4 (First Purple Bridge 3) - 0x17DC7 - Stars & Dots & Full Dots
-158360 - 0x17D2D (First Purple Bridge 4) - 0x17CE4 - Stars & Dots & Full Dots
-158361 - 0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Dots & Full Dots
+158357 - 0x17DC8 (First Purple Bridge 1) - True - Stars & Full Dots
+158358 - 0x17DC7 (First Purple Bridge 2) - 0x17DC8 - Stars & Full Dots
+158359 - 0x17CE4 (First Purple Bridge 3) - 0x17DC7 - Stars & Full Dots
+158360 - 0x17D2D (First Purple Bridge 4) - 0x17CE4 - Stars & Full Dots
+158361 - 0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Full Dots
Treehouse Right Orange Bridge (Treehouse) - Treehouse Drawbridge Platform - 0x17DA2:
-158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars & Stars + Same Colored Symbol & Triangles
-158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars & Stars + Same Colored Symbol & Triangles
-158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars & Stars + Same Colored Symbol & Triangles
+158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars + Same Colored Symbol & Triangles
+158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars + Same Colored Symbol & Triangles
+158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars + Same Colored Symbol & Triangles
158394 - 0x17CE3 (Right Orange Bridge 4 & Directional) - 0x17D8C - Triangles
-158395 - 0x17DCD (Right Orange Bridge 5) - 0x17CE3 - Stars & Stars + Same Colored Symbol & Triangles
-158396 - 0x17DB2 (Right Orange Bridge 6) - 0x17DCD - Stars & Stars + Same Colored Symbol & Triangles
-158397 - 0x17DCC (Right Orange Bridge 7) - 0x17DB2 - Stars & Stars + Same Colored Symbol & Triangles
-158398 - 0x17DCA (Right Orange Bridge 8) - 0x17DCC - Stars & Stars + Same Colored Symbol & Triangles
-158399 - 0x17D8E (Right Orange Bridge 9) - 0x17DCA - Stars & Stars + Same Colored Symbol & Triangles
+158395 - 0x17DCD (Right Orange Bridge 5) - 0x17CE3 - Stars + Same Colored Symbol & Triangles
+158396 - 0x17DB2 (Right Orange Bridge 6) - 0x17DCD - Stars + Same Colored Symbol & Triangles
+158397 - 0x17DCC (Right Orange Bridge 7) - 0x17DB2 - Stars + Same Colored Symbol & Triangles
+158398 - 0x17DCA (Right Orange Bridge 8) - 0x17DCC - Stars + Same Colored Symbol & Triangles
+158399 - 0x17D8E (Right Orange Bridge 9) - 0x17DCA - Stars + Same Colored Symbol & Triangles
158400 - 0x17DB7 (Right Orange Bridge 10 & Directional) - 0x17D8E - Triangles
-158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars & Stars + Same Colored Symbol & Triangles
-158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars & Stars + Same Colored Symbol & Triangles
+158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars + Same Colored Symbol & Triangles
+158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars + Same Colored Symbol & Triangles
Treehouse Drawbridge Platform (Treehouse) - Main Island - 0x0C32D:
158404 - 0x037FF (Drawbridge Panel) - True - Stars
Door - 0x0C32D (Drawbridge) - 0x037FF
Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6:
-158362 - 0x17D9B (Second Purple Bridge 1) - True - Stars & Black/White Squares & Triangles & Stars + Same Colored Symbol
-158363 - 0x17D99 (Second Purple Bridge 2) - 0x17D9B - Stars & Black/White Squares & Triangles & Stars + Same Colored Symbol
-158364 - 0x17DAA (Second Purple Bridge 3) - 0x17D99 - Stars & Black/White Squares & Triangles & Stars + Same Colored Symbol
-158365 - 0x17D97 (Second Purple Bridge 4) - 0x17DAA - Stars & Black/White Squares & Colored Squares & Triangles & Stars + Same Colored Symbol
-158366 - 0x17BDF (Second Purple Bridge 5) - 0x17D97 - Stars & Colored Squares & Triangles & Stars + Same Colored Symbol
-158367 - 0x17D91 (Second Purple Bridge 6) - 0x17BDF - Stars & Colored Squares & Triangles & Stars + Same Colored Symbol
-158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars & Colored Squares & Triangles & Stars + Same Colored Symbol
+158362 - 0x17D9B (Second Purple Bridge 1) - True - Black/White Squares & Triangles & Stars + Same Colored Symbol
+158363 - 0x17D99 (Second Purple Bridge 2) - 0x17D9B - Black/White Squares & Triangles & Stars + Same Colored Symbol
+158364 - 0x17DAA (Second Purple Bridge 3) - 0x17D99 - Black/White Squares & Triangles & Stars + Same Colored Symbol
+158365 - 0x17D97 (Second Purple Bridge 4) - 0x17DAA - Black/White Squares & Colored Squares & Triangles & Stars + Same Colored Symbol
+158366 - 0x17BDF (Second Purple Bridge 5) - 0x17D97 - Colored Squares & Triangles & Stars + Same Colored Symbol
+158367 - 0x17D91 (Second Purple Bridge 6) - 0x17BDF - Colored Squares & Triangles & Stars + Same Colored Symbol
+158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Colored Squares & Triangles & Stars + Same Colored Symbol
Treehouse Left Orange Bridge (Treehouse) - Treehouse Laser Room Front Platform - 0x17DDE - Treehouse Laser Room Back Platform - 0x17DDB - Treehouse Burned House - 0x17DDB:
-158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
-158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
-158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
-158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
-158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
-158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
-158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
-158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
-158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
-158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
-158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
-158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
-158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC & 0x03613 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Triangles
-158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Stars & Black/White Squares & Stars + Same Colored Symbol
-158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars & Black/White Squares & Stars + Same Colored Symbol
+158376 - 0x17DB3 (Left Orange Bridge 1) - True - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
+158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
+158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
+158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
+158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
+158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
+158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
+158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers
+158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
+158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
+158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
+158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Colored Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Black/White Squares
+158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC & 0x03613 - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Triangles
+158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Black/White Squares & Stars + Same Colored Symbol
+158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Black/White Squares & Stars + Same Colored Symbol
Treehouse Green Bridge (Treehouse) - Treehouse Green Bridge Front House - 0x17E61 - Treehouse Green Bridge Left House - 0x17E61:
-158369 - 0x17E3C (Green Bridge 1) - True - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol & Triangles
-158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol & Triangles
+158369 - 0x17E3C (Green Bridge 1) - True - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Shapers & Negative Shapers & Stars + Same Colored Symbol & Triangles
+158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Shapers & Negative Shapers & Stars + Same Colored Symbol & Triangles
Treehouse Green Bridge Front House (Treehouse):
158610 - 0x17FA9 (Green Bridge Discard) - True - Arrows
@@ -993,7 +993,7 @@ Mountainside Obelisk (Mountainside) - Entry - True:
Mountainside (Mountainside) - Main Island - True - Mountaintop - True - Mountainside Vault - 0x00085:
159550 - 0x28B91 (Thundercloud EP) - 0xFFD03 - True
158612 - 0x17C42 (Discard) - True - Arrows
-158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Squares & Triangles & Stars & Stars + Same Colored Symbol
+158665 - 0x002A6 (Vault Panel) - True - Symmetry & Colored Squares & Triangles & Stars + Same Colored Symbol
Door - 0x00085 (Vault Door) - 0x002A6
159301 - 0x335AE (Cloud Cycle EP) - True - True
159325 - 0x33505 (Bush EP) - True - True
@@ -1005,7 +1005,7 @@ Mountainside Vault (Mountainside):
Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34:
158405 - 0x0042D (River Shape) - True - True
158406 - 0x09F7F (Box Short) - 7 Lasers + Redirect - True
-158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Stars & Black/White Squares & Stars + Same Colored Symbol & Triangles
+158407 - 0x17C34 (Mountain Entry Panel) - 0x09F7F - Black/White Squares & Stars + Same Colored Symbol & Triangles
158800 - 0xFFF00 (Box Long) - 11 Lasers + Redirect & 0x17C34 - True
159300 - 0x001A3 (River Shape EP) - True - True
159320 - 0x3370E (Arch Black EP) - True - True
@@ -1018,18 +1018,18 @@ Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39:
158408 - 0x09E39 (Light Bridge Controller) - True - Eraser & Triangles
Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay - Mountain Floor 1 Trash Pillar - TrueOneWay - Mountain Floor 1 Back Section - TrueOneWay:
-158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots & Stars & Stars + Same Colored Symbol
+158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots & Stars + Same Colored Symbol
158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Triangles
-158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars & Stars + Same Colored Symbol
-158412 - 0x09E69 (Right Row 4) - 0x09E72 - Stars & Black/White Squares & Stars + Same Colored Symbol & Rotated Shapers
-158413 - 0x09E7B (Right Row 5) - 0x09E69 - Stars & Black/White Squares & Stars + Same Colored Symbol & Eraser & Dots & Triangles & Shapers
+158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars + Same Colored Symbol
+158412 - 0x09E69 (Right Row 4) - 0x09E72 - Black/White Squares & Stars + Same Colored Symbol & Rotated Shapers
+158413 - 0x09E7B (Right Row 5) - 0x09E69 - Black/White Squares & Stars + Same Colored Symbol & Eraser & Dots & Triangles & Shapers
158414 - 0x09E73 (Left Row 1) - True - Dots & Black/White Squares & Triangles
158415 - 0x09E75 (Left Row 2) - 0x09E73 - Dots & Black/White Squares & Shapers & Rotated Shapers
-158416 - 0x09E78 (Left Row 3) - 0x09E75 - Stars & Triangles & Stars + Same Colored Symbol & Shapers & Rotated Shapers
-158417 - 0x09E79 (Left Row 4) - 0x09E78 - Stars & Colored Squares & Stars + Same Colored Symbol & Triangles & Eraser
-158418 - 0x09E6C (Left Row 5) - 0x09E79 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158419 - 0x09E6F (Left Row 6) - 0x09E6C - Symmetry & Stars & Colored Squares & Black/White Squares & Stars + Same Colored Symbol & Symmetry & Eraser
-158420 - 0x09E6B (Left Row 7) - 0x09E6F - Symmetry & Dots & Full Dots & Triangles
+158416 - 0x09E78 (Left Row 3) - 0x09E75 - Triangles & Stars + Same Colored Symbol & Shapers & Rotated Shapers
+158417 - 0x09E79 (Left Row 4) - 0x09E78 - Colored Squares & Stars + Same Colored Symbol & Triangles & Eraser
+158418 - 0x09E6C (Left Row 5) - 0x09E79 - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158419 - 0x09E6F (Left Row 6) - 0x09E6C - Symmetry & Colored Squares & Black/White Squares & Stars + Same Colored Symbol & Symmetry & Eraser
+158420 - 0x09E6B (Left Row 7) - 0x09E6F - Symmetry & Full Dots & Triangles
158424 - 0x09EAD (Trash Pillar 1) - True - Rotated Shapers & Stars
158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Rotated Shapers & Triangles
@@ -1037,18 +1037,18 @@ Mountain Floor 1 Trash Pillar (Mountain Floor 1):
Mountain Floor 1 Back Section (Mountain Floor 1):
158421 - 0x33AF5 (Back Row 1) - True - Symmetry & Black/White Squares & Triangles
-158422 - 0x33AF7 (Back Row 2) - 0x33AF5 - Symmetry & Stars & Triangles & Stars + Same Colored Symbol
-158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Stars & Shapers & Stars + Same Colored Symbol
+158422 - 0x33AF7 (Back Row 2) - 0x33AF5 - Symmetry & Triangles & Stars + Same Colored Symbol
+158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Shapers & Stars + Same Colored Symbol
Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54:
Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B
Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 Above The Abyss - True - Mountain Pink Bridge EP - TrueOneWay:
-158426 - 0x09FD3 (Near Row 1) - True - Stars & Colored Squares & Stars + Same Colored Symbol
-158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Stars & Triangles & Stars + Same Colored Symbol
-158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
+158426 - 0x09FD3 (Near Row 1) - True - Colored Squares & Stars + Same Colored Symbol
+158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Triangles & Stars + Same Colored Symbol
+158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Shapers & Negative Shapers & Stars + Same Colored Symbol
158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars
-158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser
+158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Stars + Same Colored Symbol & Rotated Shapers & Eraser
Door - 0x09FFB (Staircase Near) - 0x09FD8
Mountain Floor 2 Above The Abyss (Mountain Floor 2) - Mountain Floor 2 Elevator Room - 0x09EDD & 0x09ED8 & 0x09E86:
@@ -1059,8 +1059,8 @@ Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2):
Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay - Mountain Floor 2 - 0x09ED8:
158432 - 0x09FCC (Far Row 1) - True - Triangles
-158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares & Stars & Stars + Same Colored Symbol
-158434 - 0x09FCF (Far Row 3) - 0x09FCE - Stars & Triangles & Stars + Same Colored Symbol
+158433 - 0x09FCE (Far Row 2) - 0x09FCC - Black/White Squares & Stars + Same Colored Symbol
+158434 - 0x09FCF (Far Row 3) - 0x09FCE - Triangles & Stars + Same Colored Symbol
158435 - 0x09FD0 (Far Row 4) - 0x09FCF - Rotated Shapers & Negative Shapers
158436 - 0x09FD1 (Far Row 5) - 0x09FD0 - Dots
158437 - 0x09FD2 (Far Row 6) - 0x09FD1 - Rotated Shapers
@@ -1088,19 +1088,19 @@ Door - 0x09F89 (Exit) - 0x09FDA
Mountain Bottom Floor (Mountain Bottom Floor) - Mountain Path to Caves - 0x17F33 - Mountain Bottom Floor Pillars Room - 0x0C141:
158614 - 0x17FA2 (Discard) - 0xFFF00 - Arrows
158445 - 0x01983 (Pillars Room Entry Left) - True - Shapers & Stars
-158446 - 0x01987 (Pillars Room Entry Right) - True - Squares & Colored Squares & Dots
+158446 - 0x01987 (Pillars Room Entry Right) - True - Colored Squares & Dots
Door - 0x0C141 (Pillars Room Entry) - 0x01983 & 0x01987
Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1
Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961:
-158522 - 0x0383A (Right Pillar 1) - True - Stars & Eraser & Triangles & Stars + Same Colored Symbol
-158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Dots & Full Dots & Triangles & Symmetry
-158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Shapers & Stars & Negative Shapers & Stars + Same Colored Symbol & Symmetry
-158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Eraser & Symmetry & Stars & Stars + Same Colored Symbol & Negative Shapers & Shapers
-158526 - 0x0383D (Left Pillar 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol
+158522 - 0x0383A (Right Pillar 1) - True - Eraser & Triangles & Stars + Same Colored Symbol
+158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Full Dots & Triangles & Symmetry
+158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Shapers & Negative Shapers & Stars + Same Colored Symbol & Symmetry
+158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Eraser & Symmetry & Stars + Same Colored Symbol & Negative Shapers & Shapers
+158526 - 0x0383D (Left Pillar 1) - True - Black/White Squares & Stars + Same Colored Symbol
158527 - 0x0383F (Left Pillar 2) - 0x0383D - Triangles & Symmetry
158528 - 0x03859 (Left Pillar 3) - 0x0383F - Symmetry & Shapers & Black/White Squares
-158529 - 0x339BB (Left Pillar 4) - 0x03859 - Symmetry & Black/White Squares & Stars & Stars + Same Colored Symbol & Triangles & Colored Dots
+158529 - 0x339BB (Left Pillar 4) - 0x03859 - Symmetry & Black/White Squares & Stars + Same Colored Symbol & Triangles & Colored Dots
Elevator (Mountain Bottom Floor):
158530 - 0x3D9A6 (Elevator Door Close Left) - True - True
@@ -1124,9 +1124,9 @@ Door - 0x2D77D (Caves Entry) - 0x00FF8
Caves Entry Door (Caves):
Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x019A5 - Caves Entry Door - TrueOneWay:
-158451 - 0x335AB (Elevator Inside Control) - True - Dots & Squares & Black/White Squares
-158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Squares & Black/White Squares
-158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Squares & Black/White Squares & Dots
+158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares
+158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares
+158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots
158454 - 0x00190 (Blue Tunnel Right First 1) - True - Arrows
158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Arrows
158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Arrows
@@ -1145,41 +1145,41 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01
158469 - 0x009A4 (Blue Tunnel Left Third 1) - True - Arrows & Stars
158470 - 0x018A0 (Blue Tunnel Right Third 1) - True - Arrows & Symmetry
158471 - 0x00A72 (Blue Tunnel Left Fourth 1) - True - Arrows & Shapers & Negative Shapers
-158472 - 0x32962 (First Floor Left) - True - Dots & Full Dots & Rotated Shapers
-158473 - 0x32966 (First Floor Grounded) - True - Stars & Triangles & Rotated Shapers & Black/White Squares & Stars + Same Colored Symbol
+158472 - 0x32962 (First Floor Left) - True - Full Dots & Rotated Shapers
+158473 - 0x32966 (First Floor Grounded) - True - Triangles & Rotated Shapers & Black/White Squares & Stars + Same Colored Symbol
158474 - 0x01A31 (First Floor Middle) - True - Stars
-158475 - 0x00B71 (First Floor Right) - True - Dots & Full Dots & Eraser & Stars & Stars + Same Colored Symbol & Colored Squares & Shapers & Negative Shapers
+158475 - 0x00B71 (First Floor Right) - True - Full Dots & Eraser & Stars + Same Colored Symbol & Colored Squares & Shapers & Negative Shapers
158478 - 0x288EA (First Wooden Beam) - True - Stars
158479 - 0x288FC (Second Wooden Beam) - True - Shapers & Eraser
158480 - 0x289E7 (Third Wooden Beam) - True - Eraser & Triangles
-158481 - 0x288AA (Fourth Wooden Beam) - True - Dots & Full Dots & Negative Shapers & Shapers
-158482 - 0x17FB9 (Left Upstairs Single) - True - Dots & Full Dots & Arrows & Black/White Squares
-158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots & Full Dots & Arrows
-158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Dots & Full Dots & Arrows
-158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Full Dots & Arrows
-158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Dots & Full Dots & Arrows
-158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Dots & Full Dots & Arrows
+158481 - 0x288AA (Fourth Wooden Beam) - True - Full Dots & Negative Shapers & Shapers
+158482 - 0x17FB9 (Left Upstairs Single) - True - Full Dots & Arrows & Black/White Squares
+158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Full Dots & Arrows
+158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Full Dots & Arrows
+158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Full Dots & Arrows
+158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Full Dots & Arrows
+158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Full Dots & Arrows
158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots & Black/White Squares & Colored Squares
-158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
-158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Triangles
-158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Stars & Stars + Same Colored Symbol & Shapers & Rotated Shapers
-158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Stars & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Eraser & Triangles
+158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Triangles
+158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Stars + Same Colored Symbol & Shapers & Rotated Shapers
+158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Stars + Same Colored Symbol & Shapers & Rotated Shapers & Eraser & Triangles
158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Shapers & Negative Shapers & Dots
158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Stars & Dots
-158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Stars & Stars + Same Colored Symbol & Eraser
+158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Stars + Same Colored Symbol & Eraser
158496 - 0x00027 (Right Upstairs Right Row 1) - True - Colored Squares & Black/White Squares & Eraser
158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Shapers & Symmetry
158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Symmetry & Triangles & Eraser
158476 - 0x09DD5 (Lone Pillar) - True - Arrows
Door - 0x019A5 (Pillar Door) - 0x09DD5
-158449 - 0x021D7 (Mountain Shortcut Panel) - True - Stars & Stars + Same Colored Symbol & Triangles & Eraser
+158449 - 0x021D7 (Mountain Shortcut Panel) - True - Stars + Same Colored Symbol & Triangles & Eraser
Door - 0x2D73F (Mountain Shortcut Door) - 0x021D7
158450 - 0x17CF2 (Swamp Shortcut Panel) - True - Arrows
Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2
159341 - 0x3397C (Skylight EP) - True - True
Caves Path to Challenge (Caves) - Challenge - 0x0A19A:
-158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Arrows & Stars + Same Colored Symbol
+158477 - 0x0A16E (Challenge Entry Panel) - True - Arrows & Stars + Same Colored Symbol
Door - 0x0A19A (Challenge Entry) - 0x0A16E
==Challenge==
diff --git a/worlds/witness/data/WitnessLogicVanilla.txt b/worlds/witness/data/WitnessLogicVanilla.txt
index a967a12e28c0..f3fa51bb9db2 100644
--- a/worlds/witness/data/WitnessLogicVanilla.txt
+++ b/worlds/witness/data/WitnessLogicVanilla.txt
@@ -52,11 +52,11 @@ Outside Tutorial Vault (Outside Tutorial):
158651 - 0x03481 (Vault Box) - True - True
Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170:
-158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots
+158011 - 0x0A171 (Outpost Entry Panel) - True - Full Dots
Door - 0x0A170 (Outpost Entry) - 0x0A171
Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3:
-158012 - 0x04CA4 (Outpost Exit Panel) - True - Dots & Full Dots
+158012 - 0x04CA4 (Outpost Exit Panel) - True - Full Dots
Door - 0x04CA3 (Outpost Exit) - 0x04CA4
158600 - 0x17CFB (Discard) - True - Triangles
@@ -136,12 +136,12 @@ Door - 0x18269 (Upper) - 0x1C349
159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True
Symmetry Island Upper (Symmetry Island):
-158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots
-158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots
-158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots
-158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots
-158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots
-158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots
+158065 - 0x00A52 (Laser Yellow 1) - True - Colored Dots
+158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Colored Dots
+158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Colored Dots
+158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Colored Dots
+158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Colored Dots
+158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Colored Dots
158700 - 0x0360D (Laser Panel) - 0x00A68 - True
Laser - 0x00509 (Laser) - 0x0360D
159001 - 0x03367 (Glass Factory Black Line EP) - True - True
@@ -157,7 +157,7 @@ Desert Obelisk (Desert) - Entry - True:
159709 - 0x00359 (Obelisk) - True - True
Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444:
-158652 - 0x0CC7B (Vault Panel) - True - Dots & Shapers & Rotated Shapers & Negative Shapers & Full Dots
+158652 - 0x0CC7B (Vault Panel) - True - Shapers & Rotated Shapers & Negative Shapers & Full Dots
Door - 0x03444 (Vault Door) - 0x0CC7B
158602 - 0x17CE7 (Discard) - True - Triangles
158076 - 0x00698 (Surface 1) - True - True
@@ -285,7 +285,7 @@ Quarry Stoneworks Middle Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - Tr
158125 - 0x00E0C (Lower Row 1) - True - Dots & Eraser
158126 - 0x01489 (Lower Row 2) - 0x00E0C - Dots & Eraser
158127 - 0x0148A (Lower Row 3) - 0x01489 - Dots & Eraser
-158128 - 0x014D9 (Lower Row 4) - 0x0148A - Dots & Full Dots & Eraser
+158128 - 0x014D9 (Lower Row 4) - 0x0148A - Full Dots & Eraser
158129 - 0x014E7 (Lower Row 5) - 0x014D9 - Dots
158130 - 0x014E8 (Lower Row 6) - 0x014E7 - Dots & Eraser
@@ -336,12 +336,12 @@ Quarry Boathouse Upper Back (Quarry Boathouse) - Quarry Boathouse Upper Middle -
158155 - 0x38663 (Second Barrier Panel) - True - True
Door - 0x3865F (Second Barrier) - 0x38663
158156 - 0x021B5 (Back First Row 1) - True - Stars & Eraser
-158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars & Stars + Same Colored Symbol & Eraser
+158157 - 0x021B6 (Back First Row 2) - 0x021B5 - Stars + Same Colored Symbol & Eraser
158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Stars & Eraser
-158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars & Stars + Same Colored Symbol & Eraser
-158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars & Stars + Same Colored Symbol & Eraser
-158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars & Stars + Same Colored Symbol & Eraser
-158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars & Stars + Same Colored Symbol & Eraser
+158159 - 0x021BB (Back First Row 4) - 0x021B7 - Stars + Same Colored Symbol & Eraser
+158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Stars + Same Colored Symbol & Eraser
+158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars + Same Colored Symbol & Eraser
+158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars + Same Colored Symbol & Eraser
158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Stars & Eraser & Shapers
158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Stars & Eraser & Shapers
158165 - 0x275FA (Hook Control) - True - Shapers & Eraser
@@ -537,11 +537,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
158221 - 0x28AE3 (Vines) - 0x18590 - True
158222 - 0x28938 (Apple Tree) - 0x28AE3 - True
158223 - 0x079DF (Triple Exit) - 0x28938 - True
-158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Dots & Full Dots
-158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Rotated Shapers & Dots & Full Dots
-158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Dots & Full Dots
-158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots & Full Dots
-158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots
+158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Full Dots
+158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Shapers & Rotated Shapers & Full Dots
+158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Rotated Shapers & Full Dots
+158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Full Dots
+158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Full Dots
Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1
158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers
Door - 0x28A61 (RGB House Entry) - 0x28998
@@ -575,7 +575,7 @@ Town Red Rooftop (Town):
158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True
Town Wooden Rooftop (Town):
-158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Shapers & Dots & Eraser & Full Dots
+158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Shapers & Eraser & Full Dots
Town Church (Town):
158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True
@@ -934,28 +934,28 @@ Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17
158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars & Colored Squares
Treehouse Left Orange Bridge (Treehouse) - Treehouse Laser Room Front Platform - 0x17DDB - Treehouse Laser Room Back Platform - 0x17DDB - Treehouse Burned House - 0x17DDB:
-158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars & Black/White Squares & Stars + Same Colored Symbol
+158376 - 0x17DB3 (Left Orange Bridge 1) - True - Black/White Squares & Stars + Same Colored Symbol
158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars & Black/White Squares
-158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars & Black/White Squares & Stars + Same Colored Symbol
-158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars & Black/White Squares & Stars + Same Colored Symbol
-158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Stars & Black/White Squares & Stars + Same Colored Symbol
-158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
-158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Stars & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
-158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Stars & Colored Squares & Stars + Same Colored Symbol
-158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Stars & Colored Squares & Stars + Same Colored Symbol
-158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars & Colored Squares & Stars + Same Colored Symbol
-158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars & Colored Squares & Stars + Same Colored Symbol
-158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Stars & Black/White Squares & Stars + Same Colored Symbol
-158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Stars & Black/White Squares & Stars + Same Colored Symbol
-158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Stars & Black/White Squares & Stars + Same Colored Symbol
-158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars & Black/White Squares & Stars + Same Colored Symbol
+158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Black/White Squares & Stars + Same Colored Symbol
+158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Black/White Squares & Stars + Same Colored Symbol
+158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Black/White Squares & Stars + Same Colored Symbol
+158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Colored Squares & Stars + Same Colored Symbol
+158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Colored Squares & Stars + Same Colored Symbol
+158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Colored Squares & Stars + Same Colored Symbol
+158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Colored Squares & Stars + Same Colored Symbol
+158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Black/White Squares & Stars + Same Colored Symbol
+158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Black/White Squares & Stars + Same Colored Symbol
+158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Black/White Squares & Stars + Same Colored Symbol
+158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Black/White Squares & Stars + Same Colored Symbol
Treehouse Green Bridge (Treehouse) - Treehouse Green Bridge Front House - 0x17E61 - Treehouse Green Bridge Left House - 0x17E61:
158369 - 0x17E3C (Green Bridge 1) - True - Stars & Shapers
158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Stars & Shapers
158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Stars & Shapers & Rotated Shapers
158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Stars & Rotated Shapers
-158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Stars & Shapers & Stars + Same Colored Symbol
+158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Shapers & Stars + Same Colored Symbol
158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Stars & Negative Shapers & Rotated Shapers
158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Stars & Shapers & Rotated Shapers
@@ -1046,8 +1046,8 @@ Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B
Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 Above The Abyss - True - Mountain Pink Bridge EP - TrueOneWay:
158426 - 0x09FD3 (Near Row 1) - True - Colored Squares
158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Colored Squares & Dots
-158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Colored Squares & Stars + Same Colored Symbol
-158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars & Colored Squares & Stars + Same Colored Symbol & Shapers
+158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Colored Squares & Stars + Same Colored Symbol
+158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Colored Squares & Stars + Same Colored Symbol & Shapers
158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Colored Squares
Door - 0x09FFB (Staircase Near) - 0x09FD8
@@ -1095,9 +1095,9 @@ Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1
Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961:
158522 - 0x0383A (Right Pillar 1) - True - Stars
158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Stars & Dots
-158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Full Dots
+158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Full Dots
158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Dots & Symmetry
-158526 - 0x0383D (Left Pillar 1) - True - Dots & Full Dots
+158526 - 0x0383D (Left Pillar 1) - True - Full Dots
158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares
158528 - 0x03859 (Left Pillar 3) - 0x0383F - Shapers
158529 - 0x339BB (Left Pillar 4) - 0x03859 - Black/White Squares & Stars & Symmetry
@@ -1148,28 +1148,28 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01
158472 - 0x32962 (First Floor Left) - True - Rotated Shapers & Shapers
158473 - 0x32966 (First Floor Grounded) - True - Stars & Black/White Squares
158474 - 0x01A31 (First Floor Middle) - True - Colored Squares
-158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars & Stars + Same Colored Symbol & Eraser
+158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars + Same Colored Symbol & Eraser
158478 - 0x288EA (First Wooden Beam) - True - Rotated Shapers
158479 - 0x288FC (Second Wooden Beam) - True - Black/White Squares & Shapers & Rotated Shapers
158480 - 0x289E7 (Third Wooden Beam) - True - Black/White Squares
158481 - 0x288AA (Fourth Wooden Beam) - True - Black/White Squares & Shapers
158482 - 0x17FB9 (Left Upstairs Single) - True - Dots
-158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots & Full Dots
-158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Dots & Full Dots
-158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Full Dots
-158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Dots & Full Dots
-158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Dots & Full Dots
-158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots & Invisible Dots
-158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Dots & Invisible Dots
-158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Dots & Invisible Dots
-158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Dots & Invisible Dots
-158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Dots & Invisible Dots
-158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Dots & Invisible Dots
-158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Dots & Invisible Dots
-158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Invisible Dots
-158496 - 0x00027 (Right Upstairs Right Row 1) - True - Dots & Invisible Dots & Symmetry
-158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Dots & Invisible Dots & Symmetry
-158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Dots & Invisible Dots & Symmetry
+158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Full Dots
+158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Full Dots
+158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Full Dots
+158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Full Dots
+158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Full Dots
+158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots
+158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Dots
+158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Dots
+158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Dots
+158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Dots
+158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Dots
+158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Dots
+158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots
+158496 - 0x00027 (Right Upstairs Right Row 1) - True - Dots & Symmetry
+158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Dots & Symmetry
+158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Dots & Symmetry
158476 - 0x09DD5 (Lone Pillar) - True - Triangles
Door - 0x019A5 (Pillar Door) - 0x09DD5
158449 - 0x021D7 (Mountain Shortcut Panel) - True - Stars
@@ -1179,7 +1179,7 @@ Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2
159341 - 0x3397C (Skylight EP) - True - True
Caves Path to Challenge (Caves) - Challenge - 0x0A19A:
-158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol
+158477 - 0x0A16E (Challenge Entry Panel) - True - Shapers & Stars + Same Colored Symbol
Door - 0x0A19A (Challenge Entry) - 0x0A16E
==Challenge==
diff --git a/worlds/witness/data/WitnessLogicVariety.txt b/worlds/witness/data/WitnessLogicVariety.txt
index bc9a40f566f0..1014558a66a3 100644
--- a/worlds/witness/data/WitnessLogicVariety.txt
+++ b/worlds/witness/data/WitnessLogicVariety.txt
@@ -28,11 +28,11 @@ Tutorial (Tutorial) - Outside Tutorial - True:
Outside Tutorial (Outside Tutorial) - Outside Tutorial Path To Outpost - 0x03BA2 - Outside Tutorial Vault - 0x033D0:
158650 - 0x033D4 (Vault Panel) - True - Dots & Black/White Squares & Colored Squares & Symmetry
Door - 0x033D0 (Vault Door) - 0x033D4
-158013 - 0x0005D (Shed Row 1) - True - Dots & Full Dots & Black/White Squares & Colored Squares
-158014 - 0x0005E (Shed Row 2) - 0x0005D - Dots & Full Dots & Stars
-158015 - 0x0005F (Shed Row 3) - 0x0005E - Dots & Full Dots & Shapers & Negative Shapers
-158016 - 0x00060 (Shed Row 4) - 0x0005F - Dots & Full Dots & Black/White Squares & Stars & Stars + Same Colored Symbol & Eraser
-158017 - 0x00061 (Shed Row 5) - 0x00060 - Dots & Full Dots & Triangles
+158013 - 0x0005D (Shed Row 1) - True - Full Dots & Black/White Squares & Colored Squares
+158014 - 0x0005E (Shed Row 2) - 0x0005D - Full Dots & Stars
+158015 - 0x0005F (Shed Row 3) - 0x0005E - Full Dots & Shapers & Negative Shapers
+158016 - 0x00060 (Shed Row 4) - 0x0005F - Full Dots & Black/White Squares & Stars + Same Colored Symbol & Eraser
+158017 - 0x00061 (Shed Row 5) - 0x00060 - Full Dots & Triangles
158018 - 0x018AF (Tree Row 1) - True - Arrows
158019 - 0x0001B (Tree Row 2) - 0x018AF - Arrows
158020 - 0x012C9 (Tree Row 3) - 0x0001B - Arrows
@@ -52,11 +52,11 @@ Outside Tutorial Vault (Outside Tutorial):
158651 - 0x03481 (Vault Box) - True - True
Outside Tutorial Path To Outpost (Outside Tutorial) - Outside Tutorial Outpost - 0x0A170:
-158011 - 0x0A171 (Outpost Entry Panel) - True - Dots & Full Dots & Triangles & Black/White Squares
+158011 - 0x0A171 (Outpost Entry Panel) - True - Full Dots & Triangles & Black/White Squares
Door - 0x0A170 (Outpost Entry) - 0x0A171
Outside Tutorial Outpost (Outside Tutorial) - Outside Tutorial - 0x04CA3:
-158012 - 0x04CA4 (Outpost Exit Panel) - True - Dots & Full Dots & Triangles & Black/White Squares
+158012 - 0x04CA4 (Outpost Exit Panel) - True - Full Dots & Triangles & Black/White Squares
Door - 0x04CA3 (Outpost Exit) - 0x04CA4
158600 - 0x17CFB (Discard) - True - Arrows & Triangles
@@ -108,11 +108,11 @@ Outside Symmetry Island (Symmetry Island) - Main Island - True - Symmetry Island
Door - 0x17F3E (Lower) - 0x000B0
Symmetry Island Lower (Symmetry Island) - Symmetry Island Upper - 0x18269:
-158041 - 0x00022 (Right 1) - True - Symmetry & Dots & Full Dots & Triangles
-158042 - 0x00023 (Right 2) - 0x00022 - Symmetry & Dots & Full Dots & Triangles
-158043 - 0x00024 (Right 3) - 0x00023 - Symmetry & Dots & Full Dots & Triangles
-158044 - 0x00025 (Right 4) - 0x00024 - Symmetry & Dots & Full Dots & Triangles
-158045 - 0x00026 (Right 5) - 0x00025 - Symmetry & Dots & Full Dots & Triangles
+158041 - 0x00022 (Right 1) - True - Symmetry & Full Dots & Triangles
+158042 - 0x00023 (Right 2) - 0x00022 - Symmetry & Full Dots & Triangles
+158043 - 0x00024 (Right 3) - 0x00023 - Symmetry & Full Dots & Triangles
+158044 - 0x00025 (Right 4) - 0x00024 - Symmetry & Full Dots & Triangles
+158045 - 0x00026 (Right 5) - 0x00025 - Symmetry & Full Dots & Triangles
158046 - 0x0007C (Back 1) - 0x00026 - Symmetry & Dots & Colored Dots
158047 - 0x0007E (Back 2) - 0x0007C - Symmetry & Dots & Colored Dots
158048 - 0x00075 (Back 3) - 0x0007E - Symmetry & Dots & Colored Dots
@@ -122,8 +122,8 @@ Symmetry Island Lower (Symmetry Island) - Symmetry Island Upper - 0x18269:
158052 - 0x00065 (Left 1) - 0x00079 - Symmetry & Dots & Colored Dots
158053 - 0x0006D (Left 2) - 0x00065 - Symmetry & Colored Squares
158054 - 0x00072 (Left 3) - 0x0006D - Symmetry & Stars
-158055 - 0x0006F (Left 4) - 0x00072 - Symmetry & Stars & Stars + Same Colored Symbol & Colored Squares
-158056 - 0x00070 (Left 5) - 0x0006F - Symmetry & Stars & Stars + Same Colored Symbol & Colored Squares
+158055 - 0x0006F (Left 4) - 0x00072 - Symmetry & Stars + Same Colored Symbol & Colored Squares
+158056 - 0x00070 (Left 5) - 0x0006F - Symmetry & Stars + Same Colored Symbol & Colored Squares
158057 - 0x00071 (Left 6) - 0x00070 - Symmetry & Colored Dots & Eraser
158058 - 0x00076 (Left 7) - 0x00071 - Symmetry & Dots & Eraser
158059 - 0x009B8 (Scenery Outlines 1) - True - Symmetry
@@ -136,12 +136,12 @@ Door - 0x18269 (Upper) - 0x1C349
159000 - 0x0332B (Glass Factory Black Line Reflection EP) - True - True
Symmetry Island Upper (Symmetry Island):
-158065 - 0x00A52 (Laser Yellow 1) - True - Symmetry & Colored Dots
-158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Symmetry & Colored Dots
-158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Symmetry & Colored Dots
-158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Symmetry & Colored Dots
-158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Symmetry & Colored Dots
-158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Symmetry & Colored Dots
+158065 - 0x00A52 (Laser Yellow 1) - True - Colored Dots
+158066 - 0x00A57 (Laser Yellow 2) - 0x00A52 - Colored Dots
+158067 - 0x00A5B (Laser Yellow 3) - 0x00A57 - Colored Dots
+158068 - 0x00A61 (Laser Blue 1) - 0x00A52 - Colored Dots
+158069 - 0x00A64 (Laser Blue 2) - 0x00A61 & 0x00A57 - Colored Dots
+158070 - 0x00A68 (Laser Blue 3) - 0x00A64 & 0x00A5B - Colored Dots
158700 - 0x0360D (Laser Panel) - 0x00A68 - True
Laser - 0x00509 (Laser) - 0x0360D
159001 - 0x03367 (Glass Factory Black Line EP) - True - True
@@ -157,7 +157,7 @@ Desert Obelisk (Desert) - Entry - True:
159709 - 0x00359 (Obelisk) - True - True
Desert Outside (Desert) - Main Island - True - Desert Light Room - 0x09FEE - Desert Vault - 0x03444:
-158652 - 0x0CC7B (Vault Panel) - True - Dots & Full Dots & Rotated Shapers & Negative Shapers & Stars & Stars + Same Colored Symbol
+158652 - 0x0CC7B (Vault Panel) - True - Full Dots & Rotated Shapers & Negative Shapers & Stars + Same Colored Symbol
Door - 0x03444 (Vault Door) - 0x0CC7B
158602 - 0x17CE7 (Discard) - True - Arrows & Triangles
158076 - 0x00698 (Surface 1) - True - True
@@ -270,7 +270,7 @@ Door - 0x17C07 (Entry 2) - 0x17C09
Quarry (Quarry) - Quarry Stoneworks Ground Floor - 0x02010:
159802 - 0xFFD01 (Inside Reached Independently) - True - True
-158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Stars & Stars + Same Colored Symbol & Eraser
+158121 - 0x01E5A (Stoneworks Entry Left Panel) - True - Stars + Same Colored Symbol & Eraser
158122 - 0x01E59 (Stoneworks Entry Right Panel) - True - Triangles
Door - 0x02010 (Stoneworks Entry) - 0x01E59 & 0x01E5A
@@ -299,14 +299,14 @@ Quarry Stoneworks Upper Floor (Quarry Stoneworks) - Quarry Stoneworks Lift - 0x0
158135 - 0x005F1 (Upper Row 2) - 0x00557 - Colored Squares & Eraser
158136 - 0x00620 (Upper Row 3) - 0x005F1 - Colored Squares & Eraser
158137 - 0x009F5 (Upper Row 4) - 0x00620 - Colored Squares & Eraser
-158138 - 0x0146C (Upper Row 5) - 0x009F5 - Stars & Stars + Same Colored Symbol & Eraser
-158139 - 0x3C12D (Upper Row 6) - 0x0146C - Stars & Stars + Same Colored Symbol & Eraser
-158140 - 0x03686 (Upper Row 7) - 0x3C12D - Stars & Stars + Same Colored Symbol & Eraser
-158141 - 0x014E9 (Upper Row 8) - 0x03686 - Stars & Stars + Same Colored Symbol & Eraser
+158138 - 0x0146C (Upper Row 5) - 0x009F5 - Stars + Same Colored Symbol & Eraser
+158139 - 0x3C12D (Upper Row 6) - 0x0146C - Stars + Same Colored Symbol & Eraser
+158140 - 0x03686 (Upper Row 7) - 0x3C12D - Stars + Same Colored Symbol & Eraser
+158141 - 0x014E9 (Upper Row 8) - 0x03686 - Stars + Same Colored Symbol & Eraser
158142 - 0x03677 (Stairs Panel) - True - Colored Squares & Eraser
Door - 0x0368A (Stairs) - 0x03677
158143 - 0x3C125 (Control Room Left) - 0x014E9 - Black/White Squares & Dots & Eraser & Symmetry
-158144 - 0x0367C (Control Room Right) - 0x014E9 - Colored Squares & Dots & Eraser & Stars & Stars + Same Colored Symbol
+158144 - 0x0367C (Control Room Right) - 0x014E9 - Colored Squares & Dots & Eraser & Stars + Same Colored Symbol
159411 - 0x0069D (Ramp EP) - 0x03676 & 0x275FF - True
159413 - 0x00614 (Lift EP) - 0x275FF & 0x03675 - True
@@ -340,13 +340,13 @@ Door - 0x3865F (Second Barrier) - 0x38663
158158 - 0x021B7 (Back First Row 3) - 0x021B6 - Shapers & Negative Shapers & Eraser
158159 - 0x021BB (Back First Row 4) - 0x021B7 - Shapers & Negative Shapers & Eraser
158160 - 0x09DB5 (Back First Row 5) - 0x021BB - Shapers & Negative Shapers & Eraser
-158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars & Stars + Same Colored Symbol & Eraser & Colored Squares
-158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars & Stars + Same Colored Symbol & Eraser & Colored Squares
-158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Stars & Stars + Same Colored Symbol & Eraser & Colored Squares & Triangles
-158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Stars & Stars + Same Colored Symbol & Eraser & Colored Squares & Triangles
+158161 - 0x09DB1 (Back First Row 6) - 0x09DB5 - Stars + Same Colored Symbol & Eraser & Colored Squares
+158162 - 0x3C124 (Back First Row 7) - 0x09DB1 - Stars + Same Colored Symbol & Eraser & Colored Squares
+158163 - 0x09DB3 (Back First Row 8) - 0x3C124 - Stars + Same Colored Symbol & Eraser & Colored Squares & Triangles
+158164 - 0x09DB4 (Back First Row 9) - 0x09DB3 - Stars + Same Colored Symbol & Eraser & Colored Squares & Triangles
158165 - 0x275FA (Hook Control) - True - Shapers & Eraser
158167 - 0x0A3CB (Back Second Row 1) - 0x09DB4 - Black/White Squares & Colored Squares & Eraser & Shapers
-158168 - 0x0A3CC (Back Second Row 2) - 0x0A3CB - Stars & Stars + Same Colored Symbol & Eraser & Shapers
+158168 - 0x0A3CC (Back Second Row 2) - 0x0A3CB - Stars + Same Colored Symbol & Eraser & Shapers
158169 - 0x0A3D0 (Back Second Row 3) - 0x0A3CC - Triangles & Eraser & Shapers
159401 - 0x005F6 (Hook EP) - 0x275FA & 0x03852 & 0x3865F - True
@@ -421,7 +421,7 @@ Door - 0x01A0E (Hedge Maze 4 Exit) - 0x01A0F
Keep 2nd Pressure Plate (Keep) - Keep 3rd Pressure Plate - True:
158199 - 0x0A3B9 (Reset Pressure Plates 2) - True - True
-158200 - 0x01BE9 (Pressure Plates 2) - 0x0A3B9 - Stars & Stars + Same Colored Symbol & Triangles
+158200 - 0x01BE9 (Pressure Plates 2) - 0x0A3B9 - Stars + Same Colored Symbol & Triangles
Door - 0x01BEA (Pressure Plates 2 Exit) - 0x01BE9
Keep 3rd Pressure Plate (Keep) - Keep 4th Pressure Plate - 0x01CD5:
@@ -441,7 +441,7 @@ Keep Tower (Keep) - Keep - 0x04F8F:
158206 - 0x0361B (Tower Shortcut Panel) - True - True
Door - 0x04F8F (Tower Shortcut) - 0x0361B
158704 - 0x0360E (Laser Panel Hedges) - 0x01A0F & 0x019E7 & 0x019DC & 0x00139 - True
-158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Dots & Shapers & Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol
+158705 - 0x03317 (Laser Panel Pressure Plates) - 0x033EA & 0x01BE9 & 0x01CD3 & 0x01D3F - Dots & Shapers & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
Laser - 0x014BB (Laser) - 0x0360E | 0x03317
159240 - 0x033BE (Pressure Plates 1 EP) - 0x033EA - True
159241 - 0x033BF (Pressure Plates 2 EP) - 0x01BE9 - True
@@ -537,11 +537,11 @@ Door - 0x0A0C9 (Cargo Box Entry) - 0x0A0C8
158221 - 0x28AE3 (Vines) - 0x18590 - True
158222 - 0x28938 (Apple Tree) - 0x28AE3 - True
158223 - 0x079DF (Triple Exit) - 0x28938 - True
-158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Dots & Full Dots & Colored Squares
-158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Rotated Shapers & Dots & Full Dots & Stars
-158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Negative Shapers & Dots & Full Dots
-158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Dots & Full Dots
-158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Dots & Full Dots & Triangles
+158235 - 0x2899C (Wooden Roof Lower Row 1) - True - Rotated Shapers & Full Dots & Colored Squares
+158236 - 0x28A33 (Wooden Roof Lower Row 2) - 0x2899C - Rotated Shapers & Full Dots & Stars
+158237 - 0x28ABF (Wooden Roof Lower Row 3) - 0x28A33 - Shapers & Negative Shapers & Full Dots
+158238 - 0x28AC0 (Wooden Roof Lower Row 4) - 0x28ABF - Rotated Shapers & Full Dots
+158239 - 0x28AC1 (Wooden Roof Lower Row 5) - 0x28AC0 - Rotated Shapers & Full Dots & Triangles
Door - 0x034F5 (Wooden Roof Stairs) - 0x28AC1
158225 - 0x28998 (RGB House Entry Panel) - True - Stars & Rotated Shapers
Door - 0x28A61 (RGB House Entry) - 0x28998
@@ -575,7 +575,7 @@ Town Red Rooftop (Town):
158224 - 0x28B39 (Tall Hexagonal) - 0x079DF - True
Town Wooden Rooftop (Town):
-158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Rotated Shapers & Dots & Eraser & Full Dots
+158240 - 0x28AD9 (Wooden Rooftop) - 0x28AC1 - Rotated Shapers & Eraser & Full Dots
Town Church (Town):
158227 - 0x28A69 (Church Lattice) - 0x03BB0 - True
@@ -631,8 +631,8 @@ Theater (Theater) - Town - 0x0A16D | 0x3CCDF:
158660 - 0x03549 (Challenge Video) - 0x00815 & 0x0356B - True
158661 - 0x0354F (Shipwreck Video) - 0x00815 & 0x03535 - True
158662 - 0x03545 (Mountain Video) - 0x00815 & 0x03542 - True
-158249 - 0x0A168 (Exit Left Panel) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Shapers
-158250 - 0x33AB2 (Exit Right Panel) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Shapers
+158249 - 0x0A168 (Exit Left Panel) - True - Black/White Squares & Stars + Same Colored Symbol & Shapers
+158250 - 0x33AB2 (Exit Right Panel) - True - Black/White Squares & Stars + Same Colored Symbol & Shapers
Door - 0x0A16D (Exit Left) - 0x0A168
Door - 0x3CCDF (Exit Right) - 0x33AB2
158608 - 0x17CF7 (Discard) - True - Arrows & Triangles
@@ -851,8 +851,8 @@ Swamp Maze (Swamp) - Swamp Laser Area - 0x17C0A & 0x17E07:
Swamp Laser Area (Swamp) - Outside Swamp - 0x2D880:
158711 - 0x03615 (Laser Panel) - True - True
Laser - 0x00BF6 (Laser) - 0x03615
-158341 - 0x17C05 (Laser Shortcut Left Panel) - True - Shapers & Colored Squares & Stars & Stars + Same Colored Symbol
-158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Colored Squares & Stars & Stars + Same Colored Symbol
+158341 - 0x17C05 (Laser Shortcut Left Panel) - True - Shapers & Colored Squares & Stars + Same Colored Symbol
+158342 - 0x17C02 (Laser Shortcut Right Panel) - 0x17C05 - Shapers & Colored Squares & Stars + Same Colored Symbol
Door - 0x2D880 (Laser Shortcut) - 0x17C02
==Treehouse==
@@ -878,7 +878,7 @@ Door - 0x0C309 (First Door) - 0x0288C
159210 - 0x33721 (Buoy EP) - 0x17C95 - True
Treehouse Between Entry Doors (Treehouse) - Treehouse Yellow Bridge - 0x0C310:
-158345 - 0x02886 (Second Door Panel) - True - Stars & Stars + Same Colored Symbol & Triangles
+158345 - 0x02886 (Second Door Panel) - True - Stars + Same Colored Symbol & Triangles
Door - 0x0C310 (Second Door) - 0x02886
Treehouse Yellow Bridge (Treehouse) - Treehouse After Yellow Bridge - 0x17DC4:
@@ -907,57 +907,57 @@ Treehouse First Purple Bridge (Treehouse) - Treehouse Second Purple Bridge - 0x1
158361 - 0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Dots & Triangles
Treehouse Right Orange Bridge (Treehouse) - Treehouse Drawbridge Platform - 0x17DA2:
-158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars & Stars + Same Colored Symbol & Colored Squares
-158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars & Stars + Same Colored Symbol & Colored Squares
-158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars & Stars + Same Colored Symbol & Colored Squares
-158394 - 0x17CE3 (Right Orange Bridge 4 & Directional) - 0x17D8C - Stars & Stars + Same Colored Symbol & Colored Squares
-158395 - 0x17DCD (Right Orange Bridge 5) - 0x17CE3 - Stars & Stars + Same Colored Symbol & Colored Squares
-158396 - 0x17DB2 (Right Orange Bridge 6) - 0x17DCD - Stars & Stars + Same Colored Symbol & Colored Squares
-158397 - 0x17DCC (Right Orange Bridge 7) - 0x17DB2 - Stars & Stars + Same Colored Symbol & Colored Squares
-158398 - 0x17DCA (Right Orange Bridge 8) - 0x17DCC - Stars & Stars + Same Colored Symbol & Colored Squares
-158399 - 0x17D8E (Right Orange Bridge 9) - 0x17DCA - Stars & Stars + Same Colored Symbol & Colored Squares
-158400 - 0x17DB7 (Right Orange Bridge 10 & Directional) - 0x17D8E - Stars & Stars + Same Colored Symbol & Colored Squares
-158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars & Stars + Same Colored Symbol & Colored Squares
-158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars & Stars + Same Colored Symbol & Colored Squares
+158391 - 0x17D88 (Right Orange Bridge 1) - True - Stars + Same Colored Symbol & Colored Squares
+158392 - 0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars + Same Colored Symbol & Colored Squares
+158393 - 0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars + Same Colored Symbol & Colored Squares
+158394 - 0x17CE3 (Right Orange Bridge 4 & Directional) - 0x17D8C - Stars + Same Colored Symbol & Colored Squares
+158395 - 0x17DCD (Right Orange Bridge 5) - 0x17CE3 - Stars + Same Colored Symbol & Colored Squares
+158396 - 0x17DB2 (Right Orange Bridge 6) - 0x17DCD - Stars + Same Colored Symbol & Colored Squares
+158397 - 0x17DCC (Right Orange Bridge 7) - 0x17DB2 - Stars + Same Colored Symbol & Colored Squares
+158398 - 0x17DCA (Right Orange Bridge 8) - 0x17DCC - Stars + Same Colored Symbol & Colored Squares
+158399 - 0x17D8E (Right Orange Bridge 9) - 0x17DCA - Stars + Same Colored Symbol & Colored Squares
+158400 - 0x17DB7 (Right Orange Bridge 10 & Directional) - 0x17D8E - Stars + Same Colored Symbol & Colored Squares
+158401 - 0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars + Same Colored Symbol & Colored Squares
+158402 - 0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars + Same Colored Symbol & Colored Squares
Treehouse Drawbridge Platform (Treehouse) - Main Island - 0x0C32D:
158404 - 0x037FF (Drawbridge Panel) - True - Stars
Door - 0x0C32D (Drawbridge) - 0x037FF
Treehouse Second Purple Bridge (Treehouse) - Treehouse Left Orange Bridge - 0x17DC6:
-158362 - 0x17D9B (Second Purple Bridge 1) - True - Stars & Stars + Same Colored Symbol & Black/White Squares & Colored Squares
-158363 - 0x17D99 (Second Purple Bridge 2) - 0x17D9B - Stars & Stars + Same Colored Symbol & Black/White Squares & Colored Squares
-158364 - 0x17DAA (Second Purple Bridge 3) - 0x17D99 - Stars & Stars + Same Colored Symbol & Black/White Squares & Colored Squares
-158365 - 0x17D97 (Second Purple Bridge 4) - 0x17DAA - Stars & Stars + Same Colored Symbol & Black/White Squares & Colored Squares
-158366 - 0x17BDF (Second Purple Bridge 5) - 0x17D97 - Stars & Stars + Same Colored Symbol & Colored Squares
-158367 - 0x17D91 (Second Purple Bridge 6) - 0x17BDF - Stars & Stars + Same Colored Symbol & Black/White Squares & Colored Squares
-158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars & Stars + Same Colored Symbol & Colored Squares
+158362 - 0x17D9B (Second Purple Bridge 1) - True - Stars + Same Colored Symbol & Black/White Squares & Colored Squares
+158363 - 0x17D99 (Second Purple Bridge 2) - 0x17D9B - Stars + Same Colored Symbol & Black/White Squares & Colored Squares
+158364 - 0x17DAA (Second Purple Bridge 3) - 0x17D99 - Stars + Same Colored Symbol & Black/White Squares & Colored Squares
+158365 - 0x17D97 (Second Purple Bridge 4) - 0x17DAA - Stars + Same Colored Symbol & Black/White Squares & Colored Squares
+158366 - 0x17BDF (Second Purple Bridge 5) - 0x17D97 - Stars + Same Colored Symbol & Colored Squares
+158367 - 0x17D91 (Second Purple Bridge 6) - 0x17BDF - Stars + Same Colored Symbol & Black/White Squares & Colored Squares
+158368 - 0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars + Same Colored Symbol & Colored Squares
Treehouse Left Orange Bridge (Treehouse) - Treehouse Laser Room Front Platform - 0x17DDB - Treehouse Laser Room Back Platform - 0x17DDB - Treehouse Burned House - 0x17DDB:
-158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars & Stars + Same Colored Symbol & Triangles
-158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars & Stars + Same Colored Symbol & Triangles
-158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars & Stars + Same Colored Symbol & Triangles
-158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars & Stars + Same Colored Symbol & Triangles
-158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers
-158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers
-158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers
-158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers
-158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Stars & Black/White Squares & Stars + Same Colored Symbol
-158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars & Stars + Same Colored Symbol & Shapers
-158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars & Stars + Same Colored Symbol & Shapers
-158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers
-158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Stars & Stars + Same Colored Symbol & Shapers & Triangles
-158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers
-158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars & Stars + Same Colored Symbol & Shapers & Triangles
+158376 - 0x17DB3 (Left Orange Bridge 1) - True - Stars + Same Colored Symbol & Triangles
+158377 - 0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars + Same Colored Symbol & Triangles
+158378 - 0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars + Same Colored Symbol & Triangles
+158379 - 0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars + Same Colored Symbol & Triangles
+158380 - 0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Black/White Squares & Stars + Same Colored Symbol & Shapers
+158381 - 0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Black/White Squares & Stars + Same Colored Symbol & Shapers
+158382 - 0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Black/White Squares & Stars + Same Colored Symbol & Shapers
+158383 - 0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Black/White Squares & Stars + Same Colored Symbol & Shapers
+158384 - 0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Black/White Squares & Stars + Same Colored Symbol
+158385 - 0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars + Same Colored Symbol & Shapers
+158386 - 0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars + Same Colored Symbol & Shapers
+158387 - 0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Black/White Squares & Stars + Same Colored Symbol & Shapers
+158388 - 0x17DAE (Left Orange Bridge 13) - 0x17DEC - Stars + Same Colored Symbol & Shapers & Triangles
+158389 - 0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Black/White Squares & Stars + Same Colored Symbol & Shapers
+158390 - 0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars + Same Colored Symbol & Shapers & Triangles
Treehouse Green Bridge (Treehouse) - Treehouse Green Bridge Front House - 0x17E61 - Treehouse Green Bridge Left House - 0x17E61:
-158369 - 0x17E3C (Green Bridge 1) - True - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Stars & Rotated Shapers & Negative Shapers & Stars + Same Colored Symbol
-158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
-158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol
+158369 - 0x17E3C (Green Bridge 1) - True - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158370 - 0x17E4D (Green Bridge 2) - 0x17E3C - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158371 - 0x17E4F (Green Bridge 3) - 0x17E4D - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158372 - 0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Rotated Shapers & Negative Shapers & Stars + Same Colored Symbol
+158373 - 0x17E5B (Green Bridge 5) - 0x17E52 - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158374 - 0x17E5F (Green Bridge 6) - 0x17E5B - Shapers & Negative Shapers & Stars + Same Colored Symbol
+158375 - 0x17E61 (Green Bridge 7) - 0x17E5F - Shapers & Negative Shapers & Stars + Same Colored Symbol
Treehouse Green Bridge Front House (Treehouse):
158610 - 0x17FA9 (Green Bridge Discard) - True - Arrows & Triangles
@@ -1019,17 +1019,17 @@ Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39:
Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay - Mountain Floor 1 Trash Pillar - TrueOneWay - Mountain Floor 1 Back Section - TrueOneWay:
158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots
-158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots & Stars & Stars + Same Colored Symbol
-158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars & Stars + Same Colored Symbol
-158412 - 0x09E69 (Right Row 4) - 0x09E72 - Black/White Squares & Eraser & Stars & Stars + Same Colored Symbol
-158413 - 0x09E7B (Right Row 5) - 0x09E69 - Dots & Full Dots & Triangles
+158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots & Stars + Same Colored Symbol
+158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars + Same Colored Symbol
+158412 - 0x09E69 (Right Row 4) - 0x09E72 - Black/White Squares & Eraser & Stars + Same Colored Symbol
+158413 - 0x09E7B (Right Row 5) - 0x09E69 - Full Dots & Triangles
158414 - 0x09E73 (Left Row 1) - True - Dots & Black/White Squares
158415 - 0x09E75 (Left Row 2) - 0x09E73 - Arrows & Black/White Squares
158416 - 0x09E78 (Left Row 3) - 0x09E75 - Arrows & Stars
158417 - 0x09E79 (Left Row 4) - 0x09E78 - Arrows & Shapers & Rotated Shapers
-158418 - 0x09E6C (Left Row 5) - 0x09E79 - Arrows & Black/White Squares & Stars & Stars + Same Colored Symbol
-158419 - 0x09E6F (Left Row 6) - 0x09E6C - Arrows & Dots & Full Dots
-158420 - 0x09E6B (Left Row 7) - 0x09E6F - Arrows & Dots & Full Dots
+158418 - 0x09E6C (Left Row 5) - 0x09E79 - Arrows & Black/White Squares & Stars + Same Colored Symbol
+158419 - 0x09E6F (Left Row 6) - 0x09E6C - Arrows & Full Dots
+158420 - 0x09E6B (Left Row 7) - 0x09E6F - Arrows & Full Dots
158424 - 0x09EAD (Trash Pillar 1) - True - Triangles & Arrows
158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Triangles & Arrows
@@ -1044,10 +1044,10 @@ Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54:
Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B
Mountain Floor 2 (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Near - 0x09FFB - Mountain Floor 2 Beyond Bridge - 0x09E86 - Mountain Floor 2 Above The Abyss - True - Mountain Pink Bridge EP - TrueOneWay:
-158426 - 0x09FD3 (Near Row 1) - True - Stars & Stars + Same Colored Symbol & Colored Squares
-158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Stars & Stars + Same Colored Symbol & Triangles
-158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars & Stars + Same Colored Symbol & Colored Squares & Eraser
-158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars & Stars + Same Colored Symbol & Shapers & Eraser
+158426 - 0x09FD3 (Near Row 1) - True - Stars + Same Colored Symbol & Colored Squares
+158427 - 0x09FD4 (Near Row 2) - 0x09FD3 - Stars + Same Colored Symbol & Triangles
+158428 - 0x09FD6 (Near Row 3) - 0x09FD4 - Stars + Same Colored Symbol & Colored Squares & Eraser
+158429 - 0x09FD7 (Near Row 4) - 0x09FD6 - Stars + Same Colored Symbol & Shapers & Eraser
158430 - 0x09FD8 (Near Row 5) - 0x09FD7 - Symmetry & Triangles
Door - 0x09FFB (Staircase Near) - 0x09FD8
@@ -1055,19 +1055,19 @@ Mountain Floor 2 Above The Abyss (Mountain Floor 2) - Mountain Floor 2 Elevator
Door - 0x09EDD (Elevator Room Entry) - 0x09ED8 & 0x09E86
Mountain Floor 2 Light Bridge Room Near (Mountain Floor 2):
-158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser
+158431 - 0x09E86 (Light Bridge Controller Near) - True - Stars + Same Colored Symbol & Rotated Shapers & Eraser
Mountain Floor 2 Beyond Bridge (Mountain Floor 2) - Mountain Floor 2 Light Bridge Room Far - 0x09E07 - Mountain Pink Bridge EP - TrueOneWay - Mountain Floor 2 - 0x09ED8:
158432 - 0x09FCC (Far Row 1) - True - Black/White Squares
158433 - 0x09FCE (Far Row 2) - 0x09FCC - Triangles
158434 - 0x09FCF (Far Row 3) - 0x09FCE - Stars
-158435 - 0x09FD0 (Far Row 4) - 0x09FCF - Stars & Stars + Same Colored Symbol & Colored Squares
+158435 - 0x09FD0 (Far Row 4) - 0x09FCF - Stars + Same Colored Symbol & Colored Squares
158436 - 0x09FD1 (Far Row 5) - 0x09FD0 - Dots
158437 - 0x09FD2 (Far Row 6) - 0x09FD1 - Shapers
Door - 0x09E07 (Staircase Far) - 0x09FD2
Mountain Floor 2 Light Bridge Room Far (Mountain Floor 2):
-158438 - 0x09ED8 (Light Bridge Controller Far) - True - Stars & Stars + Same Colored Symbol & Rotated Shapers & Eraser
+158438 - 0x09ED8 (Light Bridge Controller Far) - True - Stars + Same Colored Symbol & Rotated Shapers & Eraser
Mountain Floor 2 Elevator Room (Mountain Floor 2) - Mountain Floor 2 Elevator - TrueOneWay:
158613 - 0x17F93 (Elevator Discard) - True - Arrows & Triangles
@@ -1095,10 +1095,10 @@ Door - 0x17F33 (Rock Open) - 0x17FA2 | 0x334E1
Mountain Bottom Floor Pillars Room (Mountain Bottom Floor) - Elevator - 0x339BB & 0x33961:
158522 - 0x0383A (Right Pillar 1) - True - Stars
158523 - 0x09E56 (Right Pillar 2) - 0x0383A - Stars & Dots
-158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Dots & Full Dots & Triangles
+158524 - 0x09E5A (Right Pillar 3) - 0x09E56 - Full Dots & Triangles
158525 - 0x33961 (Right Pillar 4) - 0x09E5A - Dots & Symmetry & Triangles
158526 - 0x0383D (Left Pillar 1) - True - Triangles
-158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares & Stars & Stars + Same Colored Symbol
+158527 - 0x0383F (Left Pillar 2) - 0x0383D - Black/White Squares & Stars + Same Colored Symbol
158528 - 0x03859 (Left Pillar 3) - 0x0383F - Shapers
158529 - 0x339BB (Left Pillar 4) - 0x03859 - Triangles & Symmetry
@@ -1127,16 +1127,16 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01
158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares
158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares
158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots
-158454 - 0x00190 (Blue Tunnel Right First 1) - True - Dots & Full Dots & Triangles & Arrows
-158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Dots & Full Dots & Triangles & Arrows
-158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Dots & Full Dots & Triangles & Arrows
-158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Dots & Full Dots & Triangles & Arrows
+158454 - 0x00190 (Blue Tunnel Right First 1) - True - Full Dots & Triangles & Arrows
+158455 - 0x00558 (Blue Tunnel Right First 2) - 0x00190 - Full Dots & Triangles & Arrows
+158456 - 0x00567 (Blue Tunnel Right First 3) - 0x00558 - Full Dots & Triangles & Arrows
+158457 - 0x006FE (Blue Tunnel Right First 4) - 0x00567 - Full Dots & Triangles & Arrows
158458 - 0x01A0D (Blue Tunnel Left First 1) - True - Symmetry & Triangles & Arrows
158459 - 0x008B8 (Blue Tunnel Left Second 1) - True - Triangles & Colored Squares & Arrows
158460 - 0x00973 (Blue Tunnel Left Second 2) - 0x008B8 - Triangles & Colored Squares & Arrows
-158461 - 0x0097B (Blue Tunnel Left Second 3) - 0x00973 - Triangles & Colored Squares & Arrows & Stars & Stars + Same Colored Symbol
-158462 - 0x0097D (Blue Tunnel Left Second 4) - 0x0097B - Triangles & Colored Squares & Arrows & Stars & Stars + Same Colored Symbol
-158463 - 0x0097E (Blue Tunnel Left Second 5) - 0x0097D - Triangles & Colored Squares & Arrows & Stars & Stars + Same Colored Symbol
+158461 - 0x0097B (Blue Tunnel Left Second 3) - 0x00973 - Triangles & Colored Squares & Arrows & Stars + Same Colored Symbol
+158462 - 0x0097D (Blue Tunnel Left Second 4) - 0x0097B - Triangles & Colored Squares & Arrows & Stars + Same Colored Symbol
+158463 - 0x0097E (Blue Tunnel Left Second 5) - 0x0097D - Triangles & Colored Squares & Arrows & Stars + Same Colored Symbol
158464 - 0x00994 (Blue Tunnel Right Second 1) - True - Rotated Shapers & Triangles
158465 - 0x334D5 (Blue Tunnel Right Second 2) - 0x00994 - Rotated Shapers & Triangles
158466 - 0x00995 (Blue Tunnel Right Second 3) - 0x334D5 - Rotated Shapers & Triangles
@@ -1146,30 +1146,30 @@ Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x01
158470 - 0x018A0 (Blue Tunnel Right Third 1) - True - Shapers & Symmetry & Eraser
158471 - 0x00A72 (Blue Tunnel Left Fourth 1) - True - Shapers & Negative Shapers & Triangles
158472 - 0x32962 (First Floor Left) - True - Rotated Shapers & Dots
-158473 - 0x32966 (First Floor Grounded) - True - Stars & Black/White Squares & Stars + Same Colored Symbol & Shapers & Triangles
+158473 - 0x32966 (First Floor Grounded) - True - Black/White Squares & Stars + Same Colored Symbol & Shapers & Triangles
158474 - 0x01A31 (First Floor Middle) - True - Colored Squares
-158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars & Stars + Same Colored Symbol & Eraser & Shapers & Negative Shapers & Dots
+158475 - 0x00B71 (First Floor Right) - True - Colored Squares & Stars + Same Colored Symbol & Eraser & Shapers & Negative Shapers & Dots
158478 - 0x288EA (First Wooden Beam) - True - Colored Squares & Black/White Squares & Eraser
-158479 - 0x288FC (Second Wooden Beam) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Eraser
-158480 - 0x289E7 (Third Wooden Beam) - True - Black/White Squares & Stars & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Eraser
+158479 - 0x288FC (Second Wooden Beam) - True - Black/White Squares & Stars + Same Colored Symbol & Eraser
+158480 - 0x289E7 (Third Wooden Beam) - True - Black/White Squares & Stars + Same Colored Symbol & Shapers & Rotated Shapers & Eraser
158481 - 0x288AA (Fourth Wooden Beam) - True - Stars & Shapers & Eraser
-158482 - 0x17FB9 (Left Upstairs Single) - True - Stars & Dots & Full Dots
-158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Dots & Full Dots & Black/White Squares
-158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Dots & Full Dots & Stars
-158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Dots & Full Dots & Shapers
-158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Dots & Full Dots & Triangles
-158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Dots & Full Dots & Triangles & Eraser
+158482 - 0x17FB9 (Left Upstairs Single) - True - Stars & Full Dots
+158483 - 0x0A16B (Left Upstairs Left Row 1) - True - Full Dots & Black/White Squares
+158484 - 0x0A2CE (Left Upstairs Left Row 2) - 0x0A16B - Full Dots & Stars
+158485 - 0x0A2D7 (Left Upstairs Left Row 3) - 0x0A2CE - Full Dots & Shapers
+158486 - 0x0A2DD (Left Upstairs Left Row 4) - 0x0A2D7 - Full Dots & Triangles
+158487 - 0x0A2EA (Left Upstairs Left Row 5) - 0x0A2DD - Full Dots & Triangles & Eraser
158488 - 0x0008F (Right Upstairs Left Row 1) - True - Dots
158489 - 0x0006B (Right Upstairs Left Row 2) - 0x0008F - Black/White Squares & Colored Squares
-158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol
-158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Shapers
-158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol
-158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Rotated Shapers
-158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Stars & Stars + Same Colored Symbol & Shapers & Negative Shapers
+158490 - 0x0008B (Right Upstairs Left Row 3) - 0x0006B - Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+158491 - 0x0008C (Right Upstairs Left Row 4) - 0x0008B - Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Shapers
+158492 - 0x0008A (Right Upstairs Left Row 5) - 0x0008C - Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+158493 - 0x00089 (Right Upstairs Left Row 6) - 0x0008A - Black/White Squares & Colored Squares & Stars + Same Colored Symbol & Rotated Shapers
+158494 - 0x0006A (Right Upstairs Left Row 7) - 0x00089 - Stars + Same Colored Symbol & Shapers & Negative Shapers
158495 - 0x0006C (Right Upstairs Left Row 8) - 0x0006A - Dots & Shapers & Negative Shapers & Eraser
158496 - 0x00027 (Right Upstairs Right Row 1) - True - Black/White Squares & Colored Squares & Eraser & Symmetry
158497 - 0x00028 (Right Upstairs Right Row 2) - 0x00027 - Black/White Squares & Colored Squares & Eraser & Symmetry
-158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Stars & Stars + Same Colored Symbol & Eraser & Symmetry
+158498 - 0x00029 (Right Upstairs Right Row 3) - 0x00028 - Stars + Same Colored Symbol & Eraser & Symmetry
158476 - 0x09DD5 (Lone Pillar) - True - Triangles & Dots
Door - 0x019A5 (Pillar Door) - 0x09DD5
158449 - 0x021D7 (Mountain Shortcut Panel) - True - Triangles
@@ -1179,7 +1179,7 @@ Door - 0x2D859 (Swamp Shortcut Door) - 0x17CF2
159341 - 0x3397C (Skylight EP) - True - True
Caves Path to Challenge (Caves) - Challenge - 0x0A19A:
-158477 - 0x0A16E (Challenge Entry Panel) - True - Stars & Shapers & Stars + Same Colored Symbol & Triangles
+158477 - 0x0A16E (Challenge Entry Panel) - True - Shapers & Stars + Same Colored Symbol & Triangles
Door - 0x0A19A (Challenge Entry) - 0x0A16E
==Challenge==
diff --git a/worlds/witness/options.py b/worlds/witness/options.py
index 050bb7e904e2..6a64fdb3d877 100644
--- a/worlds/witness/options.py
+++ b/worlds/witness/options.py
@@ -7,7 +7,7 @@
Choice,
DefaultOnToggle,
LocationSet,
- OptionDict,
+ OptionCounter,
OptionError,
OptionGroup,
OptionSet,
@@ -414,23 +414,25 @@ class TrapPercentage(Range):
default = 20
-class TrapWeights(OptionDict):
+_default_trap_weights = {
+ trap_name: item_definition.weight
+ for trap_name, item_definition in static_witness_logic.ALL_ITEMS.items()
+ if isinstance(item_definition, WeightedItemDefinition) and item_definition.category is ItemCategory.TRAP
+}
+
+
+class TrapWeights(OptionCounter):
"""
Specify the weights determining how many copies of each trap item will be in your itempool.
- If you don't want a specific type of trap, you can set the weight for it to 0 (Do not delete the entry outright!).
+ If you don't want a specific type of trap, you can set the weight for it to 0.
If you set all trap weights to 0, you will get no traps, bypassing the "Trap Percentage" option.
"""
display_name = "Trap Weights"
- schema = Schema({
- trap_name: And(int, lambda n: n >= 0)
- for trap_name, item_definition in static_witness_logic.ALL_ITEMS.items()
- if isinstance(item_definition, WeightedItemDefinition) and item_definition.category is ItemCategory.TRAP
- })
- default = {
- trap_name: item_definition.weight
- for trap_name, item_definition in static_witness_logic.ALL_ITEMS.items()
- if isinstance(item_definition, WeightedItemDefinition) and item_definition.category is ItemCategory.TRAP
- }
+ valid_keys = _default_trap_weights.keys()
+
+ min = 0
+
+ default = _default_trap_weights
class PuzzleSkipAmount(Range):
diff --git a/worlds/witness/presets.py b/worlds/witness/presets.py
index 687d74f771cb..81dd28d68d09 100644
--- a/worlds/witness/presets.py
+++ b/worlds/witness/presets.py
@@ -40,6 +40,8 @@
"trap_percentage": TrapPercentage.default,
"puzzle_skip_amount": PuzzleSkipAmount.default,
+ "trap_weights": TrapWeights.default,
+
"hint_amount": HintAmount.default,
"area_hint_percentage": AreaHintPercentage.default,
"laser_hints": LaserHints.default,
@@ -79,6 +81,8 @@
"trap_percentage": TrapPercentage.default,
"puzzle_skip_amount": 15,
+ "trap_weights": TrapWeights.default,
+
"hint_amount": HintAmount.default,
"area_hint_percentage": AreaHintPercentage.default,
"laser_hints": LaserHints.default,
@@ -118,6 +122,8 @@
"trap_percentage": TrapPercentage.default,
"puzzle_skip_amount": 15,
+ "trap_weights": TrapWeights.default,
+
"hint_amount": HintAmount.default,
"area_hint_percentage": AreaHintPercentage.default,
"laser_hints": LaserHints.default,
diff --git a/worlds/zork_grand_inquisitor/LICENSE b/worlds/zork_grand_inquisitor/LICENSE
deleted file mode 100644
index a94ca6bf9177..000000000000
--- a/worlds/zork_grand_inquisitor/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2023 Serpent.AI
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
diff --git a/worlds/zork_grand_inquisitor/__init__.py b/worlds/zork_grand_inquisitor/__init__.py
deleted file mode 100644
index 791f41dd00a2..000000000000
--- a/worlds/zork_grand_inquisitor/__init__.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import worlds.LauncherComponents as LauncherComponents
-
-from .world import ZorkGrandInquisitorWorld
-
-
-def launch_client() -> None:
- from .client import main
- LauncherComponents.launch(main, name="ZorkGrandInquisitorClient")
-
-
-LauncherComponents.components.append(
- LauncherComponents.Component(
- "Zork Grand Inquisitor Client",
- func=launch_client,
- component_type=LauncherComponents.Type.CLIENT
- )
-)
diff --git a/worlds/zork_grand_inquisitor/client.py b/worlds/zork_grand_inquisitor/client.py
deleted file mode 100644
index 8b8d7d3ebf58..000000000000
--- a/worlds/zork_grand_inquisitor/client.py
+++ /dev/null
@@ -1,188 +0,0 @@
-import asyncio
-
-import CommonClient
-import NetUtils
-import Utils
-
-from typing import Any, Dict, List, Optional, Set, Tuple
-
-from .data_funcs import item_names_to_id, location_names_to_id, id_to_items, id_to_locations, id_to_goals
-from .enums import ZorkGrandInquisitorItems, ZorkGrandInquisitorLocations
-from .game_controller import GameController
-
-
-class ZorkGrandInquisitorCommandProcessor(CommonClient.ClientCommandProcessor):
- def _cmd_zork(self) -> None:
- """Attach to an open Zork Grand Inquisitor process."""
- result: bool = self.ctx.game_controller.open_process_handle()
-
- if result:
- self.ctx.process_attached_at_least_once = True
- self.output("Successfully attached to Zork Grand Inquisitor process.")
- else:
- self.output("Failed to attach to Zork Grand Inquisitor process.")
-
- def _cmd_brog(self) -> None:
- """List received Brog items."""
- self.ctx.game_controller.list_received_brog_items()
-
- def _cmd_griff(self) -> None:
- """List received Griff items."""
- self.ctx.game_controller.list_received_griff_items()
-
- def _cmd_lucy(self) -> None:
- """List received Lucy items."""
- self.ctx.game_controller.list_received_lucy_items()
-
- def _cmd_hotspots(self) -> None:
- """List received Hotspots."""
- self.ctx.game_controller.list_received_hotspots()
-
-
-class ZorkGrandInquisitorContext(CommonClient.CommonContext):
- tags: Set[str] = {"AP"}
- game: str = "Zork Grand Inquisitor"
- command_processor: CommonClient.ClientCommandProcessor = ZorkGrandInquisitorCommandProcessor
- items_handling: int = 0b111
- want_slot_data: bool = True
-
- item_name_to_id: Dict[str, int] = item_names_to_id()
- location_name_to_id: Dict[str, int] = location_names_to_id()
-
- id_to_items: Dict[int, ZorkGrandInquisitorItems] = id_to_items()
- id_to_locations: Dict[int, ZorkGrandInquisitorLocations] = id_to_locations()
-
- game_controller: GameController
-
- controller_task: Optional[asyncio.Task]
-
- process_attached_at_least_once: bool
- can_display_process_message: bool
-
- def __init__(self, server_address: Optional[str], password: Optional[str]) -> None:
- super().__init__(server_address, password)
-
- self.game_controller = GameController(logger=CommonClient.logger)
-
- self.controller_task = None
-
- self.process_attached_at_least_once = False
- self.can_display_process_message = True
-
- def run_gui(self) -> None:
- from kvui import GameManager
-
- class TextManager(GameManager):
- logging_pairs: List[Tuple[str, str]] = [("Client", "Archipelago")]
- base_title: str = "Archipelago Zork Grand Inquisitor Client"
-
- self.ui = TextManager(self)
- self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI")
-
- async def server_auth(self, password_requested: bool = False):
- if password_requested and not self.password:
- await super().server_auth(password_requested)
-
- await self.get_username()
- await self.send_connect()
-
- def on_package(self, cmd: str, _args: Any) -> None:
- if cmd == "Connected":
- self.game = self.slot_info[self.slot].game
-
- # 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_grant_missable_location_checks = (
- _args["slot_data"]["grant_missable_location_checks"] == 1
- )
-
- async def controller(self):
- while not self.exit_event.is_set():
- await asyncio.sleep(0.1)
-
- # Enqueue Received Item Delta
- network_item: NetUtils.NetworkItem
- for network_item in self.items_received:
- item: ZorkGrandInquisitorItems = self.id_to_items[network_item.item]
-
- if item not in self.game_controller.received_items:
- if item not in self.game_controller.received_items_queue:
- self.game_controller.received_items_queue.append(item)
-
- # Game Controller Update
- if self.game_controller.is_process_running():
- self.game_controller.update()
- self.can_display_process_message = True
- else:
- process_message: str
-
- if self.process_attached_at_least_once:
- process_message = (
- "Lost connection to Zork Grand Inquisitor process. Please restart the game and use the /zork "
- "command to reattach."
- )
- else:
- process_message = (
- "Please use the /zork command to attach to a running Zork Grand Inquisitor process."
- )
-
- if self.can_display_process_message:
- CommonClient.logger.info(process_message)
- self.can_display_process_message = False
-
- # Send Checked Locations
- checked_location_ids: List[int] = list()
-
- while len(self.game_controller.completed_locations_queue) > 0:
- location: ZorkGrandInquisitorLocations = self.game_controller.completed_locations_queue.popleft()
- location_id: int = self.location_name_to_id[location.value]
-
- checked_location_ids.append(location_id)
-
- await self.send_msgs([
- {
- "cmd": "LocationChecks",
- "locations": checked_location_ids
- }
- ])
-
- # Check for Goal Completion
- if self.game_controller.goal_completed:
- await self.send_msgs([
- {
- "cmd": "StatusUpdate",
- "status": CommonClient.ClientStatus.CLIENT_GOAL
- }
- ])
-
-
-def main() -> None:
- Utils.init_logging("ZorkGrandInquisitorClient", exception_logger="Client")
-
- async def _main():
- ctx: ZorkGrandInquisitorContext = ZorkGrandInquisitorContext(None, None)
-
- ctx.server_task = asyncio.create_task(CommonClient.server_loop(ctx), name="server loop")
- ctx.controller_task = asyncio.create_task(ctx.controller(), name="ZorkGrandInquisitorController")
-
- if CommonClient.gui_enabled:
- ctx.run_gui()
-
- ctx.run_cli()
-
- await ctx.exit_event.wait()
- await ctx.shutdown()
-
- import colorama
-
- colorama.just_fix_windows_console()
-
- asyncio.run(_main())
-
- colorama.deinit()
-
-
-if __name__ == "__main__":
- main()
diff --git a/worlds/zork_grand_inquisitor/data/__init__.py b/worlds/zork_grand_inquisitor/data/__init__.py
deleted file mode 100644
index e69de29bb2d1..000000000000
diff --git a/worlds/zork_grand_inquisitor/data/entrance_rule_data.py b/worlds/zork_grand_inquisitor/data/entrance_rule_data.py
deleted file mode 100644
index f48be5eb6b6a..000000000000
--- a/worlds/zork_grand_inquisitor/data/entrance_rule_data.py
+++ /dev/null
@@ -1,419 +0,0 @@
-from typing import Dict, Tuple, Union
-
-from ..enums import ZorkGrandInquisitorEvents, ZorkGrandInquisitorItems, ZorkGrandInquisitorRegions
-
-
-entrance_rule_data: Dict[
- Tuple[
- ZorkGrandInquisitorRegions,
- ZorkGrandInquisitorRegions,
- ],
- Union[
- Tuple[
- Tuple[
- Union[
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorRegions,
- ],
- ...,
- ],
- ...,
- ],
- None,
- ],
-] = {
- (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.DM_LAIR): (
- (
- ZorkGrandInquisitorItems.SWORD,
- ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE,
- ),
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR,
- ),
- ),
- (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.GUE_TECH): (
- (
- ZorkGrandInquisitorItems.SPELL_REZROV,
- ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR,
- ),
- ),
- (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH,
- ),
- ),
- (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.HADES_SHORE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES,
- ),
- ),
- (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.PORT_FOOZLE): None,
- (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB,
- ),
- ),
- (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): (
- (
- ZorkGrandInquisitorItems.SUBWAY_TOKEN,
- ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT,
- ),
- ),
- (ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY,
- ),
- ),
- (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.CROSSROADS): None,
- (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR): (
- (
- ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR,
- ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD,
- ),
- ),
- (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH,
- ),
- ),
- (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.HADES_SHORE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES,
- ),
- ),
- (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB,
- ),
- ),
- (ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY,
- ),
- ),
- (ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.DM_LAIR): None,
- (ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.WALKING_CASTLE): (
- (
- ZorkGrandInquisitorItems.HOTSPOT_BLINDS,
- ZorkGrandInquisitorEvents.KNOWS_OBIDIL,
- ),
- ),
- (ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.WHITE_HOUSE): (
- (
- ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR,
- ZorkGrandInquisitorItems.SPELL_NARWILE,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD,
- ),
- ),
- (ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO, ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON): (
- (
- ZorkGrandInquisitorItems.TOTEM_GRIFF,
- ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW,
- ),
- ),
- (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.CROSSROADS): None,
- (ZorkGrandInquisitorRegions.GUE_TECH, ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY): (
- (
- ZorkGrandInquisitorItems.SPELL_IGRAM,
- ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS,
- ),
- ),
- (ZorkGrandInquisitorRegions.GUE_TECH, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): (
- (ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR,),
- ),
- (ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, ZorkGrandInquisitorRegions.GUE_TECH): None,
- (ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): (
- (
- ZorkGrandInquisitorItems.STUDENT_ID,
- ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE,
- ),
- ),
- (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.CROSSROADS): (
- (ZorkGrandInquisitorItems.MAP,),
- ),
- (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.DM_LAIR): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR,
- ),
- ),
- (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.GUE_TECH): None,
- (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.HADES_SHORE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES,
- ),
- ),
- (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB,
- ),
- ),
- (ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY,
- ),
- ),
- (ZorkGrandInquisitorRegions.HADES, ZorkGrandInquisitorRegions.HADES_BEYOND_GATES): (
- (
- ZorkGrandInquisitorEvents.KNOWS_SNAVIG,
- ZorkGrandInquisitorItems.TOTEM_BROG, # Visually hiding this totem is tied to owning it; no choice
- ),
- ),
- (ZorkGrandInquisitorRegions.HADES, ZorkGrandInquisitorRegions.HADES_SHORE): (
- (ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,),
- ),
- (ZorkGrandInquisitorRegions.HADES_BEYOND_GATES, ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO): (
- (
- ZorkGrandInquisitorItems.SPELL_NARWILE,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD,
- ),
- ),
- (ZorkGrandInquisitorRegions.HADES_BEYOND_GATES, ZorkGrandInquisitorRegions.HADES): None,
- (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.CROSSROADS): (
- (ZorkGrandInquisitorItems.MAP,),
- ),
- (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.DM_LAIR): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR,
- ),
- ),
- (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH,
- ),
- ),
- (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.HADES): (
- (
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER,
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS,
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,
- ),
- ),
- (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB,
- ),
- ),
- (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS): None,
- (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM): (
- (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM,),
- ),
- (ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): (
- (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY,),
- ),
- (ZorkGrandInquisitorRegions.MENU, ZorkGrandInquisitorRegions.PORT_FOOZLE): None,
- (ZorkGrandInquisitorRegions.MONASTERY, ZorkGrandInquisitorRegions.HADES_SHORE): (
- (
- ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH,
- ),
- ),
- (ZorkGrandInquisitorRegions.MONASTERY, ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT): (
- (
- ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH,
- ),
- ),
- (ZorkGrandInquisitorRegions.MONASTERY, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): None,
- (ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, ZorkGrandInquisitorRegions.MONASTERY): None,
- (ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT, ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST): (
- (
- ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER,
- ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT,
- ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER,
- ZorkGrandInquisitorItems.SPELL_NARWILE,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD,
- ),
- ),
- (ZorkGrandInquisitorRegions.PORT_FOOZLE, ZorkGrandInquisitorRegions.CROSSROADS): (
- (
- ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE,
- ZorkGrandInquisitorItems.ROPE,
- ZorkGrandInquisitorItems.HOTSPOT_WELL,
- ),
- ),
- (ZorkGrandInquisitorRegions.PORT_FOOZLE, ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP): (
- (
- ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE,
- ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL,
- ),
- ),
- (ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP, ZorkGrandInquisitorRegions.PORT_FOOZLE): None,
- (ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT): None,
- (ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST, ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN): (
- (
- ZorkGrandInquisitorItems.TOTEM_LUCY,
- 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,),
- ),
- (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.DM_LAIR): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR,
- ),
- ),
- (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH,
- ),
- ),
- (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY): None,
- (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.HADES_SHORE): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES,
- ),
- ),
- (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.SPELL_LAB): (
- (
- ZorkGrandInquisitorItems.SWORD,
- ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE,
- ZorkGrandInquisitorEvents.DAM_DESTROYED,
- ZorkGrandInquisitorItems.SPELL_GOLGATEM,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM,
- ),
- ),
- (ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): (
- (
- ZorkGrandInquisitorItems.MAP,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY,
- ),
- ),
- (ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, ZorkGrandInquisitorRegions.CROSSROADS): None,
- (ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, ZorkGrandInquisitorRegions.HADES_SHORE): (
- (
- ZorkGrandInquisitorItems.SPELL_KENDALL,
- ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES,
- ),
- ),
- (ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM): (
- (
- ZorkGrandInquisitorItems.SPELL_KENDALL,
- ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM,
- ),
- ),
- (ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS, ZorkGrandInquisitorRegions.SUBWAY_MONASTERY): (
- (
- ZorkGrandInquisitorItems.SPELL_KENDALL,
- ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY,
- ),
- ),
- (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_MONASTERY): (
- (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY,),
- ),
- (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.HADES_SHORE): (
- (ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES,),
- ),
- (ZorkGrandInquisitorRegions.SUBWAY_MONASTERY, ZorkGrandInquisitorRegions.MONASTERY): (
- (
- ZorkGrandInquisitorItems.SWORD,
- ZorkGrandInquisitorEvents.ROPE_GLORFABLE,
- ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT,
- ),
- ),
- (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): (
- (
- 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.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,
- ),
- ),
-}
diff --git a/worlds/zork_grand_inquisitor/data/item_data.py b/worlds/zork_grand_inquisitor/data/item_data.py
deleted file mode 100644
index c312bbce3d09..000000000000
--- a/worlds/zork_grand_inquisitor/data/item_data.py
+++ /dev/null
@@ -1,792 +0,0 @@
-from typing import Dict, NamedTuple, Optional, Tuple, Union
-
-from BaseClasses import ItemClassification
-
-from ..enums import ZorkGrandInquisitorItems, ZorkGrandInquisitorTags
-
-
-class ZorkGrandInquisitorItemData(NamedTuple):
- statemap_keys: Optional[Tuple[int, ...]]
- archipelago_id: Optional[int]
- classification: ItemClassification
- tags: Tuple[ZorkGrandInquisitorTags, ...]
- maximum_quantity: Optional[int] = 1
-
-
-ITEM_OFFSET = 9758067000
-
-item_data: Dict[ZorkGrandInquisitorItems, ZorkGrandInquisitorItemData] = {
- # Inventory Items
- ZorkGrandInquisitorItems.BROGS_BICKERING_TORCH: ZorkGrandInquisitorItemData(
- statemap_keys=(67,), # Extinguished = 103
- archipelago_id=ITEM_OFFSET + 0,
- classification=ItemClassification.filler,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH: ZorkGrandInquisitorItemData(
- statemap_keys=(68,), # Extinguished = 104
- archipelago_id=ITEM_OFFSET + 1,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.BROGS_GRUE_EGG: ZorkGrandInquisitorItemData(
- statemap_keys=(70,), # Boiled = 71
- archipelago_id=ITEM_OFFSET + 2,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.BROGS_PLANK: ZorkGrandInquisitorItemData(
- statemap_keys=(69,),
- archipelago_id=ITEM_OFFSET + 3,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.FLATHEADIA_FUDGE: ZorkGrandInquisitorItemData(
- statemap_keys=(54,),
- archipelago_id=ITEM_OFFSET + 4,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP: ZorkGrandInquisitorItemData(
- statemap_keys=(86,),
- archipelago_id=ITEM_OFFSET + 5,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH: ZorkGrandInquisitorItemData(
- statemap_keys=(84,),
- archipelago_id=ITEM_OFFSET + 6,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT: ZorkGrandInquisitorItemData(
- statemap_keys=(9,),
- archipelago_id=ITEM_OFFSET + 7,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN: ZorkGrandInquisitorItemData(
- statemap_keys=(16,),
- archipelago_id=ITEM_OFFSET + 8,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.HAMMER: ZorkGrandInquisitorItemData(
- statemap_keys=(23,),
- archipelago_id=ITEM_OFFSET + 9,
- 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,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1: ZorkGrandInquisitorItemData(
- statemap_keys=(116,), # With fly = 120
- archipelago_id=ITEM_OFFSET + 14,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2: ZorkGrandInquisitorItemData(
- statemap_keys=(117,), # With fly = 121
- archipelago_id=ITEM_OFFSET + 15,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3: ZorkGrandInquisitorItemData(
- statemap_keys=(118,), # With fly = 122
- archipelago_id=ITEM_OFFSET + 16,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4: ZorkGrandInquisitorItemData(
- statemap_keys=(119,), # With fly = 123
- archipelago_id=ITEM_OFFSET + 17,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.MAP: ZorkGrandInquisitorItemData(
- statemap_keys=(6,),
- archipelago_id=ITEM_OFFSET + 18,
- 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,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.MUG: ZorkGrandInquisitorItemData(
- statemap_keys=(35,),
- archipelago_id=ITEM_OFFSET + 21,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.OLD_SCRATCH_CARD: ZorkGrandInquisitorItemData(
- statemap_keys=(17,),
- archipelago_id=ITEM_OFFSET + 22,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.PERMA_SUCK_MACHINE: ZorkGrandInquisitorItemData(
- statemap_keys=(36,),
- archipelago_id=ITEM_OFFSET + 23,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER: ZorkGrandInquisitorItemData(
- statemap_keys=(3,),
- archipelago_id=ITEM_OFFSET + 24,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS: ZorkGrandInquisitorItemData(
- statemap_keys=(5827,),
- archipelago_id=ITEM_OFFSET + 25,
- 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,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.ROPE: ZorkGrandInquisitorItemData(
- statemap_keys=(83,),
- archipelago_id=ITEM_OFFSET + 28,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS: ZorkGrandInquisitorItemData(
- statemap_keys=(101,), # SNA = 41
- archipelago_id=ITEM_OFFSET + 29,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV: ZorkGrandInquisitorItemData(
- statemap_keys=(102,), # VIG = 48
- archipelago_id=ITEM_OFFSET + 30,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.SHOVEL: ZorkGrandInquisitorItemData(
- statemap_keys=(49,),
- archipelago_id=ITEM_OFFSET + 31,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.SNAPDRAGON: ZorkGrandInquisitorItemData(
- statemap_keys=(50,),
- archipelago_id=ITEM_OFFSET + 32,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.STUDENT_ID: ZorkGrandInquisitorItemData(
- statemap_keys=(39,),
- archipelago_id=ITEM_OFFSET + 33,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.SUBWAY_TOKEN: ZorkGrandInquisitorItemData(
- statemap_keys=(20,),
- archipelago_id=ITEM_OFFSET + 34,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.SWORD: ZorkGrandInquisitorItemData(
- statemap_keys=(21,),
- archipelago_id=ITEM_OFFSET + 35,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.ZIMDOR_SCROLL: ZorkGrandInquisitorItemData(
- statemap_keys=(25,),
- archipelago_id=ITEM_OFFSET + 36,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- ZorkGrandInquisitorItems.ZORK_ROCKS: ZorkGrandInquisitorItemData(
- statemap_keys=(37,),
- archipelago_id=ITEM_OFFSET + 37,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.INVENTORY_ITEM,),
- ),
- # Hotspots
- ZorkGrandInquisitorItems.HOTSPOT_666_MAILBOX: ZorkGrandInquisitorItemData(
- statemap_keys=(9116,),
- archipelago_id=ITEM_OFFSET + 100 + 0,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS: ZorkGrandInquisitorItemData(
- statemap_keys=(15434, 15436, 15438, 15440),
- archipelago_id=ITEM_OFFSET + 100 + 1,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX: ZorkGrandInquisitorItemData(
- statemap_keys=(12096,),
- archipelago_id=ITEM_OFFSET + 100 + 2,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_BLINDS: ZorkGrandInquisitorItemData(
- statemap_keys=(4799,),
- archipelago_id=ITEM_OFFSET + 100 + 3,
- 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,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT: ZorkGrandInquisitorItemData(
- statemap_keys=(12702,),
- archipelago_id=ITEM_OFFSET + 100 + 5,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_VACUUM_SLOT: ZorkGrandInquisitorItemData(
- statemap_keys=(12909,),
- archipelago_id=ITEM_OFFSET + 100 + 6,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_CHANGE_MACHINE_SLOT: ZorkGrandInquisitorItemData(
- statemap_keys=(12900,),
- archipelago_id=ITEM_OFFSET + 100 + 7,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR: ZorkGrandInquisitorItemData(
- statemap_keys=(5010,),
- archipelago_id=ITEM_OFFSET + 100 + 8,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT: ZorkGrandInquisitorItemData(
- statemap_keys=(9539,),
- archipelago_id=ITEM_OFFSET + 100 + 9,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER: ZorkGrandInquisitorItemData(
- statemap_keys=(19712,),
- archipelago_id=ITEM_OFFSET + 100 + 10,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT: ZorkGrandInquisitorItemData(
- statemap_keys=(2586,),
- archipelago_id=ITEM_OFFSET + 100 + 11,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_DENTED_LOCKER: ZorkGrandInquisitorItemData(
- statemap_keys=(11878,),
- archipelago_id=ITEM_OFFSET + 100 + 12,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND: ZorkGrandInquisitorItemData(
- statemap_keys=(11751,),
- archipelago_id=ITEM_OFFSET + 100 + 13,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH: ZorkGrandInquisitorItemData(
- statemap_keys=(15147, 15153),
- archipelago_id=ITEM_OFFSET + 100 + 14,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW: ZorkGrandInquisitorItemData(
- statemap_keys=(1705,),
- archipelago_id=ITEM_OFFSET + 100 + 15,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS: ZorkGrandInquisitorItemData(
- statemap_keys=(1425, 1426),
- archipelago_id=ITEM_OFFSET + 100 + 16,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE: ZorkGrandInquisitorItemData(
- statemap_keys=(13106,),
- archipelago_id=ITEM_OFFSET + 100 + 17,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS: ZorkGrandInquisitorItemData(
- statemap_keys=(13219, 13220, 13221, 13222),
- archipelago_id=ITEM_OFFSET + 100 + 18,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS: ZorkGrandInquisitorItemData(
- statemap_keys=(14327, 14332, 14337, 14342),
- archipelago_id=ITEM_OFFSET + 100 + 19,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT: ZorkGrandInquisitorItemData(
- statemap_keys=(12528,),
- archipelago_id=ITEM_OFFSET + 100 + 20,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS: ZorkGrandInquisitorItemData(
- statemap_keys=(12523, 12524, 12525),
- archipelago_id=ITEM_OFFSET + 100 + 21,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE: ZorkGrandInquisitorItemData(
- statemap_keys=(13002,),
- archipelago_id=ITEM_OFFSET + 100 + 22,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL: ZorkGrandInquisitorItemData(
- statemap_keys=(10726,),
- archipelago_id=ITEM_OFFSET + 100 + 23,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR: ZorkGrandInquisitorItemData(
- statemap_keys=(12280,),
- archipelago_id=ITEM_OFFSET + 100 + 24,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_GRASS: ZorkGrandInquisitorItemData(
- statemap_keys=(
- 17694,
- 17695,
- 17696,
- 17697,
- 18200,
- 17703,
- 17704,
- 17705,
- 17710,
- 17711,
- 17712,
- 17713,
- 17714,
- 17715,
- 17716,
- 17722,
- 17723,
- 17724,
- 17725,
- 17726,
- 17727
- ),
- archipelago_id=ITEM_OFFSET + 100 + 25,
- 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,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER: ZorkGrandInquisitorItemData(
- statemap_keys=(8446,),
- archipelago_id=ITEM_OFFSET + 100 + 27,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_HARRY: ZorkGrandInquisitorItemData(
- statemap_keys=(4260,),
- archipelago_id=ITEM_OFFSET + 100 + 28,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY: ZorkGrandInquisitorItemData(
- statemap_keys=(18026,),
- archipelago_id=ITEM_OFFSET + 100 + 29,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH: ZorkGrandInquisitorItemData(
- statemap_keys=(17623,),
- archipelago_id=ITEM_OFFSET + 100 + 30,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR: ZorkGrandInquisitorItemData(
- statemap_keys=(13140,),
- archipelago_id=ITEM_OFFSET + 100 + 31,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR: ZorkGrandInquisitorItemData(
- statemap_keys=(10441,),
- archipelago_id=ITEM_OFFSET + 100 + 32,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS: ZorkGrandInquisitorItemData(
- statemap_keys=(19632, 19627),
- archipelago_id=ITEM_OFFSET + 100 + 33,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR: ZorkGrandInquisitorItemData(
- statemap_keys=(3025,),
- archipelago_id=ITEM_OFFSET + 100 + 34,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG: ZorkGrandInquisitorItemData(
- statemap_keys=(3036,),
- archipelago_id=ITEM_OFFSET + 100 + 35,
- 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,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_MOSSY_GRATE: ZorkGrandInquisitorItemData(
- statemap_keys=(13390,),
- archipelago_id=ITEM_OFFSET + 100 + 38,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR: ZorkGrandInquisitorItemData(
- statemap_keys=(2455, 2447),
- archipelago_id=ITEM_OFFSET + 100 + 39,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS: ZorkGrandInquisitorItemData(
- statemap_keys=(12389, 12390),
- archipelago_id=ITEM_OFFSET + 100 + 40,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE: ZorkGrandInquisitorItemData(
- statemap_keys=(4302,),
- archipelago_id=ITEM_OFFSET + 100 + 41,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE: ZorkGrandInquisitorItemData(
- statemap_keys=(16383, 16384),
- archipelago_id=ITEM_OFFSET + 100 + 42,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE: ZorkGrandInquisitorItemData(
- statemap_keys=(2769,),
- archipelago_id=ITEM_OFFSET + 100 + 43,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON: ZorkGrandInquisitorItemData(
- statemap_keys=(4149,),
- archipelago_id=ITEM_OFFSET + 100 + 44,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS: ZorkGrandInquisitorItemData(
- statemap_keys=(12584, 12585, 12586, 12587),
- archipelago_id=ITEM_OFFSET + 100 + 45,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT: ZorkGrandInquisitorItemData(
- statemap_keys=(12574,),
- archipelago_id=ITEM_OFFSET + 100 + 46,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT: ZorkGrandInquisitorItemData(
- statemap_keys=(13412,),
- archipelago_id=ITEM_OFFSET + 100 + 47,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER: ZorkGrandInquisitorItemData(
- statemap_keys=(12170,),
- archipelago_id=ITEM_OFFSET + 100 + 48,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM: ZorkGrandInquisitorItemData(
- statemap_keys=(16382,),
- archipelago_id=ITEM_OFFSET + 100 + 49,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM: ZorkGrandInquisitorItemData(
- statemap_keys=(4209,),
- archipelago_id=ITEM_OFFSET + 100 + 50,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE: ZorkGrandInquisitorItemData(
- statemap_keys=(11973,),
- archipelago_id=ITEM_OFFSET + 100 + 51,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT: ZorkGrandInquisitorItemData(
- statemap_keys=(13168,),
- archipelago_id=ITEM_OFFSET + 100 + 52,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY: ZorkGrandInquisitorItemData(
- statemap_keys=(15396,),
- archipelago_id=ITEM_OFFSET + 100 + 53,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH: ZorkGrandInquisitorItemData(
- statemap_keys=(9706,),
- archipelago_id=ITEM_OFFSET + 100 + 54,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS: ZorkGrandInquisitorItemData(
- statemap_keys=(9728, 9729, 9730),
- archipelago_id=ITEM_OFFSET + 100 + 55,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- ZorkGrandInquisitorItems.HOTSPOT_WELL: ZorkGrandInquisitorItemData(
- statemap_keys=(10314,),
- archipelago_id=ITEM_OFFSET + 100 + 56,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.HOTSPOT,),
- ),
- # Spells
- ZorkGrandInquisitorItems.SPELL_GLORF: ZorkGrandInquisitorItemData(
- statemap_keys=(202,),
- archipelago_id=ITEM_OFFSET + 200 + 0,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.SPELL,),
- ),
- ZorkGrandInquisitorItems.SPELL_GOLGATEM: ZorkGrandInquisitorItemData(
- statemap_keys=(192,),
- archipelago_id=ITEM_OFFSET + 200 + 1,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.SPELL,),
- ),
- ZorkGrandInquisitorItems.SPELL_IGRAM: ZorkGrandInquisitorItemData(
- statemap_keys=(199,),
- archipelago_id=ITEM_OFFSET + 200 + 2,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.SPELL,),
- ),
- ZorkGrandInquisitorItems.SPELL_KENDALL: ZorkGrandInquisitorItemData(
- statemap_keys=(196,),
- archipelago_id=ITEM_OFFSET + 200 + 3,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.SPELL,),
- ),
- ZorkGrandInquisitorItems.SPELL_NARWILE: ZorkGrandInquisitorItemData(
- statemap_keys=(197,),
- archipelago_id=ITEM_OFFSET + 200 + 4,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.SPELL,),
- ),
- ZorkGrandInquisitorItems.SPELL_REZROV: ZorkGrandInquisitorItemData(
- statemap_keys=(195,),
- archipelago_id=ITEM_OFFSET + 200 + 5,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.SPELL,),
- ),
- ZorkGrandInquisitorItems.SPELL_THROCK: ZorkGrandInquisitorItemData(
- statemap_keys=(200,),
- archipelago_id=ITEM_OFFSET + 200 + 6,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.SPELL,),
- ),
- ZorkGrandInquisitorItems.SPELL_VOXAM: ZorkGrandInquisitorItemData(
- statemap_keys=(191,),
- archipelago_id=ITEM_OFFSET + 200 + 7,
- classification=ItemClassification.useful,
- tags=(ZorkGrandInquisitorTags.SPELL,),
- ),
- # Subway Destinations
- ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM: ZorkGrandInquisitorItemData(
- statemap_keys=(13757, 13297, 13486, 13625),
- archipelago_id=ITEM_OFFSET + 300 + 0,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.SUBWAY_DESTINATION,),
- ),
- ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES: ZorkGrandInquisitorItemData(
- statemap_keys=(13758, 13309, 13498, 13637),
- archipelago_id=ITEM_OFFSET + 300 + 1,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.SUBWAY_DESTINATION,),
- ),
- ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY: ZorkGrandInquisitorItemData(
- statemap_keys=(13759, 13316, 13505, 13644),
- archipelago_id=ITEM_OFFSET + 300 + 2,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.SUBWAY_DESTINATION,),
- ),
- # Teleporter Destinations
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR: ZorkGrandInquisitorItemData(
- statemap_keys=(2203,),
- archipelago_id=ITEM_OFFSET + 400 + 0,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,),
- ),
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH: ZorkGrandInquisitorItemData(
- statemap_keys=(7132,),
- archipelago_id=ITEM_OFFSET + 400 + 1,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,),
- ),
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES: ZorkGrandInquisitorItemData(
- statemap_keys=(7119,),
- archipelago_id=ITEM_OFFSET + 400 + 2,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,),
- ),
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY: ZorkGrandInquisitorItemData(
- statemap_keys=(7148,),
- archipelago_id=ITEM_OFFSET + 400 + 3,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,),
- ),
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB: ZorkGrandInquisitorItemData(
- statemap_keys=(16545,),
- archipelago_id=ITEM_OFFSET + 400 + 4,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.TELEPORTER_DESTINATION,),
- ),
- # Totemizer Destinations
- ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION: ZorkGrandInquisitorItemData(
- statemap_keys=(9660,),
- archipelago_id=ITEM_OFFSET + 500 + 0,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,),
- ),
- ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_INFINITY: ZorkGrandInquisitorItemData(
- statemap_keys=(9666,),
- archipelago_id=ITEM_OFFSET + 500 + 1,
- classification=ItemClassification.filler,
- tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,),
- ),
- ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL: ZorkGrandInquisitorItemData(
- statemap_keys=(9668,),
- archipelago_id=ITEM_OFFSET + 500 + 2,
- 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,
- tags=(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION,),
- ),
- # Totems
- ZorkGrandInquisitorItems.TOTEM_BROG: ZorkGrandInquisitorItemData(
- statemap_keys=(4853,),
- archipelago_id=ITEM_OFFSET + 600 + 0,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.TOTEM,),
- ),
- ZorkGrandInquisitorItems.TOTEM_GRIFF: ZorkGrandInquisitorItemData(
- statemap_keys=(4315,),
- archipelago_id=ITEM_OFFSET + 600 + 1,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.TOTEM,),
- ),
- ZorkGrandInquisitorItems.TOTEM_LUCY: ZorkGrandInquisitorItemData(
- statemap_keys=(5223,),
- archipelago_id=ITEM_OFFSET + 600 + 2,
- classification=ItemClassification.progression,
- tags=(ZorkGrandInquisitorTags.TOTEM,),
- ),
- # Filler
- ZorkGrandInquisitorItems.FILLER_INQUISITION_PROPAGANDA_FLYER: ZorkGrandInquisitorItemData(
- statemap_keys=None,
- archipelago_id=ITEM_OFFSET + 700 + 0,
- classification=ItemClassification.filler,
- tags=(ZorkGrandInquisitorTags.FILLER,),
- maximum_quantity=None,
- ),
- ZorkGrandInquisitorItems.FILLER_UNREADABLE_SPELL_SCROLL: ZorkGrandInquisitorItemData(
- statemap_keys=None,
- archipelago_id=ITEM_OFFSET + 700 + 1,
- classification=ItemClassification.filler,
- tags=(ZorkGrandInquisitorTags.FILLER,),
- maximum_quantity=None,
- ),
- ZorkGrandInquisitorItems.FILLER_MAGIC_CONTRABAND: ZorkGrandInquisitorItemData(
- statemap_keys=None,
- archipelago_id=ITEM_OFFSET + 700 + 2,
- classification=ItemClassification.filler,
- tags=(ZorkGrandInquisitorTags.FILLER,),
- maximum_quantity=None,
- ),
- ZorkGrandInquisitorItems.FILLER_FROBOZZ_ELECTRIC_GADGET: ZorkGrandInquisitorItemData(
- statemap_keys=None,
- archipelago_id=ITEM_OFFSET + 700 + 3,
- classification=ItemClassification.filler,
- tags=(ZorkGrandInquisitorTags.FILLER,),
- maximum_quantity=None,
- ),
- ZorkGrandInquisitorItems.FILLER_NONSENSICAL_INQUISITION_PAPERWORK: ZorkGrandInquisitorItemData(
- statemap_keys=None,
- archipelago_id=ITEM_OFFSET + 700 + 4,
- classification=ItemClassification.filler,
- tags=(ZorkGrandInquisitorTags.FILLER,),
- maximum_quantity=None,
- ),
-}
diff --git a/worlds/zork_grand_inquisitor/data/location_data.py b/worlds/zork_grand_inquisitor/data/location_data.py
deleted file mode 100644
index 8b4e57392de8..000000000000
--- a/worlds/zork_grand_inquisitor/data/location_data.py
+++ /dev/null
@@ -1,1535 +0,0 @@
-from typing import Dict, NamedTuple, Optional, Tuple, Union
-
-from ..enums import (
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorLocations,
- ZorkGrandInquisitorRegions,
- ZorkGrandInquisitorTags,
-)
-
-
-class ZorkGrandInquisitorLocationData(NamedTuple):
- game_state_trigger: Optional[
- Tuple[
- Union[
- Tuple[str, str],
- Tuple[int, int],
- Tuple[int, Tuple[int, ...]],
- ],
- ...,
- ]
- ]
- archipelago_id: Optional[int]
- region: ZorkGrandInquisitorRegions
- tags: Optional[Tuple[ZorkGrandInquisitorTags, ...]] = None
- requirements: Optional[
- Tuple[
- Union[
- Union[
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorEvents,
- ],
- Tuple[
- Union[
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorEvents,
- ],
- ...,
- ],
- ],
- ...,
- ]
- ] = None
- event_item_name: Optional[str] = None
-
-
-LOCATION_OFFSET = 9758067000
-
-location_data: Dict[
- Union[ZorkGrandInquisitorLocations, ZorkGrandInquisitorEvents], ZorkGrandInquisitorLocationData
-] = {
- ZorkGrandInquisitorLocations.ALARM_SYSTEM_IS_DOWN: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "tr2m"),),
- archipelago_id=LOCATION_OFFSET + 0,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.ARREST_THE_VANDAL: ZorkGrandInquisitorLocationData(
- game_state_trigger=((10789, 1),),
- archipelago_id=LOCATION_OFFSET + 1,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE,
- ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL,
- ),
- ),
- ZorkGrandInquisitorLocations.ARTIFACTS_EXPLAINED: ZorkGrandInquisitorLocationData(
- game_state_trigger=((11787, 1), (11788, 1), (11789, 1)),
- archipelago_id=LOCATION_OFFSET + 2,
- region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER: ZorkGrandInquisitorLocationData(
- game_state_trigger=((8929, 1),),
- archipelago_id=LOCATION_OFFSET + 3,
- region=ZorkGrandInquisitorRegions.HADES,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(ZorkGrandInquisitorEvents.KNOWS_OBIDIL,),
- ),
- ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((9124, 1),),
- archipelago_id=LOCATION_OFFSET + 4,
- region=ZorkGrandInquisitorRegions.HADES,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE,
- ZorkGrandInquisitorItems.HOTSPOT_666_MAILBOX,
- ),
- ),
- ZorkGrandInquisitorLocations.A_SMALLWAY: ZorkGrandInquisitorLocationData(
- game_state_trigger=((11777, 1),),
- archipelago_id=LOCATION_OFFSET + 5,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS,
- ZorkGrandInquisitorItems.SPELL_IGRAM,
- ),
- ),
- ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY: ZorkGrandInquisitorLocationData(
- game_state_trigger=((13278, 1),),
- archipelago_id=LOCATION_OFFSET + 6,
- region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_MOSSY_GRATE,
- ZorkGrandInquisitorItems.SPELL_THROCK,
- ),
- ),
- ZorkGrandInquisitorLocations.BEBURTT_DEMYSTIFIED: ZorkGrandInquisitorLocationData(
- game_state_trigger=((16315, 1),),
- archipelago_id=LOCATION_OFFSET + 7,
- region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE,
- ZorkGrandInquisitorItems.SPELL_KENDALL,
- ),
- ),
- ZorkGrandInquisitorLocations.BETTER_SPELL_MANUFACTURING_IN_UNDER_10_MINUTES: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "th3x"),),
- archipelago_id=LOCATION_OFFSET + 8,
- region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE,),
- ),
- ZorkGrandInquisitorLocations.BOING_BOING_BOING: ZorkGrandInquisitorLocationData(
- game_state_trigger=((4220, 1),),
- archipelago_id=LOCATION_OFFSET + 9,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.HAMMER,
- ZorkGrandInquisitorItems.SNAPDRAGON,
- ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM,
- ),
- ),
- ZorkGrandInquisitorLocations.BONK: ZorkGrandInquisitorLocationData(
- game_state_trigger=((19491, 1),),
- archipelago_id=LOCATION_OFFSET + 10,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.HAMMER,
- ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON,
- ),
- ),
- ZorkGrandInquisitorLocations.BRAVE_SOULS_WANTED: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "us2g"),),
- archipelago_id=LOCATION_OFFSET + 11,
- region=ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.BROG_DO_GOOD: ZorkGrandInquisitorLocationData(
- game_state_trigger=((2644, 1),),
- archipelago_id=LOCATION_OFFSET + 12,
- region=ZorkGrandInquisitorRegions.WHITE_HOUSE,
- 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,
- 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,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.TOTEM_BROG,
- ZorkGrandInquisitorItems.BROGS_GRUE_EGG,
- ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH,
- )
- ),
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME: ZorkGrandInquisitorLocationData(
- game_state_trigger=((15715, 1),),
- archipelago_id=LOCATION_OFFSET + 15,
- region=ZorkGrandInquisitorRegions.WHITE_HOUSE,
- 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,
- )
- ),
- ZorkGrandInquisitorLocations.CASTLE_WATCHING_A_FIELD_GUIDE: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "dv1t"),),
- archipelago_id=LOCATION_OFFSET + 16,
- region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.CAVES_NOTES: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "th3y"),),
- archipelago_id=LOCATION_OFFSET + 17,
- region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE,),
- ),
- ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS: ZorkGrandInquisitorLocationData(
- game_state_trigger=((9543, 1),),
- archipelago_id=LOCATION_OFFSET + 18,
- region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.CRISIS_AVERTED: ZorkGrandInquisitorLocationData(
- game_state_trigger=((11769, 1),),
- archipelago_id=LOCATION_OFFSET + 19,
- region=ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED,
- ZorkGrandInquisitorItems.SPELL_IGRAM,
- ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS,
- ZorkGrandInquisitorItems.HOTSPOT_DENTED_LOCKER,
- ),
- ),
- ZorkGrandInquisitorLocations.CUT_THAT_OUT_YOU_LITTLE_CREEP: ZorkGrandInquisitorLocationData(
- game_state_trigger=((19350, 1),),
- archipelago_id=LOCATION_OFFSET + 20,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER: ZorkGrandInquisitorLocationData(
- game_state_trigger=((17632, 1),),
- archipelago_id=LOCATION_OFFSET + 21,
- region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_BLINDS,
- 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,
- region=ZorkGrandInquisitorRegions.HADES,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(ZorkGrandInquisitorItems.SWORD,),
- ),
- ZorkGrandInquisitorLocations.DOOOOOOWN: ZorkGrandInquisitorLocationData(
- game_state_trigger=((3619, 3600),),
- archipelago_id=LOCATION_OFFSET + 24,
- region=ZorkGrandInquisitorRegions.WHITE_HOUSE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.TOTEM_GRIFF,
- ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG,
- ),
- ),
- ZorkGrandInquisitorLocations.DOWN: ZorkGrandInquisitorLocationData(
- game_state_trigger=((3619, 5300),),
- archipelago_id=LOCATION_OFFSET + 25,
- region=ZorkGrandInquisitorRegions.WHITE_HOUSE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.TOTEM_LUCY,
- ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG,
- ),
- ),
- ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL: ZorkGrandInquisitorLocationData(
- game_state_trigger=((9216, 1),),
- archipelago_id=LOCATION_OFFSET + 26,
- region=ZorkGrandInquisitorRegions.HADES_BEYOND_GATES,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(ZorkGrandInquisitorItems.SPELL_NARWILE,),
- ),
- ZorkGrandInquisitorLocations.DUNCE_LOCKER: ZorkGrandInquisitorLocationData(
- game_state_trigger=((11851, 1),),
- archipelago_id=LOCATION_OFFSET + 27,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,
- ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT,
- ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS,
- ),
- ),
- ZorkGrandInquisitorLocations.EGGPLANTS: ZorkGrandInquisitorLocationData(
- game_state_trigger=((3816, 11000),),
- archipelago_id=LOCATION_OFFSET + 28,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.ELSEWHERE: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "pc1e"),),
- archipelago_id=LOCATION_OFFSET + 29,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.EMERGENCY_MAGICATRONIC_MESSAGE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((11784, 1),),
- archipelago_id=LOCATION_OFFSET + 30,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- ),
- ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP: ZorkGrandInquisitorLocationData(
- game_state_trigger=((13743, 1),),
- archipelago_id=LOCATION_OFFSET + 31,
- region=ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(ZorkGrandInquisitorItems.SPELL_KENDALL,),
- ),
- ZorkGrandInquisitorLocations.FAT_LOT_OF_GOOD_THATLL_DO_YA: ZorkGrandInquisitorLocationData(
- game_state_trigger=((16368, 1),),
- archipelago_id=LOCATION_OFFSET + 32,
- region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(ZorkGrandInquisitorItems.SPELL_IGRAM,),
- ),
- ZorkGrandInquisitorLocations.FIRE_FIRE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((10277, 1),),
- archipelago_id=LOCATION_OFFSET + 33,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE,
- ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL,
- ),
- ),
- ZorkGrandInquisitorLocations.FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "ue1h"),),
- archipelago_id=LOCATION_OFFSET + 34,
- region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON: ZorkGrandInquisitorLocationData(
- game_state_trigger=((4222, 1),),
- archipelago_id=LOCATION_OFFSET + 35,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.SPELL_THROCK,
- ZorkGrandInquisitorItems.SNAPDRAGON,
- ZorkGrandInquisitorItems.HAMMER,
- ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM,
- ),
- ),
- ZorkGrandInquisitorLocations.FROBUARY_3_UNDERGROUNDHOG_DAY: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "dw2g"),),
- archipelago_id=LOCATION_OFFSET + 36,
- region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.GETTING_SOME_CHANGE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((12892, 1),),
- archipelago_id=LOCATION_OFFSET + 37,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.ZORKMID_BILL_ACCESSIBLE,
- ZorkGrandInquisitorItems.HOTSPOT_CHANGE_MACHINE_SLOT,
- ),
- ),
- ZorkGrandInquisitorLocations.GO_AWAY: ZorkGrandInquisitorLocationData(
- game_state_trigger=((10654, 1),),
- archipelago_id=LOCATION_OFFSET + 38,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.GUE_TECH_DEANS_LIST: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "tr2k"),),
- archipelago_id=LOCATION_OFFSET + 39,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- 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,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY: ZorkGrandInquisitorLocationData(
- game_state_trigger=((8443, 1),),
- archipelago_id=LOCATION_OFFSET + 43,
- region=ZorkGrandInquisitorRegions.HADES_SHORE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER,
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS,
- )
- ),
- ZorkGrandInquisitorLocations.HELLO_THIS_IS_SHONA_FROM_GURTH_PUBLISHING: ZorkGrandInquisitorLocationData(
- game_state_trigger=((4698, 1),),
- archipelago_id=LOCATION_OFFSET + 44,
- region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((10421, 1),),
- archipelago_id=LOCATION_OFFSET + 45,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH,
- ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER,
- ),
- ),
- ZorkGrandInquisitorLocations.HEY_FREE_DIRT: ZorkGrandInquisitorLocationData(
- game_state_trigger=((11747, 1),),
- archipelago_id=LOCATION_OFFSET + 46,
- region=ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND,
- 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,
- 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,
- 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,
- 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,
- region=ZorkGrandInquisitorRegions.SPELL_LAB,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER,
- ),
- ),
- ZorkGrandInquisitorLocations.IM_COMPLETELY_NUDE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((19344, 1),),
- archipelago_id=LOCATION_OFFSET + 53,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((13060, 1),),
- archipelago_id=LOCATION_OFFSET + 54,
- region=ZorkGrandInquisitorRegions.CROSSROADS,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.SWORD,
- ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE,
- ),
- ),
- ZorkGrandInquisitorLocations.INVISIBLE_FLOWERS: ZorkGrandInquisitorLocationData(
- game_state_trigger=((12967, 1),),
- archipelago_id=LOCATION_OFFSET + 55,
- 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,
- region=ZorkGrandInquisitorRegions.CROSSROADS,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HAMMER,
- ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE,
- ),
- ),
- ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST: ZorkGrandInquisitorLocationData(
- game_state_trigger=((13062, 1),),
- archipelago_id=LOCATION_OFFSET + 57,
- region=ZorkGrandInquisitorRegions.CROSSROADS,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.SPELL_REZROV,
- ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR,
- ),
- ),
- ZorkGrandInquisitorLocations.ITS_ONE_OF_THOSE_ADVENTURERS_AGAIN: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "pe3j"),),
- archipelago_id=LOCATION_OFFSET + 58,
- 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,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.SPELL_THROCK,
- ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON,
- ),
- ),
- ZorkGrandInquisitorLocations.I_DONT_WANT_NO_TROUBLE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((10694, 1),),
- archipelago_id=LOCATION_OFFSET + 60,
- 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,
- region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.SWORD,
- ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE,
- ZorkGrandInquisitorEvents.DAM_DESTROYED,
- ZorkGrandInquisitorItems.SPELL_GOLGATEM,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM,
- ),
- ),
- ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "tp1e"), (9, 87), (1011, 1)),
- archipelago_id=LOCATION_OFFSET + 63,
- 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,
- 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,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE,
- ZorkGrandInquisitorItems.ROPE,
- ZorkGrandInquisitorItems.HOTSPOT_WELL,
- ),
- ),
- ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL: ZorkGrandInquisitorLocationData(
- game_state_trigger=((2498, (1, 2)),),
- archipelago_id=LOCATION_OFFSET + 66,
- region=ZorkGrandInquisitorRegions.WHITE_HOUSE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- (ZorkGrandInquisitorItems.TOTEM_GRIFF, ZorkGrandInquisitorItems.TOTEM_LUCY),
- ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR,
- ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG,
- ),
- ),
- ZorkGrandInquisitorLocations.MAKE_LOVE_NOT_WAR: ZorkGrandInquisitorLocationData(
- game_state_trigger=((8623, 21),),
- archipelago_id=LOCATION_OFFSET + 67,
- region=ZorkGrandInquisitorRegions.HADES_SHORE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.CHARON_CALLED,
- ZorkGrandInquisitorItems.SWORD,
- ),
- ),
- ZorkGrandInquisitorLocations.MEAD_LIGHT: ZorkGrandInquisitorLocationData(
- game_state_trigger=((10485, 1),),
- archipelago_id=LOCATION_OFFSET + 68,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.MEAD_LIGHT,
- ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR,
- ),
- ),
- ZorkGrandInquisitorLocations.MIKES_PANTS: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "tr2p"),),
- archipelago_id=LOCATION_OFFSET + 69,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED: ZorkGrandInquisitorLocationData(
- game_state_trigger=((4217, 1),),
- archipelago_id=LOCATION_OFFSET + 70,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.HAMMER,
- ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM,
- ),
- ),
- ZorkGrandInquisitorLocations.NATIONAL_TREASURE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((14318, 1),),
- archipelago_id=LOCATION_OFFSET + 71,
- region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.SPELL_REZROV,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS,
- ),
- ),
- ZorkGrandInquisitorLocations.NATURAL_AND_SUPERNATURAL_CREATURES_OF_QUENDOR: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "dv1p"),),
- archipelago_id=LOCATION_OFFSET + 72,
- region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO: ZorkGrandInquisitorLocationData(
- game_state_trigger=((12706, 1),),
- archipelago_id=LOCATION_OFFSET + 73,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,
- ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT,
- ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS,
- ),
- ),
- ZorkGrandInquisitorLocations.NOTHIN_LIKE_A_GOOD_STOGIE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((4237, 1),),
- archipelago_id=LOCATION_OFFSET + 74,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE,
- ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY,
- ),
- ),
- ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT: ZorkGrandInquisitorLocationData(
- game_state_trigger=((8935, 1),),
- archipelago_id=LOCATION_OFFSET + 75,
- region=ZorkGrandInquisitorRegions.HADES,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(ZorkGrandInquisitorEvents.KNOWS_SNAVIG,),
- ),
- ZorkGrandInquisitorLocations.NO_AUTOGRAPHS: ZorkGrandInquisitorLocationData(
- game_state_trigger=((10476, 1),),
- archipelago_id=LOCATION_OFFSET + 76,
- 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,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.ROPE,
- ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH,
- ),
- ),
- ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP: ZorkGrandInquisitorLocationData(
- game_state_trigger=((12164, 1),),
- archipelago_id=LOCATION_OFFSET + 78,
- region=ZorkGrandInquisitorRegions.SPELL_LAB,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER,
- ),
- ),
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON: ZorkGrandInquisitorLocationData(
- game_state_trigger=((1300, 1),),
- archipelago_id=LOCATION_OFFSET + 79,
- 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,
- ),
- ),
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS: ZorkGrandInquisitorLocationData(
- game_state_trigger=((2448, 1),),
- archipelago_id=LOCATION_OFFSET + 80,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.TOTEM_BROG,
- ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR,
- ),
- ),
- ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU: ZorkGrandInquisitorLocationData(
- game_state_trigger=((4869, 1),),
- archipelago_id=LOCATION_OFFSET + 81,
- region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.FLATHEADIA_FUDGE,
- 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
- 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,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL: ZorkGrandInquisitorLocationData(
- game_state_trigger=((8730, 1),),
- archipelago_id=LOCATION_OFFSET + 84,
- region=ZorkGrandInquisitorRegions.HADES,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(ZorkGrandInquisitorEvents.KNOWS_SNAVIG,),
- ),
- ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES: ZorkGrandInquisitorLocationData(
- game_state_trigger=((4241, 1),),
- archipelago_id=LOCATION_OFFSET + 85,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HUNGUS_LARD,
- ZorkGrandInquisitorItems.SWORD,
- ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE,
- ),
- ),
- ZorkGrandInquisitorLocations.PERMASEAL: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "mt1g"),),
- archipelago_id=LOCATION_OFFSET + 86,
- region=ZorkGrandInquisitorRegions.MONASTERY,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.PLANETFALL: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "pp1j"),),
- archipelago_id=LOCATION_OFFSET + 87,
- 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,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL: ZorkGrandInquisitorLocationData(
- game_state_trigger=((9404, 1),),
- archipelago_id=LOCATION_OFFSET + 89,
- region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER,
- ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT,
- ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER,
- ZorkGrandInquisitorItems.SPELL_NARWILE,
- ),
- ),
- ZorkGrandInquisitorLocations.PROZORKED: ZorkGrandInquisitorLocationData(
- game_state_trigger=((4115, 1),),
- archipelago_id=LOCATION_OFFSET + 90,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.PROZORK_TABLET,
- ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON,
- ),
- ),
- ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG: ZorkGrandInquisitorLocationData(
- game_state_trigger=((4512, 98),),
- archipelago_id=LOCATION_OFFSET + 91,
- region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS,
- ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV,
- 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,
- region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.SNAVIG_REPAIRED: ZorkGrandInquisitorLocationData(
- game_state_trigger=((201, 1),),
- archipelago_id=LOCATION_OFFSET + 95,
- region=ZorkGrandInquisitorRegions.SPELL_LAB,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER,
- ),
- ),
- ZorkGrandInquisitorLocations.SOUVENIR: ZorkGrandInquisitorLocationData(
- game_state_trigger=((13408, 1),),
- archipelago_id=LOCATION_OFFSET + 96,
- region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,
- ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT,
- ),
- ),
- ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL: ZorkGrandInquisitorLocationData(
- game_state_trigger=((9719, 1),),
- archipelago_id=LOCATION_OFFSET + 97,
- region=ZorkGrandInquisitorRegions.MONASTERY,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS,
- ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH,
- ),
- ),
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER: ZorkGrandInquisitorLocationData(
- game_state_trigger=((14511, 1), (14524, 5)),
- archipelago_id=LOCATION_OFFSET + 98,
- 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.SUCKING_ROCKS: ZorkGrandInquisitorLocationData(
- game_state_trigger=((12859, 1),),
- archipelago_id=LOCATION_OFFSET + 99,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE,
- 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,
- 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,
- 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,
- 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.THATS_A_ROPE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((10486, 1),),
- archipelago_id=LOCATION_OFFSET + 103,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.ROPE,
- ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR,
- ),
- ),
- ZorkGrandInquisitorLocations.THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS: ZorkGrandInquisitorLocationData(
- game_state_trigger=((13805, 1),),
- archipelago_id=LOCATION_OFFSET + 104,
- 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,
- 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,
- 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,
- region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((9473, 1),),
- archipelago_id=LOCATION_OFFSET + 108,
- region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO: ZorkGrandInquisitorLocationData(
- game_state_trigger=((9520, 1),),
- archipelago_id=LOCATION_OFFSET + 109,
- region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "me1j"),),
- archipelago_id=LOCATION_OFFSET + 110,
- region=ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND: ZorkGrandInquisitorLocationData(
- game_state_trigger=((13167, 1),),
- archipelago_id=LOCATION_OFFSET + 111,
- region=ZorkGrandInquisitorRegions.CROSSROADS,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.SUBWAY_TOKEN,
- ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT,
- ),
- ),
- ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "cd60"), (1524, 1)),
- archipelago_id=LOCATION_OFFSET + 112,
- 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,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HAMMER,
- ZorkGrandInquisitorItems.SPELL_THROCK,
- ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM,
- ),
- ),
- ZorkGrandInquisitorLocations.TIME_TRAVEL_FOR_DUMMIES: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "th3z"),),
- archipelago_id=LOCATION_OFFSET + 114,
- 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,
- 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,
- 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,
- region=ZorkGrandInquisitorRegions.CROSSROADS,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(ZorkGrandInquisitorEvents.KNOWS_BEBURTT,),
- ),
- ZorkGrandInquisitorLocations.UP: ZorkGrandInquisitorLocationData(
- game_state_trigger=((3619, 5200),),
- archipelago_id=LOCATION_OFFSET + 118,
- region=ZorkGrandInquisitorRegions.WHITE_HOUSE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.TOTEM_LUCY,
- ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG,
- ),
- ),
- ZorkGrandInquisitorLocations.USELESS_BUT_FUN: ZorkGrandInquisitorLocationData(
- game_state_trigger=((14321, 1),),
- archipelago_id=LOCATION_OFFSET + 119,
- 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,
- region=ZorkGrandInquisitorRegions.WHITE_HOUSE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.TOTEM_GRIFF,
- ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG,
- ),
- ),
- ZorkGrandInquisitorLocations.VOYAGE_OF_CAPTAIN_ZAHAB: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "uh1h"),),
- archipelago_id=LOCATION_OFFSET + 121,
- 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,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR,
- ZorkGrandInquisitorItems.MEAD_LIGHT,
- ZorkGrandInquisitorItems.ZIMDOR_SCROLL,
- ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH,
- ),
- ),
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE: ZorkGrandInquisitorLocationData(
- game_state_trigger=((2461, 1),),
- archipelago_id=LOCATION_OFFSET + 123,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.TOTEM_GRIFF,
- ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR,
- ),
- ),
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER: ZorkGrandInquisitorLocationData(
- game_state_trigger=((15472, 1),),
- archipelago_id=LOCATION_OFFSET + 124,
- 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.WHAT_ARE_YOU_STUPID: ZorkGrandInquisitorLocationData(
- game_state_trigger=((10484, 1),),
- archipelago_id=LOCATION_OFFSET + 125,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER,
- ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR,
- ),
- ),
- ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL: ZorkGrandInquisitorLocationData(
- game_state_trigger=((4983, 1),),
- archipelago_id=LOCATION_OFFSET + 126,
- region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR,
- ZorkGrandInquisitorItems.SPELL_NARWILE,
- ),
- ),
- ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "dc10"), (1596, 1)),
- archipelago_id=LOCATION_OFFSET + 127,
- region=ZorkGrandInquisitorRegions.WALKING_CASTLE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- ),
- ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "dm2g"),),
- archipelago_id=LOCATION_OFFSET + 128,
- 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,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.SWORD,
- ZorkGrandInquisitorItems.HOTSPOT_HARRY,
- ),
- ),
- ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER: ZorkGrandInquisitorLocationData(
- game_state_trigger=((16405, 1),),
- archipelago_id=LOCATION_OFFSET + 130,
- 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,
- region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,
- tags=(ZorkGrandInquisitorTags.CORE,),
- requirements=(
- ZorkGrandInquisitorItems.SWORD,
- ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE,
- ),
- ),
- ZorkGrandInquisitorLocations.YOU_ONE_OF_THEM_AGITATORS_AINT_YA: ZorkGrandInquisitorLocationData(
- game_state_trigger=((10586, 1),),
- archipelago_id=LOCATION_OFFSET + 132,
- 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,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.CORE, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH,),
- ),
- # Deathsanity
- ZorkGrandInquisitorLocations.DEATH_ARRESTED_WITH_JACK: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 1)),
- archipelago_id=LOCATION_OFFSET + 200 + 0,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE,
- ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL,
- ),
- ),
- ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 20)),
- archipelago_id=LOCATION_OFFSET + 200 + 1,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.SWORD,
- ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE,
- ),
- ),
- ZorkGrandInquisitorLocations.DEATH_CLIMBED_OUT_OF_THE_WELL: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 21)),
- archipelago_id=LOCATION_OFFSET + 200 + 2,
- region=ZorkGrandInquisitorRegions.CROSSROADS,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY,),
- ),
- 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),
- requirements=(
- ZorkGrandInquisitorItems.ROPE,
- ZorkGrandInquisitorItems.HOTSPOT_WELL,
- ),
- ),
- ZorkGrandInquisitorLocations.DEATH_JUMPED_IN_BOTTOMLESS_PIT: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 3)),
- archipelago_id=LOCATION_OFFSET + 200 + 4,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY,),
- ),
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 37)),
- archipelago_id=LOCATION_OFFSET + 200 + 5,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE),
- 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.DEATH_LOST_SOUL_TO_OLD_SCRATCH: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 23)),
- archipelago_id=LOCATION_OFFSET + 200 + 6,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(ZorkGrandInquisitorItems.OLD_SCRATCH_CARD,),
- ),
- ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 29)),
- archipelago_id=LOCATION_OFFSET + 200 + 7,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.HUNGUS_LARD,
- ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE,
- ),
- ),
- ZorkGrandInquisitorLocations.DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 30)),
- archipelago_id=LOCATION_OFFSET + 200 + 8,
- region=ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE),
- ),
- ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 4)),
- archipelago_id=LOCATION_OFFSET + 200 + 9,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.SPELL_IGRAM,
- ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS,
- ),
- ),
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 11)),
- archipelago_id=LOCATION_OFFSET + 200 + 10,
- region=ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(
- ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP,
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT,
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN,
- ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS,
- ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH,
- ),
- ),
- ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 34)),
- archipelago_id=LOCATION_OFFSET + 200 + 11,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- 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))),
- archipelago_id=LOCATION_OFFSET + 200 + 12,
- region=ZorkGrandInquisitorRegions.MONASTERY,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY,),
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH,
- ),
- ),
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, (5, 6, 7, 8, 13))),
- archipelago_id=LOCATION_OFFSET + 200 + 13,
- region=ZorkGrandInquisitorRegions.MONASTERY,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY,),
- requirements=(ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH,),
- ),
- ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 10)),
- archipelago_id=LOCATION_OFFSET + 200 + 14,
- region=ZorkGrandInquisitorRegions.HADES,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(ZorkGrandInquisitorEvents.KNOWS_SNAVIG,),
- ),
- ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED: ZorkGrandInquisitorLocationData(
- game_state_trigger=(("location", "gjde"), (2201, 19)),
- archipelago_id=LOCATION_OFFSET + 200 + 15,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- tags=(ZorkGrandInquisitorTags.DEATHSANITY, ZorkGrandInquisitorTags.MISSABLE),
- requirements=(ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED,),
- ),
- # Events
- ZorkGrandInquisitorEvents.CHARON_CALLED: ZorkGrandInquisitorLocationData(
- game_state_trigger=None,
- archipelago_id=None,
- region=ZorkGrandInquisitorRegions.HADES_SHORE,
- requirements=(
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER,
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS,
- ),
- 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,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- requirements=(
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,
- ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT,
- ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS,
- ),
- event_item_name=ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value,
- ),
- ZorkGrandInquisitorEvents.DAM_DESTROYED: ZorkGrandInquisitorLocationData(
- game_state_trigger=None,
- archipelago_id=None,
- region=ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM,
- requirements=(
- ZorkGrandInquisitorItems.SPELL_REZROV,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS,
- ),
- event_item_name=ZorkGrandInquisitorEvents.DAM_DESTROYED.value,
- ),
- ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD: ZorkGrandInquisitorLocationData(
- game_state_trigger=None,
- archipelago_id=None,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- requirements=(
- ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR,
- ZorkGrandInquisitorItems.MEAD_LIGHT,
- ZorkGrandInquisitorItems.ZIMDOR_SCROLL,
- ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH,
- ),
- event_item_name=ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value,
- ),
- ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR: ZorkGrandInquisitorLocationData(
- game_state_trigger=None,
- archipelago_id=None,
- region=ZorkGrandInquisitorRegions.DM_LAIR,
- requirements=(
- ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE,
- ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY,
- ),
- event_item_name=ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR.value,
- ),
- ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE: 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.DUNCE_LOCKER_OPENABLE.value,
- ),
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL: ZorkGrandInquisitorLocationData(
- game_state_trigger=None,
- archipelago_id=None,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- requirements=(
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,
- ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT,
- ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS,
- ),
- event_item_name=ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value,
- ),
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG: ZorkGrandInquisitorLocationData(
- game_state_trigger=None,
- archipelago_id=None,
- region=ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- requirements=(
- ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS,
- ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV,
- ZorkGrandInquisitorItems.HOTSPOT_MIRROR,
- ),
- 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,),
- event_item_name=ZorkGrandInquisitorEvents.ROPE_GLORFABLE.value,
- ),
- ZorkGrandInquisitorEvents.VICTORY: ZorkGrandInquisitorLocationData(
- game_state_trigger=None,
- archipelago_id=None,
- region=ZorkGrandInquisitorRegions.ENDGAME,
- event_item_name=ZorkGrandInquisitorEvents.VICTORY.value,
- ),
- ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE: ZorkGrandInquisitorLocationData(
- game_state_trigger=None,
- archipelago_id=None,
- region=ZorkGrandInquisitorRegions.WHITE_HOUSE,
- requirements=(
- (ZorkGrandInquisitorItems.TOTEM_GRIFF, ZorkGrandInquisitorItems.TOTEM_LUCY),
- ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG,
- ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR,
- ),
- event_item_name=ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value,
- ),
- ZorkGrandInquisitorEvents.ZORKMID_BILL_ACCESSIBLE: ZorkGrandInquisitorLocationData(
- game_state_trigger=None,
- archipelago_id=None,
- region=ZorkGrandInquisitorRegions.PORT_FOOZLE,
- requirements=(ZorkGrandInquisitorItems.OLD_SCRATCH_CARD,),
- event_item_name=ZorkGrandInquisitorEvents.ZORKMID_BILL_ACCESSIBLE.value,
- ),
- ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED: ZorkGrandInquisitorLocationData(
- game_state_trigger=None,
- archipelago_id=None,
- region=ZorkGrandInquisitorRegions.GUE_TECH,
- requirements=(
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,
- ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT,
- ZorkGrandInquisitorItems.ZORK_ROCKS,
- ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS,
- ),
- 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/missable_location_grant_conditions_data.py b/worlds/zork_grand_inquisitor/data/missable_location_grant_conditions_data.py
deleted file mode 100644
index ef6eacb78ceb..000000000000
--- a/worlds/zork_grand_inquisitor/data/missable_location_grant_conditions_data.py
+++ /dev/null
@@ -1,200 +0,0 @@
-from typing import Dict, NamedTuple, Optional, Tuple
-
-from ..enums import ZorkGrandInquisitorItems, ZorkGrandInquisitorLocations
-
-
-class ZorkGrandInquisitorMissableLocationGrantConditionsData(NamedTuple):
- location_condition: ZorkGrandInquisitorLocations
- item_conditions: Optional[Tuple[ZorkGrandInquisitorItems, ...]]
-
-
-missable_location_grant_conditions_data: Dict[
- ZorkGrandInquisitorLocations, ZorkGrandInquisitorMissableLocationGrantConditionsData
-] = {
- ZorkGrandInquisitorLocations.BOING_BOING_BOING:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.BONK:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.PROZORKED,
- item_conditions=(ZorkGrandInquisitorItems.HAMMER,),
- )
- ,
- ZorkGrandInquisitorLocations.DEATH_ARRESTED_WITH_JACK:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- 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,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.DEATH_LOST_SOUL_TO_OLD_SCRATCH:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.OLD_SCRATCH_WINNER,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- 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,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.A_SMALLWAY,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.THAR_SHE_BLOWS,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- 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,
- item_conditions=(ZorkGrandInquisitorItems.SPELL_GOLGATEM,),
- )
- ,
- ZorkGrandInquisitorLocations.EMERGENCY_MAGICATRONIC_MESSAGE:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- 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,
- item_conditions=(ZorkGrandInquisitorItems.SPELL_IGRAM,),
- )
- ,
- ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- 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,
- item_conditions=(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS,),
- )
- ,
- ZorkGrandInquisitorLocations.MEAD_LIGHT:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE,
- item_conditions=(ZorkGrandInquisitorItems.MEAD_LIGHT,),
- )
- ,
- ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.NO_AUTOGRAPHS:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.NO_BONDAGE:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE,
- item_conditions=(ZorkGrandInquisitorItems.ROPE,),
- )
- ,
- ZorkGrandInquisitorLocations.TALK_TO_ME_GRAND_INQUISITOR:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE,
- item_conditions=None,
- )
- ,
- ZorkGrandInquisitorLocations.THATS_A_ROPE:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE,
- item_conditions=(ZorkGrandInquisitorItems.ROPE,),
- )
- ,
- ZorkGrandInquisitorLocations.THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- 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,),
- )
- ,
- ZorkGrandInquisitorLocations.WHAT_ARE_YOU_STUPID:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- location_condition=ZorkGrandInquisitorLocations.FIRE_FIRE,
- item_conditions=(ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER,),
- )
- ,
- ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- 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,
- 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,
- item_conditions=(ZorkGrandInquisitorItems.SPELL_REZROV,),
- )
- ,
- ZorkGrandInquisitorLocations.YOU_WANT_A_PIECE_OF_ME_DOCK_BOY:
- ZorkGrandInquisitorMissableLocationGrantConditionsData(
- 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
deleted file mode 100644
index 1aed160f3088..000000000000
--- a/worlds/zork_grand_inquisitor/data/region_data.py
+++ /dev/null
@@ -1,183 +0,0 @@
-from typing import Dict, NamedTuple, Optional, Tuple
-
-from ..enums import ZorkGrandInquisitorRegions
-
-
-class ZorkGrandInquisitorRegionData(NamedTuple):
- exits: Optional[Tuple[ZorkGrandInquisitorRegions, ...]]
-
-
-region_data: Dict[ZorkGrandInquisitorRegions, ZorkGrandInquisitorRegionData] = {
- ZorkGrandInquisitorRegions.CROSSROADS: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.DM_LAIR,
- ZorkGrandInquisitorRegions.GUE_TECH,
- ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE,
- ZorkGrandInquisitorRegions.HADES_SHORE,
- ZorkGrandInquisitorRegions.PORT_FOOZLE,
- ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,
- ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS,
- ZorkGrandInquisitorRegions.SUBWAY_MONASTERY,
- )
- ),
- ZorkGrandInquisitorRegions.DM_LAIR: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.CROSSROADS,
- ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE,
- ZorkGrandInquisitorRegions.HADES_SHORE,
- ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,
- ZorkGrandInquisitorRegions.SUBWAY_MONASTERY,
- )
- ),
- ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.DM_LAIR,
- ZorkGrandInquisitorRegions.WALKING_CASTLE,
- ZorkGrandInquisitorRegions.WHITE_HOUSE,
- )
- ),
- ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON,
- ZorkGrandInquisitorRegions.HADES_BEYOND_GATES,
- )
- ),
- ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO,
- ZorkGrandInquisitorRegions.ENDGAME,
- )
- ),
- ZorkGrandInquisitorRegions.ENDGAME: ZorkGrandInquisitorRegionData(exits=None),
- ZorkGrandInquisitorRegions.GUE_TECH: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.CROSSROADS,
- ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY,
- ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE,
- )
- ),
- ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.GUE_TECH,
- ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,
- )
- ),
- ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.CROSSROADS,
- ZorkGrandInquisitorRegions.DM_LAIR,
- ZorkGrandInquisitorRegions.GUE_TECH,
- ZorkGrandInquisitorRegions.HADES_SHORE,
- ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,
- ZorkGrandInquisitorRegions.SUBWAY_MONASTERY,
- )
- ),
- ZorkGrandInquisitorRegions.HADES: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.HADES_BEYOND_GATES,
- ZorkGrandInquisitorRegions.HADES_SHORE,
- )
- ),
- ZorkGrandInquisitorRegions.HADES_BEYOND_GATES: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO,
- ZorkGrandInquisitorRegions.HADES,
- )
- ),
- ZorkGrandInquisitorRegions.HADES_SHORE: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.CROSSROADS,
- ZorkGrandInquisitorRegions.DM_LAIR,
- ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE,
- ZorkGrandInquisitorRegions.HADES,
- ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,
- ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS,
- ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM,
- ZorkGrandInquisitorRegions.SUBWAY_MONASTERY,
- )
- ),
- ZorkGrandInquisitorRegions.MENU: ZorkGrandInquisitorRegionData(
- exits=(ZorkGrandInquisitorRegions.PORT_FOOZLE,)
- ),
- ZorkGrandInquisitorRegions.MONASTERY: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.HADES_SHORE,
- ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT,
- ZorkGrandInquisitorRegions.SUBWAY_MONASTERY,
- )
- ),
- ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.MONASTERY,
- ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST,
- )
- ),
- ZorkGrandInquisitorRegions.PORT_FOOZLE: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.CROSSROADS,
- ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP,
- )
- ),
- ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP: ZorkGrandInquisitorRegionData(
- exits=(ZorkGrandInquisitorRegions.PORT_FOOZLE,)
- ),
- ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT,
- ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN,
- )
- ),
- ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.ENDGAME,
- ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST,
- )
- ),
- ZorkGrandInquisitorRegions.SPELL_LAB: ZorkGrandInquisitorRegionData(
- exits=(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE,)
- ),
- ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.CROSSROADS,
- ZorkGrandInquisitorRegions.DM_LAIR,
- ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE,
- ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY,
- ZorkGrandInquisitorRegions.HADES_SHORE,
- ZorkGrandInquisitorRegions.SPELL_LAB,
- ZorkGrandInquisitorRegions.SUBWAY_MONASTERY,
- )
- ),
- ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.CROSSROADS,
- ZorkGrandInquisitorRegions.HADES_SHORE,
- ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM,
- ZorkGrandInquisitorRegions.SUBWAY_MONASTERY,
- )
- ),
- ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.HADES_SHORE,
- ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS,
- ZorkGrandInquisitorRegions.SUBWAY_MONASTERY,
- )
- ),
- ZorkGrandInquisitorRegions.SUBWAY_MONASTERY: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.HADES_SHORE,
- ZorkGrandInquisitorRegions.MONASTERY,
- ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS,
- ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM,
- )
- ),
- ZorkGrandInquisitorRegions.WALKING_CASTLE: ZorkGrandInquisitorRegionData(
- exits=(ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,)
- ),
- ZorkGrandInquisitorRegions.WHITE_HOUSE: ZorkGrandInquisitorRegionData(
- exits=(
- ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR,
- ZorkGrandInquisitorRegions.ENDGAME,
- )
- ),
-}
diff --git a/worlds/zork_grand_inquisitor/data_funcs.py b/worlds/zork_grand_inquisitor/data_funcs.py
deleted file mode 100644
index 2a7bff1fbb6b..000000000000
--- a/worlds/zork_grand_inquisitor/data_funcs.py
+++ /dev/null
@@ -1,247 +0,0 @@
-from typing import Dict, List, Set, Tuple, Union
-
-from .data.entrance_rule_data import entrance_rule_data
-from .data.item_data import item_data, ZorkGrandInquisitorItemData
-from .data.location_data import location_data, ZorkGrandInquisitorLocationData
-
-from .enums import (
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorGoals,
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorLocations,
- ZorkGrandInquisitorRegions,
- ZorkGrandInquisitorTags,
-)
-
-
-def item_names_to_id() -> Dict[str, int]:
- return {item.value: data.archipelago_id for item, data in item_data.items()}
-
-
-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]:
- return {
- location.value: data.archipelago_id
- for location, data in location_data.items()
- if data.archipelago_id is not None
- }
-
-
-def location_names_to_location() -> Dict[str, ZorkGrandInquisitorLocations]:
- return {
- location.value: location
- for location, data in location_data.items()
- if data.archipelago_id is not None
- }
-
-
-def id_to_goals() -> Dict[int, ZorkGrandInquisitorGoals]:
- return {goal.value: goal for goal in ZorkGrandInquisitorGoals}
-
-
-def id_to_items() -> Dict[int, ZorkGrandInquisitorItems]:
- return {data.archipelago_id: item for item, data in item_data.items()}
-
-
-def id_to_locations() -> Dict[int, ZorkGrandInquisitorLocations]:
- return {
- data.archipelago_id: location
- for location, data in location_data.items()
- if data.archipelago_id is not None
- }
-
-
-def item_groups() -> Dict[str, List[str]]:
- groups: Dict[str, List[str]] = dict()
-
- item: ZorkGrandInquisitorItems
- data: ZorkGrandInquisitorItemData
- for item, data in item_data.items():
- if data.tags is not None:
- for tag in data.tags:
- groups.setdefault(tag.value, list()).append(item.value)
-
- return {k: v for k, v in groups.items() if len(v)}
-
-
-def items_with_tag(tag: ZorkGrandInquisitorTags) -> Set[ZorkGrandInquisitorItems]:
- items: Set[ZorkGrandInquisitorItems] = set()
-
- item: ZorkGrandInquisitorItems
- data: ZorkGrandInquisitorItemData
- for item, data in item_data.items():
- if data.tags is not None and tag in data.tags:
- items.add(item)
-
- return items
-
-
-def game_id_to_items() -> Dict[int, ZorkGrandInquisitorItems]:
- mapping: Dict[int, ZorkGrandInquisitorItems] = dict()
-
- item: ZorkGrandInquisitorItems
- data: ZorkGrandInquisitorItemData
- for item, data in item_data.items():
- if data.statemap_keys is not None:
- for key in data.statemap_keys:
- mapping[key] = item
-
- return mapping
-
-
-def location_groups() -> Dict[str, List[str]]:
- groups: Dict[str, List[str]] = dict()
-
- tag: ZorkGrandInquisitorTags
- for tag in ZorkGrandInquisitorTags:
- groups[tag.value] = list()
-
- location: ZorkGrandInquisitorLocations
- data: ZorkGrandInquisitorLocationData
- for location, data in location_data.items():
- if data.tags is not None:
- for tag in data.tags:
- groups[tag.value].append(location.value)
-
- return {k: v for k, v in groups.items() if len(v)}
-
-
-def locations_by_region(include_deathsanity: bool = False) -> Dict[
- ZorkGrandInquisitorRegions, List[ZorkGrandInquisitorLocations]
-]:
- mapping: Dict[ZorkGrandInquisitorRegions, List[ZorkGrandInquisitorLocations]] = dict()
-
- region: ZorkGrandInquisitorRegions
- for region in ZorkGrandInquisitorRegions:
- mapping[region] = list()
-
- location: ZorkGrandInquisitorLocations
- data: ZorkGrandInquisitorLocationData
- for location, data in location_data.items():
- if not include_deathsanity and ZorkGrandInquisitorTags.DEATHSANITY in (
- data.tags or tuple()
- ):
- continue
-
- mapping[data.region].append(location)
-
- return mapping
-
-
-def locations_with_tag(tag: ZorkGrandInquisitorTags) -> Set[ZorkGrandInquisitorLocations]:
- location: ZorkGrandInquisitorLocations
- data: ZorkGrandInquisitorLocationData
-
- return {location for location, data in location_data.items() if data.tags is not None and tag in data.tags}
-
-
-def location_access_rule_for(location: ZorkGrandInquisitorLocations, player: int) -> str:
- data: ZorkGrandInquisitorLocationData = location_data[location]
-
- if data.requirements is None:
- return "lambda state: True"
-
- lambda_string: str = "lambda state: "
-
- i: int
- requirement: Union[
- Tuple[
- Union[
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorItems,
- ],
- ...,
- ],
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorItems
- ]
-
- for i, requirement in enumerate(data.requirements):
- if isinstance(requirement, tuple):
- lambda_string += "("
-
- ii: int
- sub_requirement: Union[ZorkGrandInquisitorEvents, ZorkGrandInquisitorItems]
- for ii, sub_requirement in enumerate(requirement):
- lambda_string += f"state.has(\"{sub_requirement.value}\", {player})"
-
- if ii < len(requirement) - 1:
- lambda_string += " or "
-
- lambda_string += ")"
- else:
- lambda_string += f"state.has(\"{requirement.value}\", {player})"
-
- if i < len(data.requirements) - 1:
- lambda_string += " and "
-
- return lambda_string
-
-
-def entrance_access_rule_for(
- region_origin: ZorkGrandInquisitorRegions,
- region_destination: ZorkGrandInquisitorRegions,
- player: int
-) -> str:
- data: Union[
- Tuple[
- Tuple[
- Union[
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorRegions,
- ],
- ...,
- ],
- ...,
- ],
- None,
- ] = entrance_rule_data[(region_origin, region_destination)]
-
- if data is None:
- return "lambda state: True"
-
- lambda_string: str = "lambda state: "
-
- i: int
- requirement_group: Tuple[
- Union[
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorRegions,
- ],
- ...,
- ]
- for i, requirement_group in enumerate(data):
- lambda_string += "("
-
- ii: int
- requirement: Union[
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorRegions,
- ]
- for ii, requirement in enumerate(requirement_group):
- requirement_type: Union[
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorRegions,
- ] = type(requirement)
-
- if requirement_type in (ZorkGrandInquisitorEvents, ZorkGrandInquisitorItems):
- lambda_string += f"state.has(\"{requirement.value}\", {player})"
- elif requirement_type == ZorkGrandInquisitorRegions:
- lambda_string += f"state.can_reach(\"{requirement.value}\", \"Region\", {player})"
-
- if ii < len(requirement_group) - 1:
- lambda_string += " and "
-
- lambda_string += ")"
-
- if i < len(data) - 1:
- lambda_string += " or "
-
- return lambda_string
diff --git a/worlds/zork_grand_inquisitor/docs/en_Zork Grand Inquisitor.md b/worlds/zork_grand_inquisitor/docs/en_Zork Grand Inquisitor.md
deleted file mode 100644
index d5821914beca..000000000000
--- a/worlds/zork_grand_inquisitor/docs/en_Zork Grand Inquisitor.md
+++ /dev/null
@@ -1,102 +0,0 @@
-# Zork Grand Inquisitor
-
-## Where is the options page?
-
-The [player options page for this game](../player-options) contains all the options you need to configure and export a
-configuration file.
-
-## Is a tracker available for this game?
-
-Yes! You can download the latest PopTracker pack for Zork Grand Inquisitor [here](https://github.com/SerpentAI/ZorkGrandInquisitorAPTracker/releases/latest).
-
-## What does randomization do to this game?
-
-A majority of inventory items you can normally pick up are completely removed from the game (e.g. the lantern won't be
-in the crate, the mead won't be at the fish market, etc.). Instead, these items will be distributed in the multiworld.
-This means that you can expect to access areas and be in a position to solve certain puzzles in a completely different
-order than you normally would.
-
-Subway, teleporter and totemizer destinations are initially locked and need to be unlocked by receiving the
-corresponding item in the multiworld. This alone enables creative routing in a game that would otherwise be rather
-linear. The Crossroads destination is always unlocked for both the subway and teleporter to prevent softlocks. Until you
-receive your first totemizer destination, it will be locked to Newark, New Jersey.
-
-Important hotspots are also randomized. This means that you will be unable to interact with certain objects until you
-receive the corresponding item in the multiworld. This can be a bit confusing at first, but it adds depth to the
-randomization and makes the game more interesting to play.
-
-You can travel back to the surface without dying by looking inside the bucket. This will work as long as the rope is
-still attached to the well.
-
-Attempting to cast VOXAM will teleport you back to the Crossroads. Fast Travel!
-
-## What item types are distributed in the multiworld?
-
-- Inventory items
-- Pouch of Zorkmids
-- Spells
-- Totems
-- Subway destinations
-- Teleporter destinations
-- Totemizer destinations
-- Hotspots (with option to start with the items enabling them instead if you prefer not playing with the randomization
- of hotspots)
-
-## When the player receives an item, what happens?
-
-- **Inventory items**: Directly added to the player's inventory.
-- **Pouch of Zorkmids**: Appears on the inventory screen. The player can then pick up Zorkmid coins from it.
-- **Spells**: Learned and directly added to the spell book.
-- **Totems**: Appears on the inventory screen.
-- **Subway destinations**: The destination button on the subway map becomes functional.
-- **Teleporter destinations**: The destination can show up on the teleporter screen.
-- **Totemizer destinations**: The destination button on the panel becomes functional.
-- **Hotspots**: The hotspot becomes interactable.
-
-## What is considered a location check in Zork Grand Inquisitor?
-
-- Solving puzzles
-- Accessing certain areas for the first time
-- Triggering certain interactions, even if they aren't puzzles per se
-- Dying in unique ways (Optional; Deathsanity option)
-
-## The location check names are fun but don't always convey well what's needed to unlock them. Is there a guide?
-
-Yes! You can find a complete guide for the location checks [here](https://gist.github.com/nbrochu/f7bed7a1fef4e2beb67ad6ddbf18b970).
-
-## What is the victory condition?
-
-Victory is achieved when the 3 artifacts of magic are retrieved and placed inside the walking castle.
-
-## Can I use the save system without a problem?
-
-Absolutely! The save system is fully supported (and its use is in fact strongly encouraged!). You can save and load your
-game as you normally would and the client will automatically sync your items and hotspots with what you should have in
-that game state.
-
-Depending on how your game progresses, there's a chance that certain location checks might become missable. This
-presents an excellent opportunity to utilize the save system. Simply make it a habit to save before undertaking
-irreversible actions, ensuring you can revert to a previous state if necessary. If you prefer not to depend on the save
-system for accessing missable location checks, there's an option to automatically unlock them as they become
-unavailable.
-
-## Unique Local Commands
-The following commands are only available when using the Zork Grand Inquisitor Client to play the game with Archipelago.
-
-- `/zork` Attempts to attach to a running instance of Zork Grand Inquisitor. If successful, the client will then be able
- to read and control the state of the game.
-- `/brog` Lists received items for Brog.
-- `/griff` Lists received items for Griff.
-- `/lucy` Lists received items for Lucy.
-- `/hotspots` Lists received hotspots.
-
-## Known issues
-
-- You will get a second rope right after using GLORF (one in your inventory and one on your cursor). This is a harmless
- side effect that will go away after you store it in your inventory as duplicates are actively removed.
-- After climbing up to the Monastery for the first time, a rope will forever remain in place in the vent. When you come
- back to the Monastery, you will be able to climb up without needing to combine the sword and rope again. However, when
- arriving at the top, you will receive a duplicate sword on a rope. This is a harmless side effect that will go away
- after you store it in your inventory as duplicates are actively removed.
-- Since the client is reading and manipulating the game's memory, rare game crashes can happen. If you encounter one,
- simply restart the game, load your latest save and use the `/zork` command again in the client. Nothing will be lost.
diff --git a/worlds/zork_grand_inquisitor/docs/setup_en.md b/worlds/zork_grand_inquisitor/docs/setup_en.md
deleted file mode 100644
index f9078c6d39ba..000000000000
--- a/worlds/zork_grand_inquisitor/docs/setup_en.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Zork Grand Inquisitor Randomizer Setup Guide
-
-## Requirements
-
-- Windows OS (Hard required. Client is using memory reading / writing through Win32 API)
-- A copy of Zork Grand Inquisitor. Only the GOG version is supported. The Steam version can work with some tinkering but
- is not officially supported.
-- ScummVM 2.7.1 64-bit (Important: Will not work with any other version. [Direct Download](https://downloads.scummvm.org/frs/scummvm/2.7.1/scummvm-2.7.1-win32-x86_64.zip))
-- Archipelago 0.4.4+
-
-## Game Setup Instructions
-
-No game modding is required to play Zork Grand Inquisitor with Archipelago. The client does all the work by attaching to
-the game process and reading and manipulating the game state in real-time.
-
-This being said, the game does need to be played through ScummVM 2.7.1, so some configuration is required around that.
-
-### GOG
-
-- Open the directory where you installed Zork Grand Inquisitor. You should see a `Launch Zork Grand Inquisitor`
- shortcut.
-- Open the `scummvm` directory. Delete the entire contents of that directory.
-- Still inside the `scummvm` directory, unzip the contents of the ScummVM 2.7.1 zip file you downloaded earlier.
-- Go back to the directory where you installed Zork Grand Inquisitor.
-- Verify that the game still launches when using the `Launch Zork Grand Inquisitor` shortcut.
-- Your game is now ready to be played with Archipelago. From now on, you can use the `Launch Zork Grand Inquisitor`
- shortcut to launch the game.
-
-## Joining a Multiworld Game
-
-- Launch Zork Grand Inquisitor and start a new game.
-- Open the Archipelago Launcher and click `Zork Grand Inquisitor Client`.
-- Using the `Zork Grand Inquisitor Client`:
- - Enter the room's hostname and port number (e.g. `archipelago.gg:54321`) in the top box and press `Connect`.
- - Input your player name at the bottom when prompted and press `Enter`.
- - You should now be connected to the Archipelago room.
- - Next, input `/zork` at the bottom and press `Enter`. This will attach the client to the game process.
- - If the command is successful, you are now ready to play Zork Grand Inquisitor with Archipelago.
-
-## Continuing a Multiworld Game
-
-- Perform the same steps as above, but instead of starting a new game, load your latest save file.
diff --git a/worlds/zork_grand_inquisitor/enums.py b/worlds/zork_grand_inquisitor/enums.py
deleted file mode 100644
index ecbb38a949b4..000000000000
--- a/worlds/zork_grand_inquisitor/enums.py
+++ /dev/null
@@ -1,350 +0,0 @@
-import enum
-
-
-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"
- DOOR_SMOKED_CIGAR = "Event: Door Smoked Cigar"
- 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
-
-
-class ZorkGrandInquisitorItems(enum.Enum):
- BROGS_BICKERING_TORCH = "Brog's Bickering Torch"
- BROGS_FLICKERING_TORCH = "Brog's Flickering Torch"
- BROGS_GRUE_EGG = "Brog's Grue Egg"
- BROGS_PLANK = "Brog's Plank"
- 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"
- GRIFFS_INFLATABLE_SEA_CAPTAIN = "Griff's Inflatable Sea Captain"
- HAMMER = "Hammer"
- HOTSPOT_666_MAILBOX = "Hotspot: 666 Mailbox"
- HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS = "Hotspot: Alpine's Quandry Card Slots"
- HOTSPOT_BLANK_SCROLL_BOX = "Hotspot: Blank Scroll Box"
- HOTSPOT_BLINDS = "Hotspot: Blinds"
- 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"
- HOTSPOT_CHANGE_MACHINE_SLOT = "Hotspot: Change Machine Slot"
- HOTSPOT_CLOSET_DOOR = "Hotspot: Closet Door"
- HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT = "Hotspot: Closing the Time Tunnels Hammer Slot"
- HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER = "Hotspot: Closing the Time Tunnels Lever"
- HOTSPOT_COOKING_POT = "Hotspot: Cooking Pot"
- HOTSPOT_DENTED_LOCKER = "Hotspot: Dented Locker"
- HOTSPOT_DIRT_MOUND = "Hotspot: Dirt Mound"
- HOTSPOT_DOCK_WINCH = "Hotspot: Dock Winch"
- HOTSPOT_DRAGON_CLAW = "Hotspot: Dragon Claw"
- HOTSPOT_DRAGON_NOSTRILS = "Hotspot: Dragon Nostrils"
- HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE = "Hotspot: Dungeon Master's Lair Entrance"
- 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"
- HOTSPOT_FROZEN_TREAT_MACHINE_DOORS = "Hotspot: Frozen Treat Machine Doors"
- HOTSPOT_GLASS_CASE = "Hotspot: Glass Case"
- 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_HADES_PHONE_BUTTONS = "Hotspot: Hades Phone Buttons"
- HOTSPOT_HADES_PHONE_RECEIVER = "Hotspot: Hades Phone Receiver"
- HOTSPOT_HARRY = "Hotspot: Harry"
- HOTSPOT_HARRYS_ASHTRAY = "Hotspot: Harry's Ashtray"
- HOTSPOT_HARRYS_BIRD_BATH = "Hotspot: Harry's Bird Bath"
- HOTSPOT_IN_MAGIC_WE_TRUST_DOOR = "Hotspot: In Magic We Trust Door"
- HOTSPOT_JACKS_DOOR = "Hotspot: Jack's Door"
- HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS = "Hotspot: Loudspeaker Volume Buttons"
- 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"
- HOTSPOT_QUELBEE_HIVE = "Hotspot: Quelbee Hive"
- HOTSPOT_ROPE_BRIDGE = "Hotspot: Rope Bridge"
- HOTSPOT_SKULL_CAGE = "Hotspot: Skull Cage"
- HOTSPOT_SNAPDRAGON = "Hotspot: Snapdragon"
- HOTSPOT_SODA_MACHINE_BUTTONS = "Hotspot: Soda Machine Buttons"
- 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_CHASM = "Hotspot: Spell Lab Chasm"
- HOTSPOT_SPRING_MUSHROOM = "Hotspot: Spring Mushroom"
- HOTSPOT_STUDENT_ID_MACHINE = "Hotspot: Student ID Machine"
- HOTSPOT_SUBWAY_TOKEN_SLOT = "Hotspot: Subway Token Slot"
- 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"
- 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"
- 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"
- SCROLL_FRAGMENT_ANS = "Scroll Fragment: ANS"
- SCROLL_FRAGMENT_GIV = "Scroll Fragment: GIV"
- SHOVEL = "Shovel"
- SNAPDRAGON = "Snapdragon"
- SPELL_GLORF = "Spell: GLORF"
- SPELL_GOLGATEM = "Spell: GOLGATEM"
- SPELL_IGRAM = "Spell: IGRAM"
- SPELL_KENDALL = "Spell: KENDALL"
- SPELL_NARWILE = "Spell: NARWILE"
- SPELL_REZROV = "Spell: REZROV"
- SPELL_THROCK = "Spell: THROCK"
- SPELL_VOXAM = "Spell: VOXAM"
- STUDENT_ID = "Student ID"
- 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_DM_LAIR = "Teleporter Destination: Dungeon Master's Lair"
- TELEPORTER_DESTINATION_GUE_TECH = "Teleporter Destination: GUE Tech"
- TELEPORTER_DESTINATION_HADES = "Teleporter Destination: Hades"
- TELEPORTER_DESTINATION_MONASTERY = "Teleporter Destination: Monastery Station"
- TELEPORTER_DESTINATION_SPELL_LAB = "Teleporter Destination: Spell Lab"
- TOTEM_BROG = "Totem: Brog"
- TOTEM_GRIFF = "Totem: Griff"
- TOTEM_LUCY = "Totem: Lucy"
- TOTEMIZER_DESTINATION_HALL_OF_INQUISITION = "Totemizer Destination: Hall of Inquisition"
- TOTEMIZER_DESTINATION_INFINITY = "Totemizer Destination: Infinity"
- TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL = "Totemizer Destination: Straight to Hell"
- TOTEMIZER_DESTINATION_SURFACE_OF_MERZ = "Totemizer Destination: Surface of Merz"
- ZIMDOR_SCROLL = "ZIMDOR Scroll"
- ZORK_ROCKS = "Zork Rocks"
-
-
-class ZorkGrandInquisitorLocations(enum.Enum):
- ALARM_SYSTEM_IS_DOWN = "Alarm System is Down"
- ARREST_THE_VANDAL = "Arrest the Vandal!"
- ARTIFACTS_EXPLAINED = "Artifacts, Explained"
- A_BIG_FAT_SASSY_2_HEADED_MONSTER = "A Big, Fat, SASSY 2-Headed Monster"
- A_LETTER_FROM_THE_WHITE_HOUSE = "A Letter from the White House"
- A_SMALLWAY = "A Smallway"
- BEAUTIFUL_THATS_PLENTY = "Beautiful, That's Plenty!"
- BEBURTT_DEMYSTIFIED = "BEBURTT, Demystified"
- BETTER_SPELL_MANUFACTURING_IN_UNDER_10_MINUTES = "Better Spell Manufacturing in Under 10 Minutes"
- BOING_BOING_BOING = "Boing, Boing, Boing"
- BONK = "Bonk!"
- BRAVE_SOULS_WANTED = "Brave Souls Wanted"
- BROG_DO_GOOD = "Brog Do Good!"
- BROG_EAT_ROCKS = "Brog Eat Rocks"
- BROG_KNOW_DUMB_THAT_DUMB = "Brog Know Dumb. That Dumb"
- BROG_MUCH_BETTER_AT_THIS_GAME = "Brog Much Better at This Game"
- CASTLE_WATCHING_A_FIELD_GUIDE = "Castle Watching: A Field Guide"
- CAVES_NOTES = "Cave's Notes"
- CLOSING_THE_TIME_TUNNELS = "Closing the Time Tunnels"
- 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"
- 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"
- DRAGON_ARCHIPELAGO_TIME_TUNNEL = "Dragon Archipelago Time Tunnel"
- DUNCE_LOCKER = "Dunce Locker"
- EGGPLANTS = "Eggplants"
- ELSEWHERE = "Elsewhere"
- EMERGENCY_MAGICATRONIC_MESSAGE = "Emergency Magicatronic Message"
- ENJOY_YOUR_TRIP = "Enjoy Your Trip!"
- FAT_LOT_OF_GOOD_THATLL_DO_YA = "Fat Lot of Good That'll Do Ya"
- FIRE_FIRE = "Fire! Fire!"
- FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE = "Flood Control Dam #3: The Not Remotely Boring Tale"
- FLYING_SNAPDRAGON = "Flying Snapdragon"
- 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"
- 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"
- IM_COMPLETELY_NUDE = "I'm Completely Nude"
- INTO_THE_FOLIAGE = "Into the Foliage"
- INVISIBLE_FLOWERS = "Invisible Flowers"
- IN_CASE_OF_ADVENTURE = "In Case of Adventure, Break Glass!"
- IN_MAGIC_WE_TRUST = "In Magic We Trust"
- 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"
- LIT_SUNFLOWERS = "Lit Sunflowers"
- MAGIC_FOREVER = "Magic Forever!"
- MAILED_IT_TO_HELL = "Mailed it to Hell"
- MAKE_LOVE_NOT_WAR = "Make Love, Not War"
- MEAD_LIGHT = "Mead Light?"
- MIKES_PANTS = "Mike's Pants"
- MUSHROOM_HAMMERED = "Mushroom, Hammered"
- NATIONAL_TREASURE = "300 Year Old National Treasure"
- NATURAL_AND_SUPERNATURAL_CREATURES_OF_QUENDOR = "Natural and Supernatural Creatures of Quendor"
- NOOOOOOOOOOOOO = "NOOOOOOOOOOOOO!"
- NOTHIN_LIKE_A_GOOD_STOGIE = "Nothin' Like a Good Stogie"
- NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT = "Now You Look Like Us, Which is an Improvement"
- NO_AUTOGRAPHS = "No Autographs"
- NO_BONDAGE = "No Bondage"
- OBIDIL_DRIED_UP = "OBIDIL, Dried Up"
- OH_DEAR_GOD_ITS_A_DRAGON = "Oh Dear God, It's a Dragon!"
- OH_VERY_FUNNY_GUYS = "Oh, Very Funny Guys"
- OH_WOW_TALK_ABOUT_DEJA_VU = "Oh, Wow! Talk About Deja Vu"
- OLD_SCRATCH_WINNER = "Old Scratch Winner!"
- ONLY_YOU_CAN_PREVENT_FOOZLE_FIRES = "Only You Can Prevent Foozle Fires"
- OPEN_THE_GATES_OF_HELL = "Open the Gates of Hell"
- OUTSMART_THE_QUELBEES = "Outsmart the Quelbees"
- PERMASEAL = "PermaSeal"
- PLANETFALL = "Planetfall"
- PLEASE_DONT_THROCK_THE_GRASS = "Please Don't THROCK the Grass"
- 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"
- STRIP_GRUE_FIRE_WATER = "Strip Grue, Fire, Water"
- SUCKING_ROCKS = "Sucking Rocks"
- TALK_TO_ME_GRAND_INQUISITOR = "Talk to Me Grand Inquisitor"
- TAMING_YOUR_SNAPDRAGON = "Taming Your Snapdragon"
- THAR_SHE_BLOWS = "Thar She Blows!"
- THATS_A_ROPE = "That's a Rope"
- THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS = "That's it! Just Keep Hitting Those Buttons"
- THATS_STILL_A_ROPE = "That's Still a Rope"
- THATS_THE_SPIRIT = "That's the Spirit!"
- THE_ALCHEMICAL_DEBACLE = "The Alchemical Debacle"
- THE_ENDLESS_FIRE = "The Endless Fire"
- THE_FLATHEADIAN_FUDGE_FIASCO = "The Flatheadian Fudge Fiasco"
- 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"
- THROCKED_MUSHROOM_HAMMERED = "THROCKed Mushroom, Hammered"
- TIME_TRAVEL_FOR_DUMMIES = "Time Travel for Dummies"
- TOTEMIZED_DAILY_BILLBOARD = "Totemized Daily Billboard Functioning Correctly"
- UH_OH_BROG_CANT_SWIM = "Uh-Oh. Brog Can't Swim"
- UMBRELLA_FLOWERS = "Umbrella Flowers"
- UP = "Up"
- USELESS_BUT_FUN = "Useless, But Fun"
- UUUUUP = "Uuuuup"
- VOYAGE_OF_CAPTAIN_ZAHAB = "Voyage of Captain Zahab"
- WANT_SOME_RYE_COURSE_YA_DO = "Want Some Rye? Course Ya Do!"
- WE_DONT_SERVE_YOUR_KIND_HERE = "We Don't Serve Your Kind Here"
- WE_GOT_A_HIGH_ROLLER = "We Got a High Roller!"
- WHAT_ARE_YOU_STUPID = "What Are You, Stupid?"
- WHITE_HOUSE_TIME_TUNNEL = "White House Time Tunnel"
- WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE = "Wow! I've Never Gone Inside Him Before!"
- YAD_GOHDNUORGREDNU_3_YRAUBORF = "yaD gohdnuorgrednU - 3 yrauborF"
- 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_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 ZorkGrandInquisitorRegions(enum.Enum):
- CROSSROADS = "Crossroads"
- DM_LAIR = "Dungeon Master's Lair"
- DM_LAIR_INTERIOR = "Dungeon Master's Lair - Interior"
- DRAGON_ARCHIPELAGO = "Dragon Archipelago"
- DRAGON_ARCHIPELAGO_DRAGON = "Dragon Archipelago - Dragon"
- ENDGAME = "Endgame"
- GUE_TECH = "GUE Tech"
- GUE_TECH_HALLWAY = "GUE Tech - Hallway"
- GUE_TECH_OUTSIDE = "GUE Tech - Outside"
- HADES = "Hades"
- HADES_BEYOND_GATES = "Hades - Beyond Gates"
- HADES_SHORE = "Hades - Shore"
- MENU = "Menu"
- MONASTERY = "Monastery"
- MONASTERY_EXHIBIT = "Monastery - Exhibit"
- PORT_FOOZLE = "Port Foozle"
- PORT_FOOZLE_JACKS_SHOP = "Port Foozle - Jack's Shop"
- PORT_FOOZLE_PAST = "Port Foozle Past"
- PORT_FOOZLE_PAST_TAVERN = "Port Foozle Past - Tavern"
- SPELL_LAB = "Spell Lab"
- SPELL_LAB_BRIDGE = "Spell Lab - Bridge"
- SUBWAY_CROSSROADS = "Subway Platform - Crossroads"
- SUBWAY_FLOOD_CONTROL_DAM = "Subway Platform - Flood Control Dam #3"
- SUBWAY_MONASTERY = "Subway Platform - Monastery"
- WALKING_CASTLE = "Walking Castle"
- WHITE_HOUSE = "White House"
-
-
-class ZorkGrandInquisitorTags(enum.Enum):
- CORE = "Core"
- DEATHSANITY = "Deathsanity"
- FILLER = "Filler"
- HOTSPOT = "Hotspot"
- INVENTORY_ITEM = "Inventory Item"
- MISSABLE = "Missable"
- SPELL = "Spell"
- SUBWAY_DESTINATION = "Subway Destination"
- TELEPORTER_DESTINATION = "Teleporter Destination"
- TOTEMIZER_DESTINATION = "Totemizer Destination"
- TOTEM = "Totem"
diff --git a/worlds/zork_grand_inquisitor/game_controller.py b/worlds/zork_grand_inquisitor/game_controller.py
deleted file mode 100644
index 7a60a1460829..000000000000
--- a/worlds/zork_grand_inquisitor/game_controller.py
+++ /dev/null
@@ -1,1388 +0,0 @@
-import collections
-import functools
-import logging
-
-from typing import Dict, 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 (
- missable_location_grant_conditions_data,
- ZorkGrandInquisitorMissableLocationGrantConditionsData,
-)
-
-from .data_funcs import game_id_to_items, items_with_tag, locations_with_tag
-
-from .enums import (
- ZorkGrandInquisitorGoals,
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorLocations,
- ZorkGrandInquisitorTags,
-)
-
-from .game_state_manager import GameStateManager
-
-
-class GameController:
- logger: Optional[logging.Logger]
-
- game_state_manager: GameStateManager
-
- received_items: Set[ZorkGrandInquisitorItems]
- completed_locations: Set[ZorkGrandInquisitorLocations]
-
- completed_locations_queue: collections.deque
- received_items_queue: collections.deque
-
- all_hotspot_items: Set[ZorkGrandInquisitorItems]
-
- game_id_to_items: Dict[int, ZorkGrandInquisitorItems]
-
- possible_inventory_items: Set[ZorkGrandInquisitorItems]
-
- available_inventory_slots: Set[int]
-
- goal_completed: bool
-
- option_goal: Optional[ZorkGrandInquisitorGoals]
- option_deathsanity: Optional[bool]
- option_grant_missable_location_checks: Optional[bool]
-
- def __init__(self, logger=None) -> None:
- self.logger = logger
-
- self.game_state_manager = GameStateManager()
-
- self.received_items = set()
- self.completed_locations = set()
-
- self.completed_locations_queue = collections.deque()
- self.received_items_queue = collections.deque()
-
- self.all_hotspot_items = (
- items_with_tag(ZorkGrandInquisitorTags.HOTSPOT)
- | items_with_tag(ZorkGrandInquisitorTags.SUBWAY_DESTINATION)
- | items_with_tag(ZorkGrandInquisitorTags.TOTEMIZER_DESTINATION)
- )
-
- self.game_id_to_items = game_id_to_items()
-
- self.possible_inventory_items = (
- items_with_tag(ZorkGrandInquisitorTags.INVENTORY_ITEM)
- | items_with_tag(ZorkGrandInquisitorTags.SPELL)
- | items_with_tag(ZorkGrandInquisitorTags.TOTEM)
- )
-
- self.available_inventory_slots = set()
-
- self.goal_completed = False
-
- self.option_goal = None
- self.option_deathsanity = None
- self.option_grant_missable_location_checks = None
-
- @functools.cached_property
- def brog_items(self) -> Set[ZorkGrandInquisitorItems]:
- return {
- ZorkGrandInquisitorItems.BROGS_BICKERING_TORCH,
- ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH,
- ZorkGrandInquisitorItems.BROGS_GRUE_EGG,
- ZorkGrandInquisitorItems.BROGS_PLANK,
- }
-
- @functools.cached_property
- def griff_items(self) -> Set[ZorkGrandInquisitorItems]:
- return {
- ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP,
- ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH,
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT,
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN,
- }
-
- @functools.cached_property
- def lucy_items(self) -> Set[ZorkGrandInquisitorItems]:
- return {
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4,
- }
-
- @property
- def totem_items(self) -> Set[ZorkGrandInquisitorItems]:
- return self.brog_items | self.griff_items | self.lucy_items
-
- @functools.cached_property
- def missable_locations(self) -> Set[ZorkGrandInquisitorLocations]:
- return locations_with_tag(ZorkGrandInquisitorTags.MISSABLE)
-
- def log(self, message) -> None:
- if self.logger:
- self.logger.info(message)
-
- def log_debug(self, message) -> None:
- if self.logger:
- self.logger.debug(message)
-
- def open_process_handle(self) -> bool:
- return self.game_state_manager.open_process_handle()
-
- def close_process_handle(self) -> bool:
- return self.game_state_manager.close_process_handle()
-
- def is_process_running(self) -> bool:
- return self.game_state_manager.is_process_running
-
- def list_received_brog_items(self) -> None:
- self.log("Received Brog Items:")
-
- self._process_received_items()
- received_brog_items: Set[ZorkGrandInquisitorItems] = self.received_items & self.brog_items
-
- if not len(received_brog_items):
- self.log(" Nothing")
- return
-
- for item in sorted(i.value for i in received_brog_items):
- self.log(f" {item}")
-
- def list_received_griff_items(self) -> None:
- self.log("Received Griff Items:")
-
- self._process_received_items()
- received_griff_items: Set[ZorkGrandInquisitorItems] = self.received_items & self.griff_items
-
- if not len(received_griff_items):
- self.log(" Nothing")
- return
-
- for item in sorted(i.value for i in received_griff_items):
- self.log(f" {item}")
-
- def list_received_lucy_items(self) -> None:
- self.log("Received Lucy Items:")
-
- self._process_received_items()
- received_lucy_items: Set[ZorkGrandInquisitorItems] = self.received_items & self.lucy_items
-
- if not len(received_lucy_items):
- self.log(" Nothing")
- return
-
- for item in sorted(i.value for i in received_lucy_items):
- self.log(f" {item}")
-
- def list_received_hotspots(self) -> None:
- self.log("Received Hotspots:")
-
- self._process_received_items()
-
- hotspot_items: Set[ZorkGrandInquisitorItems] = items_with_tag(ZorkGrandInquisitorTags.HOTSPOT)
- received_hotspots: Set[ZorkGrandInquisitorItems] = self.received_items & hotspot_items
-
- if not len(received_hotspots):
- self.log(" Nothing")
- return
-
- for item in sorted(i.value for i in received_hotspots):
- self.log(f" {item}")
-
- def update(self) -> None:
- if self.game_state_manager.is_process_still_running():
- try:
- self.game_state_manager.refresh_game_location()
-
- self._apply_permanent_game_state()
- self._apply_conditional_game_state()
-
- self._apply_permanent_game_flags()
-
- self._check_for_completed_locations()
-
- if self.option_grant_missable_location_checks:
- self._check_for_missable_locations_to_grant()
-
- self._process_received_items()
-
- self._manage_hotspots()
- self._manage_items()
-
- self._apply_conditional_teleports()
-
- self._check_for_victory()
- except Exception as e:
- self.log_debug(e)
-
- 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(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
- self._write_game_state_value_for(12935, 1) # Griff Totem Taken
- self._write_game_state_value_for(12948, 1) # ZIMDOR Scroll Taken
- self._write_game_state_value_for(4058, 1) # Shovel Taken
- self._write_game_state_value_for(4059, 1) # THROCK Scroll Taken
- self._write_game_state_value_for(11758, 1) # KENDALL Scroll Taken
- self._write_game_state_value_for(16959, 1) # Old Scratch Card Taken
- self._write_game_state_value_for(12840, 0) # Zork Rocks in Perma-Suck Machine
- self._write_game_state_value_for(11886, 1) # Student ID Taken
- self._write_game_state_value_for(16279, 1) # Prozork Tablet Taken
- self._write_game_state_value_for(13260, 1) # GOLGATEM Scroll Taken
- self._write_game_state_value_for(4834, 1) # Flatheadia Fudge Taken
- self._write_game_state_value_for(4746, 1) # Jar of Hotbugs Taken
- self._write_game_state_value_for(4755, 1) # Hungus Lard Taken
- self._write_game_state_value_for(4758, 1) # Mug Taken
- self._write_game_state_value_for(3716, 1) # NARWILE Scroll Taken
- self._write_game_state_value_for(17147, 1) # Lucy Totem Taken
- self._write_game_state_value_for(9818, 1) # Middle Telegraph Hammer Taken
- self._write_game_state_value_for(3766, 0) # ANS Scroll in Window
- self._write_game_state_value_for(4980, 0) # ANS Scroll in Window
- self._write_game_state_value_for(3768, 0) # GIV Scroll in Window
- self._write_game_state_value_for(4978, 0) # GIV Scroll in Window
- self._write_game_state_value_for(3765, 0) # SNA Scroll in Window
- self._write_game_state_value_for(4979, 0) # SNA Scroll in Window
- self._write_game_state_value_for(3767, 0) # VIG Scroll in Window
- self._write_game_state_value_for(4977, 0) # VIG Scroll in Window
- self._write_game_state_value_for(15065, 1) # Brog's Bickering Torch Taken
- self._write_game_state_value_for(15088, 1) # Brog's Flickering Torch Taken
- self._write_game_state_value_for(2628, 4) # Brog's Grue Eggs Taken
- self._write_game_state_value_for(2971, 1) # Brog's Plank Taken
- self._write_game_state_value_for(1340, 1) # Griff's Inflatable Sea Captain Taken
- self._write_game_state_value_for(1341, 1) # Griff's Inflatable Raft Taken
- self._write_game_state_value_for(1477, 1) # Griff's Air Pump Taken
- self._write_game_state_value_for(1814, 1) # Griff's Dragon Tooth Taken
- self._write_game_state_value_for(15403, 0) # Lucy's Cards Taken
- self._write_game_state_value_for(15404, 1) # Lucy's Cards Taken
- self._write_game_state_value_for(15405, 4) # Lucy's Cards Taken
- self._write_game_state_value_for(5222, 1) # User Has Spell Book
- self._write_game_state_value_for(13930, 1) # Skip Well Cutscenes
- self._write_game_state_value_for(19057, 1) # Skip Well Cutscenes
- 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(8620, 1) # First Coin Paid to Charon
- self._write_game_state_value_for(8731, 1) # First Coin Paid to Charon
-
- def _apply_conditional_game_state(self):
- # Can teleport to Dungeon Master's Lair
- 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
-
- if should_force_initial_totemizer_destination:
- self._write_game_state_value_for(9617, 2)
-
- # Pouch of Zorkmids
- if self._player_has(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS):
- self._write_game_state_value_for(5827, 1)
- else:
- self._write_game_state_value_for(5827, 0)
-
- # Brog Torches
- if self._player_is_brog() and self._player_has(ZorkGrandInquisitorItems.BROGS_BICKERING_TORCH):
- self._write_game_state_value_for(10999, 1)
- else:
- self._write_game_state_value_for(10999, 0)
-
- if self._player_is_brog() and self._player_has(ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH):
- self._write_game_state_value_for(10998, 1)
- 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(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(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
-
- def _check_for_completed_locations(self) -> None:
- location: ZorkGrandInquisitorLocations
- data: ZorkGrandInquisitorLocationData
- for location, data in location_data.items():
- if location in self.completed_locations or not isinstance(
- location, ZorkGrandInquisitorLocations
- ):
- continue
-
- is_location_completed: bool = True
-
- trigger: [Union[str, int]]
- value: Union[str, int, Tuple[int, ...]]
- for trigger, value in data.game_state_trigger:
- if trigger == "location":
- if not self._player_is_at(value):
- is_location_completed = False
- break
- elif isinstance(trigger, int):
- if isinstance(value, int):
- if self._read_game_state_value_for(trigger) != value:
- is_location_completed = False
- break
- elif isinstance(value, tuple):
- if self._read_game_state_value_for(trigger) not in value:
- is_location_completed = False
- break
- else:
- is_location_completed = False
- break
- else:
- is_location_completed = False
- break
-
- if is_location_completed:
- self.completed_locations.add(location)
- self.completed_locations_queue.append(location)
-
- def _check_for_missable_locations_to_grant(self) -> None:
- missable_location: ZorkGrandInquisitorLocations
- for missable_location in self.missable_locations:
- if missable_location in self.completed_locations:
- continue
-
- data: ZorkGrandInquisitorLocationData = location_data[missable_location]
-
- if ZorkGrandInquisitorTags.DEATHSANITY in data.tags and not self.option_deathsanity:
- continue
-
- condition_data: ZorkGrandInquisitorMissableLocationGrantConditionsData = (
- missable_location_grant_conditions_data.get(missable_location)
- )
-
- if condition_data is None:
- self.log_debug(f"Missable Location {missable_location.value} has no grant conditions")
- continue
-
- if condition_data.location_condition in self.completed_locations:
- grant_location: bool = True
-
- item: ZorkGrandInquisitorItems
- for item in condition_data.item_conditions or tuple():
- if self._player_doesnt_have(item):
- grant_location = False
- break
-
- if grant_location:
- self.completed_locations_queue.append(missable_location)
-
- def _process_received_items(self) -> None:
- while len(self.received_items_queue) > 0:
- item: ZorkGrandInquisitorItems = self.received_items_queue.popleft()
- data: ZorkGrandInquisitorItemData = item_data[item]
-
- if ZorkGrandInquisitorTags.FILLER in data.tags:
- continue
-
- self.received_items.add(item)
-
- def _manage_hotspots(self) -> None:
- hotspot_item: ZorkGrandInquisitorItems
- for hotspot_item in self.all_hotspot_items:
- data: ZorkGrandInquisitorItemData = item_data[hotspot_item]
-
- if hotspot_item not in self.received_items:
- key: int
- for key in data.statemap_keys:
- self._write_game_flags_value_for(key, 2)
- else:
- if hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_666_MAILBOX:
- if self.game_state_manager.game_location == "hp5g":
- if self._read_game_state_value_for(9113) == 0:
- self._write_game_flags_value_for(9116, 0)
- else:
- self._write_game_flags_value_for(9116, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS:
- if self.game_state_manager.game_location == "qb2g":
- if self._read_game_state_value_for(15433) == 0:
- self._write_game_flags_value_for(15434, 0)
- else:
- self._write_game_flags_value_for(15434, 2)
-
- if self._read_game_state_value_for(15435) == 0:
- self._write_game_flags_value_for(15436, 0)
- else:
- self._write_game_flags_value_for(15436, 2)
-
- if self._read_game_state_value_for(15437) == 0:
- self._write_game_flags_value_for(15438, 0)
- else:
- self._write_game_flags_value_for(15438, 2)
-
- if self._read_game_state_value_for(15439) == 0:
- self._write_game_flags_value_for(15440, 0)
- else:
- self._write_game_flags_value_for(15440, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX:
- if self.game_state_manager.game_location == "tp2g":
- if self._read_game_state_value_for(12095) == 1:
- self._write_game_flags_value_for(9115, 2)
- else:
- self._write_game_flags_value_for(9115, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_BLINDS:
- if self.game_state_manager.game_location == "dv1e":
- if self._read_game_state_value_for(4743) == 0:
- self._write_game_flags_value_for(4799, 0)
- else:
- self._write_game_flags_value_for(4799, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS:
- if self.game_state_manager.game_location == "tr5g":
- key: int
- for key in data.statemap_keys:
- self._write_game_flags_value_for(key, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT:
- if self.game_state_manager.game_location == "tr5g":
- self._write_game_flags_value_for(12702, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_VACUUM_SLOT:
- if self.game_state_manager.game_location == "tr5m":
- self._write_game_flags_value_for(12909, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CHANGE_MACHINE_SLOT:
- if self.game_state_manager.game_location == "tr5j":
- if self._read_game_state_value_for(12892) == 0:
- self._write_game_flags_value_for(12900, 0)
- else:
- self._write_game_flags_value_for(12900, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR:
- if self.game_state_manager.game_location == "dw1e":
- if self._read_game_state_value_for(4983) == 0:
- self._write_game_flags_value_for(5010, 0)
- else:
- self._write_game_flags_value_for(5010, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT:
- if self.game_state_manager.game_location == "me2j":
- if self._read_game_state_value_for(9491) == 2:
- self._write_game_flags_value_for(9539, 0)
- else:
- self._write_game_flags_value_for(9539, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER:
- if self.game_state_manager.game_location == "me2j":
- if self._read_game_state_value_for(9546) == 2 or self._read_game_state_value_for(9419) == 1:
- self._write_game_flags_value_for(19712, 2)
- else:
- self._write_game_flags_value_for(19712, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT:
- if self.game_state_manager.game_location == "sg1f":
- self._write_game_flags_value_for(2586, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DENTED_LOCKER:
- if self.game_state_manager.game_location == "th3j":
- five_is_open: bool = self._read_game_state_value_for(11847) == 1
- six_is_open: bool = self._read_game_state_value_for(11840) == 1
- seven_is_open: bool = self._read_game_state_value_for(11841) == 1
- eight_is_open: bool = self._read_game_state_value_for(11848) == 1
-
- rocks_in_six: bool = self._read_game_state_value_for(11769) == 1
- six_blasted: bool = self._read_game_state_value_for(11770) == 1
-
- if five_is_open or six_is_open or seven_is_open or eight_is_open or rocks_in_six or six_blasted:
- self._write_game_flags_value_for(11878, 2)
- else:
- self._write_game_flags_value_for(11878, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND:
- if self.game_state_manager.game_location == "te5e":
- if self._read_game_state_value_for(11747) == 0:
- self._write_game_flags_value_for(11751, 0)
- else:
- self._write_game_flags_value_for(11751, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH:
- if self.game_state_manager.game_location == "pe2e":
- self._write_game_flags_value_for(15147, 0)
- self._write_game_flags_value_for(15153, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW:
- if self.game_state_manager.game_location == "cd70":
- self._write_game_flags_value_for(1705, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS:
- if self.game_state_manager.game_location == "cd3h":
- raft_in_left: bool = self._read_game_state_value_for(1301) == 1
- raft_in_right: bool = self._read_game_state_value_for(1304) == 1
- raft_inflated: bool = self._read_game_state_value_for(1379) == 1
-
- captain_in_left: bool = self._read_game_state_value_for(1374) == 1
- captain_in_right: bool = self._read_game_state_value_for(1381) == 1
- captain_inflated: bool = self._read_game_state_value_for(1378) == 1
-
- left_inflated: bool = (raft_in_left and raft_inflated) or (captain_in_left and captain_inflated)
-
- right_inflated: bool = (raft_in_right and raft_inflated) or (
- captain_in_right and captain_inflated
- )
-
- if left_inflated:
- self._write_game_flags_value_for(1425, 2)
- else:
- self._write_game_flags_value_for(1425, 0)
-
- if right_inflated:
- self._write_game_flags_value_for(1426, 2)
- else:
- self._write_game_flags_value_for(1426, 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:
- self._write_game_flags_value_for(13106, 0)
- else:
- self._write_game_flags_value_for(13106, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS:
- if self.game_state_manager.game_location == "ue1e":
- if self._read_game_state_value_for(14318) == 0:
- self._write_game_flags_value_for(13219, 0)
- self._write_game_flags_value_for(13220, 0)
- self._write_game_flags_value_for(13221, 0)
- self._write_game_flags_value_for(13222, 0)
- else:
- self._write_game_flags_value_for(13219, 2)
- self._write_game_flags_value_for(13220, 2)
- self._write_game_flags_value_for(13221, 2)
- self._write_game_flags_value_for(13222, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS:
- if self.game_state_manager.game_location == "ue1e":
- if self._read_game_state_value_for(14318) == 0:
- self._write_game_flags_value_for(14327, 0)
- self._write_game_flags_value_for(14332, 0)
- self._write_game_flags_value_for(14337, 0)
- self._write_game_flags_value_for(14342, 0)
- else:
- self._write_game_flags_value_for(14327, 2)
- self._write_game_flags_value_for(14332, 2)
- self._write_game_flags_value_for(14337, 2)
- self._write_game_flags_value_for(14342, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT:
- if self.game_state_manager.game_location == "tr5e":
- self._write_game_flags_value_for(12528, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS:
- if self.game_state_manager.game_location == "tr5e":
- if self._read_game_state_value_for(12220) == 0:
- self._write_game_flags_value_for(12523, 2)
- self._write_game_flags_value_for(12524, 2)
- self._write_game_flags_value_for(12525, 2)
- else:
- self._write_game_flags_value_for(12523, 0)
- self._write_game_flags_value_for(12524, 0)
- self._write_game_flags_value_for(12525, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE:
- if self.game_state_manager.game_location == "uc1g":
- if self._read_game_state_value_for(12931) == 1 or self._read_game_state_value_for(12929) == 1:
- self._write_game_flags_value_for(13002, 2)
- else:
- self._write_game_flags_value_for(13002, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL:
- if self.game_state_manager.game_location == "pe5e":
- if self._read_game_state_value_for(10277) == 0:
- self._write_game_flags_value_for(10726, 0)
- else:
- self._write_game_flags_value_for(10726, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR:
- if self.game_state_manager.game_location == "tr1k":
- if self._read_game_state_value_for(12212) == 0:
- self._write_game_flags_value_for(12280, 0)
- else:
- self._write_game_flags_value_for(12280, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_GRASS:
- if self.game_state_manager.game_location in ("te10", "te1g", "te20", "te30", "te40"):
- key: int
- for key in data.statemap_keys:
- self._write_game_flags_value_for(key, 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:
- key: int
- for key in data.statemap_keys:
- self._write_game_flags_value_for(key, 0)
- else:
- key: int
- for key in data.statemap_keys:
- self._write_game_flags_value_for(key, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER:
- if self.game_state_manager.game_location == "hp1e":
- if self._read_game_state_value_for(8431) == 1:
- self._write_game_flags_value_for(8446, 2)
- else:
- self._write_game_flags_value_for(8446, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_HARRY:
- if self.game_state_manager.game_location == "dg4e":
- if self._read_game_state_value_for(4237) == 1 and self._read_game_state_value_for(4034) == 1:
- self._write_game_flags_value_for(4260, 2)
- else:
- self._write_game_flags_value_for(4260, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY:
- if self.game_state_manager.game_location == "dg4h":
- if self._read_game_state_value_for(4279) == 1:
- self._write_game_flags_value_for(18026, 2)
- else:
- self._write_game_flags_value_for(18026, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH:
- if self.game_state_manager.game_location == "dg4g":
- if self._read_game_state_value_for(4034) == 1:
- self._write_game_flags_value_for(17623, 2)
- else:
- self._write_game_flags_value_for(17623, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR:
- if self.game_state_manager.game_location == "uc4e":
- if self._read_game_state_value_for(13062) == 1:
- self._write_game_flags_value_for(13140, 2)
- else:
- self._write_game_flags_value_for(13140, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR:
- if self.game_state_manager.game_location == "pe1e":
- if self._read_game_state_value_for(10451) == 1:
- self._write_game_flags_value_for(10441, 2)
- else:
- self._write_game_flags_value_for(10441, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS:
- if self.game_state_manager.game_location == "pe2j":
- self._write_game_flags_value_for(19632, 0)
- self._write_game_flags_value_for(19627, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR:
- if self.game_state_manager.game_location == "sw4e":
- if self._read_game_state_value_for(2989) == 1:
- self._write_game_flags_value_for(3025, 2)
- else:
- self._write_game_flags_value_for(3025, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG:
- if self.game_state_manager.game_location == "sw4e":
- self._write_game_flags_value_for(3036, 0)
- 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:
- self._write_game_flags_value_for(13390, 0)
- else:
- self._write_game_flags_value_for(13390, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR:
- if self.game_state_manager.game_location == "qe1e":
- if self._player_is_brog():
- self._write_game_flags_value_for(2447, 0)
- elif self._player_is_griff():
- self._write_game_flags_value_for(2455, 0)
- elif self._player_is_lucy():
- if self._read_game_state_value_for(2457) == 0:
- self._write_game_flags_value_for(2455, 0)
- else:
- self._write_game_flags_value_for(2455, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS:
- if self.game_state_manager.game_location == "tr3h":
- if self._read_game_state_value_for(11777) == 1:
- self._write_game_flags_value_for(12389, 2)
- else:
- self._write_game_flags_value_for(12389, 0)
-
- self._write_game_state_value_for(12390, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE:
- if self.game_state_manager.game_location == "dg4f":
- if self._read_game_state_value_for(4241) == 1:
- self._write_game_flags_value_for(4302, 2)
- else:
- self._write_game_flags_value_for(4302, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE:
- if self.game_state_manager.game_location == "tp1e":
- if self._read_game_state_value_for(16342) == 1:
- self._write_game_flags_value_for(16383, 2)
- self._write_game_flags_value_for(16384, 2)
- else:
- self._write_game_flags_value_for(16383, 0)
- self._write_game_flags_value_for(16384, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE:
- if self.game_state_manager.game_location == "sg6e":
- if self._read_game_state_value_for(15715) == 1:
- self._write_game_flags_value_for(2769, 2)
- else:
- self._write_game_flags_value_for(2769, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON:
- if self.game_state_manager.game_location == "dg2f":
- if self._read_game_state_value_for(4114) == 1 or self._read_game_state_value_for(4115) == 1:
- self._write_game_flags_value_for(4149, 2)
- else:
- self._write_game_flags_value_for(4149, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS:
- if self.game_state_manager.game_location == "tr5f":
- self._write_game_flags_value_for(12584, 0)
- self._write_game_flags_value_for(12585, 0)
- self._write_game_flags_value_for(12586, 0)
- self._write_game_flags_value_for(12587, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT:
- if self.game_state_manager.game_location == "tr5f":
- self._write_game_flags_value_for(12574, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT:
- if self.game_state_manager.game_location == "ue2j":
- if self._read_game_state_value_for(13408) == 1:
- self._write_game_flags_value_for(13412, 2)
- else:
- self._write_game_flags_value_for(13412, 0)
- 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_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:
- self._write_game_flags_value_for(16382, 0)
- else:
- self._write_game_flags_value_for(16382, 2)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM:
- if self.game_state_manager.game_location == "dg3e":
- self._write_game_flags_value_for(4209, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE:
- if self.game_state_manager.game_location == "th3r":
- self._write_game_flags_value_for(11973, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT:
- if self.game_state_manager.game_location == "uc6e":
- self._write_game_flags_value_for(13168, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY:
- if self.game_state_manager.game_location == "qb2e":
- if self._read_game_state_value_for(15395) == 1:
- self._write_game_flags_value_for(15396, 2)
- else:
- self._write_game_flags_value_for(15396, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH:
- if self.game_state_manager.game_location == "mt2e":
- self._write_game_flags_value_for(9706, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS:
- if self.game_state_manager.game_location == "mt2g":
- 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_FLOOD_CONTROL_DAM:
- if self.game_state_manager.game_location == "us2e":
- self._write_game_flags_value_for(13757, 0)
- elif self.game_state_manager.game_location == "ue2e":
- self._write_game_flags_value_for(13297, 0)
- elif self.game_state_manager.game_location == "uh2e":
- self._write_game_flags_value_for(13486, 0)
- elif self.game_state_manager.game_location == "um2e":
- self._write_game_flags_value_for(13625, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES:
- if self.game_state_manager.game_location == "us2e":
- self._write_game_flags_value_for(13758, 0)
- elif self.game_state_manager.game_location == "ue2e":
- self._write_game_flags_value_for(13309, 0)
- elif self.game_state_manager.game_location == "uh2e":
- self._write_game_flags_value_for(13498, 0)
- elif self.game_state_manager.game_location == "um2e":
- self._write_game_flags_value_for(13637, 0)
- elif hotspot_item == ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY:
- if self.game_state_manager.game_location == "us2e":
- self._write_game_flags_value_for(13759, 0)
- elif self.game_state_manager.game_location == "ue2e":
- self._write_game_flags_value_for(13316, 0)
- elif self.game_state_manager.game_location == "uh2e":
- self._write_game_flags_value_for(13505, 0)
- elif self.game_state_manager.game_location == "um2e":
- self._write_game_flags_value_for(13644, 0)
- 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_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():
- self.available_inventory_slots = self._determine_available_inventory_slots()
-
- received_inventory_items: Set[ZorkGrandInquisitorItems]
- received_inventory_items = self.received_items & self.possible_inventory_items
-
- received_inventory_items = self._filter_received_inventory_items(received_inventory_items)
- elif self._player_is_totem():
- self.available_inventory_slots = self._determine_available_inventory_slots(is_totem=True)
-
- received_inventory_items: Set[ZorkGrandInquisitorItems]
-
- if self._player_is_brog():
- received_inventory_items = self.received_items & self.brog_items
- received_inventory_items = self._filter_received_brog_inventory_items(received_inventory_items)
- elif self._player_is_griff():
- received_inventory_items = self.received_items & self.griff_items
- received_inventory_items = self._filter_received_griff_inventory_items(received_inventory_items)
- elif self._player_is_lucy():
- received_inventory_items = self.received_items & self.lucy_items
- received_inventory_items = self._filter_received_lucy_inventory_items(received_inventory_items)
- else:
- return None
- else:
- return None
-
- game_state_inventory_items: Set[ZorkGrandInquisitorItems] = self._determine_game_state_inventory()
-
- inventory_items_to_remove: Set[ZorkGrandInquisitorItems]
- inventory_items_to_remove = game_state_inventory_items - received_inventory_items
-
- inventory_items_to_add: Set[ZorkGrandInquisitorItems]
- inventory_items_to_add = received_inventory_items - game_state_inventory_items
-
- item: ZorkGrandInquisitorItems
- for item in inventory_items_to_remove:
- self._remove_from_inventory(item)
-
- item: ZorkGrandInquisitorItems
- for item in inventory_items_to_add:
- self._add_to_inventory(item)
-
- # Item Deduplication (Just in Case)
- seen_items: Set[int] = set()
-
- i: int
- for i in range(151, 171):
- item: int = self._read_game_state_value_for(i)
-
- if item in seen_items:
- self._write_game_state_value_for(i, 0)
- else:
- seen_items.add(item)
-
- def _apply_conditional_teleports(self) -> None:
- 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)
-
- 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)
-
- if self._read_game_state_value_for(9) == 224:
- self._write_game_state_value_for(9, 0)
- self.game_state_manager.set_game_location("uc10", 1200)
-
- def _check_for_victory(self) -> None:
- if self.option_goal == ZorkGrandInquisitorGoals.THREE_ARTIFACTS:
- coconut_is_placed = self._read_game_state_value_for(2200) == 1
- cube_is_placed = self._read_game_state_value_for(2322) == 1
- skull_is_placed = self._read_game_state_value_for(2321) == 1
-
- self.goal_completed = coconut_is_placed and cube_is_placed and skull_is_placed
-
- def _determine_game_state_inventory(self) -> Set[ZorkGrandInquisitorItems]:
- game_state_inventory: Set[ZorkGrandInquisitorItems] = set()
-
- # Item on Cursor
- item_on_cursor: int = self._read_game_state_value_for(9)
-
- if item_on_cursor != 0:
- if item_on_cursor in self.game_id_to_items:
- game_state_inventory.add(self.game_id_to_items[item_on_cursor])
-
- # Item in Inspector
- item_in_inspector: int = self._read_game_state_value_for(4512)
-
- if item_in_inspector != 0:
- if item_in_inspector in self.game_id_to_items:
- game_state_inventory.add(self.game_id_to_items[item_in_inspector])
-
- # Items in Inventory Slots
- i: int
- for i in range(151, 171):
- if self._read_game_state_value_for(i) != 0:
- if self._read_game_state_value_for(i) in self.game_id_to_items:
- game_state_inventory.add(
- self.game_id_to_items[self._read_game_state_value_for(i)]
- )
-
- # Pouch of Zorkmids
- if self._read_game_state_value_for(5827) == 1:
- game_state_inventory.add(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS)
-
- # Spells
- i: int
- for i in range(191, 203):
- if self._read_game_state_value_for(i) == 1:
- if i in self.game_id_to_items:
- game_state_inventory.add(self.game_id_to_items[i])
-
- # Totems
- if self._read_game_state_value_for(4853) == 1:
- game_state_inventory.add(ZorkGrandInquisitorItems.TOTEM_BROG)
-
- if self._read_game_state_value_for(4315) == 1:
- game_state_inventory.add(ZorkGrandInquisitorItems.TOTEM_GRIFF)
-
- if self._read_game_state_value_for(5223) == 1:
- game_state_inventory.add(ZorkGrandInquisitorItems.TOTEM_LUCY)
-
- 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 ZorkGrandInquisitorTags.INVENTORY_ITEM in data.tags:
- if len(self.available_inventory_slots): # Inventory slot overflow protection
- inventory_slot: int = self.available_inventory_slots.pop()
- self._write_game_state_value_for(inventory_slot, data.statemap_keys[0])
- elif ZorkGrandInquisitorTags.SPELL in data.tags:
- self._write_game_state_value_for(data.statemap_keys[0], 1)
- elif ZorkGrandInquisitorTags.TOTEM in data.tags:
- 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 ZorkGrandInquisitorTags.INVENTORY_ITEM in data.tags:
- inventory_slot: Optional[int] = self._inventory_slot_for(item)
-
- if inventory_slot is None:
- return None
-
- self._write_game_state_value_for(inventory_slot, 0)
-
- if inventory_slot != 9:
- self.available_inventory_slots.add(inventory_slot)
- elif ZorkGrandInquisitorTags.SPELL in data.tags:
- self._write_game_state_value_for(data.statemap_keys[0], 0)
- elif ZorkGrandInquisitorTags.TOTEM in data.tags:
- self._write_game_state_value_for(data.statemap_keys[0], 0)
-
- def _determine_available_inventory_slots(self, is_totem: bool = False) -> Set[int]:
- available_inventory_slots: Set[int] = set()
-
- inventory_slot_range_end: int = 171
-
- if is_totem:
- if self._player_is_brog():
- inventory_slot_range_end = 161
- elif self._player_is_griff():
- inventory_slot_range_end = 160
- elif self._player_is_lucy():
- inventory_slot_range_end = 157
-
- i: int
- for i in range(151, inventory_slot_range_end):
- if self._read_game_state_value_for(i) == 0:
- available_inventory_slots.add(i)
-
- return available_inventory_slots
-
- def _inventory_slot_for(self, item) -> Optional[int]:
- data: ZorkGrandInquisitorItemData = item_data[item]
-
- if ZorkGrandInquisitorTags.INVENTORY_ITEM in data.tags:
- i: int
- for i in range(151, 171):
- if self._read_game_state_value_for(i) == data.statemap_keys[0]:
- return i
-
- if self._read_game_state_value_for(9) == data.statemap_keys[0]:
- return 9
-
- if self._read_game_state_value_for(4512) == data.statemap_keys[0]:
- return 4512
-
- return None
-
- def _filter_received_inventory_items(
- self, received_inventory_items: Set[ZorkGrandInquisitorItems]
- ) -> Set[ZorkGrandInquisitorItems]:
- to_filter_inventory_items: Set[ZorkGrandInquisitorItems] = self.totem_items
-
- inventory_item_values: Set[int] = set()
-
- i: int
- for i in range(151, 171):
- inventory_item_values.add(self._read_game_state_value_for(i))
-
- cursor_item_value: int = self._read_game_state_value_for(9)
- inspector_item_value: int = self._read_game_state_value_for(4512)
-
- inventory_item_values.add(cursor_item_value)
- inventory_item_values.add(inspector_item_value)
-
- 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 self._read_game_state_value_for(4870) == 1:
- to_filter_inventory_items.add(item)
- elif (
- self._read_game_state_value_for(4244) == 1
- 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)
- elif item == ZorkGrandInquisitorItems.MAP:
- if self._read_game_state_value_for(16618) == 1:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.MEAD_LIGHT:
- if 105 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(17620) > 0:
- 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)
- elif self._read_game_state_value_for(12892) == 1:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.PERMA_SUCK_MACHINE:
- if self._read_game_state_value_for(12218) == 1:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER:
- if self._read_game_state_value_for(15150) == 3:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(10421) == 1:
- to_filter_inventory_items.add(item)
- 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:
- 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:
- 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:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.SNAPDRAGON:
- if self._read_game_state_value_for(4199) == 1:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.STUDENT_ID:
- if self._read_game_state_value_for(11838) == 1:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.SUBWAY_TOKEN:
- if self._read_game_state_value_for(13167) == 1:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.SWORD:
- if 22 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif 100 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif 111 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.ZIMDOR_SCROLL:
- if 105 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(17620) == 3:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(4034) == 1:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.ZORK_ROCKS:
- if self._read_game_state_value_for(12486) == 1:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(12487) == 1:
- to_filter_inventory_items.add(item)
- elif 52 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(11769) == 1:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(11840) == 1:
- to_filter_inventory_items.add(item)
-
- return received_inventory_items - to_filter_inventory_items
-
- def _filter_received_brog_inventory_items(
- self, received_inventory_items: Set[ZorkGrandInquisitorItems]
- ) -> Set[ZorkGrandInquisitorItems]:
- to_filter_inventory_items: Set[ZorkGrandInquisitorItems] = set()
-
- inventory_item_values: Set[int] = set()
-
- i: int
- for i in range(151, 161):
- inventory_item_values.add(self._read_game_state_value_for(i))
-
- cursor_item_value: int = self._read_game_state_value_for(9)
- inspector_item_value: int = self._read_game_state_value_for(2194)
-
- inventory_item_values.add(cursor_item_value)
- inventory_item_values.add(inspector_item_value)
-
- item: ZorkGrandInquisitorItems
- for item in received_inventory_items:
- if item == ZorkGrandInquisitorItems.BROGS_BICKERING_TORCH:
- if 103 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH:
- if 104 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.BROGS_GRUE_EGG:
- if self._read_game_state_value_for(2577) == 1:
- to_filter_inventory_items.add(item)
- elif 71 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(2641) == 1:
- to_filter_inventory_items.add(item)
-
- return received_inventory_items - to_filter_inventory_items
-
- def _filter_received_griff_inventory_items(
- self, received_inventory_items: Set[ZorkGrandInquisitorItems]
- ) -> Set[ZorkGrandInquisitorItems]:
- to_filter_inventory_items: Set[ZorkGrandInquisitorItems] = set()
-
- inventory_item_values: Set[int] = set()
-
- i: int
- for i in range(151, 160):
- inventory_item_values.add(self._read_game_state_value_for(i))
-
- cursor_item_value: int = self._read_game_state_value_for(9)
- inspector_item_value: int = self._read_game_state_value_for(4512)
-
- inventory_item_values.add(cursor_item_value)
- inventory_item_values.add(inspector_item_value)
-
- item: ZorkGrandInquisitorItems
- for item in received_inventory_items:
- if item == ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT:
- if self._read_game_state_value_for(1301) == 1:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(1304) == 1:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(16562) == 1:
- to_filter_inventory_items.add(item)
- if item == ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN:
- if self._read_game_state_value_for(1374) == 1:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(1381) == 1:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(16562) == 1:
- to_filter_inventory_items.add(item)
-
- return received_inventory_items - to_filter_inventory_items
-
- def _filter_received_lucy_inventory_items(
- self, received_inventory_items: Set[ZorkGrandInquisitorItems]
- ) -> Set[ZorkGrandInquisitorItems]:
- to_filter_inventory_items: Set[ZorkGrandInquisitorItems] = set()
-
- inventory_item_values: Set[int] = set()
-
- i: int
- for i in range(151, 157):
- inventory_item_values.add(self._read_game_state_value_for(i))
-
- cursor_item_value: int = self._read_game_state_value_for(9)
- inspector_item_value: int = self._read_game_state_value_for(2198)
-
- inventory_item_values.add(cursor_item_value)
- inventory_item_values.add(inspector_item_value)
-
- item: ZorkGrandInquisitorItems
- for item in received_inventory_items:
- if item == ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1:
- if 120 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15433) == 1:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15435) == 1:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15437) == 1:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15439) == 1:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15472) == 1:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2:
- if 121 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15433) == 2:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15435) == 2:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15437) == 2:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15439) == 2:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15472) == 1:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3:
- if 122 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15433) == 3:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15435) == 3:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15437) == 3:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15439) == 3:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15472) == 1:
- to_filter_inventory_items.add(item)
- elif item == ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4:
- if 123 in inventory_item_values:
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15433) in (4, 5):
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15435) in (4, 5):
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15437) in (4, 5):
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15439) in (4, 5):
- to_filter_inventory_items.add(item)
- elif self._read_game_state_value_for(15472) == 1:
- to_filter_inventory_items.add(item)
-
- return received_inventory_items - to_filter_inventory_items
-
- def _read_game_state_value_for(self, key: int) -> Optional[int]:
- try:
- return self.game_state_manager.read_game_state_value_for(key)
- except Exception as e:
- self.log_debug(f"Exception: {e} while trying to read game state key '{key}'")
- raise e
-
- def _write_game_state_value_for(self, key: int, value: int) -> Optional[bool]:
- try:
- return self.game_state_manager.write_game_state_value_for(key, value)
- except Exception as e:
- self.log_debug(f"Exception: {e} while trying to write '{key} = {value}' to game state")
- raise e
-
- def _read_game_flags_value_for(self, key: int) -> Optional[int]:
- try:
- return self.game_state_manager.read_game_flags_value_for(key)
- except Exception as e:
- self.log_debug(f"Exception: {e} while trying to read game flags key '{key}'")
- raise e
-
- def _write_game_flags_value_for(self, key: int, value: int) -> Optional[bool]:
- try:
- return self.game_state_manager.write_game_flags_value_for(key, value)
- except Exception as e:
- self.log_debug(f"Exception: {e} while trying to write '{key} = {value}' to game flags")
- raise e
-
- def _player_has(self, item: ZorkGrandInquisitorItems) -> bool:
- return item in self.received_items
-
- def _player_doesnt_have(self, item: ZorkGrandInquisitorItems) -> bool:
- return item not in self.received_items
-
- def _player_is_at(self, game_location: str) -> bool:
- return self.game_state_manager.game_location == game_location
-
- def _player_is_afgncaap(self) -> bool:
- return self._read_game_state_value_for(1596) == 1
-
- def _player_is_totem(self) -> bool:
- return self._player_is_brog() or self._player_is_griff() or self._player_is_lucy()
-
- def _player_is_brog(self) -> bool:
- return self._read_game_state_value_for(1520) == 1
-
- def _player_is_griff(self) -> bool:
- return self._read_game_state_value_for(1296) == 1
-
- def _player_is_lucy(self) -> bool:
- return self._read_game_state_value_for(1524) == 1
diff --git a/worlds/zork_grand_inquisitor/game_state_manager.py b/worlds/zork_grand_inquisitor/game_state_manager.py
deleted file mode 100644
index 25b35969bf5e..000000000000
--- a/worlds/zork_grand_inquisitor/game_state_manager.py
+++ /dev/null
@@ -1,370 +0,0 @@
-from typing import Optional, Tuple
-
-from pymem import Pymem
-from pymem.process import close_handle
-
-
-class GameStateManager:
- process_name = "scummvm.exe"
-
- process: Optional[Pymem]
- is_process_running: bool
-
- script_manager_struct_address: int
- render_manager_struct_address: int
-
- game_location: Optional[str]
- game_location_offset: Optional[int]
-
- def __init__(self) -> None:
- self.process = None
- self.is_process_running = False
-
- self.script_manager_struct_address = 0x0
- self.render_manager_struct_address = 0x0
-
- self.game_location = None
- self.game_location_offset = None
-
- @property
- def game_state_storage_pointer_address(self) -> int:
- return self.script_manager_struct_address + 0x88
-
- @property
- def game_state_storage_address(self) -> int:
- return self.process.read_longlong(self.game_state_storage_pointer_address)
-
- @property
- def game_state_hashmap_size_address(self) -> int:
- return self.script_manager_struct_address + 0x90
-
- @property
- def game_state_key_count_address(self) -> int:
- return self.script_manager_struct_address + 0x94
-
- @property
- def game_state_deleted_key_count_address(self) -> int:
- return self.script_manager_struct_address + 0x98
-
- @property
- def game_flags_storage_pointer_address(self) -> int:
- return self.script_manager_struct_address + 0x120
-
- @property
- def game_flags_storage_address(self) -> int:
- return self.process.read_longlong(self.game_flags_storage_pointer_address)
-
- @property
- def game_flags_hashmap_size_address(self) -> int:
- return self.script_manager_struct_address + 0x128
-
- @property
- def game_flags_key_count_address(self) -> int:
- return self.script_manager_struct_address + 0x12C
-
- @property
- def game_flags_deleted_key_count_address(self) -> int:
- return self.script_manager_struct_address + 0x130
-
- @property
- def current_location_address(self) -> int:
- return self.script_manager_struct_address + 0x400
-
- @property
- def current_location_offset_address(self) -> int:
- return self.script_manager_struct_address + 0x404
-
- @property
- def next_location_address(self) -> int:
- return self.script_manager_struct_address + 0x408
-
- @property
- def next_location_offset_address(self) -> int:
- return self.script_manager_struct_address + 0x40C
-
- @property
- def panorama_reversed_address(self) -> int:
- return self.render_manager_struct_address + 0x1C
-
- def open_process_handle(self) -> bool:
- try:
- self.process = Pymem(self.process_name)
- self.is_process_running = True
-
- self.script_manager_struct_address = self._resolve_address(0x5276600, (0xC8, 0x0))
- self.render_manager_struct_address = self._resolve_address(0x5276600, (0xD0, 0x120))
- except Exception:
- return False
-
- return True
-
- def close_process_handle(self) -> bool:
- if close_handle(self.process.process_handle):
- self.is_process_running = False
- self.process = None
-
- self.script_manager_struct_address = 0x0
- self.render_manager_struct_address = 0x0
-
- return True
-
- return False
-
- def is_process_still_running(self) -> bool:
- try:
- self.process.read_int(self.process.base_address)
- except Exception:
- self.is_process_running = False
- self.process = None
-
- self.script_manager_struct_address = 0x0
- self.render_manager_struct_address = 0x0
-
- return False
-
- return True
-
- def read_game_state_value_for(self, key: int) -> Optional[int]:
- return self.read_statemap_value_for(key, scope="game_state")
-
- def read_game_flags_value_for(self, key: int) -> Optional[int]:
- return self.read_statemap_value_for(key, scope="game_flags")
-
- def read_statemap_value_for(self, key: int, scope: str = "game_state") -> Optional[int]:
- if self.is_process_running:
- offset: int
-
- address: int
- address_value: int
-
- if scope == "game_state":
- offset = self._get_game_state_address_read_offset_for(key)
-
- address = self.game_state_storage_address + offset
- address_value = self.process.read_longlong(address)
- elif scope == "game_flags":
- offset = self._get_game_flags_address_read_offset_for(key)
-
- address = self.game_flags_storage_address + offset
- address_value = self.process.read_longlong(address)
- else:
- raise ValueError(f"Invalid scope: {scope}")
-
- if address_value == 0:
- return 0
-
- statemap_value: int = self.process.read_int(address_value + 0x0)
- statemap_key: int = self.process.read_int(address_value + 0x4)
-
- assert statemap_key == key
-
- return statemap_value
-
- return None
-
- def write_game_state_value_for(self, key: int, value: int) -> Optional[bool]:
- return self.write_statemap_value_for(key, value, scope="game_state")
-
- def write_game_flags_value_for(self, key: int, value: int) -> Optional[bool]:
- return self.write_statemap_value_for(key, value, scope="game_flags")
-
- def write_statemap_value_for(self, key: int, value: int, scope: str = "game_state") -> Optional[bool]:
- if self.is_process_running:
- offset: int
- is_existing_node: bool
- is_reused_dummy_node: bool
-
- key_count_address: int
- deleted_key_count_address: int
-
- storage_address: int
-
- if scope == "game_state":
- offset, is_existing_node, is_reused_dummy_node = self._get_game_state_address_write_offset_for(key)
-
- key_count_address = self.game_state_key_count_address
- deleted_key_count_address = self.game_state_deleted_key_count_address
-
- storage_address = self.game_state_storage_address
- elif scope == "game_flags":
- offset, is_existing_node, is_reused_dummy_node = self._get_game_flags_address_write_offset_for(key)
-
- key_count_address = self.game_flags_key_count_address
- deleted_key_count_address = self.game_flags_deleted_key_count_address
-
- storage_address = self.game_flags_storage_address
- else:
- raise ValueError(f"Invalid scope: {scope}")
-
- statemap_key_count: int = self.process.read_int(key_count_address)
- statemap_deleted_key_count: int = self.process.read_int(deleted_key_count_address)
-
- if value == 0:
- if not is_existing_node:
- return False
-
- self.process.write_longlong(storage_address + offset, 1)
-
- self.process.write_int(key_count_address, statemap_key_count - 1)
- self.process.write_int(deleted_key_count_address, statemap_deleted_key_count + 1)
- else:
- if is_existing_node:
- address_value: int = self.process.read_longlong(storage_address + offset)
- self.process.write_int(address_value + 0x0, value)
- else:
- write_address: int = self.process.allocate(0x8)
-
- self.process.write_int(write_address + 0x0, value)
- self.process.write_int(write_address + 0x4, key)
-
- self.process.write_longlong(storage_address + offset, write_address)
-
- self.process.write_int(key_count_address, statemap_key_count + 1)
-
- if is_reused_dummy_node:
- self.process.write_int(deleted_key_count_address, statemap_deleted_key_count - 1)
-
- return True
-
- return None
-
- def refresh_game_location(self) -> Optional[bool]:
- if self.is_process_running:
- game_location_bytes: bytes = self.process.read_bytes(self.current_location_address, 4)
-
- self.game_location = game_location_bytes.decode("ascii")
- self.game_location_offset = self.process.read_int(self.current_location_offset_address)
-
- return True
-
- return None
-
- def set_game_location(self, game_location: str, offset: int) -> Optional[bool]:
- if self.is_process_running:
- game_location_bytes: bytes = game_location.encode("ascii")
-
- self.process.write_bytes(self.next_location_address, game_location_bytes, 4)
- self.process.write_int(self.next_location_offset_address, offset)
-
- return True
-
- return None
-
- def set_panorama_reversed(self, is_reversed: bool) -> Optional[bool]:
- if self.is_process_running:
- self.process.write_int(self.panorama_reversed_address, 1 if is_reversed else 0)
-
- return True
-
- return None
-
- def _resolve_address(self, base_offset: int, offsets: Tuple[int, ...]):
- address: int = self.process.read_longlong(self.process.base_address + base_offset)
-
- for offset in offsets[:-1]:
- address = self.process.read_longlong(address + offset)
-
- return address + offsets[-1]
-
- def _get_game_state_address_read_offset_for(self, key: int):
- return self._get_statemap_address_read_offset_for(key, scope="game_state")
-
- def _get_game_flags_address_read_offset_for(self, key: int):
- return self._get_statemap_address_read_offset_for(key, scope="game_flags")
-
- def _get_statemap_address_read_offset_for(self, key: int, scope: str = "game_state") -> int:
- hashmap_size_address: int
- storage_address: int
-
- if scope == "game_state":
- hashmap_size_address = self.game_state_hashmap_size_address
- storage_address = self.game_state_storage_address
- elif scope == "game_flags":
- hashmap_size_address = self.game_flags_hashmap_size_address
- storage_address = self.game_flags_storage_address
- else:
- raise ValueError(f"Invalid scope: {scope}")
-
- statemap_hashmap_size: int = self.process.read_int(hashmap_size_address)
-
- perturb: int = key
- perturb_shift: int = 0x5
-
- index: int = key & statemap_hashmap_size
- offset: int = index * 0x8
-
- while True:
- offset_value: int = self.process.read_longlong(storage_address + offset)
-
- if offset_value == 0: # Null Pointer
- break
- elif offset_value == 1: # Dummy Node
- pass
- elif offset_value > 1: # Existing Node
- if self.process.read_int(offset_value + 0x4) == key:
- break
-
- index = ((0x5 * index) + perturb + 0x1) & statemap_hashmap_size
- offset = index * 0x8
-
- perturb >>= perturb_shift
-
- return offset
-
- def _get_game_state_address_write_offset_for(self, key: int) -> Tuple[int, bool, bool]:
- return self._get_statemap_address_write_offset_for(key, scope="game_state")
-
- def _get_game_flags_address_write_offset_for(self, key: int) -> Tuple[int, bool, bool]:
- return self._get_statemap_address_write_offset_for(key, scope="game_flags")
-
- def _get_statemap_address_write_offset_for(self, key: int, scope: str = "game_state") -> Tuple[int, bool, bool]:
- hashmap_size_address: int
- storage_address: int
-
- if scope == "game_state":
- hashmap_size_address = self.game_state_hashmap_size_address
- storage_address = self.game_state_storage_address
- elif scope == "game_flags":
- hashmap_size_address = self.game_flags_hashmap_size_address
- storage_address = self.game_flags_storage_address
- else:
- raise ValueError(f"Invalid scope: {scope}")
-
- statemap_hashmap_size: int = self.process.read_int(hashmap_size_address)
-
- perturb: int = key
- perturb_shift: int = 0x5
-
- index: int = key & statemap_hashmap_size
- offset: int = index * 0x8
-
- node_found: bool = False
-
- dummy_node_found: bool = False
- dummy_node_offset: Optional[int] = None
-
- while True:
- offset_value: int = self.process.read_longlong(storage_address + offset)
-
- if offset_value == 0: # Null Pointer
- break
- elif offset_value == 1: # Dummy Node
- if not dummy_node_found:
- dummy_node_offset = offset
- dummy_node_found = True
- elif offset_value > 1: # Existing Node
- if self.process.read_int(offset_value + 0x4) == key:
- node_found = True
- break
-
- index = ((0x5 * index) + perturb + 0x1) & statemap_hashmap_size
- offset = index * 0x8
-
- perturb >>= perturb_shift
-
- if not node_found and dummy_node_found: # We should reuse the dummy node
- return dummy_node_offset, False, True
- elif not node_found and not dummy_node_found: # We should allocate a new node
- return offset, False, False
-
- return offset, True, False # We should update the existing node
diff --git a/worlds/zork_grand_inquisitor/options.py b/worlds/zork_grand_inquisitor/options.py
deleted file mode 100644
index f06415199934..000000000000
--- a/worlds/zork_grand_inquisitor/options.py
+++ /dev/null
@@ -1,61 +0,0 @@
-from dataclasses import dataclass
-
-from Options import Choice, DefaultOnToggle, PerGameCommonOptions, Toggle
-
-
-class Goal(Choice):
- """
- Determines the victory condition
-
- Three Artifacts: Retrieve the three artifacts of magic and place them in the walking castle
- """
- display_name: str = "Goal"
-
- default: int = 0
- option_three_artifacts: int = 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 StartWithHotspotItems(DefaultOnToggle):
- """
- If true, the player will be given all the hotspot items at the start of the game, effectively removing the need
- to enable the important hotspots in the game before interacting with them. Recommended for beginners
-
- Note: The spots these hotspot items would have occupied in the item pool will instead be filled with junk items.
- Expect a higher volume of filler items if you enable this option
- """
-
- display_name: str = "Start with Hotspot Items"
-
-
-class Deathsanity(Toggle):
- """If true, adds 16 player death locations to the world"""
-
- display_name: str = "Deathsanity"
-
-
-class GrantMissableLocationChecks(Toggle):
- """
- If true, performing an irreversible action will grant the locations checks that would have become unobtainable as a
- result of that action when you meet the item requirements
-
- Otherwise, the player is expected to potentially have to use the save system to reach those location checks. If you
- don't like the idea of rarely having to reload an earlier save to get a location check, make sure this option is
- enabled
- """
-
- display_name: str = "Grant Missable Checks"
-
-
-@dataclass
-class ZorkGrandInquisitorOptions(PerGameCommonOptions):
- goal: Goal
- quick_port_foozle: QuickPortFoozle
- start_with_hotspot_items: StartWithHotspotItems
- deathsanity: Deathsanity
- grant_missable_location_checks: GrantMissableLocationChecks
diff --git a/worlds/zork_grand_inquisitor/requirements.txt b/worlds/zork_grand_inquisitor/requirements.txt
deleted file mode 100644
index ca36764fbfaa..000000000000
--- a/worlds/zork_grand_inquisitor/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-Pymem>=1.13.0
diff --git a/worlds/zork_grand_inquisitor/test/__init__.py b/worlds/zork_grand_inquisitor/test/__init__.py
deleted file mode 100644
index c8ceda43a7bf..000000000000
--- a/worlds/zork_grand_inquisitor/test/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from test.bases import WorldTestBase
-
-
-class ZorkGrandInquisitorTestBase(WorldTestBase):
- game = "Zork Grand Inquisitor"
diff --git a/worlds/zork_grand_inquisitor/test/test_access.py b/worlds/zork_grand_inquisitor/test/test_access.py
deleted file mode 100644
index 63a5f8c9ab1d..000000000000
--- a/worlds/zork_grand_inquisitor/test/test_access.py
+++ /dev/null
@@ -1,2927 +0,0 @@
-from typing import List
-
-from . import ZorkGrandInquisitorTestBase
-
-from ..enums import (
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorLocations,
- ZorkGrandInquisitorRegions,
-)
-
-
-class AccessTestRegions(ZorkGrandInquisitorTestBase):
- options = {
- "start_with_hotspot_items": "false",
- }
-
- def test_access_crossroads_to_dm_lair_sword(self) -> None:
- self._go_to_crossroads()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SWORD.value,
- ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- def test_access_crossroads_to_dm_lair_teleporter(self) -> None:
- self._go_to_crossroads()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- def test_access_crossroads_to_gue_tech(self) -> None:
- self._go_to_crossroads()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_REZROV.value,
- ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value))
-
- def test_access_crossroads_to_gue_tech_outside(self) -> None:
- self._go_to_crossroads()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value))
-
- def test_access_crossroads_to_hades_shore(self) -> None:
- self._go_to_crossroads()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- def test_access_crossroads_to_port_foozle(self) -> None:
- self._go_to_crossroads()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE.value))
-
- def test_access_crossroads_to_spell_lab_bridge(self) -> None:
- self._go_to_crossroads()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- def test_access_crossroads_to_subway_crossroads(self) -> None:
- self._go_to_crossroads()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SUBWAY_TOKEN.value,
- ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS.value))
-
- def test_access_crossroads_to_subway_monastery(self) -> None:
- self._go_to_crossroads()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- def test_access_dm_lair_to_crossroads(self) -> None:
- self._go_to_dm_lair()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value))
-
- def test_access_dm_lair_to_dm_lair_interior(self) -> None:
- self._go_to_dm_lair()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY.value,
- ZorkGrandInquisitorItems.MEAD_LIGHT.value,
- ZorkGrandInquisitorItems.ZIMDOR_SCROLL.value,
- ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR.value))
-
- def test_access_dm_lair_to_gue_tech_outside(self) -> None:
- self._go_to_dm_lair()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value))
-
- def test_access_dm_lair_to_hades_shore(self) -> None:
- self._go_to_dm_lair()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- def test_access_dm_lair_to_spell_lab_bridge(self) -> None:
- self._go_to_dm_lair()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- def test_access_dm_lair_to_subway_monastery(self) -> None:
- self._go_to_dm_lair()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- def test_access_dm_lair_interior_to_dm_lair(self) -> None:
- self._go_to_dm_lair_interior()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- def test_access_dm_lair_interior_to_walking_castle(self) -> None:
- self._go_to_dm_lair_interior()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.WALKING_CASTLE.value))
-
- self._obtain_obidil()
-
- self.collect_by_name(ZorkGrandInquisitorItems.HOTSPOT_BLINDS.value)
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.WALKING_CASTLE.value))
-
- def test_access_dm_lair_interior_to_white_house(self) -> None:
- self._go_to_dm_lair_interior()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.WHITE_HOUSE.value))
-
- self._obtain_yastard()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR.value,
- ZorkGrandInquisitorItems.SPELL_NARWILE.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.WHITE_HOUSE.value))
-
- def test_access_dragon_archipelago_to_dragon_archipelago_dragon(self) -> None:
- self._go_to_dragon_archipelago()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.TOTEM_GRIFF.value,
- ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON.value))
-
- def test_access_dragon_archipelago_to_hades_beyond_gates(self) -> None:
- self._go_to_dragon_archipelago()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_BEYOND_GATES.value))
-
- def test_access_dragon_archipelago_dragon_to_dragon_archipelago(self) -> None:
- self._go_to_dragon_archipelago_dragon()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO.value))
-
- def test_access_dragon_archipelago_dragon_to_endgame(self) -> None:
- self._go_to_dragon_archipelago_dragon()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP.value,
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT.value,
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN.value,
- ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS.value,
- ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH.value,
- )
- )
-
- self._go_to_port_foozle_past_tavern()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1.value,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2.value,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3.value,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4.value,
- ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY.value,
- ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS.value,
- )
- )
-
- self._go_to_white_house()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.TOTEM_BROG.value,
- ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH.value,
- ZorkGrandInquisitorItems.BROGS_GRUE_EGG.value,
- ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT.value,
- ZorkGrandInquisitorItems.BROGS_PLANK.value,
- ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value))
-
- def test_access_gue_tech_to_crossroads(self) -> None:
- self._go_to_gue_tech()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value))
-
- def test_access_gue_tech_to_gue_tech_hallway(self) -> None:
- self._go_to_gue_tech()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_IGRAM.value,
- ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY.value))
-
- def test_access_gue_tech_to_gue_tech_outside(self) -> None:
- self._go_to_gue_tech()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value))
-
- self.collect_by_name(ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR.value)
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value))
-
- def test_access_gue_tech_hallway_to_gue_tech(self) -> None:
- self._go_to_gue_tech_hallway()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value))
-
- def test_access_gue_tech_hallway_to_spell_lab_bridge(self) -> None:
- self._go_to_gue_tech_hallway()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.STUDENT_ID.value,
- ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- def test_access_gue_tech_outside_to_crossroads(self) -> None:
- self._go_to_gue_tech_outside()
-
- # Direct connection requires the map but indirect connection is free
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value))
-
- def test_access_gue_tech_outside_to_dm_lair(self) -> None:
- self._go_to_gue_tech_outside()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- def test_access_gue_tech_outside_to_gue_tech(self) -> None:
- self._go_to_gue_tech_outside()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH.value))
-
- def test_access_gue_tech_outside_to_hades_shore(self) -> None:
- self._go_to_gue_tech_outside()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- def test_access_gue_tech_outside_to_spell_lab_bridge(self) -> None:
- self._go_to_gue_tech_outside()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- def test_access_gue_tech_outside_to_subway_monastery(self) -> None:
- self._go_to_gue_tech_outside()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- def test_access_hades_to_hades_beyond_gates(self) -> None:
- self._go_to_hades()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_BEYOND_GATES.value))
-
- self._obtain_snavig()
-
- self.collect_by_name(ZorkGrandInquisitorItems.TOTEM_BROG.value)
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_BEYOND_GATES.value))
-
- def test_access_hades_to_hades_shore(self) -> None:
- self._go_to_hades()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- def test_access_hades_beyond_gates_to_dragon_archipelago(self) -> None:
- self._go_to_hades_beyond_gates()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO.value))
-
- self._obtain_yastard()
-
- self.collect_by_name(ZorkGrandInquisitorItems.SPELL_NARWILE.value)
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO.value))
-
- def test_access_hades_beyond_gates_to_hades(self) -> None:
- self._go_to_hades_beyond_gates()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES.value))
-
- def test_access_hades_shore_to_crossroads(self) -> None:
- self._go_to_hades_shore()
-
- # Direct connection requires the map but indirect connection is free
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value))
-
- def test_access_hades_shore_to_dm_lair(self) -> None:
- self._go_to_hades_shore()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- def test_access_hades_shore_to_gue_tech_outside(self) -> None:
- self._go_to_hades_shore()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value))
-
- def test_access_hades_shore_to_hades(self) -> None:
- self._go_to_hades_shore()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER.value,
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS.value,
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES.value))
-
- def test_access_hades_shore_to_spell_lab_bridge(self) -> None:
- self._go_to_hades_shore()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- def test_access_hades_shore_to_subway_crossroads(self) -> None:
- self._go_to_hades_shore()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS.value))
-
- def test_access_hades_shore_to_subway_flood_control_dam(self) -> None:
- self._go_to_hades_shore()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value))
-
- self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM.value)
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value))
-
- def test_access_hades_shore_to_subway_monastery(self) -> None:
- self._go_to_hades_shore()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY.value)
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- def test_access_monastery_to_hades_shore(self) -> None:
- self._go_to_monastery()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL.value,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS.value,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- def test_access_monastery_to_monastery_exhibit(self) -> None:
- self._go_to_monastery()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION.value,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS.value,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT.value))
-
- def test_access_monastery_to_subway_monastery(self) -> None:
- self._go_to_monastery()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- def test_access_monastery_exhibit_to_monastery(self) -> None:
- self._go_to_monastery_exhibit()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY.value))
-
- def test_access_monastery_exhibit_to_port_foozle_past(self) -> None:
- self._go_to_monastery_exhibit()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST.value))
-
- self._obtain_yastard()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER.value,
- ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT.value,
- ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER.value,
- ZorkGrandInquisitorItems.SPELL_NARWILE.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST.value))
-
- def test_access_port_foozle_to_crossroads(self) -> None:
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value,
- ZorkGrandInquisitorItems.LANTERN.value,
- ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value,
- ZorkGrandInquisitorItems.ROPE.value,
- ZorkGrandInquisitorItems.HOTSPOT_WELL.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value))
-
- def test_access_port_foozle_to_port_foozle_jacks_shop(self) -> None:
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value,
- ZorkGrandInquisitorItems.LANTERN.value,
- ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_JACKS_SHOP.value))
-
- def test_access_port_foozle_jacks_shop_to_port_foozle(self) -> None:
- self._go_to_port_foozle_jacks_shop()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE.value))
-
- def test_access_port_foozle_past_to_monastery_exhibit(self) -> None:
- self._go_to_port_foozle_past()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY_EXHIBIT.value))
-
- def test_access_port_foozle_past_to_port_foozle_past_tavern(self) -> None:
- self._go_to_port_foozle_past()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.TOTEM_LUCY.value,
- ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST_TAVERN.value))
-
- def test_access_port_foozle_past_tavern_to_endgame(self) -> None:
- self._go_to_port_foozle_past_tavern()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1.value,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2.value,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3.value,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4.value,
- ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY.value,
- ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS.value,
- )
- )
-
- self._go_to_dragon_archipelago_dragon()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP.value,
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT.value,
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN.value,
- ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS.value,
- ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH.value,
- )
- )
-
- self._go_to_white_house()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.TOTEM_BROG.value,
- ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH.value,
- ZorkGrandInquisitorItems.BROGS_GRUE_EGG.value,
- ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT.value,
- ZorkGrandInquisitorItems.BROGS_PLANK.value,
- ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value))
-
- def test_access_port_foozle_past_tavern_to_port_foozle_past(self) -> None:
- self._go_to_port_foozle_past_tavern()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.PORT_FOOZLE_PAST.value))
-
- def test_access_spell_lab_to_spell_lab_bridge(self) -> None:
- self._go_to_spell_lab()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB_BRIDGE.value))
-
- def test_access_spell_lab_bridge_to_crossroads(self) -> None:
- self._go_to_spell_lab_bridge()
-
- # Direct connection requires the map but indirect connection is free
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value))
-
- def test_access_spell_lab_bridge_to_dm_lair(self) -> None:
- self._go_to_spell_lab_bridge()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR.value))
-
- def test_access_spell_lab_bridge_to_gue_tech_outside(self) -> None:
- self._go_to_spell_lab_bridge()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE.value))
-
- def test_access_spell_lab_bridge_to_gue_tech_hallway(self) -> None:
- self._go_to_spell_lab_bridge()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.GUE_TECH_HALLWAY.value))
-
- def test_access_spell_lab_bridge_to_hades_shore(self) -> None:
- self._go_to_spell_lab_bridge()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- def test_access_spell_lab_bridge_to_spell_lab(self) -> None:
- self._go_to_spell_lab_bridge()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB.value))
-
- self._go_to_subway_flood_control_dam()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_REZROV.value,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS.value,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS.value,
- ZorkGrandInquisitorItems.SWORD.value,
- ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE.value,
- ZorkGrandInquisitorItems.SPELL_GOLGATEM.value,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SPELL_LAB.value))
-
- def test_access_spell_lab_bridge_to_subway_monastery(self) -> None:
- self._go_to_spell_lab_bridge()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- def test_access_subway_crossroads_to_crossroads(self) -> None:
- self._go_to_subway_crossroads()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.CROSSROADS.value))
-
- def test_access_subway_crossroads_to_hades_shore(self) -> None:
- self._go_to_subway_crossroads()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_KENDALL.value,
- ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- def test_access_subway_crossroads_to_subway_flood_control_dam(self) -> None:
- self._go_to_subway_crossroads()
-
- self.assertFalse(
- self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value)
- )
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_KENDALL.value,
- ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM.value,
- )
- )
-
- self.assertTrue(
- self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value)
- )
-
- def test_access_subway_crossroads_to_subway_monastery(self) -> None:
- self._go_to_subway_crossroads()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_KENDALL.value,
- ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- def test_access_subway_flood_control_dam_to_hades_shore(self) -> None:
- self._go_to_subway_flood_control_dam()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES.value)
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- def test_access_subway_flood_control_dam_to_subway_crossroads(self) -> None:
- self._go_to_subway_flood_control_dam()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS.value))
-
- def test_access_subway_flood_control_dam_to_subway_monastery(self) -> None:
- self._go_to_subway_flood_control_dam()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY.value)
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_MONASTERY.value))
-
- def test_access_subway_monastery_to_hades_shore(self) -> None:
- self._go_to_subway_monastery()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES.value)
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.HADES_SHORE.value))
-
- def test_access_subway_monastery_to_monastery(self) -> None:
- self._go_to_subway_monastery()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SWORD.value,
- ZorkGrandInquisitorItems.SPELL_GLORF.value,
- ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.MONASTERY.value))
-
- def test_access_subway_monastery_to_subway_crossroads(self) -> None:
- self._go_to_subway_monastery()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_CROSSROADS.value))
-
- def test_access_subway_monastery_to_subway_flood_control_dam(self) -> None:
- self._go_to_subway_monastery()
-
- self.assertFalse(
- self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value)
- )
-
- self.collect_by_name(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM.value)
-
- self.assertTrue(
- self.can_reach_region(ZorkGrandInquisitorRegions.SUBWAY_FLOOD_CONTROL_DAM.value)
- )
-
- def test_access_walking_castle_to_dm_lair_interior(self) -> None:
- self._go_to_walking_castle()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR.value))
-
- def test_access_white_house_to_dm_lair_interior(self) -> None:
- self._go_to_white_house()
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR.value))
-
- def test_access_white_house_to_endgame(self) -> None:
- self._go_to_white_house()
-
- self.assertFalse(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value))
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.TOTEM_BROG.value,
- ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH.value,
- ZorkGrandInquisitorItems.BROGS_GRUE_EGG.value,
- ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT.value,
- ZorkGrandInquisitorItems.BROGS_PLANK.value,
- ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE.value,
- )
- )
-
- self._go_to_dragon_archipelago_dragon()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP.value,
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT.value,
- ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN.value,
- ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS.value,
- ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH.value,
- )
- )
-
- self._go_to_port_foozle_past_tavern()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1.value,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2.value,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3.value,
- ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4.value,
- ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY.value,
- ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS.value,
- )
- )
-
- self.assertTrue(self.can_reach_region(ZorkGrandInquisitorRegions.ENDGAME.value))
-
- def _go_to_crossroads(self) -> None:
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.LANTERN.value,
- ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value,
- ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value,
- ZorkGrandInquisitorItems.ROPE.value,
- ZorkGrandInquisitorItems.HOTSPOT_WELL.value,
- )
- )
-
- def _go_to_dm_lair(self) -> None:
- self._go_to_crossroads()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SWORD.value,
- ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE.value,
- )
- )
-
- def _go_to_dm_lair_interior(self) -> None:
- self._go_to_dm_lair()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY.value,
- ZorkGrandInquisitorItems.MEAD_LIGHT.value,
- ZorkGrandInquisitorItems.ZIMDOR_SCROLL.value,
- ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH.value,
- )
- )
-
- def _go_to_dragon_archipelago(self) -> None:
- self._go_to_hades_beyond_gates()
- self._obtain_yastard()
-
- self.collect_by_name(ZorkGrandInquisitorItems.SPELL_NARWILE.value)
-
- def _go_to_dragon_archipelago_dragon(self) -> None:
- self._go_to_dragon_archipelago()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.TOTEM_GRIFF.value,
- ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW.value,
- )
- )
-
- def _go_to_gue_tech(self) -> None:
- self._go_to_crossroads()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_REZROV.value,
- ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR.value,
- )
- )
-
- def _go_to_gue_tech_hallway(self) -> None:
- self._go_to_gue_tech()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_IGRAM.value,
- ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS.value,
- )
- )
-
- def _go_to_gue_tech_outside(self) -> None:
- self._go_to_crossroads()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value,
- )
- )
-
- def _go_to_hades(self) -> None:
- self._go_to_hades_shore()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER.value,
- ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS.value,
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS.value,
- )
- )
-
- def _go_to_hades_beyond_gates(self) -> None:
- self._go_to_hades()
- self._obtain_snavig()
-
- self.collect_by_name(ZorkGrandInquisitorItems.TOTEM_BROG.value)
-
- def _go_to_hades_shore(self) -> None:
- self._go_to_crossroads()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value,
- )
- )
-
- def _go_to_monastery(self) -> None:
- self._go_to_subway_monastery()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SWORD.value,
- ZorkGrandInquisitorItems.SPELL_GLORF.value,
- ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT.value,
- )
- )
-
- def _go_to_monastery_exhibit(self) -> None:
- self._go_to_monastery()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION.value,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS.value,
- ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH.value,
- )
- )
-
- def _go_to_port_foozle_jacks_shop(self) -> None:
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value,
- ZorkGrandInquisitorItems.LANTERN.value,
- ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value,
- )
- )
-
- def _go_to_port_foozle_past(self) -> None:
- self._go_to_monastery_exhibit()
-
- self._obtain_yastard()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER.value,
- ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT.value,
- ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER.value,
- ZorkGrandInquisitorItems.SPELL_NARWILE.value,
- )
- )
-
- def _go_to_port_foozle_past_tavern(self) -> None:
- self._go_to_port_foozle_past()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.TOTEM_LUCY.value,
- ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR.value,
- )
- )
-
- def _go_to_spell_lab(self) -> None:
- self._go_to_subway_flood_control_dam()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_REZROV.value,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS.value,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS.value,
- )
- )
-
- self._go_to_spell_lab_bridge()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SWORD.value,
- ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE.value,
- ZorkGrandInquisitorItems.SPELL_GOLGATEM.value,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM.value,
- )
- )
-
- def _go_to_spell_lab_bridge(self) -> None:
- self._go_to_crossroads()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value,
- )
- )
-
- def _go_to_subway_crossroads(self) -> None:
- self._go_to_crossroads()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SUBWAY_TOKEN.value,
- ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT.value,
- )
- )
-
- def _go_to_subway_flood_control_dam(self) -> None:
- self._go_to_subway_crossroads()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_KENDALL.value,
- ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM.value,
- )
- )
-
- def _go_to_subway_monastery(self) -> None:
- self._go_to_crossroads()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.MAP.value,
- ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value,
- )
- )
-
- def _go_to_white_house(self) -> None:
- self._go_to_dm_lair_interior()
-
- self._obtain_yastard()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR.value,
- ZorkGrandInquisitorItems.SPELL_NARWILE.value,
- )
- )
-
- def _go_to_walking_castle(self) -> None:
- self._go_to_dm_lair_interior()
-
- self._obtain_obidil()
- self.collect_by_name(ZorkGrandInquisitorItems.HOTSPOT_BLINDS.value)
-
- def _obtain_obidil(self) -> None:
- self._go_to_crossroads()
- self._go_to_gue_tech()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS.value,
- ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT.value,
- ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS.value,
- )
- )
-
- self._go_to_subway_flood_control_dam()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_REZROV.value,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS.value,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS.value,
- )
- )
-
- self._go_to_spell_lab_bridge()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SWORD.value,
- ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE.value,
- ZorkGrandInquisitorItems.SPELL_GOLGATEM.value,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM.value,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER.value,
- )
- )
-
- def _obtain_snavig(self) -> None:
- self._go_to_crossroads()
- self._go_to_dm_lair_interior()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS.value,
- ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV.value,
- ZorkGrandInquisitorItems.HOTSPOT_MIRROR.value,
- )
- )
-
- self._go_to_subway_flood_control_dam()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SPELL_REZROV.value,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS.value,
- ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS.value,
- )
- )
-
- self._go_to_spell_lab_bridge()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.SWORD.value,
- ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE.value,
- ZorkGrandInquisitorItems.SPELL_GOLGATEM.value,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM.value,
- ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER.value,
- )
- )
-
- def _obtain_yastard(self) -> None:
- self._go_to_crossroads()
- self._go_to_dm_lair_interior()
-
- self.collect_by_name(
- (
- ZorkGrandInquisitorItems.FLATHEADIA_FUDGE.value,
- ZorkGrandInquisitorItems.HUNGUS_LARD.value,
- ZorkGrandInquisitorItems.JAR_OF_HOTBUGS.value,
- ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB.value,
- ZorkGrandInquisitorItems.MOSS_OF_MAREILON.value,
- ZorkGrandInquisitorItems.MUG.value,
- )
- )
-
-
-class AccessTestLocations(ZorkGrandInquisitorTestBase):
- options = {
- "deathsanity": "true",
- "start_with_hotspot_items": "false",
- }
-
- def test_access_locations_requiring_brogs_flickering_torch(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BROG_DO_GOOD.value,
- ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value,
- ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value,
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.BROGS_FLICKERING_TORCH.value,)]
- )
-
- def test_access_locations_requiring_brogs_grue_egg(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BROG_DO_GOOD.value,
- ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value,
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.BROGS_GRUE_EGG.value,)]
- )
-
- def test_access_locations_requiring_brogs_plank(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.BROGS_PLANK.value,)]
- )
-
- def test_access_locations_requiring_flatheadia_fudge(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.FLATHEADIA_FUDGE.value,)]
- )
-
- def test_access_locations_requiring_griffs_air_pump(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.GRIFFS_AIR_PUMP.value,)]
- )
-
- def test_access_locations_requiring_griffs_dragon_tooth(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.GRIFFS_DRAGON_TOOTH.value,)]
- )
-
- def test_access_locations_requiring_griffs_inflatable_raft(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_RAFT.value,)]
- )
-
- def test_access_locations_requiring_griffs_inflatable_sea_captain(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.GRIFFS_INFLATABLE_SEA_CAPTAIN.value,)]
- )
-
- def test_access_locations_requiring_hammer(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BOING_BOING_BOING.value,
- ZorkGrandInquisitorLocations.BONK.value,
- ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value,
- ZorkGrandInquisitorLocations.IN_CASE_OF_ADVENTURE.value,
- ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED.value,
- ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HAMMER.value,)]
- )
-
- def test_access_locations_requiring_hungus_lard(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value,
- ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES.value,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HUNGUS_LARD.value,)]
- )
-
- def test_access_locations_requiring_jar_of_hotbugs(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.JAR_OF_HOTBUGS.value,)]
- )
-
- def test_access_locations_requiring_lantern(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.LANTERN.value,)]
- )
-
- def test_access_locations_requiring_large_telegraph_hammer(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.LARGE_TELEGRAPH_HAMMER.value,)]
- )
-
- def test_access_locations_requiring_lucys_playing_cards(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_1.value,)]
- )
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_2.value,)]
- )
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_3.value,)]
- )
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.LUCYS_PLAYING_CARD_4.value,)]
- )
-
- def test_access_locations_requiring_map(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.MAP.value,)]
- )
-
- def test_access_locations_requiring_mead_light(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.MEAD_LIGHT.value,
- ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO.value,
- ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.MEAD_LIGHT.value,)]
- )
-
- def test_access_locations_requiring_moss_of_mareilon(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.MOSS_OF_MAREILON.value,)]
- )
-
- def test_access_locations_requiring_mug(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.MUG.value,)]
- )
-
- def test_access_locations_requiring_old_scratch_card(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_LOST_SOUL_TO_OLD_SCRATCH.value,
- ZorkGrandInquisitorLocations.OLD_SCRATCH_WINNER.value,
- ZorkGrandInquisitorEvents.ZORKMID_BILL_ACCESSIBLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.OLD_SCRATCH_CARD.value,)]
- )
-
- def test_access_locations_requiring_perma_suck_machine(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.SUCKING_ROCKS.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.PERMA_SUCK_MACHINE.value,)]
- )
-
- def test_access_locations_requiring_plastic_six_pack_holder(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE.value,
- ZorkGrandInquisitorLocations.WHAT_ARE_YOU_STUPID.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.PLASTIC_SIX_PACK_HOLDER.value,)]
- )
-
- def test_access_locations_requiring_pouch_of_zorkmids(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER.value,
- ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON.value,
- ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value,
- ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.DUNCE_LOCKER.value,
- ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE.value,
- ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO.value,
- ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT.value,
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL.value,
- ZorkGrandInquisitorLocations.SOUVENIR.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value,
- ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value,
- ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value,
- ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value,
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value,
- ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.POUCH_OF_ZORKMIDS.value,)]
- )
-
- def test_access_locations_requiring_prozork_tablet(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.PROZORKED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.PROZORK_TABLET.value,)]
- )
-
- def test_access_locations_requiring_quelbee_honeycomb(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.QUELBEE_HONEYCOMB.value,)]
- )
-
- def test_access_locations_requiring_rope(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.ALARM_SYSTEM_IS_DOWN.value,
- ZorkGrandInquisitorLocations.ARTIFACTS_EXPLAINED.value,
- ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER.value,
- ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value,
- ZorkGrandInquisitorLocations.A_SMALLWAY.value,
- ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY.value,
- ZorkGrandInquisitorLocations.BEBURTT_DEMYSTIFIED.value,
- ZorkGrandInquisitorLocations.BETTER_SPELL_MANUFACTURING_IN_UNDER_10_MINUTES.value,
- ZorkGrandInquisitorLocations.BOING_BOING_BOING.value,
- ZorkGrandInquisitorLocations.BONK.value,
- ZorkGrandInquisitorLocations.BRAVE_SOULS_WANTED.value,
- ZorkGrandInquisitorLocations.BROG_DO_GOOD.value,
- ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value,
- ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value,
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value,
- ZorkGrandInquisitorLocations.CASTLE_WATCHING_A_FIELD_GUIDE.value,
- ZorkGrandInquisitorLocations.CAVES_NOTES.value,
- ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value,
- ZorkGrandInquisitorLocations.CRISIS_AVERTED.value,
- ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.DEATH_CLIMBED_OUT_OF_THE_WELL.value,
- ZorkGrandInquisitorLocations.DEATH_EATEN_BY_A_GRUE.value,
- ZorkGrandInquisitorLocations.DEATH_JUMPED_IN_BOTTOMLESS_PIT.value,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD.value,
- ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY.value,
- ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON.value,
- ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED.value,
- ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER.value,
- ZorkGrandInquisitorLocations.DESPERATELY_SEEKING_TUTOR.value,
- ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value,
- ZorkGrandInquisitorLocations.DOOOOOOWN.value,
- ZorkGrandInquisitorLocations.DOWN.value,
- ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.DUNCE_LOCKER.value,
- ZorkGrandInquisitorLocations.EGGPLANTS.value,
- ZorkGrandInquisitorLocations.EMERGENCY_MAGICATRONIC_MESSAGE.value,
- ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP.value,
- ZorkGrandInquisitorLocations.FAT_LOT_OF_GOOD_THATLL_DO_YA.value,
- ZorkGrandInquisitorLocations.FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE.value,
- ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value,
- ZorkGrandInquisitorLocations.FROBUARY_3_UNDERGROUNDHOG_DAY.value,
- ZorkGrandInquisitorLocations.GETTING_SOME_CHANGE.value,
- ZorkGrandInquisitorLocations.GUE_TECH_DEANS_LIST.value,
- ZorkGrandInquisitorLocations.GUE_TECH_ENTRANCE_EXAM.value,
- ZorkGrandInquisitorLocations.GUE_TECH_HEALTH_MEMO.value,
- ZorkGrandInquisitorLocations.GUE_TECH_MAGEMEISTERS.value,
- ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY.value,
- ZorkGrandInquisitorLocations.HELLO_THIS_IS_SHONA_FROM_GURTH_PUBLISHING.value,
- ZorkGrandInquisitorLocations.HEY_FREE_DIRT.value,
- ZorkGrandInquisitorLocations.HI_MY_NAME_IS_DOUG.value,
- ZorkGrandInquisitorLocations.HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING.value,
- ZorkGrandInquisitorLocations.HOLD_ON_FOR_AN_IMPORTANT_MESSAGE.value,
- ZorkGrandInquisitorLocations.HOW_TO_HYPNOTIZE_YOURSELF.value,
- ZorkGrandInquisitorLocations.HOW_TO_WIN_AT_DOUBLE_FANUCCI.value,
- ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY.value,
- ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE.value,
- ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value,
- ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE.value,
- ZorkGrandInquisitorLocations.IN_CASE_OF_ADVENTURE.value,
- ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST.value,
- ZorkGrandInquisitorLocations.INVISIBLE_FLOWERS.value,
- ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE.value,
- ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value,
- ZorkGrandInquisitorLocations.LIT_SUNFLOWERS.value,
- ZorkGrandInquisitorLocations.MAGIC_FOREVER.value,
- ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value,
- ZorkGrandInquisitorLocations.MAKE_LOVE_NOT_WAR.value,
- ZorkGrandInquisitorLocations.MIKES_PANTS.value,
- ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED.value,
- ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value,
- ZorkGrandInquisitorLocations.NATURAL_AND_SUPERNATURAL_CREATURES_OF_QUENDOR.value,
- ZorkGrandInquisitorLocations.NO_BONDAGE.value,
- ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO.value,
- ZorkGrandInquisitorLocations.NOTHIN_LIKE_A_GOOD_STOGIE.value,
- ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT.value,
- ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value,
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value,
- ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL.value,
- ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.PERMASEAL.value,
- ZorkGrandInquisitorLocations.PLEASE_DONT_THROCK_THE_GRASS.value,
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.PROZORKED.value,
- ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG.value,
- ZorkGrandInquisitorLocations.RESTOCKED_ON_GRUESDAY.value,
- ZorkGrandInquisitorLocations.RIGHT_HELLO_YES_UH_THIS_IS_SNEFFLE.value,
- ZorkGrandInquisitorLocations.RIGHT_UH_SORRY_ITS_ME_AGAIN_SNEFFLE.value,
- ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value,
- ZorkGrandInquisitorLocations.SOUVENIR.value,
- ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.SUCKING_ROCKS.value,
- ZorkGrandInquisitorLocations.TAMING_YOUR_SNAPDRAGON.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.THATS_A_ROPE.value,
- ZorkGrandInquisitorLocations.THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS.value,
- ZorkGrandInquisitorLocations.THATS_STILL_A_ROPE.value,
- ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value,
- ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value,
- ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value,
- ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value,
- ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND.value,
- ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value,
- ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED.value,
- ZorkGrandInquisitorLocations.TIME_TRAVEL_FOR_DUMMIES.value,
- ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value,
- ZorkGrandInquisitorLocations.UMBRELLA_FLOWERS.value,
- ZorkGrandInquisitorLocations.UP.value,
- ZorkGrandInquisitorLocations.USELESS_BUT_FUN.value,
- ZorkGrandInquisitorLocations.UUUUUP.value,
- ZorkGrandInquisitorLocations.VOYAGE_OF_CAPTAIN_ZAHAB.value,
- ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE.value,
- ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF.value,
- ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER.value,
- ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS.value,
- ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY.value,
- ZorkGrandInquisitorEvents.CHARON_CALLED.value,
- ZorkGrandInquisitorEvents.DAM_DESTROYED.value,
- ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value,
- ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR.value,
- ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value,
- ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value,
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value,
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value,
- ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value,
- ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value,
- ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD.value,
- ZorkGrandInquisitorEvents.ROPE_GLORFABLE.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value,
- ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value,
- ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.ROPE.value,)]
- )
-
- def test_access_locations_requiring_scroll_fragment_ans(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG.value,
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SCROLL_FRAGMENT_ANS.value,)]
- )
-
- def test_access_locations_requiring_scroll_fragment_giv(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG.value,
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SCROLL_FRAGMENT_GIV.value,)]
- )
-
- def test_access_locations_requiring_shovel(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.HEY_FREE_DIRT.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SHOVEL.value,)]
- )
-
- def test_access_locations_requiring_snapdragon(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BOING_BOING_BOING.value,
- ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SNAPDRAGON.value,)]
- )
-
- def test_access_locations_requiring_student_id(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.STUDENT_ID.value,)]
- )
-
- def test_access_locations_requiring_subway_token(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SUBWAY_TOKEN.value,)]
- )
-
- def test_access_locations_requiring_sword(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value,
- ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY.value,
- ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value,
- ZorkGrandInquisitorLocations.HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING.value,
- ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE.value,
- ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value,
- ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value,
- ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE.value,
- ZorkGrandInquisitorLocations.MAKE_LOVE_NOT_WAR.value,
- ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.PERMASEAL.value,
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value,
- ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value,
- ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value,
- ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value,
- ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS.value,
- ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY.value,
- ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value,
- ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value,
- ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SWORD.value,)]
- )
-
- def test_access_locations_requiring_zimdor_scroll(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO.value,
- ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.ZIMDOR_SCROLL.value,)]
- )
-
- def test_access_locations_requiring_zork_rocks(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.ZORK_ROCKS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_666_mailbox(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_666_MAILBOX.value,)]
- )
-
- def test_access_locations_requiring_hotspot_alpines_quandry_card_slots(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_ALPINES_QUANDRY_CARD_SLOTS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_blank_scroll_box(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value,
- ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_BLANK_SCROLL_BOX.value,)]
- )
-
- def test_access_locations_requiring_hotspot_blinds(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER.value,
- ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_BLINDS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_candy_machine_buttons(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DUNCE_LOCKER.value,
- ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO.value,
- ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value,
- ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value,
- ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_BUTTONS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_candy_machine_coin_slot(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DUNCE_LOCKER.value,
- ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO.value,
- ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value,
- ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value,
- ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_COIN_SLOT.value,)]
- )
-
- def test_access_locations_requiring_hotspot_candy_machine_vacuum_slot(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.SUCKING_ROCKS.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_CANDY_MACHINE_VACUUM_SLOT.value,)]
- )
-
- def test_access_locations_requiring_hotspot_change_machine_slot(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.GETTING_SOME_CHANGE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_CHANGE_MACHINE_SLOT.value,)]
- )
-
- def test_access_locations_requiring_hotspot_closet_door(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BROG_DO_GOOD.value,
- ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value,
- ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value,
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value,
- ZorkGrandInquisitorLocations.DOOOOOOWN.value,
- ZorkGrandInquisitorLocations.DOWN.value,
- ZorkGrandInquisitorLocations.UP.value,
- ZorkGrandInquisitorLocations.UUUUUP.value,
- ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value,
- ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_CLOSET_DOOR.value,)]
- )
-
- def test_access_locations_requiring_hotspot_closing_the_time_tunnels_hammer_slot(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_HAMMER_SLOT.value,)]
- )
-
- def test_access_locations_requiring_hotspot_closing_the_time_tunnels_lever(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_CLOSING_THE_TIME_TUNNELS_LEVER.value,)]
- )
-
- def test_access_locations_requiring_hotspot_cooking_pot(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BROG_DO_GOOD.value,
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_COOKING_POT.value,)]
- )
-
- def test_access_locations_requiring_hotspot_dented_locker(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.CRISIS_AVERTED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_DENTED_LOCKER.value,)]
- )
-
- def test_access_locations_requiring_hotspot_dirt_mound(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.HEY_FREE_DIRT.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_DIRT_MOUND.value,)]
- )
-
- def test_access_locations_requiring_hotspot_dock_winch(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.HELP_ME_CANT_BREATHE.value,
- ZorkGrandInquisitorLocations.NO_BONDAGE.value,
- ZorkGrandInquisitorLocations.YOU_WANT_A_PIECE_OF_ME_DOCK_BOY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_DOCK_WINCH.value,)]
- )
-
- def test_access_locations_requiring_hotspot_dragon_claw(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_DRAGON_CLAW.value,)]
- )
-
- def test_access_locations_requiring_hotspot_dragon_nostrils(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_DRAGON_NOSTRILS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_dungeon_masters_lair_entrance(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_DUNGEON_MASTERS_LAIR_ENTRANCE.value,)]
- )
-
- def test_access_locations_requiring_hotspot_flood_control_buttons(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value,
- ZorkGrandInquisitorEvents.DAM_DESTROYED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_BUTTONS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_flood_control_doors(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value,
- ZorkGrandInquisitorEvents.DAM_DESTROYED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_FLOOD_CONTROL_DOORS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_frozen_treat_machine_coin_slot(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_COIN_SLOT.value,)]
- )
-
- def test_access_locations_requiring_hotspot_frozen_treat_machine_doors(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_FROZEN_TREAT_MACHINE_DOORS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_glass_case(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.IN_CASE_OF_ADVENTURE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_GLASS_CASE.value,)]
- )
-
- def test_access_locations_requiring_hotspot_grand_inquisitor_doll(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.ARREST_THE_VANDAL.value,
- ZorkGrandInquisitorLocations.DEATH_ARRESTED_WITH_JACK.value,
- ZorkGrandInquisitorLocations.FIRE_FIRE.value,
- ZorkGrandInquisitorLocations.PLANETFALL.value,
- ZorkGrandInquisitorLocations.TALK_TO_ME_GRAND_INQUISITOR.value,
- ZorkGrandInquisitorEvents.LANTERN_DALBOZ_ACCESSIBLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_GRAND_INQUISITOR_DOLL.value,)]
- )
-
- def test_access_locations_requiring_hotspot_gue_tech_door(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_DOOR.value,)]
- )
-
- def test_access_locations_requiring_hotspot_gue_tech_grass(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_GUE_TECH_GRASS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_hades_phone_buttons(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER.value,
- ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value,
- ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value,
- ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY.value,
- ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT.value,
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value,
- ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value,
- ZorkGrandInquisitorEvents.CHARON_CALLED.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_BUTTONS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_hades_phone_receiver(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER.value,
- ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value,
- ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value,
- ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY.value,
- ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT.value,
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value,
- ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value,
- ZorkGrandInquisitorEvents.CHARON_CALLED.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_HADES_PHONE_RECEIVER.value,)]
- )
-
- def test_access_locations_requiring_hotspot_harry(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_HARRY.value,)]
- )
-
- def test_access_locations_requiring_hotspot_harrys_ashtray(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.NOTHIN_LIKE_A_GOOD_STOGIE.value,
- ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_HARRYS_ASHTRAY.value,)]
- )
-
- def test_access_locations_requiring_hotspot_harrys_bird_bath(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO.value,
- ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_HARRYS_BIRD_BATH.value,)]
- )
-
- def test_access_locations_requiring_hotspot_in_magic_we_trust_door(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_IN_MAGIC_WE_TRUST_DOOR.value,)]
- )
-
- def test_access_locations_requiring_hotspot_jacks_door(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.MEAD_LIGHT.value,
- ZorkGrandInquisitorLocations.NO_AUTOGRAPHS.value,
- ZorkGrandInquisitorLocations.THATS_A_ROPE.value,
- ZorkGrandInquisitorLocations.WHAT_ARE_YOU_STUPID.value,
- ZorkGrandInquisitorEvents.CIGAR_ACCESSIBLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_JACKS_DOOR.value,)]
- )
-
- def test_access_locations_requiring_hotspot_loudspeaker_volume_buttons(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.THATS_THE_SPIRIT.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_LOUDSPEAKER_VOLUME_BUTTONS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_mailbox_door(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value,
- ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_DOOR.value,)]
- )
-
- def test_access_locations_requiring_hotspot_mailbox_flag(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DOOOOOOWN.value,
- ZorkGrandInquisitorLocations.DOWN.value,
- ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value,
- ZorkGrandInquisitorLocations.UP.value,
- ZorkGrandInquisitorLocations.UUUUUP.value,
- ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_MAILBOX_FLAG.value,)]
- )
-
- def test_access_locations_requiring_hotspot_mirror(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG.value,
- ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF.value,
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_MIRROR.value,)]
- )
-
- def test_access_locations_requiring_hotspot_monastery_vent(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY.value,
- ZorkGrandInquisitorLocations.HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING.value,
- ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.PERMASEAL.value,
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value,
- ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value,
- ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value,
- ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_MONASTERY_VENT.value,)]
- )
-
- def test_access_locations_requiring_hotspot_mossy_grate(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_MOSSY_GRATE.value,)]
- )
-
- def test_access_locations_requiring_hotspot_port_foozle_past_tavern_door(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_PORT_FOOZLE_PAST_TAVERN_DOOR.value,)]
- )
-
- def test_access_locations_requiring_hotspot_purple_words(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.A_SMALLWAY.value,
- ZorkGrandInquisitorLocations.CRISIS_AVERTED.value,
- ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_PURPLE_WORDS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_quelbee_hive(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_QUELBEE_HIVE.value,)]
- )
-
- def test_access_locations_requiring_hotspot_rope_bridge(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value,
- ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value,
- ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value,
- ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value,
- ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS.value,
- ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value,
- ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value,
- ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_ROPE_BRIDGE.value,)]
- )
-
- def test_access_locations_requiring_hotspot_skull_cage(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_SKULL_CAGE.value,)]
- )
-
- def test_access_locations_requiring_hotspot_snapdragon(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BONK.value,
- ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY.value,
- ZorkGrandInquisitorLocations.PROZORKED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_SNAPDRAGON.value,)]
- )
-
- def test_access_locations_requiring_hotspot_soda_machine_buttons(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_BUTTONS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_soda_machine_coin_slot(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_SODA_MACHINE_COIN_SLOT.value,)]
- )
-
- def test_access_locations_requiring_hotspot_souvenir_coin_slot(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.SOUVENIR.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_SOUVENIR_COIN_SLOT.value,)]
- )
-
- def test_access_locations_requiring_hotspot_spell_checker(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value,
- ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value,
- ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value,
- ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value,
- ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value,
- ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_SPELL_CHECKER.value,)]
- )
-
- def test_access_locations_requiring_hotspot_spell_lab_chasm(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value,
- ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value,
- ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value,
- ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value,
- ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value,
- ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value,
- ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_SPELL_LAB_CHASM.value,)]
- )
-
- def test_access_locations_requiring_hotspot_spring_mushroom(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BOING_BOING_BOING.value,
- ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value,
- ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED.value,
- ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_SPRING_MUSHROOM.value,)]
- )
-
- def test_access_locations_requiring_hotspot_student_id_machine(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_STUDENT_ID_MACHINE.value,)]
- )
-
- def test_access_locations_requiring_hotspot_subway_token_slot(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_SUBWAY_TOKEN_SLOT.value,)]
- )
-
- def test_access_locations_requiring_hotspot_tavern_fly(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_TAVERN_FLY.value,)]
- )
-
- def test_access_locations_requiring_hotspot_totemizer_switch(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value,
- ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value,
- ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value,
- ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_SWITCH.value,)]
- )
-
- def test_access_locations_requiring_hotspot_totemizer_wheels(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value,
- ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value,
- ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value,
- ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_TOTEMIZER_WHEELS.value,)]
- )
-
- def test_access_locations_requiring_hotspot_well(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.ALARM_SYSTEM_IS_DOWN.value,
- ZorkGrandInquisitorLocations.ARTIFACTS_EXPLAINED.value,
- ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER.value,
- ZorkGrandInquisitorLocations.A_LETTER_FROM_THE_WHITE_HOUSE.value,
- ZorkGrandInquisitorLocations.A_SMALLWAY.value,
- ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY.value,
- ZorkGrandInquisitorLocations.BEBURTT_DEMYSTIFIED.value,
- ZorkGrandInquisitorLocations.BETTER_SPELL_MANUFACTURING_IN_UNDER_10_MINUTES.value,
- ZorkGrandInquisitorLocations.BOING_BOING_BOING.value,
- ZorkGrandInquisitorLocations.BONK.value,
- ZorkGrandInquisitorLocations.BRAVE_SOULS_WANTED.value,
- ZorkGrandInquisitorLocations.BROG_DO_GOOD.value,
- ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value,
- ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value,
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value,
- ZorkGrandInquisitorLocations.CASTLE_WATCHING_A_FIELD_GUIDE.value,
- ZorkGrandInquisitorLocations.CAVES_NOTES.value,
- ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value,
- ZorkGrandInquisitorLocations.CRISIS_AVERTED.value,
- ZorkGrandInquisitorLocations.DEATH_ATTACKED_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.DEATH_CLIMBED_OUT_OF_THE_WELL.value,
- ZorkGrandInquisitorLocations.DEATH_EATEN_BY_A_GRUE.value,
- ZorkGrandInquisitorLocations.DEATH_JUMPED_IN_BOTTOMLESS_PIT.value,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.DEATH_OUTSMARTED_BY_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.DEATH_SLICED_UP_BY_THE_INVISIBLE_GUARD.value,
- ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED.value,
- ZorkGrandInquisitorLocations.DEATH_TOTEMIZED_PERMANENTLY.value,
- ZorkGrandInquisitorLocations.DEATH_YOURE_NOT_CHARON.value,
- ZorkGrandInquisitorLocations.DEATH_ZORK_ROCKS_EXPLODED.value,
- ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER.value,
- ZorkGrandInquisitorLocations.DESPERATELY_SEEKING_TUTOR.value,
- ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY.value,
- ZorkGrandInquisitorLocations.DOOOOOOWN.value,
- ZorkGrandInquisitorLocations.DOWN.value,
- ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.DUNCE_LOCKER.value,
- ZorkGrandInquisitorLocations.EGGPLANTS.value,
- ZorkGrandInquisitorLocations.EMERGENCY_MAGICATRONIC_MESSAGE.value,
- ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP.value,
- ZorkGrandInquisitorLocations.FAT_LOT_OF_GOOD_THATLL_DO_YA.value,
- ZorkGrandInquisitorLocations.FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE.value,
- ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value,
- ZorkGrandInquisitorLocations.FROBUARY_3_UNDERGROUNDHOG_DAY.value,
- ZorkGrandInquisitorLocations.GETTING_SOME_CHANGE.value,
- ZorkGrandInquisitorLocations.GUE_TECH_DEANS_LIST.value,
- ZorkGrandInquisitorLocations.GUE_TECH_ENTRANCE_EXAM.value,
- ZorkGrandInquisitorLocations.GUE_TECH_HEALTH_MEMO.value,
- ZorkGrandInquisitorLocations.GUE_TECH_MAGEMEISTERS.value,
- ZorkGrandInquisitorLocations.HAVE_A_HELL_OF_A_DAY.value,
- ZorkGrandInquisitorLocations.HELLO_THIS_IS_SHONA_FROM_GURTH_PUBLISHING.value,
- ZorkGrandInquisitorLocations.HEY_FREE_DIRT.value,
- ZorkGrandInquisitorLocations.HI_MY_NAME_IS_DOUG.value,
- ZorkGrandInquisitorLocations.HMMM_INFORMATIVE_YET_DEEPLY_DISTURBING.value,
- ZorkGrandInquisitorLocations.HOLD_ON_FOR_AN_IMPORTANT_MESSAGE.value,
- ZorkGrandInquisitorLocations.HOW_TO_HYPNOTIZE_YOURSELF.value,
- ZorkGrandInquisitorLocations.HOW_TO_WIN_AT_DOUBLE_FANUCCI.value,
- ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY.value,
- ZorkGrandInquisitorLocations.I_SPIT_ON_YOUR_FILTHY_COINAGE.value,
- ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value,
- ZorkGrandInquisitorLocations.INTO_THE_FOLIAGE.value,
- ZorkGrandInquisitorLocations.IN_CASE_OF_ADVENTURE.value,
- ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST.value,
- ZorkGrandInquisitorLocations.INVISIBLE_FLOWERS.value,
- ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE.value,
- ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value,
- ZorkGrandInquisitorLocations.LIT_SUNFLOWERS.value,
- ZorkGrandInquisitorLocations.MAGIC_FOREVER.value,
- ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value,
- ZorkGrandInquisitorLocations.MAKE_LOVE_NOT_WAR.value,
- ZorkGrandInquisitorLocations.MIKES_PANTS.value,
- ZorkGrandInquisitorLocations.MUSHROOM_HAMMERED.value,
- ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value,
- ZorkGrandInquisitorLocations.NATURAL_AND_SUPERNATURAL_CREATURES_OF_QUENDOR.value,
- ZorkGrandInquisitorLocations.NOOOOOOOOOOOOO.value,
- ZorkGrandInquisitorLocations.NOTHIN_LIKE_A_GOOD_STOGIE.value,
- ZorkGrandInquisitorLocations.NOW_YOU_LOOK_LIKE_US_WHICH_IS_AN_IMPROVEMENT.value,
- ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value,
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.OH_WOW_TALK_ABOUT_DEJA_VU.value,
- ZorkGrandInquisitorLocations.OPEN_THE_GATES_OF_HELL.value,
- ZorkGrandInquisitorLocations.OUTSMART_THE_QUELBEES.value,
- ZorkGrandInquisitorLocations.PERMASEAL.value,
- ZorkGrandInquisitorLocations.PLEASE_DONT_THROCK_THE_GRASS.value,
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.PROZORKED.value,
- ZorkGrandInquisitorLocations.REASSEMBLE_SNAVIG.value,
- ZorkGrandInquisitorLocations.RESTOCKED_ON_GRUESDAY.value,
- ZorkGrandInquisitorLocations.RIGHT_HELLO_YES_UH_THIS_IS_SNEFFLE.value,
- ZorkGrandInquisitorLocations.RIGHT_UH_SORRY_ITS_ME_AGAIN_SNEFFLE.value,
- ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value,
- ZorkGrandInquisitorLocations.SOUVENIR.value,
- ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.SUCKING_ROCKS.value,
- ZorkGrandInquisitorLocations.TAMING_YOUR_SNAPDRAGON.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.THATS_IT_JUST_KEEP_HITTING_THOSE_BUTTONS.value,
- ZorkGrandInquisitorLocations.THATS_STILL_A_ROPE.value,
- ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value,
- ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value,
- ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value,
- ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value,
- ZorkGrandInquisitorLocations.THE_UNDERGROUND_UNDERGROUND.value,
- ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value,
- ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED.value,
- ZorkGrandInquisitorLocations.TIME_TRAVEL_FOR_DUMMIES.value,
- ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value,
- ZorkGrandInquisitorLocations.UMBRELLA_FLOWERS.value,
- ZorkGrandInquisitorLocations.UP.value,
- ZorkGrandInquisitorLocations.USELESS_BUT_FUN.value,
- ZorkGrandInquisitorLocations.UUUUUP.value,
- ZorkGrandInquisitorLocations.VOYAGE_OF_CAPTAIN_ZAHAB.value,
- ZorkGrandInquisitorLocations.WANT_SOME_RYE_COURSE_YA_DO.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.WOW_IVE_NEVER_GONE_INSIDE_HIM_BEFORE.value,
- ZorkGrandInquisitorLocations.YAD_GOHDNUORGREDNU_3_YRAUBORF.value,
- ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER.value,
- ZorkGrandInquisitorLocations.YOU_GAINED_86_EXPERIENCE_POINTS.value,
- ZorkGrandInquisitorLocations.YOUR_PUNY_WEAPONS_DONT_PHASE_ME_BABY.value,
- ZorkGrandInquisitorEvents.CHARON_CALLED.value,
- ZorkGrandInquisitorEvents.DAM_DESTROYED.value,
- ZorkGrandInquisitorEvents.DOOR_DRANK_MEAD.value,
- ZorkGrandInquisitorEvents.DOOR_SMOKED_CIGAR.value,
- ZorkGrandInquisitorEvents.DALBOZ_LOCKER_OPENABLE.value,
- ZorkGrandInquisitorEvents.DUNCE_LOCKER_OPENABLE.value,
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_OBIDIL.value,
- ZorkGrandInquisitorEvents.HAS_REPAIRABLE_SNAVIG.value,
- ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value,
- ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value,
- ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value,
- ZorkGrandInquisitorEvents.KNOWS_YASTARD.value,
- ZorkGrandInquisitorEvents.ROPE_GLORFABLE.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value,
- ZorkGrandInquisitorEvents.ZORK_ROCKS_ACTIVATED.value,
- ZorkGrandInquisitorEvents.ZORK_ROCKS_SUCKABLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.HOTSPOT_WELL.value,)]
- )
-
- def test_access_locations_requiring_spell_glorf(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorEvents.ROPE_GLORFABLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SPELL_GLORF.value,)]
- )
-
- def test_access_locations_requiring_spell_golgatem(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DENIED_BY_THE_LAKE_MONSTER.value,
- ZorkGrandInquisitorLocations.I_LIKE_YOUR_STYLE.value,
- ZorkGrandInquisitorLocations.IMBUE_BEBURTT.value,
- ZorkGrandInquisitorLocations.OBIDIL_DRIED_UP.value,
- ZorkGrandInquisitorLocations.SNAVIG_REPAIRED.value,
- ZorkGrandInquisitorLocations.USELESS_BUT_FUN.value,
- ZorkGrandInquisitorEvents.KNOWS_BEBURTT.value,
- ZorkGrandInquisitorEvents.KNOWS_OBIDIL.value,
- ZorkGrandInquisitorEvents.KNOWS_SNAVIG.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SPELL_GOLGATEM.value,)]
- )
-
- def test_access_locations_requiring_spell_igram(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.A_SMALLWAY.value,
- ZorkGrandInquisitorLocations.CRISIS_AVERTED.value,
- ZorkGrandInquisitorLocations.DEATH_STEPPED_INTO_THE_INFINITE.value,
- ZorkGrandInquisitorLocations.FAT_LOT_OF_GOOD_THATLL_DO_YA.value,
- ZorkGrandInquisitorLocations.INVISIBLE_FLOWERS.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SPELL_IGRAM.value,)]
- )
-
- def test_access_locations_requiring_spell_kendall(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BEBURTT_DEMYSTIFIED.value,
- ZorkGrandInquisitorLocations.ENJOY_YOUR_TRIP.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SPELL_KENDALL.value,)]
- )
-
- def test_access_locations_requiring_spell_narwile(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BROG_DO_GOOD.value,
- ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value,
- ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value,
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorLocations.DOOOOOOWN.value,
- ZorkGrandInquisitorLocations.DOWN.value,
- ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL.value,
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value,
- ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value,
- ZorkGrandInquisitorLocations.UP.value,
- ZorkGrandInquisitorLocations.UUUUUP.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorLocations.WHITE_HOUSE_TIME_TUNNEL.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ZorkGrandInquisitorEvents.WHITE_HOUSE_LETTER_MAILABLE.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SPELL_NARWILE.value,)]
- )
-
- def test_access_locations_requiring_spell_rezrov(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.IN_MAGIC_WE_TRUST.value,
- ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value,
- ZorkGrandInquisitorLocations.YOU_DONT_GO_MESSING_WITH_A_MANS_ZIPPER.value,
- ZorkGrandInquisitorEvents.DAM_DESTROYED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SPELL_REZROV.value,)]
- )
-
- def test_access_locations_requiring_spell_throck(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY.value,
- ZorkGrandInquisitorLocations.DEATH_THROCKED_THE_GRASS.value,
- ZorkGrandInquisitorLocations.FLYING_SNAPDRAGON.value,
- ZorkGrandInquisitorLocations.I_DONT_THINK_YOU_WOULDVE_WANTED_THAT_TO_WORK_ANYWAY.value,
- ZorkGrandInquisitorLocations.LIT_SUNFLOWERS.value,
- ZorkGrandInquisitorLocations.THROCKED_MUSHROOM_HAMMERED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SPELL_THROCK.value,)]
- )
-
- def test_access_locations_requiring_subway_destination_flood_control_dam(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY.value,
- ZorkGrandInquisitorLocations.FLOOD_CONTROL_DAM_3_THE_NOT_REMOTELY_BORING_TALE.value,
- ZorkGrandInquisitorLocations.NATIONAL_TREASURE.value,
- ZorkGrandInquisitorLocations.SOUVENIR.value,
- ZorkGrandInquisitorLocations.USELESS_BUT_FUN.value,
- ZorkGrandInquisitorEvents.DAM_DESTROYED.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_FLOOD_CONTROL_DAM.value,)]
- )
-
- def test_access_locations_requiring_subway_destination_hades(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_HADES.value,)]
- )
-
- def test_access_locations_requiring_subway_destination_monastery(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.SUBWAY_DESTINATION_MONASTERY.value,)]
- )
-
- def test_access_locations_requiring_teleporter_destination_dm_lair(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_DM_LAIR.value,)]
- )
-
- def test_access_locations_requiring_teleporter_destination_gue_tech(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_GUE_TECH.value,)]
- )
-
- def test_access_locations_requiring_teleporter_destination_hades(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_HADES.value,)]
- )
-
- def test_access_locations_requiring_teleporter_destination_monastery(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_MONASTERY.value,)]
- )
-
- def test_access_locations_requiring_teleporter_destination_spell_lab(self) -> None:
- locations: List[str] = list()
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.TELEPORTER_DESTINATION_SPELL_LAB.value,)]
- )
-
- def test_access_locations_requiring_totemizer_destination_hall_of_inquisition(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.CLOSING_THE_TIME_TUNNELS.value,
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.PORT_FOOZLE_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.THE_ALCHEMICAL_DEBACLE.value,
- ZorkGrandInquisitorLocations.THE_ENDLESS_FIRE.value,
- ZorkGrandInquisitorLocations.THE_FLATHEADIAN_FUDGE_FIASCO.value,
- ZorkGrandInquisitorLocations.THE_PERILS_OF_MAGIC.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_HALL_OF_INQUISITION.value,)]
- )
-
- def test_access_locations_requiring_totemizer_destination_straight_to_hell(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.STRAIGHT_TO_HELL.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.TOTEMIZER_DESTINATION_STRAIGHT_TO_HELL.value,)]
- )
-
- def test_access_locations_requiring_totem_brog(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.BROG_DO_GOOD.value,
- ZorkGrandInquisitorLocations.BROG_EAT_ROCKS.value,
- ZorkGrandInquisitorLocations.BROG_KNOW_DUMB_THAT_DUMB.value,
- ZorkGrandInquisitorLocations.BROG_MUCH_BETTER_AT_THIS_GAME.value,
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL.value,
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.OH_VERY_FUNNY_GUYS.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value,
- ZorkGrandInquisitorLocations.UH_OH_BROG_CANT_SWIM.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.TOTEM_BROG.value,)]
- )
-
- def test_access_locations_requiring_totem_griff(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_SWALLOWED_BY_A_DRAGON.value,
- ZorkGrandInquisitorLocations.DOOOOOOWN.value,
- ZorkGrandInquisitorLocations.OH_DEAR_GOD_ITS_A_DRAGON.value,
- ZorkGrandInquisitorLocations.THAR_SHE_BLOWS.value,
- ZorkGrandInquisitorLocations.UUUUUP.value,
- ZorkGrandInquisitorLocations.WE_DONT_SERVE_YOUR_KIND_HERE.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.TOTEM_GRIFF.value,)]
- )
-
- def test_access_locations_requiring_totem_lucy(self) -> None:
- locations: List[str] = [
- ZorkGrandInquisitorLocations.DEATH_LOST_GAME_OF_STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.DOWN.value,
- ZorkGrandInquisitorLocations.STRIP_GRUE_FIRE_WATER.value,
- ZorkGrandInquisitorLocations.THIS_DOESNT_LOOK_ANYTHING_LIKE_THE_BROCHURE.value,
- ZorkGrandInquisitorLocations.UP.value,
- ZorkGrandInquisitorLocations.WE_GOT_A_HIGH_ROLLER.value,
- ZorkGrandInquisitorEvents.VICTORY.value,
- ]
-
- self.assertAccessDependency(
- locations, [(ZorkGrandInquisitorItems.TOTEM_LUCY.value,)]
- )
diff --git a/worlds/zork_grand_inquisitor/test/test_data_funcs.py b/worlds/zork_grand_inquisitor/test/test_data_funcs.py
deleted file mode 100644
index 9d8d5a4ba356..000000000000
--- a/worlds/zork_grand_inquisitor/test/test_data_funcs.py
+++ /dev/null
@@ -1,132 +0,0 @@
-import unittest
-
-from ..data_funcs import location_access_rule_for, entrance_access_rule_for
-from ..enums import ZorkGrandInquisitorLocations, ZorkGrandInquisitorRegions
-
-
-class DataFuncsTest(unittest.TestCase):
- def test_location_access_rule_for(self) -> None:
- # No Requirements
- self.assertEqual(
- "lambda state: True",
- location_access_rule_for(ZorkGrandInquisitorLocations.ALARM_SYSTEM_IS_DOWN, 1),
- )
-
- # Single Item Requirement
- self.assertEqual(
- 'lambda state: state.has("Sword", 1)',
- location_access_rule_for(ZorkGrandInquisitorLocations.DONT_EVEN_START_WITH_US_SPARKY, 1),
- )
-
- self.assertEqual(
- 'lambda state: state.has("Spell: NARWILE", 1)',
- location_access_rule_for(ZorkGrandInquisitorLocations.DRAGON_ARCHIPELAGO_TIME_TUNNEL, 1),
- )
-
- # Single Event Requirement
- self.assertEqual(
- 'lambda state: state.has("Event: Knows OBIDIL", 1)',
- location_access_rule_for(ZorkGrandInquisitorLocations.A_BIG_FAT_SASSY_2_HEADED_MONSTER, 1),
- )
-
- self.assertEqual(
- 'lambda state: state.has("Event: Dunce Locker Openable", 1)',
- location_access_rule_for(ZorkGrandInquisitorLocations.BETTER_SPELL_MANUFACTURING_IN_UNDER_10_MINUTES, 1),
- )
-
- # Multiple Item Requirements
- self.assertEqual(
- 'lambda state: state.has("Hotspot: Purple Words", 1) and state.has("Spell: IGRAM", 1)',
- location_access_rule_for(ZorkGrandInquisitorLocations.A_SMALLWAY, 1),
- )
-
- self.assertEqual(
- 'lambda state: state.has("Hotspot: Mossy Grate", 1) and state.has("Spell: THROCK", 1)',
- location_access_rule_for(ZorkGrandInquisitorLocations.BEAUTIFUL_THATS_PLENTY, 1),
- )
-
- # Multiple Item Requirements OR
- self.assertEqual(
- 'lambda state: (state.has("Totem: Griff", 1) or state.has("Totem: Lucy", 1)) and state.has("Hotspot: Mailbox Door", 1) and state.has("Hotspot: Mailbox Flag", 1)',
- location_access_rule_for(ZorkGrandInquisitorLocations.MAILED_IT_TO_HELL, 1),
- )
-
- # Multiple Mixed Requirements
- self.assertEqual(
- 'lambda state: state.has("Event: Cigar Accessible", 1) and state.has("Hotspot: Grand Inquisitor Doll", 1)',
- location_access_rule_for(ZorkGrandInquisitorLocations.ARREST_THE_VANDAL, 1),
- )
-
- self.assertEqual(
- 'lambda state: state.has("Sword", 1) and state.has("Event: Rope GLORFable", 1) and state.has("Hotspot: Monastery Vent", 1)',
- location_access_rule_for(ZorkGrandInquisitorLocations.I_HOPE_YOU_CAN_CLIMB_UP_THERE, 1),
- )
-
- def test_entrance_access_rule_for(self) -> None:
- # No Requirements
- self.assertEqual(
- "lambda state: True",
- entrance_access_rule_for(
- ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.PORT_FOOZLE, 1
- ),
- )
-
- self.assertEqual(
- "lambda state: True",
- entrance_access_rule_for(
- ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.CROSSROADS, 1
- ),
- )
-
- # Single Requirement
- self.assertEqual(
- 'lambda state: (state.has("Map", 1))',
- entrance_access_rule_for(
- ZorkGrandInquisitorRegions.GUE_TECH_OUTSIDE, ZorkGrandInquisitorRegions.CROSSROADS, 1
- ),
- )
-
- self.assertEqual(
- 'lambda state: (state.has("Map", 1))',
- entrance_access_rule_for(
- ZorkGrandInquisitorRegions.HADES_SHORE, ZorkGrandInquisitorRegions.CROSSROADS, 1
- ),
- )
-
- # Multiple Requirements AND
- self.assertEqual(
- 'lambda state: (state.has("Spell: REZROV", 1) and state.has("Hotspot: In Magic We Trust Door", 1))',
- entrance_access_rule_for(
- ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.GUE_TECH, 1
- ),
- )
-
- self.assertEqual(
- 'lambda state: (state.has("Event: Door Smoked Cigar", 1) and state.has("Event: Door Drank Mead", 1))',
- entrance_access_rule_for(
- ZorkGrandInquisitorRegions.DM_LAIR, ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, 1
- ),
- )
-
- self.assertEqual(
- 'lambda state: (state.has("Hotspot: Closet Door", 1) and state.has("Spell: NARWILE", 1) and state.has("Event: Knows YASTARD", 1))',
- entrance_access_rule_for(
- ZorkGrandInquisitorRegions.DM_LAIR_INTERIOR, ZorkGrandInquisitorRegions.WHITE_HOUSE, 1
- ),
- )
-
- # Multiple Requirements AND + OR
- self.assertEqual(
- 'lambda state: (state.has("Sword", 1) and state.has("Hotspot: Dungeon Master\'s Lair Entrance", 1)) or (state.has("Map", 1) and state.has("Teleporter Destination: Dungeon Master\'s Lair", 1))',
- entrance_access_rule_for(
- ZorkGrandInquisitorRegions.CROSSROADS, ZorkGrandInquisitorRegions.DM_LAIR, 1
- ),
- )
-
- # Multiple Requirements Regions
- self.assertEqual(
- 'lambda state: (state.has("Griff\'s Air Pump", 1) and state.has("Griff\'s Inflatable Raft", 1) and state.has("Griff\'s Inflatable Sea Captain", 1) and state.has("Hotspot: Dragon Nostrils", 1) and state.has("Griff\'s Dragon Tooth", 1) and state.can_reach("Port Foozle Past - Tavern", "Region", 1) and state.has("Lucy\'s Playing Card: 1 Pip", 1) and state.has("Lucy\'s Playing Card: 2 Pips", 1) and state.has("Lucy\'s Playing Card: 3 Pips", 1) and state.has("Lucy\'s Playing Card: 4 Pips", 1) and state.has("Hotspot: Tavern Fly", 1) and state.has("Hotspot: Alpine\'s Quandry Card Slots", 1) and state.can_reach("White House", "Region", 1) and state.has("Totem: Brog", 1) and state.has("Brog\'s Flickering Torch", 1) and state.has("Brog\'s Grue Egg", 1) and state.has("Hotspot: Cooking Pot", 1) and state.has("Brog\'s Plank", 1) and state.has("Hotspot: Skull Cage", 1))',
- entrance_access_rule_for(
- ZorkGrandInquisitorRegions.DRAGON_ARCHIPELAGO_DRAGON, ZorkGrandInquisitorRegions.ENDGAME, 1
- ),
- )
diff --git a/worlds/zork_grand_inquisitor/test/test_locations.py b/worlds/zork_grand_inquisitor/test/test_locations.py
deleted file mode 100644
index fa576dd510dc..000000000000
--- a/worlds/zork_grand_inquisitor/test/test_locations.py
+++ /dev/null
@@ -1,49 +0,0 @@
-from typing import Dict, Set
-
-from . import ZorkGrandInquisitorTestBase
-
-from ..data_funcs import location_names_to_location, locations_with_tag
-from ..enums import ZorkGrandInquisitorLocations, ZorkGrandInquisitorTags
-
-
-class LocationsTestNoDeathsanity(ZorkGrandInquisitorTestBase):
- options = {
- "deathsanity": "false",
- }
-
- def test_correct_locations_exist(self) -> None:
- expected_locations: Set[ZorkGrandInquisitorLocations] = locations_with_tag(
- ZorkGrandInquisitorTags.CORE
- )
-
- self._assert_expected_locations_exist(expected_locations)
-
- def _assert_expected_locations_exist(self, expected_locations: Set[ZorkGrandInquisitorLocations]) -> None:
- location_name_to_location: Dict[str, ZorkGrandInquisitorLocations] = location_names_to_location()
-
- for location_object in self.multiworld.get_locations(1):
- location: ZorkGrandInquisitorLocations = location_name_to_location.get(
- location_object.name
- )
-
- if location is None:
- continue
-
- self.assertIn(location, expected_locations)
-
- expected_locations.remove(location)
-
- self.assertEqual(0, len(expected_locations))
-
-
-class LocationsTestDeathsanity(LocationsTestNoDeathsanity):
- options = {
- "deathsanity": "true",
- }
-
- def test_correct_locations_exist(self) -> None:
- expected_locations: Set[ZorkGrandInquisitorLocations] = (
- locations_with_tag(ZorkGrandInquisitorTags.CORE) | locations_with_tag(ZorkGrandInquisitorTags.DEATHSANITY)
- )
-
- self._assert_expected_locations_exist(expected_locations)
diff --git a/worlds/zork_grand_inquisitor/world.py b/worlds/zork_grand_inquisitor/world.py
deleted file mode 100644
index 3698ad7f8960..000000000000
--- a/worlds/zork_grand_inquisitor/world.py
+++ /dev/null
@@ -1,205 +0,0 @@
-from typing import Any, Dict, List, Tuple
-
-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.region_data import region_data
-
-from .data_funcs import (
- item_names_to_id,
- item_names_to_item,
- location_names_to_id,
- item_groups,
- items_with_tag,
- location_groups,
- locations_by_region,
- location_access_rule_for,
- entrance_access_rule_for,
-)
-
-from .enums import (
- ZorkGrandInquisitorEvents,
- ZorkGrandInquisitorItems,
- ZorkGrandInquisitorLocations,
- ZorkGrandInquisitorRegions,
- ZorkGrandInquisitorTags,
-)
-
-from .options import ZorkGrandInquisitorOptions
-
-
-class ZorkGrandInquisitorItem(Item):
- game = "Zork Grand Inquisitor"
-
-
-class ZorkGrandInquisitorLocation(Location):
- game = "Zork Grand Inquisitor"
-
-
-class ZorkGrandInquisitorWebWorld(WebWorld):
- theme: str = "stone"
-
- tutorials: List[Tutorial] = [
- Tutorial(
- "Multiworld Setup Guide",
- "A guide to setting up the Zork Grand Inquisitor randomizer connected to an Archipelago Multiworld",
- "English",
- "setup_en.md",
- "setup/en",
- ["Serpent.AI"],
- )
- ]
-
-
-class ZorkGrandInquisitorWorld(World):
- """
- Zork: Grand Inquisitor is a 1997 point-and-click adventure game for PC.
- Magic has been banned from the great Underground Empire of Zork. By edict of the Grand Inquisitor Mir Yannick, the
- Empire has been sealed off and the practice of mystic arts declared punishable by "Totemization" (a very bad thing).
- The only way to restore magic to the kingdom is to find three hidden artifacts: The Coconut of Quendor, The Cube of
- Foundation, and The Skull of Yoruk.
- """
-
- options_dataclass = ZorkGrandInquisitorOptions
- options: ZorkGrandInquisitorOptions
-
- game = "Zork Grand Inquisitor"
-
- item_name_to_id = item_names_to_id()
- location_name_to_id = location_names_to_id()
-
- item_name_groups = item_groups()
- location_name_groups = location_groups()
-
- required_client_version: Tuple[int, int, int] = (0, 4, 4)
-
- web = ZorkGrandInquisitorWebWorld()
-
- filler_item_names: List[str] = item_groups()["Filler"]
- item_name_to_item: Dict[str, ZorkGrandInquisitorItems] = item_names_to_item()
-
- def create_regions(self) -> None:
- deathsanity: bool = bool(self.options.deathsanity)
-
- region_mapping: Dict[ZorkGrandInquisitorRegions, Region] = dict()
-
- region_enum_item: ZorkGrandInquisitorRegions
- for region_enum_item in region_data.keys():
- 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_enum_item: ZorkGrandInquisitorRegions
- region: Region
- for region_enum_item, region in region_mapping.items():
- regions_locations: List[ZorkGrandInquisitorLocations] = region_locations_mapping[region_enum_item]
-
- # Locations
- location_enum_item: ZorkGrandInquisitorLocations
- for location_enum_item in regions_locations:
- data: ZorkGrandInquisitorLocationData = location_data[location_enum_item]
-
- location: ZorkGrandInquisitorLocation = ZorkGrandInquisitorLocation(
- self.player,
- location_enum_item.value,
- data.archipelago_id,
- region_mapping[data.region],
- )
-
- if isinstance(location_enum_item, ZorkGrandInquisitorEvents):
- location.place_locked_item(
- ZorkGrandInquisitorItem(
- data.event_item_name,
- ItemClassification.progression,
- None,
- self.player,
- )
- )
-
- location_access_rule: str = location_access_rule_for(location_enum_item, self.player)
-
- if location_access_rule != "lambda state: True":
- location.access_rule = eval(location_access_rule)
-
- region.locations.append(location)
-
- # Connections
- region_exit: ZorkGrandInquisitorRegions
- for region_exit in region_data[region_enum_item].exits or tuple():
- entrance_access_rule: str = entrance_access_rule_for(region_enum_item, region_exit, self.player)
-
- if entrance_access_rule == "lambda state: True":
- region.connect(region_mapping[region_exit])
- else:
- region.connect(region_mapping[region_exit], rule=eval(entrance_access_rule))
-
- self.multiworld.regions.append(region)
-
- 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)
-
- 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
-
- item_pool.append(self.create_item(item.value))
-
- total_locations: int = len(self.multiworld.get_unfilled_locations(self.player))
- item_pool += [self.create_filler() for _ in range(total_locations - len(item_pool))]
-
- 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
-
- 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 sorted(items_with_tag(ZorkGrandInquisitorTags.HOTSPOT), key=lambda item: item.name):
- self.multiworld.push_precollected(self.create_item(item.value))
-
- def create_item(self, name: str) -> ZorkGrandInquisitorItem:
- data: ZorkGrandInquisitorItemData = item_data[self.item_name_to_item[name]]
-
- return ZorkGrandInquisitorItem(
- name,
- data.classification,
- data.archipelago_id,
- self.player,
- )
-
- 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(
- "goal",
- "quick_port_foozle",
- "start_with_hotspot_items",
- "deathsanity",
- "grant_missable_location_checks",
- )
-
- def get_filler_item_name(self) -> str:
- return self.random.choice(self.filler_item_names)