mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00

* Fix merge conflict * Fix formatting, fix rule for heir access after merge * Writing combat logic helpers * More helpers! * More logic! * Rename has_stick to has_melee, some fixes per Medic's review * Clamp max power from sword upgrades * Wrote the rest of the helpers * Remove unused import * Apply item classifications * Create the combat logic option * Item classification varies based on option * Add the shop sword logic stuff in * Add the rules for the boss-only option * Fix tiny issues * Some early Overworld combat logic * Fill out swamp combat logic * Add note * Bump up Boss Scav and Heir * More revisions to combat logic * Some changes, currently broken * New system for power, kinda jank probably * Revisions to new system, needs more balancing * Cap attack upgrades * Uncap mp power since it's directly related to damage output * Voidlings * Put together a table showing the vanilla-expected stats for each area * Added some info on potion counts * Made new helper functions * Make has_required_stats * Make has_combat_reqs * Update er_rules for new combat reqs * Fix all the broken things ever * Remove outdated todo * Make temp option for testing logic * More flexible choices for combat items * Hard require sword for bosses * Temporarily default combat logic to on * Finish writing overworld combat logic * East Forest combat logic done * Remove a few easy ones * Finish beneath the well * Dark Tomb combat logic * West Garden combat logic * make unit tests checkmark again * Weird west garden dagger house edge case * Try block for that weird west garden edge case * Add quarry combat logic * Update to filter out unreachable regions outside of ER * Fortress Grave Path logic, and a couple fixes to the west garden logic * Fortress east shortcut logic, and rewriting the try except blocks to use finally * Refactor to use a new function cause wow there was a lot of repeated code * Add combat logic to the other two sets of fortress fuses * Add combat rules to beneath the vault * Fix missing cathedral -> elevator connection * Combat logic for cathedral to elevator * Add cathedral main region, rename cathedral -> cathedral entry * Setup cathedral combat logic * Adjust locations' regions for ER * Add laurels zip logic to the chest in the spike room in cathedral * Add combat logic to frog's domain * Move frog's domain locations to regions for combat logic * Add new frog's domain regions for combat logic * Update region name for frog's domain * Fix typo * Add more regions for lower zig * Move around lower zig regions for combat logic * Lower Zig combat logic * Upper zig combat logic * Fix typo * Fix typos * Fix missing world. * Update combat logic description * Add todo * Add todo * Don't make zig skip if er or fixed shop is off * Make it so zig skip is only made with fewer shops and er * Temporarily default combat logic on * Update test to explicitly disable combat logic * Update test_access.py * Slight wording changes * Fix bugs, refactor quarry regions so you can access chests in lower quarry with ice grapples * Run through checks you can do with magic dagger * Run through checks you can do with magic dagger * Add rule for entering town portal of having equipment to deal with enemies * Add rule for atoll near the 6 crabs surrounding a poor defenseless baby slorm * Update the rule for the chest near the 6 crabs surrounding a slorm to also possibly require laurels * Revamp combat logic function to work properly without melee * Add laurels rules to combat logic chests * Modify beneath the vault bridge rule to need a lantern if combat logic is on * Put in money logic * Dagger or combat for swamp big skeleton chest * Remove the 100 moneys from logic * Modify lower zig ls drop region destinations * Remove completed todo * Reword combat logic option description, remove test option * Add combat logic to slot data * Merge Silent's missing slot data bugfix PR #3628 * Remove test combat option * Update combat logic description * Fix secret gathering place issue * Fix secret gathering place issue * Fix lower zig ls rule * Fix accidentally removed librarian rule * Remove redundant rule * Update gauntlet rule to hard-require a sword * Add test for a problematic connection * Adjust combat logic to deal with weird edge cases so it doesn't take stuff out of logic that was previously in logic * Fix create_item classification * Update some comments * Update per exempt's suggestion * Add combat logic to the well boss fight, reorder the combat logic stuff a little to better section them off * Add EntranceLayout option * Add back LogicRules as an invisible option, to not break old yamls * Fix a bug with seed group, continue changing fixed shop to entrance layout * Fix missed fixed shop -> entrance layout spot * Fix bug in seed groups with fixed shop on and off * Add entrance layout to the UT regen stuff * Put direction. in, will add them later * Remove unused elevation from portal class * Got like half of them in * Finish adding all of the directions * Add combat rule for zig front to back * Update per Medic's suggestion * Update ladder storage without items option description * Mess with state with collect and remove to save like 2 seconds (never again) * Save even more time, still never going to do this again on anything else * Add option check for collect and remove * Add directions to shop portals * Update direction in Portal with default * Move Direction above Portal * Add decoupled option, mess with plando connection stuff * Merge, implement verify plando directions * Condense the stuff in change and remove to less lines (thanks medic) * Remove unused thing * Swap to using logicmixin instead of prog_items (thanks Vi) * Fix consistency in stat counters * Add back something that was needed * Fix mistake when adding back * Making the fix better (thanks medic) * Make it actually return false if it gets to the backup lists and fails them * Fix stuff after merge * Add outlet regions, create new regions as needed for them * Put together part of decoupled and direction pairs * make direction pairs work * Make decoupled work * Make fixed shop work again * Fix a few minor bugs * Fix a few minor bugs * Fix plando * god i love programming * Reorder portal list * Update portal sorter for variable shops * Add missing parameter * Some cleanup of prints and functions * Fix typo * it's aliiiiiive * Make seed groups not sync decoupled * Add test with full-shop plando * Fix bug with vanilla portals * Handle plando connections and direction pair errors * Update plando checking for decoupled * Fix typo * Fix exception text to be shorter * Add some more comments * Add todo note * Remove unused safety thing * Remove extra plando connections definition in options * Make seed groups in decoupled with overlapping but not fully overlapped plando connections interact nicely without messing with what the entrances look like in the spoiler log * Fix weird edge case that is technically user error * Add note to fixed shop * Fix parsing shop names in UT * Remove debug print * Actually make UT work * multiworld. to world. * Fix typo from merge * Make it so the shops show up in the entrance hints * Fix bug in ladder storage rules * Remove blank line * # Conflicts: # worlds/tunic/__init__.py # worlds/tunic/er_data.py # worlds/tunic/er_rules.py # worlds/tunic/er_scripts.py # worlds/tunic/rules.py # worlds/tunic/test/test_access.py * Fix issues after merge * Update plando connections stuff in docs * Fix library mistake * has_stick -> has_melee * has_stick -> has_melee * Add a failsafe for direction pairing * Fix playthrough crash bug * Remove init from logicmixin * Updates per code review (thanks hesto) * has_stick to has_melee in newer update * has_stick to has_melee in newer update * # Conflicts: # worlds/tunic/__init__.py # worlds/tunic/combat_logic.py # worlds/tunic/er_data.py # worlds/tunic/er_rules.py # worlds/tunic/er_scripts.py * Cleanup more stuff after merge * Revert "Cleanup more stuff after merge" This reverts commit a6ee9a93da8f2fcc4413de6df6927b246017889d. * Revert "# Conflicts:" This reverts commit c74ccd74a45b6ad6b9abe6e339d115a0c98baf30. * Cleanup more stuff after merge * Swap to .get for decoupled so it works with older games probably maybe * Fix after merge * Fix typo * Fix UT support with fixed shop option * Backport plando connections fix * Fix issue with fixed shop + decoupled * Make the error not duplicate the while loop condition * Fix rule for quarry back to monastery * Fix more stuff after merge * Make it not output anything if you set plando connections but not ER * Add obvious note to plando connections description * Fix after merge * add comment to commented out connection --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
389 lines
32 KiB
Python
389 lines
32 KiB
Python
from . import TunicTestBase
|
|
from .. import options
|
|
|
|
|
|
class TestAccess(TunicTestBase):
|
|
options = {options.CombatLogic.internal_name: options.CombatLogic.option_off}
|
|
|
|
# test whether you can get into the temple without laurels
|
|
def test_temple_access(self) -> None:
|
|
self.collect_all_but(["Hero's Laurels", "Lantern"])
|
|
self.assertFalse(self.can_reach_location("Sealed Temple - Page Pickup"))
|
|
self.collect_by_name(["Lantern"])
|
|
self.assertTrue(self.can_reach_location("Sealed Temple - Page Pickup"))
|
|
|
|
# test that the wells function properly. Since fairies is written the same way, that should succeed too
|
|
def test_wells(self) -> None:
|
|
self.collect_all_but(["Golden Coin"])
|
|
self.assertFalse(self.can_reach_location("Coins in the Well - 3 Coins"))
|
|
self.collect_by_name(["Golden Coin"])
|
|
self.assertTrue(self.can_reach_location("Coins in the Well - 3 Coins"))
|
|
|
|
|
|
class TestStandardShuffle(TunicTestBase):
|
|
options = {options.AbilityShuffling.internal_name: options.AbilityShuffling.option_true}
|
|
|
|
# test that you need to get holy cross to open the hc door in overworld
|
|
def test_hc_door(self) -> None:
|
|
self.assertFalse(self.can_reach_location("Fountain Cross Door - Page Pickup"))
|
|
self.collect_by_name("Pages 42-43 (Holy Cross)")
|
|
self.assertTrue(self.can_reach_location("Fountain Cross Door - Page Pickup"))
|
|
|
|
|
|
class TestHexQuestShuffle(TunicTestBase):
|
|
options = {options.HexagonQuest.internal_name: options.HexagonQuest.option_true,
|
|
options.AbilityShuffling.internal_name: options.AbilityShuffling.option_true}
|
|
|
|
# test that you need the gold questagons to open the hc door in overworld
|
|
def test_hc_door_hex_shuffle(self) -> None:
|
|
self.assertFalse(self.can_reach_location("Fountain Cross Door - Page Pickup"))
|
|
self.collect_by_name("Gold Questagon")
|
|
self.assertTrue(self.can_reach_location("Fountain Cross Door - Page Pickup"))
|
|
|
|
|
|
class TestHexQuestNoShuffle(TunicTestBase):
|
|
options = {options.HexagonQuest.internal_name: options.HexagonQuest.option_true,
|
|
options.AbilityShuffling.internal_name: options.AbilityShuffling.option_false}
|
|
|
|
# test that you can get the item behind the overworld hc door with nothing and no ability shuffle
|
|
def test_hc_door_no_shuffle(self) -> None:
|
|
self.assertTrue(self.can_reach_location("Fountain Cross Door - Page Pickup"))
|
|
|
|
|
|
class TestNormalGoal(TunicTestBase):
|
|
options = {options.HexagonQuest.internal_name: options.HexagonQuest.option_false}
|
|
|
|
# test that you need the three colored hexes to reach the Heir in standard
|
|
def test_normal_goal(self) -> None:
|
|
location = ["The Heir"]
|
|
items = [["Red Questagon", "Blue Questagon", "Green Questagon"]]
|
|
self.assertAccessDependency(location, items)
|
|
|
|
|
|
class TestER(TunicTestBase):
|
|
options = {options.EntranceRando.internal_name: options.EntranceRando.option_yes,
|
|
options.AbilityShuffling.internal_name: options.AbilityShuffling.option_true,
|
|
options.HexagonQuest.internal_name: options.HexagonQuest.option_false,
|
|
options.CombatLogic.internal_name: options.CombatLogic.option_off,
|
|
options.FixedShop.internal_name: options.FixedShop.option_true}
|
|
|
|
def test_overworld_hc_chest(self) -> None:
|
|
# test to see that static connections are working properly -- this chest requires holy cross and is in Overworld
|
|
self.assertFalse(self.can_reach_location("Overworld - [Southwest] Flowers Holy Cross"))
|
|
self.collect_by_name(["Pages 42-43 (Holy Cross)"])
|
|
self.assertTrue(self.can_reach_location("Overworld - [Southwest] Flowers Holy Cross"))
|
|
|
|
|
|
class TestERSpecial(TunicTestBase):
|
|
options = {options.EntranceRando.internal_name: options.EntranceRando.option_yes,
|
|
options.AbilityShuffling.internal_name: options.AbilityShuffling.option_true,
|
|
options.HexagonQuest.internal_name: options.HexagonQuest.option_false,
|
|
options.CombatLogic.internal_name: options.CombatLogic.option_off,
|
|
options.EntranceLayout.internal_name: options.EntranceLayout.option_fixed_shop,
|
|
options.IceGrappling.internal_name: options.IceGrappling.option_easy,
|
|
"plando_connections": [
|
|
{
|
|
"entrance": "Stick House Entrance",
|
|
"exit": "Ziggurat Portal Room Entrance"
|
|
},
|
|
{
|
|
"entrance": "Ziggurat Lower to Ziggurat Tower",
|
|
"exit": "Secret Gathering Place Exit"
|
|
}
|
|
]}
|
|
# with these plando connections, you need to ice grapple from the back of lower zig to the front to get laurels
|
|
|
|
|
|
# ensure that ladder storage connections connect to the outlet region, not the portal's region
|
|
class TestLadderStorage(TunicTestBase):
|
|
options = {options.EntranceRando.internal_name: options.EntranceRando.option_yes,
|
|
options.AbilityShuffling.internal_name: options.AbilityShuffling.option_true,
|
|
options.HexagonQuest.internal_name: options.HexagonQuest.option_false,
|
|
options.FixedShop.internal_name: options.FixedShop.option_false,
|
|
options.LadderStorage.internal_name: options.LadderStorage.option_hard,
|
|
options.LadderStorageWithoutItems.internal_name: options.LadderStorageWithoutItems.option_false,
|
|
"plando_connections": [
|
|
{
|
|
"entrance": "Fortress Courtyard Shop",
|
|
# "exit": "Ziggurat Portal Room Exit"
|
|
"exit": "Spawn to Far Shore"
|
|
},
|
|
{
|
|
"entrance": "Fortress Courtyard to Beneath the Vault",
|
|
"exit": "Stick House Exit"
|
|
},
|
|
{
|
|
"entrance": "Stick House Entrance",
|
|
"exit": "Fortress Courtyard to Overworld"
|
|
},
|
|
{
|
|
"entrance": "Old House Waterfall Entrance",
|
|
"exit": "Ziggurat Portal Room Entrance"
|
|
},
|
|
]}
|
|
|
|
def test_ls_to_shop_entrance(self) -> None:
|
|
self.collect_by_name(["Magic Orb"])
|
|
self.assertFalse(self.can_reach_location("Fortress Courtyard - Page Near Cave"))
|
|
self.collect_by_name(["Pages 24-25 (Prayer)"])
|
|
self.assertTrue(self.can_reach_location("Fortress Courtyard - Page Near Cave"))
|
|
|
|
|
|
# check that it still functions if in decoupled and every single normal entrance leads to a shop
|
|
class TestERDecoupledPlando(TunicTestBase):
|
|
options = {options.EntranceRando.internal_name: options.EntranceRando.option_yes,
|
|
options.Decoupled.internal_name: options.Decoupled.option_true,
|
|
"plando_connections": [
|
|
{"entrance": "Stick House Entrance", "exit": "Shop Portal 1", "direction": "entrance"},
|
|
{"entrance": "Windmill Entrance", "exit": "Shop Portal 2", "direction": "entrance"},
|
|
{"entrance": "Well Ladder Entrance", "exit": "Shop Portal 3", "direction": "entrance"},
|
|
{"entrance": "Entrance to Well from Well Rail", "exit": "Shop Portal 4", "direction": "entrance"},
|
|
{"entrance": "Old House Door Entrance", "exit": "Shop Portal 5", "direction": "entrance"},
|
|
{"entrance": "Old House Waterfall Entrance", "exit": "Shop Portal 6", "direction": "entrance"},
|
|
{"entrance": "Entrance to Furnace from Well Rail", "exit": "Shop Portal 7", "direction": "entrance"},
|
|
{"entrance": "Entrance to Furnace under Windmill", "exit": "Shop Portal 8", "direction": "entrance"},
|
|
{"entrance": "Entrance to Furnace near West Garden", "exit": "Shop Portal 9",
|
|
"direction": "entrance"},
|
|
{"entrance": "Entrance to Furnace from Beach", "exit": "Shop Portal 10", "direction": "entrance"},
|
|
{"entrance": "Caustic Light Cave Entrance", "exit": "Shop Portal 11", "direction": "entrance"},
|
|
{"entrance": "Swamp Upper Entrance", "exit": "Shop Portal 12", "direction": "entrance"},
|
|
{"entrance": "Swamp Lower Entrance", "exit": "Shop Portal 13", "direction": "entrance"},
|
|
{"entrance": "Ruined Passage Not-Door Entrance", "exit": "Shop Portal 14", "direction": "entrance"},
|
|
{"entrance": "Ruined Passage Door Entrance", "exit": "Shop Portal 15", "direction": "entrance"},
|
|
{"entrance": "Atoll Upper Entrance", "exit": "Shop Portal 16", "direction": "entrance"},
|
|
{"entrance": "Atoll Lower Entrance", "exit": "Shop Portal 17", "direction": "entrance"},
|
|
{"entrance": "Special Shop Entrance", "exit": "Shop Portal 18", "direction": "entrance"},
|
|
{"entrance": "Maze Cave Entrance", "exit": "Shop Portal 19", "direction": "entrance"},
|
|
{"entrance": "West Garden Entrance near Belltower", "exit": "Shop Portal 20",
|
|
"direction": "entrance"},
|
|
{"entrance": "West Garden Entrance from Furnace", "exit": "Shop Portal 21", "direction": "entrance"},
|
|
{"entrance": "West Garden Laurels Entrance", "exit": "Shop Portal 22", "direction": "entrance"},
|
|
{"entrance": "Temple Door Entrance", "exit": "Shop Portal 23", "direction": "entrance"},
|
|
{"entrance": "Temple Rafters Entrance", "exit": "Shop Portal 24", "direction": "entrance"},
|
|
{"entrance": "Ruined Shop Entrance", "exit": "Shop Portal 25", "direction": "entrance"},
|
|
{"entrance": "Patrol Cave Entrance", "exit": "Shop Portal 26", "direction": "entrance"},
|
|
{"entrance": "Hourglass Cave Entrance", "exit": "Shop Portal 27", "direction": "entrance"},
|
|
{"entrance": "Changing Room Entrance", "exit": "Shop Portal 28", "direction": "entrance"},
|
|
{"entrance": "Cube Cave Entrance", "exit": "Shop Portal 29", "direction": "entrance"},
|
|
{"entrance": "Stairs from Overworld to Mountain", "exit": "Shop Portal 30", "direction": "entrance"},
|
|
{"entrance": "Overworld to Fortress", "exit": "Shop Portal 31", "direction": "entrance"},
|
|
{"entrance": "Fountain HC Door Entrance", "exit": "Shop Portal 32", "direction": "entrance"},
|
|
{"entrance": "Southeast HC Door Entrance", "exit": "Shop Portal 33", "direction": "entrance"},
|
|
{"entrance": "Overworld to Quarry Connector", "exit": "Shop Portal 34", "direction": "entrance"},
|
|
{"entrance": "Dark Tomb Main Entrance", "exit": "Shop Portal 35", "direction": "entrance"},
|
|
{"entrance": "Overworld to Forest Belltower", "exit": "Shop Portal 36", "direction": "entrance"},
|
|
{"entrance": "Town to Far Shore", "exit": "Shop Portal 37", "direction": "entrance"},
|
|
{"entrance": "Spawn to Far Shore", "exit": "Shop Portal 38", "direction": "entrance"},
|
|
{"entrance": "Secret Gathering Place Entrance", "exit": "Shop Portal 39", "direction": "entrance"},
|
|
{"entrance": "Secret Gathering Place Exit", "exit": "Shop Portal 40", "direction": "entrance"},
|
|
{"entrance": "Windmill Exit", "exit": "Shop Portal 41", "direction": "entrance"},
|
|
{"entrance": "Windmill Shop", "exit": "Shop Portal 42", "direction": "entrance"},
|
|
{"entrance": "Old House Door Exit", "exit": "Shop Portal 43", "direction": "entrance"},
|
|
{"entrance": "Old House to Glyph Tower", "exit": "Shop Portal 44", "direction": "entrance"},
|
|
{"entrance": "Old House Waterfall Exit", "exit": "Shop Portal 45", "direction": "entrance"},
|
|
{"entrance": "Glyph Tower Exit", "exit": "Shop Portal 46", "direction": "entrance"},
|
|
{"entrance": "Changing Room Exit", "exit": "Shop Portal 47", "direction": "entrance"},
|
|
{"entrance": "Fountain HC Room Exit", "exit": "Shop Portal 48", "direction": "entrance"},
|
|
{"entrance": "Cube Cave Exit", "exit": "Shop Portal 49", "direction": "entrance"},
|
|
{"entrance": "Guard Patrol Cave Exit", "exit": "Shop Portal 50", "direction": "entrance"},
|
|
{"entrance": "Ruined Shop Exit", "exit": "Shop Portal 51", "direction": "entrance"},
|
|
{"entrance": "Furnace Exit towards Well", "exit": "Shop Portal 52", "direction": "entrance"},
|
|
{"entrance": "Furnace Exit to Dark Tomb", "exit": "Shop Portal 53", "direction": "entrance"},
|
|
{"entrance": "Furnace Exit towards West Garden", "exit": "Shop Portal 54", "direction": "entrance"},
|
|
{"entrance": "Furnace Exit to Beach", "exit": "Shop Portal 55", "direction": "entrance"},
|
|
{"entrance": "Furnace Exit under Windmill", "exit": "Shop Portal 56", "direction": "entrance"},
|
|
{"entrance": "Stick House Exit", "exit": "Shop Portal 57", "direction": "entrance"},
|
|
{"entrance": "Ruined Passage Not-Door Exit", "exit": "Shop Portal 58", "direction": "entrance"},
|
|
{"entrance": "Ruined Passage Door Exit", "exit": "Shop Portal 59", "direction": "entrance"},
|
|
{"entrance": "Southeast HC Room Exit", "exit": "Shop Portal 60", "direction": "entrance"},
|
|
{"entrance": "Caustic Light Cave Exit", "exit": "Shop Portal 61", "direction": "entrance"},
|
|
{"entrance": "Maze Cave Exit", "exit": "Shop Portal 62", "direction": "entrance"},
|
|
{"entrance": "Hourglass Cave Exit", "exit": "Shop Portal 63", "direction": "entrance"},
|
|
{"entrance": "Special Shop Exit", "exit": "Shop Portal 64", "direction": "entrance"},
|
|
{"entrance": "Temple Rafters Exit", "exit": "Shop Portal 65", "direction": "entrance"},
|
|
{"entrance": "Temple Door Exit", "exit": "Shop Portal 66", "direction": "entrance"},
|
|
{"entrance": "Forest Belltower to Fortress", "exit": "Shop Portal 67", "direction": "entrance"},
|
|
{"entrance": "Forest Belltower to Forest", "exit": "Shop Portal 68", "direction": "entrance"},
|
|
{"entrance": "Forest Belltower to Overworld", "exit": "Shop Portal 69", "direction": "entrance"},
|
|
{"entrance": "Forest Belltower to Guard Captain Room", "exit": "Shop Portal 70",
|
|
"direction": "entrance"},
|
|
{"entrance": "Forest to Belltower", "exit": "Shop Portal 71", "direction": "entrance"},
|
|
{"entrance": "Forest Guard House 1 Lower Entrance", "exit": "Shop Portal 72",
|
|
"direction": "entrance"},
|
|
{"entrance": "Forest Guard House 1 Gate Entrance", "exit": "Shop Portal 73",
|
|
"direction": "entrance"},
|
|
{"entrance": "Forest Dance Fox Outside Doorway", "exit": "Shop Portal 74", "direction": "entrance"},
|
|
{"entrance": "Forest to Far Shore", "exit": "Shop Portal 75", "direction": "entrance"},
|
|
{"entrance": "Forest Guard House 2 Lower Entrance", "exit": "Shop Portal 76",
|
|
"direction": "entrance"},
|
|
{"entrance": "Forest Guard House 2 Upper Entrance", "exit": "Shop Portal 77",
|
|
"direction": "entrance"},
|
|
{"entrance": "Forest Grave Path Lower Entrance", "exit": "Shop Portal 78", "direction": "entrance"},
|
|
{"entrance": "Forest Grave Path Upper Entrance", "exit": "Shop Portal 79", "direction": "entrance"},
|
|
{"entrance": "Forest Grave Path Upper Exit", "exit": "Shop Portal 80", "direction": "entrance"},
|
|
{"entrance": "Forest Grave Path Lower Exit", "exit": "Shop Portal 81", "direction": "entrance"},
|
|
{"entrance": "East Forest Hero's Grave", "exit": "Shop Portal 82", "direction": "entrance"},
|
|
{"entrance": "Guard House 1 Dance Fox Exit", "exit": "Shop Portal 83", "direction": "entrance"},
|
|
{"entrance": "Guard House 1 Lower Exit", "exit": "Shop Portal 84", "direction": "entrance"},
|
|
{"entrance": "Guard House 1 Upper Forest Exit", "exit": "Shop Portal 85", "direction": "entrance"},
|
|
{"entrance": "Guard House 1 to Guard Captain Room", "exit": "Shop Portal 86",
|
|
"direction": "entrance"},
|
|
{"entrance": "Guard House 2 Lower Exit", "exit": "Shop Portal 87", "direction": "entrance"},
|
|
{"entrance": "Guard House 2 Upper Exit", "exit": "Shop Portal 88", "direction": "entrance"},
|
|
{"entrance": "Guard Captain Room Non-Gate Exit", "exit": "Shop Portal 89", "direction": "entrance"},
|
|
{"entrance": "Guard Captain Room Gate Exit", "exit": "Shop Portal 90", "direction": "entrance"},
|
|
{"entrance": "Well Ladder Exit", "exit": "Shop Portal 91", "direction": "entrance"},
|
|
{"entrance": "Well to Well Boss", "exit": "Shop Portal 92", "direction": "entrance"},
|
|
{"entrance": "Well Exit towards Furnace", "exit": "Shop Portal 93", "direction": "entrance"},
|
|
{"entrance": "Well Boss to Well", "exit": "Shop Portal 94", "direction": "entrance"},
|
|
{"entrance": "Checkpoint to Dark Tomb", "exit": "Shop Portal 95", "direction": "entrance"},
|
|
{"entrance": "Dark Tomb to Overworld", "exit": "Shop Portal 96", "direction": "entrance"},
|
|
{"entrance": "Dark Tomb to Furnace", "exit": "Shop Portal 97", "direction": "entrance"},
|
|
{"entrance": "Dark Tomb to Checkpoint", "exit": "Shop Portal 98", "direction": "entrance"},
|
|
{"entrance": "West Garden Exit near Hero's Grave", "exit": "Shop Portal 99",
|
|
"direction": "entrance"},
|
|
{"entrance": "West Garden to Magic Dagger House", "exit": "Shop Portal 100",
|
|
"direction": "entrance"},
|
|
{"entrance": "West Garden Exit after Boss", "exit": "Shop Portal 101", "direction": "entrance"},
|
|
{"entrance": "West Garden Shop", "exit": "Shop Portal 102", "direction": "entrance"},
|
|
{"entrance": "West Garden Laurels Exit", "exit": "Shop Portal 103", "direction": "entrance"},
|
|
{"entrance": "West Garden Hero's Grave", "exit": "Shop Portal 104", "direction": "entrance"},
|
|
{"entrance": "West Garden to Far Shore", "exit": "Shop Portal 105", "direction": "entrance"},
|
|
{"entrance": "Magic Dagger House Exit", "exit": "Shop Portal 106", "direction": "entrance"},
|
|
{"entrance": "Fortress Courtyard to Fortress Grave Path Lower", "exit": "Shop Portal 107",
|
|
"direction": "entrance"},
|
|
{"entrance": "Fortress Courtyard to Fortress Grave Path Upper", "exit": "Shop Portal 108",
|
|
"direction": "entrance"},
|
|
{"entrance": "Fortress Courtyard to Fortress Interior", "exit": "Shop Portal 109",
|
|
"direction": "entrance"},
|
|
{"entrance": "Fortress Courtyard to East Fortress", "exit": "Shop Portal 110",
|
|
"direction": "entrance"},
|
|
{"entrance": "Fortress Courtyard to Beneath the Vault", "exit": "Shop Portal 111",
|
|
"direction": "entrance"},
|
|
{"entrance": "Fortress Courtyard to Forest Belltower", "exit": "Shop Portal 112",
|
|
"direction": "entrance"},
|
|
{"entrance": "Fortress Courtyard to Overworld", "exit": "Shop Portal 113", "direction": "entrance"},
|
|
{"entrance": "Fortress Courtyard Shop", "exit": "Shop Portal 114", "direction": "entrance"},
|
|
{"entrance": "Beneath the Vault to Fortress Interior", "exit": "Shop Portal 115",
|
|
"direction": "entrance"},
|
|
{"entrance": "Beneath the Vault to Fortress Courtyard", "exit": "Shop Portal 116",
|
|
"direction": "entrance"},
|
|
{"entrance": "Fortress Interior Main Exit", "exit": "Shop Portal 117", "direction": "entrance"},
|
|
{"entrance": "Fortress Interior to Beneath the Earth", "exit": "Shop Portal 118",
|
|
"direction": "entrance"},
|
|
{"entrance": "Fortress Interior to Siege Engine Arena", "exit": "Shop Portal 119",
|
|
"direction": "entrance"},
|
|
{"entrance": "Fortress Interior Shop", "exit": "Shop Portal 120", "direction": "entrance"},
|
|
{"entrance": "Fortress Interior to East Fortress Upper", "exit": "Shop Portal 121",
|
|
"direction": "entrance"},
|
|
{"entrance": "Fortress Interior to East Fortress Lower", "exit": "Shop Portal 122",
|
|
"direction": "entrance"},
|
|
{"entrance": "East Fortress to Interior Lower", "exit": "Shop Portal 123", "direction": "entrance"},
|
|
{"entrance": "East Fortress to Courtyard", "exit": "Shop Portal 124", "direction": "entrance"},
|
|
{"entrance": "East Fortress to Interior Upper", "exit": "Shop Portal 125", "direction": "entrance"},
|
|
{"entrance": "Fortress Grave Path Lower Exit", "exit": "Shop Portal 126", "direction": "entrance"},
|
|
{"entrance": "Fortress Hero's Grave", "exit": "Shop Portal 127", "direction": "entrance"},
|
|
{"entrance": "Fortress Grave Path Upper Exit", "exit": "Shop Portal 128", "direction": "entrance"},
|
|
{"entrance": "Fortress Grave Path Dusty Entrance", "exit": "Shop Portal 129",
|
|
"direction": "entrance"},
|
|
{"entrance": "Dusty Exit", "exit": "Shop Portal 130", "direction": "entrance"},
|
|
{"entrance": "Siege Engine Arena to Fortress", "exit": "Shop Portal 131", "direction": "entrance"},
|
|
{"entrance": "Fortress to Far Shore", "exit": "Shop Portal 132", "direction": "entrance"},
|
|
{"entrance": "Atoll Upper Exit", "exit": "Shop Portal 133", "direction": "entrance"},
|
|
{"entrance": "Atoll Lower Exit", "exit": "Shop Portal 134", "direction": "entrance"},
|
|
{"entrance": "Atoll Shop", "exit": "Shop Portal 135", "direction": "entrance"},
|
|
{"entrance": "Atoll to Far Shore", "exit": "Shop Portal 136", "direction": "entrance"},
|
|
{"entrance": "Atoll Statue Teleporter", "exit": "Shop Portal 137", "direction": "entrance"},
|
|
{"entrance": "Frog Stairs Eye Entrance", "exit": "Shop Portal 138", "direction": "entrance"},
|
|
{"entrance": "Frog Stairs Mouth Entrance", "exit": "Shop Portal 139", "direction": "entrance"},
|
|
{"entrance": "Frog Stairs Eye Exit", "exit": "Shop Portal 140", "direction": "entrance"},
|
|
{"entrance": "Frog Stairs Mouth Exit", "exit": "Shop Portal 141", "direction": "entrance"},
|
|
{"entrance": "Frog Stairs to Frog's Domain's Entrance", "exit": "Shop Portal 142",
|
|
"direction": "entrance"},
|
|
{"entrance": "Frog Stairs to Frog's Domain's Exit", "exit": "Shop Portal 143",
|
|
"direction": "entrance"},
|
|
{"entrance": "Frog's Domain Ladder Exit", "exit": "Shop Portal 144", "direction": "entrance"},
|
|
{"entrance": "Frog's Domain Orb Exit", "exit": "Shop Portal 145", "direction": "entrance"},
|
|
{"entrance": "Library Exterior Tree", "exit": "Shop Portal 146", "direction": "entrance"},
|
|
{"entrance": "Library Exterior Ladder", "exit": "Shop Portal 147", "direction": "entrance"},
|
|
{"entrance": "Library Hall Bookshelf Exit", "exit": "Shop Portal 148", "direction": "entrance"},
|
|
{"entrance": "Library Hero's Grave", "exit": "Shop Portal 149", "direction": "entrance"},
|
|
{"entrance": "Library Hall to Rotunda", "exit": "Shop Portal 150", "direction": "entrance"},
|
|
{"entrance": "Library Rotunda Lower Exit", "exit": "Shop Portal 151", "direction": "entrance"},
|
|
{"entrance": "Library Rotunda Upper Exit", "exit": "Shop Portal 152", "direction": "entrance"},
|
|
{"entrance": "Library Lab to Rotunda", "exit": "Shop Portal 153", "direction": "entrance"},
|
|
{"entrance": "Library to Far Shore", "exit": "Shop Portal 154", "direction": "entrance"},
|
|
{"entrance": "Library Lab to Librarian Arena", "exit": "Shop Portal 155", "direction": "entrance"},
|
|
{"entrance": "Librarian Arena Exit", "exit": "Shop Portal 156", "direction": "entrance"},
|
|
{"entrance": "Stairs to Top of the Mountain", "exit": "Shop Portal 157", "direction": "entrance"},
|
|
{"entrance": "Mountain to Quarry", "exit": "Shop Portal 158", "direction": "entrance"},
|
|
{"entrance": "Mountain to Overworld", "exit": "Shop Portal 159", "direction": "entrance"},
|
|
{"entrance": "Top of the Mountain Exit", "exit": "Shop Portal 160", "direction": "entrance"},
|
|
{"entrance": "Quarry Connector to Overworld", "exit": "Shop Portal 161", "direction": "entrance"},
|
|
{"entrance": "Quarry Connector to Quarry", "exit": "Shop Portal 162", "direction": "entrance"},
|
|
{"entrance": "Quarry to Overworld Exit", "exit": "Shop Portal 163", "direction": "entrance"},
|
|
{"entrance": "Quarry Shop", "exit": "Shop Portal 164", "direction": "entrance"},
|
|
{"entrance": "Quarry to Monastery Front", "exit": "Shop Portal 165", "direction": "entrance"},
|
|
{"entrance": "Quarry to Monastery Back", "exit": "Shop Portal 166", "direction": "entrance"},
|
|
{"entrance": "Quarry to Mountain", "exit": "Shop Portal 167", "direction": "entrance"},
|
|
{"entrance": "Quarry to Ziggurat", "exit": "Shop Portal 168", "direction": "entrance"},
|
|
{"entrance": "Quarry to Far Shore", "exit": "Shop Portal 169", "direction": "entrance"},
|
|
{"entrance": "Monastery Rear Exit", "exit": "Shop Portal 170", "direction": "entrance"},
|
|
{"entrance": "Monastery Front Exit", "exit": "Shop Portal 171", "direction": "entrance"},
|
|
{"entrance": "Monastery Hero's Grave", "exit": "Shop Portal 172", "direction": "entrance"},
|
|
{"entrance": "Ziggurat Entry Hallway to Ziggurat Upper", "exit": "Shop Portal 173",
|
|
"direction": "entrance"},
|
|
{"entrance": "Ziggurat Entry Hallway to Quarry", "exit": "Shop Portal 174", "direction": "entrance"},
|
|
{"entrance": "Ziggurat Upper to Ziggurat Entry Hallway", "exit": "Shop Portal 175",
|
|
"direction": "entrance"},
|
|
{"entrance": "Ziggurat Upper to Ziggurat Tower", "exit": "Shop Portal 176", "direction": "entrance"},
|
|
{"entrance": "Ziggurat Tower to Ziggurat Upper", "exit": "Shop Portal 177", "direction": "entrance"},
|
|
{"entrance": "Ziggurat Tower to Ziggurat Lower", "exit": "Shop Portal 178", "direction": "entrance"},
|
|
{"entrance": "Ziggurat Lower to Ziggurat Tower", "exit": "Shop Portal 179", "direction": "entrance"},
|
|
{"entrance": "Ziggurat Portal Room Entrance", "exit": "Shop Portal 180", "direction": "entrance"},
|
|
{"entrance": "Ziggurat Portal Room Exit", "exit": "Shop Portal 181", "direction": "entrance"},
|
|
{"entrance": "Ziggurat to Far Shore", "exit": "Shop Portal 182", "direction": "entrance"},
|
|
{"entrance": "Swamp Lower Exit", "exit": "Shop Portal 183", "direction": "entrance"},
|
|
{"entrance": "Swamp to Cathedral Main Entrance", "exit": "Shop Portal 184", "direction": "entrance"},
|
|
{"entrance": "Swamp to Cathedral Secret Legend Room Entrance", "exit": "Shop Portal 185",
|
|
"direction": "entrance"},
|
|
{"entrance": "Swamp to Gauntlet", "exit": "Shop Portal 186", "direction": "entrance"},
|
|
{"entrance": "Swamp Shop", "exit": "Shop Portal 187", "direction": "entrance"},
|
|
{"entrance": "Swamp Upper Exit", "exit": "Shop Portal 188", "direction": "entrance"},
|
|
{"entrance": "Swamp Hero's Grave", "exit": "Shop Portal 189", "direction": "entrance"},
|
|
{"entrance": "Cathedral Main Exit", "exit": "Shop Portal 190", "direction": "entrance"},
|
|
{"entrance": "Cathedral Elevator", "exit": "Shop Portal 191", "direction": "entrance"},
|
|
{"entrance": "Cathedral Secret Legend Room Exit", "exit": "Shop Portal 192",
|
|
"direction": "entrance"},
|
|
{"entrance": "Gauntlet to Swamp", "exit": "Shop Portal 193", "direction": "entrance"},
|
|
{"entrance": "Gauntlet Elevator", "exit": "Shop Portal 194", "direction": "entrance"},
|
|
{"entrance": "Gauntlet Shop", "exit": "Shop Portal 195", "direction": "entrance"},
|
|
{"entrance": "Hero's Grave to Fortress", "exit": "Shop Portal 196", "direction": "entrance"},
|
|
{"entrance": "Hero's Grave to Monastery", "exit": "Shop Portal 197", "direction": "entrance"},
|
|
{"entrance": "Hero's Grave to West Garden", "exit": "Shop Portal 198", "direction": "entrance"},
|
|
{"entrance": "Hero's Grave to East Forest", "exit": "Shop Portal 199", "direction": "entrance"},
|
|
{"entrance": "Hero's Grave to Library", "exit": "Shop Portal 200", "direction": "entrance"},
|
|
{"entrance": "Hero's Grave to Swamp", "exit": "Shop Portal 201", "direction": "entrance"},
|
|
{"entrance": "Far Shore to West Garden", "exit": "Shop Portal 202", "direction": "entrance"},
|
|
{"entrance": "Far Shore to Library", "exit": "Shop Portal 203", "direction": "entrance"},
|
|
{"entrance": "Far Shore to Quarry", "exit": "Shop Portal 204", "direction": "entrance"},
|
|
{"entrance": "Far Shore to East Forest", "exit": "Shop Portal 205", "direction": "entrance"},
|
|
{"entrance": "Far Shore to Fortress", "exit": "Shop Portal 206", "direction": "entrance"},
|
|
{"entrance": "Far Shore to Atoll", "exit": "Shop Portal 207", "direction": "entrance"},
|
|
{"entrance": "Far Shore to Ziggurat", "exit": "Shop Portal 208", "direction": "entrance"},
|
|
{"entrance": "Far Shore to Heir", "exit": "Shop Portal 209", "direction": "entrance"},
|
|
{"entrance": "Far Shore to Town", "exit": "Shop Portal 210", "direction": "entrance"},
|
|
{"entrance": "Far Shore to Spawn", "exit": "Shop Portal 211", "direction": "entrance"},
|
|
{"entrance": "Heir Arena Exit", "exit": "Shop Portal 212", "direction": "entrance"},
|
|
{"entrance": "Purgatory Bottom Exit", "exit": "Shop Portal 213", "direction": "entrance"},
|
|
{"entrance": "Purgatory Top Exit", "exit": "Shop Portal 214", "direction": "entrance"},
|
|
{"entrance": "Shop Portal 215", "exit": "Shop Portal 216", "direction": "entrance"},
|
|
{"entrance": "Shop Portal 217", "exit": "Shop Portal 218", "direction": "entrance"},
|
|
{"entrance": "Shop Portal 219", "exit": "Shop Portal 220", "direction": "entrance"},
|
|
{"entrance": "Shop Portal 221", "exit": "Shop Portal 222", "direction": "entrance"},
|
|
{"entrance": "Shop Portal 223", "exit": "Shop Portal 224", "direction": "entrance"},
|
|
{"entrance": "Shop Portal 225", "exit": "Shop Portal 226", "direction": "entrance"},
|
|
{"entrance": "Shop Portal 227", "exit": "Shop Portal 228", "direction": "entrance"},
|
|
{"entrance": "Shop Portal 229", "exit": "Shop Portal 230", "direction": "entrance"},
|
|
]}
|