diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4e173e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +ignore/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e9e2b0d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +## 0.1.0 + +Initial release + +* Items: Tracking support for progression items +* Locations: Tracking support for all locations, including deathsanity +* Archipelago Settings: Tracking support for Archipelago goal and settings +* Logic: Location visibility logic based on Archipelago settings +* Logic: Location accessibility logic based on game state +* Autotracking: Support for automatic tracking of items, locations and settings when connected to an Archipelago server \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8846409 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Zork Grand Inquisitor Archipelago Tracker + +Zork Grand Inquisitor [Archipelago](https://archipelago.gg/) tracker pack for [PopTracker](https://github.com/black-sliver/PopTracker/). + +![Zork Grand Inquisition Archipelago Tracker](images/docs/screenshot.png) \ No newline at end of file diff --git a/images/docs/screenshot.png b/images/docs/screenshot.png new file mode 100644 index 0000000..db89fa9 Binary files /dev/null and b/images/docs/screenshot.png differ diff --git a/images/items/blank_scroll_box_access.png b/images/items/blank_scroll_box_access.png new file mode 100644 index 0000000..48131d9 Binary files /dev/null and b/images/items/blank_scroll_box_access.png differ diff --git a/images/items/hammer.png b/images/items/hammer.png new file mode 100644 index 0000000..0305650 Binary files /dev/null and b/images/items/hammer.png differ diff --git a/images/items/hungus_lard.png b/images/items/hungus_lard.png new file mode 100644 index 0000000..e0c82df Binary files /dev/null and b/images/items/hungus_lard.png differ diff --git a/images/items/lantern.png b/images/items/lantern.png new file mode 100644 index 0000000..91af828 Binary files /dev/null and b/images/items/lantern.png differ diff --git a/images/items/large_telegraph_hammer.png b/images/items/large_telegraph_hammer.png new file mode 100644 index 0000000..ceb11d0 Binary files /dev/null and b/images/items/large_telegraph_hammer.png differ diff --git a/images/items/map.png b/images/items/map.png new file mode 100644 index 0000000..5c27655 Binary files /dev/null and b/images/items/map.png differ diff --git a/images/items/mead_light.png b/images/items/mead_light.png new file mode 100644 index 0000000..d1e6620 Binary files /dev/null and b/images/items/mead_light.png differ diff --git a/images/items/old_scratch_card.png b/images/items/old_scratch_card.png new file mode 100644 index 0000000..aff590a Binary files /dev/null and b/images/items/old_scratch_card.png differ diff --git a/images/items/perma_suck_machine.png b/images/items/perma_suck_machine.png new file mode 100644 index 0000000..c683678 Binary files /dev/null and b/images/items/perma_suck_machine.png differ diff --git a/images/items/plastic_six_pack_holder.png b/images/items/plastic_six_pack_holder.png new file mode 100644 index 0000000..e97910a Binary files /dev/null and b/images/items/plastic_six_pack_holder.png differ diff --git a/images/items/pouch_of_zorkmids.png b/images/items/pouch_of_zorkmids.png new file mode 100644 index 0000000..74026a9 Binary files /dev/null and b/images/items/pouch_of_zorkmids.png differ diff --git a/images/items/prozork_tablet.png b/images/items/prozork_tablet.png new file mode 100644 index 0000000..f7fe719 Binary files /dev/null and b/images/items/prozork_tablet.png differ diff --git a/images/items/rope.png b/images/items/rope.png new file mode 100644 index 0000000..99602f5 Binary files /dev/null and b/images/items/rope.png differ diff --git a/images/items/shovel.png b/images/items/shovel.png new file mode 100644 index 0000000..e893f75 Binary files /dev/null and b/images/items/shovel.png differ diff --git a/images/items/snapdragon.png b/images/items/snapdragon.png new file mode 100644 index 0000000..b8b507a Binary files /dev/null and b/images/items/snapdragon.png differ diff --git a/images/items/spell_glorf.png b/images/items/spell_glorf.png new file mode 100644 index 0000000..e7231b6 Binary files /dev/null and b/images/items/spell_glorf.png differ diff --git a/images/items/spell_golgatem.png b/images/items/spell_golgatem.png new file mode 100644 index 0000000..005e85d Binary files /dev/null and b/images/items/spell_golgatem.png differ diff --git a/images/items/spell_igram.png b/images/items/spell_igram.png new file mode 100644 index 0000000..ebea705 Binary files /dev/null and b/images/items/spell_igram.png differ diff --git a/images/items/spell_kendall.png b/images/items/spell_kendall.png new file mode 100644 index 0000000..14e78e5 Binary files /dev/null and b/images/items/spell_kendall.png differ diff --git a/images/items/spell_narwile.png b/images/items/spell_narwile.png new file mode 100644 index 0000000..3529c4c Binary files /dev/null and b/images/items/spell_narwile.png differ diff --git a/images/items/spell_obidil.png b/images/items/spell_obidil.png new file mode 100644 index 0000000..3fdaee3 Binary files /dev/null and b/images/items/spell_obidil.png differ diff --git a/images/items/spell_rezrov.png b/images/items/spell_rezrov.png new file mode 100644 index 0000000..a8ec534 Binary files /dev/null and b/images/items/spell_rezrov.png differ diff --git a/images/items/spell_throck.png b/images/items/spell_throck.png new file mode 100644 index 0000000..9ce2e5a Binary files /dev/null and b/images/items/spell_throck.png differ diff --git a/images/items/spell_yastard.png b/images/items/spell_yastard.png new file mode 100644 index 0000000..79a9cb8 Binary files /dev/null and b/images/items/spell_yastard.png differ diff --git a/images/items/student_id.png b/images/items/student_id.png new file mode 100644 index 0000000..bc29ed2 Binary files /dev/null and b/images/items/student_id.png differ diff --git a/images/items/subway_destination_flood_control_dam_3.png b/images/items/subway_destination_flood_control_dam_3.png new file mode 100644 index 0000000..10fd418 Binary files /dev/null and b/images/items/subway_destination_flood_control_dam_3.png differ diff --git a/images/items/subway_destination_hades.png b/images/items/subway_destination_hades.png new file mode 100644 index 0000000..ee665be Binary files /dev/null and b/images/items/subway_destination_hades.png differ diff --git a/images/items/subway_destination_monastery.png b/images/items/subway_destination_monastery.png new file mode 100644 index 0000000..53ca98d Binary files /dev/null and b/images/items/subway_destination_monastery.png differ diff --git a/images/items/subway_token.png b/images/items/subway_token.png new file mode 100644 index 0000000..d19e91c Binary files /dev/null and b/images/items/subway_token.png differ diff --git a/images/items/sword.png b/images/items/sword.png new file mode 100644 index 0000000..8a8c304 Binary files /dev/null and b/images/items/sword.png differ diff --git a/images/items/teleporter_destination_dungeon_masters_lair.png b/images/items/teleporter_destination_dungeon_masters_lair.png new file mode 100644 index 0000000..821f555 Binary files /dev/null and b/images/items/teleporter_destination_dungeon_masters_lair.png differ diff --git a/images/items/teleporter_destination_gue_tech.png b/images/items/teleporter_destination_gue_tech.png new file mode 100644 index 0000000..3db1129 Binary files /dev/null and b/images/items/teleporter_destination_gue_tech.png differ diff --git a/images/items/teleporter_destination_hades.png b/images/items/teleporter_destination_hades.png new file mode 100644 index 0000000..b63cf75 Binary files /dev/null and b/images/items/teleporter_destination_hades.png differ diff --git a/images/items/teleporter_destination_monastery.png b/images/items/teleporter_destination_monastery.png new file mode 100644 index 0000000..a43a147 Binary files /dev/null and b/images/items/teleporter_destination_monastery.png differ diff --git a/images/items/teleporter_destination_spell_lab.png b/images/items/teleporter_destination_spell_lab.png new file mode 100644 index 0000000..04fde5b Binary files /dev/null and b/images/items/teleporter_destination_spell_lab.png differ diff --git a/images/items/time_tunnel.png b/images/items/time_tunnel.png new file mode 100644 index 0000000..122d83f Binary files /dev/null and b/images/items/time_tunnel.png differ diff --git a/images/items/totem_brog.png b/images/items/totem_brog.png new file mode 100644 index 0000000..014ad47 Binary files /dev/null and b/images/items/totem_brog.png differ diff --git a/images/items/totem_griff.png b/images/items/totem_griff.png new file mode 100644 index 0000000..40f118e Binary files /dev/null and b/images/items/totem_griff.png differ diff --git a/images/items/totem_lucy.png b/images/items/totem_lucy.png new file mode 100644 index 0000000..963214b Binary files /dev/null and b/images/items/totem_lucy.png differ diff --git a/images/items/zimdor_scroll.png b/images/items/zimdor_scroll.png new file mode 100644 index 0000000..cd35ed7 Binary files /dev/null and b/images/items/zimdor_scroll.png differ diff --git a/images/items/zork_rocks.png b/images/items/zork_rocks.png new file mode 100644 index 0000000..ae8d446 Binary files /dev/null and b/images/items/zork_rocks.png differ diff --git a/images/maps/map.png b/images/maps/map.png new file mode 100644 index 0000000..2c41cee Binary files /dev/null and b/images/maps/map.png differ diff --git a/images/settings/goal_three_artifacts.png b/images/settings/goal_three_artifacts.png new file mode 100644 index 0000000..dab523f Binary files /dev/null and b/images/settings/goal_three_artifacts.png differ diff --git a/images/settings/setting_deathsanity.png b/images/settings/setting_deathsanity.png new file mode 100644 index 0000000..07aacdb Binary files /dev/null and b/images/settings/setting_deathsanity.png differ diff --git a/images/settings/setting_early_rope_and_lantern.png b/images/settings/setting_early_rope_and_lantern.png new file mode 100644 index 0000000..306e090 Binary files /dev/null and b/images/settings/setting_early_rope_and_lantern.png differ diff --git a/items/items.json b/items/items.json new file mode 100644 index 0000000..5cc6cd5 --- /dev/null +++ b/items/items.json @@ -0,0 +1,278 @@ +[ + { + "name": "Hammer", + "type": "toggle", + "img": "/images/items/hammer.png", + "codes": "hammer" + }, + { + "name": "Hungus Lard", + "type": "toggle", + "img": "/images/items/hungus_lard.png", + "codes": "hungus_lard" + }, + { + "name": "Lantern", + "type": "toggle", + "img": "/images/items/lantern.png", + "codes": "lantern" + }, + { + "name": "Large Telegraph Hammer", + "type": "toggle", + "img": "/images/items/large_telegraph_hammer.png", + "codes": "large_telegraph_hammer" + }, + { + "name": "Map", + "type": "toggle", + "img": "/images/items/map.png", + "codes": "map" + }, + { + "name": "Mead Light", + "type": "toggle", + "img": "/images/items/mead_light.png", + "codes": "mead_light" + }, + { + "name": "Old Scratch Card", + "type": "toggle", + "img": "/images/items/old_scratch_card.png", + "codes": "old_scratch_card" + }, + { + "name": "Perma-Suck Machine", + "type": "toggle", + "img": "/images/items/perma_suck_machine.png", + "codes": "perma_suck_machine" + }, + { + "name": "Plastic Six-Pack Holder", + "type": "toggle", + "img": "/images/items/plastic_six_pack_holder.png", + "codes": "plastic_six_pack_holder" + }, + { + "name": "Prozork Tablet", + "type": "toggle", + "img": "/images/items/prozork_tablet.png", + "codes": "prozork_tablet" + }, + { + "name": "Rope", + "type": "toggle", + "img": "/images/items/rope.png", + "codes": "rope" + }, + { + "name": "Shovel", + "type": "toggle", + "img": "/images/items/shovel.png", + "codes": "shovel" + }, + { + "name": "Snapdragon", + "type": "toggle", + "img": "/images/items/snapdragon.png", + "codes": "snapdragon" + }, + { + "name": "Student ID", + "type": "toggle", + "img": "/images/items/student_id.png", + "codes": "student_id" + }, + { + "name": "Subway Token", + "type": "toggle", + "img": "/images/items/subway_token.png", + "codes": "subway_token" + }, + { + "name": "Sword", + "type": "toggle", + "img": "/images/items/sword.png", + "codes": "sword" + }, + { + "name": "ZIMDOR Scroll", + "type": "toggle", + "img": "/images/items/zimdor_scroll.png", + "codes": "zimdor_scroll" + }, + { + "name": "Zork Rocks", + "type": "toggle", + "img": "/images/items/zork_rocks.png", + "codes": "zork_rocks" + }, + { + "name": "Pouch of Zorkmids", + "type": "toggle", + "img": "/images/items/pouch_of_zorkmids.png", + "codes": "pouch_of_zorkmids" + }, + { + "name": "Blank Scroll Box Access", + "type": "toggle", + "img": "/images/items/blank_scroll_box_access.png", + "codes": "blank_scroll_box_access" + }, + { + "name": "Spell: GLORF", + "type": "toggle", + "img": "/images/items/spell_glorf.png", + "codes": "spell_glorf" + }, + { + "name": "Spell: GOLGATEM", + "type": "toggle", + "img": "/images/items/spell_golgatem.png", + "codes": "spell_golgatem" + }, + { + "name": "Spell: IGRAM", + "type": "toggle", + "img": "/images/items/spell_igram.png", + "codes": "spell_igram" + }, + { + "name": "Spell: KENDALL", + "type": "toggle", + "img": "/images/items/spell_kendall.png", + "codes": "spell_kendall" + }, + { + "name": "Spell: NARWILE", + "type": "toggle", + "img": "/images/items/spell_narwile.png", + "codes": "spell_narwile" + }, + { + "name": "Spell: OBIDIL", + "type": "toggle", + "img": "/images/items/spell_obidil.png", + "codes": "spell_obidil" + }, + { + "name": "Spell: REZROV", + "type": "toggle", + "img": "/images/items/spell_rezrov.png", + "codes": "spell_rezrov" + }, + { + "name": "Spell: THROCK", + "type": "toggle", + "img": "/images/items/spell_throck.png", + "codes": "spell_throck" + }, + { + "name": "Spell: YASTARD", + "type": "toggle", + "img": "/images/items/spell_yastard.png", + "codes": "spell_yastard" + }, + { + "name": "Totem: Brog", + "type": "toggle", + "img": "/images/items/totem_brog.png", + "codes": "totem_brog" + }, + { + "name": "Brog's Time Tunnel Items", + "type": "toggle", + "img": "/images/items/time_tunnel.png", + "codes": "brogs_time_tunnel_items" + }, + { + "name": "Totem: Griff", + "type": "toggle", + "img": "/images/items/totem_griff.png", + "codes": "totem_griff" + }, + { + "name": "Griff's Time Tunnel Items", + "type": "toggle", + "img": "/images/items/time_tunnel.png", + "codes": "griffs_time_tunnel_items" + }, + { + "name": "Totem: Lucy", + "type": "toggle", + "img": "/images/items/totem_lucy.png", + "codes": "totem_lucy" + }, + { + "name": "Lucy's Time Tunnel Items", + "type": "toggle", + "img": "/images/items/time_tunnel.png", + "codes": "lucys_time_tunnel_items" + }, + { + "name": "Subway Destination: Flood Control Dam #3", + "type": "toggle", + "img": "/images/items/subway_destination_flood_control_dam_3.png", + "codes": "subway_destination_flood_control_dam_3" + }, + { + "name": "Subway Destination: Hades", + "type": "toggle", + "img": "/images/items/subway_destination_hades.png", + "codes": "subway_destination_hades" + }, + { + "name": "Subway Destination: Monastery", + "type": "toggle", + "img": "/images/items/subway_destination_monastery.png", + "codes": "subway_destination_monastery" + }, + { + "name": "Teleporter Destination: Dungeon Master's Lair", + "type": "toggle", + "img": "/images/items/teleporter_destination_dungeon_masters_lair.png", + "codes": "teleporter_destination_dungeon_masters_lair" + }, + { + "name": "Teleporter Destination: GUE Tech", + "type": "toggle", + "img": "/images/items/teleporter_destination_gue_tech.png", + "codes": "teleporter_destination_gue_tech" + }, + { + "name": "Teleporter Destination: Hades", + "type": "toggle", + "img": "/images/items/teleporter_destination_hades.png", + "codes": "teleporter_destination_hades" + }, + { + "name": "Teleporter Destination: Monastery Station", + "type": "toggle", + "img": "/images/items/teleporter_destination_monastery.png", + "codes": "teleporter_destination_monastery" + }, + { + "name": "Teleporter Destination: Spell Lab", + "type": "toggle", + "img": "/images/items/teleporter_destination_spell_lab.png", + "codes": "teleporter_destination_spell_lab" + }, + { + "name": "Goal: Three Artifacts", + "type": "toggle", + "img": "/images/settings/goal_three_artifacts.png", + "codes": "goal_three_artifacts" + }, + { + "name": "Setting: Deathsanity", + "type": "toggle", + "img": "/images/settings/setting_deathsanity.png", + "codes": "setting_deathsanity" + }, + { + "name": "Setting: Early Rope and Lantern", + "type": "toggle", + "img": "/images/settings/setting_early_rope_and_lantern.png", + "codes": "setting_early_rope_and_lantern" + } +] \ No newline at end of file diff --git a/layouts/goals.json b/layouts/goals.json new file mode 100644 index 0000000..c68f462 --- /dev/null +++ b/layouts/goals.json @@ -0,0 +1,28 @@ +{ + "goals_layout": { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "itemgrid", + "item_size": "4, 4", + "item_margin": "2, 2", + "item_h_alignment": "center", + "h_alignment": "left", + "rows": [ + [ + "goal_three_artifacts" + ] + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/layouts/items.json b/layouts/items.json new file mode 100644 index 0000000..702acfb --- /dev/null +++ b/layouts/items.json @@ -0,0 +1,51 @@ +{ + "items_layout": { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "itemgrid", + "item_size": "4, 4", + "item_margin": "2, 2", + "item_h_alignment": "center", + "h_alignment": "left", + "rows": [ + [ + "hammer", + "hungus_lard", + "lantern", + "large_telegraph_hammer", + "map", + "mead_light", + "old_scratch_card" + ], + [ + "perma_suck_machine", + "plastic_six_pack_holder", + "prozork_tablet", + "rope", + "shovel", + "snapdragon", + "student_id" + ], + [ + "subway_token", + "sword", + "zimdor_scroll", + "zork_rocks", + "pouch_of_zorkmids", + "blank_scroll_box_access" + ] + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/layouts/settings.json b/layouts/settings.json new file mode 100644 index 0000000..9aebefb --- /dev/null +++ b/layouts/settings.json @@ -0,0 +1,31 @@ +{ + "settings_layout": { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "itemgrid", + "item_size": "4, 4", + "item_margin": "2, 2", + "item_h_alignment": "center", + "h_alignment": "left", + "rows": [ + [ + "setting_deathsanity" + ], + [ + "setting_early_rope_and_lantern" + ] + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/layouts/spells.json b/layouts/spells.json new file mode 100644 index 0000000..b8fc22d --- /dev/null +++ b/layouts/spells.json @@ -0,0 +1,40 @@ +{ + "spells_layout": { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "itemgrid", + "item_size": "4, 4", + "item_margin": "2, 2", + "item_h_alignment": "center", + "h_alignment": "left", + "rows": [ + [ + "spell_glorf", + "spell_golgatem", + "spell_igram" + ], + [ + "spell_kendall", + "spell_narwile", + "spell_obidil" + ], + [ + "spell_rezrov", + "spell_throck", + "spell_yastard" + ] + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/layouts/subway.json b/layouts/subway.json new file mode 100644 index 0000000..2c94bdb --- /dev/null +++ b/layouts/subway.json @@ -0,0 +1,34 @@ +{ + "subway_layout": { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "itemgrid", + "item_size": "174, 45", + "item_margin": "2, 2", + "item_h_alignment": "center", + "h_alignment": "left", + "rows": [ + [ + "subway_destination_flood_control_dam_3" + ], + [ + "subway_destination_hades" + ], + [ + "subway_destination_monastery" + ] + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/layouts/tabs.json b/layouts/tabs.json new file mode 100644 index 0000000..9077b25 --- /dev/null +++ b/layouts/tabs.json @@ -0,0 +1,16 @@ +{ + "tabs_layout": { + "type": "tabbed", + "tabs": [ + { + "title": "Zork Grand Inquisitor", + "content": { + "type": "map", + "maps": [ + "map" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/layouts/teleporter.json b/layouts/teleporter.json new file mode 100644 index 0000000..d120522 --- /dev/null +++ b/layouts/teleporter.json @@ -0,0 +1,34 @@ +{ + "teleporter_layout": { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "itemgrid", + "item_size": "85, 85", + "item_margin": "2, 2", + "item_h_alignment": "center", + "h_alignment": "left", + "rows": [ + [ + "teleporter_destination_dungeon_masters_lair", + "teleporter_destination_gue_tech", + "teleporter_destination_hades" + ], + [ + "teleporter_destination_monastery", + "teleporter_destination_spell_lab" + ] + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/layouts/totems.json b/layouts/totems.json new file mode 100644 index 0000000..5d00f2e --- /dev/null +++ b/layouts/totems.json @@ -0,0 +1,37 @@ +{ + "totems_layout": { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "array", + "orientation": "vertical", + "margin": "0,0", + "content": [ + { + "type": "itemgrid", + "item_size": "4, 4", + "item_margin": "2, 2", + "item_h_alignment": "center", + "h_alignment": "left", + "rows": [ + [ + "totem_brog", + "brogs_time_tunnel_items" + ], + [ + "totem_griff", + "griffs_time_tunnel_items" + ], + [ + "totem_lucy", + "lucys_time_tunnel_items" + ] + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/layouts/tracker.json b/layouts/tracker.json new file mode 100644 index 0000000..44ce62b --- /dev/null +++ b/layouts/tracker.json @@ -0,0 +1,109 @@ +{ + "tracker_default": { + "type": "container", + "background": "#000000", + "content": { + "type": "dock", + "dropshadow": true, + "content": [ + { + "type": "dock", + "dock": "bottom", + "content": [ + { + "type": "group", + "header": "Goal", + "dock": "left", + "margin": "0,0,3,0", + "content": { + "type": "layout", + "h_alignment": "center", + "v_alignment": "center", + "key": "goals_layout" + } + }, + { + "type": "group", + "header": "Settings", + "dock": "left", + "margin": "0,0,3,0", + "content": { + "type": "layout", + "h_alignment": "center", + "v_alignment": "center", + "key": "settings_layout" + } + }, + { + "type": "group", + "header": "Items", + "dock": "left", + "margin": "0,0,3,0", + "content": { + "type": "layout", + "h_alignment": "center", + "v_alignment": "center", + "key": "items_layout" + } + }, + { + "type": "group", + "header": "Spells", + "dock": "left", + "margin": "0,0,3,0", + "content": { + "type": "layout", + "h_alignment": "center", + "v_alignment": "center", + "key": "spells_layout" + } + }, + { + "type": "group", + "header": "Totems", + "dock": "left", + "margin": "0,0,3,0", + "content": { + "type": "layout", + "h_alignment": "center", + "v_alignment": "center", + "key": "totems_layout" + } + }, + { + "type": "group", + "header": "Subway Destinations", + "dock": "left", + "margin": "0,0,3,0", + "content": { + "type": "layout", + "h_alignment": "center", + "v_alignment": "center", + "key": "subway_layout" + } + }, + { + "type": "group", + "header": "Teleporter Destinations", + "dock": "left", + "margin": "0,0,3,0", + "content": { + "type": "layout", + "h_alignment": "center", + "v_alignment": "center", + "key": "teleporter_layout" + } + } + ] + }, + { + "type": "dock", + "content": { + "type": "layout", + "key": "tabs_layout" + } + } + ] + } + } +} \ No newline at end of file diff --git a/locations/locations.json b/locations/locations.json new file mode 100644 index 0000000..2e146f7 --- /dev/null +++ b/locations/locations.json @@ -0,0 +1,1343 @@ +[ + { + "name": "Zork Grand Inquisitor", + "children": [ + { + "name": "Arrest the Vandal!", + "map_locations": [ + { + "map": "map", + "x": 824, + "y": 240, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Arrest the Vandal!", + "visibility_rules": [], + "access_rules": ["$canReachPortFoozleJacksShop"] + } + ] + }, + { + "name": "Artifacts, Explained", + "map_locations": [ + { + "map": "map", + "x": 650, + "y": 690, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Artifacts, Explained", + "visibility_rules": [], + "access_rules": [ + "$canReachGUETechHallway", + "$canReachGUETechHallwayBackwards" + ] + } + ] + }, + { + "name": "A Smallway", + "map_locations": [ + { + "map": "map", + "x": 620, + "y": 760, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "A Smallway", + "visibility_rules": [], + "access_rules": [ + "$canReachGUETech,spell_igram", + "$canReachGUETechBackwards,spell_igram" + ] + } + ] + }, + { + "name": "Beautiful, That's Plenty!", + "map_locations": [ + { + "map": "map", + "x": 864, + "y": 550, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Beautiful, That's Plenty!", + "visibility_rules": [], + "access_rules": ["$canReachSubwayFloodControlDam,spell_throck"] + } + ] + }, + { + "name": "BEBURTT, Demystified", + "map_locations": [ + { + "map": "map", + "x": 710, + "y": 690, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "BEBURTT, Demystified", + "visibility_rules": [], + "access_rules": [ + "$canReachGUETechHallway,pouch_of_zorkmids,spell_kendall", + "$canReachGUETechHallwayBackwards,pouch_of_zorkmids,spell_kendall" + ] + } + ] + }, + { + "name": "Brog Do Good!", + "map_locations": [ + { + "map": "map", + "x": 942, + "y": 1326, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Brog Do Good!", + "visibility_rules": [], + "access_rules": ["$canReachWhiteHouse,totem_brog,brogs_time_tunnel_items"] + } + ] + }, + { + "name": "Brog Much Better at This Game", + "map_locations": [ + { + "map": "map", + "x": 972, + "y": 1326, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Brog Much Better at This Game", + "visibility_rules": [], + "access_rules": ["$canReachWhiteHouse,totem_brog,brogs_time_tunnel_items"] + } + ] + }, + { + "name": "Crisis Averted", + "map_locations": [ + { + "map": "map", + "x": 680, + "y": 690, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Crisis Averted", + "visibility_rules": [], + "access_rules": [ + "$canReachGUETech,$canReachGUETechHallway,zork_rocks,pouch_of_zorkmids", + "$canReachGUETechBackwards,$canReachGUETechHallway,zork_rocks,pouch_of_zorkmids" + ] + } + ] + }, + { + "name": "Dragon Archipelago Time Tunnel", + "map_locations": [ + { + "map": "map", + "x": 1200, + "y": 530, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Dragon Archipelago Time Tunnel", + "visibility_rules": [], + "access_rules": ["$canReachHadesBeyondGates,spell_narwile"] + } + ] + }, + { + "name": "Dunce Locker", + "map_locations": [ + { + "map": "map", + "x": 770, + "y": 760, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Dunce Locker", + "visibility_rules": [], + "access_rules": [ + "$canReachGUETech,pouch_of_zorkmids", + "$canReachGUETechBackwards,pouch_of_zorkmids" + ] + } + ] + }, + { + "name": "Elsewhere", + "map_locations": [ + { + "map": "map", + "x": 404, + "y": 240, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Elsewhere", + "visibility_rules": [], + "access_rules": [] + } + ] + }, + { + "name": "Enjoy Your Trip!", + "map_locations": [ + { + "map": "map", + "x": 432, + "y": 966, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Enjoy Your Trip!", + "visibility_rules": [], + "access_rules": [ + "$canReachSubwayCrossroads,spell_kendall", + "$canReachSubwayAlternate,spell_kendall" + ] + } + ] + }, + { + "name": "Getting Some Change", + "map_locations": [ + { + "map": "map", + "x": 680, + "y": 760, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Getting Some Change", + "visibility_rules": [], + "access_rules": [ + "$canReachGUETech,old_scratch_card", + "$canReachGUETechBackwards,old_scratch_card" + ] + } + ] + }, + { + "name": "GUE Tech Entrance Exam", + "map_locations": [ + { + "map": "map", + "x": 590, + "y": 760, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "GUE Tech Entrance Exam", + "visibility_rules": [], + "access_rules": [ + "$canReachGUETech", + "$canReachGUETechBackwards" + ] + } + ] + }, + { + "name": "Have a Hell of a Day!", + "map_locations": [ + { + "map": "map", + "x": 1140, + "y": 530, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Have a Hell of a Day!", + "visibility_rules": [], + "access_rules": ["$canReachHadesShore"] + } + ] + }, + { + "name": "Help... Me. Can't... Breathe", + "map_locations": [ + { + "map": "map", + "x": 764, + "y": 240, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Help... Me. Can't... Breathe", + "visibility_rules": [], + "access_rules": ["plastic_six_pack_holder"] + } + ] + }, + { + "name": "Hey, Free Dirt!", + "map_locations": [ + { + "map": "map", + "x": 650, + "y": 760, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Hey, Free Dirt!", + "visibility_rules": [], + "access_rules": [ + "$canReachGUETech,shovel", + "$canReachGUETechBackwards,shovel" + ] + } + ] + }, + { + "name": "Imbue BEBURTT", + "map_locations": [ + { + "map": "map", + "x": 1020, + "y": 750, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Imbue BEBURTT", + "visibility_rules": [], + "access_rules": ["$canReachSpellLab,blank_scroll_box_access"] + } + ] + }, + { + "name": "Into the Foliage", + "map_locations": [ + { + "map": "map", + "x": 164, + "y": 880, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Into the Foliage", + "visibility_rules": [], + "access_rules": ["$canReachCrossroads,sword"] + } + ] + }, + { + "name": "In Case of Adventure, Break Glass!", + "map_locations": [ + { + "map": "map", + "x": 134, + "y": 880, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "In Case of Adventure, Break Glass!", + "visibility_rules": [], + "access_rules": ["$canReachCrossroads,hammer"] + } + ] + }, + { + "name": "In Magic We Trust", + "map_locations": [ + { + "map": "map", + "x": 194, + "y": 880, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "In Magic We Trust", + "visibility_rules": [], + "access_rules": ["$canReachCrossroads,spell_rezrov"] + } + ] + }, + { + "name": "I Hope You Can Climb Up There With All This Junk", + "map_locations": [ + { + "map": "map", + "x": 906, + "y": 988, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "I Hope You Can Climb Up There With All This Junk", + "visibility_rules": [], + "access_rules": ["$canReachSubwayMonastery,spell_glorf,sword"] + } + ] + }, + { + "name": "I Like Your Style!", + "map_locations": [ + { + "map": "map", + "x": 990, + "y": 750, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "I Like Your Style!", + "visibility_rules": [], + "access_rules": ["$canReachSubwayFloodControlDam,spell_rezrov,$canReachSpellLabBridge,sword,spell_golgatem"] + } + ] + }, + { + "name": "Magic Forever!", + "map_locations": [ + { + "map": "map", + "x": 434, + "y": 240, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Magic Forever!", + "visibility_rules": [], + "access_rules": ["rope,lantern"] + } + ] + }, + { + "name": "300 Year Old National Treasure", + "map_locations": [ + { + "map": "map", + "x": 894, + "y": 550, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "300 Year Old National Treasure", + "visibility_rules": [], + "access_rules": ["$canReachSubwayFloodControlDam,spell_rezrov"] + } + ] + }, + { + "name": "NOOOOOOOOOOOOO!", + "map_locations": [ + { + "map": "map", + "x": 710, + "y": 760, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "NOOOOOOOOOOOOO!", + "visibility_rules": [], + "access_rules": [ + "$canReachGUETech,pouch_of_zorkmids", + "$canReachGUETechBackwards,pouch_of_zorkmids" + ] + } + ] + }, + { + "name": "Nothin' Like a Good Stogie", + "map_locations": [ + { + "map": "map", + "x": 190, + "y": 610, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Nothin' Like a Good Stogie", + "visibility_rules": [], + "access_rules": [ + "$canReachDMLair", + "$canReachDMLairBackwards" + ] + } + ] + }, + { + "name": "Oh Dear God, It's a Dragon!", + "map_locations": [ + { + "map": "map", + "x": 222, + "y": 1326, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Oh Dear God, It's a Dragon!", + "visibility_rules": [], + "access_rules": ["$canReachDragonArchipelago,totem_griff,griffs_time_tunnel_items"] + } + ] + }, + { + "name": "Old Scratch Winner!", + "map_locations": [ + { + "map": "map", + "x": 1235, + "y": 700, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Old Scratch Winner!", + "visibility_rules": [], + "access_rules": ["old_scratch_card"] + } + ] + }, + { + "name": "Open the Gates of Hell", + "map_locations": [ + { + "map": "map", + "x": 1170, + "y": 530, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Open the Gates of Hell", + "visibility_rules": [], + "access_rules": ["$canReachHadesBeyondGates"] + } + ] + }, + { + "name": "Outsmart the Quelbees", + "map_locations": [ + { + "map": "map", + "x": 250, + "y": 610, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Outsmart the Quelbees", + "visibility_rules": [], + "access_rules": ["$canReachDMLair,hungus_lard,sword"] + } + ] + }, + { + "name": "Planetfall", + "map_locations": [ + { + "map": "map", + "x": 1126, + "y": 240, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Planetfall", + "visibility_rules": [], + "access_rules": ["lantern"] + } + ] + }, + { + "name": "Plants Are Man's Best Friend", + "map_locations": [ + { + "map": "map", + "x": 280, + "y": 610, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Plants Are Man's Best Friend", + "visibility_rules": [], + "access_rules": [ + "$canReachDMLair,spell_throck,snapdragon,hammer", + "$canReachDMLairBackwards,spell_throck,snapdragon,hammer" + ] + } + ] + }, + { + "name": "Port Foozle Time Tunnel", + "map_locations": [ + { + "map": "map", + "x": 980, + "y": 1028, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Port Foozle Time Tunnel", + "visibility_rules": [], + "access_rules": ["$canReachMonastery,large_telegraph_hammer,spell_narwile"] + } + ] + }, + { + "name": "Prozorked", + "map_locations": [ + { + "map": "map", + "x": 160, + "y": 610, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Prozorked", + "visibility_rules": [], + "access_rules": [ + "$canReachDMLair,prozork_tablet", + "$canReachDMLairBackwards,prozork_tablet" + ] + } + ] + }, + { + "name": "Reassemble SNAVIG", + "map_locations": [ + { + "map": "map", + "x": 310, + "y": 610, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Reassemble SNAVIG", + "visibility_rules": [], + "access_rules": ["$canReachDMLairInterior,spell_throck,snapdragon,hammer"] + } + ] + }, + { + "name": "SNAVIG, Repaired", + "map_locations": [ + { + "map": "map", + "x": 1050, + "y": 750, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "SNAVIG, Repaired", + "visibility_rules": [], + "access_rules": ["$canReachDMLairInterior,spell_throck,snapdragon,hammer,$canReachSpellLab"] + } + ] + }, + { + "name": "Souvenir", + "map_locations": [ + { + "map": "map", + "x": 834, + "y": 550, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Souvenir", + "visibility_rules": [], + "access_rules": ["$canReachSubwayFloodControlDam,pouch_of_zorkmids"] + } + ] + }, + { + "name": "Strip Grue, Fire, Water", + "map_locations": [ + { + "map": "map", + "x": 612, + "y": 1326, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Strip Grue, Fire, Water", + "visibility_rules": [], + "access_rules": ["$canReachPortFoozlePast,totem_lucy,lucys_time_tunnel_items"] + } + ] + }, + { + "name": "Sucking Rocks", + "map_locations": [ + { + "map": "map", + "x": 740, + "y": 760, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Sucking Rocks", + "visibility_rules": [], + "access_rules": [ + "$canReachGUETech,pouch_of_zorkmids,perma_suck_machine", + "$canReachGUETechBackwards,pouch_of_zorkmids,perma_suck_machine" + ] + } + ] + }, + { + "name": "Thar She Blows!", + "map_locations": [ + { + "map": "map", + "x": 252, + "y": 1326, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Thar She Blows!", + "visibility_rules": [], + "access_rules": ["$canReachDragonArchipelago,totem_griff,griffs_time_tunnel_items"] + } + ] + }, + { + "name": "That's the Spirit!", + "map_locations": [ + { + "map": "map", + "x": 794, + "y": 240, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "That's the Spirit!", + "visibility_rules": [], + "access_rules": [] + } + ] + }, + { + "name": "The Underground Underground", + "map_locations": [ + { + "map": "map", + "x": 224, + "y": 880, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "The Underground Underground", + "visibility_rules": [], + "access_rules": ["$canReachCrossroads,subway_token"] + } + ] + }, + { + "name": "Totemized Daily Billboard Functioning Correctly", + "map_locations": [ + { + "map": "map", + "x": 44, + "y": 240, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Totemized Daily Billboard Functioning Correctly", + "visibility_rules": [], + "access_rules": [] + } + ] + }, + { + "name": "Umbrella Flowers", + "map_locations": [ + { + "map": "map", + "x": 254, + "y": 880, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Umbrella Flowers", + "visibility_rules": [], + "access_rules": ["$canReachSpellLab,blank_scroll_box_access"] + } + ] + }, + { + "name": "Useless, But Fun", + "map_locations": [ + { + "map": "map", + "x": 924, + "y": 550, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Useless, But Fun", + "visibility_rules": [], + "access_rules": ["$canReachSubwayFloodControlDam,spell_golgatem"] + } + ] + }, + { + "name": "Want Some Rye? Course Ya Do!", + "map_locations": [ + { + "map": "map", + "x": 220, + "y": 610, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Want Some Rye? Course Ya Do!", + "visibility_rules": [], + "access_rules": [ + "$canReachDMLair,mead_light,zimdor_scroll", + "$canReachDMLairBackwards,mead_light,zimdom_scroll" + ] + } + ] + }, + { + "name": "We Got a High Roller!", + "map_locations": [ + { + "map": "map", + "x": 582, + "y": 1326, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "We Got a High Roller!", + "visibility_rules": [], + "access_rules": ["$canReachPortFoozlePast,totem_lucy,lucys_time_tunnel_items"] + } + ] + }, + { + "name": "White House Time Tunnel", + "map_locations": [ + { + "map": "map", + "x": 340, + "y": 610, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "White House Time Tunnel", + "visibility_rules": [], + "access_rules": ["$canReachDMLairInterior,spell_narwile"] + } + ] + }, + { + "name": "Wow! I've Never Gone Inside Him Before!", + "map_locations": [ + { + "map": "map", + "x": 370, + "y": 610, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Wow! I've Never Gone Inside Him Before!", + "visibility_rules": [], + "access_rules": ["$canReachDMLairInterior,spell_obidil"] + } + ] + }, + { + "name": "You Gained 86 Experience Points", + "map_locations": [ + { + "map": "map", + "x": 960, + "y": 750, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "You Gained 86 Experience Points", + "visibility_rules": [], + "access_rules": ["$canReachSpellLabBridge,sword"] + } + ] + }, + { + "name": "Death: Arrested With Jack", + "map_locations": [ + { + "map": "map", + "x": 854, + "y": 240, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Arrested With Jack", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": ["lantern"] + } + ] + }, + { + "name": "Death: Attacked the Quelbees", + "map_locations": [ + { + "map": "map", + "x": 400, + "y": 610, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Attacked the Quelbees", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": [ + "$canReachDMLair,sword", + "$canReachDMLairBackwards,sword" + ] + } + ] + }, + { + "name": "Death: Climbed Out of the Well", + "map_locations": [ + { + "map": "map", + "x": 284, + "y": 880, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Climbed Out of the Well", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": ["$canReachCrossroads"] + } + ] + }, + { + "name": "Death: Eaten by a Grue", + "map_locations": [ + { + "map": "map", + "x": 464, + "y": 240, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Eaten by a Grue", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": ["rope"] + } + ] + }, + { + "name": "Death: Jumped in Bottomless Pit", + "map_locations": [ + { + "map": "map", + "x": 590, + "y": 790, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Jumped in Bottomless Pit", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": [ + "$canReachGUETech", + "$canReachGUETechBackwards" + ] + } + ] + }, + { + "name": "Death: Lost Game of Strip Grue, Fire, Water", + "map_locations": [ + { + "map": "map", + "x": 642, + "y": 1326, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Lost Game of Strip Grue, Fire, Water", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": ["$canReachPortFoozlePast,totem_lucy,lucys_time_tunnel_items"] + } + ] + }, + { + "name": "Death: Lost Soul to Old Scratch", + "map_locations": [ + { + "map": "map", + "x": 1265, + "y": 700, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Lost Soul to Old Scratch", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": ["old_scratch_card"] + } + ] + }, + { + "name": "Death: Outsmarted by the Quelbees", + "map_locations": [ + { + "map": "map", + "x": 430, + "y": 610, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Outsmarted by the Quelbees", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": [ + "$canReachDMLair,hungus_lard", + "$canReachDMLairBackwards,hungus_lard" + ] + } + ] + }, + { + "name": "Death: Sliced up by the Invisible Guard", + "map_locations": [ + { + "map": "map", + "x": 1080, + "y": 750, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Sliced up by the Invisible Guard", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": ["$canReachSpellLabBridge"] + } + ] + }, + { + "name": "Death: Step Into the Infinite", + "map_locations": [ + { + "map": "map", + "x": 620, + "y": 790, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Step Into the Infinite", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": [ + "$canReachGUETech,spell_igram", + "$canReachGUETechBackwards,spell_igram" + ] + } + ] + }, + { + "name": "Death: Swallowed by a Dragon", + "map_locations": [ + { + "map": "map", + "x": 282, + "y": 1326, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Swallowed by a Dragon", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": ["$canReachDragonArchipelago,totem_griff,griffs_time_tunnel_items"] + } + ] + }, + { + "name": "Death: THROCKed the Grass", + "map_locations": [ + { + "map": "map", + "x": 680, + "y": 790, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: THROCKed the Grass", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": [ + "$canReachGUETech,spell_throck", + "$canReachGUETechBackwards,spell_throck" + ] + } + ] + }, + { + "name": "Death: Totemized?", + "map_locations": [ + { + "map": "map", + "x": 1010, + "y": 1028, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Totemized?", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": ["$canReachMonastery"] + } + ] + }, + { + "name": "Death: Totemized... Permanently", + "map_locations": [ + { + "map": "map", + "x": 1040, + "y": 1028, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Totemized... Permanently", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": ["$canReachMonastery"] + } + ] + }, + { + "name": "Death: You're Not Charon!?", + "map_locations": [ + { + "map": "map", + "x": 1230, + "y": 530, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: You're Not Charon!?", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": ["$canReachHadesBeyondGates"] + } + ] + }, + { + "name": "Death: Zork Rocks Exploded", + "map_locations": [ + { + "map": "map", + "x": 650, + "y": 790, + "size": 24, + "border_thickness": 2 + } + ], + "sections": [ + { + "name": "Death: Zork Rocks Exploded", + "visibility_rules": ["$hasSettingDeathsanity"], + "access_rules": [ + "$canReachGUETech,zork_rocks,pouch_of_zorkmids", + "$canReachGUETechBackwards,zork_rocks,pouch_of_zorkmids" + ] + } + ] + } + ] + } +] diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..8adbc4f --- /dev/null +++ b/manifest.json @@ -0,0 +1,14 @@ +{ + "name": "Zork Grand Inquisitor", + "game_name": "zork_grand_inquisitor", + "package_version": "0.1.0", + "package_uid": "ap_zork_grand_inquisitor", + "author": "Serpent.AI", + "variants": { + "map": { + "display_name": "Tracker", + "flags": ["ap"] + } + }, + "versions_url": "https://raw.githubusercontent.com/SerpentAI/ZorkGrandInquisitorAPTracker/master/versions.json" +} \ No newline at end of file diff --git a/maps/maps.json b/maps/maps.json new file mode 100644 index 0000000..308d711 --- /dev/null +++ b/maps/maps.json @@ -0,0 +1,8 @@ +[ + { + "name": "map", + "location_size": 24, + "location_border_thickness": 1, + "img": "/images/maps/map.png" + } +] \ No newline at end of file diff --git a/scripts/autotracking.lua b/scripts/autotracking.lua new file mode 100644 index 0000000..7a0d6ff --- /dev/null +++ b/scripts/autotracking.lua @@ -0,0 +1,4 @@ +AUTOTRACKER_ENABLE_DEBUG_LOGGING = true and ENABLE_DEBUG_LOG +AUTOTRACKER_ENABLE_DEBUG_LOGGING_AP = true and AUTOTRACKER_ENABLE_DEBUG_LOGGING + +ScriptHost:LoadScript("scripts/autotracking/archipelago.lua") \ No newline at end of file diff --git a/scripts/autotracking/archipelago.lua b/scripts/autotracking/archipelago.lua new file mode 100644 index 0000000..9c92a88 --- /dev/null +++ b/scripts/autotracking/archipelago.lua @@ -0,0 +1,161 @@ +ScriptHost:LoadScript("scripts/autotracking/item_mapping.lua") +ScriptHost:LoadScript("scripts/autotracking/location_mapping.lua") + + +CURRENT_INDEX = -1 + + +function onClear(slotData) + CURRENT_INDEX = -1 + + -- Reset Locations + for _, layoutLocationPath in pairs(LOCATION_MAPPING) do + if layoutLocationPath[1] then + local layoutLocationObject = Tracker:FindObjectForCode(layoutLocationPath[1]) + + if layoutLocationObject then + if layoutLocationPath[1]:sub(1, 1) == "@" then + layoutLocationObject.AvailableChestCount = layoutLocationObject.ChestCount + else + layoutLocationObject.Active = false + end + end + end + end + + -- Reset Items + for _, layoutItemData in pairs(ITEM_MAPPING) do + if layoutItemData[1] and layoutItemData[2] then + local layoutItemObject = Tracker:FindObjectForCode(layoutItemData[1]) + + if layoutItemObject then + if layoutItemData[2] == "toggle" then + layoutItemObject.Active = false + elseif layoutItemData[2] == "progressive" then + layoutItemObject.CurrentStage = 0 + layoutItemObject.Active = false + elseif layoutItemData[2] == "consumable" then + layoutItemObject.AcquiredCount = 0 + elseif AUTOTRACKER_ENABLE_DEBUG_LOGGING_AP then + print(string.format("onClear: Unknown item type %s for code %s", layoutItemData[2], layoutItemData[1])) + end + elseif AUTOTRACKER_ENABLE_DEBUG_LOGGING_AP then + print(string.format("onClear: Could not find object for code %s", layoutItemData[1])) + end + end + end + + -- Reset Settings + print(slotData['goal']) + print(slotData['early_rope_and_lantern']) + print(slotData['deathsanity']) + + Tracker:FindObjectForCode("goal_three_artifacts").Active = false + + if slotData['goal'] then + local goalValue = slotData['goal'] + local goalTrackerKey = nil + + if goalValue == 0 then + goalTrackerKey = "goal_three_artifacts" + end + + if goalTrackerKey then + local goalTrackerObject = Tracker:FindObjectForCode(goalTrackerKey) + goalTrackerObject.Active = true + end + end + + Tracker:FindObjectForCode("setting_deathsanity").Active = false + + if slotData['deathsanity'] then + local deathsanityValue = slotData['deathsanity'] + local deathsanityTrackerKey = nil + + if deathsanityValue == 1 then + deathsanityTrackerKey = "setting_deathsanity" + end + + if deathsanityTrackerKey then + local deathsanityTrackerObject = Tracker:FindObjectForCode(deathsanityTrackerKey) + deathsanityTrackerObject.Active = true + end + end + + Tracker:FindObjectForCode("setting_early_rope_and_lantern").Active = false + + if slotData['early_rope_and_lantern'] then + local earlyRopeAndLanternValue = slotData['early_rope_and_lantern'] + local earlyRopeAndLanternTrackerKey = nil + + if earlyRopeAndLanternValue == 1 then + earlyRopeAndLanternTrackerKey = "setting_early_rope_and_lantern" + end + + if earlyRopeAndLanternTrackerKey then + local earlyRopeAndLanternTrackerObject = Tracker:FindObjectForCode(earlyRopeAndLanternTrackerKey) + earlyRopeAndLanternTrackerObject.Active = true + end + end +end + + +function onItem(index, itemId, itemName, playerNumber) + if index <= CURRENT_INDEX then + return + end + + CURRENT_INDEX = index + + local itemObject = ITEM_MAPPING[itemId] + + if not itemObject or not itemObject[1] then + return + end + + local trackerItemObject = Tracker:FindObjectForCode(itemObject[1]) + + if trackerItemObject then + if itemObject[2] == "toggle" then + trackerItemObject.Active = true + elseif itemObject[2] == "progressive" then + if trackerItemObject.Active then + trackerItemObject.CurrentStage = trackerItemObject.CurrentStage + 1 + else + trackerItemObject.Active = true + end + elseif itemObject[2] == "consumable" then + trackerItemObject.AcquiredCount = trackerItemObject.AcquiredCount + trackerItemObject.Increment + elseif AUTOTRACKER_ENABLE_DEBUG_LOGGING_AP then + print(string.format("onItem: Unknown item type %s for code %s", itemObject[2], itemObject[1])) + end + else + print(string.format("onItem: Could not find object for code %s", itemObject[1])) + end +end + + +function onLocation(locationId, locationName) + local locationObject = LOCATION_MAPPING[locationId] + + if not locationObject or not locationObject[1] then + return + end + + local trackerLocationObject = Tracker:FindObjectForCode(locationObject[1]) + + if trackerLocationObject then + if locationObject[1]:sub(1, 1) == "@" then + trackerLocationObject.AvailableChestCount = trackerLocationObject.AvailableChestCount - 1 + else + trackerLocationObject.Active = false + end + else + print(string.format("onLocation: Could not find object for code %s", locationObject[1])) + end +end + + +Archipelago:AddClearHandler("Clear", onClear) +Archipelago:AddItemHandler("Item", onItem) +Archipelago:AddLocationHandler("Location", onLocation) \ No newline at end of file diff --git a/scripts/autotracking/item_mapping.lua b/scripts/autotracking/item_mapping.lua new file mode 100644 index 0000000..07480b5 --- /dev/null +++ b/scripts/autotracking/item_mapping.lua @@ -0,0 +1,45 @@ +ITEM_MAPPING = { + [9758067001] = {"hammer", "toggle"}, + [9758067002] = {"hungus_lard", "toggle"}, + [9758067004] = {"lantern", "toggle"}, + [9758067005] = {"large_telegraph_hammer", "toggle"}, + [9758067007] = {"map", "toggle"}, + [9758067008] = {"mead_light", "toggle"}, + [9758067011] = {"old_scratch_card", "toggle"}, + [9758067012] = {"perma_suck_machine", "toggle"}, + [9758067013] = {"plastic_six_pack_holder", "toggle"}, + [9758067015] = {"prozork_tablet", "toggle"}, + [9758067017] = {"rope", "toggle"}, + [9758067018] = {"shovel", "toggle"}, + [9758067019] = {"snapdragon", "toggle"}, + [9758067020] = {"student_id", "toggle"}, + [9758067021] = {"subway_token", "toggle"}, + [9758067022] = {"sword", "toggle"}, + [9758067023] = {"zimdor_scroll", "toggle"}, + [9758067024] = {"zork_rocks", "toggle"}, + [9758067014] = {"pouch_of_zorkmids", "toggle"}, + [9758067200] = {"blank_scroll_box_access", "toggle"}, + [9758067300] = {"spell_glorf", "toggle"}, + [9758067301] = {"spell_golgatem", "toggle"}, + [9758067302] = {"spell_igram", "toggle"}, + [9758067303] = {"spell_kendall", "toggle"}, + [9758067304] = {"spell_narwile", "toggle"}, + [9758067305] = {"spell_obidil", "toggle"}, + [9758067306] = {"spell_rezrov", "toggle"}, + [9758067307] = {"spell_throck", "toggle"}, + [9758067309] = {"spell_yastard", "toggle"}, + [9758067600] = {"totem_brog", "toggle"}, + [9758067100] = {"brogs_time_tunnel_items", "toggle"}, + [9758067601] = {"totem_griff", "toggle"}, + [9758067101] = {"griffs_time_tunnel_items", "toggle"}, + [9758067602] = {"totem_lucy", "toggle"}, + [9758067102] = {"lucys_time_tunnel_items", "toggle"}, + [9758067400] = {"subway_destination_flood_control_dam_3", "toggle"}, + [9758067401] = {"subway_destination_hades", "toggle"}, + [9758067402] = {"subway_destination_monastery", "toggle"}, + [9758067500] = {"teleporter_destination_dungeon_masters_lair", "toggle"}, + [9758067501] = {"teleporter_destination_gue_tech", "toggle"}, + [9758067502] = {"teleporter_destination_hades", "toggle"}, + [9758067503] = {"teleporter_destination_monastery", "toggle"}, + [9758067504] = {"teleporter_destination_spell_lab", "toggle"} +} diff --git a/scripts/autotracking/location_mapping.lua b/scripts/autotracking/location_mapping.lua new file mode 100644 index 0000000..b654544 --- /dev/null +++ b/scripts/autotracking/location_mapping.lua @@ -0,0 +1,69 @@ +LOCATION_MAPPING = { + [9758067004] = {"@Zork Grand Inquisitor/Arrest the Vandal!/Arrest the Vandal!"}, + [9758067012] = {"@Zork Grand Inquisitor/Artifacts, Explained/Artifacts, Explained"}, + [9758067011] = {"@Zork Grand Inquisitor/A Smallway/A Smallway"}, + [9758067024] = {"@Zork Grand Inquisitor/Beautiful, That's Plenty!/Beautiful, That's Plenty!"}, + [9758067022] = {"@Zork Grand Inquisitor/BEBURTT, Demystified/BEBURTT, Demystified"}, + [9758067049] = {"@Zork Grand Inquisitor/Brog Do Good!/Brog Do Good!"}, + [9758067050] = {"@Zork Grand Inquisitor/Brog Much Better at This Game/Brog Much Better at This Game"}, + [9758067020] = {"@Zork Grand Inquisitor/Crisis Averted/Crisis Averted"}, + [9758067046] = {"@Zork Grand Inquisitor/Dragon Archipelago Time Tunnel/Dragon Archipelago Time Tunnel"}, + [9758067021] = {"@Zork Grand Inquisitor/Dunce Locker/Dunce Locker"}, + [9758067001] = {"@Zork Grand Inquisitor/Elsewhere/Elsewhere"}, + [9758067015] = {"@Zork Grand Inquisitor/Enjoy Your Trip!/Enjoy Your Trip!"}, + [9758067017] = {"@Zork Grand Inquisitor/Getting Some Change/Getting Some Change"}, + [9758067010] = {"@Zork Grand Inquisitor/GUE Tech Entrance Exam/GUE Tech Entrance Exam"}, + [9758067040] = {"@Zork Grand Inquisitor/Have a Hell of a Day!/Have a Hell of a Day!"}, + [9758067002] = {"@Zork Grand Inquisitor/Help... Me. Can't... Breathe/Help... Me. Can't... Breathe"}, + [9758067013] = {"@Zork Grand Inquisitor/Hey, Free Dirt!/Hey, Free Dirt!"}, + [9758067029] = {"@Zork Grand Inquisitor/Imbue BEBURTT/Imbue BEBURTT"}, + [9758067008] = {"@Zork Grand Inquisitor/Into the Foliage/Into the Foliage"}, + [9758067007] = {"@Zork Grand Inquisitor/In Case of Adventure, Break Glass!/In Case of Adventure, Break Glass!"}, + [9758067009] = {"@Zork Grand Inquisitor/In Magic We Trust/In Magic We Trust"}, + [9758067041] = {"@Zork Grand Inquisitor/I Hope You Can Climb Up There With All This Junk/I Hope You Can Climb Up There With All This Junk"}, + [9758067028] = {"@Zork Grand Inquisitor/I Like Your Style!/I Like Your Style!"}, + [9758067006] = {"@Zork Grand Inquisitor/Magic Forever!/Magic Forever!"}, + [9758067026] = {"@Zork Grand Inquisitor/300 Year Old National Treasure/300 Year Old National Treasure"}, + [9758067018] = {"@Zork Grand Inquisitor/NOOOOOOOOOOOOO!/NOOOOOOOOOOOOO!"}, + [9758067032] = {"@Zork Grand Inquisitor/Nothin' Like a Good Stogie/Nothin' Like a Good Stogie"}, + [9758067047] = {"@Zork Grand Inquisitor/Oh Dear God, It's a Dragon!/Oh Dear God, It's a Dragon!"}, + [9758067016] = {"@Zork Grand Inquisitor/Old Scratch Winner!/Old Scratch Winner!"}, + [9758067045] = {"@Zork Grand Inquisitor/Open the Gates of Hell/Open the Gates of Hell"}, + [9758067034] = {"@Zork Grand Inquisitor/Outsmart the Quelbees/Outsmart the Quelbees"}, + [9758067005] = {"@Zork Grand Inquisitor/Planetfall/Planetfall"}, + [9758067035] = {"@Zork Grand Inquisitor/Plants Are Man's Best Friend/Plants Are Man's Best Friend"}, + [9758067042] = {"@Zork Grand Inquisitor/Port Foozle Time Tunnel/Port Foozle Time Tunnel"}, + [9758067031] = {"@Zork Grand Inquisitor/Prozorked/Prozorked"}, + [9758067036] = {"@Zork Grand Inquisitor/Reassemble SNAVIG/Reassemble SNAVIG"}, + [9758067038] = {"@Zork Grand Inquisitor/SNAVIG, Repaired/SNAVIG, Repaired"}, + [9758067023] = {"@Zork Grand Inquisitor/Souvenir/Souvenir"}, + [9758067044] = {"@Zork Grand Inquisitor/Strip Grue, Fire, Water/Strip Grue, Fire, Water"}, + [9758067019] = {"@Zork Grand Inquisitor/Sucking Rocks/Sucking Rocks"}, + [9758067048] = {"@Zork Grand Inquisitor/Thar She Blows!/Thar She Blows!"}, + [9758067003] = {"@Zork Grand Inquisitor/That's the Spirit!/That's the Spirit!"}, + [9758067014] = {"@Zork Grand Inquisitor/The Underground Underground/The Underground Underground"}, + [9758067000] = {"@Zork Grand Inquisitor/Totemized Daily Billboard Functioning Correctly/Totemized Daily Billboard Functioning Correctly"}, + [9758067030] = {"@Zork Grand Inquisitor/Umbrella Flowers/Umbrella Flowers"}, + [9758067025] = {"@Zork Grand Inquisitor/Useless, But Fun/Useless, But Fun"}, + [9758067033] = {"@Zork Grand Inquisitor/Want Some Rye? Course Ya Do!/Want Some Rye? Course Ya Do!"}, + [9758067043] = {"@Zork Grand Inquisitor/We Got a High Roller!/We Got a High Roller!"}, + [9758067039] = {"@Zork Grand Inquisitor/White House Time Tunnel/White House Time Tunnel"}, + [9758067037] = {"@Zork Grand Inquisitor/Wow! I've Never Gone Inside Him Before!/Wow! I've Never Gone Inside Him Before!"}, + [9758067027] = {"@Zork Grand Inquisitor/You Gained 86 Experience Points/You Gained 86 Experience Points"}, + [9758067100] = {"@Zork Grand Inquisitor/Death: Arrested With Jack/Death: Arrested With Jack"}, + [9758067110] = {"@Zork Grand Inquisitor/Death: Attacked the Quelbees/Death: Attacked the Quelbees"}, + [9758067111] = {"@Zork Grand Inquisitor/Death: Climbed Out of the Well/Death: Climbed Out of the Well"}, + [9758067101] = {"@Zork Grand Inquisitor/Death: Eaten by a Grue/Death: Eaten by a Grue"}, + [9758067102] = {"@Zork Grand Inquisitor/Death: Jumped in Bottomless Pit/Death: Jumped in Bottomless Pit"}, + [9758067116] = {"@Zork Grand Inquisitor/Death: Lost Game of Strip Grue, Fire, Water/Death: Lost Game of Strip Grue, Fire, Water"}, + [9758067112] = {"@Zork Grand Inquisitor/Death: Lost Soul to Old Scratch/Death: Lost Soul to Old Scratch"}, + [9758067113] = {"@Zork Grand Inquisitor/Death: Outsmarted by the Quelbees/Death: Outsmarted by the Quelbees"}, + [9758067114] = {"@Zork Grand Inquisitor/Death: Sliced up by the Invisible Guard/Death: Sliced up by the Invisible Guard"}, + [9758067103] = {"@Zork Grand Inquisitor/Death: Step Into the Infinite/Death: Step Into the Infinite"}, + [9758067107] = {"@Zork Grand Inquisitor/Death: Swallowed by a Dragon/Death: Swallowed by a Dragon"}, + [9758067115] = {"@Zork Grand Inquisitor/Death: THROCKed the Grass/Death: THROCKed the Grass"}, + [9758067105] = {"@Zork Grand Inquisitor/Death: Totemized?/Death: Totemized?"}, + [9758067104] = {"@Zork Grand Inquisitor/Death: Totemized... Permanently/Death: Totemized... Permanently"}, + [9758067106] = {"@Zork Grand Inquisitor/Death: You're Not Charon!?/Death: You're Not Charon!?"}, + [9758067109] = {"@Zork Grand Inquisitor/Death: Zork Rocks Exploded/Death: Zork Rocks Exploded"} +} diff --git a/scripts/init.lua b/scripts/init.lua new file mode 100644 index 0000000..083c89f --- /dev/null +++ b/scripts/init.lua @@ -0,0 +1,24 @@ +ENABLE_DEBUG_LOG = false + +ScriptHost:LoadScript("scripts/logic/logic.lua") + +Tracker:AddItems("items/items.json") + +Tracker:AddMaps("maps/maps.json") + +Tracker:AddLocations("locations/locations.json") + +Tracker:AddLayouts("layouts/tabs.json") +Tracker:AddLayouts("layouts/goals.json") +Tracker:AddLayouts("layouts/settings.json") +Tracker:AddLayouts("layouts/items.json") +Tracker:AddLayouts("layouts/spells.json") +Tracker:AddLayouts("layouts/totems.json") +Tracker:AddLayouts("layouts/subway.json") +Tracker:AddLayouts("layouts/teleporter.json") + +Tracker:AddLayouts("layouts/tracker.json") + +if PopVersion and PopVersion >= "0.18.0" then + ScriptHost:LoadScript("scripts/autotracking.lua") +end diff --git a/scripts/logic/logic.lua b/scripts/logic/logic.lua new file mode 100644 index 0000000..4557b40 --- /dev/null +++ b/scripts/logic/logic.lua @@ -0,0 +1,111 @@ +function has(item) + return Tracker:ProviderCountForCode(item) > 0 +end + +function has_not(item) + return Tracker:ProviderCountForCode(item) == 0 +end + + +-- Visibility Rules +function hasSettingDeathsanity() + return has("setting_deathsanity") +end + + +-- Access Rules +function canReachCrossroads() + return has("rope") and has("lantern") +end + +function canReachDMLair() + return canReachCrossroads() and has("sword") +end + +function canReachDMLairBackwards() + return canReachCrossroads() and has("map") and has("teleporter_destination_dungeon_masters_lair") +end + +function canReachDMLairInterior() + return (canReachDMLair() or canReachDMLairBackwards()) and has("mead_light") and has("zimdor_scroll") +end + +function canReachDragonArchipelago() + return canReachHadesBeyondGates() and has("spell_narwile") and has("spell_yastard") +end + +function canReachGUETech() + return canReachCrossroads() and (has("spell_rezrov") or (has("map") and has("teleporter_destination_gue_tech"))) +end + +function canReachGUETechBackwards() + return canReachCrossroads() and has("map") and has("teleporter_destination_spell_lab") +end + +function canReachGUETechHallway() -- This function seems redundant, but when you have the activated zork rocks, you can only enter the hallway the vanilla way + return (canReachGUETech() or canReachGUETechBackwards()) and has("spell_igram") +end + +function canReachGUETechHallwayBackwards() + return canReachGUETechBackwards() +end + +function canReachHades() + return canReachHadesShore() and has("pouch_of_zorkmids") +end + +function canReachHadesBeyondGates() + return canReachHades() and canObtainSnavig() +end + +function canReachHadesShore() + return (canReachCrossroads() and has("map") and has("teleporter_destination_hades")) or ((canReachSubwayVanilla() or canReachSubwayAlternate()) and has("subway_destination_hades")) or canReachMonastery() +end + +function canReachMonastery() + return canReachSubwayMonastery() and has("spell_glorf") and has("sword") +end + +function canReachPortFoozleJacksShop() + return has("lantern") +end + +function canReachPortFoozlePast() + return canReachMonastery() and has("large_telegraph_hammer") and has("spell_narwile") and has("spell_yastard") +end + +function canReachSpellLab() + return canReachSpellLabBridge() and has("sword") and has("spell_golgatem") and canReachSubwayFloodControlDam() and has("spell_rezrov") +end + +function canReachSpellLabBridge() + return (canReachCrossroads() and has("map") and has("teleporter_destination_spell_lab")) or (canReachGUETechHallway() and has("student_id")) +end + +function canReachSubwayVanilla() + return canReachSubwayCrossroads() and has("spell_kendall") +end + +function canReachSubwayAlternate() + return canReachCrossroads() and has("map") and (has("teleporter_destination_hades") or has("teleporter_destination_monastery")) +end + +function canReachSubwayCrossroads() + return canReachCrossroads() and has("subway_token") +end + +function canReachSubwayFloodControlDam() + return (canReachSubwayVanilla() or canReachSubwayAlternate()) and has("subway_destination_flood_control_dam_3") +end + +function canReachSubwayMonastery() + return (canReachCrossroads() and has("map") and has("teleporter_destination_monastery")) or ((canReachSubwayVanilla() or canReachSubwayAlternate()) and has("subway_destination_monastery")) +end + +function canReachWhiteHouse() + return canReachDMLairInterior() and has("spell_narwile") and has("spell_yastard") +end + +function canObtainSnavig() + return canReachDMLairInterior() and has("spell_throck") and has("snapdragon") and has("hammer") and canReachSubwayFloodControlDam() and has("spell_rezrov") and canReachSpellLab() +end diff --git a/versions.json b/versions.json new file mode 100644 index 0000000..c3ab0bb --- /dev/null +++ b/versions.json @@ -0,0 +1,18 @@ +{ + "versions": [ + { + "package_version": "0.1.0", + "download_url": "https://github.com/SerpentAI/ZorkGrandInquisitorAPTracker/archive/refs/tags/0.1.0.zip", + "sha256": "", + "changelog": [ + "Initial Release", + "Items: Tracking support for progression items", + "Locations: Tracking support for all locations, including deathsanity", + "Archipelago Settings: Tracking support for Archipelago goal and settings", + "Logic: Location visibility logic based on Archipelago settings", + "Logic: Location accessibility logic based on game state", + "Autotracking: Support for automatic tracking of items, locations and settings when connected to an Archipelago server" + ] + } + ] +} \ No newline at end of file