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.