diff --git a/README.md b/README.md
index 3508dd16095c..a1e03293d587 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 5cf503be1b2b..a09ca7017181 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 746399da74a6..0722ee317466 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 0764fa927464..e221371b2417 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 000000000000..c53f275017af
--- /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 000000000000..7660bd5d52f3
--- /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 000000000000..46ad1c007466
--- /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 000000000000..2746bb197743
--- /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 000000000000..c4c4605c8512
--- /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 000000000000..aac8289a3600
--- /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 000000000000..b6f19a77fb53
--- /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 000000000000..15bcd02bf623
--- /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 000000000000..4343d785eb7d
--- /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 000000000000..aa973ee22b0b
--- /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 000000000000..dd4ea354fab1
--- /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 000000000000..9d9088dbc232
--- /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.
+
+![Screenshot of Network Commands setting](/static/generated/docs/A%20Link%20to%20the%20Past/retroarch-network-commands-en.png)
+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.