From f54f8622bb6edd38324a0eadc42b2daa7261f415 Mon Sep 17 00:00:00 2001
From: Alchav <59858495+Alchav@users.noreply.github.com>
Date: Sun, 26 Nov 2023 11:17:59 -0500
Subject: [PATCH] Final Fantasy Mystic Quest: Implement new game (#1909)
FFMQR by @wildham0
Uses an API created by wildham for Map Shuffle, Crest Shuffle and Battlefield Reward Shuffle, using a similar method of obtaining data from an external website to Super Metroid's Varia Preset option.
Generates a .apmq file which the user must bring to the FFMQR website https://www.ffmqrando.net/Archipelago to patch their rom. It is not an actual patch file but contains item placement and options data for the FFMQR website to generate a patched rom with for AP.
Some of the AP options may seem unusual, using Choice instead of Range where it may seem more appropriate, but these are options that are passed to FFMQR and I can only be as flexible as it is.
@wildham0 deserves the bulk of the credit for not only creating FFMQR in the first place but all the ASM work on the rom needed to make this possible, work on FFMQR to allow patching with the .apmq files, and creating the API that meant I did not have to recreate his map shuffle from scratch.
---
README.md | 1 +
WebHostLib/downloads.py | 2 +
WebHostLib/templates/macros.html | 3 +
docs/CODEOWNERS | 3 +
worlds/ffmq/Client.py | 119 +
worlds/ffmq/Items.py | 297 ++
worlds/ffmq/LICENSE | 22 +
worlds/ffmq/Options.py | 258 ++
worlds/ffmq/Output.py | 113 +
worlds/ffmq/Regions.py | 251 +
worlds/ffmq/__init__.py | 217 +
worlds/ffmq/data/entrances.yaml | 2425 ++++++++++
worlds/ffmq/data/rooms.yaml | 4026 +++++++++++++++++
worlds/ffmq/data/settings.yaml | 140 +
.../docs/en_Final Fantasy Mystic Quest.md | 33 +
worlds/ffmq/docs/setup_en.md | 162 +
16 files changed, 8072 insertions(+)
create mode 100644 worlds/ffmq/Client.py
create mode 100644 worlds/ffmq/Items.py
create mode 100644 worlds/ffmq/LICENSE
create mode 100644 worlds/ffmq/Options.py
create mode 100644 worlds/ffmq/Output.py
create mode 100644 worlds/ffmq/Regions.py
create mode 100644 worlds/ffmq/__init__.py
create mode 100644 worlds/ffmq/data/entrances.yaml
create mode 100644 worlds/ffmq/data/rooms.yaml
create mode 100644 worlds/ffmq/data/settings.yaml
create mode 100644 worlds/ffmq/docs/en_Final Fantasy Mystic Quest.md
create mode 100644 worlds/ffmq/docs/setup_en.md
diff --git a/README.md b/README.md
index 3508dd16..a1e03293 100644
--- a/README.md
+++ b/README.md
@@ -57,6 +57,7 @@ Currently, the following games are supported:
* Shivers
* Heretic
* Landstalker: The Treasures of King Nole
+* Final Fantasy Mystic Quest
For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/).
Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled
diff --git a/WebHostLib/downloads.py b/WebHostLib/downloads.py
index 5cf503be..a09ca701 100644
--- a/WebHostLib/downloads.py
+++ b/WebHostLib/downloads.py
@@ -90,6 +90,8 @@ def download_slot_file(room_id, player_id: int):
fname = f"AP_{app.jinja_env.filters['suuid'](room_id)}.json"
elif slot_data.game == "Kingdom Hearts 2":
fname = f"AP_{app.jinja_env.filters['suuid'](room_id)}_P{slot_data.player_id}_{slot_data.player_name}.zip"
+ elif slot_data.game == "Final Fantasy Mystic Quest":
+ fname = f"AP+{app.jinja_env.filters['suuid'](room_id)}_P{slot_data.player_id}_{slot_data.player_name}.apmq"
else:
return "Game download not supported."
return send_file(io.BytesIO(slot_data.data), as_attachment=True, download_name=fname)
diff --git a/WebHostLib/templates/macros.html b/WebHostLib/templates/macros.html
index 746399da..0722ee31 100644
--- a/WebHostLib/templates/macros.html
+++ b/WebHostLib/templates/macros.html
@@ -50,6 +50,9 @@
{% elif patch.game == "Dark Souls III" %}
Download JSON File...
+ {% elif patch.game == "Final Fantasy Mystic Quest" %}
+
+ Download APMQ File...
{% else %}
No file to download for this game.
{% endif %}
diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS
index 0764fa92..e221371b 100644
--- a/docs/CODEOWNERS
+++ b/docs/CODEOWNERS
@@ -55,6 +55,9 @@
# Final Fantasy
/worlds/ff1/ @jtoyoda
+# Final Fantasy Mystic Quest
+/worlds/ffmq/ @Alchav @wildham0
+
# Heretic
/worlds/heretic/ @Daivuk
diff --git a/worlds/ffmq/Client.py b/worlds/ffmq/Client.py
new file mode 100644
index 00000000..c53f2750
--- /dev/null
+++ b/worlds/ffmq/Client.py
@@ -0,0 +1,119 @@
+
+from NetUtils import ClientStatus, color
+from worlds.AutoSNIClient import SNIClient
+from .Regions import offset
+import logging
+
+snes_logger = logging.getLogger("SNES")
+
+ROM_NAME = (0x7FC0, 0x7FD4 + 1 - 0x7FC0)
+
+READ_DATA_START = 0xF50EA8
+READ_DATA_END = 0xF50FE7 + 1
+
+GAME_FLAGS = (0xF50EA8, 64)
+COMPLETED_GAME = (0xF50F22, 1)
+BATTLEFIELD_DATA = (0xF50FD4, 20)
+
+RECEIVED_DATA = (0xE01FF0, 3)
+
+ITEM_CODE_START = 0x420000
+
+IN_GAME_FLAG = (4 * 8) + 2
+
+NPC_CHECKS = {
+ 4325676: ((6 * 8) + 4, False), # Old Man Level Forest
+ 4325677: ((3 * 8) + 6, True), # Kaeli Level Forest
+ 4325678: ((25 * 8) + 1, True), # Tristam
+ 4325680: ((26 * 8) + 0, True), # Aquaria Vendor Girl
+ 4325681: ((29 * 8) + 2, True), # Phoebe Wintry Cave
+ 4325682: ((25 * 8) + 6, False), # Mysterious Man (Life Temple)
+ 4325683: ((29 * 8) + 3, True), # Reuben Mine
+ 4325684: ((29 * 8) + 7, True), # Spencer
+ 4325685: ((29 * 8) + 6, False), # Venus Chest
+ 4325686: ((29 * 8) + 1, True), # Fireburg Tristam
+ 4325687: ((26 * 8) + 1, True), # Fireburg Vendor Girl
+ 4325688: ((14 * 8) + 4, True), # MegaGrenade Dude
+ 4325689: ((29 * 8) + 5, False), # Tristam's Chest
+ 4325690: ((29 * 8) + 4, True), # Arion
+ 4325691: ((29 * 8) + 0, True), # Windia Kaeli
+ 4325692: ((26 * 8) + 2, True), # Windia Vendor Girl
+
+}
+
+
+def get_flag(data, flag):
+ byte = int(flag / 8)
+ bit = int(0x80 / (2 ** (flag % 8)))
+ return (data[byte] & bit) > 0
+
+
+class FFMQClient(SNIClient):
+ game = "Final Fantasy Mystic Quest"
+
+ async def validate_rom(self, ctx):
+ from SNIClient import snes_read
+ rom_name = await snes_read(ctx, *ROM_NAME)
+ if rom_name is None:
+ return False
+ if rom_name[:2] != b"MQ":
+ return False
+
+ ctx.rom = rom_name
+ ctx.game = self.game
+ ctx.items_handling = 0b001
+ return True
+
+ async def game_watcher(self, ctx):
+ from SNIClient import snes_buffered_write, snes_flush_writes, snes_read
+
+ check_1 = await snes_read(ctx, 0xF53749, 1)
+ received = await snes_read(ctx, RECEIVED_DATA[0], RECEIVED_DATA[1])
+ data = await snes_read(ctx, READ_DATA_START, READ_DATA_END - READ_DATA_START)
+ check_2 = await snes_read(ctx, 0xF53749, 1)
+ if check_1 == b'\x00' or check_2 == b'\x00':
+ return
+
+ def get_range(data_range):
+ return data[data_range[0] - READ_DATA_START:data_range[0] + data_range[1] - READ_DATA_START]
+ completed_game = get_range(COMPLETED_GAME)
+ battlefield_data = get_range(BATTLEFIELD_DATA)
+ game_flags = get_range(GAME_FLAGS)
+
+ if game_flags is None:
+ return
+ if not get_flag(game_flags, IN_GAME_FLAG):
+ return
+
+ if not ctx.finished_game:
+ if completed_game[0] & 0x80 and game_flags[30] & 0x18:
+ await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}])
+ ctx.finished_game = True
+
+ old_locations_checked = ctx.locations_checked.copy()
+
+ for container in range(256):
+ if get_flag(game_flags, (0x20 * 8) + container):
+ ctx.locations_checked.add(offset["Chest"] + container)
+
+ for location, data in NPC_CHECKS.items():
+ if get_flag(game_flags, data[0]) is data[1]:
+ ctx.locations_checked.add(location)
+
+ for battlefield in range(20):
+ if battlefield_data[battlefield] == 0:
+ ctx.locations_checked.add(offset["BattlefieldItem"] + battlefield + 1)
+
+ if old_locations_checked != ctx.locations_checked:
+ await ctx.send_msgs([{"cmd": 'LocationChecks', "locations": ctx.locations_checked}])
+
+ if received[0] == 0:
+ received_index = int.from_bytes(received[1:], "big")
+ if received_index < len(ctx.items_received):
+ item = ctx.items_received[received_index]
+ received_index += 1
+ code = (item.item - ITEM_CODE_START) + 1
+ if code > 256:
+ code -= 256
+ snes_buffered_write(ctx, RECEIVED_DATA[0], bytes([code, *received_index.to_bytes(2, "big")]))
+ await snes_flush_writes(ctx)
diff --git a/worlds/ffmq/Items.py b/worlds/ffmq/Items.py
new file mode 100644
index 00000000..7660bd5d
--- /dev/null
+++ b/worlds/ffmq/Items.py
@@ -0,0 +1,297 @@
+from BaseClasses import ItemClassification, Item
+
+fillers = {"Cure Potion": 61, "Heal Potion": 52, "Refresher": 17, "Seed": 2, "Bomb Refill": 19,
+ "Projectile Refill": 50}
+
+
+class ItemData:
+ def __init__(self, item_id, classification, groups=(), data_name=None):
+ self.groups = groups
+ self.classification = classification
+ self.id = None
+ if item_id is not None:
+ self.id = item_id + 0x420000
+ self.data_name = data_name
+
+
+item_table = {
+ "Elixir": ItemData(0, ItemClassification.progression, ["Key Items"]),
+ "Tree Wither": ItemData(1, ItemClassification.progression, ["Key Items"]),
+ "Wakewater": ItemData(2, ItemClassification.progression, ["Key Items"]),
+ "Venus Key": ItemData(3, ItemClassification.progression, ["Key Items"]),
+ "Multi Key": ItemData(4, ItemClassification.progression, ["Key Items"]),
+ "Mask": ItemData(5, ItemClassification.progression, ["Key Items"]),
+ "Magic Mirror": ItemData(6, ItemClassification.progression, ["Key Items"]),
+ "Thunder Rock": ItemData(7, ItemClassification.progression, ["Key Items"]),
+ "Captain's Cap": ItemData(8, ItemClassification.progression_skip_balancing, ["Key Items"]),
+ "Libra Crest": ItemData(9, ItemClassification.progression, ["Key Items"]),
+ "Gemini Crest": ItemData(10, ItemClassification.progression, ["Key Items"]),
+ "Mobius Crest": ItemData(11, ItemClassification.progression, ["Key Items"]),
+ "Sand Coin": ItemData(12, ItemClassification.progression, ["Key Items", "Coins"]),
+ "River Coin": ItemData(13, ItemClassification.progression, ["Key Items", "Coins"]),
+ "Sun Coin": ItemData(14, ItemClassification.progression, ["Key Items", "Coins"]),
+ "Sky Coin": ItemData(15, ItemClassification.progression_skip_balancing, ["Key Items", "Coins"]),
+ "Sky Fragment": ItemData(15 + 256, ItemClassification.progression_skip_balancing, ["Key Items"]),
+ "Cure Potion": ItemData(16, ItemClassification.filler, ["Consumables"]),
+ "Heal Potion": ItemData(17, ItemClassification.filler, ["Consumables"]),
+ "Seed": ItemData(18, ItemClassification.filler, ["Consumables"]),
+ "Refresher": ItemData(19, ItemClassification.filler, ["Consumables"]),
+ "Exit Book": ItemData(20, ItemClassification.useful, ["Spells"]),
+ "Cure Book": ItemData(21, ItemClassification.useful, ["Spells"]),
+ "Heal Book": ItemData(22, ItemClassification.useful, ["Spells"]),
+ "Life Book": ItemData(23, ItemClassification.useful, ["Spells"]),
+ "Quake Book": ItemData(24, ItemClassification.useful, ["Spells"]),
+ "Blizzard Book": ItemData(25, ItemClassification.useful, ["Spells"]),
+ "Fire Book": ItemData(26, ItemClassification.useful, ["Spells"]),
+ "Aero Book": ItemData(27, ItemClassification.useful, ["Spells"]),
+ "Thunder Seal": ItemData(28, ItemClassification.useful, ["Spells"]),
+ "White Seal": ItemData(29, ItemClassification.useful, ["Spells"]),
+ "Meteor Seal": ItemData(30, ItemClassification.useful, ["Spells"]),
+ "Flare Seal": ItemData(31, ItemClassification.useful, ["Spells"]),
+ "Progressive Sword": ItemData(32 + 256, ItemClassification.progression, ["Weapons", "Swords"]),
+ "Steel Sword": ItemData(32, ItemClassification.progression, ["Weapons", "Swords"]),
+ "Knight Sword": ItemData(33, ItemClassification.progression_skip_balancing, ["Weapons", "Swords"]),
+ "Excalibur": ItemData(34, ItemClassification.progression_skip_balancing, ["Weapons", "Swords"]),
+ "Progressive Axe": ItemData(35 + 256, ItemClassification.progression, ["Weapons", "Axes"]),
+ "Axe": ItemData(35, ItemClassification.progression, ["Weapons", "Axes"]),
+ "Battle Axe": ItemData(36, ItemClassification.progression_skip_balancing, ["Weapons", "Axes"]),
+ "Giant's Axe": ItemData(37, ItemClassification.progression_skip_balancing, ["Weapons", "Axes"]),
+ "Progressive Claw": ItemData(38 + 256, ItemClassification.progression, ["Weapons", "Axes"]),
+ "Cat Claw": ItemData(38, ItemClassification.progression, ["Weapons", "Claws"]),
+ "Charm Claw": ItemData(39, ItemClassification.progression_skip_balancing, ["Weapons", "Claws"]),
+ "Dragon Claw": ItemData(40, ItemClassification.progression, ["Weapons", "Claws"]),
+ "Progressive Bomb": ItemData(41 + 256, ItemClassification.progression, ["Weapons", "Bombs"]),
+ "Bomb": ItemData(41, ItemClassification.progression, ["Weapons", "Bombs"]),
+ "Jumbo Bomb": ItemData(42, ItemClassification.progression_skip_balancing, ["Weapons", "Bombs"]),
+ "Mega Grenade": ItemData(43, ItemClassification.progression, ["Weapons", "Bombs"]),
+ # Ally-only equipment does nothing when received, no reason to put them in the datapackage
+ #"Morning Star": ItemData(44, ItemClassification.progression, ["Weapons"]),
+ #"Bow Of Grace": ItemData(45, ItemClassification.progression, ["Weapons"]),
+ #"Ninja Star": ItemData(46, ItemClassification.progression, ["Weapons"]),
+
+ "Progressive Helm": ItemData(47 + 256, ItemClassification.useful, ["Helms"]),
+ "Steel Helm": ItemData(47, ItemClassification.useful, ["Helms"]),
+ "Moon Helm": ItemData(48, ItemClassification.useful, ["Helms"]),
+ "Apollo Helm": ItemData(49, ItemClassification.useful, ["Helms"]),
+ "Progressive Armor": ItemData(50 + 256, ItemClassification.useful, ["Armors"]),
+ "Steel Armor": ItemData(50, ItemClassification.useful, ["Armors"]),
+ "Noble Armor": ItemData(51, ItemClassification.useful, ["Armors"]),
+ "Gaia's Armor": ItemData(52, ItemClassification.useful, ["Armors"]),
+ #"Replica Armor": ItemData(53, ItemClassification.progression, ["Armors"]),
+ #"Mystic Robes": ItemData(54, ItemClassification.progression, ["Armors"]),
+ #"Flame Armor": ItemData(55, ItemClassification.progression, ["Armors"]),
+ #"Black Robe": ItemData(56, ItemClassification.progression, ["Armors"]),
+ "Progressive Shield": ItemData(57 + 256, ItemClassification.useful, ["Shields"]),
+ "Steel Shield": ItemData(57, ItemClassification.useful, ["Shields"]),
+ "Venus Shield": ItemData(58, ItemClassification.useful, ["Shields"]),
+ "Aegis Shield": ItemData(59, ItemClassification.useful, ["Shields"]),
+ #"Ether Shield": ItemData(60, ItemClassification.progression, ["Shields"]),
+ "Progressive Accessory": ItemData(61 + 256, ItemClassification.useful, ["Accessories"]),
+ "Charm": ItemData(61, ItemClassification.useful, ["Accessories"]),
+ "Magic Ring": ItemData(62, ItemClassification.useful, ["Accessories"]),
+ "Cupid Locket": ItemData(63, ItemClassification.useful, ["Accessories"]),
+
+ # these are understood by FFMQR and I could place these if I want, but it's easier to just let FFMQR
+ # place them. I want an option to make shuffle battlefield rewards NOT color-code the battlefields,
+ # and then I would make the non-item reward battlefields into AP checks and these would be put into those as
+ # the item for AP. But there is no such option right now.
+ # "54 XP": ItemData(96, ItemClassification.filler, data_name="Xp54"),
+ # "99 XP": ItemData(97, ItemClassification.filler, data_name="Xp99"),
+ # "540 XP": ItemData(98, ItemClassification.filler, data_name="Xp540"),
+ # "744 XP": ItemData(99, ItemClassification.filler, data_name="Xp744"),
+ # "816 XP": ItemData(100, ItemClassification.filler, data_name="Xp816"),
+ # "1068 XP": ItemData(101, ItemClassification.filler, data_name="Xp1068"),
+ # "1200 XP": ItemData(102, ItemClassification.filler, data_name="Xp1200"),
+ # "2700 XP": ItemData(103, ItemClassification.filler, data_name="Xp2700"),
+ # "2808 XP": ItemData(104, ItemClassification.filler, data_name="Xp2808"),
+ # "150 Gp": ItemData(105, ItemClassification.filler, data_name="Gp150"),
+ # "300 Gp": ItemData(106, ItemClassification.filler, data_name="Gp300"),
+ # "600 Gp": ItemData(107, ItemClassification.filler, data_name="Gp600"),
+ # "900 Gp": ItemData(108, ItemClassification.filler, data_name="Gp900"),
+ # "1200 Gp": ItemData(109, ItemClassification.filler, data_name="Gp1200"),
+
+
+ "Bomb Refill": ItemData(221, ItemClassification.filler, ["Refills"]),
+ "Projectile Refill": ItemData(222, ItemClassification.filler, ["Refills"]),
+ #"None": ItemData(255, ItemClassification.progression, []),
+
+ "Kaeli 1": ItemData(None, ItemClassification.progression),
+ "Kaeli 2": ItemData(None, ItemClassification.progression),
+ "Tristam": ItemData(None, ItemClassification.progression),
+ "Phoebe 1": ItemData(None, ItemClassification.progression),
+ "Reuben 1": ItemData(None, ItemClassification.progression),
+ "Reuben Dad Saved": ItemData(None, ItemClassification.progression),
+ "Otto": ItemData(None, ItemClassification.progression),
+ "Captain Mac": ItemData(None, ItemClassification.progression),
+ "Ship Steering Wheel": ItemData(None, ItemClassification.progression),
+ "Minotaur": ItemData(None, ItemClassification.progression),
+ "Flamerus Rex": ItemData(None, ItemClassification.progression),
+ "Phanquid": ItemData(None, ItemClassification.progression),
+ "Freezer Crab": ItemData(None, ItemClassification.progression),
+ "Ice Golem": ItemData(None, ItemClassification.progression),
+ "Jinn": ItemData(None, ItemClassification.progression),
+ "Medusa": ItemData(None, ItemClassification.progression),
+ "Dualhead Hydra": ItemData(None, ItemClassification.progression),
+ "Gidrah": ItemData(None, ItemClassification.progression),
+ "Dullahan": ItemData(None, ItemClassification.progression),
+ "Pazuzu": ItemData(None, ItemClassification.progression),
+ "Aquaria Plaza": ItemData(None, ItemClassification.progression),
+ "Summer Aquaria": ItemData(None, ItemClassification.progression),
+ "Reuben Mine": ItemData(None, ItemClassification.progression),
+ "Alive Forest": ItemData(None, ItemClassification.progression),
+ "Rainbow Bridge": ItemData(None, ItemClassification.progression),
+ "Collapse Spencer's Cave": ItemData(None, ItemClassification.progression),
+ "Ship Liberated": ItemData(None, ItemClassification.progression),
+ "Ship Loaned": ItemData(None, ItemClassification.progression),
+ "Ship Dock Access": ItemData(None, ItemClassification.progression),
+ "Stone Golem": ItemData(None, ItemClassification.progression),
+ "Twinhead Wyvern": ItemData(None, ItemClassification.progression),
+ "Zuh": ItemData(None, ItemClassification.progression),
+
+ "Libra Temple Crest Tile": ItemData(None, ItemClassification.progression),
+ "Life Temple Crest Tile": ItemData(None, ItemClassification.progression),
+ "Aquaria Vendor Crest Tile": ItemData(None, ItemClassification.progression),
+ "Fireburg Vendor Crest Tile": ItemData(None, ItemClassification.progression),
+ "Fireburg Grenademan Crest Tile": ItemData(None, ItemClassification.progression),
+ "Sealed Temple Crest Tile": ItemData(None, ItemClassification.progression),
+ "Wintry Temple Crest Tile": ItemData(None, ItemClassification.progression),
+ "Kaidge Temple Crest Tile": ItemData(None, ItemClassification.progression),
+ "Light Temple Crest Tile": ItemData(None, ItemClassification.progression),
+ "Windia Kids Crest Tile": ItemData(None, ItemClassification.progression),
+ "Windia Dock Crest Tile": ItemData(None, ItemClassification.progression),
+ "Ship Dock Crest Tile": ItemData(None, ItemClassification.progression),
+ "Alive Forest Libra Crest Tile": ItemData(None, ItemClassification.progression),
+ "Alive Forest Gemini Crest Tile": ItemData(None, ItemClassification.progression),
+ "Alive Forest Mobius Crest Tile": ItemData(None, ItemClassification.progression),
+ "Wood House Libra Crest Tile": ItemData(None, ItemClassification.progression),
+ "Wood House Gemini Crest Tile": ItemData(None, ItemClassification.progression),
+ "Wood House Mobius Crest Tile": ItemData(None, ItemClassification.progression),
+ "Barrel Pushed": ItemData(None, ItemClassification.progression),
+ "Long Spine Bombed": ItemData(None, ItemClassification.progression),
+ "Short Spine Bombed": ItemData(None, ItemClassification.progression),
+ "Skull 1 Bombed": ItemData(None, ItemClassification.progression),
+ "Skull 2 Bombed": ItemData(None, ItemClassification.progression),
+ "Ice Pyramid 1F Statue": ItemData(None, ItemClassification.progression),
+ "Ice Pyramid 3F Statue": ItemData(None, ItemClassification.progression),
+ "Ice Pyramid 4F Statue": ItemData(None, ItemClassification.progression),
+ "Ice Pyramid 5F Statue": ItemData(None, ItemClassification.progression),
+ "Spencer Cave Libra Block Bombed": ItemData(None, ItemClassification.progression),
+ "Lava Dome Plate": ItemData(None, ItemClassification.progression),
+ "Pazuzu 2F Lock": ItemData(None, ItemClassification.progression),
+ "Pazuzu 4F Lock": ItemData(None, ItemClassification.progression),
+ "Pazuzu 6F Lock": ItemData(None, ItemClassification.progression),
+ "Pazuzu 1F": ItemData(None, ItemClassification.progression),
+ "Pazuzu 2F": ItemData(None, ItemClassification.progression),
+ "Pazuzu 3F": ItemData(None, ItemClassification.progression),
+ "Pazuzu 4F": ItemData(None, ItemClassification.progression),
+ "Pazuzu 5F": ItemData(None, ItemClassification.progression),
+ "Pazuzu 6F": ItemData(None, ItemClassification.progression),
+ "Dark King": ItemData(None, ItemClassification.progression),
+ #"Barred": ItemData(None, ItemClassification.progression),
+
+}
+
+prog_map = {
+ "Swords": "Progressive Sword",
+ "Axes": "Progressive Axe",
+ "Claws": "Progressive Claw",
+ "Bombs": "Progressive Bomb",
+ "Shields": "Progressive Shield",
+ "Armors": "Progressive Armor",
+ "Helms": "Progressive Helm",
+ "Accessories": "Progressive Accessory",
+}
+
+
+def yaml_item(text):
+ if text == "CaptainCap":
+ return "Captain's Cap"
+ elif text == "WakeWater":
+ return "Wakewater"
+ return "".join(
+ [(" " + c if (c.isupper() or c.isnumeric()) and not (text[i - 1].isnumeric() and c == "F") else c) for
+ i, c in enumerate(text)]).strip()
+
+
+item_groups = {}
+for item, data in item_table.items():
+ for group in data.groups:
+ item_groups[group] = item_groups.get(group, []) + [item]
+
+
+def create_items(self) -> None:
+ items = []
+ starting_weapon = self.multiworld.starting_weapon[self.player].current_key.title().replace("_", " ")
+ if self.multiworld.progressive_gear[self.player]:
+ for item_group in prog_map:
+ if starting_weapon in self.item_name_groups[item_group]:
+ starting_weapon = prog_map[item_group]
+ break
+ self.multiworld.push_precollected(self.create_item(starting_weapon))
+ self.multiworld.push_precollected(self.create_item("Steel Armor"))
+ if self.multiworld.sky_coin_mode[self.player] == "start_with":
+ self.multiworld.push_precollected(self.create_item("Sky Coin"))
+
+ precollected_item_names = {item.name for item in self.multiworld.precollected_items[self.player]}
+
+ def add_item(item_name):
+ if item_name in ["Steel Armor", "Sky Fragment"] or "Progressive" in item_name:
+ return
+ if item_name.lower().replace(" ", "_") == self.multiworld.starting_weapon[self.player].current_key:
+ return
+ if self.multiworld.progressive_gear[self.player]:
+ for item_group in prog_map:
+ if item_name in self.item_name_groups[item_group]:
+ item_name = prog_map[item_group]
+ break
+ if item_name == "Sky Coin":
+ if self.multiworld.sky_coin_mode[self.player] == "shattered_sky_coin":
+ for _ in range(40):
+ items.append(self.create_item("Sky Fragment"))
+ return
+ elif self.multiworld.sky_coin_mode[self.player] == "save_the_crystals":
+ items.append(self.create_filler())
+ return
+ if item_name in precollected_item_names:
+ items.append(self.create_filler())
+ return
+ i = self.create_item(item_name)
+ if self.multiworld.logic[self.player] != "friendly" and item_name in ("Magic Mirror", "Mask"):
+ i.classification = ItemClassification.useful
+ if (self.multiworld.logic[self.player] == "expert" and self.multiworld.map_shuffle[self.player] == "none" and
+ item_name == "Exit Book"):
+ i.classification = ItemClassification.progression
+ items.append(i)
+
+ for item_group in ("Key Items", "Spells", "Armors", "Helms", "Shields", "Accessories", "Weapons"):
+ for item in self.item_name_groups[item_group]:
+ add_item(item)
+
+ if self.multiworld.brown_boxes[self.player] == "include":
+ filler_items = []
+ for item, count in fillers.items():
+ filler_items += [self.create_item(item) for _ in range(count)]
+ if self.multiworld.sky_coin_mode[self.player] == "shattered_sky_coin":
+ self.multiworld.random.shuffle(filler_items)
+ filler_items = filler_items[39:]
+ items += filler_items
+
+ self.multiworld.itempool += items
+
+ if len(self.multiworld.player_ids) > 1:
+ early_choices = ["Sand Coin", "River Coin"]
+ early_item = self.multiworld.random.choice(early_choices)
+ self.multiworld.early_items[self.player][early_item] = 1
+
+
+class FFMQItem(Item):
+ game = "Final Fantasy Mystic Quest"
+ type = None
+
+ def __init__(self, name, player: int = None):
+ item_data = item_table[name]
+ super(FFMQItem, self).__init__(
+ name,
+ item_data.classification,
+ item_data.id, player
+ )
\ No newline at end of file
diff --git a/worlds/ffmq/LICENSE b/worlds/ffmq/LICENSE
new file mode 100644
index 00000000..46ad1c00
--- /dev/null
+++ b/worlds/ffmq/LICENSE
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2023 Alex "Alchav" Avery
+Copyright (c) 2023 wildham
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/worlds/ffmq/Options.py b/worlds/ffmq/Options.py
new file mode 100644
index 00000000..2746bb19
--- /dev/null
+++ b/worlds/ffmq/Options.py
@@ -0,0 +1,258 @@
+from Options import Choice, FreeText, Toggle
+
+
+class Logic(Choice):
+ """Placement logic sets the rules that will be applied when placing items. Friendly: Required Items to clear a
+ dungeon will never be placed in that dungeon to avoid the need to revisit it. Also, the Magic Mirror and the Mask
+ will always be available before Ice Pyramid and Volcano, respectively. Note: If Dungeons are shuffled, Friendly
+ logic will only ensure the availability of the Mirror and the Mask. Standard: Items are randomly placed and logic
+ merely verifies that they're all accessible. As for Region access, only the Coins are considered. Expert: Same as
+ Standard, but Items Placement logic also includes other routes than Coins: the Crests Teleporters, the
+ Fireburg-Aquaria Lava bridge and the Sealed Temple Exit trick."""
+ option_friendly = 0
+ option_standard = 1
+ option_expert = 2
+ default = 1
+ display_name = "Logic"
+
+
+class BrownBoxes(Choice):
+ """Include the 201 brown box locations from the original game. Brown Boxes are all the boxes that contained a
+ consumable in the original game. If shuffle is chosen, the consumables contained will be shuffled but the brown
+ boxes will not be Archipelago location checks."""
+ option_exclude = 0
+ option_include = 1
+ option_shuffle = 2
+ default = 1
+ display_name = "Brown Boxes"
+
+
+class SkyCoinMode(Choice):
+ """Configure how the Sky Coin is acquired. With standard, the Sky Coin will be placed randomly. With Start With, the
+ Sky Coin will be in your inventory at the start of the game. With Save The Crystals, the Sky Coin will be acquired
+ once you save all 4 crystals. With Shattered Sky Coin, the Sky Coin is split in 40 fragments; you can enter Doom
+ Castle once the required amount is found. Shattered Sky Coin will force brown box locations to be included."""
+ option_standard = 0
+ option_start_with = 1
+ option_save_the_crystals = 2
+ option_shattered_sky_coin = 3
+ default = 0
+ display_name = "Sky Coin Mode"
+
+
+class ShatteredSkyCoinQuantity(Choice):
+ """Configure the number of the 40 Sky Coin Fragments required to enter the Doom Castle. Only has an effect if
+ Sky Coin Mode is set to shattered. Low: 16. Mid: 24. High: 32. Random Narrow: random between 16 and 32.
+ Random Wide: random between 10 and 38."""
+ option_low_16 = 0
+ option_mid_24 = 1
+ option_high_32 = 2
+ option_random_narrow = 3
+ option_random_wide = 4
+ default = 1
+ display_name = "Shattered Sky Coin"
+
+
+class StartingWeapon(Choice):
+ """Choose your starting weapon."""
+ display_name = "Starting Weapon"
+ option_steel_sword = 0
+ option_axe = 1
+ option_cat_claw = 2
+ option_bomb = 3
+ default = "random"
+
+
+class ProgressiveGear(Toggle):
+ """Pieces of gear are always acquired from weakest to strongest in a set."""
+ display_name = "Progressive Gear"
+
+
+class EnemiesDensity(Choice):
+ """Set how many of the original enemies are on each map."""
+ display_name = "Enemies Density"
+ option_all = 0
+ option_three_quarter = 1
+ option_half = 2
+ option_quarter = 3
+ option_none = 4
+
+
+class EnemyScaling(Choice):
+ """Superclass for enemy scaling options."""
+ option_quarter = 0
+ option_half = 1
+ option_three_quarter = 2
+ option_normal = 3
+ option_one_and_quarter = 4
+ option_one_and_half = 5
+ option_double = 6
+ option_double_and_half = 7
+ option_triple = 8
+
+
+class EnemiesScalingLower(EnemyScaling):
+ """Randomly adjust enemies stats by the selected range percentage. Include mini-bosses' weaker clones."""
+ display_name = "Enemies Scaling Lower"
+ default = 0
+
+
+class EnemiesScalingUpper(EnemyScaling):
+ """Randomly adjust enemies stats by the selected range percentage. Include mini-bosses' weaker clones."""
+ display_name = "Enemies Scaling Upper"
+ default = 4
+
+
+class BossesScalingLower(EnemyScaling):
+ """Randomly adjust bosses stats by the selected range percentage. Include Mini-Bosses, Bosses, Bosses' refights and
+ the Dark King."""
+ display_name = "Bosses Scaling Lower"
+ default = 0
+
+
+class BossesScalingUpper(EnemyScaling):
+ """Randomly adjust bosses stats by the selected range percentage. Include Mini-Bosses, Bosses, Bosses' refights and
+ the Dark King."""
+ display_name = "Bosses Scaling Upper"
+ default = 4
+
+
+class EnemizerAttacks(Choice):
+ """Shuffles enemy attacks. Standard: No shuffle. Safe: Randomize every attack but leave out self-destruct and Dark
+ King attacks. Chaos: Randomize and include self-destruct and Dark King attacks. Self Destruct: Every enemy
+ self-destructs. Simple Shuffle: Instead of randomizing, shuffle one monster's attacks to another. Dark King is left
+ vanilla."""
+ display_name = "Enemizer Attacks"
+ option_normal = 0
+ option_safe = 1
+ option_chaos = 2
+ option_self_destruct = 3
+ option_simple_shuffle = 4
+ default = 0
+
+
+class ShuffleEnemiesPositions(Toggle):
+ """Instead of their original position in a given map, enemies are randomly placed."""
+ display_name = "Shuffle Enemies' Positions"
+ default = 1
+
+
+class ProgressiveFormations(Choice):
+ """Enemies' formations are selected by regions, with the weakest formations always selected in Foresta and the
+ strongest in Windia. Disabled: Standard formations are used. Regions Strict: Formations will come exclusively
+ from the current region, whatever the map is. Regions Keep Type: Formations will keep the original formation type
+ and match with the nearest power level."""
+ display_name = "Progressive Formations"
+ option_disabled = 0
+ option_regions_strict = 1
+ option_regions_keep_type = 2
+
+
+class DoomCastle(Choice):
+ """Configure how you reach the Dark King. With Standard, you need to defeat all four bosses and their floors to
+ reach the Dark King. With Boss Rush, only the bosses are blocking your way in the corridor to the Dark King's room.
+ With Dark King Only, the way to the Dark King is free of any obstacle."""
+ display_name = "Doom Castle"
+ option_standard = 0
+ option_boss_rush = 1
+ option_dark_king_only = 2
+
+
+class DoomCastleShortcut(Toggle):
+ """Create a shortcut granting access from the start to Doom Castle at Focus Tower's entrance.
+ Also modify the Desert floor, so it can be navigated without the Mega Grenades and the Dragon Claw."""
+ display_name = "Doom Castle Shortcut"
+
+
+class TweakFrustratingDungeons(Toggle):
+ """Make some small changes to a few of the most annoying dungeons. Ice Pyramid: Add 3 shortcuts on the 1st floor.
+ Giant Tree: Add shortcuts on the 1st and 4th floors and curtail mushrooms population.
+ Pazuzu's Tower: Staircases are devoid of enemies (regardless of Enemies Density settings)."""
+ display_name = "Tweak Frustrating Dungeons"
+
+
+class MapShuffle(Choice):
+ """None: No shuffle. Overworld: Only shuffle the Overworld locations. Dungeons: Only shuffle the dungeons' floors
+ amongst themselves. Temples and Towns aren't included. Overworld And Dungeons: Shuffle the Overworld and dungeons
+ at the same time. Everything: Shuffle the Overworld, dungeons, temples and towns all amongst each others.
+ When dungeons are shuffled, defeating Pazuzu won't teleport you to the 7th floor, you have to get there normally to
+ save the Crystal and get Pazuzu's Chest."""
+ display_name = "Map Shuffle"
+ option_none = 0
+ option_overworld = 1
+ option_dungeons = 2
+ option_overworld_and_dungeons = 3
+ option_everything = 4
+ default = 0
+
+
+class CrestShuffle(Toggle):
+ """Shuffle the Crest tiles amongst themselves."""
+ display_name = "Crest Shuffle"
+
+
+class MapShuffleSeed(FreeText):
+ """If this is a number, it will be used as a set seed number for Map, Crest, and Battlefield Reward shuffles.
+ If this is "random" the seed will be chosen randomly. If it is any other text, it will be used as a seed group name.
+ All players using the same seed group name will get the same shuffle results, as long as their Map Shuffle,
+ Crest Shuffle, and Shuffle Battlefield Rewards settings are the same."""
+ display_name = "Map Shuffle Seed"
+ default = "random"
+
+
+class LevelingCurve(Choice):
+ """Adjust the level gain rate."""
+ display_name = "Leveling Curve"
+ option_half = 0
+ option_normal = 1
+ option_one_and_half = 2
+ option_double = 3
+ option_double_and_half = 4
+ option_triple = 5
+ option_quadruple = 6
+ default = 4
+
+
+class ShuffleBattlefieldRewards(Toggle):
+ """Shuffle the type of reward (Item, XP, GP) given by battlefields and color code them by reward type.
+ Blue: Give an item. Grey: Give XP. Green: Give GP."""
+ display_name = "Shuffle Battlefield Rewards"
+
+
+class BattlefieldsBattlesQuantities(Choice):
+ """Adjust the number of battles that need to be fought to get a battlefield's reward."""
+ display_name = "Battlefields Battles Quantity"
+ option_ten = 0
+ option_seven = 1
+ option_five = 2
+ option_three = 3
+ option_one = 4
+ option_random_one_through_five = 5
+ option_random_one_through_ten = 6
+
+
+option_definitions = {
+ "logic": Logic,
+ "brown_boxes": BrownBoxes,
+ "sky_coin_mode": SkyCoinMode,
+ "shattered_sky_coin_quantity": ShatteredSkyCoinQuantity,
+ "starting_weapon": StartingWeapon,
+ "progressive_gear": ProgressiveGear,
+ "enemies_density": EnemiesDensity,
+ "enemies_scaling_lower": EnemiesScalingLower,
+ "enemies_scaling_upper": EnemiesScalingUpper,
+ "bosses_scaling_lower": BossesScalingLower,
+ "bosses_scaling_upper": BossesScalingUpper,
+ "enemizer_attacks": EnemizerAttacks,
+ "shuffle_enemies_position": ShuffleEnemiesPositions,
+ "progressive_formations": ProgressiveFormations,
+ "doom_castle_mode": DoomCastle,
+ "doom_castle_shortcut": DoomCastleShortcut,
+ "tweak_frustrating_dungeons": TweakFrustratingDungeons,
+ "map_shuffle": MapShuffle,
+ "crest_shuffle": CrestShuffle,
+ "shuffle_battlefield_rewards": ShuffleBattlefieldRewards,
+ "map_shuffle_seed": MapShuffleSeed,
+ "leveling_curve": LevelingCurve,
+ "battlefields_battles_quantities": BattlefieldsBattlesQuantities,
+}
diff --git a/worlds/ffmq/Output.py b/worlds/ffmq/Output.py
new file mode 100644
index 00000000..c4c4605c
--- /dev/null
+++ b/worlds/ffmq/Output.py
@@ -0,0 +1,113 @@
+import yaml
+import os
+import zipfile
+from copy import deepcopy
+from .Regions import object_id_table
+from Main import __version__
+from worlds.Files import APContainer
+import pkgutil
+
+settings_template = yaml.load(pkgutil.get_data(__name__, "data/settings.yaml"), yaml.Loader)
+
+
+def generate_output(self, output_directory):
+ def output_item_name(item):
+ if item.player == self.player:
+ if item.code > 0x420000 + 256:
+ item_name = self.item_id_to_name[item.code - 256]
+ else:
+ item_name = item.name
+ item_name = "".join(item_name.split("'"))
+ item_name = "".join(item_name.split(" "))
+ else:
+ if item.advancement or item.useful or (item.trap and
+ self.multiworld.per_slot_randoms[self.player].randint(0, 1)):
+ item_name = "APItem"
+ else:
+ item_name = "APItemFiller"
+ return item_name
+
+ item_placement = []
+ for location in self.multiworld.get_locations(self.player):
+ if location.type != "Trigger":
+ item_placement.append({"object_id": object_id_table[location.name], "type": location.type, "content":
+ output_item_name(location.item), "player": self.multiworld.player_name[location.item.player],
+ "item_name": location.item.name})
+
+ def cc(option):
+ return option.current_key.title().replace("_", "").replace("OverworldAndDungeons", "OverworldDungeons")
+
+ def tf(option):
+ return True if option else False
+
+ options = deepcopy(settings_template)
+ options["name"] = self.multiworld.player_name[self.player]
+
+ option_writes = {
+ "enemies_density": cc(self.multiworld.enemies_density[self.player]),
+ "chests_shuffle": "Include",
+ "shuffle_boxes_content": self.multiworld.brown_boxes[self.player] == "shuffle",
+ "npcs_shuffle": "Include",
+ "battlefields_shuffle": "Include",
+ "logic_options": cc(self.multiworld.logic[self.player]),
+ "shuffle_enemies_position": tf(self.multiworld.shuffle_enemies_position[self.player]),
+ "enemies_scaling_lower": cc(self.multiworld.enemies_scaling_lower[self.player]),
+ "enemies_scaling_upper": cc(self.multiworld.enemies_scaling_upper[self.player]),
+ "bosses_scaling_lower": cc(self.multiworld.bosses_scaling_lower[self.player]),
+ "bosses_scaling_upper": cc(self.multiworld.bosses_scaling_upper[self.player]),
+ "enemizer_attacks": cc(self.multiworld.enemizer_attacks[self.player]),
+ "leveling_curve": cc(self.multiworld.leveling_curve[self.player]),
+ "battles_quantity": cc(self.multiworld.battlefields_battles_quantities[self.player]) if
+ self.multiworld.battlefields_battles_quantities[self.player].value < 5 else
+ "RandomLow" if
+ self.multiworld.battlefields_battles_quantities[self.player].value == 5 else
+ "RandomHigh",
+ "shuffle_battlefield_rewards": tf(self.multiworld.shuffle_battlefield_rewards[self.player]),
+ "random_starting_weapon": True,
+ "progressive_gear": tf(self.multiworld.progressive_gear[self.player]),
+ "tweaked_dungeons": tf(self.multiworld.tweak_frustrating_dungeons[self.player]),
+ "doom_castle_mode": cc(self.multiworld.doom_castle_mode[self.player]),
+ "doom_castle_shortcut": tf(self.multiworld.doom_castle_shortcut[self.player]),
+ "sky_coin_mode": cc(self.multiworld.sky_coin_mode[self.player]),
+ "sky_coin_fragments_qty": cc(self.multiworld.shattered_sky_coin_quantity[self.player]),
+ "enable_spoilers": False,
+ "progressive_formations": cc(self.multiworld.progressive_formations[self.player]),
+ "map_shuffling": cc(self.multiworld.map_shuffle[self.player]),
+ "crest_shuffle": tf(self.multiworld.crest_shuffle[self.player]),
+ }
+ for option, data in option_writes.items():
+ options["Final Fantasy Mystic Quest"][option][data] = 1
+
+ rom_name = f'MQ{__version__.replace(".", "")[0:3]}_{self.player}_{self.multiworld.seed_name:11}'[:21]
+ self.rom_name = bytearray(rom_name,
+ 'utf8')
+ self.rom_name_available_event.set()
+
+ setup = {"version": "1.4", "name": self.multiworld.player_name[self.player], "romname": rom_name, "seed":
+ hex(self.multiworld.per_slot_randoms[self.player].randint(0, 0xFFFFFFFF)).split("0x")[1].upper()}
+
+ starting_items = [output_item_name(item) for item in self.multiworld.precollected_items[self.player]]
+ if self.multiworld.sky_coin_mode[self.player] == "shattered_sky_coin":
+ starting_items.append("SkyCoin")
+
+ file_path = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.apmq")
+
+ APMQ = APMQFile(file_path, player=self.player, player_name=self.multiworld.player_name[self.player])
+ with zipfile.ZipFile(file_path, mode="w", compression=zipfile.ZIP_DEFLATED,
+ compresslevel=9) as zf:
+ zf.writestr("itemplacement.yaml", yaml.dump(item_placement))
+ zf.writestr("flagset.yaml", yaml.dump(options))
+ zf.writestr("startingitems.yaml", yaml.dump(starting_items))
+ zf.writestr("setup.yaml", yaml.dump(setup))
+ zf.writestr("rooms.yaml", yaml.dump(self.rooms))
+
+ APMQ.write_contents(zf)
+
+
+class APMQFile(APContainer):
+ game = "Final Fantasy Mystic Quest"
+
+ def get_manifest(self):
+ manifest = super().get_manifest()
+ manifest["patch_file_ending"] = ".apmq"
+ return manifest
\ No newline at end of file
diff --git a/worlds/ffmq/Regions.py b/worlds/ffmq/Regions.py
new file mode 100644
index 00000000..aac8289a
--- /dev/null
+++ b/worlds/ffmq/Regions.py
@@ -0,0 +1,251 @@
+from BaseClasses import Region, MultiWorld, Entrance, Location, LocationProgressType, ItemClassification
+from worlds.generic.Rules import add_rule
+from .Items import item_groups, yaml_item
+import pkgutil
+import yaml
+
+rooms = yaml.load(pkgutil.get_data(__name__, "data/rooms.yaml"), yaml.Loader)
+entrance_names = {entrance["id"]: entrance["name"] for entrance in yaml.load(pkgutil.get_data(__name__, "data/entrances.yaml"), yaml.Loader)}
+
+object_id_table = {}
+object_type_table = {}
+offset = {"Chest": 0x420000, "Box": 0x420000, "NPC": 0x420000 + 300, "BattlefieldItem": 0x420000 + 350}
+for room in rooms:
+ for object in room["game_objects"]:
+ if "Hero Chest" in object["name"] or object["type"] == "Trigger":
+ continue
+ if object["type"] in ("BattlefieldItem", "BattlefieldXp", "BattlefieldGp"):
+ object_type_table[object["name"]] = "BattlefieldItem"
+ elif object["type"] in ("Chest", "NPC", "Box"):
+ object_type_table[object["name"]] = object["type"]
+ object_id_table[object["name"]] = object["object_id"]
+
+location_table = {loc_name: offset[object_type_table[loc_name]] + obj_id for loc_name, obj_id in
+ object_id_table.items()}
+
+weapons = ("Claw", "Bomb", "Sword", "Axe")
+crest_warps = [51, 52, 53, 76, 96, 108, 158, 171, 175, 191, 275, 276, 277, 308, 334, 336, 396, 397]
+
+
+def process_rules(spot, access):
+ for weapon in weapons:
+ if weapon in access:
+ add_rule(spot, lambda state, w=weapon: state.has_any(item_groups[w + "s"], spot.player))
+ access = [yaml_item(rule) for rule in access if rule not in weapons]
+ add_rule(spot, lambda state: state.has_all(access, spot.player))
+
+
+def create_region(world: MultiWorld, player: int, name: str, room_id=None, locations=None, links=None):
+ if links is None:
+ links = []
+ ret = Region(name, player, world)
+ if locations:
+ for location in locations:
+ location.parent_region = ret
+ ret.locations.append(location)
+ ret.links = links
+ ret.id = room_id
+ return ret
+
+
+def get_entrance_to(entrance_to):
+ for room in rooms:
+ if room["id"] == entrance_to["target_room"]:
+ for link in room["links"]:
+ if link["target_room"] == entrance_to["room"]:
+ return link
+ else:
+ raise Exception(f"Did not find entrance {entrance_to}")
+
+
+def create_regions(self):
+
+ menu_region = create_region(self.multiworld, self.player, "Menu")
+ self.multiworld.regions.append(menu_region)
+
+ for room in self.rooms:
+ self.multiworld.regions.append(create_region(self.multiworld, self.player, room["name"], room["id"],
+ [FFMQLocation(self.player, object["name"], location_table[object["name"]] if object["name"] in
+ location_table else None, object["type"], object["access"],
+ self.create_item(yaml_item(object["on_trigger"][0])) if object["type"] == "Trigger" else None) for
+ object in room["game_objects"] if "Hero Chest" not in object["name"] and object["type"] not in
+ ("BattlefieldGp", "BattlefieldXp") and (object["type"] != "Box" or
+ self.multiworld.brown_boxes[self.player] == "include")], room["links"]))
+
+ dark_king_room = self.multiworld.get_region("Doom Castle Dark King Room", self.player)
+ dark_king = FFMQLocation(self.player, "Dark King", None, "Trigger", [])
+ dark_king.parent_region = dark_king_room
+ dark_king.place_locked_item(self.create_item("Dark King"))
+ dark_king_room.locations.append(dark_king)
+
+ connection = Entrance(self.player, f"Enter Overworld", menu_region)
+ connection.connect(self.multiworld.get_region("Overworld", self.player))
+ menu_region.exits.append(connection)
+
+ for region in self.multiworld.get_regions(self.player):
+ for link in region.links:
+ for connect_room in self.multiworld.get_regions(self.player):
+ if connect_room.id == link["target_room"]:
+ connection = Entrance(self.player, entrance_names[link["entrance"]] if "entrance" in link and
+ link["entrance"] != -1 else f"{region.name} to {connect_room.name}", region)
+ if "entrance" in link and link["entrance"] != -1:
+ spoiler = False
+ if link["entrance"] in crest_warps:
+ if self.multiworld.crest_shuffle[self.player]:
+ spoiler = True
+ elif self.multiworld.map_shuffle[self.player] == "everything":
+ spoiler = True
+ elif "Subregion" in region.name and self.multiworld.map_shuffle[self.player] not in ("dungeons",
+ "none"):
+ spoiler = True
+ elif "Subregion" not in region.name and self.multiworld.map_shuffle[self.player] not in ("none",
+ "overworld"):
+ spoiler = True
+
+ if spoiler:
+ self.multiworld.spoiler.set_entrance(entrance_names[link["entrance"]], connect_room.name,
+ 'both', self.player)
+ if link["access"]:
+ process_rules(connection, link["access"])
+ region.exits.append(connection)
+ connection.connect(connect_room)
+ break
+
+non_dead_end_crest_rooms = [
+ 'Libra Temple', 'Aquaria Gemini Room', "GrenadeMan's Mobius Room", 'Fireburg Gemini Room',
+ 'Sealed Temple', 'Alive Forest', 'Kaidge Temple Upper Ledge',
+ 'Windia Kid House Basement', 'Windia Old People House Basement'
+]
+
+non_dead_end_crest_warps = [
+ 'Libra Temple - Libra Tile Script', 'Aquaria Gemini Room - Gemini Script',
+ 'GrenadeMan Mobius Room - Mobius Teleporter Script', 'Fireburg Gemini Room - Gemini Teleporter Script',
+ 'Sealed Temple - Gemini Tile Script', 'Alive Forest - Libra Teleporter Script',
+ 'Alive Forest - Gemini Teleporter Script', 'Alive Forest - Mobius Teleporter Script',
+ 'Kaidge Temple - Mobius Teleporter Script', 'Windia Kid House Basement - Mobius Teleporter',
+ 'Windia Old People House Basement - Mobius Teleporter Script',
+]
+
+
+vendor_locations = ["Aquaria - Vendor", "Fireburg - Vendor", "Windia - Vendor"]
+
+
+def set_rules(self) -> None:
+ self.multiworld.completion_condition[self.player] = lambda state: state.has("Dark King", self.player)
+
+ def hard_boss_logic(state):
+ return state.has_all(["River Coin", "Sand Coin"], self.player)
+
+ add_rule(self.multiworld.get_location("Pazuzu 1F", self.player), hard_boss_logic)
+ add_rule(self.multiworld.get_location("Gidrah", self.player), hard_boss_logic)
+ add_rule(self.multiworld.get_location("Dullahan", self.player), hard_boss_logic)
+
+ if self.multiworld.map_shuffle[self.player]:
+ for boss in ("Freezer Crab", "Ice Golem", "Jinn", "Medusa", "Dualhead Hydra"):
+ loc = self.multiworld.get_location(boss, self.player)
+ checked_regions = {loc.parent_region}
+
+ def check_foresta(region):
+ if region.name == "Subregion Foresta":
+ add_rule(loc, hard_boss_logic)
+ return True
+ elif "Subregion" in region.name:
+ return True
+ for entrance in region.entrances:
+ if entrance.parent_region not in checked_regions:
+ checked_regions.add(entrance.parent_region)
+ if check_foresta(entrance.parent_region):
+ return True
+ check_foresta(loc.parent_region)
+
+ if self.multiworld.logic[self.player] == "friendly":
+ process_rules(self.multiworld.get_entrance("Overworld - Ice Pyramid", self.player),
+ ["MagicMirror"])
+ process_rules(self.multiworld.get_entrance("Overworld - Volcano", self.player),
+ ["Mask"])
+ if self.multiworld.map_shuffle[self.player] in ("none", "overworld"):
+ process_rules(self.multiworld.get_entrance("Overworld - Bone Dungeon", self.player),
+ ["Bomb"])
+ process_rules(self.multiworld.get_entrance("Overworld - Wintry Cave", self.player),
+ ["Bomb", "Claw"])
+ process_rules(self.multiworld.get_entrance("Overworld - Ice Pyramid", self.player),
+ ["Bomb", "Claw"])
+ process_rules(self.multiworld.get_entrance("Overworld - Mine", self.player),
+ ["MegaGrenade", "Claw", "Reuben1"])
+ process_rules(self.multiworld.get_entrance("Overworld - Lava Dome", self.player),
+ ["MegaGrenade"])
+ process_rules(self.multiworld.get_entrance("Overworld - Giant Tree", self.player),
+ ["DragonClaw", "Axe"])
+ process_rules(self.multiworld.get_entrance("Overworld - Mount Gale", self.player),
+ ["DragonClaw"])
+ process_rules(self.multiworld.get_entrance("Overworld - Pazuzu Tower", self.player),
+ ["DragonClaw", "Bomb"])
+ process_rules(self.multiworld.get_entrance("Overworld - Mac Ship", self.player),
+ ["DragonClaw", "CaptainCap"])
+ process_rules(self.multiworld.get_entrance("Overworld - Mac Ship Doom", self.player),
+ ["DragonClaw", "CaptainCap"])
+
+ if self.multiworld.logic[self.player] == "expert":
+ if self.multiworld.map_shuffle[self.player] == "none" and not self.multiworld.crest_shuffle[self.player]:
+ inner_room = self.multiworld.get_region("Wintry Temple Inner Room", self.player)
+ connection = Entrance(self.player, "Sealed Temple Exit Trick", inner_room)
+ connection.connect(self.multiworld.get_region("Wintry Temple Outer Room", self.player))
+ connection.access_rule = lambda state: state.has("Exit Book", self.player)
+ inner_room.exits.append(connection)
+ else:
+ for crest_warp in non_dead_end_crest_warps:
+ entrance = self.multiworld.get_entrance(crest_warp, self.player)
+ if entrance.connected_region.name in non_dead_end_crest_rooms:
+ entrance.access_rule = lambda state: False
+
+ if self.multiworld.sky_coin_mode[self.player] == "shattered_sky_coin":
+ logic_coins = [16, 24, 32, 32, 38][self.multiworld.shattered_sky_coin_quantity[self.player].value]
+ self.multiworld.get_entrance("Focus Tower 1F - Sky Door", self.player).access_rule = \
+ lambda state: state.has("Sky Fragment", self.player, logic_coins)
+ elif self.multiworld.sky_coin_mode[self.player] == "save_the_crystals":
+ self.multiworld.get_entrance("Focus Tower 1F - Sky Door", self.player).access_rule = \
+ lambda state: state.has_all(["Flamerus Rex", "Dualhead Hydra", "Ice Golem", "Pazuzu"], self.player)
+ elif self.multiworld.sky_coin_mode[self.player] in ("standard", "start_with"):
+ self.multiworld.get_entrance("Focus Tower 1F - Sky Door", self.player).access_rule = \
+ lambda state: state.has("Sky Coin", self.player)
+
+
+def stage_set_rules(multiworld):
+ # If there's no enemies, there's no repeatable income sources
+ no_enemies_players = [player for player in multiworld.get_game_players("Final Fantasy Mystic Quest")
+ if multiworld.enemies_density[player] == "none"]
+ if (len([item for item in multiworld.itempool if item.classification in (ItemClassification.filler,
+ ItemClassification.trap)]) > len([player for player in no_enemies_players if
+ multiworld.accessibility[player] == "minimal"]) * 3):
+ for player in no_enemies_players:
+ for location in vendor_locations:
+ if multiworld.accessibility[player] == "locations":
+ print("exclude")
+ multiworld.get_location(location, player).progress_type = LocationProgressType.EXCLUDED
+ else:
+ print("unreachable")
+ multiworld.get_location(location, player).access_rule = lambda state: False
+ else:
+ # There are not enough junk items to fill non-minimal players' vendors. Just set an item rule not allowing
+ # advancement items so that useful items can be placed.
+ print("no advancement")
+ for player in no_enemies_players:
+ for location in vendor_locations:
+ multiworld.get_location(location, player).item_rule = lambda item: not item.advancement
+
+
+
+
+class FFMQLocation(Location):
+ game = "Final Fantasy Mystic Quest"
+
+ def __init__(self, player, name, address, loc_type, access=None, event=None):
+ super(FFMQLocation, self).__init__(
+ player, name,
+ address
+ )
+ self.type = loc_type
+ if access:
+ process_rules(self, access)
+ if event:
+ self.place_locked_item(event)
diff --git a/worlds/ffmq/__init__.py b/worlds/ffmq/__init__.py
new file mode 100644
index 00000000..b6f19a77
--- /dev/null
+++ b/worlds/ffmq/__init__.py
@@ -0,0 +1,217 @@
+import Utils
+import settings
+import base64
+import threading
+import requests
+import yaml
+from worlds.AutoWorld import World, WebWorld
+from BaseClasses import Tutorial
+from .Regions import create_regions, location_table, set_rules, stage_set_rules, rooms, non_dead_end_crest_rooms,\
+ non_dead_end_crest_warps
+from .Items import item_table, item_groups, create_items, FFMQItem, fillers
+from .Output import generate_output
+from .Options import option_definitions
+from .Client import FFMQClient
+
+
+# removed until lists are supported
+# class FFMQSettings(settings.Group):
+# class APIUrls(list):
+# """A list of API URLs to get map shuffle, crest shuffle, and battlefield reward shuffle data from."""
+# api_urls: APIUrls = [
+# "https://api.ffmqrando.net/",
+# "http://ffmqr.jalchavware.com:5271/"
+# ]
+
+
+class FFMQWebWorld(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to playing Final Fantasy Mystic Quest with Archipelago.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["Alchav"]
+ )]
+
+
+class FFMQWorld(World):
+ """Final Fantasy: Mystic Quest is a simple, humorous RPG for the Super Nintendo. You travel across four continents,
+ linked in the middle of the world by the Focus Tower, which has been locked by four magical coins. Make your way to
+ the bottom of the Focus Tower, then straight up through the top!"""
+ # -Giga Otomia
+
+ game = "Final Fantasy Mystic Quest"
+
+ item_name_to_id = {name: data.id for name, data in item_table.items() if data.id is not None}
+ location_name_to_id = location_table
+ option_definitions = option_definitions
+
+ topology_present = True
+
+ item_name_groups = item_groups
+
+ generate_output = generate_output
+ create_items = create_items
+ create_regions = create_regions
+ set_rules = set_rules
+ stage_set_rules = stage_set_rules
+
+ data_version = 1
+
+ web = FFMQWebWorld()
+ # settings: FFMQSettings
+
+ def __init__(self, world, player: int):
+ self.rom_name_available_event = threading.Event()
+ self.rom_name = None
+ self.rooms = None
+ super().__init__(world, player)
+
+ def generate_early(self):
+ if self.multiworld.sky_coin_mode[self.player] == "shattered_sky_coin":
+ self.multiworld.brown_boxes[self.player].value = 1
+ if self.multiworld.enemies_scaling_lower[self.player].value > \
+ self.multiworld.enemies_scaling_upper[self.player].value:
+ (self.multiworld.enemies_scaling_lower[self.player].value,
+ self.multiworld.enemies_scaling_upper[self.player].value) =\
+ (self.multiworld.enemies_scaling_upper[self.player].value,
+ self.multiworld.enemies_scaling_lower[self.player].value)
+ if self.multiworld.bosses_scaling_lower[self.player].value > \
+ self.multiworld.bosses_scaling_upper[self.player].value:
+ (self.multiworld.bosses_scaling_lower[self.player].value,
+ self.multiworld.bosses_scaling_upper[self.player].value) =\
+ (self.multiworld.bosses_scaling_upper[self.player].value,
+ self.multiworld.bosses_scaling_lower[self.player].value)
+
+ @classmethod
+ def stage_generate_early(cls, multiworld):
+
+ # api_urls = Utils.get_options()["ffmq_options"].get("api_urls", None)
+ api_urls = [
+ "https://api.ffmqrando.net/",
+ "http://ffmqr.jalchavware.com:5271/"
+ ]
+
+ rooms_data = {}
+
+ for world in multiworld.get_game_worlds("Final Fantasy Mystic Quest"):
+ if (world.multiworld.map_shuffle[world.player] or world.multiworld.crest_shuffle[world.player] or
+ world.multiworld.crest_shuffle[world.player]):
+ if world.multiworld.map_shuffle_seed[world.player].value.isdigit():
+ multiworld.random.seed(int(world.multiworld.map_shuffle_seed[world.player].value))
+ elif world.multiworld.map_shuffle_seed[world.player].value != "random":
+ multiworld.random.seed(int(hash(world.multiworld.map_shuffle_seed[world.player].value))
+ + int(world.multiworld.seed))
+
+ seed = hex(multiworld.random.randint(0, 0xFFFFFFFF)).split("0x")[1].upper()
+ map_shuffle = multiworld.map_shuffle[world.player].value
+ crest_shuffle = multiworld.crest_shuffle[world.player].current_key
+ battlefield_shuffle = multiworld.shuffle_battlefield_rewards[world.player].current_key
+
+ query = f"s={seed}&m={map_shuffle}&c={crest_shuffle}&b={battlefield_shuffle}"
+
+ if query in rooms_data:
+ world.rooms = rooms_data[query]
+ continue
+
+ if not api_urls:
+ raise Exception("No FFMQR API URLs specified in host.yaml")
+
+ errors = []
+ for api_url in api_urls.copy():
+ try:
+ response = requests.get(f"{api_url}GenerateRooms?{query}")
+ except (ConnectionError, requests.exceptions.HTTPError, requests.exceptions.ConnectionError,
+ requests.exceptions.RequestException) as err:
+ api_urls.remove(api_url)
+ errors.append([api_url, err])
+ else:
+ if response.ok:
+ world.rooms = rooms_data[query] = yaml.load(response.text, yaml.Loader)
+ break
+ else:
+ api_urls.remove(api_url)
+ errors.append([api_url, response])
+ else:
+ error_text = f"Failed to fetch map shuffle data for FFMQ player {world.player}"
+ for error in errors:
+ error_text += f"\n{error[0]} - got error {error[1].status_code} {error[1].reason} {error[1].text}"
+ raise Exception(error_text)
+ api_urls.append(api_urls.pop(0))
+ else:
+ world.rooms = rooms
+
+ def create_item(self, name: str):
+ return FFMQItem(name, self.player)
+
+ def collect_item(self, state, item, remove=False):
+ if "Progressive" in item.name:
+ i = item.code - 256
+ if state.has(self.item_id_to_name[i], self.player):
+ if state.has(self.item_id_to_name[i+1], self.player):
+ return self.item_id_to_name[i+2]
+ return self.item_id_to_name[i+1]
+ return self.item_id_to_name[i]
+ return item.name if item.advancement else None
+
+ def modify_multidata(self, multidata):
+ # wait for self.rom_name to be available.
+ self.rom_name_available_event.wait()
+ rom_name = getattr(self, "rom_name", None)
+ # we skip in case of error, so that the original error in the output thread is the one that gets raised
+ if rom_name:
+ new_name = base64.b64encode(bytes(self.rom_name)).decode()
+ payload = multidata["connect_names"][self.multiworld.player_name[self.player]]
+ multidata["connect_names"][new_name] = payload
+
+ def get_filler_item_name(self):
+ r = self.multiworld.random.randint(0, 201)
+ for item, count in fillers.items():
+ r -= count
+ r -= fillers[item]
+ if r <= 0:
+ return item
+
+ def extend_hint_information(self, hint_data):
+ hint_data[self.player] = {}
+ if self.multiworld.map_shuffle[self.player]:
+ single_location_regions = ["Subregion Volcano Battlefield", "Subregion Mac's Ship", "Subregion Doom Castle"]
+ for subregion in ["Subregion Foresta", "Subregion Aquaria", "Subregion Frozen Fields", "Subregion Fireburg",
+ "Subregion Volcano Battlefield", "Subregion Windia", "Subregion Mac's Ship",
+ "Subregion Doom Castle"]:
+ region = self.multiworld.get_region(subregion, self.player)
+ for location in region.locations:
+ if location.address and self.multiworld.map_shuffle[self.player] != "dungeons":
+ hint_data[self.player][location.address] = (subregion.split("Subregion ")[-1]
+ + (" Region" if subregion not in
+ single_location_regions else ""))
+ for overworld_spot in region.exits:
+ if ("Subregion" in overworld_spot.connected_region.name or
+ overworld_spot.name == "Overworld - Mac Ship Doom" or "Focus Tower" in overworld_spot.name
+ or "Doom Castle" in overworld_spot.name or overworld_spot.name == "Overworld - Giant Tree"):
+ continue
+ exits = list(overworld_spot.connected_region.exits) + [overworld_spot]
+ checked_regions = set()
+ while exits:
+ exit_check = exits.pop()
+ if (exit_check.connected_region not in checked_regions and "Subregion" not in
+ exit_check.connected_region.name):
+ checked_regions.add(exit_check.connected_region)
+ exits.extend(exit_check.connected_region.exits)
+ for location in exit_check.connected_region.locations:
+ if location.address:
+ hint = []
+ if self.multiworld.map_shuffle[self.player] != "dungeons":
+ hint.append((subregion.split("Subregion ")[-1] + (" Region" if subregion not
+ in single_location_regions else "")))
+ if self.multiworld.map_shuffle[self.player] != "overworld" and subregion not in \
+ ("Subregion Mac's Ship", "Subregion Doom Castle"):
+ hint.append(overworld_spot.name.split("Overworld - ")[-1].replace("Pazuzu",
+ "Pazuzu's"))
+ hint = " - ".join(hint)
+ if location.address in hint_data[self.player]:
+ hint_data[self.player][location.address] += f"/{hint}"
+ else:
+ hint_data[self.player][location.address] = hint
+
diff --git a/worlds/ffmq/data/entrances.yaml b/worlds/ffmq/data/entrances.yaml
new file mode 100644
index 00000000..15bcd02b
--- /dev/null
+++ b/worlds/ffmq/data/entrances.yaml
@@ -0,0 +1,2425 @@
+- name: Doom Castle - Sand Floor - To Sky Door - Sand Floor
+ id: 0
+ area: 7
+ coordinates: [24, 19]
+ teleporter: [0, 0]
+- name: Doom Castle - Sand Floor - Main Entrance - Sand Floor
+ id: 1
+ area: 7
+ coordinates: [19, 43]
+ teleporter: [1, 6]
+- name: Doom Castle - Aero Room - Aero Room Entrance
+ id: 2
+ area: 7
+ coordinates: [27, 39]
+ teleporter: [1, 0]
+- name: Focus Tower B1 - Main Loop - South Entrance
+ id: 3
+ area: 8
+ coordinates: [43, 60]
+ teleporter: [2, 6]
+- name: Focus Tower B1 - Main Loop - To Focus Tower 1F - Main Hall
+ id: 4
+ area: 8
+ coordinates: [37, 41]
+ teleporter: [4, 0]
+- name: Focus Tower B1 - Aero Corridor - To Focus Tower 1F - Sun Coin Room
+ id: 5
+ area: 8
+ coordinates: [59, 35]
+ teleporter: [5, 0]
+- name: Focus Tower B1 - Aero Corridor - To Sand Floor - Aero Chest
+ id: 6
+ area: 8
+ coordinates: [57, 59]
+ teleporter: [8, 0]
+- name: Focus Tower B1 - Inner Loop - To Focus Tower 1F - Sky Door
+ id: 7
+ area: 8
+ coordinates: [51, 49]
+ teleporter: [6, 0]
+- name: Focus Tower B1 - Inner Loop - To Doom Castle Sand Floor
+ id: 8
+ area: 8
+ coordinates: [51, 45]
+ teleporter: [7, 0]
+- name: Focus Tower 1F - Focus Tower West Entrance
+ id: 9
+ area: 9
+ coordinates: [25, 29]
+ teleporter: [3, 6]
+- name: Focus Tower 1F - To Focus Tower 2F - From SandCoin
+ id: 10
+ area: 9
+ coordinates: [16, 4]
+ teleporter: [10, 0]
+- name: Focus Tower 1F - To Focus Tower B1 - Main Hall
+ id: 11
+ area: 9
+ coordinates: [4, 23]
+ teleporter: [11, 0]
+- name: Focus Tower 1F - To Focus Tower B1 - To Aero Chest
+ id: 12
+ area: 9
+ coordinates: [26, 17]
+ teleporter: [12, 0]
+- name: Focus Tower 1F - Sky Door
+ id: 13
+ area: 9
+ coordinates: [16, 24]
+ teleporter: [13, 0]
+- name: Focus Tower 1F - To Focus Tower 2F - From RiverCoin
+ id: 14
+ area: 9
+ coordinates: [16, 10]
+ teleporter: [14, 0]
+- name: Focus Tower 1F - To Focus Tower B1 - From Sky Door
+ id: 15
+ area: 9
+ coordinates: [16, 29]
+ teleporter: [15, 0]
+- name: Focus Tower 2F - Sand Coin Passage - North Entrance
+ id: 16
+ area: 10
+ coordinates: [49, 30]
+ teleporter: [4, 6]
+- name: Focus Tower 2F - Sand Coin Passage - To Focus Tower 1F - To SandCoin
+ id: 17
+ area: 10
+ coordinates: [47, 33]
+ teleporter: [17, 0]
+- name: Focus Tower 2F - River Coin Passage - To Focus Tower 1F - To RiverCoin
+ id: 18
+ area: 10
+ coordinates: [47, 41]
+ teleporter: [18, 0]
+- name: Focus Tower 2F - River Coin Passage - To Focus Tower 3F - Lower Floor
+ id: 19
+ area: 10
+ coordinates: [38, 40]
+ teleporter: [20, 0]
+- name: Focus Tower 2F - Venus Chest Room - To Focus Tower 3F - Upper Floor
+ id: 20
+ area: 10
+ coordinates: [56, 40]
+ teleporter: [19, 0]
+- name: Focus Tower 2F - Venus Chest Room - Pillar Script
+ id: 21
+ area: 10
+ coordinates: [48, 53]
+ teleporter: [13, 8]
+- name: Focus Tower 3F - Lower Floor - To Fireburg Entrance
+ id: 22
+ area: 11
+ coordinates: [11, 39]
+ teleporter: [6, 6]
+- name: Focus Tower 3F - Lower Floor - To Focus Tower 2F - Jump on Pillar
+ id: 23
+ area: 11
+ coordinates: [6, 47]
+ teleporter: [24, 0]
+- name: Focus Tower 3F - Upper Floor - To Aquaria Entrance
+ id: 24
+ area: 11
+ coordinates: [21, 38]
+ teleporter: [5, 6]
+- name: Focus Tower 3F - Upper Floor - To Focus Tower 2F - Venus Chest Room
+ id: 25
+ area: 11
+ coordinates: [24, 47]
+ teleporter: [23, 0]
+- name: Level Forest - Boulder Script
+ id: 26
+ area: 14
+ coordinates: [52, 15]
+ teleporter: [0, 8]
+- name: Level Forest - Rotten Tree Script
+ id: 27
+ area: 14
+ coordinates: [47, 6]
+ teleporter: [2, 8]
+- name: Level Forest - Exit Level Forest 1
+ id: 28
+ area: 14
+ coordinates: [46, 25]
+ teleporter: [25, 0]
+- name: Level Forest - Exit Level Forest 2
+ id: 29
+ area: 14
+ coordinates: [46, 26]
+ teleporter: [25, 0]
+- name: Level Forest - Exit Level Forest 3
+ id: 30
+ area: 14
+ coordinates: [47, 25]
+ teleporter: [25, 0]
+- name: Level Forest - Exit Level Forest 4
+ id: 31
+ area: 14
+ coordinates: [47, 26]
+ teleporter: [25, 0]
+- name: Level Forest - Exit Level Forest 5
+ id: 32
+ area: 14
+ coordinates: [60, 14]
+ teleporter: [25, 0]
+- name: Level Forest - Exit Level Forest 6
+ id: 33
+ area: 14
+ coordinates: [61, 14]
+ teleporter: [25, 0]
+- name: Level Forest - Exit Level Forest 7
+ id: 34
+ area: 14
+ coordinates: [46, 4]
+ teleporter: [25, 0]
+- name: Level Forest - Exit Level Forest 8
+ id: 35
+ area: 14
+ coordinates: [46, 3]
+ teleporter: [25, 0]
+- name: Level Forest - Exit Level Forest 9
+ id: 36
+ area: 14
+ coordinates: [47, 4]
+ teleporter: [25, 0]
+- name: Level Forest - Exit Level Forest A
+ id: 37
+ area: 14
+ coordinates: [47, 3]
+ teleporter: [25, 0]
+- name: Foresta - Exit Foresta 1
+ id: 38
+ area: 15
+ coordinates: [10, 25]
+ teleporter: [31, 0]
+- name: Foresta - Exit Foresta 2
+ id: 39
+ area: 15
+ coordinates: [10, 26]
+ teleporter: [31, 0]
+- name: Foresta - Exit Foresta 3
+ id: 40
+ area: 15
+ coordinates: [11, 25]
+ teleporter: [31, 0]
+- name: Foresta - Exit Foresta 4
+ id: 41
+ area: 15
+ coordinates: [11, 26]
+ teleporter: [31, 0]
+- name: Foresta - Old Man House - Front Door
+ id: 42
+ area: 15
+ coordinates: [25, 17]
+ teleporter: [32, 4]
+- name: Foresta - Old Man House - Back Door
+ id: 43
+ area: 15
+ coordinates: [25, 14]
+ teleporter: [33, 0]
+- name: Foresta - Kaeli's House
+ id: 44
+ area: 15
+ coordinates: [7, 21]
+ teleporter: [0, 5]
+- name: Foresta - Rest House
+ id: 45
+ area: 15
+ coordinates: [23, 23]
+ teleporter: [1, 5]
+- name: Kaeli's House - Kaeli's House Entrance
+ id: 46
+ area: 16
+ coordinates: [11, 20]
+ teleporter: [86, 3]
+- name: Foresta Houses - Old Man's House - Old Man Front Exit
+ id: 47
+ area: 17
+ coordinates: [35, 44]
+ teleporter: [34, 0]
+- name: Foresta Houses - Old Man's House - Old Man Back Exit
+ id: 48
+ area: 17
+ coordinates: [35, 27]
+ teleporter: [35, 0]
+- name: Foresta - Old Man House - Barrel Tile Script # New, use the focus tower column's script
+ id: 483
+ area: 17
+ coordinates: [0x23, 0x1E]
+ teleporter: [0x0D, 8]
+- name: Foresta Houses - Rest House - Bed Script
+ id: 49
+ area: 17
+ coordinates: [30, 6]
+ teleporter: [1, 8]
+- name: Foresta Houses - Rest House - Rest House Exit
+ id: 50
+ area: 17
+ coordinates: [35, 20]
+ teleporter: [87, 3]
+- name: Foresta Houses - Libra House - Libra House Script
+ id: 51
+ area: 17
+ coordinates: [8, 49]
+ teleporter: [67, 8]
+- name: Foresta Houses - Gemini House - Gemini House Script
+ id: 52
+ area: 17
+ coordinates: [26, 55]
+ teleporter: [68, 8]
+- name: Foresta Houses - Mobius House - Mobius House Script
+ id: 53
+ area: 17
+ coordinates: [14, 33]
+ teleporter: [69, 8]
+- name: Sand Temple - Sand Temple Entrance
+ id: 54
+ area: 18
+ coordinates: [56, 27]
+ teleporter: [36, 0]
+- name: Bone Dungeon 1F - Bone Dungeon Entrance
+ id: 55
+ area: 19
+ coordinates: [13, 60]
+ teleporter: [37, 0]
+- name: Bone Dungeon 1F - To Bone Dungeon B1
+ id: 56
+ area: 19
+ coordinates: [13, 39]
+ teleporter: [2, 2]
+- name: Bone Dungeon B1 - Waterway - Exit Waterway
+ id: 57
+ area: 20
+ coordinates: [27, 39]
+ teleporter: [3, 2]
+- name: Bone Dungeon B1 - Waterway - Tristam's Script
+ id: 58
+ area: 20
+ coordinates: [27, 45]
+ teleporter: [3, 8]
+- name: Bone Dungeon B1 - Waterway - To Bone Dungeon 1F
+ id: 59
+ area: 20
+ coordinates: [54, 61]
+ teleporter: [88, 3]
+- name: Bone Dungeon B1 - Checker Room - Exit Checker Room
+ id: 60
+ area: 20
+ coordinates: [23, 40]
+ teleporter: [4, 2]
+- name: Bone Dungeon B1 - Checker Room - To Waterway
+ id: 61
+ area: 20
+ coordinates: [39, 49]
+ teleporter: [89, 3]
+- name: Bone Dungeon B1 - Hidden Room - To B2 - Exploding Skull Room
+ id: 62
+ area: 20
+ coordinates: [5, 33]
+ teleporter: [91, 3]
+- name: Bonne Dungeon B2 - Exploding Skull Room - To Hidden Passage
+ id: 63
+ area: 21
+ coordinates: [19, 13]
+ teleporter: [5, 2]
+- name: Bonne Dungeon B2 - Exploding Skull Room - To Two Skulls Room
+ id: 64
+ area: 21
+ coordinates: [29, 15]
+ teleporter: [6, 2]
+- name: Bonne Dungeon B2 - Exploding Skull Room - To Checker Room
+ id: 65
+ area: 21
+ coordinates: [8, 25]
+ teleporter: [90, 3]
+- name: Bonne Dungeon B2 - Box Room - To B2 - Two Skulls Room
+ id: 66
+ area: 21
+ coordinates: [59, 12]
+ teleporter: [93, 3]
+- name: Bonne Dungeon B2 - Quake Room - To B2 - Two Skulls Room
+ id: 67
+ area: 21
+ coordinates: [59, 28]
+ teleporter: [94, 3]
+- name: Bonne Dungeon B2 - Two Skulls Room - To Box Room
+ id: 68
+ area: 21
+ coordinates: [53, 7]
+ teleporter: [7, 2]
+- name: Bonne Dungeon B2 - Two Skulls Room - To Quake Room
+ id: 69
+ area: 21
+ coordinates: [41, 3]
+ teleporter: [8, 2]
+- name: Bonne Dungeon B2 - Two Skulls Room - To Boss Room
+ id: 70
+ area: 21
+ coordinates: [47, 57]
+ teleporter: [9, 2]
+- name: Bonne Dungeon B2 - Two Skulls Room - To B2 - Exploding Skull Room
+ id: 71
+ area: 21
+ coordinates: [54, 23]
+ teleporter: [92, 3]
+- name: Bone Dungeon B2 - Boss Room - Flamerus Rex Script
+ id: 72
+ area: 22
+ coordinates: [29, 19]
+ teleporter: [4, 8]
+- name: Bone Dungeon B2 - Boss Room - Tristam Leave Script
+ id: 73
+ area: 22
+ coordinates: [29, 23]
+ teleporter: [75, 8]
+- name: Bone Dungeon B2 - Boss Room - To B2 - Two Skulls Room
+ id: 74
+ area: 22
+ coordinates: [30, 27]
+ teleporter: [95, 3]
+- name: Libra Temple - Entrance
+ id: 75
+ area: 23
+ coordinates: [10, 15]
+ teleporter: [13, 6]
+- name: Libra Temple - Libra Tile Script
+ id: 76
+ area: 23
+ coordinates: [9, 8]
+ teleporter: [59, 8]
+- name: Aquaria Winter - Winter Entrance 1
+ id: 77
+ area: 24
+ coordinates: [25, 25]
+ teleporter: [8, 6]
+- name: Aquaria Winter - Winter Entrance 2
+ id: 78
+ area: 24
+ coordinates: [25, 26]
+ teleporter: [8, 6]
+- name: Aquaria Winter - Winter Entrance 3
+ id: 79
+ area: 24
+ coordinates: [26, 25]
+ teleporter: [8, 6]
+- name: Aquaria Winter - Winter Entrance 4
+ id: 80
+ area: 24
+ coordinates: [26, 26]
+ teleporter: [8, 6]
+- name: Aquaria Winter - Winter Phoebe's House Entrance Script #Modified to not be a script
+ id: 81
+ area: 24
+ coordinates: [8, 19]
+ teleporter: [10, 5] # original value [5, 8]
+- name: Aquaria Winter - Winter Vendor House Entrance
+ id: 82
+ area: 24
+ coordinates: [8, 5]
+ teleporter: [44, 4]
+- name: Aquaria Winter - Winter INN Entrance
+ id: 83
+ area: 24
+ coordinates: [26, 17]
+ teleporter: [11, 5]
+- name: Aquaria Summer - Summer Entrance 1
+ id: 84
+ area: 25
+ coordinates: [57, 25]
+ teleporter: [8, 6]
+- name: Aquaria Summer - Summer Entrance 2
+ id: 85
+ area: 25
+ coordinates: [57, 26]
+ teleporter: [8, 6]
+- name: Aquaria Summer - Summer Entrance 3
+ id: 86
+ area: 25
+ coordinates: [58, 25]
+ teleporter: [8, 6]
+- name: Aquaria Summer - Summer Entrance 4
+ id: 87
+ area: 25
+ coordinates: [58, 26]
+ teleporter: [8, 6]
+- name: Aquaria Summer - Summer Phoebe's House Entrance
+ id: 88
+ area: 25
+ coordinates: [40, 19]
+ teleporter: [10, 5]
+- name: Aquaria Summer - Spencer's Place Entrance Top
+ id: 89
+ area: 25
+ coordinates: [40, 16]
+ teleporter: [42, 0]
+- name: Aquaria Summer - Spencer's Place Entrance Side
+ id: 90
+ area: 25
+ coordinates: [41, 18]
+ teleporter: [43, 0]
+- name: Aquaria Summer - Summer Vendor House Entrance
+ id: 91
+ area: 25
+ coordinates: [40, 5]
+ teleporter: [44, 4]
+- name: Aquaria Summer - Summer INN Entrance
+ id: 92
+ area: 25
+ coordinates: [58, 17]
+ teleporter: [11, 5]
+- name: Phoebe's House - Entrance # Change to a script, same as vendor house
+ id: 93
+ area: 26
+ coordinates: [29, 14]
+ teleporter: [5, 8] # Original Value [11,3]
+- name: Aquaria Vendor House - Vendor House Entrance's Script
+ id: 94
+ area: 27
+ coordinates: [7, 10]
+ teleporter: [40, 8]
+- name: Aquaria Vendor House - Vendor House Stairs
+ id: 95
+ area: 27
+ coordinates: [1, 4]
+ teleporter: [47, 0]
+- name: Aquaria Gemini Room - Gemini Script
+ id: 96
+ area: 27
+ coordinates: [2, 40]
+ teleporter: [72, 8]
+- name: Aquaria Gemini Room - Gemini Room Stairs
+ id: 97
+ area: 27
+ coordinates: [4, 39]
+ teleporter: [48, 0]
+- name: Aquaria INN - Aquaria INN entrance # Change to a script, same as vendor house
+ id: 98
+ area: 27
+ coordinates: [51, 46]
+ teleporter: [75, 8] # Original value [48,3]
+- name: Wintry Cave 1F - Main Entrance
+ id: 99
+ area: 28
+ coordinates: [50, 58]
+ teleporter: [49, 0]
+- name: Wintry Cave 1F - To 3F Top
+ id: 100
+ area: 28
+ coordinates: [40, 25]
+ teleporter: [14, 2]
+- name: Wintry Cave 1F - To 2F
+ id: 101
+ area: 28
+ coordinates: [10, 43]
+ teleporter: [15, 2]
+- name: Wintry Cave 1F - Phoebe's Script
+ id: 102
+ area: 28
+ coordinates: [44, 37]
+ teleporter: [6, 8]
+- name: Wintry Cave 2F - To 3F Bottom
+ id: 103
+ area: 29
+ coordinates: [58, 5]
+ teleporter: [50, 0]
+- name: Wintry Cave 2F - To 1F
+ id: 104
+ area: 29
+ coordinates: [38, 18]
+ teleporter: [97, 3]
+- name: Wintry Cave 3F Top - Exit from 3F Top
+ id: 105
+ area: 30
+ coordinates: [24, 6]
+ teleporter: [96, 3]
+- name: Wintry Cave 3F Bottom - Exit to 2F
+ id: 106
+ area: 31
+ coordinates: [4, 29]
+ teleporter: [51, 0]
+- name: Life Temple - Entrance
+ id: 107
+ area: 32
+ coordinates: [9, 60]
+ teleporter: [14, 6]
+- name: Life Temple - Libra Tile Script
+ id: 108
+ area: 32
+ coordinates: [3, 55]
+ teleporter: [60, 8]
+- name: Life Temple - Mysterious Man Script
+ id: 109
+ area: 32
+ coordinates: [9, 44]
+ teleporter: [78, 8]
+- name: Fall Basin - Back Exit Script
+ id: 110
+ area: 33
+ coordinates: [17, 5]
+ teleporter: [9, 0] # Remove script [42, 8] for overworld teleport (but not main exit)
+- name: Fall Basin - Main Exit
+ id: 111
+ area: 33
+ coordinates: [15, 26]
+ teleporter: [53, 0]
+- name: Fall Basin - Phoebe's Script
+ id: 112
+ area: 33
+ coordinates: [17, 6]
+ teleporter: [9, 8]
+- name: Ice Pyramid B1 Taunt Room - To Climbing Wall Room
+ id: 113
+ area: 34
+ coordinates: [43, 6]
+ teleporter: [55, 0]
+- name: Ice Pyramid 1F Maze - Main Entrance 1
+ id: 114
+ area: 35
+ coordinates: [18, 36]
+ teleporter: [56, 0]
+- name: Ice Pyramid 1F Maze - Main Entrance 2
+ id: 115
+ area: 35
+ coordinates: [19, 36]
+ teleporter: [56, 0]
+- name: Ice Pyramid 1F Maze - West Stairs To 2F South Tiled Room
+ id: 116
+ area: 35
+ coordinates: [3, 27]
+ teleporter: [57, 0]
+- name: Ice Pyramid 1F Maze - West Center Stairs to 2F West Room
+ id: 117
+ area: 35
+ coordinates: [11, 15]
+ teleporter: [58, 0]
+- name: Ice Pyramid 1F Maze - East Center Stairs to 2F Center Room
+ id: 118
+ area: 35
+ coordinates: [25, 16]
+ teleporter: [59, 0]
+- name: Ice Pyramid 1F Maze - Upper Stairs to 2F Small North Room
+ id: 119
+ area: 35
+ coordinates: [31, 1]
+ teleporter: [60, 0]
+- name: Ice Pyramid 1F Maze - East Stairs to 2F North Corridor
+ id: 120
+ area: 35
+ coordinates: [34, 9]
+ teleporter: [61, 0]
+- name: Ice Pyramid 1F Maze - Statue's Script
+ id: 121
+ area: 35
+ coordinates: [21, 32]
+ teleporter: [77, 8]
+- name: Ice Pyramid 2F South Tiled Room - To 1F
+ id: 122
+ area: 36
+ coordinates: [4, 26]
+ teleporter: [62, 0]
+- name: Ice Pyramid 2F South Tiled Room - To 3F Two Boxes Room
+ id: 123
+ area: 36
+ coordinates: [22, 17]
+ teleporter: [67, 0]
+- name: Ice Pyramid 2F West Room - To 1F
+ id: 124
+ area: 36
+ coordinates: [9, 10]
+ teleporter: [63, 0]
+- name: Ice Pyramid 2F Center Room - To 1F
+ id: 125
+ area: 36
+ coordinates: [22, 14]
+ teleporter: [64, 0]
+- name: Ice Pyramid 2F Small North Room - To 1F
+ id: 126
+ area: 36
+ coordinates: [26, 4]
+ teleporter: [65, 0]
+- name: Ice Pyramid 2F North Corridor - To 1F
+ id: 127
+ area: 36
+ coordinates: [32, 8]
+ teleporter: [66, 0]
+- name: Ice Pyramid 2F North Corridor - To 3F Main Loop
+ id: 128
+ area: 36
+ coordinates: [12, 7]
+ teleporter: [68, 0]
+- name: Ice Pyramid 3F Two Boxes Room - To 2F South Tiled Room
+ id: 129
+ area: 37
+ coordinates: [24, 54]
+ teleporter: [69, 0]
+- name: Ice Pyramid 3F Main Loop - To 2F Corridor
+ id: 130
+ area: 37
+ coordinates: [16, 45]
+ teleporter: [70, 0]
+- name: Ice Pyramid 3F Main Loop - To 4F
+ id: 131
+ area: 37
+ coordinates: [19, 43]
+ teleporter: [71, 0]
+- name: Ice Pyramid 4F Treasure Room - To 3F Main Loop
+ id: 132
+ area: 38
+ coordinates: [52, 5]
+ teleporter: [72, 0]
+- name: Ice Pyramid 4F Treasure Room - To 5F Leap of Faith Room
+ id: 133
+ area: 38
+ coordinates: [62, 19]
+ teleporter: [73, 0]
+- name: Ice Pyramid 5F Leap of Faith Room - To 4F Treasure Room
+ id: 134
+ area: 39
+ coordinates: [54, 63]
+ teleporter: [74, 0]
+- name: Ice Pyramid 5F Leap of Faith Room - Bombed Ice Plate
+ id: 135
+ area: 39
+ coordinates: [47, 54]
+ teleporter: [77, 8]
+- name: Ice Pyramid 5F Stairs to Ice Golem - To Ice Golem Room
+ id: 136
+ area: 39
+ coordinates: [39, 43]
+ teleporter: [75, 0]
+- name: Ice Pyramid 5F Stairs to Ice Golem - To Climbing Wall Room
+ id: 137
+ area: 39
+ coordinates: [39, 60]
+ teleporter: [76, 0]
+- name: Ice Pyramid - Duplicate Ice Golem Room # not used?
+ id: 138
+ area: 40
+ coordinates: [44, 43]
+ teleporter: [77, 0]
+- name: Ice Pyramid Climbing Wall Room - To Taunt Room
+ id: 139
+ area: 41
+ coordinates: [4, 59]
+ teleporter: [78, 0]
+- name: Ice Pyramid Climbing Wall Room - To 5F Stairs
+ id: 140
+ area: 41
+ coordinates: [4, 45]
+ teleporter: [79, 0]
+- name: Ice Pyramid Ice Golem Room - To 5F Stairs
+ id: 141
+ area: 42
+ coordinates: [44, 43]
+ teleporter: [80, 0]
+- name: Ice Pyramid Ice Golem Room - Ice Golem Script
+ id: 142
+ area: 42
+ coordinates: [53, 32]
+ teleporter: [10, 8]
+- name: Spencer Waterfall - To Spencer Cave
+ id: 143
+ area: 43
+ coordinates: [48, 57]
+ teleporter: [81, 0]
+- name: Spencer Waterfall - Upper Exit to Aquaria 1
+ id: 144
+ area: 43
+ coordinates: [40, 5]
+ teleporter: [82, 0]
+- name: Spencer Waterfall - Upper Exit to Aquaria 2
+ id: 145
+ area: 43
+ coordinates: [40, 6]
+ teleporter: [82, 0]
+- name: Spencer Waterfall - Upper Exit to Aquaria 3
+ id: 146
+ area: 43
+ coordinates: [41, 5]
+ teleporter: [82, 0]
+- name: Spencer Waterfall - Upper Exit to Aquaria 4
+ id: 147
+ area: 43
+ coordinates: [41, 6]
+ teleporter: [82, 0]
+- name: Spencer Waterfall - Right Exit to Aquaria 1
+ id: 148
+ area: 43
+ coordinates: [46, 8]
+ teleporter: [83, 0]
+- name: Spencer Waterfall - Right Exit to Aquaria 2
+ id: 149
+ area: 43
+ coordinates: [47, 8]
+ teleporter: [83, 0]
+- name: Spencer Cave Normal Main - To Waterfall
+ id: 150
+ area: 44
+ coordinates: [14, 39]
+ teleporter: [85, 0]
+- name: Spencer Cave Normal From Overworld - Exit to Overworld
+ id: 151
+ area: 44
+ coordinates: [15, 57]
+ teleporter: [7, 6]
+- name: Spencer Cave Unplug - Exit to Overworld
+ id: 152
+ area: 45
+ coordinates: [40, 29]
+ teleporter: [7, 6]
+- name: Spencer Cave Unplug - Libra Teleporter Start Script
+ id: 153
+ area: 45
+ coordinates: [28, 21]
+ teleporter: [33, 8]
+- name: Spencer Cave Unplug - Libra Teleporter End Script
+ id: 154
+ area: 45
+ coordinates: [46, 4]
+ teleporter: [34, 8]
+- name: Spencer Cave Unplug - Mobius Teleporter Chest Script
+ id: 155
+ area: 45
+ coordinates: [21, 9]
+ teleporter: [35, 8]
+- name: Spencer Cave Unplug - Mobius Teleporter Start Script
+ id: 156
+ area: 45
+ coordinates: [29, 28]
+ teleporter: [36, 8]
+- name: Wintry Temple Outer Room - Main Entrance
+ id: 157
+ area: 46
+ coordinates: [8, 31]
+ teleporter: [15, 6]
+- name: Wintry Temple Inner Room - Gemini Tile to Sealed temple
+ id: 158
+ area: 46
+ coordinates: [9, 24]
+ teleporter: [62, 8]
+- name: Fireburg - To Overworld
+ id: 159
+ area: 47
+ coordinates: [4, 13]
+ teleporter: [9, 6]
+- name: Fireburg - To Overworld
+ id: 160
+ area: 47
+ coordinates: [5, 13]
+ teleporter: [9, 6]
+- name: Fireburg - To Overworld
+ id: 161
+ area: 47
+ coordinates: [28, 15]
+ teleporter: [9, 6]
+- name: Fireburg - To Overworld
+ id: 162
+ area: 47
+ coordinates: [27, 15]
+ teleporter: [9, 6]
+- name: Fireburg - Vendor House
+ id: 163
+ area: 47
+ coordinates: [10, 24]
+ teleporter: [91, 0]
+- name: Fireburg - Reuben House
+ id: 164
+ area: 47
+ coordinates: [14, 6]
+ teleporter: [16, 2]
+- name: Fireburg - Hotel
+ id: 165
+ area: 47
+ coordinates: [20, 8]
+ teleporter: [17, 2]
+- name: Fireburg - GrenadeMan House Script
+ id: 166
+ area: 47
+ coordinates: [12, 18]
+ teleporter: [11, 8]
+- name: Reuben House - Main Entrance
+ id: 167
+ area: 48
+ coordinates: [33, 46]
+ teleporter: [98, 3]
+- name: GrenadeMan House - Entrance Script
+ id: 168
+ area: 49
+ coordinates: [55, 60]
+ teleporter: [9, 8]
+- name: GrenadeMan House - To Mobius Crest Room
+ id: 169
+ area: 49
+ coordinates: [57, 52]
+ teleporter: [93, 0]
+- name: GrenadeMan Mobius Room - Stairs to House
+ id: 170
+ area: 49
+ coordinates: [39, 26]
+ teleporter: [94, 0]
+- name: GrenadeMan Mobius Room - Mobius Teleporter Script
+ id: 171
+ area: 49
+ coordinates: [39, 23]
+ teleporter: [54, 8]
+- name: Fireburg Vendor House - Entrance Script # No use to be a script
+ id: 172
+ area: 49
+ coordinates: [7, 10]
+ teleporter: [95, 0] # Original value [39, 8]
+- name: Fireburg Vendor House - Stairs to Gemini Room
+ id: 173
+ area: 49
+ coordinates: [1, 4]
+ teleporter: [96, 0]
+- name: Fireburg Gemini Room - Stairs to Vendor House
+ id: 174
+ area: 49
+ coordinates: [4, 39]
+ teleporter: [97, 0]
+- name: Fireburg Gemini Room - Gemini Teleporter Script
+ id: 175
+ area: 49
+ coordinates: [2, 40]
+ teleporter: [45, 8]
+- name: Fireburg Hotel Lobby - Stairs to beds
+ id: 176
+ area: 49
+ coordinates: [4, 50]
+ teleporter: [213, 0]
+- name: Fireburg Hotel Lobby - Entrance
+ id: 177
+ area: 49
+ coordinates: [17, 56]
+ teleporter: [99, 3]
+- name: Fireburg Hotel Beds - Stairs to Hotel Lobby
+ id: 178
+ area: 49
+ coordinates: [45, 59]
+ teleporter: [214, 0]
+- name: Mine Exterior - Main Entrance
+ id: 179
+ area: 50
+ coordinates: [5, 28]
+ teleporter: [98, 0]
+- name: Mine Exterior - To Cliff
+ id: 180
+ area: 50
+ coordinates: [58, 29]
+ teleporter: [99, 0]
+- name: Mine Exterior - To Parallel Room
+ id: 181
+ area: 50
+ coordinates: [8, 7]
+ teleporter: [20, 2]
+- name: Mine Exterior - To Crescent Room
+ id: 182
+ area: 50
+ coordinates: [26, 15]
+ teleporter: [21, 2]
+- name: Mine Exterior - To Climbing Room
+ id: 183
+ area: 50
+ coordinates: [21, 35]
+ teleporter: [22, 2]
+- name: Mine Exterior - Jinn Fight Script
+ id: 184
+ area: 50
+ coordinates: [58, 31]
+ teleporter: [74, 8]
+- name: Mine Parallel Room - To Mine Exterior
+ id: 185
+ area: 51
+ coordinates: [7, 60]
+ teleporter: [100, 3]
+- name: Mine Crescent Room - To Mine Exterior
+ id: 186
+ area: 51
+ coordinates: [22, 61]
+ teleporter: [101, 3]
+- name: Mine Climbing Room - To Mine Exterior
+ id: 187
+ area: 51
+ coordinates: [56, 21]
+ teleporter: [102, 3]
+- name: Mine Cliff - Entrance
+ id: 188
+ area: 52
+ coordinates: [9, 5]
+ teleporter: [100, 0]
+- name: Mine Cliff - Reuben Grenade Script
+ id: 189
+ area: 52
+ coordinates: [15, 7]
+ teleporter: [12, 8]
+- name: Sealed Temple - To Overworld
+ id: 190
+ area: 53
+ coordinates: [58, 43]
+ teleporter: [16, 6]
+- name: Sealed Temple - Gemini Tile Script
+ id: 191
+ area: 53
+ coordinates: [56, 38]
+ teleporter: [63, 8]
+- name: Volcano Base - Main Entrance 1
+ id: 192
+ area: 54
+ coordinates: [23, 25]
+ teleporter: [103, 0]
+- name: Volcano Base - Main Entrance 2
+ id: 193
+ area: 54
+ coordinates: [23, 26]
+ teleporter: [103, 0]
+- name: Volcano Base - Main Entrance 3
+ id: 194
+ area: 54
+ coordinates: [24, 25]
+ teleporter: [103, 0]
+- name: Volcano Base - Main Entrance 4
+ id: 195
+ area: 54
+ coordinates: [24, 26]
+ teleporter: [103, 0]
+- name: Volcano Base - Left Stairs Script
+ id: 196
+ area: 54
+ coordinates: [20, 5]
+ teleporter: [31, 8]
+- name: Volcano Base - Right Stairs Script
+ id: 197
+ area: 54
+ coordinates: [32, 5]
+ teleporter: [30, 8]
+- name: Volcano Top Right - Top Exit
+ id: 198
+ area: 55
+ coordinates: [44, 8]
+ teleporter: [9, 0] # Original value [103, 0] changed to volcano escape so floor shuffling doesn't pick it up
+- name: Volcano Top Left - To Right-Left Path Script
+ id: 199
+ area: 55
+ coordinates: [40, 24]
+ teleporter: [26, 8]
+- name: Volcano Top Right - To Left-Right Path Script
+ id: 200
+ area: 55
+ coordinates: [52, 24]
+ teleporter: [79, 8] # Original Value [26, 8]
+- name: Volcano Right Path - To Volcano Base Script
+ id: 201
+ area: 56
+ coordinates: [48, 42]
+ teleporter: [15, 8] # Original Value [27, 8]
+- name: Volcano Left Path - To Volcano Cross Left-Right
+ id: 202
+ area: 56
+ coordinates: [40, 31]
+ teleporter: [25, 2]
+- name: Volcano Left Path - To Volcano Cross Right-Left
+ id: 203
+ area: 56
+ coordinates: [52, 29]
+ teleporter: [26, 2]
+- name: Volcano Left Path - To Volcano Base Script
+ id: 204
+ area: 56
+ coordinates: [36, 42]
+ teleporter: [27, 8]
+- name: Volcano Cross Left-Right - To Volcano Left Path
+ id: 205
+ area: 56
+ coordinates: [10, 42]
+ teleporter: [103, 3]
+- name: Volcano Cross Left-Right - To Volcano Top Right Script
+ id: 206
+ area: 56
+ coordinates: [16, 24]
+ teleporter: [29, 8]
+- name: Volcano Cross Right-Left - To Volcano Top Left Script
+ id: 207
+ area: 56
+ coordinates: [8, 22]
+ teleporter: [28, 8]
+- name: Volcano Cross Right-Left - To Volcano Left Path
+ id: 208
+ area: 56
+ coordinates: [16, 42]
+ teleporter: [104, 3]
+- name: Lava Dome Inner Ring Main Loop - Main Entrance 1
+ id: 209
+ area: 57
+ coordinates: [32, 5]
+ teleporter: [104, 0]
+- name: Lava Dome Inner Ring Main Loop - Main Entrance 2
+ id: 210
+ area: 57
+ coordinates: [33, 5]
+ teleporter: [104, 0]
+- name: Lava Dome Inner Ring Main Loop - To Three Steps Room
+ id: 211
+ area: 57
+ coordinates: [14, 5]
+ teleporter: [105, 0]
+- name: Lava Dome Inner Ring Main Loop - To Life Chest Room Lower
+ id: 212
+ area: 57
+ coordinates: [40, 17]
+ teleporter: [106, 0]
+- name: Lava Dome Inner Ring Main Loop - To Big Jump Room Left
+ id: 213
+ area: 57
+ coordinates: [8, 11]
+ teleporter: [108, 0]
+- name: Lava Dome Inner Ring Main Loop - To Split Corridor Room
+ id: 214
+ area: 57
+ coordinates: [11, 19]
+ teleporter: [111, 0]
+- name: Lava Dome Inner Ring Center Ledge - To Life Chest Room Higher
+ id: 215
+ area: 57
+ coordinates: [32, 11]
+ teleporter: [107, 0]
+- name: Lava Dome Inner Ring Plate Ledge - To Plate Corridor
+ id: 216
+ area: 57
+ coordinates: [12, 23]
+ teleporter: [109, 0]
+- name: Lava Dome Inner Ring Plate Ledge - Plate Script
+ id: 217
+ area: 57
+ coordinates: [5, 23]
+ teleporter: [47, 8]
+- name: Lava Dome Inner Ring Upper Ledges - To Pointless Room
+ id: 218
+ area: 57
+ coordinates: [0, 9]
+ teleporter: [110, 0]
+- name: Lava Dome Inner Ring Upper Ledges - To Lower Moon Helm Room
+ id: 219
+ area: 57
+ coordinates: [0, 15]
+ teleporter: [112, 0]
+- name: Lava Dome Inner Ring Upper Ledges - To Up-Down Corridor
+ id: 220
+ area: 57
+ coordinates: [54, 5]
+ teleporter: [113, 0]
+- name: Lava Dome Inner Ring Big Door Ledge - To Jumping Maze II
+ id: 221
+ area: 57
+ coordinates: [54, 21]
+ teleporter: [114, 0]
+- name: Lava Dome Inner Ring Big Door Ledge - Hydra Gate 1
+ id: 222
+ area: 57
+ coordinates: [62, 20]
+ teleporter: [29, 2]
+- name: Lava Dome Inner Ring Big Door Ledge - Hydra Gate 2
+ id: 223
+ area: 57
+ coordinates: [63, 20]
+ teleporter: [29, 2]
+- name: Lava Dome Inner Ring Big Door Ledge - Hydra Gate 3
+ id: 224
+ area: 57
+ coordinates: [62, 21]
+ teleporter: [29, 2]
+- name: Lava Dome Inner Ring Big Door Ledge - Hydra Gate 4
+ id: 225
+ area: 57
+ coordinates: [63, 21]
+ teleporter: [29, 2]
+- name: Lava Dome Inner Ring Tiny Bottom Ledge - To Four Boxes Corridor
+ id: 226
+ area: 57
+ coordinates: [50, 25]
+ teleporter: [115, 0]
+- name: Lava Dome Jump Maze II - Lower Right Entrance
+ id: 227
+ area: 58
+ coordinates: [55, 28]
+ teleporter: [116, 0]
+- name: Lava Dome Jump Maze II - Upper Entrance
+ id: 228
+ area: 58
+ coordinates: [35, 3]
+ teleporter: [119, 0]
+- name: Lava Dome Jump Maze II - Lower Left Entrance
+ id: 229
+ area: 58
+ coordinates: [34, 27]
+ teleporter: [120, 0]
+- name: Lava Dome Up-Down Corridor - Upper Entrance
+ id: 230
+ area: 58
+ coordinates: [29, 8]
+ teleporter: [117, 0]
+- name: Lava Dome Up-Down Corridor - Lower Entrance
+ id: 231
+ area: 58
+ coordinates: [28, 25]
+ teleporter: [118, 0]
+- name: Lava Dome Jump Maze I - South Entrance
+ id: 232
+ area: 59
+ coordinates: [20, 27]
+ teleporter: [121, 0]
+- name: Lava Dome Jump Maze I - North Entrance
+ id: 233
+ area: 59
+ coordinates: [7, 3]
+ teleporter: [122, 0]
+- name: Lava Dome Pointless Room - Entrance
+ id: 234
+ area: 60
+ coordinates: [2, 7]
+ teleporter: [123, 0]
+- name: Lava Dome Lower Moon Helm Room - Left Entrance
+ id: 235
+ area: 60
+ coordinates: [2, 19]
+ teleporter: [124, 0]
+- name: Lava Dome Lower Moon Helm Room - Right Entrance
+ id: 236
+ area: 60
+ coordinates: [11, 21]
+ teleporter: [125, 0]
+- name: Lava Dome Moon Helm Room - Entrance
+ id: 237
+ area: 60
+ coordinates: [15, 23]
+ teleporter: [126, 0]
+- name: Lava Dome Three Jumps Room - To Main Loop
+ id: 238
+ area: 61
+ coordinates: [58, 15]
+ teleporter: [127, 0]
+- name: Lava Dome Life Chest Room - Lower South Entrance
+ id: 239
+ area: 61
+ coordinates: [38, 27]
+ teleporter: [128, 0]
+- name: Lava Dome Life Chest Room - Upper South Entrance
+ id: 240
+ area: 61
+ coordinates: [28, 23]
+ teleporter: [129, 0]
+- name: Lava Dome Big Jump Room - Left Entrance
+ id: 241
+ area: 62
+ coordinates: [42, 51]
+ teleporter: [133, 0]
+- name: Lava Dome Big Jump Room - North Entrance
+ id: 242
+ area: 62
+ coordinates: [30, 29]
+ teleporter: [131, 0]
+- name: Lava Dome Big Jump Room - Lower Right Stairs
+ id: 243
+ area: 62
+ coordinates: [61, 59]
+ teleporter: [132, 0]
+- name: Lava Dome Split Corridor - Upper Stairs
+ id: 244
+ area: 62
+ coordinates: [30, 43]
+ teleporter: [130, 0]
+- name: Lava Dome Split Corridor - Lower Stairs
+ id: 245
+ area: 62
+ coordinates: [36, 61]
+ teleporter: [134, 0]
+- name: Lava Dome Plate Corridor - Right Entrance
+ id: 246
+ area: 63
+ coordinates: [19, 29]
+ teleporter: [135, 0]
+- name: Lava Dome Plate Corridor - Left Entrance
+ id: 247
+ area: 63
+ coordinates: [60, 21]
+ teleporter: [137, 0]
+- name: Lava Dome Four Boxes Stairs - Upper Entrance
+ id: 248
+ area: 63
+ coordinates: [22, 3]
+ teleporter: [136, 0]
+- name: Lava Dome Four Boxes Stairs - Lower Entrance
+ id: 249
+ area: 63
+ coordinates: [22, 17]
+ teleporter: [16, 0]
+- name: Lava Dome Hydra Room - South Entrance
+ id: 250
+ area: 64
+ coordinates: [14, 59]
+ teleporter: [105, 3]
+- name: Lava Dome Hydra Room - North Exit
+ id: 251
+ area: 64
+ coordinates: [25, 31]
+ teleporter: [138, 0]
+- name: Lava Dome Hydra Room - Hydra Script
+ id: 252
+ area: 64
+ coordinates: [14, 36]
+ teleporter: [14, 8]
+- name: Lava Dome Escape Corridor - South Entrance
+ id: 253
+ area: 65
+ coordinates: [22, 17]
+ teleporter: [139, 0]
+- name: Lava Dome Escape Corridor - North Entrance
+ id: 254
+ area: 65
+ coordinates: [22, 3]
+ teleporter: [9, 0]
+- name: Rope Bridge - West Entrance 1
+ id: 255
+ area: 66
+ coordinates: [3, 10]
+ teleporter: [140, 0]
+- name: Rope Bridge - West Entrance 2
+ id: 256
+ area: 66
+ coordinates: [3, 11]
+ teleporter: [140, 0]
+- name: Rope Bridge - West Entrance 3
+ id: 257
+ area: 66
+ coordinates: [3, 12]
+ teleporter: [140, 0]
+- name: Rope Bridge - West Entrance 4
+ id: 258
+ area: 66
+ coordinates: [3, 13]
+ teleporter: [140, 0]
+- name: Rope Bridge - West Entrance 5
+ id: 259
+ area: 66
+ coordinates: [4, 10]
+ teleporter: [140, 0]
+- name: Rope Bridge - West Entrance 6
+ id: 260
+ area: 66
+ coordinates: [4, 11]
+ teleporter: [140, 0]
+- name: Rope Bridge - West Entrance 7
+ id: 261
+ area: 66
+ coordinates: [4, 12]
+ teleporter: [140, 0]
+- name: Rope Bridge - West Entrance 8
+ id: 262
+ area: 66
+ coordinates: [4, 13]
+ teleporter: [140, 0]
+- name: Rope Bridge - East Entrance 1
+ id: 263
+ area: 66
+ coordinates: [59, 10]
+ teleporter: [140, 0]
+- name: Rope Bridge - East Entrance 2
+ id: 264
+ area: 66
+ coordinates: [59, 11]
+ teleporter: [140, 0]
+- name: Rope Bridge - East Entrance 3
+ id: 265
+ area: 66
+ coordinates: [59, 12]
+ teleporter: [140, 0]
+- name: Rope Bridge - East Entrance 4
+ id: 266
+ area: 66
+ coordinates: [59, 13]
+ teleporter: [140, 0]
+- name: Rope Bridge - East Entrance 5
+ id: 267
+ area: 66
+ coordinates: [60, 10]
+ teleporter: [140, 0]
+- name: Rope Bridge - East Entrance 6
+ id: 268
+ area: 66
+ coordinates: [60, 11]
+ teleporter: [140, 0]
+- name: Rope Bridge - East Entrance 7
+ id: 269
+ area: 66
+ coordinates: [60, 12]
+ teleporter: [140, 0]
+- name: Rope Bridge - East Entrance 8
+ id: 270
+ area: 66
+ coordinates: [60, 13]
+ teleporter: [140, 0]
+- name: Rope Bridge - Reuben Fall Script
+ id: 271
+ area: 66
+ coordinates: [13, 12]
+ teleporter: [15, 8]
+- name: Alive Forest - West Entrance 1
+ id: 272
+ area: 67
+ coordinates: [8, 13]
+ teleporter: [142, 0]
+- name: Alive Forest - West Entrance 2
+ id: 273
+ area: 67
+ coordinates: [9, 13]
+ teleporter: [142, 0]
+- name: Alive Forest - Giant Tree Entrance
+ id: 274
+ area: 67
+ coordinates: [42, 42]
+ teleporter: [143, 0]
+- name: Alive Forest - Libra Teleporter Script
+ id: 275
+ area: 67
+ coordinates: [8, 52]
+ teleporter: [64, 8]
+- name: Alive Forest - Gemini Teleporter Script
+ id: 276
+ area: 67
+ coordinates: [57, 49]
+ teleporter: [65, 8]
+- name: Alive Forest - Mobius Teleporter Script
+ id: 277
+ area: 67
+ coordinates: [24, 10]
+ teleporter: [66, 8]
+- name: Giant Tree 1F - Entrance Script 1
+ id: 278
+ area: 68
+ coordinates: [18, 31]
+ teleporter: [56, 1] # The script is restored if no map shuffling [49, 8]
+- name: Giant Tree 1F - Entrance Script 2
+ id: 279
+ area: 68
+ coordinates: [19, 31]
+ teleporter: [56, 1] # Same [49, 8]
+- name: Giant Tree 1F - North Entrance To 2F
+ id: 280
+ area: 68
+ coordinates: [16, 1]
+ teleporter: [144, 0]
+- name: Giant Tree 2F Main Lobby - North Entrance to 1F
+ id: 281
+ area: 69
+ coordinates: [44, 33]
+ teleporter: [145, 0]
+- name: Giant Tree 2F Main Lobby - Central Entrance to 3F
+ id: 282
+ area: 69
+ coordinates: [42, 47]
+ teleporter: [146, 0]
+- name: Giant Tree 2F Main Lobby - West Entrance to Mushroom Room
+ id: 283
+ area: 69
+ coordinates: [58, 49]
+ teleporter: [149, 0]
+- name: Giant Tree 2F West Ledge - To 3F Northwest Ledge
+ id: 284
+ area: 69
+ coordinates: [34, 37]
+ teleporter: [147, 0]
+- name: Giant Tree 2F Fall From Vine Script
+ id: 482
+ area: 69
+ coordinates: [0x2E, 0x33]
+ teleporter: [76, 8]
+- name: Giant Tree Meteor Chest Room - To 2F Mushroom Room
+ id: 285
+ area: 69
+ coordinates: [58, 44]
+ teleporter: [148, 0]
+- name: Giant Tree 2F Mushroom Room - Entrance
+ id: 286
+ area: 70
+ coordinates: [55, 18]
+ teleporter: [150, 0]
+- name: Giant Tree 2F Mushroom Room - North Face to Meteor
+ id: 287
+ area: 70
+ coordinates: [56, 7]
+ teleporter: [151, 0]
+- name: Giant Tree 3F Central Room - Central Entrance to 2F
+ id: 288
+ area: 71
+ coordinates: [46, 53]
+ teleporter: [152, 0]
+- name: Giant Tree 3F Central Room - East Entrance to Worm Room
+ id: 289
+ area: 71
+ coordinates: [58, 39]
+ teleporter: [153, 0]
+- name: Giant Tree 3F Lower Corridor - Entrance from Worm Room
+ id: 290
+ area: 71
+ coordinates: [45, 39]
+ teleporter: [154, 0]
+- name: Giant Tree 3F West Platform - Lower Entrance
+ id: 291
+ area: 71
+ coordinates: [33, 43]
+ teleporter: [155, 0]
+- name: Giant Tree 3F West Platform - Top Entrance
+ id: 292
+ area: 71
+ coordinates: [52, 25]
+ teleporter: [156, 0]
+- name: Giant Tree Worm Room - East Entrance
+ id: 293
+ area: 72
+ coordinates: [20, 58]
+ teleporter: [157, 0]
+- name: Giant Tree Worm Room - West Entrance
+ id: 294
+ area: 72
+ coordinates: [6, 56]
+ teleporter: [158, 0]
+- name: Giant Tree 4F Lower Floor - Entrance
+ id: 295
+ area: 73
+ coordinates: [20, 7]
+ teleporter: [159, 0]
+- name: Giant Tree 4F Lower Floor - Lower West Mouth
+ id: 296
+ area: 73
+ coordinates: [8, 23]
+ teleporter: [160, 0]
+- name: Giant Tree 4F Lower Floor - Lower Central Mouth
+ id: 297
+ area: 73
+ coordinates: [14, 25]
+ teleporter: [161, 0]
+- name: Giant Tree 4F Lower Floor - Lower East Mouth
+ id: 298
+ area: 73
+ coordinates: [20, 25]
+ teleporter: [162, 0]
+- name: Giant Tree 4F Upper Floor - Upper West Mouth
+ id: 299
+ area: 73
+ coordinates: [8, 19]
+ teleporter: [163, 0]
+- name: Giant Tree 4F Upper Floor - Upper Central Mouth
+ id: 300
+ area: 73
+ coordinates: [12, 17]
+ teleporter: [164, 0]
+- name: Giant Tree 4F Slime Room - Exit
+ id: 301
+ area: 74
+ coordinates: [47, 10]
+ teleporter: [165, 0]
+- name: Giant Tree 4F Slime Room - West Entrance
+ id: 302
+ area: 74
+ coordinates: [45, 24]
+ teleporter: [166, 0]
+- name: Giant Tree 4F Slime Room - Central Entrance
+ id: 303
+ area: 74
+ coordinates: [50, 24]
+ teleporter: [167, 0]
+- name: Giant Tree 4F Slime Room - East Entrance
+ id: 304
+ area: 74
+ coordinates: [57, 28]
+ teleporter: [168, 0]
+- name: Giant Tree 5F - Entrance
+ id: 305
+ area: 75
+ coordinates: [14, 51]
+ teleporter: [169, 0]
+- name: Giant Tree 5F - Giant Tree Face # Unused
+ id: 306
+ area: 75
+ coordinates: [14, 37]
+ teleporter: [170, 0]
+- name: Kaidge Temple - Entrance
+ id: 307
+ area: 77
+ coordinates: [44, 63]
+ teleporter: [18, 6]
+- name: Kaidge Temple - Mobius Teleporter Script
+ id: 308
+ area: 77
+ coordinates: [35, 57]
+ teleporter: [71, 8]
+- name: Windhole Temple - Entrance
+ id: 309
+ area: 78
+ coordinates: [10, 29]
+ teleporter: [173, 0]
+- name: Mount Gale - Entrance 1
+ id: 310
+ area: 79
+ coordinates: [1, 45]
+ teleporter: [174, 0]
+- name: Mount Gale - Entrance 2
+ id: 311
+ area: 79
+ coordinates: [2, 45]
+ teleporter: [174, 0]
+- name: Windia - Main Entrance 1
+ id: 312
+ area: 80
+ coordinates: [12, 40]
+ teleporter: [10, 6]
+- name: Windia - Main Entrance 2
+ id: 313
+ area: 80
+ coordinates: [13, 40]
+ teleporter: [10, 6]
+- name: Windia - Main Entrance 3
+ id: 314
+ area: 80
+ coordinates: [14, 40]
+ teleporter: [10, 6]
+- name: Windia - Main Entrance 4
+ id: 315
+ area: 80
+ coordinates: [15, 40]
+ teleporter: [10, 6]
+- name: Windia - Main Entrance 5
+ id: 316
+ area: 80
+ coordinates: [12, 41]
+ teleporter: [10, 6]
+- name: Windia - Main Entrance 6
+ id: 317
+ area: 80
+ coordinates: [13, 41]
+ teleporter: [10, 6]
+- name: Windia - Main Entrance 7
+ id: 318
+ area: 80
+ coordinates: [14, 41]
+ teleporter: [10, 6]
+- name: Windia - Main Entrance 8
+ id: 319
+ area: 80
+ coordinates: [15, 41]
+ teleporter: [10, 6]
+- name: Windia - Otto's House
+ id: 320
+ area: 80
+ coordinates: [21, 39]
+ teleporter: [30, 5]
+- name: Windia - INN's Script # Change to teleporter
+ id: 321
+ area: 80
+ coordinates: [18, 34]
+ teleporter: [31, 2] # Original value [79, 8]
+- name: Windia - Vendor House
+ id: 322
+ area: 80
+ coordinates: [8, 36]
+ teleporter: [32, 5]
+- name: Windia - Kid House
+ id: 323
+ area: 80
+ coordinates: [7, 23]
+ teleporter: [176, 4]
+- name: Windia - Old People House
+ id: 324
+ area: 80
+ coordinates: [19, 21]
+ teleporter: [177, 4]
+- name: Windia - Rainbow Bridge Script
+ id: 325
+ area: 80
+ coordinates: [21, 9]
+ teleporter: [10, 6] # Change to entrance, usually a script [41, 8]
+- name: Otto's House - Attic Stairs
+ id: 326
+ area: 81
+ coordinates: [2, 19]
+ teleporter: [33, 2]
+- name: Otto's House - Entrance
+ id: 327
+ area: 81
+ coordinates: [9, 30]
+ teleporter: [106, 3]
+- name: Otto's Attic - Stairs
+ id: 328
+ area: 81
+ coordinates: [26, 23]
+ teleporter: [107, 3]
+- name: Windia Kid House - Entrance Script # Change to teleporter
+ id: 329
+ area: 82
+ coordinates: [7, 10]
+ teleporter: [178, 0] # Original value [38, 8]
+- name: Windia Kid House - Basement Stairs
+ id: 330
+ area: 82
+ coordinates: [1, 4]
+ teleporter: [180, 0]
+- name: Windia Old People House - Entrance
+ id: 331
+ area: 82
+ coordinates: [55, 12]
+ teleporter: [179, 0]
+- name: Windia Old People House - Basement Stairs
+ id: 332
+ area: 82
+ coordinates: [60, 5]
+ teleporter: [181, 0]
+- name: Windia Kid House Basement - Stairs
+ id: 333
+ area: 82
+ coordinates: [43, 8]
+ teleporter: [182, 0]
+- name: Windia Kid House Basement - Mobius Teleporter
+ id: 334
+ area: 82
+ coordinates: [41, 9]
+ teleporter: [44, 8]
+- name: Windia Old People House Basement - Stairs
+ id: 335
+ area: 82
+ coordinates: [39, 26]
+ teleporter: [183, 0]
+- name: Windia Old People House Basement - Mobius Teleporter Script
+ id: 336
+ area: 82
+ coordinates: [39, 23]
+ teleporter: [43, 8]
+- name: Windia Inn Lobby - Stairs to Beds
+ id: 337
+ area: 82
+ coordinates: [45, 24]
+ teleporter: [215, 0]
+- name: Windia Inn Lobby - Exit
+ id: 338
+ area: 82
+ coordinates: [53, 30]
+ teleporter: [135, 3]
+- name: Windia Inn Beds - Stairs to Lobby
+ id: 339
+ area: 82
+ coordinates: [33, 59]
+ teleporter: [216, 0]
+- name: Windia Vendor House - Entrance
+ id: 340
+ area: 82
+ coordinates: [29, 14]
+ teleporter: [108, 3]
+- name: Pazuzu Tower 1F Main Lobby - Main Entrance 1
+ id: 341
+ area: 83
+ coordinates: [47, 29]
+ teleporter: [184, 0]
+- name: Pazuzu Tower 1F Main Lobby - Main Entrance 2
+ id: 342
+ area: 83
+ coordinates: [47, 30]
+ teleporter: [184, 0]
+- name: Pazuzu Tower 1F Main Lobby - Main Entrance 3
+ id: 343
+ area: 83
+ coordinates: [48, 29]
+ teleporter: [184, 0]
+- name: Pazuzu Tower 1F Main Lobby - Main Entrance 4
+ id: 344
+ area: 83
+ coordinates: [48, 30]
+ teleporter: [184, 0]
+- name: Pazuzu Tower 1F Main Lobby - East Entrance
+ id: 345
+ area: 83
+ coordinates: [55, 12]
+ teleporter: [185, 0]
+- name: Pazuzu Tower 1F Main Lobby - South Stairs
+ id: 346
+ area: 83
+ coordinates: [51, 25]
+ teleporter: [186, 0]
+- name: Pazuzu Tower 1F Main Lobby - Pazuzu Script 1
+ id: 347
+ area: 83
+ coordinates: [47, 8]
+ teleporter: [16, 8]
+- name: Pazuzu Tower 1F Main Lobby - Pazuzu Script 2
+ id: 348
+ area: 83
+ coordinates: [48, 8]
+ teleporter: [16, 8]
+- name: Pazuzu Tower 1F Boxes Room - West Stairs
+ id: 349
+ area: 83
+ coordinates: [38, 17]
+ teleporter: [187, 0]
+- name: Pazuzu 2F - West Upper Stairs
+ id: 350
+ area: 84
+ coordinates: [7, 11]
+ teleporter: [188, 0]
+- name: Pazuzu 2F - South Stairs
+ id: 351
+ area: 84
+ coordinates: [20, 24]
+ teleporter: [189, 0]
+- name: Pazuzu 2F - West Lower Stairs
+ id: 352
+ area: 84
+ coordinates: [6, 17]
+ teleporter: [190, 0]
+- name: Pazuzu 2F - Central Stairs
+ id: 353
+ area: 84
+ coordinates: [15, 15]
+ teleporter: [191, 0]
+- name: Pazuzu 2F - Pazuzu 1
+ id: 354
+ area: 84
+ coordinates: [15, 8]
+ teleporter: [17, 8]
+- name: Pazuzu 2F - Pazuzu 2
+ id: 355
+ area: 84
+ coordinates: [16, 8]
+ teleporter: [17, 8]
+- name: Pazuzu 3F Main Room - North Stairs
+ id: 356
+ area: 85
+ coordinates: [23, 11]
+ teleporter: [192, 0]
+- name: Pazuzu 3F Main Room - West Stairs
+ id: 357
+ area: 85
+ coordinates: [7, 15]
+ teleporter: [193, 0]
+- name: Pazuzu 3F Main Room - Pazuzu Script 1
+ id: 358
+ area: 85
+ coordinates: [15, 8]
+ teleporter: [18, 8]
+- name: Pazuzu 3F Main Room - Pazuzu Script 2
+ id: 359
+ area: 85
+ coordinates: [16, 8]
+ teleporter: [18, 8]
+- name: Pazuzu 3F Central Island - Central Stairs
+ id: 360
+ area: 85
+ coordinates: [15, 14]
+ teleporter: [194, 0]
+- name: Pazuzu 3F Central Island - South Stairs
+ id: 361
+ area: 85
+ coordinates: [17, 25]
+ teleporter: [195, 0]
+- name: Pazuzu 4F - Northwest Stairs
+ id: 362
+ area: 86
+ coordinates: [39, 12]
+ teleporter: [196, 0]
+- name: Pazuzu 4F - Southwest Stairs
+ id: 363
+ area: 86
+ coordinates: [39, 19]
+ teleporter: [197, 0]
+- name: Pazuzu 4F - South Stairs
+ id: 364
+ area: 86
+ coordinates: [47, 24]
+ teleporter: [198, 0]
+- name: Pazuzu 4F - Northeast Stairs
+ id: 365
+ area: 86
+ coordinates: [54, 9]
+ teleporter: [199, 0]
+- name: Pazuzu 4F - Pazuzu Script 1
+ id: 366
+ area: 86
+ coordinates: [47, 8]
+ teleporter: [19, 8]
+- name: Pazuzu 4F - Pazuzu Script 2
+ id: 367
+ area: 86
+ coordinates: [48, 8]
+ teleporter: [19, 8]
+- name: Pazuzu 5F Pazuzu Loop - West Stairs
+ id: 368
+ area: 87
+ coordinates: [9, 49]
+ teleporter: [200, 0]
+- name: Pazuzu 5F Pazuzu Loop - South Stairs
+ id: 369
+ area: 87
+ coordinates: [16, 55]
+ teleporter: [201, 0]
+- name: Pazuzu 5F Upper Loop - Northeast Stairs
+ id: 370
+ area: 87
+ coordinates: [22, 40]
+ teleporter: [202, 0]
+- name: Pazuzu 5F Upper Loop - Northwest Stairs
+ id: 371
+ area: 87
+ coordinates: [9, 40]
+ teleporter: [203, 0]
+- name: Pazuzu 5F Upper Loop - Pazuzu Script 1
+ id: 372
+ area: 87
+ coordinates: [15, 40]
+ teleporter: [20, 8]
+- name: Pazuzu 5F Upper Loop - Pazuzu Script 2
+ id: 373
+ area: 87
+ coordinates: [16, 40]
+ teleporter: [20, 8]
+- name: Pazuzu 6F - West Stairs
+ id: 374
+ area: 88
+ coordinates: [41, 47]
+ teleporter: [204, 0]
+- name: Pazuzu 6F - Northwest Stairs
+ id: 375
+ area: 88
+ coordinates: [41, 40]
+ teleporter: [205, 0]
+- name: Pazuzu 6F - Northeast Stairs
+ id: 376
+ area: 88
+ coordinates: [54, 40]
+ teleporter: [206, 0]
+- name: Pazuzu 6F - South Stairs
+ id: 377
+ area: 88
+ coordinates: [52, 56]
+ teleporter: [207, 0]
+- name: Pazuzu 6F - Pazuzu Script 1
+ id: 378
+ area: 88
+ coordinates: [47, 40]
+ teleporter: [21, 8]
+- name: Pazuzu 6F - Pazuzu Script 2
+ id: 379
+ area: 88
+ coordinates: [48, 40]
+ teleporter: [21, 8]
+- name: Pazuzu 7F Main Room - Southwest Stairs
+ id: 380
+ area: 89
+ coordinates: [15, 54]
+ teleporter: [26, 0]
+- name: Pazuzu 7F Main Room - Northeast Stairs
+ id: 381
+ area: 89
+ coordinates: [21, 40]
+ teleporter: [27, 0]
+- name: Pazuzu 7F Main Room - Southeast Stairs
+ id: 382
+ area: 89
+ coordinates: [21, 56]
+ teleporter: [28, 0]
+- name: Pazuzu 7F Main Room - Pazuzu Script 1
+ id: 383
+ area: 89
+ coordinates: [15, 44]
+ teleporter: [22, 8]
+- name: Pazuzu 7F Main Room - Pazuzu Script 2
+ id: 384
+ area: 89
+ coordinates: [16, 44]
+ teleporter: [22, 8]
+- name: Pazuzu 7F Main Room - Crystal Script # Added for floor shuffle
+ id: 480
+ area: 89
+ coordinates: [15, 40]
+ teleporter: [38, 8]
+- name: Pazuzu 1F to 3F - South Stairs
+ id: 385
+ area: 90
+ coordinates: [43, 60]
+ teleporter: [29, 0]
+- name: Pazuzu 1F to 3F - North Stairs
+ id: 386
+ area: 90
+ coordinates: [43, 36]
+ teleporter: [30, 0]
+- name: Pazuzu 3F to 5F - South Stairs
+ id: 387
+ area: 91
+ coordinates: [43, 60]
+ teleporter: [40, 0]
+- name: Pazuzu 3F to 5F - North Stairs
+ id: 388
+ area: 91
+ coordinates: [43, 36]
+ teleporter: [41, 0]
+- name: Pazuzu 5F to 7F - South Stairs
+ id: 389
+ area: 92
+ coordinates: [43, 60]
+ teleporter: [38, 0]
+- name: Pazuzu 5F to 7F - North Stairs
+ id: 390
+ area: 92
+ coordinates: [43, 36]
+ teleporter: [39, 0]
+- name: Pazuzu 2F to 4F - South Stairs
+ id: 391
+ area: 93
+ coordinates: [43, 60]
+ teleporter: [21, 0]
+- name: Pazuzu 2F to 4F - North Stairs
+ id: 392
+ area: 93
+ coordinates: [43, 36]
+ teleporter: [22, 0]
+- name: Pazuzu 4F to 6F - South Stairs
+ id: 393
+ area: 94
+ coordinates: [43, 60]
+ teleporter: [2, 0]
+- name: Pazuzu 4F to 6F - North Stairs
+ id: 394
+ area: 94
+ coordinates: [43, 36]
+ teleporter: [3, 0]
+- name: Light Temple - Entrance
+ id: 395
+ area: 95
+ coordinates: [28, 57]
+ teleporter: [19, 6]
+- name: Light Temple - Mobius Teleporter Script
+ id: 396
+ area: 95
+ coordinates: [29, 37]
+ teleporter: [70, 8]
+- name: Ship Dock - Mobius Teleporter Script
+ id: 397
+ area: 96
+ coordinates: [15, 18]
+ teleporter: [61, 8]
+- name: Ship Dock - From Overworld
+ id: 398
+ area: 96
+ coordinates: [15, 11]
+ teleporter: [73, 0]
+- name: Ship Dock - Entrance
+ id: 399
+ area: 96
+ coordinates: [15, 23]
+ teleporter: [17, 6]
+- name: Mac Ship Deck - East Entrance Script
+ id: 400
+ area: 97
+ coordinates: [26, 40]
+ teleporter: [37, 8]
+- name: Mac Ship Deck - Central Stairs Script
+ id: 401
+ area: 97
+ coordinates: [16, 47]
+ teleporter: [50, 8]
+- name: Mac Ship Deck - West Stairs Script
+ id: 402
+ area: 97
+ coordinates: [8, 34]
+ teleporter: [51, 8]
+- name: Mac Ship Deck - East Stairs Script
+ id: 403
+ area: 97
+ coordinates: [24, 36]
+ teleporter: [52, 8]
+- name: Mac Ship Deck - North Stairs Script
+ id: 404
+ area: 97
+ coordinates: [12, 9]
+ teleporter: [53, 8]
+- name: Mac Ship B1 Outer Ring - South Stairs
+ id: 405
+ area: 98
+ coordinates: [16, 45]
+ teleporter: [208, 0]
+- name: Mac Ship B1 Outer Ring - West Stairs
+ id: 406
+ area: 98
+ coordinates: [8, 35]
+ teleporter: [175, 0]
+- name: Mac Ship B1 Outer Ring - East Stairs
+ id: 407
+ area: 98
+ coordinates: [25, 37]
+ teleporter: [172, 0]
+- name: Mac Ship B1 Outer Ring - Northwest Stairs
+ id: 408
+ area: 98
+ coordinates: [10, 23]
+ teleporter: [88, 0]
+- name: Mac Ship B1 Square Room - North Stairs
+ id: 409
+ area: 98
+ coordinates: [14, 9]
+ teleporter: [141, 0]
+- name: Mac Ship B1 Square Room - South Stairs
+ id: 410
+ area: 98
+ coordinates: [16, 12]
+ teleporter: [87, 0]
+- name: Mac Ship B1 Mac Room - Stairs # Unused?
+ id: 411
+ area: 98
+ coordinates: [16, 51]
+ teleporter: [101, 0]
+- name: Mac Ship B1 Central Corridor - South Stairs
+ id: 412
+ area: 98
+ coordinates: [16, 38]
+ teleporter: [102, 0]
+- name: Mac Ship B1 Central Corridor - North Stairs
+ id: 413
+ area: 98
+ coordinates: [16, 26]
+ teleporter: [86, 0]
+- name: Mac Ship B2 South Corridor - South Stairs
+ id: 414
+ area: 99
+ coordinates: [48, 51]
+ teleporter: [57, 1]
+- name: Mac Ship B2 South Corridor - North Stairs Script
+ id: 415
+ area: 99
+ coordinates: [48, 38]
+ teleporter: [55, 8]
+- name: Mac Ship B2 North Corridor - South Stairs Script
+ id: 416
+ area: 99
+ coordinates: [48, 27]
+ teleporter: [56, 8]
+- name: Mac Ship B2 North Corridor - North Stairs Script
+ id: 417
+ area: 99
+ coordinates: [48, 12]
+ teleporter: [57, 8]
+- name: Mac Ship B2 Outer Ring - Northwest Stairs Script
+ id: 418
+ area: 99
+ coordinates: [55, 11]
+ teleporter: [58, 8]
+- name: Mac Ship B1 Outer Ring Cleared - South Stairs
+ id: 419
+ area: 100
+ coordinates: [16, 45]
+ teleporter: [208, 0]
+- name: Mac Ship B1 Outer Ring Cleared - West Stairs
+ id: 420
+ area: 100
+ coordinates: [8, 35]
+ teleporter: [175, 0]
+- name: Mac Ship B1 Outer Ring Cleared - East Stairs
+ id: 421
+ area: 100
+ coordinates: [25, 37]
+ teleporter: [172, 0]
+- name: Mac Ship B1 Square Room Cleared - North Stairs
+ id: 422
+ area: 100
+ coordinates: [14, 9]
+ teleporter: [141, 0]
+- name: Mac Ship B1 Square Room Cleared - South Stairs
+ id: 423
+ area: 100
+ coordinates: [16, 12]
+ teleporter: [87, 0]
+- name: Mac Ship B1 Mac Room Cleared - Main Stairs
+ id: 424
+ area: 100
+ coordinates: [16, 51]
+ teleporter: [101, 0]
+- name: Mac Ship B1 Central Corridor Cleared - South Stairs
+ id: 425
+ area: 100
+ coordinates: [16, 38]
+ teleporter: [102, 0]
+- name: Mac Ship B1 Central Corridor Cleared - North Stairs
+ id: 426
+ area: 100
+ coordinates: [16, 26]
+ teleporter: [86, 0]
+- name: Mac Ship B1 Central Corridor Cleared - Northwest Stairs
+ id: 427
+ area: 100
+ coordinates: [23, 10]
+ teleporter: [88, 0]
+- name: Doom Castle Corridor of Destiny - South Entrance
+ id: 428
+ area: 101
+ coordinates: [59, 29]
+ teleporter: [84, 0]
+- name: Doom Castle Corridor of Destiny - Ice Floor Entrance
+ id: 429
+ area: 101
+ coordinates: [59, 21]
+ teleporter: [35, 2]
+- name: Doom Castle Corridor of Destiny - Lava Floor Entrance
+ id: 430
+ area: 101
+ coordinates: [59, 13]
+ teleporter: [209, 0]
+- name: Doom Castle Corridor of Destiny - Sky Floor Entrance
+ id: 431
+ area: 101
+ coordinates: [59, 5]
+ teleporter: [211, 0]
+- name: Doom Castle Corridor of Destiny - Hero Room Entrance
+ id: 432
+ area: 101
+ coordinates: [59, 61]
+ teleporter: [13, 2]
+- name: Doom Castle Ice Floor - Entrance
+ id: 433
+ area: 102
+ coordinates: [23, 42]
+ teleporter: [109, 3]
+- name: Doom Castle Lava Floor - Entrance
+ id: 434
+ area: 103
+ coordinates: [23, 40]
+ teleporter: [210, 0]
+- name: Doom Castle Sky Floor - Entrance
+ id: 435
+ area: 104
+ coordinates: [24, 41]
+ teleporter: [212, 0]
+- name: Doom Castle Hero Room - Dark King Entrance 1
+ id: 436
+ area: 106
+ coordinates: [15, 5]
+ teleporter: [54, 0]
+- name: Doom Castle Hero Room - Dark King Entrance 2
+ id: 437
+ area: 106
+ coordinates: [16, 5]
+ teleporter: [54, 0]
+- name: Doom Castle Hero Room - Dark King Entrance 3
+ id: 438
+ area: 106
+ coordinates: [15, 4]
+ teleporter: [54, 0]
+- name: Doom Castle Hero Room - Dark King Entrance 4
+ id: 439
+ area: 106
+ coordinates: [16, 4]
+ teleporter: [54, 0]
+- name: Doom Castle Hero Room - Hero Statue Script
+ id: 440
+ area: 106
+ coordinates: [15, 17]
+ teleporter: [24, 8]
+- name: Doom Castle Hero Room - Entrance
+ id: 441
+ area: 106
+ coordinates: [15, 24]
+ teleporter: [110, 3]
+- name: Doom Castle Dark King Room - Entrance
+ id: 442
+ area: 107
+ coordinates: [14, 26]
+ teleporter: [52, 0]
+- name: Doom Castle Dark King Room - Dark King Script
+ id: 443
+ area: 107
+ coordinates: [14, 15]
+ teleporter: [25, 8]
+- name: Doom Castle Dark King Room - Unknown
+ id: 444
+ area: 107
+ coordinates: [47, 54]
+ teleporter: [77, 0]
+- name: Overworld - Level Forest
+ id: 445
+ area: 0
+ type: "Overworld"
+ teleporter: [0x2E, 8]
+- name: Overworld - Foresta
+ id: 446
+ area: 0
+ type: "Overworld"
+ teleporter: [0x02, 1]
+- name: Overworld - Sand Temple
+ id: 447
+ area: 0
+ type: "Overworld"
+ teleporter: [0x03, 1]
+- name: Overworld - Bone Dungeon
+ id: 448
+ area: 0
+ type: "Overworld"
+ teleporter: [0x04, 1]
+- name: Overworld - Focus Tower Foresta
+ id: 449
+ area: 0
+ type: "Overworld"
+ teleporter: [0x05, 1]
+- name: Overworld - Focus Tower Aquaria
+ id: 450
+ area: 0
+ type: "Overworld"
+ teleporter: [0x13, 1]
+- name: Overworld - Libra Temple
+ id: 451
+ area: 0
+ type: "Overworld"
+ teleporter: [0x07, 1]
+- name: Overworld - Aquaria
+ id: 452
+ area: 0
+ type: "Overworld"
+ teleporter: [0x08, 8]
+- name: Overworld - Wintry Cave
+ id: 453
+ area: 0
+ type: "Overworld"
+ teleporter: [0x0A, 1]
+- name: Overworld - Life Temple
+ id: 454
+ area: 0
+ type: "Overworld"
+ teleporter: [0x0B, 1]
+- name: Overworld - Falls Basin
+ id: 455
+ area: 0
+ type: "Overworld"
+ teleporter: [0x0C, 1]
+- name: Overworld - Ice Pyramid
+ id: 456
+ area: 0
+ type: "Overworld"
+ teleporter: [0x0D, 1] # Will be switched to a script
+- name: Overworld - Spencer's Place
+ id: 457
+ area: 0
+ type: "Overworld"
+ teleporter: [0x30, 8]
+- name: Overworld - Wintry Temple
+ id: 458
+ area: 0
+ type: "Overworld"
+ teleporter: [0x10, 1]
+- name: Overworld - Focus Tower Frozen Strip
+ id: 459
+ area: 0
+ type: "Overworld"
+ teleporter: [0x11, 1]
+- name: Overworld - Focus Tower Fireburg
+ id: 460
+ area: 0
+ type: "Overworld"
+ teleporter: [0x12, 1]
+- name: Overworld - Fireburg
+ id: 461
+ area: 0
+ type: "Overworld"
+ teleporter: [0x14, 1]
+- name: Overworld - Mine
+ id: 462
+ area: 0
+ type: "Overworld"
+ teleporter: [0x15, 1]
+- name: Overworld - Sealed Temple
+ id: 463
+ area: 0
+ type: "Overworld"
+ teleporter: [0x16, 1]
+- name: Overworld - Volcano
+ id: 464
+ area: 0
+ type: "Overworld"
+ teleporter: [0x17, 1]
+- name: Overworld - Lava Dome
+ id: 465
+ area: 0
+ type: "Overworld"
+ teleporter: [0x18, 1]
+- name: Overworld - Focus Tower Windia
+ id: 466
+ area: 0
+ type: "Overworld"
+ teleporter: [0x06, 1]
+- name: Overworld - Rope Bridge
+ id: 467
+ area: 0
+ type: "Overworld"
+ teleporter: [0x19, 1]
+- name: Overworld - Alive Forest
+ id: 468
+ area: 0
+ type: "Overworld"
+ teleporter: [0x1A, 1]
+- name: Overworld - Giant Tree
+ id: 469
+ area: 0
+ type: "Overworld"
+ teleporter: [0x1B, 1]
+- name: Overworld - Kaidge Temple
+ id: 470
+ area: 0
+ type: "Overworld"
+ teleporter: [0x1C, 1]
+- name: Overworld - Windia
+ id: 471
+ area: 0
+ type: "Overworld"
+ teleporter: [0x1D, 1]
+- name: Overworld - Windhole Temple
+ id: 472
+ area: 0
+ type: "Overworld"
+ teleporter: [0x1E, 1]
+- name: Overworld - Mount Gale
+ id: 473
+ area: 0
+ type: "Overworld"
+ teleporter: [0x1F, 1]
+- name: Overworld - Pazuzu Tower
+ id: 474
+ area: 0
+ type: "Overworld"
+ teleporter: [0x20, 1]
+- name: Overworld - Ship Dock
+ id: 475
+ area: 0
+ type: "Overworld"
+ teleporter: [0x3E, 1]
+- name: Overworld - Doom Castle
+ id: 476
+ area: 0
+ type: "Overworld"
+ teleporter: [0x21, 1]
+- name: Overworld - Light Temple
+ id: 477
+ area: 0
+ type: "Overworld"
+ teleporter: [0x22, 1]
+- name: Overworld - Mac Ship
+ id: 478
+ area: 0
+ type: "Overworld"
+ teleporter: [0x24, 1]
+- name: Overworld - Mac Ship Doom
+ id: 479
+ area: 0
+ type: "Overworld"
+ teleporter: [0x24, 1]
+- name: Dummy House - Bed Script
+ id: 480
+ area: 17
+ coordinates: [0x28, 0x38]
+ teleporter: [1, 8]
+- name: Dummy House - Entrance
+ id: 481
+ area: 17
+ coordinates: [0x29, 0x3B]
+ teleporter: [0, 10] #None
diff --git a/worlds/ffmq/data/rooms.yaml b/worlds/ffmq/data/rooms.yaml
new file mode 100644
index 00000000..4343d785
--- /dev/null
+++ b/worlds/ffmq/data/rooms.yaml
@@ -0,0 +1,4026 @@
+- name: Overworld
+ id: 0
+ type: "Overworld"
+ game_objects: []
+ links:
+ - target_room: 220 # To Forest Subregion
+ access: []
+- name: Subregion Foresta
+ id: 220
+ type: "Subregion"
+ region: "Foresta"
+ game_objects:
+ - name: "Foresta South Battlefield"
+ object_id: 0x01
+ location: "ForestaSouthBattlefield"
+ location_slot: "ForestaSouthBattlefield"
+ type: "BattlefieldXp"
+ access: []
+ - name: "Foresta West Battlefield"
+ object_id: 0x02
+ location: "ForestaWestBattlefield"
+ location_slot: "ForestaWestBattlefield"
+ type: "BattlefieldItem"
+ access: []
+ - name: "Foresta East Battlefield"
+ object_id: 0x03
+ location: "ForestaEastBattlefield"
+ location_slot: "ForestaEastBattlefield"
+ type: "BattlefieldGp"
+ access: []
+ links:
+ - target_room: 15 # Level Forest
+ location: "LevelForest"
+ location_slot: "LevelForest"
+ entrance: 445
+ teleporter: [0x2E, 8]
+ access: []
+ - target_room: 16 # Foresta
+ location: "Foresta"
+ location_slot: "Foresta"
+ entrance: 446
+ teleporter: [0x02, 1]
+ access: []
+ - target_room: 24 # Sand Temple
+ location: "SandTemple"
+ location_slot: "SandTemple"
+ entrance: 447
+ teleporter: [0x03, 1]
+ access: []
+ - target_room: 25 # Bone Dungeon
+ location: "BoneDungeon"
+ location_slot: "BoneDungeon"
+ entrance: 448
+ teleporter: [0x04, 1]
+ access: []
+ - target_room: 3 # Focus Tower Foresta
+ location: "FocusTowerForesta"
+ location_slot: "FocusTowerForesta"
+ entrance: 449
+ teleporter: [0x05, 1]
+ access: []
+ - target_room: 221
+ access: ["SandCoin"]
+ - target_room: 224
+ access: ["RiverCoin"]
+ - target_room: 226
+ access: ["SunCoin"]
+- name: Subregion Aquaria
+ id: 221
+ type: "Subregion"
+ region: "Aquaria"
+ game_objects:
+ - name: "South of Libra Temple Battlefield"
+ object_id: 0x04
+ location: "AquariaBattlefield01"
+ location_slot: "AquariaBattlefield01"
+ type: "BattlefieldXp"
+ access: []
+ - name: "East of Libra Temple Battlefield"
+ object_id: 0x05
+ location: "AquariaBattlefield02"
+ location_slot: "AquariaBattlefield02"
+ type: "BattlefieldGp"
+ access: []
+ - name: "South of Aquaria Battlefield"
+ object_id: 0x06
+ location: "AquariaBattlefield03"
+ location_slot: "AquariaBattlefield03"
+ type: "BattlefieldItem"
+ access: []
+ - name: "South of Wintry Cave Battlefield"
+ object_id: 0x07
+ location: "WintryBattlefield01"
+ location_slot: "WintryBattlefield01"
+ type: "BattlefieldXp"
+ access: []
+ - name: "West of Wintry Cave Battlefield"
+ object_id: 0x08
+ location: "WintryBattlefield02"
+ location_slot: "WintryBattlefield02"
+ type: "BattlefieldGp"
+ access: []
+ - name: "Ice Pyramid Battlefield"
+ object_id: 0x09
+ location: "PyramidBattlefield01"
+ location_slot: "PyramidBattlefield01"
+ type: "BattlefieldXp"
+ access: []
+ links:
+ - target_room: 10 # Focus Tower Aquaria
+ location: "FocusTowerAquaria"
+ location_slot: "FocusTowerAquaria"
+ entrance: 450
+ teleporter: [0x13, 1]
+ access: []
+ - target_room: 39 # Libra Temple
+ location: "LibraTemple"
+ location_slot: "LibraTemple"
+ entrance: 451
+ teleporter: [0x07, 1]
+ access: []
+ - target_room: 40 # Aquaria
+ location: "Aquaria"
+ location_slot: "Aquaria"
+ entrance: 452
+ teleporter: [0x08, 8]
+ access: []
+ - target_room: 45 # Wintry Cave
+ location: "WintryCave"
+ location_slot: "WintryCave"
+ entrance: 453
+ teleporter: [0x0A, 1]
+ access: []
+ - target_room: 52 # Falls Basin
+ location: "FallsBasin"
+ location_slot: "FallsBasin"
+ entrance: 455
+ teleporter: [0x0C, 1]
+ access: []
+ - target_room: 54 # Ice Pyramid
+ location: "IcePyramid"
+ location_slot: "IcePyramid"
+ entrance: 456
+ teleporter: [0x0D, 1] # Will be switched to a script
+ access: []
+ - target_room: 220
+ access: ["SandCoin"]
+ - target_room: 224
+ access: ["SandCoin", "RiverCoin"]
+ - target_room: 226
+ access: ["SandCoin", "SunCoin"]
+ - target_room: 223
+ access: ["SummerAquaria"]
+- name: Subregion Life Temple
+ id: 222
+ type: "Subregion"
+ region: "LifeTemple"
+ game_objects: []
+ links:
+ - target_room: 51 # Life Temple
+ location: "LifeTemple"
+ location_slot: "LifeTemple"
+ entrance: 454
+ teleporter: [0x0B, 1]
+ access: []
+- name: Subregion Frozen Fields
+ id: 223
+ type: "Subregion"
+ region: "AquariaFrozenField"
+ game_objects:
+ - name: "North of Libra Temple Battlefield"
+ object_id: 0x0A
+ location: "LibraBattlefield01"
+ location_slot: "LibraBattlefield01"
+ type: "BattlefieldItem"
+ access: []
+ - name: "Aquaria Frozen Field Battlefield"
+ object_id: 0x0B
+ location: "LibraBattlefield02"
+ location_slot: "LibraBattlefield02"
+ type: "BattlefieldXp"
+ access: []
+ links:
+ - target_room: 74 # Wintry Temple
+ location: "WintryTemple"
+ location_slot: "WintryTemple"
+ entrance: 458
+ teleporter: [0x10, 1]
+ access: []
+ - target_room: 14 # Focus Tower Frozen Strip
+ location: "FocusTowerFrozen"
+ location_slot: "FocusTowerFrozen"
+ entrance: 459
+ teleporter: [0x11, 1]
+ access: []
+ - target_room: 221
+ access: []
+ - target_room: 225
+ access: ["SummerAquaria", "DualheadHydra"]
+- name: Subregion Fireburg
+ id: 224
+ type: "Subregion"
+ region: "Fireburg"
+ game_objects:
+ - name: "Path to Fireburg Southern Battlefield"
+ object_id: 0x0C
+ location: "FireburgBattlefield01"
+ location_slot: "FireburgBattlefield01"
+ type: "BattlefieldGp"
+ access: []
+ - name: "Path to Fireburg Central Battlefield"
+ object_id: 0x0D
+ location: "FireburgBattlefield02"
+ location_slot: "FireburgBattlefield02"
+ type: "BattlefieldItem"
+ access: []
+ - name: "Path to Fireburg Northern Battlefield"
+ object_id: 0x0E
+ location: "FireburgBattlefield03"
+ location_slot: "FireburgBattlefield03"
+ type: "BattlefieldXp"
+ access: []
+ - name: "Sealed Temple Battlefield"
+ object_id: 0x0F
+ location: "MineBattlefield01"
+ location_slot: "MineBattlefield01"
+ type: "BattlefieldGp"
+ access: []
+ - name: "Mine Battlefield"
+ object_id: 0x10
+ location: "MineBattlefield02"
+ location_slot: "MineBattlefield02"
+ type: "BattlefieldItem"
+ access: []
+ - name: "Boulder Battlefield"
+ object_id: 0x11
+ location: "MineBattlefield03"
+ location_slot: "MineBattlefield03"
+ type: "BattlefieldXp"
+ access: []
+ links:
+ - target_room: 13 # Focus Tower Fireburg
+ location: "FocusTowerFireburg"
+ location_slot: "FocusTowerFireburg"
+ entrance: 460
+ teleporter: [0x12, 1]
+ access: []
+ - target_room: 76 # Fireburg
+ location: "Fireburg"
+ location_slot: "Fireburg"
+ entrance: 461
+ teleporter: [0x14, 1]
+ access: []
+ - target_room: 84 # Mine
+ location: "Mine"
+ location_slot: "Mine"
+ entrance: 462
+ teleporter: [0x15, 1]
+ access: []
+ - target_room: 92 # Sealed Temple
+ location: "SealedTemple"
+ location_slot: "SealedTemple"
+ entrance: 463
+ teleporter: [0x16, 1]
+ access: []
+ - target_room: 93 # Volcano
+ location: "Volcano"
+ location_slot: "Volcano"
+ entrance: 464
+ teleporter: [0x17, 1] # Also this one / 0x0F, 8
+ access: []
+ - target_room: 100 # Lava Dome
+ location: "LavaDome"
+ location_slot: "LavaDome"
+ entrance: 465
+ teleporter: [0x18, 1]
+ access: []
+ - target_room: 220
+ access: ["RiverCoin"]
+ - target_room: 221
+ access: ["SandCoin", "RiverCoin"]
+ - target_room: 226
+ access: ["RiverCoin", "SunCoin"]
+ - target_room: 225
+ access: ["DualheadHydra"]
+- name: Subregion Volcano Battlefield
+ id: 225
+ type: "Subregion"
+ region: "VolcanoBattlefield"
+ game_objects:
+ - name: "Volcano Battlefield"
+ object_id: 0x12
+ location: "VolcanoBattlefield01"
+ location_slot: "VolcanoBattlefield01"
+ type: "BattlefieldXp"
+ access: []
+ links:
+ - target_room: 224
+ access: ["DualheadHydra"]
+ - target_room: 223
+ access: ["SummerAquaria"]
+- name: Subregion Windia
+ id: 226
+ type: "Subregion"
+ region: "Windia"
+ game_objects:
+ - name: "Kaidge Temple Battlefield"
+ object_id: 0x13
+ location: "WindiaBattlefield01"
+ location_slot: "WindiaBattlefield01"
+ type: "BattlefieldXp"
+ access: []
+ - name: "South of Windia Battlefield"
+ object_id: 0x14
+ location: "WindiaBattlefield02"
+ location_slot: "WindiaBattlefield02"
+ type: "BattlefieldXp"
+ access: []
+ links:
+ - target_room: 9 # Focus Tower Windia
+ location: "FocusTowerWindia"
+ location_slot: "FocusTowerWindia"
+ entrance: 466
+ teleporter: [0x06, 1]
+ access: []
+ - target_room: 123 # Rope Bridge
+ location: "RopeBridge"
+ location_slot: "RopeBridge"
+ entrance: 467
+ teleporter: [0x19, 1]
+ access: []
+ - target_room: 124 # Alive Forest
+ location: "AliveForest"
+ location_slot: "AliveForest"
+ entrance: 468
+ teleporter: [0x1A, 1]
+ access: []
+ - target_room: 125 # Giant Tree
+ location: "GiantTree"
+ location_slot: "GiantTree"
+ entrance: 469
+ teleporter: [0x1B, 1]
+ access: ["Barred"]
+ - target_room: 152 # Kaidge Temple
+ location: "KaidgeTemple"
+ location_slot: "KaidgeTemple"
+ entrance: 470
+ teleporter: [0x1C, 1]
+ access: []
+ - target_room: 156 # Windia
+ location: "Windia"
+ location_slot: "Windia"
+ entrance: 471
+ teleporter: [0x1D, 1]
+ access: []
+ - target_room: 154 # Windhole Temple
+ location: "WindholeTemple"
+ location_slot: "WindholeTemple"
+ entrance: 472
+ teleporter: [0x1E, 1]
+ access: []
+ - target_room: 155 # Mount Gale
+ location: "MountGale"
+ location_slot: "MountGale"
+ entrance: 473
+ teleporter: [0x1F, 1]
+ access: []
+ - target_room: 166 # Pazuzu Tower
+ location: "PazuzusTower"
+ location_slot: "PazuzusTower"
+ entrance: 474
+ teleporter: [0x20, 1]
+ access: []
+ - target_room: 220
+ access: ["SunCoin"]
+ - target_room: 221
+ access: ["SandCoin", "SunCoin"]
+ - target_room: 224
+ access: ["RiverCoin", "SunCoin"]
+ - target_room: 227
+ access: ["RainbowBridge"]
+- name: Subregion Spencer's Cave
+ id: 227
+ type: "Subregion"
+ region: "SpencerCave"
+ game_objects: []
+ links:
+ - target_room: 73 # Spencer's Place
+ location: "SpencersPlace"
+ location_slot: "SpencersPlace"
+ entrance: 457
+ teleporter: [0x30, 8]
+ access: []
+ - target_room: 226
+ access: ["RainbowBridge"]
+- name: Subregion Ship Dock
+ id: 228
+ type: "Subregion"
+ region: "ShipDock"
+ game_objects: []
+ links:
+ - target_room: 186 # Ship Dock
+ location: "ShipDock"
+ location_slot: "ShipDock"
+ entrance: 475
+ teleporter: [0x3E, 1]
+ access: []
+ - target_room: 229
+ access: ["ShipLiberated", "ShipDockAccess"]
+- name: Subregion Mac's Ship
+ id: 229
+ type: "Subregion"
+ region: "MacShip"
+ game_objects: []
+ links:
+ - target_room: 187 # Mac Ship
+ location: "MacsShip"
+ location_slot: "MacsShip"
+ entrance: 478
+ teleporter: [0x24, 1]
+ access: []
+ - target_room: 228
+ access: ["ShipLiberated", "ShipDockAccess"]
+ - target_room: 231
+ access: ["ShipLoaned", "ShipDockAccess", "ShipSteeringWheel"]
+- name: Subregion Light Temple
+ id: 230
+ type: "Subregion"
+ region: "LightTemple"
+ game_objects: []
+ links:
+ - target_room: 185 # Light Temple
+ location: "LightTemple"
+ location_slot: "LightTemple"
+ entrance: 477
+ teleporter: [0x23, 1]
+ access: []
+- name: Subregion Doom Castle
+ id: 231
+ type: "Subregion"
+ region: "DoomCastle"
+ game_objects: []
+ links:
+ - target_room: 1 # Doom Castle
+ location: "DoomCastle"
+ location_slot: "DoomCastle"
+ entrance: 476
+ teleporter: [0x21, 1]
+ access: []
+ - target_room: 187 # Mac Ship Doom
+ location: "MacsShipDoom"
+ location_slot: "MacsShipDoom"
+ entrance: 479
+ teleporter: [0x24, 1]
+ access: ["Barred"]
+ - target_room: 229
+ access: ["ShipLoaned", "ShipDockAccess", "ShipSteeringWheel"]
+- name: Doom Castle - Sand Floor
+ id: 1
+ game_objects:
+ - name: "Doom Castle B2 - Southeast Chest"
+ object_id: 0x01
+ type: "Chest"
+ access: ["Bomb"]
+ - name: "Doom Castle B2 - Bone Ledge Box"
+ object_id: 0x1E
+ type: "Box"
+ access: []
+ - name: "Doom Castle B2 - Hook Platform Box"
+ object_id: 0x1F
+ type: "Box"
+ access: ["DragonClaw"]
+ links:
+ - target_room: 231
+ entrance: 1
+ teleporter: [1, 6]
+ access: []
+ - target_room: 5
+ entrance: 0
+ teleporter: [0, 0]
+ access: ["DragonClaw", "MegaGrenade"]
+- name: Doom Castle - Aero Room
+ id: 2
+ game_objects:
+ - name: "Doom Castle B2 - Sun Door Chest"
+ object_id: 0x00
+ type: "Chest"
+ access: []
+ links:
+ - target_room: 4
+ entrance: 2
+ teleporter: [1, 0]
+ access: []
+- name: Focus Tower B1 - Main Loop
+ id: 3
+ game_objects: []
+ links:
+ - target_room: 220
+ entrance: 3
+ teleporter: [2, 6]
+ access: []
+ - target_room: 6
+ entrance: 4
+ teleporter: [4, 0]
+ access: []
+- name: Focus Tower B1 - Aero Corridor
+ id: 4
+ game_objects: []
+ links:
+ - target_room: 9
+ entrance: 5
+ teleporter: [5, 0]
+ access: []
+ - target_room: 2
+ entrance: 6
+ teleporter: [8, 0]
+ access: []
+- name: Focus Tower B1 - Inner Loop
+ id: 5
+ game_objects: []
+ links:
+ - target_room: 1
+ entrance: 8
+ teleporter: [7, 0]
+ access: []
+ - target_room: 201
+ entrance: 7
+ teleporter: [6, 0]
+ access: []
+- name: Focus Tower 1F Main Lobby
+ id: 6
+ game_objects:
+ - name: "Focus Tower 1F - Main Lobby Box"
+ object_id: 0x21
+ type: "Box"
+ access: []
+ links:
+ - target_room: 3
+ entrance: 11
+ teleporter: [11, 0]
+ access: []
+ - target_room: 7
+ access: ["SandCoin"]
+ - target_room: 8
+ access: ["RiverCoin"]
+ - target_room: 9
+ access: ["SunCoin"]
+- name: Focus Tower 1F SandCoin Room
+ id: 7
+ game_objects: []
+ links:
+ - target_room: 6
+ access: ["SandCoin"]
+ - target_room: 10
+ entrance: 10
+ teleporter: [10, 0]
+ access: []
+- name: Focus Tower 1F RiverCoin Room
+ id: 8
+ game_objects: []
+ links:
+ - target_room: 6
+ access: ["RiverCoin"]
+ - target_room: 11
+ entrance: 14
+ teleporter: [14, 0]
+ access: []
+- name: Focus Tower 1F SunCoin Room
+ id: 9
+ game_objects: []
+ links:
+ - target_room: 6
+ access: ["SunCoin"]
+ - target_room: 4
+ entrance: 12
+ teleporter: [12, 0]
+ access: []
+ - target_room: 226
+ entrance: 9
+ teleporter: [3, 6]
+ access: []
+- name: Focus Tower 1F SkyCoin Room
+ id: 201
+ game_objects: []
+ links:
+ - target_room: 195
+ entrance: 13
+ teleporter: [13, 0]
+ access: ["SkyCoin", "FlamerusRex", "IceGolem", "DualheadHydra", "Pazuzu"]
+ - target_room: 5
+ entrance: 15
+ teleporter: [15, 0]
+ access: []
+- name: Focus Tower 2F - Sand Coin Passage
+ id: 10
+ game_objects:
+ - name: "Focus Tower 2F - Sand Door Chest"
+ object_id: 0x03
+ type: "Chest"
+ access: []
+ links:
+ - target_room: 221
+ entrance: 16
+ teleporter: [4, 6]
+ access: []
+ - target_room: 7
+ entrance: 17
+ teleporter: [17, 0]
+ access: []
+- name: Focus Tower 2F - River Coin Passage
+ id: 11
+ game_objects: []
+ links:
+ - target_room: 8
+ entrance: 18
+ teleporter: [18, 0]
+ access: []
+ - target_room: 13
+ entrance: 19
+ teleporter: [20, 0]
+ access: []
+- name: Focus Tower 2F - Venus Chest Room
+ id: 12
+ game_objects:
+ - name: "Focus Tower 2F - Back Door Chest"
+ object_id: 0x02
+ type: "Chest"
+ access: []
+ - name: "Focus Tower 2F - Venus Chest"
+ object_id: 9
+ type: "NPC"
+ access: ["Bomb", "VenusKey"]
+ links:
+ - target_room: 14
+ entrance: 20
+ teleporter: [19, 0]
+ access: []
+- name: Focus Tower 3F - Lower Floor
+ id: 13
+ game_objects:
+ - name: "Focus Tower 3F - River Door Box"
+ object_id: 0x22
+ type: "Box"
+ access: []
+ links:
+ - target_room: 224
+ entrance: 22
+ teleporter: [6, 6]
+ access: []
+ - target_room: 11
+ entrance: 23
+ teleporter: [24, 0]
+ access: []
+- name: Focus Tower 3F - Upper Floor
+ id: 14
+ game_objects: []
+ links:
+ - target_room: 223
+ entrance: 24
+ teleporter: [5, 6]
+ access: []
+ - target_room: 12
+ entrance: 25
+ teleporter: [23, 0]
+ access: []
+- name: Level Forest
+ id: 15
+ game_objects:
+ - name: "Level Forest - Northwest Box"
+ object_id: 0x28
+ type: "Box"
+ access: ["Axe"]
+ - name: "Level Forest - Northeast Box"
+ object_id: 0x29
+ type: "Box"
+ access: ["Axe"]
+ - name: "Level Forest - Middle Box"
+ object_id: 0x2A
+ type: "Box"
+ access: []
+ - name: "Level Forest - Southwest Box"
+ object_id: 0x2B
+ type: "Box"
+ access: ["Axe"]
+ - name: "Level Forest - Southeast Box"
+ object_id: 0x2C
+ type: "Box"
+ access: ["Axe"]
+ - name: "Minotaur"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Minotaur"]
+ access: ["Kaeli1"]
+ - name: "Level Forest - Old Man"
+ object_id: 0
+ type: "NPC"
+ access: []
+ - name: "Level Forest - Kaeli"
+ object_id: 1
+ type: "NPC"
+ access: ["Kaeli1", "Minotaur"]
+ links:
+ - target_room: 220
+ entrance: 28
+ teleporter: [25, 0]
+ access: []
+- name: Foresta
+ id: 16
+ game_objects:
+ - name: "Foresta - Outside Box"
+ object_id: 0x2D
+ type: "Box"
+ access: ["Axe"]
+ links:
+ - target_room: 220
+ entrance: 38
+ teleporter: [31, 0]
+ access: []
+ - target_room: 17
+ entrance: 44
+ teleporter: [0, 5]
+ access: []
+ - target_room: 18
+ entrance: 42
+ teleporter: [32, 4]
+ access: []
+ - target_room: 19
+ entrance: 43
+ teleporter: [33, 0]
+ access: []
+ - target_room: 20
+ entrance: 45
+ teleporter: [1, 5]
+ access: []
+- name: Kaeli's House
+ id: 17
+ game_objects:
+ - name: "Foresta - Kaeli's House Box"
+ object_id: 0x2E
+ type: "Box"
+ access: []
+ - name: "Kaeli 1"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Kaeli1"]
+ access: ["TreeWither"]
+ - name: "Kaeli 2"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Kaeli2"]
+ access: ["Kaeli1", "Minotaur", "Elixir"]
+ links:
+ - target_room: 16
+ entrance: 46
+ teleporter: [86, 3]
+ access: []
+- name: Foresta Houses - Old Man's House Main
+ id: 18
+ game_objects: []
+ links:
+ - target_room: 19
+ access: ["BarrelPushed"]
+ - target_room: 16
+ entrance: 47
+ teleporter: [34, 0]
+ access: []
+- name: Foresta Houses - Old Man's House Back
+ id: 19
+ game_objects:
+ - name: "Foresta - Old Man House Chest"
+ object_id: 0x05
+ type: "Chest"
+ access: []
+ - name: "Old Man Barrel"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["BarrelPushed"]
+ access: []
+ links:
+ - target_room: 18
+ access: ["BarrelPushed"]
+ - target_room: 16
+ entrance: 48
+ teleporter: [35, 0]
+ access: []
+- name: Foresta Houses - Rest House
+ id: 20
+ game_objects:
+ - name: "Foresta - Rest House Box"
+ object_id: 0x2F
+ type: "Box"
+ access: []
+ links:
+ - target_room: 16
+ entrance: 50
+ teleporter: [87, 3]
+ access: []
+- name: Libra Treehouse
+ id: 21
+ game_objects:
+ - name: "Alive Forest - Libra Treehouse Box"
+ object_id: 0x32
+ type: "Box"
+ access: []
+ links:
+ - target_room: 124
+ entrance: 51
+ teleporter: [67, 8]
+ access: ["LibraCrest"]
+- name: Gemini Treehouse
+ id: 22
+ game_objects:
+ - name: "Alive Forest - Gemini Treehouse Box"
+ object_id: 0x33
+ type: "Box"
+ access: []
+ links:
+ - target_room: 124
+ entrance: 52
+ teleporter: [68, 8]
+ access: ["GeminiCrest"]
+- name: Mobius Treehouse
+ id: 23
+ game_objects:
+ - name: "Alive Forest - Mobius Treehouse West Box"
+ object_id: 0x30
+ type: "Box"
+ access: []
+ - name: "Alive Forest - Mobius Treehouse East Box"
+ object_id: 0x31
+ type: "Box"
+ access: []
+ links:
+ - target_room: 124
+ entrance: 53
+ teleporter: [69, 8]
+ access: ["MobiusCrest"]
+- name: Sand Temple
+ id: 24
+ game_objects:
+ - name: "Tristam Sand Temple"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Tristam"]
+ access: []
+ links:
+ - target_room: 220
+ entrance: 54
+ teleporter: [36, 0]
+ access: []
+- name: Bone Dungeon 1F
+ id: 25
+ game_objects:
+ - name: "Bone Dungeon 1F - Entrance Room West Box"
+ object_id: 0x35
+ type: "Box"
+ access: []
+ - name: "Bone Dungeon 1F - Entrance Room Middle Box"
+ object_id: 0x36
+ type: "Box"
+ access: []
+ - name: "Bone Dungeon 1F - Entrance Room East Box"
+ object_id: 0x37
+ type: "Box"
+ access: []
+ links:
+ - target_room: 220
+ entrance: 55
+ teleporter: [37, 0]
+ access: []
+ - target_room: 26
+ entrance: 56
+ teleporter: [2, 2]
+ access: []
+- name: Bone Dungeon B1 - Waterway
+ id: 26
+ game_objects:
+ - name: "Bone Dungeon B1 - Skull Chest"
+ object_id: 0x06
+ type: "Chest"
+ access: ["Bomb"]
+ - name: "Bone Dungeon B1 - Tristam"
+ object_id: 2
+ type: "NPC"
+ access: ["Tristam"]
+ links:
+ - target_room: 25
+ entrance: 59
+ teleporter: [88, 3]
+ access: []
+ - target_room: 28
+ entrance: 57
+ teleporter: [3, 2]
+ access: ["Bomb"]
+- name: Bone Dungeon B1 - Checker Room
+ id: 28
+ game_objects:
+ - name: "Bone Dungeon B1 - Checker Room Box"
+ object_id: 0x38
+ type: "Box"
+ access: ["Bomb"]
+ links:
+ - target_room: 26
+ entrance: 61
+ teleporter: [89, 3]
+ access: []
+ - target_room: 30
+ entrance: 60
+ teleporter: [4, 2]
+ access: []
+- name: Bone Dungeon B1 - Hidden Room
+ id: 29
+ game_objects:
+ - name: "Bone Dungeon B1 - Ribcage Waterway Box"
+ object_id: 0x39
+ type: "Box"
+ access: []
+ links:
+ - target_room: 31
+ entrance: 62
+ teleporter: [91, 3]
+ access: []
+- name: Bone Dungeon B2 - Exploding Skull Room - First Room
+ id: 30
+ game_objects:
+ - name: "Bone Dungeon B2 - Spines Room Alcove Box"
+ object_id: 0x3B
+ type: "Box"
+ access: []
+ - name: "Long Spine"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["LongSpineBombed"]
+ access: ["Bomb"]
+ links:
+ - target_room: 28
+ entrance: 65
+ teleporter: [90, 3]
+ access: []
+ - target_room: 31
+ access: ["LongSpineBombed"]
+- name: Bone Dungeon B2 - Exploding Skull Room - Second Room
+ id: 31
+ game_objects:
+ - name: "Bone Dungeon B2 - Spines Room Looped Hallway Box"
+ object_id: 0x3A
+ type: "Box"
+ access: []
+ - name: "Short Spine"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["ShortSpineBombed"]
+ access: ["Bomb"]
+ links:
+ - target_room: 29
+ entrance: 63
+ teleporter: [5, 2]
+ access: ["LongSpineBombed"]
+ - target_room: 32
+ access: ["ShortSpineBombed"]
+ - target_room: 30
+ access: ["LongSpineBombed"]
+- name: Bone Dungeon B2 - Exploding Skull Room - Third Room
+ id: 32
+ game_objects: []
+ links:
+ - target_room: 35
+ entrance: 64
+ teleporter: [6, 2]
+ access: []
+ - target_room: 31
+ access: ["ShortSpineBombed"]
+- name: Bone Dungeon B2 - Box Room
+ id: 33
+ game_objects:
+ - name: "Bone Dungeon B2 - Lone Room Box"
+ object_id: 0x3D
+ type: "Box"
+ access: []
+ links:
+ - target_room: 36
+ entrance: 66
+ teleporter: [93, 3]
+ access: []
+- name: Bone Dungeon B2 - Quake Room
+ id: 34
+ game_objects:
+ - name: "Bone Dungeon B2 - Penultimate Room Chest"
+ object_id: 0x07
+ type: "Chest"
+ access: []
+ links:
+ - target_room: 37
+ entrance: 67
+ teleporter: [94, 3]
+ access: []
+- name: Bone Dungeon B2 - Two Skulls Room - First Room
+ id: 35
+ game_objects:
+ - name: "Bone Dungeon B2 - Two Skulls Room Box"
+ object_id: 0x3C
+ type: "Box"
+ access: []
+ - name: "Skull 1"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Skull1Bombed"]
+ access: ["Bomb"]
+ links:
+ - target_room: 32
+ entrance: 71
+ teleporter: [92, 3]
+ access: []
+ - target_room: 36
+ access: ["Skull1Bombed"]
+- name: Bone Dungeon B2 - Two Skulls Room - Second Room
+ id: 36
+ game_objects:
+ - name: "Skull 2"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Skull2Bombed"]
+ access: ["Bomb"]
+ links:
+ - target_room: 33
+ entrance: 68
+ teleporter: [7, 2]
+ access: []
+ - target_room: 37
+ access: ["Skull2Bombed"]
+ - target_room: 35
+ access: ["Skull1Bombed"]
+- name: Bone Dungeon B2 - Two Skulls Room - Third Room
+ id: 37
+ game_objects: []
+ links:
+ - target_room: 34
+ entrance: 69
+ teleporter: [8, 2]
+ access: []
+ - target_room: 38
+ entrance: 70
+ teleporter: [9, 2]
+ access: ["Bomb"]
+ - target_room: 36
+ access: ["Skull2Bombed"]
+- name: Bone Dungeon B2 - Boss Room
+ id: 38
+ game_objects:
+ - name: "Bone Dungeon B2 - North Box"
+ object_id: 0x3E
+ type: "Box"
+ access: []
+ - name: "Bone Dungeon B2 - South Box"
+ object_id: 0x3F
+ type: "Box"
+ access: []
+ - name: "Bone Dungeon B2 - Flamerus Rex Chest"
+ object_id: 0x08
+ type: "Chest"
+ access: []
+ - name: "Bone Dungeon B2 - Tristam's Treasure Chest"
+ object_id: 0x04
+ type: "Chest"
+ access: []
+ - name: "Flamerus Rex"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["FlamerusRex"]
+ access: []
+ links:
+ - target_room: 37
+ entrance: 74
+ teleporter: [95, 3]
+ access: []
+- name: Libra Temple
+ id: 39
+ game_objects:
+ - name: "Libra Temple - Box"
+ object_id: 0x40
+ type: "Box"
+ access: []
+ - name: "Phoebe"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Phoebe1"]
+ access: []
+ links:
+ - target_room: 221
+ entrance: 75
+ teleporter: [13, 6]
+ access: []
+ - target_room: 51
+ entrance: 76
+ teleporter: [59, 8]
+ access: ["LibraCrest"]
+- name: Aquaria
+ id: 40
+ game_objects:
+ - name: "Summer Aquaria"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["SummerAquaria"]
+ access: ["WakeWater"]
+ links:
+ - target_room: 221
+ entrance: 77
+ teleporter: [8, 6]
+ access: []
+ - target_room: 41
+ entrance: 81
+ teleporter: [10, 5]
+ access: []
+ - target_room: 42
+ entrance: 82
+ teleporter: [44, 4]
+ access: []
+ - target_room: 44
+ entrance: 83
+ teleporter: [11, 5]
+ access: []
+ - target_room: 71
+ entrance: 89
+ teleporter: [42, 0]
+ access: ["SummerAquaria"]
+ - target_room: 71
+ entrance: 90
+ teleporter: [43, 0]
+ access: ["SummerAquaria"]
+- name: Phoebe's House
+ id: 41
+ game_objects:
+ - name: "Aquaria - Phoebe's House Chest"
+ object_id: 0x41
+ type: "Box"
+ access: []
+ links:
+ - target_room: 40
+ entrance: 93
+ teleporter: [5, 8]
+ access: []
+- name: Aquaria Vendor House
+ id: 42
+ game_objects:
+ - name: "Aquaria - Vendor"
+ object_id: 4
+ type: "NPC"
+ access: []
+ - name: "Aquaria - Vendor House Box"
+ object_id: 0x42
+ type: "Box"
+ access: []
+ links:
+ - target_room: 40
+ entrance: 94
+ teleporter: [40, 8]
+ access: []
+ - target_room: 43
+ entrance: 95
+ teleporter: [47, 0]
+ access: []
+- name: Aquaria Gemini Room
+ id: 43
+ game_objects: []
+ links:
+ - target_room: 42
+ entrance: 97
+ teleporter: [48, 0]
+ access: []
+ - target_room: 81
+ entrance: 96
+ teleporter: [72, 8]
+ access: ["GeminiCrest"]
+- name: Aquaria INN
+ id: 44
+ game_objects: []
+ links:
+ - target_room: 40
+ entrance: 98
+ teleporter: [75, 8]
+ access: []
+- name: Wintry Cave 1F - East Ledge
+ id: 45
+ game_objects:
+ - name: "Wintry Cave 1F - North Box"
+ object_id: 0x43
+ type: "Box"
+ access: []
+ - name: "Wintry Cave 1F - Entrance Box"
+ object_id: 0x46
+ type: "Box"
+ access: []
+ - name: "Wintry Cave 1F - Slippery Cliff Box"
+ object_id: 0x44
+ type: "Box"
+ access: ["Claw"]
+ - name: "Wintry Cave 1F - Phoebe"
+ object_id: 5
+ type: "NPC"
+ access: ["Phoebe1"]
+ links:
+ - target_room: 221
+ entrance: 99
+ teleporter: [49, 0]
+ access: []
+ - target_room: 49
+ entrance: 100
+ teleporter: [14, 2]
+ access: ["Bomb"]
+ - target_room: 46
+ access: ["Claw"]
+- name: Wintry Cave 1F - Central Space
+ id: 46
+ game_objects:
+ - name: "Wintry Cave 1F - Scenic Overlook Box"
+ object_id: 0x45
+ type: "Box"
+ access: ["Claw"]
+ links:
+ - target_room: 45
+ access: ["Claw"]
+ - target_room: 47
+ access: ["Claw"]
+- name: Wintry Cave 1F - West Ledge
+ id: 47
+ game_objects: []
+ links:
+ - target_room: 48
+ entrance: 101
+ teleporter: [15, 2]
+ access: ["Bomb"]
+ - target_room: 46
+ access: ["Claw"]
+- name: Wintry Cave 2F
+ id: 48
+ game_objects:
+ - name: "Wintry Cave 2F - West Left Box"
+ object_id: 0x47
+ type: "Box"
+ access: []
+ - name: "Wintry Cave 2F - West Right Box"
+ object_id: 0x48
+ type: "Box"
+ access: []
+ - name: "Wintry Cave 2F - East Left Box"
+ object_id: 0x49
+ type: "Box"
+ access: []
+ - name: "Wintry Cave 2F - East Right Box"
+ object_id: 0x4A
+ type: "Box"
+ access: []
+ links:
+ - target_room: 47
+ entrance: 104
+ teleporter: [97, 3]
+ access: []
+ - target_room: 50
+ entrance: 103
+ teleporter: [50, 0]
+ access: []
+- name: Wintry Cave 3F Top
+ id: 49
+ game_objects:
+ - name: "Wintry Cave 3F - West Box"
+ object_id: 0x4B
+ type: "Box"
+ access: []
+ - name: "Wintry Cave 3F - East Box"
+ object_id: 0x4C
+ type: "Box"
+ access: []
+ links:
+ - target_room: 45
+ entrance: 105
+ teleporter: [96, 3]
+ access: []
+- name: Wintry Cave 3F Bottom
+ id: 50
+ game_objects:
+ - name: "Wintry Cave 3F - Squidite Chest"
+ object_id: 0x09
+ type: "Chest"
+ access: ["Phanquid"]
+ - name: "Phanquid"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Phanquid"]
+ access: []
+ - name: "Wintry Cave 3F - Before Boss Box"
+ object_id: 0x4D
+ type: "Box"
+ access: []
+ links:
+ - target_room: 48
+ entrance: 106
+ teleporter: [51, 0]
+ access: []
+- name: Life Temple
+ id: 51
+ game_objects:
+ - name: "Life Temple - Box"
+ object_id: 0x4E
+ type: "Box"
+ access: []
+ - name: "Life Temple - Mysterious Man"
+ object_id: 6
+ type: "NPC"
+ access: []
+ links:
+ - target_room: 222
+ entrance: 107
+ teleporter: [14, 6]
+ access: []
+ - target_room: 39
+ entrance: 108
+ teleporter: [60, 8]
+ access: ["LibraCrest"]
+- name: Fall Basin
+ id: 52
+ game_objects:
+ - name: "Falls Basin - Snow Crab Chest"
+ object_id: 0x0A
+ type: "Chest"
+ access: ["FreezerCrab"]
+ - name: "Freezer Crab"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["FreezerCrab"]
+ access: []
+ - name: "Falls Basin - Box"
+ object_id: 0x4F
+ type: "Box"
+ access: []
+ links:
+ - target_room: 221
+ entrance: 111
+ teleporter: [53, 0]
+ access: []
+- name: Ice Pyramid B1 Taunt Room
+ id: 53
+ game_objects:
+ - name: "Ice Pyramid B1 - Chest"
+ object_id: 0x0B
+ type: "Chest"
+ access: []
+ - name: "Ice Pyramid B1 - West Box"
+ object_id: 0x50
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid B1 - North Box"
+ object_id: 0x51
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid B1 - East Box"
+ object_id: 0x52
+ type: "Box"
+ access: []
+ links:
+ - target_room: 68
+ entrance: 113
+ teleporter: [55, 0]
+ access: []
+- name: Ice Pyramid 1F Maze Lobby
+ id: 54
+ game_objects:
+ - name: "Ice Pyramid 1F Statue"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["IcePyramid1FStatue"]
+ access: ["Sword"]
+ links:
+ - target_room: 221
+ entrance: 114
+ teleporter: [56, 0]
+ access: []
+ - target_room: 55
+ access: ["IcePyramid1FStatue"]
+- name: Ice Pyramid 1F Maze
+ id: 55
+ game_objects:
+ - name: "Ice Pyramid 1F - East Alcove Chest"
+ object_id: 0x0D
+ type: "Chest"
+ access: []
+ - name: "Ice Pyramid 1F - Sandwiched Alcove Box"
+ object_id: 0x53
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 1F - Southwest Left Box"
+ object_id: 0x54
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 1F - Southwest Right Box"
+ object_id: 0x55
+ type: "Box"
+ access: []
+ links:
+ - target_room: 56
+ entrance: 116
+ teleporter: [57, 0]
+ access: []
+ - target_room: 57
+ entrance: 117
+ teleporter: [58, 0]
+ access: []
+ - target_room: 58
+ entrance: 118
+ teleporter: [59, 0]
+ access: []
+ - target_room: 59
+ entrance: 119
+ teleporter: [60, 0]
+ access: []
+ - target_room: 60
+ entrance: 120
+ teleporter: [61, 0]
+ access: []
+ - target_room: 54
+ access: ["IcePyramid1FStatue"]
+- name: Ice Pyramid 2F South Tiled Room
+ id: 56
+ game_objects:
+ - name: "Ice Pyramid 2F - South Side Glass Door Box"
+ object_id: 0x57
+ type: "Box"
+ access: ["Sword"]
+ - name: "Ice Pyramid 2F - South Side East Box"
+ object_id: 0x5B
+ type: "Box"
+ access: []
+ links:
+ - target_room: 55
+ entrance: 122
+ teleporter: [62, 0]
+ access: []
+ - target_room: 61
+ entrance: 123
+ teleporter: [67, 0]
+ access: []
+- name: Ice Pyramid 2F West Room
+ id: 57
+ game_objects:
+ - name: "Ice Pyramid 2F - Northwest Room Box"
+ object_id: 0x5A
+ type: "Box"
+ access: []
+ links:
+ - target_room: 55
+ entrance: 124
+ teleporter: [63, 0]
+ access: []
+- name: Ice Pyramid 2F Center Room
+ id: 58
+ game_objects:
+ - name: "Ice Pyramid 2F - Center Room Box"
+ object_id: 0x56
+ type: "Box"
+ access: []
+ links:
+ - target_room: 55
+ entrance: 125
+ teleporter: [64, 0]
+ access: []
+- name: Ice Pyramid 2F Small North Room
+ id: 59
+ game_objects:
+ - name: "Ice Pyramid 2F - North Room Glass Door Box"
+ object_id: 0x58
+ type: "Box"
+ access: ["Sword"]
+ links:
+ - target_room: 55
+ entrance: 126
+ teleporter: [65, 0]
+ access: []
+- name: Ice Pyramid 2F North Corridor
+ id: 60
+ game_objects:
+ - name: "Ice Pyramid 2F - North Corridor Glass Door Box"
+ object_id: 0x59
+ type: "Box"
+ access: ["Sword"]
+ links:
+ - target_room: 55
+ entrance: 127
+ teleporter: [66, 0]
+ access: []
+ - target_room: 62
+ entrance: 128
+ teleporter: [68, 0]
+ access: []
+- name: Ice Pyramid 3F Two Boxes Room
+ id: 61
+ game_objects:
+ - name: "Ice Pyramid 3F - Staircase Dead End Left Box"
+ object_id: 0x5E
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 3F - Staircase Dead End Right Box"
+ object_id: 0x5F
+ type: "Box"
+ access: []
+ links:
+ - target_room: 56
+ entrance: 129
+ teleporter: [69, 0]
+ access: []
+- name: Ice Pyramid 3F Main Loop
+ id: 62
+ game_objects:
+ - name: "Ice Pyramid 3F - Inner Room North Box"
+ object_id: 0x5C
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 3F - Inner Room South Box"
+ object_id: 0x5D
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 3F - East Alcove Box"
+ object_id: 0x60
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 3F - Leapfrog Box"
+ object_id: 0x61
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 3F Statue"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["IcePyramid3FStatue"]
+ access: ["Sword"]
+ links:
+ - target_room: 60
+ entrance: 130
+ teleporter: [70, 0]
+ access: []
+ - target_room: 63
+ access: ["IcePyramid3FStatue"]
+- name: Ice Pyramid 3F Blocked Room
+ id: 63
+ game_objects: []
+ links:
+ - target_room: 64
+ entrance: 131
+ teleporter: [71, 0]
+ access: []
+ - target_room: 62
+ access: ["IcePyramid3FStatue"]
+- name: Ice Pyramid 4F Main Loop
+ id: 64
+ game_objects: []
+ links:
+ - target_room: 66
+ entrance: 133
+ teleporter: [73, 0]
+ access: []
+ - target_room: 63
+ entrance: 132
+ teleporter: [72, 0]
+ access: []
+ - target_room: 65
+ access: ["IcePyramid4FStatue"]
+- name: Ice Pyramid 4F Treasure Room
+ id: 65
+ game_objects:
+ - name: "Ice Pyramid 4F - Chest"
+ object_id: 0x0C
+ type: "Chest"
+ access: []
+ - name: "Ice Pyramid 4F - Northwest Box"
+ object_id: 0x62
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 4F - West Left Box"
+ object_id: 0x63
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 4F - West Right Box"
+ object_id: 0x64
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 4F - South Left Box"
+ object_id: 0x65
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 4F - South Right Box"
+ object_id: 0x66
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 4F - East Left Box"
+ object_id: 0x67
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 4F - East Right Box"
+ object_id: 0x68
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 4F Statue"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["IcePyramid4FStatue"]
+ access: ["Sword"]
+ links:
+ - target_room: 64
+ access: ["IcePyramid4FStatue"]
+- name: Ice Pyramid 5F Leap of Faith Room
+ id: 66
+ game_objects:
+ - name: "Ice Pyramid 5F - Glass Door Left Box"
+ object_id: 0x69
+ type: "Box"
+ access: ["IcePyramid5FStatue"]
+ - name: "Ice Pyramid 5F - West Ledge Box"
+ object_id: 0x6A
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 5F - South Shelf Box"
+ object_id: 0x6B
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 5F - South Leapfrog Box"
+ object_id: 0x6C
+ type: "Box"
+ access: []
+ - name: "Ice Pyramid 5F - Glass Door Right Box"
+ object_id: 0x6D
+ type: "Box"
+ access: ["IcePyramid5FStatue"]
+ - name: "Ice Pyramid 5F - North Box"
+ object_id: 0x6E
+ type: "Box"
+ access: []
+ links:
+ - target_room: 64
+ entrance: 134
+ teleporter: [74, 0]
+ access: []
+ - target_room: 65
+ access: []
+ - target_room: 53
+ access: ["Bomb", "Claw", "Sword"]
+- name: Ice Pyramid 5F Stairs to Ice Golem
+ id: 67
+ game_objects:
+ - name: "Ice Pyramid 5F Statue"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["IcePyramid5FStatue"]
+ access: ["Sword"]
+ links:
+ - target_room: 69
+ entrance: 137
+ teleporter: [76, 0]
+ access: []
+ - target_room: 65
+ access: []
+ - target_room: 70
+ entrance: 136
+ teleporter: [75, 0]
+ access: []
+- name: Ice Pyramid Climbing Wall Room Lower Space
+ id: 68
+ game_objects: []
+ links:
+ - target_room: 53
+ entrance: 139
+ teleporter: [78, 0]
+ access: []
+ - target_room: 69
+ access: ["Claw"]
+- name: Ice Pyramid Climbing Wall Room Upper Space
+ id: 69
+ game_objects: []
+ links:
+ - target_room: 67
+ entrance: 140
+ teleporter: [79, 0]
+ access: []
+ - target_room: 68
+ access: ["Claw"]
+- name: Ice Pyramid Ice Golem Room
+ id: 70
+ game_objects:
+ - name: "Ice Pyramid 6F - Ice Golem Chest"
+ object_id: 0x0E
+ type: "Chest"
+ access: ["IceGolem"]
+ - name: "Ice Golem"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["IceGolem"]
+ access: []
+ links:
+ - target_room: 67
+ entrance: 141
+ teleporter: [80, 0]
+ access: []
+ - target_room: 66
+ access: []
+- name: Spencer Waterfall
+ id: 71
+ game_objects: []
+ links:
+ - target_room: 72
+ entrance: 143
+ teleporter: [81, 0]
+ access: []
+ - target_room: 40
+ entrance: 145
+ teleporter: [82, 0]
+ access: []
+ - target_room: 40
+ entrance: 148
+ teleporter: [83, 0]
+ access: []
+- name: Spencer Cave Normal Main
+ id: 72
+ game_objects:
+ - name: "Spencer's Cave - Box"
+ object_id: 0x6F
+ type: "Box"
+ access: ["Claw"]
+ - name: "Spencer's Cave - Spencer"
+ object_id: 8
+ type: "NPC"
+ access: []
+ - name: "Spencer's Cave - Locked Chest"
+ object_id: 13
+ type: "NPC"
+ access: ["VenusKey"]
+ links:
+ - target_room: 71
+ entrance: 150
+ teleporter: [85, 0]
+ access: []
+- name: Spencer Cave Normal South Ledge
+ id: 73
+ game_objects:
+ - name: "Collapse Spencer's Cave"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["ShipLiberated"]
+ access: ["MegaGrenade"]
+ links:
+ - target_room: 227
+ entrance: 151
+ teleporter: [7, 6]
+ access: []
+ - target_room: 203
+ access: ["MegaGrenade"]
+# - target_room: 72 # access to spencer?
+# access: ["MegaGrenade"]
+- name: Spencer Cave Caved In Main Loop
+ id: 203
+ game_objects: []
+ links:
+ - target_room: 73
+ access: []
+ - target_room: 207
+ entrance: 156
+ teleporter: [36, 8]
+ access: ["MobiusCrest"]
+ - target_room: 204
+ access: ["Claw"]
+ - target_room: 205
+ access: ["Bomb"]
+- name: Spencer Cave Caved In Waters
+ id: 204
+ game_objects:
+ - name: "Bomb Libra Block"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["SpencerCaveLibraBlockBombed"]
+ access: ["MegaGrenade", "Claw"]
+ links:
+ - target_room: 203
+ access: ["Claw"]
+- name: Spencer Cave Caved In Libra Nook
+ id: 205
+ game_objects: []
+ links:
+ - target_room: 206
+ entrance: 153
+ teleporter: [33, 8]
+ access: ["LibraCrest"]
+- name: Spencer Cave Caved In Libra Corridor
+ id: 206
+ game_objects: []
+ links:
+ - target_room: 205
+ entrance: 154
+ teleporter: [34, 8]
+ access: ["LibraCrest"]
+ - target_room: 207
+ access: ["SpencerCaveLibraBlockBombed"]
+- name: Spencer Cave Caved In Mobius Chest
+ id: 207
+ game_objects:
+ - name: "Spencer's Cave - Mobius Chest"
+ object_id: 0x0F
+ type: "Chest"
+ access: []
+ links:
+ - target_room: 203
+ entrance: 155
+ teleporter: [35, 8]
+ access: ["MobiusCrest"]
+ - target_room: 206
+ access: ["Bomb"]
+- name: Wintry Temple Outer Room
+ id: 74
+ game_objects: []
+ links:
+ - target_room: 223
+ entrance: 157
+ teleporter: [15, 6]
+ access: []
+- name: Wintry Temple Inner Room
+ id: 75
+ game_objects:
+ - name: "Wintry Temple - West Box"
+ object_id: 0x70
+ type: "Box"
+ access: []
+ - name: "Wintry Temple - North Box"
+ object_id: 0x71
+ type: "Box"
+ access: []
+ links:
+ - target_room: 92
+ entrance: 158
+ teleporter: [62, 8]
+ access: ["GeminiCrest"]
+- name: Fireburg Upper Plaza
+ id: 76
+ game_objects: []
+ links:
+ - target_room: 224
+ entrance: 159
+ teleporter: [9, 6]
+ access: []
+ - target_room: 80
+ entrance: 163
+ teleporter: [91, 0]
+ access: []
+ - target_room: 77
+ entrance: 164
+ teleporter: [16, 2]
+ access: []
+ - target_room: 82
+ entrance: 165
+ teleporter: [17, 2]
+ access: []
+ - target_room: 208
+ access: ["Claw"]
+- name: Fireburg Lower Plaza
+ id: 208
+ game_objects:
+ - name: "Fireburg - Hidden Tunnel Box"
+ object_id: 0x74
+ type: "Box"
+ access: []
+ links:
+ - target_room: 76
+ access: ["Claw"]
+ - target_room: 78
+ entrance: 166
+ teleporter: [11, 8]
+ access: ["MultiKey"]
+- name: Reuben's House
+ id: 77
+ game_objects:
+ - name: "Fireburg - Reuben's House Arion"
+ object_id: 14
+ type: "NPC"
+ access: ["ReubenDadSaved"]
+ - name: "Reuben"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Reuben1"]
+ access: []
+ - name: "Fireburg - Reuben's House Box"
+ object_id: 0x75
+ type: "Box"
+ access: []
+ links:
+ - target_room: 76
+ entrance: 167
+ teleporter: [98, 3]
+ access: []
+- name: GrenadeMan's House
+ id: 78
+ game_objects:
+ - name: "Fireburg - Locked House Man"
+ object_id: 12
+ type: "NPC"
+ access: []
+ links:
+ - target_room: 208
+ entrance: 168
+ teleporter: [9, 8]
+ access: ["MultiKey"]
+ - target_room: 79
+ entrance: 169
+ teleporter: [93, 0]
+ access: []
+- name: GrenadeMan's Mobius Room
+ id: 79
+ game_objects: []
+ links:
+ - target_room: 78
+ entrance: 170
+ teleporter: [94, 0]
+ access: []
+ - target_room: 161
+ entrance: 171
+ teleporter: [54, 8]
+ access: ["MobiusCrest"]
+- name: Fireburg Vendor House
+ id: 80
+ game_objects:
+ - name: "Fireburg - Vendor"
+ object_id: 11
+ type: "NPC"
+ access: []
+ links:
+ - target_room: 76
+ entrance: 172
+ teleporter: [95, 0]
+ access: []
+ - target_room: 81
+ entrance: 173
+ teleporter: [96, 0]
+ access: []
+- name: Fireburg Gemini Room
+ id: 81
+ game_objects: []
+ links:
+ - target_room: 80
+ entrance: 174
+ teleporter: [97, 0]
+ access: []
+ - target_room: 43
+ entrance: 175
+ teleporter: [45, 8]
+ access: ["GeminiCrest"]
+- name: Fireburg Hotel Lobby
+ id: 82
+ game_objects:
+ - name: "Fireburg - Tristam"
+ object_id: 10
+ type: "NPC"
+ access: []
+ - name: "Tristam Fireburg"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Tristam"]
+ access: []
+ links:
+ - target_room: 76
+ entrance: 177
+ teleporter: [99, 3]
+ access: []
+ - target_room: 83
+ entrance: 176
+ teleporter: [213, 0]
+ access: []
+- name: Fireburg Hotel Beds
+ id: 83
+ game_objects: []
+ links:
+ - target_room: 82
+ entrance: 178
+ teleporter: [214, 0]
+ access: []
+- name: Mine Exterior North West Platforms
+ id: 84
+ game_objects: []
+ links:
+ - target_room: 224
+ entrance: 179
+ teleporter: [98, 0]
+ access: []
+ - target_room: 88
+ entrance: 181
+ teleporter: [20, 2]
+ access: ["Bomb"]
+ - target_room: 85
+ access: ["Claw"]
+ - target_room: 86
+ access: ["Claw"]
+ - target_room: 87
+ access: ["Claw"]
+- name: Mine Exterior Central Ledge
+ id: 85
+ game_objects: []
+ links:
+ - target_room: 90
+ entrance: 183
+ teleporter: [22, 2]
+ access: ["Bomb"]
+ - target_room: 84
+ access: ["Claw"]
+- name: Mine Exterior North Ledge
+ id: 86
+ game_objects: []
+ links:
+ - target_room: 89
+ entrance: 182
+ teleporter: [21, 2]
+ access: ["Bomb"]
+ - target_room: 85
+ access: ["Claw"]
+- name: Mine Exterior South East Platforms
+ id: 87
+ game_objects:
+ - name: "Jinn"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Jinn"]
+ access: []
+ links:
+ - target_room: 91
+ entrance: 180
+ teleporter: [99, 0]
+ access: ["Jinn"]
+ - target_room: 86
+ access: []
+ - target_room: 85
+ access: ["Claw"]
+- name: Mine Parallel Room
+ id: 88
+ game_objects:
+ - name: "Mine - Parallel Room West Box"
+ object_id: 0x77
+ type: "Box"
+ access: ["Claw"]
+ - name: "Mine - Parallel Room East Box"
+ object_id: 0x78
+ type: "Box"
+ access: ["Claw"]
+ links:
+ - target_room: 84
+ entrance: 185
+ teleporter: [100, 3]
+ access: []
+- name: Mine Crescent Room
+ id: 89
+ game_objects:
+ - name: "Mine - Crescent Room Chest"
+ object_id: 0x10
+ type: "Chest"
+ access: []
+ links:
+ - target_room: 86
+ entrance: 186
+ teleporter: [101, 3]
+ access: []
+- name: Mine Climbing Room
+ id: 90
+ game_objects:
+ - name: "Mine - Glitchy Collision Cave Box"
+ object_id: 0x76
+ type: "Box"
+ access: ["Claw"]
+ links:
+ - target_room: 85
+ entrance: 187
+ teleporter: [102, 3]
+ access: []
+- name: Mine Cliff
+ id: 91
+ game_objects:
+ - name: "Mine - Cliff Southwest Box"
+ object_id: 0x79
+ type: "Box"
+ access: []
+ - name: "Mine - Cliff Northwest Box"
+ object_id: 0x7A
+ type: "Box"
+ access: []
+ - name: "Mine - Cliff Northeast Box"
+ object_id: 0x7B
+ type: "Box"
+ access: []
+ - name: "Mine - Cliff Southeast Box"
+ object_id: 0x7C
+ type: "Box"
+ access: []
+ - name: "Mine - Reuben"
+ object_id: 7
+ type: "NPC"
+ access: ["Reuben1"]
+ - name: "Reuben's dad Saved"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["ReubenDadSaved"]
+ access: ["MegaGrenade"]
+ links:
+ - target_room: 87
+ entrance: 188
+ teleporter: [100, 0]
+ access: []
+- name: Sealed Temple
+ id: 92
+ game_objects:
+ - name: "Sealed Temple - West Box"
+ object_id: 0x7D
+ type: "Box"
+ access: []
+ - name: "Sealed Temple - East Box"
+ object_id: 0x7E
+ type: "Box"
+ access: []
+ links:
+ - target_room: 224
+ entrance: 190
+ teleporter: [16, 6]
+ access: []
+ - target_room: 75
+ entrance: 191
+ teleporter: [63, 8]
+ access: ["GeminiCrest"]
+- name: Volcano Base
+ id: 93
+ game_objects:
+ - name: "Volcano - Base Chest"
+ object_id: 0x11
+ type: "Chest"
+ access: []
+ - name: "Volcano - Base West Box"
+ object_id: 0x7F
+ type: "Box"
+ access: []
+ - name: "Volcano - Base East Left Box"
+ object_id: 0x80
+ type: "Box"
+ access: []
+ - name: "Volcano - Base East Right Box"
+ object_id: 0x81
+ type: "Box"
+ access: []
+ links:
+ - target_room: 224
+ entrance: 192
+ teleporter: [103, 0]
+ access: []
+ - target_room: 98
+ entrance: 196
+ teleporter: [31, 8]
+ access: []
+ - target_room: 96
+ entrance: 197
+ teleporter: [30, 8]
+ access: []
+- name: Volcano Top Left
+ id: 94
+ game_objects:
+ - name: "Volcano - Medusa Chest"
+ object_id: 0x12
+ type: "Chest"
+ access: ["Medusa"]
+ - name: "Medusa"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Medusa"]
+ access: []
+ - name: "Volcano - Behind Medusa Box"
+ object_id: 0x82
+ type: "Box"
+ access: []
+ links:
+ - target_room: 209
+ entrance: 199
+ teleporter: [26, 8]
+ access: []
+- name: Volcano Top Right
+ id: 95
+ game_objects:
+ - name: "Volcano - Top of the Volcano Left Box"
+ object_id: 0x83
+ type: "Box"
+ access: []
+ - name: "Volcano - Top of the Volcano Right Box"
+ object_id: 0x84
+ type: "Box"
+ access: []
+ links:
+ - target_room: 99
+ entrance: 200
+ teleporter: [79, 8]
+ access: []
+- name: Volcano Right Path
+ id: 96
+ game_objects:
+ - name: "Volcano - Right Path Box"
+ object_id: 0x87
+ type: "Box"
+ access: []
+ links:
+ - target_room: 93
+ entrance: 201
+ teleporter: [15, 8]
+ access: []
+- name: Volcano Left Path
+ id: 98
+ game_objects:
+ - name: "Volcano - Left Path Box"
+ object_id: 0x86
+ type: "Box"
+ access: []
+ links:
+ - target_room: 93
+ entrance: 204
+ teleporter: [27, 8]
+ access: []
+ - target_room: 99
+ entrance: 202
+ teleporter: [25, 2]
+ access: []
+ - target_room: 209
+ entrance: 203
+ teleporter: [26, 2]
+ access: []
+- name: Volcano Cross Left-Right
+ id: 99
+ game_objects: []
+ links:
+ - target_room: 95
+ entrance: 206
+ teleporter: [29, 8]
+ access: []
+ - target_room: 98
+ entrance: 205
+ teleporter: [103, 3]
+ access: []
+- name: Volcano Cross Right-Left
+ id: 209
+ game_objects:
+ - name: "Volcano - Crossover Section Box"
+ object_id: 0x85
+ type: "Box"
+ access: []
+ links:
+ - target_room: 98
+ entrance: 208
+ teleporter: [104, 3]
+ access: []
+ - target_room: 94
+ entrance: 207
+ teleporter: [28, 8]
+ access: []
+- name: Lava Dome Inner Ring Main Loop
+ id: 100
+ game_objects:
+ - name: "Lava Dome - Exterior Caldera Near Switch Cliff Box"
+ object_id: 0x88
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Exterior South Cliff Box"
+ object_id: 0x89
+ type: "Box"
+ access: []
+ links:
+ - target_room: 224
+ entrance: 209
+ teleporter: [104, 0]
+ access: []
+ - target_room: 113
+ entrance: 211
+ teleporter: [105, 0]
+ access: []
+ - target_room: 114
+ entrance: 212
+ teleporter: [106, 0]
+ access: []
+ - target_room: 116
+ entrance: 213
+ teleporter: [108, 0]
+ access: []
+ - target_room: 118
+ entrance: 214
+ teleporter: [111, 0]
+ access: []
+- name: Lava Dome Inner Ring Center Ledge
+ id: 101
+ game_objects:
+ - name: "Lava Dome - Exterior Center Dropoff Ledge Box"
+ object_id: 0x8A
+ type: "Box"
+ access: []
+ links:
+ - target_room: 115
+ entrance: 215
+ teleporter: [107, 0]
+ access: []
+ - target_room: 100
+ access: ["Claw"]
+- name: Lava Dome Inner Ring Plate Ledge
+ id: 102
+ game_objects:
+ - name: "Lava Dome Plate"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["LavaDomePlate"]
+ access: []
+ links:
+ - target_room: 119
+ entrance: 216
+ teleporter: [109, 0]
+ access: []
+- name: Lava Dome Inner Ring Upper Ledge West
+ id: 103
+ game_objects: []
+ links:
+ - target_room: 111
+ entrance: 219
+ teleporter: [112, 0]
+ access: []
+ - target_room: 108
+ entrance: 220
+ teleporter: [113, 0]
+ access: []
+ - target_room: 104
+ access: ["Claw"]
+ - target_room: 100
+ access: ["Claw"]
+- name: Lava Dome Inner Ring Upper Ledge East
+ id: 104
+ game_objects: []
+ links:
+ - target_room: 110
+ entrance: 218
+ teleporter: [110, 0]
+ access: []
+ - target_room: 103
+ access: ["Claw"]
+- name: Lava Dome Inner Ring Big Door Ledge
+ id: 105
+ game_objects: []
+ links:
+ - target_room: 107
+ entrance: 221
+ teleporter: [114, 0]
+ access: []
+ - target_room: 121
+ entrance: 222
+ teleporter: [29, 2]
+ access: ["LavaDomePlate"]
+- name: Lava Dome Inner Ring Tiny Bottom Ledge
+ id: 106
+ game_objects:
+ - name: "Lava Dome - Exterior Dead End Caldera Box"
+ object_id: 0x8B
+ type: "Box"
+ access: []
+ links:
+ - target_room: 120
+ entrance: 226
+ teleporter: [115, 0]
+ access: []
+- name: Lava Dome Jump Maze II
+ id: 107
+ game_objects:
+ - name: "Lava Dome - Gold Maze Northwest Box"
+ object_id: 0x8C
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Gold Maze Southwest Box"
+ object_id: 0xF6
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Gold Maze Northeast Box"
+ object_id: 0xF7
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Gold Maze North Box"
+ object_id: 0xF8
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Gold Maze Center Box"
+ object_id: 0xF9
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Gold Maze Southeast Box"
+ object_id: 0xFA
+ type: "Box"
+ access: []
+ links:
+ - target_room: 105
+ entrance: 227
+ teleporter: [116, 0]
+ access: []
+ - target_room: 108
+ entrance: 228
+ teleporter: [119, 0]
+ access: []
+ - target_room: 120
+ entrance: 229
+ teleporter: [120, 0]
+ access: []
+- name: Lava Dome Up-Down Corridor
+ id: 108
+ game_objects: []
+ links:
+ - target_room: 107
+ entrance: 231
+ teleporter: [118, 0]
+ access: []
+ - target_room: 103
+ entrance: 230
+ teleporter: [117, 0]
+ access: []
+- name: Lava Dome Jump Maze I
+ id: 109
+ game_objects:
+ - name: "Lava Dome - Bare Maze Leapfrog Alcove North Box"
+ object_id: 0x8D
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Bare Maze Leapfrog Alcove South Box"
+ object_id: 0x8E
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Bare Maze Center Box"
+ object_id: 0x8F
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Bare Maze Southwest Box"
+ object_id: 0x90
+ type: "Box"
+ access: []
+ links:
+ - target_room: 118
+ entrance: 232
+ teleporter: [121, 0]
+ access: []
+ - target_room: 111
+ entrance: 233
+ teleporter: [122, 0]
+ access: []
+- name: Lava Dome Pointless Room
+ id: 110
+ game_objects: []
+ links:
+ - target_room: 104
+ entrance: 234
+ teleporter: [123, 0]
+ access: []
+- name: Lava Dome Lower Moon Helm Room
+ id: 111
+ game_objects:
+ - name: "Lava Dome - U-Bend Room North Box"
+ object_id: 0x92
+ type: "Box"
+ access: []
+ - name: "Lava Dome - U-Bend Room South Box"
+ object_id: 0x93
+ type: "Box"
+ access: []
+ links:
+ - target_room: 103
+ entrance: 235
+ teleporter: [124, 0]
+ access: []
+ - target_room: 109
+ entrance: 236
+ teleporter: [125, 0]
+ access: []
+- name: Lava Dome Moon Helm Room
+ id: 112
+ game_objects:
+ - name: "Lava Dome - Beyond River Room Chest"
+ object_id: 0x13
+ type: "Chest"
+ access: []
+ - name: "Lava Dome - Beyond River Room Box"
+ object_id: 0x91
+ type: "Box"
+ access: []
+ links:
+ - target_room: 117
+ entrance: 237
+ teleporter: [126, 0]
+ access: []
+- name: Lava Dome Three Jumps Room
+ id: 113
+ game_objects:
+ - name: "Lava Dome - Three Jumps Room Box"
+ object_id: 0x96
+ type: "Box"
+ access: []
+ links:
+ - target_room: 100
+ entrance: 238
+ teleporter: [127, 0]
+ access: []
+- name: Lava Dome Life Chest Room Lower Ledge
+ id: 114
+ game_objects:
+ - name: "Lava Dome - Gold Bar Room Boulder Chest"
+ object_id: 0x1C
+ type: "Chest"
+ access: ["MegaGrenade"]
+ links:
+ - target_room: 100
+ entrance: 239
+ teleporter: [128, 0]
+ access: []
+ - target_room: 115
+ access: ["Claw"]
+- name: Lava Dome Life Chest Room Upper Ledge
+ id: 115
+ game_objects:
+ - name: "Lava Dome - Gold Bar Room Leapfrog Alcove Box West"
+ object_id: 0x94
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Gold Bar Room Leapfrog Alcove Box East"
+ object_id: 0x95
+ type: "Box"
+ access: []
+ links:
+ - target_room: 101
+ entrance: 240
+ teleporter: [129, 0]
+ access: []
+ - target_room: 114
+ access: ["Claw"]
+- name: Lava Dome Big Jump Room Main Area
+ id: 116
+ game_objects:
+ - name: "Lava Dome - Lava River Room North Box"
+ object_id: 0x98
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Lava River Room East Box"
+ object_id: 0x99
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Lava River Room South Box"
+ object_id: 0x9A
+ type: "Box"
+ access: []
+ links:
+ - target_room: 100
+ entrance: 241
+ teleporter: [133, 0]
+ access: []
+ - target_room: 119
+ entrance: 243
+ teleporter: [132, 0]
+ access: []
+ - target_room: 117
+ access: ["MegaGrenade"]
+- name: Lava Dome Big Jump Room MegaGrenade Area
+ id: 117
+ game_objects: []
+ links:
+ - target_room: 112
+ entrance: 242
+ teleporter: [131, 0]
+ access: []
+ - target_room: 116
+ access: ["Bomb"]
+- name: Lava Dome Split Corridor
+ id: 118
+ game_objects:
+ - name: "Lava Dome - Split Corridor Box"
+ object_id: 0x97
+ type: "Box"
+ access: []
+ links:
+ - target_room: 109
+ entrance: 244
+ teleporter: [130, 0]
+ access: []
+ - target_room: 100
+ entrance: 245
+ teleporter: [134, 0]
+ access: []
+- name: Lava Dome Plate Corridor
+ id: 119
+ game_objects: []
+ links:
+ - target_room: 102
+ entrance: 246
+ teleporter: [135, 0]
+ access: []
+ - target_room: 116
+ entrance: 247
+ teleporter: [137, 0]
+ access: []
+- name: Lava Dome Four Boxes Stairs
+ id: 120
+ game_objects:
+ - name: "Lava Dome - Caldera Stairway West Left Box"
+ object_id: 0x9B
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Caldera Stairway West Right Box"
+ object_id: 0x9C
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Caldera Stairway East Left Box"
+ object_id: 0x9D
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Caldera Stairway East Right Box"
+ object_id: 0x9E
+ type: "Box"
+ access: []
+ links:
+ - target_room: 107
+ entrance: 248
+ teleporter: [136, 0]
+ access: []
+ - target_room: 106
+ entrance: 249
+ teleporter: [16, 0]
+ access: []
+- name: Lava Dome Hydra Room
+ id: 121
+ game_objects:
+ - name: "Lava Dome - Dualhead Hydra Chest"
+ object_id: 0x14
+ type: "Chest"
+ access: ["DualheadHydra"]
+ - name: "Dualhead Hydra"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["DualheadHydra"]
+ access: []
+ - name: "Lava Dome - Hydra Room Northwest Box"
+ object_id: 0x9F
+ type: "Box"
+ access: []
+ - name: "Lava Dome - Hydra Room Southweast Box"
+ object_id: 0xA0
+ type: "Box"
+ access: []
+ links:
+ - target_room: 105
+ entrance: 250
+ teleporter: [105, 3]
+ access: []
+ - target_room: 122
+ entrance: 251
+ teleporter: [138, 0]
+ access: ["DualheadHydra"]
+- name: Lava Dome Escape Corridor
+ id: 122
+ game_objects: []
+ links:
+ - target_room: 121
+ entrance: 253
+ teleporter: [139, 0]
+ access: []
+- name: Rope Bridge
+ id: 123
+ game_objects:
+ - name: "Rope Bridge - West Box"
+ object_id: 0xA3
+ type: "Box"
+ access: []
+ - name: "Rope Bridge - East Box"
+ object_id: 0xA4
+ type: "Box"
+ access: []
+ links:
+ - target_room: 226
+ entrance: 255
+ teleporter: [140, 0]
+ access: []
+- name: Alive Forest
+ id: 124
+ game_objects:
+ - name: "Alive Forest - Tree Stump Chest"
+ object_id: 0x15
+ type: "Chest"
+ access: ["Axe"]
+ - name: "Alive Forest - Near Entrance Box"
+ object_id: 0xA5
+ type: "Box"
+ access: ["Axe"]
+ - name: "Alive Forest - After Bridge Box"
+ object_id: 0xA6
+ type: "Box"
+ access: ["Axe"]
+ - name: "Alive Forest - Gemini Stump Box"
+ object_id: 0xA7
+ type: "Box"
+ access: ["Axe"]
+ links:
+ - target_room: 226
+ entrance: 272
+ teleporter: [142, 0]
+ access: ["Axe"]
+ - target_room: 21
+ entrance: 275
+ teleporter: [64, 8]
+ access: ["LibraCrest", "Axe"]
+ - target_room: 22
+ entrance: 276
+ teleporter: [65, 8]
+ access: ["GeminiCrest", "Axe"]
+ - target_room: 23
+ entrance: 277
+ teleporter: [66, 8]
+ access: ["MobiusCrest", "Axe"]
+ - target_room: 125
+ entrance: 274
+ teleporter: [143, 0]
+ access: ["Axe"]
+- name: Giant Tree 1F Main Area
+ id: 125
+ game_objects:
+ - name: "Giant Tree 1F - Northwest Box"
+ object_id: 0xA8
+ type: "Box"
+ access: []
+ - name: "Giant Tree 1F - Southwest Box"
+ object_id: 0xA9
+ type: "Box"
+ access: []
+ - name: "Giant Tree 1F - Center Box"
+ object_id: 0xAA
+ type: "Box"
+ access: []
+ - name: "Giant Tree 1F - East Box"
+ object_id: 0xAB
+ type: "Box"
+ access: []
+ links:
+ - target_room: 124
+ entrance: 278
+ teleporter: [56, 1] # [49, 8] script restored if no map shuffling
+ access: []
+ - target_room: 202
+ access: ["DragonClaw"]
+- name: Giant Tree 1F North Island
+ id: 202
+ game_objects: []
+ links:
+ - target_room: 127
+ entrance: 280
+ teleporter: [144, 0]
+ access: []
+ - target_room: 125
+ access: ["DragonClaw"]
+- name: Giant Tree 1F Central Island
+ id: 126
+ game_objects: []
+ links:
+ - target_room: 202
+ access: ["DragonClaw"]
+- name: Giant Tree 2F Main Lobby
+ id: 127
+ game_objects:
+ - name: "Giant Tree 2F - North Box"
+ object_id: 0xAC
+ type: "Box"
+ access: []
+ links:
+ - target_room: 126
+ access: ["DragonClaw"]
+ - target_room: 125
+ entrance: 281
+ teleporter: [145, 0]
+ access: []
+ - target_room: 133
+ entrance: 283
+ teleporter: [149, 0]
+ access: []
+ - target_room: 129
+ access: ["DragonClaw"]
+- name: Giant Tree 2F West Ledge
+ id: 128
+ game_objects:
+ - name: "Giant Tree 2F - Dropdown Ledge Box"
+ object_id: 0xAE
+ type: "Box"
+ access: []
+ links:
+ - target_room: 140
+ entrance: 284
+ teleporter: [147, 0]
+ access: ["Sword"]
+ - target_room: 130
+ access: ["DragonClaw"]
+- name: Giant Tree 2F Lower Area
+ id: 129
+ game_objects:
+ - name: "Giant Tree 2F - South Box"
+ object_id: 0xAD
+ type: "Box"
+ access: []
+ links:
+ - target_room: 130
+ access: ["Claw"]
+ - target_room: 131
+ access: ["Claw"]
+- name: Giant Tree 2F Central Island
+ id: 130
+ game_objects: []
+ links:
+ - target_room: 129
+ access: ["Claw"]
+ - target_room: 135
+ entrance: 282
+ teleporter: [146, 0]
+ access: ["Sword"]
+- name: Giant Tree 2F East Ledge
+ id: 131
+ game_objects: []
+ links:
+ - target_room: 129
+ access: ["Claw"]
+ - target_room: 130
+ access: ["DragonClaw"]
+- name: Giant Tree 2F Meteor Chest Room
+ id: 132
+ game_objects:
+ - name: "Giant Tree 2F - Gidrah Chest"
+ object_id: 0x16
+ type: "Chest"
+ access: []
+ links:
+ - target_room: 133
+ entrance: 285
+ teleporter: [148, 0]
+ access: []
+- name: Giant Tree 2F Mushroom Room
+ id: 133
+ game_objects:
+ - name: "Giant Tree 2F - Mushroom Tunnel West Box"
+ object_id: 0xAF
+ type: "Box"
+ access: ["Axe"]
+ - name: "Giant Tree 2F - Mushroom Tunnel East Box"
+ object_id: 0xB0
+ type: "Box"
+ access: ["Axe"]
+ links:
+ - target_room: 127
+ entrance: 286
+ teleporter: [150, 0]
+ access: ["Axe"]
+ - target_room: 132
+ entrance: 287
+ teleporter: [151, 0]
+ access: ["Axe", "Gidrah"]
+- name: Giant Tree 3F Central Island
+ id: 135
+ game_objects:
+ - name: "Giant Tree 3F - Central Island Box"
+ object_id: 0xB3
+ type: "Box"
+ access: []
+ links:
+ - target_room: 130
+ entrance: 288
+ teleporter: [152, 0]
+ access: []
+ - target_room: 136
+ access: ["Claw"]
+ - target_room: 137
+ access: ["DragonClaw"]
+- name: Giant Tree 3F Central Area
+ id: 136
+ game_objects:
+ - name: "Giant Tree 3F - Center North Box"
+ object_id: 0xB1
+ type: "Box"
+ access: []
+ - name: "Giant Tree 3F - Center West Box"
+ object_id: 0xB2
+ type: "Box"
+ access: []
+ links:
+ - target_room: 135
+ access: ["Claw"]
+ - target_room: 127
+ access: []
+ - target_room: 131
+ access: []
+- name: Giant Tree 3F Lower Ledge
+ id: 137
+ game_objects: []
+ links:
+ - target_room: 135
+ access: ["DragonClaw"]
+ - target_room: 142
+ entrance: 289
+ teleporter: [153, 0]
+ access: ["Sword"]
+- name: Giant Tree 3F West Area
+ id: 138
+ game_objects:
+ - name: "Giant Tree 3F - West Side Box"
+ object_id: 0xB4
+ type: "Box"
+ access: []
+ links:
+ - target_room: 128
+ access: []
+ - target_room: 210
+ entrance: 290
+ teleporter: [154, 0]
+ access: []
+- name: Giant Tree 3F Middle Up Island
+ id: 139
+ game_objects: []
+ links:
+ - target_room: 136
+ access: ["Claw"]
+- name: Giant Tree 3F West Platform
+ id: 140
+ game_objects: []
+ links:
+ - target_room: 139
+ access: ["Claw"]
+ - target_room: 141
+ access: ["Claw"]
+ - target_room: 128
+ entrance: 291
+ teleporter: [155, 0]
+ access: []
+- name: Giant Tree 3F North Ledge
+ id: 141
+ game_objects: []
+ links:
+ - target_room: 143
+ entrance: 292
+ teleporter: [156, 0]
+ access: ["Sword"]
+ - target_room: 139
+ access: ["Claw"]
+ - target_room: 136
+ access: ["Claw"]
+- name: Giant Tree Worm Room Upper Ledge
+ id: 142
+ game_objects:
+ - name: "Giant Tree 3F - Worm Room North Box"
+ object_id: 0xB5
+ type: "Box"
+ access: ["Axe"]
+ - name: "Giant Tree 3F - Worm Room South Box"
+ object_id: 0xB6
+ type: "Box"
+ access: ["Axe"]
+ links:
+ - target_room: 137
+ entrance: 293
+ teleporter: [157, 0]
+ access: ["Axe"]
+ - target_room: 210
+ access: ["Axe", "Claw"]
+- name: Giant Tree Worm Room Lower Ledge
+ id: 210
+ game_objects: []
+ links:
+ - target_room: 138
+ entrance: 294
+ teleporter: [158, 0]
+ access: []
+- name: Giant Tree 4F Lower Floor
+ id: 143
+ game_objects: []
+ links:
+ - target_room: 141
+ entrance: 295
+ teleporter: [159, 0]
+ access: []
+ - target_room: 148
+ entrance: 296
+ teleporter: [160, 0]
+ access: []
+ - target_room: 148
+ entrance: 297
+ teleporter: [161, 0]
+ access: []
+ - target_room: 147
+ entrance: 298
+ teleporter: [162, 0]
+ access: ["Sword"]
+- name: Giant Tree 4F Middle Floor
+ id: 144
+ game_objects:
+ - name: "Giant Tree 4F - Highest Platform North Box"
+ object_id: 0xB7
+ type: "Box"
+ access: []
+ - name: "Giant Tree 4F - Highest Platform South Box"
+ object_id: 0xB8
+ type: "Box"
+ access: []
+ links:
+ - target_room: 149
+ entrance: 299
+ teleporter: [163, 0]
+ access: []
+ - target_room: 145
+ access: ["Claw"]
+ - target_room: 146
+ access: ["DragonClaw"]
+- name: Giant Tree 4F Upper Floor
+ id: 145
+ game_objects: []
+ links:
+ - target_room: 150
+ entrance: 300
+ teleporter: [164, 0]
+ access: ["Sword"]
+ - target_room: 144
+ access: ["Claw"]
+- name: Giant Tree 4F South Ledge
+ id: 146
+ game_objects:
+ - name: "Giant Tree 4F - Hook Ledge Northeast Box"
+ object_id: 0xB9
+ type: "Box"
+ access: []
+ - name: "Giant Tree 4F - Hook Ledge Southwest Box"
+ object_id: 0xBA
+ type: "Box"
+ access: []
+ links:
+ - target_room: 144
+ access: ["DragonClaw"]
+- name: Giant Tree 4F Slime Room East Area
+ id: 147
+ game_objects:
+ - name: "Giant Tree 4F - East Slime Room Box"
+ object_id: 0xBC
+ type: "Box"
+ access: ["Axe"]
+ links:
+ - target_room: 143
+ entrance: 304
+ teleporter: [168, 0]
+ access: []
+- name: Giant Tree 4F Slime Room West Area
+ id: 148
+ game_objects: []
+ links:
+ - target_room: 143
+ entrance: 303
+ teleporter: [167, 0]
+ access: ["Axe"]
+ - target_room: 143
+ entrance: 302
+ teleporter: [166, 0]
+ access: ["Axe"]
+ - target_room: 149
+ access: ["Axe", "Claw"]
+- name: Giant Tree 4F Slime Room Platform
+ id: 149
+ game_objects:
+ - name: "Giant Tree 4F - West Slime Room Box"
+ object_id: 0xBB
+ type: "Box"
+ access: []
+ links:
+ - target_room: 144
+ entrance: 301
+ teleporter: [165, 0]
+ access: []
+ - target_room: 148
+ access: ["Claw"]
+- name: Giant Tree 5F Lower Area
+ id: 150
+ game_objects:
+ - name: "Giant Tree 5F - Northwest Left Box"
+ object_id: 0xBD
+ type: "Box"
+ access: []
+ - name: "Giant Tree 5F - Northwest Right Box"
+ object_id: 0xBE
+ type: "Box"
+ access: []
+ - name: "Giant Tree 5F - South Left Box"
+ object_id: 0xBF
+ type: "Box"
+ access: []
+ - name: "Giant Tree 5F - South Right Box"
+ object_id: 0xC0
+ type: "Box"
+ access: []
+ links:
+ - target_room: 145
+ entrance: 305
+ teleporter: [169, 0]
+ access: []
+ - target_room: 151
+ access: ["Claw"]
+ - target_room: 143
+ access: []
+- name: Giant Tree 5F Gidrah Platform
+ id: 151
+ game_objects:
+ - name: "Gidrah"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Gidrah"]
+ access: []
+ links:
+ - target_room: 150
+ access: ["Claw"]
+- name: Kaidge Temple Lower Ledge
+ id: 152
+ game_objects: []
+ links:
+ - target_room: 226
+ entrance: 307
+ teleporter: [18, 6]
+ access: []
+ - target_room: 153
+ access: ["Claw"]
+- name: Kaidge Temple Upper Ledge
+ id: 153
+ game_objects:
+ - name: "Kaidge Temple - Box"
+ object_id: 0xC1
+ type: "Box"
+ access: []
+ links:
+ - target_room: 185
+ entrance: 308
+ teleporter: [71, 8]
+ access: ["MobiusCrest"]
+ - target_room: 152
+ access: ["Claw"]
+- name: Windhole Temple
+ id: 154
+ game_objects:
+ - name: "Windhole Temple - Box"
+ object_id: 0xC2
+ type: "Box"
+ access: []
+ links:
+ - target_room: 226
+ entrance: 309
+ teleporter: [173, 0]
+ access: []
+- name: Mount Gale
+ id: 155
+ game_objects:
+ - name: "Mount Gale - Dullahan Chest"
+ object_id: 0x17
+ type: "Chest"
+ access: ["DragonClaw", "Dullahan"]
+ - name: "Dullahan"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Dullahan"]
+ access: ["DragonClaw"]
+ - name: "Mount Gale - East Box"
+ object_id: 0xC3
+ type: "Box"
+ access: ["DragonClaw"]
+ - name: "Mount Gale - West Box"
+ object_id: 0xC4
+ type: "Box"
+ access: []
+ links:
+ - target_room: 226
+ entrance: 310
+ teleporter: [174, 0]
+ access: []
+- name: Windia
+ id: 156
+ game_objects: []
+ links:
+ - target_room: 226
+ entrance: 312
+ teleporter: [10, 6]
+ access: []
+ - target_room: 157
+ entrance: 320
+ teleporter: [30, 5]
+ access: []
+ - target_room: 163
+ entrance: 321
+ teleporter: [31, 2]
+ access: []
+ - target_room: 165
+ entrance: 322
+ teleporter: [32, 5]
+ access: []
+ - target_room: 159
+ entrance: 323
+ teleporter: [176, 4]
+ access: []
+ - target_room: 160
+ entrance: 324
+ teleporter: [177, 4]
+ access: []
+- name: Otto's House
+ id: 157
+ game_objects:
+ - name: "Otto"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["RainbowBridge"]
+ access: ["ThunderRock"]
+ links:
+ - target_room: 156
+ entrance: 327
+ teleporter: [106, 3]
+ access: []
+ - target_room: 158
+ entrance: 326
+ teleporter: [33, 2]
+ access: []
+- name: Otto's Attic
+ id: 158
+ game_objects:
+ - name: "Windia - Otto's Attic Box"
+ object_id: 0xC5
+ type: "Box"
+ access: []
+ links:
+ - target_room: 157
+ entrance: 328
+ teleporter: [107, 3]
+ access: []
+- name: Windia Kid House
+ id: 159
+ game_objects: []
+ links:
+ - target_room: 156
+ entrance: 329
+ teleporter: [178, 0]
+ access: []
+ - target_room: 161
+ entrance: 330
+ teleporter: [180, 0]
+ access: []
+- name: Windia Old People House
+ id: 160
+ game_objects: []
+ links:
+ - target_room: 156
+ entrance: 331
+ teleporter: [179, 0]
+ access: []
+ - target_room: 162
+ entrance: 332
+ teleporter: [181, 0]
+ access: []
+- name: Windia Kid House Basement
+ id: 161
+ game_objects: []
+ links:
+ - target_room: 159
+ entrance: 333
+ teleporter: [182, 0]
+ access: []
+ - target_room: 79
+ entrance: 334
+ teleporter: [44, 8]
+ access: ["MobiusCrest"]
+- name: Windia Old People House Basement
+ id: 162
+ game_objects:
+ - name: "Windia - Mobius Basement West Box"
+ object_id: 0xC8
+ type: "Box"
+ access: []
+ - name: "Windia - Mobius Basement East Box"
+ object_id: 0xC9
+ type: "Box"
+ access: []
+ links:
+ - target_room: 160
+ entrance: 335
+ teleporter: [183, 0]
+ access: []
+ - target_room: 186
+ entrance: 336
+ teleporter: [43, 8]
+ access: ["MobiusCrest"]
+- name: Windia Inn Lobby
+ id: 163
+ game_objects: []
+ links:
+ - target_room: 156
+ entrance: 338
+ teleporter: [135, 3]
+ access: []
+ - target_room: 164
+ entrance: 337
+ teleporter: [215, 0]
+ access: []
+- name: Windia Inn Beds
+ id: 164
+ game_objects:
+ - name: "Windia - Inn Bedroom North Box"
+ object_id: 0xC6
+ type: "Box"
+ access: []
+ - name: "Windia - Inn Bedroom South Box"
+ object_id: 0xC7
+ type: "Box"
+ access: []
+ - name: "Windia - Kaeli"
+ object_id: 15
+ type: "NPC"
+ access: ["Kaeli2"]
+ links:
+ - target_room: 163
+ entrance: 339
+ teleporter: [216, 0]
+ access: []
+- name: Windia Vendor House
+ id: 165
+ game_objects:
+ - name: "Windia - Vendor"
+ object_id: 16
+ type: "NPC"
+ access: []
+ links:
+ - target_room: 156
+ entrance: 340
+ teleporter: [108, 3]
+ access: []
+- name: Pazuzu Tower 1F Main Lobby
+ id: 166
+ game_objects:
+ - name: "Pazuzu 1F"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Pazuzu1F"]
+ access: []
+ links:
+ - target_room: 226
+ entrance: 341
+ teleporter: [184, 0]
+ access: []
+ - target_room: 180
+ entrance: 345
+ teleporter: [185, 0]
+ access: []
+- name: Pazuzu Tower 1F Boxes Room
+ id: 167
+ game_objects:
+ - name: "Pazuzu's Tower 1F - Descent Bomb Wall West Box"
+ object_id: 0xCA
+ type: "Box"
+ access: ["Bomb"]
+ - name: "Pazuzu's Tower 1F - Descent Bomb Wall Center Box"
+ object_id: 0xCB
+ type: "Box"
+ access: ["Bomb"]
+ - name: "Pazuzu's Tower 1F - Descent Bomb Wall East Box"
+ object_id: 0xCC
+ type: "Box"
+ access: ["Bomb"]
+ - name: "Pazuzu's Tower 1F - Descent Box"
+ object_id: 0xCD
+ type: "Box"
+ access: []
+ links:
+ - target_room: 169
+ entrance: 349
+ teleporter: [187, 0]
+ access: []
+- name: Pazuzu Tower 1F Southern Platform
+ id: 168
+ game_objects: []
+ links:
+ - target_room: 169
+ entrance: 346
+ teleporter: [186, 0]
+ access: []
+ - target_room: 166
+ access: ["DragonClaw"]
+- name: Pazuzu 2F
+ id: 169
+ game_objects:
+ - name: "Pazuzu's Tower 2F - East Room West Box"
+ object_id: 0xCE
+ type: "Box"
+ access: []
+ - name: "Pazuzu's Tower 2F - East Room East Box"
+ object_id: 0xCF
+ type: "Box"
+ access: []
+ - name: "Pazuzu 2F Lock"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Pazuzu2FLock"]
+ access: ["Axe"]
+ - name: "Pazuzu 2F"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Pazuzu2F"]
+ access: ["Bomb"]
+ links:
+ - target_room: 183
+ entrance: 350
+ teleporter: [188, 0]
+ access: []
+ - target_room: 168
+ entrance: 351
+ teleporter: [189, 0]
+ access: []
+ - target_room: 167
+ entrance: 352
+ teleporter: [190, 0]
+ access: []
+ - target_room: 171
+ entrance: 353
+ teleporter: [191, 0]
+ access: []
+- name: Pazuzu 3F Main Room
+ id: 170
+ game_objects:
+ - name: "Pazuzu's Tower 3F - Guest Room West Box"
+ object_id: 0xD0
+ type: "Box"
+ access: []
+ - name: "Pazuzu's Tower 3F - Guest Room East Box"
+ object_id: 0xD1
+ type: "Box"
+ access: []
+ - name: "Pazuzu 3F"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Pazuzu3F"]
+ access: []
+ links:
+ - target_room: 180
+ entrance: 356
+ teleporter: [192, 0]
+ access: []
+ - target_room: 181
+ entrance: 357
+ teleporter: [193, 0]
+ access: []
+- name: Pazuzu 3F Central Island
+ id: 171
+ game_objects: []
+ links:
+ - target_room: 169
+ entrance: 360
+ teleporter: [194, 0]
+ access: []
+ - target_room: 170
+ access: ["DragonClaw"]
+ - target_room: 172
+ access: ["DragonClaw"]
+- name: Pazuzu 3F Southern Island
+ id: 172
+ game_objects:
+ - name: "Pazuzu's Tower 3F - South Ledge Box"
+ object_id: 0xD2
+ type: "Box"
+ access: []
+ links:
+ - target_room: 173
+ entrance: 361
+ teleporter: [195, 0]
+ access: []
+ - target_room: 171
+ access: ["DragonClaw"]
+- name: Pazuzu 4F
+ id: 173
+ game_objects:
+ - name: "Pazuzu's Tower 4F - Elevator West Box"
+ object_id: 0xD3
+ type: "Box"
+ access: ["Bomb"]
+ - name: "Pazuzu's Tower 4F - Elevator East Box"
+ object_id: 0xD4
+ type: "Box"
+ access: ["Bomb"]
+ - name: "Pazuzu's Tower 4F - East Storage Room Chest"
+ object_id: 0x18
+ type: "Chest"
+ access: []
+ - name: "Pazuzu 4F Lock"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Pazuzu4FLock"]
+ access: ["Axe"]
+ - name: "Pazuzu 4F"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Pazuzu4F"]
+ access: ["Bomb"]
+ links:
+ - target_room: 183
+ entrance: 362
+ teleporter: [196, 0]
+ access: []
+ - target_room: 184
+ entrance: 363
+ teleporter: [197, 0]
+ access: []
+ - target_room: 172
+ entrance: 364
+ teleporter: [198, 0]
+ access: []
+ - target_room: 175
+ entrance: 365
+ teleporter: [199, 0]
+ access: []
+- name: Pazuzu 5F Pazuzu Loop
+ id: 174
+ game_objects:
+ - name: "Pazuzu 5F"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Pazuzu5F"]
+ access: []
+ links:
+ - target_room: 181
+ entrance: 368
+ teleporter: [200, 0]
+ access: []
+ - target_room: 182
+ entrance: 369
+ teleporter: [201, 0]
+ access: []
+- name: Pazuzu 5F Upper Loop
+ id: 175
+ game_objects:
+ - name: "Pazuzu's Tower 5F - North Box"
+ object_id: 0xD5
+ type: "Box"
+ access: []
+ - name: "Pazuzu's Tower 5F - South Box"
+ object_id: 0xD6
+ type: "Box"
+ access: []
+ links:
+ - target_room: 173
+ entrance: 370
+ teleporter: [202, 0]
+ access: []
+ - target_room: 176
+ entrance: 371
+ teleporter: [203, 0]
+ access: []
+- name: Pazuzu 6F
+ id: 176
+ game_objects:
+ - name: "Pazuzu's Tower 6F - Box"
+ object_id: 0xD7
+ type: "Box"
+ access: []
+ - name: "Pazuzu's Tower 6F - Chest"
+ object_id: 0x19
+ type: "Chest"
+ access: []
+ - name: "Pazuzu 6F Lock"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Pazuzu6FLock"]
+ access: ["Bomb", "Axe"]
+ - name: "Pazuzu 6F"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Pazuzu6F"]
+ access: ["Bomb"]
+ links:
+ - target_room: 184
+ entrance: 374
+ teleporter: [204, 0]
+ access: []
+ - target_room: 175
+ entrance: 375
+ teleporter: [205, 0]
+ access: []
+ - target_room: 178
+ entrance: 376
+ teleporter: [206, 0]
+ access: []
+ - target_room: 178
+ entrance: 377
+ teleporter: [207, 0]
+ access: []
+- name: Pazuzu 7F Southwest Area
+ id: 177
+ game_objects: []
+ links:
+ - target_room: 182
+ entrance: 380
+ teleporter: [26, 0]
+ access: []
+ - target_room: 178
+ access: ["DragonClaw"]
+- name: Pazuzu 7F Rest of the Area
+ id: 178
+ game_objects: []
+ links:
+ - target_room: 177
+ access: ["DragonClaw"]
+ - target_room: 176
+ entrance: 381
+ teleporter: [27, 0]
+ access: []
+ - target_room: 176
+ entrance: 382
+ teleporter: [28, 0]
+ access: []
+ - target_room: 179
+ access: ["DragonClaw", "Pazuzu2FLock", "Pazuzu4FLock", "Pazuzu6FLock", "Pazuzu1F", "Pazuzu2F", "Pazuzu3F", "Pazuzu4F", "Pazuzu5F", "Pazuzu6F"]
+- name: Pazuzu 7F Sky Room
+ id: 179
+ game_objects:
+ - name: "Pazuzu's Tower 7F - Pazuzu Chest"
+ object_id: 0x1A
+ type: "Chest"
+ access: []
+ - name: "Pazuzu"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Pazuzu"]
+ access: ["Pazuzu2FLock", "Pazuzu4FLock", "Pazuzu6FLock", "Pazuzu1F", "Pazuzu2F", "Pazuzu3F", "Pazuzu4F", "Pazuzu5F", "Pazuzu6F"]
+ links:
+ - target_room: 178
+ access: ["DragonClaw"]
+- name: Pazuzu 1F to 3F
+ id: 180
+ game_objects: []
+ links:
+ - target_room: 166
+ entrance: 385
+ teleporter: [29, 0]
+ access: []
+ - target_room: 170
+ entrance: 386
+ teleporter: [30, 0]
+ access: []
+- name: Pazuzu 3F to 5F
+ id: 181
+ game_objects: []
+ links:
+ - target_room: 170
+ entrance: 387
+ teleporter: [40, 0]
+ access: []
+ - target_room: 174
+ entrance: 388
+ teleporter: [41, 0]
+ access: []
+- name: Pazuzu 5F to 7F
+ id: 182
+ game_objects: []
+ links:
+ - target_room: 174
+ entrance: 389
+ teleporter: [38, 0]
+ access: []
+ - target_room: 177
+ entrance: 390
+ teleporter: [39, 0]
+ access: []
+- name: Pazuzu 2F to 4F
+ id: 183
+ game_objects: []
+ links:
+ - target_room: 169
+ entrance: 391
+ teleporter: [21, 0]
+ access: []
+ - target_room: 173
+ entrance: 392
+ teleporter: [22, 0]
+ access: []
+- name: Pazuzu 4F to 6F
+ id: 184
+ game_objects: []
+ links:
+ - target_room: 173
+ entrance: 393
+ teleporter: [2, 0]
+ access: []
+ - target_room: 176
+ entrance: 394
+ teleporter: [3, 0]
+ access: []
+- name: Light Temple
+ id: 185
+ game_objects:
+ - name: "Light Temple - Box"
+ object_id: 0xD8
+ type: "Box"
+ access: []
+ links:
+ - target_room: 230
+ entrance: 395
+ teleporter: [19, 6]
+ access: []
+ - target_room: 153
+ entrance: 396
+ teleporter: [70, 8]
+ access: ["MobiusCrest"]
+- name: Ship Dock
+ id: 186
+ game_objects:
+ - name: "Ship Dock Access"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["ShipDockAccess"]
+ access: []
+ links:
+ - target_room: 228
+ entrance: 399
+ teleporter: [17, 6]
+ access: []
+ - target_room: 162
+ entrance: 397
+ teleporter: [61, 8]
+ access: ["MobiusCrest"]
+- name: Mac Ship Deck
+ id: 187
+ game_objects:
+ - name: "Mac Ship Steering Wheel"
+ object_id: 00
+ type: "Trigger"
+ on_trigger: ["ShipSteeringWheel"]
+ access: []
+ - name: "Mac's Ship Deck - North Box"
+ object_id: 0xD9
+ type: "Box"
+ access: []
+ - name: "Mac's Ship Deck - Center Box"
+ object_id: 0xDA
+ type: "Box"
+ access: []
+ - name: "Mac's Ship Deck - South Box"
+ object_id: 0xDB
+ type: "Box"
+ access: []
+ links:
+ - target_room: 229
+ entrance: 400
+ teleporter: [37, 8]
+ access: []
+ - target_room: 188
+ entrance: 401
+ teleporter: [50, 8]
+ access: []
+ - target_room: 188
+ entrance: 402
+ teleporter: [51, 8]
+ access: []
+ - target_room: 188
+ entrance: 403
+ teleporter: [52, 8]
+ access: []
+ - target_room: 189
+ entrance: 404
+ teleporter: [53, 8]
+ access: []
+- name: Mac Ship B1 Outer Ring
+ id: 188
+ game_objects:
+ - name: "Mac's Ship B1 - Northwest Hook Platform Box"
+ object_id: 0xE4
+ type: "Box"
+ access: ["DragonClaw"]
+ - name: "Mac's Ship B1 - Center Hook Platform Box"
+ object_id: 0xE5
+ type: "Box"
+ access: ["DragonClaw"]
+ links:
+ - target_room: 187
+ entrance: 405
+ teleporter: [208, 0]
+ access: []
+ - target_room: 187
+ entrance: 406
+ teleporter: [175, 0]
+ access: []
+ - target_room: 187
+ entrance: 407
+ teleporter: [172, 0]
+ access: []
+ - target_room: 193
+ entrance: 408
+ teleporter: [88, 0]
+ access: []
+ - target_room: 193
+ access: []
+- name: Mac Ship B1 Square Room
+ id: 189
+ game_objects: []
+ links:
+ - target_room: 187
+ entrance: 409
+ teleporter: [141, 0]
+ access: []
+ - target_room: 192
+ entrance: 410
+ teleporter: [87, 0]
+ access: []
+- name: Mac Ship B1 Central Corridor
+ id: 190
+ game_objects:
+ - name: "Mac's Ship B1 - Central Corridor Box"
+ object_id: 0xE6
+ type: "Box"
+ access: []
+ links:
+ - target_room: 192
+ entrance: 413
+ teleporter: [86, 0]
+ access: []
+ - target_room: 191
+ entrance: 412
+ teleporter: [102, 0]
+ access: []
+ - target_room: 193
+ access: []
+- name: Mac Ship B2 South Corridor
+ id: 191
+ game_objects: []
+ links:
+ - target_room: 190
+ entrance: 415
+ teleporter: [55, 8]
+ access: []
+ - target_room: 194
+ entrance: 414
+ teleporter: [57, 1]
+ access: []
+- name: Mac Ship B2 North Corridor
+ id: 192
+ game_objects: []
+ links:
+ - target_room: 190
+ entrance: 416
+ teleporter: [56, 8]
+ access: []
+ - target_room: 189
+ entrance: 417
+ teleporter: [57, 8]
+ access: []
+- name: Mac Ship B2 Outer Ring
+ id: 193
+ game_objects:
+ - name: "Mac's Ship B2 - Barrel Room South Box"
+ object_id: 0xDF
+ type: "Box"
+ access: []
+ - name: "Mac's Ship B2 - Barrel Room North Box"
+ object_id: 0xE0
+ type: "Box"
+ access: []
+ - name: "Mac's Ship B2 - Southwest Room Box"
+ object_id: 0xE1
+ type: "Box"
+ access: []
+ - name: "Mac's Ship B2 - Southeast Room Box"
+ object_id: 0xE2
+ type: "Box"
+ access: []
+ links:
+ - target_room: 188
+ entrance: 418
+ teleporter: [58, 8]
+ access: []
+- name: Mac Ship B1 Mac Room
+ id: 194
+ game_objects:
+ - name: "Mac's Ship B1 - Mac Room Chest"
+ object_id: 0x1B
+ type: "Chest"
+ access: []
+ - name: "Captain Mac"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["ShipLoaned"]
+ access: ["CaptainCap"]
+ links:
+ - target_room: 191
+ entrance: 424
+ teleporter: [101, 0]
+ access: []
+- name: Doom Castle Corridor of Destiny
+ id: 195
+ game_objects: []
+ links:
+ - target_room: 201
+ entrance: 428
+ teleporter: [84, 0]
+ access: []
+ - target_room: 196
+ entrance: 429
+ teleporter: [35, 2]
+ access: []
+ - target_room: 197
+ entrance: 430
+ teleporter: [209, 0]
+ access: ["StoneGolem"]
+ - target_room: 198
+ entrance: 431
+ teleporter: [211, 0]
+ access: ["StoneGolem", "TwinheadWyvern"]
+ - target_room: 199
+ entrance: 432
+ teleporter: [13, 2]
+ access: ["StoneGolem", "TwinheadWyvern", "Zuh"]
+- name: Doom Castle Ice Floor
+ id: 196
+ game_objects:
+ - name: "Doom Castle 4F - Northwest Room Box"
+ object_id: 0xE7
+ type: "Box"
+ access: ["Sword", "DragonClaw"]
+ - name: "Doom Castle 4F - Southwest Room Box"
+ object_id: 0xE8
+ type: "Box"
+ access: ["Sword", "DragonClaw"]
+ - name: "Doom Castle 4F - Northeast Room Box"
+ object_id: 0xE9
+ type: "Box"
+ access: ["Sword"]
+ - name: "Doom Castle 4F - Southeast Room Box"
+ object_id: 0xEA
+ type: "Box"
+ access: ["Sword", "DragonClaw"]
+ - name: "Stone Golem"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["StoneGolem"]
+ access: ["Sword", "DragonClaw"]
+ links:
+ - target_room: 195
+ entrance: 433
+ teleporter: [109, 3]
+ access: []
+- name: Doom Castle Lava Floor
+ id: 197
+ game_objects:
+ - name: "Doom Castle 5F - North Left Box"
+ object_id: 0xEB
+ type: "Box"
+ access: ["DragonClaw"]
+ - name: "Doom Castle 5F - North Right Box"
+ object_id: 0xEC
+ type: "Box"
+ access: ["DragonClaw"]
+ - name: "Doom Castle 5F - South Left Box"
+ object_id: 0xED
+ type: "Box"
+ access: ["DragonClaw"]
+ - name: "Doom Castle 5F - South Right Box"
+ object_id: 0xEE
+ type: "Box"
+ access: ["DragonClaw"]
+ - name: "Twinhead Wyvern"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["TwinheadWyvern"]
+ access: ["DragonClaw"]
+ links:
+ - target_room: 195
+ entrance: 434
+ teleporter: [210, 0]
+ access: []
+- name: Doom Castle Sky Floor
+ id: 198
+ game_objects:
+ - name: "Doom Castle 6F - West Box"
+ object_id: 0xEF
+ type: "Box"
+ access: []
+ - name: "Doom Castle 6F - East Box"
+ object_id: 0xF0
+ type: "Box"
+ access: []
+ - name: "Zuh"
+ object_id: 0
+ type: "Trigger"
+ on_trigger: ["Zuh"]
+ access: ["DragonClaw"]
+ links:
+ - target_room: 195
+ entrance: 435
+ teleporter: [212, 0]
+ access: []
+ - target_room: 197
+ access: []
+- name: Doom Castle Hero Room
+ id: 199
+ game_objects:
+ - name: "Doom Castle Hero Chest 01"
+ object_id: 0xF2
+ type: "Chest"
+ access: []
+ - name: "Doom Castle Hero Chest 02"
+ object_id: 0xF3
+ type: "Chest"
+ access: []
+ - name: "Doom Castle Hero Chest 03"
+ object_id: 0xF4
+ type: "Chest"
+ access: []
+ - name: "Doom Castle Hero Chest 04"
+ object_id: 0xF5
+ type: "Chest"
+ access: []
+ links:
+ - target_room: 200
+ entrance: 436
+ teleporter: [54, 0]
+ access: []
+ - target_room: 195
+ entrance: 441
+ teleporter: [110, 3]
+ access: []
+- name: Doom Castle Dark King Room
+ id: 200
+ game_objects: []
+ links:
+ - target_room: 199
+ entrance: 442
+ teleporter: [52, 0]
+ access: []
diff --git a/worlds/ffmq/data/settings.yaml b/worlds/ffmq/data/settings.yaml
new file mode 100644
index 00000000..aa973ee2
--- /dev/null
+++ b/worlds/ffmq/data/settings.yaml
@@ -0,0 +1,140 @@
+# YAML Preset file for FFMQR
+Final Fantasy Mystic Quest:
+ enemies_density:
+ All: 0
+ ThreeQuarter: 0
+ Half: 0
+ Quarter: 0
+ None: 0
+ chests_shuffle:
+ Prioritize: 0
+ Include: 0
+ shuffle_boxes_content:
+ true: 0
+ false: 0
+ npcs_shuffle:
+ Prioritize: 0
+ Include: 0
+ Exclude: 0
+ battlefields_shuffle:
+ Prioritize: 0
+ Include: 0
+ Exclude: 0
+ logic_options:
+ Friendly: 0
+ Standard: 0
+ Expert: 0
+ shuffle_enemies_position:
+ true: 0
+ false: 0
+ enemies_scaling_lower:
+ Quarter: 0
+ Half: 0
+ ThreeQuarter: 0
+ Normal: 0
+ OneAndQuarter: 0
+ OneAndHalf: 0
+ Double: 0
+ DoubleAndHalf: 0
+ Triple: 0
+ enemies_scaling_upper:
+ Quarter: 0
+ Half: 0
+ ThreeQuarter: 0
+ Normal: 0
+ OneAndQuarter: 0
+ OneAndHalf: 0
+ Double: 0
+ DoubleAndHalf: 0
+ Triple: 0
+ bosses_scaling_lower:
+ Quarter: 0
+ Half: 0
+ ThreeQuarter: 0
+ Normal: 0
+ OneAndQuarter: 0
+ OneAndHalf: 0
+ Double: 0
+ DoubleAndHalf: 0
+ Triple: 0
+ bosses_scaling_upper:
+ Quarter: 0
+ Half: 0
+ ThreeQuarter: 0
+ Normal: 0
+ OneAndQuarter: 0
+ OneAndHalf: 0
+ Double: 0
+ DoubleAndHalf: 0
+ Triple: 0
+ enemizer_attacks:
+ Normal: 0
+ Safe: 0
+ Chaos: 0
+ SelfDestruct: 0
+ SimpleShuffle: 0
+ leveling_curve:
+ Half: 0
+ Normal: 0
+ OneAndHalf: 0
+ Double: 0
+ DoubleHalf: 0
+ Triple: 0
+ Quadruple: 0
+ battles_quantity:
+ Ten: 0
+ Seven: 0
+ Five: 0
+ Three: 0
+ One: 0
+ RandomHigh: 0
+ RandomLow: 0
+ shuffle_battlefield_rewards:
+ true: 0
+ false: 0
+ random_starting_weapon:
+ true: 0
+ false: 0
+ progressive_gear:
+ true: 0
+ false: 0
+ tweaked_dungeons:
+ true: 0
+ false: 0
+ doom_castle_mode:
+ Standard: 0
+ BossRush: 0
+ DarkKingOnly: 0
+ doom_castle_shortcut:
+ true: 0
+ false: 0
+ sky_coin_mode:
+ Standard: 0
+ StartWith: 0
+ SaveTheCrystals: 0
+ ShatteredSkyCoin: 0
+ sky_coin_fragments_qty:
+ Low16: 0
+ Mid24: 0
+ High32: 0
+ RandomNarrow: 0
+ RandomWide: 0
+ enable_spoilers:
+ true: 0
+ false: 0
+ progressive_formations:
+ Disabled: 0
+ RegionsStrict: 0
+ RegionsKeepType: 0
+ map_shuffling:
+ None: 0
+ Overworld: 0
+ Dungeons: 0
+ OverworldDungeons: 0
+ Everything: 0
+ crest_shuffle:
+ true: 0
+ false: 0
+description: Generated by Archipelago
+game: Final Fantasy Mystic Quest
+name: Player
diff --git a/worlds/ffmq/docs/en_Final Fantasy Mystic Quest.md b/worlds/ffmq/docs/en_Final Fantasy Mystic Quest.md
new file mode 100644
index 00000000..dd4ea354
--- /dev/null
+++ b/worlds/ffmq/docs/en_Final Fantasy Mystic Quest.md
@@ -0,0 +1,33 @@
+# Final Fantasy Mystic Quest
+
+## Where is the settings page?
+
+The [player settings page for this game](../player-settings) contains all the options you need to configure and export a
+config file.
+
+## What does randomization do to this game?
+
+Besides items being shuffled, you have multiple options for shuffling maps, crest warps, and battlefield locations.
+There are a number of other options for tweaking the difficulty of the game.
+
+## What items and locations get shuffled?
+
+Items received normally through chests, from NPCs, or battlefields are shuffled. Optionally, you may also include
+the items from brown boxes.
+
+## Which items can be in another player's world?
+
+Any of the items which can be shuffled may also be placed into another player's world.
+
+## What does another world's item look like in Final Fantasy Mystic Quest?
+
+For locations that are originally boxes or chests, they will appear as a box if the item in it is categorized as a
+filler item, and a chest if it contains a useful or advancement item. Trap items may randomly appear as a box or chest.
+When opening a chest with an item for another player, you will see the Archipelago icon and it will tell you you've
+found an "Archipelago Item"
+
+## When the player receives an item, what happens?
+
+A dialogue box will open to show you the item you've received. You will not receive items while you are in battle,
+menus, or the overworld (except sometimes when closing the menu).
+
diff --git a/worlds/ffmq/docs/setup_en.md b/worlds/ffmq/docs/setup_en.md
new file mode 100644
index 00000000..9d9088db
--- /dev/null
+++ b/worlds/ffmq/docs/setup_en.md
@@ -0,0 +1,162 @@
+# Final Fantasy Mystic Quest Setup Guide
+
+## Required Software
+
+- [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases). Make sure to check the box for `SNI Client`
+
+- Hardware or software capable of loading and playing SNES ROM files
+ - An emulator capable of connecting to SNI such as:
+ - snes9x-rr from: [snes9x rr](https://github.com/gocha/snes9x-rr/releases),
+ - BizHawk from: [BizHawk Website](http://tasvideos.org/BizHawk.html)
+ - RetroArch 1.10.1 or newer from: [RetroArch Website](https://retroarch.com?page=platforms). Or,
+ - An SD2SNES, FXPak Pro ([FXPak Pro Store Page](https://krikzz.com/store/home/54-fxpak-pro.html)), or other
+ compatible hardware
+
+- Your legally obtained Final Fantasy Mystic Quest 1.1 ROM file, probably named `Final Fantasy - Mystic Quest (U) (V1.1).sfc`
+The Archipelago community cannot supply you with this.
+
+## Installation Procedures
+
+### Windows Setup
+
+1. During the installation of Archipelago, you will have been asked to install the SNI Client. If you did not do this,
+ or you are on an older version, you may run the installer again to install the SNI Client.
+2. If you are using an emulator, you should assign your Lua capable emulator as your default program for launching ROM
+ files.
+ 1. Extract your emulator's folder to your Desktop, or somewhere you will remember.
+ 2. Right-click on a ROM file and select **Open with...**
+ 3. Check the box next to **Always use this app to open .sfc files**
+ 4. Scroll to the bottom of the list and click the grey text **Look for another App on this PC**
+ 5. Browse for your emulator's `.exe` file and click **Open**. This file should be located inside the folder you
+ extracted in step one.
+
+## Create a Config (.yaml) File
+
+### What is a config file and why do I need one?
+
+See the guide on setting up a basic YAML at the Archipelago setup
+guide: [Basic Multiworld Setup Guide](/tutorial/Archipelago/setup/en)
+
+### Where do I get a config file?
+
+The Player Settings page on the website allows you to configure your personal settings and export a config file from
+them. Player settings page: [Final Fantasy Mystic Quest Player Settings Page](/games/Final%20Fantasy%20Mystic%20Quest/player-settings)
+
+### Verifying your config file
+
+If you would like to validate your config file to make sure it works, you may do so on the YAML Validator page. YAML
+validator page: [YAML Validation page](/mysterycheck)
+
+## Generating a Single-Player Game
+
+1. Navigate to the Player Settings page, configure your options, and click the "Generate Game" button.
+ - Player Settings page: [Final Fantasy Mystic Quest Player Settings Page](/games/Final%20Fantasy%20Mystic%20Quest/player-settings)
+2. You will be presented with a "Seed Info" page.
+3. Click the "Create New Room" link.
+4. You will be presented with a server page, from which you can download your `.apmq` patch file.
+5. Go to the [FFMQR website](https://ffmqrando.net/Archipelago) and select your Final Fantasy Mystic Quest 1.1 ROM
+and the .apmq file you received, choose optional preferences, and click `Generate` to get your patched ROM.
+7. Since this is a single-player game, you will no longer need the client, so feel free to close it.
+
+## Joining a MultiWorld Game
+
+### Obtain your patch file and create your ROM
+
+When you join a multiworld game, you will be asked to provide your config file to whoever is hosting. Once that is done,
+the host will provide you with either a link to download your patch file, or with a zip file containing
+everyone's patch files. Your patch file should have a `.apmq` extension.
+
+Go to the [FFMQR website](https://ffmqrando.net/Archipelago) and select your Final Fantasy Mystic Quest 1.1 ROM
+and the .apmq file you received, choose optional preferences, and click `Generate` to get your patched ROM.
+
+Manually launch the SNI Client, and run the patched ROM in your chosen software or hardware.
+
+### Connect to the client
+
+#### With an emulator
+
+When the client launched automatically, SNI should have also automatically launched in the background. If this is its
+first time launching, you may be prompted to allow it to communicate through the Windows Firewall.
+
+##### snes9x-rr
+
+1. Load your ROM file if it hasn't already been loaded.
+2. Click on the File menu and hover on **Lua Scripting**
+3. Click on **New Lua Script Window...**
+4. In the new window, click **Browse...**
+5. Select the connector lua file included with your client
+ - Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
+ emulator is 64-bit or 32-bit.
+6. If you see an error while loading the script that states `socket.dll missing` or similar, navigate to the folder of
+the lua you are using in your file explorer and copy the `socket.dll` to the base folder of your snes9x install.
+
+##### BizHawk
+
+1. Ensure you have the BSNES core loaded. You may do this by clicking on the Tools menu in BizHawk and following these
+ menu options:
+ `Config --> Cores --> SNES --> BSNES`
+ Once you have changed the loaded core, you must restart BizHawk.
+2. Load your ROM file if it hasn't already been loaded.
+3. Click on the Tools menu and click on **Lua Console**
+4. Click the Open Folder icon that says `Open Script` via the tooltip on mouse hover, or click the Script Menu then `Open Script...`, or press `Ctrl-O`.
+5. Select the `Connector.lua` file included with your client
+ - Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
+ emulator is 64-bit or 32-bit. Please note the most recent versions of BizHawk are 64-bit only.
+
+##### RetroArch 1.10.1 or newer
+
+You only have to do these steps once. Note, RetroArch 1.9.x will not work as it is older than 1.10.1.
+
+1. Enter the RetroArch main menu screen.
+2. Go to Settings --> User Interface. Set "Show Advanced Settings" to ON.
+3. Go to Settings --> Network. Set "Network Commands" to ON. (It is found below Request Device 16.) Leave the default
+ Network Command Port at 55355.
+
+
+4. Go to Main Menu --> Online Updater --> Core Downloader. Scroll down and select "Nintendo - SNES / SFC (bsnes-mercury
+ Performance)".
+
+When loading a ROM, be sure to select a **bsnes-mercury** core. These are the only cores that allow external tools to
+read ROM data.
+
+#### With hardware
+
+This guide assumes you have downloaded the correct firmware for your device. If you have not done so already, please do
+this now. SD2SNES and FXPak Pro users may download the appropriate firmware on the SD2SNES releases page. SD2SNES
+releases page: [SD2SNES Releases Page](https://github.com/RedGuyyyy/sd2snes/releases)
+
+Other hardware may find helpful information on the usb2snes platforms
+page: [usb2snes Supported Platforms Page](http://usb2snes.com/#supported-platforms)
+
+1. Close your emulator, which may have auto-launched.
+2. Power on your device and load the ROM.
+
+### Connect to the Archipelago Server
+
+The patch file which launched your client should have automatically connected you to the AP Server. There are a few
+reasons this may not happen however, including if the game is hosted on the website but was generated elsewhere. If the
+client window shows "Server Status: Not Connected", simply ask the host for the address of the server, and copy/paste it
+into the "Server" input field then press enter.
+
+The client will attempt to reconnect to the new server address, and should momentarily show "Server Status: Connected".
+
+### Play the game
+
+When the client shows both SNES Device and Server as connected, you're ready to begin playing. Congratulations on
+successfully joining a multiworld game!
+
+## Hosting a MultiWorld game
+
+The recommended way to host a game is to use our hosting service. The process is relatively simple:
+
+1. Collect config files from your players.
+2. Create a zip file containing your players' config files.
+3. Upload that zip file to the Generate page above.
+ - Generate page: [WebHost Seed Generation Page](/generate)
+4. Wait a moment while the seed is generated.
+5. When the seed is generated, you will be redirected to a "Seed Info" page.
+6. Click "Create New Room". This will take you to the server page. Provide the link to this page to your players, so
+ they may download their patch files from there.
+7. Note that a link to a MultiWorld Tracker is at the top of the room page. The tracker shows the progress of all
+ players in the game. Any observers may also be given the link to this page.
+8. Once all players have joined, you may begin playing.