From eee9551e085289d7f997cfe9682fc6a8b484ff65 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 9 Mar 2023 13:29:56 -0600 Subject: [PATCH 001/165] begin work --- worlds/kdl3/Client.py | 27 ++++++++++++++++++++ worlds/kdl3/Items.py | 53 ++++++++++++++++++++++++++++++++++++++++ worlds/kdl3/Locations.py | 11 +++++++++ worlds/kdl3/__init__.py | 4 +++ 4 files changed, 95 insertions(+) create mode 100644 worlds/kdl3/Client.py create mode 100644 worlds/kdl3/Items.py create mode 100644 worlds/kdl3/Locations.py create mode 100644 worlds/kdl3/__init__.py diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py new file mode 100644 index 000000000000..f5ec840f5e7b --- /dev/null +++ b/worlds/kdl3/Client.py @@ -0,0 +1,27 @@ +import logging +import asyncio +import time + +from NetUtils import ClientStatus, color +from worlds.AutoSNIClient import SNIClient + +snes_logger = logging.getLogger("SNES") + +# FXPAK Pro protocol memory mapping used by SNI +ROM_START = 0x000000 +WRAM_START = 0xF50000 +WRAM_SIZE = 0x20000 +SRAM_START = 0xE00000 + +# KDL3 +KDL3_GAME_STATE = SRAM_START + 0x36D0 +KDL3_KIRBY_HP = SRAM_START + 0x39D1 +KDL3_ABILITY_ARRAY = SRAM_START + 0x3800 +KDL3_WORLD_1_HEARTS = SRAM_START + 0x53A7 + +class KDL3SNIClient(SNIClient): + game = "Kirby's Dream Land 3" + + async def deathlink_kill_player(self, ctx) -> None: + from SNIClient import DeathState, snes_buffered_write, snes_flush_writes, snes_read + game_state = await snes_read diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py new file mode 100644 index 000000000000..3dce34c72fad --- /dev/null +++ b/worlds/kdl3/Items.py @@ -0,0 +1,53 @@ +from BaseClasses import Item, ItemClassification +import typing + + +class ItemData(typing.NamedTuple): + code: typing.Optional[int] + progression: bool + skip_balancing: bool = False + trap: bool = False + + +class KDL3Item(Item): + game = "Kirby's Dream Land 3" + + +copy_ability_table = { + "Burning": ItemData(0x770001, True), + "Stone": ItemData(0x770002, True), + "Ice": ItemData(0x770003, True), + "Needle": ItemData(0x770004, True), + "Clean": ItemData(0x770005, True), + "Parasol": ItemData(0x770006, True), + "Spark": ItemData(0x770007, True), + "Cutter": ItemData(0x770008, True) +} + +animal_friend_table = { + "Rick": ItemData(0x770010, True), + "Kine": ItemData(0x770011, True), + "Coo": ItemData(0x770012, True), + "Nago": ItemData(0x770013, True), + "ChuChu": ItemData(0x770014, True), + "Pitch": ItemData(0x770015, True) +} + +misc_item_table = { + "Heart Star": ItemData(0x770020, True, True), + "1-Up": ItemData(0x770021, False), + "Maxim Tomato": ItemData(0x770022, False), +} + +item_table = { + **copy_ability_table, + **animal_friend_table, + **misc_item_table, +} + +item_names = { + "copy ability": {name for name in copy_ability_table.keys()}, + "animal friend": {name for name in animal_friend_table.keys()} +} + +lookup_name_to_id: typing.Dict[str, int] = {item_name: data.code for item_name, data in item_table.items() if data.code} \ No newline at end of file diff --git a/worlds/kdl3/Locations.py b/worlds/kdl3/Locations.py new file mode 100644 index 000000000000..c788d7e945dd --- /dev/null +++ b/worlds/kdl3/Locations.py @@ -0,0 +1,11 @@ +import typing +from BaseClasses import Location + + +class KDL3Location(Location): + game: str = "Kirby's Dream Land 3" + + def __init__(self, player: int, name: str, address: typing.Optional[int], parent): + super().__init__(player, name, address, parent) + self.event = not address + diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py new file mode 100644 index 000000000000..5288d03e1766 --- /dev/null +++ b/worlds/kdl3/__init__.py @@ -0,0 +1,4 @@ +from typing import Dict, Any + +from worlds.AutoWorld import World, WebWorld +from worlds.generic.Rules import set_rule From dee41845bbf8273ee260f1987f0f5cb64a520c76 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 12 Mar 2023 20:20:41 -0500 Subject: [PATCH 002/165] further work client works fix logic not accounting for 2/3 of the game locked behind Kine --- host.yaml | 3 + worlds/kdl3/Aesthetics.py | 15 ++ worlds/kdl3/Client.py | 175 ++++++++++++++++++- worlds/kdl3/Items.py | 7 + worlds/kdl3/Locations.py | 81 +++++++++ worlds/kdl3/Names/LocationName.py | 84 +++++++++ worlds/kdl3/Options.py | 127 ++++++++++++++ worlds/kdl3/Regions.py | 2 + worlds/kdl3/Rom.py | 137 +++++++++++++++ worlds/kdl3/__init__.py | 277 +++++++++++++++++++++++++++++- 10 files changed, 898 insertions(+), 10 deletions(-) create mode 100644 worlds/kdl3/Aesthetics.py create mode 100644 worlds/kdl3/Names/LocationName.py create mode 100644 worlds/kdl3/Options.py create mode 100644 worlds/kdl3/Regions.py create mode 100644 worlds/kdl3/Rom.py diff --git a/host.yaml b/host.yaml index 5d9ec56ee95b..24d24b17f549 100644 --- a/host.yaml +++ b/host.yaml @@ -140,6 +140,9 @@ dkc3_options: smw_options: # File name of the SMW US rom rom_file: "Super Mario World (USA).sfc" +kdl3_options: + # File name of the KDL3 US rom + rom_file: "Kirby's Dream Land 3 (USA).sfc" pokemon_rb_options: # File names of the Pokemon Red and Blue roms red_rom_file: "Pokemon Red (UE) [S][!].gb" diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py new file mode 100644 index 000000000000..a9728facd0ca --- /dev/null +++ b/worlds/kdl3/Aesthetics.py @@ -0,0 +1,15 @@ +import struct +from struct import pack + + + + +def rgb888_to_bgr555(color:str) -> bytes: + col = int(color, 16) + red = (col & 0xFF0000) >> 19 + green = (col & 0x00FF00) >> 11 + blue = (col & 0x0000FF) >> 3 + print(red, green, blue) + outcol = (blue << 10) + (green << 5) + red + print(hex(outcol)) + return struct.pack("H", outcol) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index f5ec840f5e7b..420557e406df 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -1,6 +1,6 @@ import logging -import asyncio import time +from struct import unpack, pack from NetUtils import ClientStatus, color from worlds.AutoSNIClient import SNIClient @@ -11,17 +11,178 @@ ROM_START = 0x000000 WRAM_START = 0xF50000 WRAM_SIZE = 0x20000 -SRAM_START = 0xE00000 +SRAM_1_START = 0xE00000 # KDL3 -KDL3_GAME_STATE = SRAM_START + 0x36D0 -KDL3_KIRBY_HP = SRAM_START + 0x39D1 -KDL3_ABILITY_ARRAY = SRAM_START + 0x3800 -KDL3_WORLD_1_HEARTS = SRAM_START + 0x53A7 +KDL3_DEBUG = ROM_START + 0x387E +KDL3_ROMNAME = ROM_START + 0x7FC0 +KDL3_DEATH_LINK_ADDR = ROM_START + 0x3D010 +KDL3_GOAL_ADDR = ROM_START + 0x3D012 + +KDL3_GAME_STATE = SRAM_1_START + 0x36D0 +KDL3_GAME_SAVE = SRAM_1_START + 0x3617 +KDL3_LIFE_COUNT = SRAM_1_START + 0x39CF +KDL3_KIRBY_HP = SRAM_1_START + 0x39D1 +KDL3_HEART_STARS = SRAM_1_START + 0x53A7 +KDL3_WORLD_UNLOCK = SRAM_1_START + 0x53CB +KDL3_LEVEL_UNLOCK = SRAM_1_START + 0x53CD +KDL3_BOSS_STATUS = SRAM_1_START + 0x53D5 +KDL3_INVINCIBILITY_TIMER = SRAM_1_START + 0x54B1 +KDL3_BOSS_BUTCH_STATUS = SRAM_1_START + 0x5EEA +KDL3_CURRENT_BGM = SRAM_1_START + 0x733E +KDL3_ABILITY_ARRAY = SRAM_1_START + 0x7F50 +KDL3_RECV_COUNT = SRAM_1_START + 0x7F70 +KDL3_HEART_STAR_COUNT = SRAM_1_START + 0x7F80 + class KDL3SNIClient(SNIClient): game = "Kirby's Dream Land 3" + latest_world = 0x01 + latest_level = 0x01 async def deathlink_kill_player(self, ctx) -> None: from SNIClient import DeathState, snes_buffered_write, snes_flush_writes, snes_read - game_state = await snes_read + game_state = await snes_read(ctx, KDL3_GAME_STATE, 1) + if game_state == 0xFF: + return # despite how funny it is, don't try to kill Kirby in a menu + current_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) + if current_hp == 0: + return # don't kill Kirby while he's already dead + snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x00])) + + await snes_flush_writes(ctx) + + ctx.death_state = DeathState.dead + ctx.last_death_link = time.time() + + async def validate_rom(self, ctx) -> bool: + from SNIClient import snes_read + rom_name = await snes_read(ctx, KDL3_ROMNAME, 0x15) + if rom_name is None or rom_name == bytes([0] * 0x15) or rom_name[:4] != b"KDL3": + return False + + ctx.game = self.game + ctx.rom = rom_name + ctx.items_handling = 0b111 # always remote items + ctx.allow_collect = True + + death_link = await snes_read(ctx, KDL3_DEATH_LINK_ADDR, 1) + if death_link: + await ctx.update_death_link(bool(death_link[0] & 0b1)) + + return True + + async def game_watcher(self, ctx) -> None: + from SNIClient import snes_buffered_write, snes_flush_writes, snes_read + halken = await snes_read(ctx, WRAM_START, 6) + if halken != b"halken": + return + is_debug = await snes_read(ctx, KDL3_DEBUG, 1) + if is_debug[0]: + return # just in case someone tries to get smart + game_state = await snes_read(ctx, KDL3_GAME_STATE, 1) + current_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) + if "DeathLink" in ctx.tags and game_state[0] == 0x00 and ctx.last_death_link + 1 < time.time(): + currently_dead = current_hp[0] == 0x00 + await ctx.handle_deathlink_state(currently_dead) + + current_save = await snes_read(ctx, KDL3_GAME_SAVE, 1) + goal = await snes_read(ctx, KDL3_GOAL_ADDR, 1) + boss_butch_status = await snes_read(ctx, KDL3_BOSS_BUTCH_STATUS + (current_save[0] * 2), 1) + if (goal[0] == 0x00 and boss_butch_status[0] == 0x01) or (goal[0] == 0x01 and boss_butch_status[0] == 0x03): + await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) + ctx.finished_game = True + + new_checks = [] + # level completion status + world_unlocks = await snes_read(ctx, KDL3_WORLD_UNLOCK, 1) + level_unlocks = await snes_read(ctx, KDL3_LEVEL_UNLOCK, 1) + if world_unlocks[0] >= self.latest_world and level_unlocks[0] > self.latest_level: + for loc_id in range(1, ((world_unlocks[0] - 1) * 6) + level_unlocks[0]): + if loc_id + 0x770000 not in ctx.checked_locations: + new_checks.append(loc_id + 0x770000) + self.latest_level = level_unlocks[0] + if world_unlocks[0] > self.latest_world: + self.latest_world = world_unlocks[0] + # heart star status + heart_stars = await snes_read(ctx, KDL3_HEART_STARS, 35) + for i in range(5): + start_ind = i * 7 + for j in range(1, 7): + level_ind = start_ind + j - 1 + loc_id = 0x770100 + (6*i) + j + if heart_stars[level_ind] and loc_id not in ctx.checked_locations: + new_checks.append(loc_id) + elif not heart_stars[level_ind] and loc_id in ctx.checked_locations: + # only handle collected heart stars + snes_buffered_write(ctx, KDL3_HEART_STARS + level_ind, bytes([0x01])) + await snes_flush_writes(ctx) + # boss status + boss_flag_bytes = await snes_read(ctx, KDL3_BOSS_STATUS, 2) + boss_flag = unpack("H", boss_flag_bytes)[0] + if boss_flag & 2 > 0 and 0x770200 not in ctx.checked_locations: + new_checks.append(0x770200) + if boss_flag & 8 > 0 and 0x770201 not in ctx.checked_locations: + new_checks.append(0x770201) + if boss_flag & 32 > 0 and 0x770202 not in ctx.checked_locations: + new_checks.append(0x770202) + if boss_flag & 18 > 0 and 0x770203 not in ctx.checked_locations: + new_checks.append(0x770203) + if boss_flag & 512 > 0 and 0x770204 not in ctx.checked_locations: + new_checks.append(0x770204) + + rom = await snes_read(ctx, KDL3_ROMNAME, 0x15) + if rom != ctx.rom: + ctx.rom = None + + for new_check_id in new_checks: + ctx.locations_checked.add(new_check_id) + location = ctx.location_names[new_check_id] + snes_logger.info( + f'New Check: {location} ({len(ctx.locations_checked)}/{len(ctx.missing_locations) + len(ctx.checked_locations)})') + await ctx.send_msgs([{"cmd": 'LocationChecks', "locations": [new_check_id]}]) + + # KDL3_TODO: make the game show items received visually + recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 1) + recv_amount = recv_count[0] + if recv_amount < len(ctx.items_received): + item = ctx.items_received[recv_amount] + recv_amount += 1 + logging.info('Received %s from %s (%s) (%d/%d in list)' % ( + color(ctx.item_names[item.item], 'red', 'bold'), + color(ctx.player_names[item.player], 'yellow'), + ctx.location_names[item.location], recv_amount, len(ctx.items_received))) + + snes_buffered_write(ctx, KDL3_RECV_COUNT, pack("H", recv_amount)) + from .Rom import animal_friends + if item.item & 0x000030 == 0: + ability = item.item & 0x00000F + snes_buffered_write(ctx, KDL3_ABILITY_ARRAY + (ability * 2), pack("H", ability)) + elif item.item & 0x000010 > 0: + friend = item.item + for addr in animal_friends[friend]: + snes_buffered_write(ctx, ROM_START + addr, bytes([0x02])) + else: + # special handling for the remaining three + item = item.item & 0x00000F + if item == 0: + # Heart Star + heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 1) + snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", heart_star_count[0] + 1)) + elif item == 1: + # 1-Up + life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 1) + snes_buffered_write(ctx, KDL3_LIFE_COUNT, pack("H", life_count[0] + 1)) + elif item == 2: + # Maxim Tomato + # Check for Gooey + gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) + if gooey_hp[0] > 0x00: + snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x08])) + snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, bytes([0x08])) + else: + snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x0A])) + elif item == 3: + # Invincibility Candy + snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x75, 0x03])) + await snes_flush_writes(ctx) diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index 3dce34c72fad..d816b8423965 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -37,6 +37,13 @@ class KDL3Item(Item): "Heart Star": ItemData(0x770020, True, True), "1-Up": ItemData(0x770021, False), "Maxim Tomato": ItemData(0x770022, False), + "Invincible Candy": ItemData(0x770023, False), +} + +filler_item_weights = { + "1-Up": 4, + "Maxim Tomato": 2, + "Invincible Candy": 2 } item_table = { diff --git a/worlds/kdl3/Locations.py b/worlds/kdl3/Locations.py index c788d7e945dd..ea66ccacf165 100644 --- a/worlds/kdl3/Locations.py +++ b/worlds/kdl3/Locations.py @@ -1,5 +1,6 @@ import typing from BaseClasses import Location +from .Names import LocationName class KDL3Location(Location): @@ -9,3 +10,83 @@ def __init__(self, player: int, name: str, address: typing.Optional[int], parent super().__init__(player, name, address, parent) self.event = not address + +stage_locations = { + 0x770001: LocationName.grass_land_1, + 0x770002: LocationName.grass_land_2, + 0x770003: LocationName.grass_land_3, + 0x770004: LocationName.grass_land_4, + 0x770005: LocationName.grass_land_5, + 0x770006: LocationName.grass_land_6, + 0x770007: LocationName.ripple_field_1, + 0x770008: LocationName.ripple_field_2, + 0x770009: LocationName.ripple_field_3, + 0x77000A: LocationName.ripple_field_4, + 0x77000B: LocationName.ripple_field_5, + 0x77000C: LocationName.ripple_field_6, + 0x77000D: LocationName.sand_canyon_1, + 0x77000E: LocationName.sand_canyon_2, + 0x77000F: LocationName.sand_canyon_3, + 0x770010: LocationName.sand_canyon_4, + 0x770011: LocationName.sand_canyon_5, + 0x770012: LocationName.sand_canyon_6, + 0x770013: LocationName.cloudy_park_1, + 0x770014: LocationName.cloudy_park_2, + 0x770015: LocationName.cloudy_park_3, + 0x770016: LocationName.cloudy_park_4, + 0x770017: LocationName.cloudy_park_5, + 0x770018: LocationName.cloudy_park_6, + 0x770019: LocationName.iceberg_1, + 0x77001A: LocationName.iceberg_2, + 0x77001B: LocationName.iceberg_3, + 0x77001C: LocationName.iceberg_4, + 0x77001D: LocationName.iceberg_5, + 0x77001E: LocationName.iceberg_6, +} + +heart_star_locations = { + 0x770101: LocationName.grass_land_tulip, + 0x770102: LocationName.grass_land_muchi, + 0x770103: LocationName.grass_land_pitcherman, + 0x770104: LocationName.grass_land_chao, + 0x770105: LocationName.grass_land_mine, + 0x770106: LocationName.grass_land_pierre, + 0x770107: LocationName.ripple_field_kamuribana, + 0x770108: LocationName.ripple_field_bakasa, + 0x770109: LocationName.ripple_field_elieel, + 0x77010A: LocationName.ripple_field_toad, + 0x77010B: LocationName.ripple_field_mama_pitch, + 0x77010C: LocationName.ripple_field_hb002, + 0x77010D: LocationName.sand_canyon_mushrooms, + 0x77010E: LocationName.sand_canyon_auntie, + 0x77010F: LocationName.sand_canyon_caramello, + 0x770110: LocationName.sand_canyon_hikari, + 0x770111: LocationName.sand_canyon_nyupun, + 0x770112: LocationName.sand_canyon_rob, + 0x770113: LocationName.cloudy_park_hibanamodoki, + 0x770114: LocationName.cloudy_park_piyokeko, + 0x770115: LocationName.cloudy_park_mrball, + 0x770116: LocationName.cloudy_park_mikarin, + 0x770117: LocationName.cloudy_park_pick, + 0x770118: LocationName.cloudy_park_hb007, + 0x770119: LocationName.iceberg_kogoesou, + 0x77011A: LocationName.iceberg_samus, + 0x77011B: LocationName.iceberg_kawasaki, + 0x77011C: LocationName.iceberg_name, + 0x77011D: LocationName.iceberg_shiro, + 0x77011E: LocationName.iceberg_angel, +} + +boss_locations = { + 0x770200: LocationName.grass_land_whispy, + 0x770201: LocationName.ripple_field_acro, + 0x770202: LocationName.sand_canyon_poncon, + 0x770203: LocationName.cloudy_park_ado, + 0x770204: LocationName.iceberg_dedede, +} + +location_table = { + **stage_locations, + **heart_star_locations, + **boss_locations, +} diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py new file mode 100644 index 000000000000..46064031ccf3 --- /dev/null +++ b/worlds/kdl3/Names/LocationName.py @@ -0,0 +1,84 @@ +# World 1 +grass_land_1 = "Grass Land 1 - Complete" +grass_land_2 = "Grass Land 2 - Complete" +grass_land_3 = "Grass Land 3 - Complete" +grass_land_4 = "Grass Land 4 - Complete" +grass_land_5 = "Grass Land 5 - Complete" +grass_land_6 = "Grass Land 6 - Complete" +grass_land_tulip = "Grass Land 1 - Tulip" +grass_land_muchi = "Grass Land 2 - Muchimuchi" +grass_land_pitcherman = "Grass Land 3 - Pitcherman" +grass_land_chao = "Grass Land 4 - Chao & Goku" +grass_land_mine = "Grass Land 5 - Mine" +grass_land_pierre = "Grass Land 6 - Pierre" +grass_land_whispy = "Grass Land - Whispy Woods Purified" + +# World 2 +ripple_field_1 = "Ripple Field 1 - Complete" +ripple_field_2 = "Ripple Field 2 - Complete" +ripple_field_3 = "Ripple Field 3 - Complete" +ripple_field_4 = "Ripple Field 4 - Complete" +ripple_field_5 = "Ripple Field 5 - Complete" +ripple_field_6 = "Ripple Field 6 - Complete" +ripple_field_kamuribana = "Ripple Field 1 - Kamuribana" +ripple_field_bakasa = "Ripple Field 2 - Bakasa" +ripple_field_elieel = "Ripple Field 3 - Elieel" +ripple_field_toad = "Ripple Field 4 - Toad & Little Toad" +ripple_field_mama_pitch = "Ripple Field 5 - Mama Pitch" +ripple_field_hb002 = "Ripple Field 6 - HB-002" +ripple_field_acro = "Ripple Field - Acro Purified" + +# World 3 +sand_canyon_1 = "Sand Canyon 1 - Complete" +sand_canyon_2 = "Sand Canyon 2 - Complete" +sand_canyon_3 = "Sand Canyon 3 - Complete" +sand_canyon_4 = "Sand Canyon 4 - Complete" +sand_canyon_5 = "Sand Canyon 5 - Complete" +sand_canyon_6 = "Sand Canyon 6 - Complete" +sand_canyon_mushrooms = "Sand Canyon 1 - Geromuzudake" +sand_canyon_auntie = "Sand Canyon 2 - Auntie" +sand_canyon_caramello = "Sand Canyon 3 - Caramello" +sand_canyon_hikari = "Sand Canyon 4 - Donbe & Hikari" +sand_canyon_nyupun = "Sand Canyon 5 - Nyupun" +sand_canyon_rob = "Sand Canyon 6 - Professor Hector & R.O.B" +sand_canyon_poncon = "Sand Canyon - Pon & Con Purified" + +# World 4 +cloudy_park_1 = "Cloudy Park 1 - Complete" +cloudy_park_2 = "Cloudy Park 2 - Complete" +cloudy_park_3 = "Cloudy Park 3 - Complete" +cloudy_park_4 = "Cloudy Park 4 - Complete" +cloudy_park_5 = "Cloudy Park 5 - Complete" +cloudy_park_6 = "Cloudy Park 6 - Complete" +cloudy_park_hibanamodoki = "Cloudy Park 1 - Hibanamodoki" +cloudy_park_piyokeko = "Cloudy Park 2 - Piyo & Keko" +cloudy_park_mrball = "Cloudy Park 3 - Complete" +cloudy_park_mikarin = "Cloudy Park 4 - Mikarin & Kagami Mocchi" +cloudy_park_pick = "Cloudy Park 5 - Pick" +cloudy_park_hb007 = "Cloudy Park 6 - HB-007" +cloudy_park_ado = "Cloudy Park - Ado Purified" + +# World 5 +iceberg_1 = "Iceberg 1 - Complete" +iceberg_2 = "Iceberg 2 - Complete" +iceberg_3 = "Iceberg 3 - Complete" +iceberg_4 = "Iceberg 4 - Complete" +iceberg_5 = "Iceberg 5 - Complete" +iceberg_6 = "Iceberg 6 - Complete" +iceberg_kogoesou = "Iceberg 1 - Kogoesou" +iceberg_samus = "Iceberg 2 - Samus" +iceberg_kawasaki = "Iceberg 3 - Chef Kawasaki" +iceberg_name = "Iceberg 4 - Name" +iceberg_shiro = "Iceberg 5 - Shiro" +iceberg_angel = "Iceberg 6 - Complete" +iceberg_dedede = "Iceberg - Dedede Purified" + +# World 6 +hyper_zone = "Hyper Zone - Zero" +# Extras +boss_butch = "Boss Butch" +mg5_1 = "Minigame 5 - 1" +mg5_2 = "Minigame 5 - 2" +mg5_3 = "Minigame 5 - 3" +mg5_4 = "Minigame 5 - 4" +mg5_5 = "Minigame 5 - 5" diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py new file mode 100644 index 000000000000..a01bd407f7ee --- /dev/null +++ b/worlds/kdl3/Options.py @@ -0,0 +1,127 @@ +from Options import Option, DeathLink, Choice, DefaultOnToggle, OptionDict, Range +import typing + + +class Goal(Choice): + """ + Zero: collect the Heart Stars, purify the five bosses, and defeat Zero in the Hyper Zone. + Boss Butch: purify the five bosses, and then complete the boss rematches in the Boss Butch mode. + """ + display_name = "Goal" + option_zero = 0 + option_boss_butch = 1 + default = 0 + + +class TotalHeartStars(Range): + """ + Total number of heart stars to include in the pool of items. + """ + display_name = "Total Heart Stars" + range_start = 1 + range_end = 50 # 30 default locations + 30 stage clears + 5 bosses - 14 progression items = 51, so round down + default = 30 + + +class HeartStarsRequired(Range): + """ + Percentage of heart stars required to purify the five bosses and reach Zero. + Each boss will require a differing amount of heart stars to purify. + """ + display_name = "Max Heart Stars" + range_start = 1 + range_end = 100 + default = 50 + + +class LevelShuffle(Choice): + """ + None: No level shuffling. + Same World: shuffles levels around their world. + Shuffled: shuffles levels across all worlds. + """ + display_name = "Level Shuffle" + option_none = 0 + option_same_world = 1 + option_shuffled = 2 + default = 0 + + +class GameLanguage(Choice): + """ + The language that the game should display. This does not have to match the given rom. + """ + option_japanese = 0 + option_english = 1 + default = 1 + + +class FillerPercentage(Range): + """ + Percentage of non-required Heart Stars to be converted to filler items (1-Ups, Maxim Tomatoes, Invincibility Candy). + """ + range_start = 0 + range_end = 100 + default = 50 + + +class KirbyFlavorPreset(Choice): + """ + The color of Kirby, from a list of presets. + """ + display_name = "Kirby Flavor" + option_default = 0 + option_bubblegum = 1 + option_cherry = 2 + option_blueberry = 3 + option_lemon = 4 + option_lime = 5 + option_grape = 6 + option_chocolate = 7 + option_marshmellow = 8 + option_licorice = 9 + option_watermelon = 10 + option_orange = 11 + option_kiwi = 12 + option_lavender = 13 + default = 0 + +# class KirbyFlavor(OptionDict): + """ + A custom color for Kirby. + """ + + +class GooeyFlavorPreset(Choice): + """ + The color of Gooey, from a list of presets. + """ + display_name = "Gooey Flavor" + option_default = 0 + option_bubblegum = 1 + option_cherry = 2 + option_blueberry = 3 + option_lemon = 4 + option_lime = 5 + option_grape = 6 + option_chocolate = 7 + option_marshmellow = 8 + option_licorice = 9 + option_watermelon = 10 + option_orange = 11 + option_kiwi = 12 + option_lavender = 13 + default = 0 + + +kdl3_options: typing.Dict[str, type(Option)] = { + "death_link": DeathLink, + "game_language": GameLanguage, + "goal": Goal, + "total_heart_stars": TotalHeartStars, + "heart_stars_required": HeartStarsRequired, + "filler_percentage": FillerPercentage, + "kirby_flavor_preset": KirbyFlavorPreset, + # "kirby_flavor": KirbyFlavor, + "gooey_flavor_preset": GooeyFlavorPreset, +} diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py new file mode 100644 index 000000000000..f74bd5df660b --- /dev/null +++ b/worlds/kdl3/Regions.py @@ -0,0 +1,2 @@ +import typing + diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py new file mode 100644 index 000000000000..3fc4ecf12205 --- /dev/null +++ b/worlds/kdl3/Rom.py @@ -0,0 +1,137 @@ +import Utils +from typing import Optional +import hashlib +import os +import struct +from worlds.Files import APDeltaPatch + +KDL3UHASH = "201e7658f6194458a3869dde36bf8ec2" + +animal_friends = { # individual spawn addresses for each animal friend + 0x770010: [ # Rick + 2960854, 2973713, 3047772, 3109906, 3072123, 2971412, 3164056, 2956485, 3664418, 3057740, 3315310, 2977125, + 3397478, 2994412, 3604390, 3131799, 3132841, 3068643, 3038404, 3285176, 3072609, 3022489, 3015498, 3197815 + ], + 0x770011: [ # Kine + 2979317, 2966655, 3084295, 3072115, 3042583, 3026835, 3207394, 2977117, 3039009, 2994404, 3038412, 3022481, + 3040192, 3198638 + ], + 0x770012: [ # Coo + 2979325, 2966663, 3023113, 3109914, 2954719, 2952942, 2965879, 2977109, 3039001, 3075075, 3604398, 3132833, + 3019973, 3370321, 3070133, 3040200, 3197823 + ], + 0x770013: [ # Nago + 2960846, 3043722, 2973705, 3023105, 2956052, 3042591, 2971396, 2956501, 2976367, 3063027, 2984649, 3132825, + 3058280, 3019981, 3197831 + ], + 0x770014: [ # ChuChu + 3059881, 3043714, 3047780, 3084303, 3042575, 2952934, 2965887, 3044296, 2976359, 2954276, 2984665, 2994420, + 3075091, 3370313, 3026223, 3015506, 3198646 + ], + 0x770015: [ # Pitch + 3059889, 2956044, 3044878, 2971404, 3164064, 2965871, 2956493, 2976375, 3078817, 2984657, 3068635, 3058288, + 3019965, 3370329, 3026215, 3198654 + ], +} + + +class KDL3DeltaPatch(APDeltaPatch): + hash = KDL3UHASH + game = "Kirby's Dream Land 3" + patch_file_ending = ".apkdl3" + + @classmethod + def get_source_data(cls) -> bytes: + return get_base_rom_bytes() + + +class RomData: + def __init__(self, file, name=None): + self.file = bytes() + self.read_from_file(file) + self.name = name + + def read_bytes(self, offset, length): + return self.file[offset:offset+length] + + def write_byte(self, offset, value): + self.file[offset] = value + + def write_bytes(self, offset, values): + self.file[offset:offset+len(values)] = values + + def write_to_file(self, file): + with open(file, 'wb') as outfile: + outfile.write(self.file) + + def read_from_file(self, file): + with open(file, 'rb') as stream: + self.file = bytearray(stream.read()) + + +def handle_animal_friends(rom): + for friend in animal_friends: + for address in animal_friends[friend]: + rom.write_byte(address, 3) + + +def patch_rom(multiworld, player, rom, boss_requirements): + # handle animal friends first + handle_animal_friends(rom) + + # Copy Ability + rom.write_bytes(0x399A0, [0xB9, 0xF3, 0x54, 0x48, 0x0A, 0xAA, 0x68, 0xDD, 0x50, 0x7F, 0xEA, 0xEA, 0xF0, 0x03, 0xA9, + 0x00, 0x00, 0x99, 0xA9, 0x54, 0x6B, 0xEA, 0xEA, 0xEA, 0xEA, 0x48, 0x0A, 0xA8, 0x68, 0xD9, 0x50, 0x7F, + 0xEA, 0xF0, 0x03, 0xA9, 0x00, 0x00, 0x9D, 0xA9, 0x54, 0x9D, 0xDF, 0x39, 0x6B, ]) + + # Kirby/Gooey Copy Ability + rom.write_bytes(0xAFC8, [0x22, 0x00, 0x9A, 0x07, + 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) + + # Animal Copy Ability + rom.write_bytes(0x507E8, [0x22, 0xB9, 0x99, 0x07, 0xEA, 0xEA, ]) + + # Allow Purification + rom.write_bytes(0x30518, [0x22, 0xA0, 0x99, 0xC3, 0xEA, 0xEA, ]) + + # Check Purification + rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xBF, 0x00, 0xD0, 0x07, 0xCD, + 0x80, 0x7F, 0x10, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) + + # base patch done, write relevant slot info + + # boss requirements + rom.write_bytes(0x3D000, struct.pack("HHHHH", boss_requirements[0], boss_requirements[1], boss_requirements[2], + boss_requirements[3], boss_requirements[4])) + rom.write_byte(0x3D010, multiworld.death_link[player].value) + rom.write_byte(0x3D012, multiworld.goal[player].value) + + from Main import __version__ + rom.name = bytearray(f'KDL3{__version__.replace(".", "")[0:3]}_{player}_{multiworld.seed:11}\0', 'utf8')[:21] + rom.name.extend([0] * (21 - len(rom.name))) + rom.write_bytes(0x7FC0, rom.name) + rom.write_byte(0x7FD9, multiworld.game_language[player].value) + + +def get_base_rom_bytes(file_name: str = "") -> bytes: + base_rom_bytes: Optional[bytes] = getattr(get_base_rom_bytes, "base_rom_bytes", None) + if not base_rom_bytes: + file_name: str = get_base_rom_path(file_name) + base_rom_bytes = bytes(Utils.read_snes_rom(open(file_name, "rb"))) + + basemd5 = hashlib.md5() + basemd5.update(base_rom_bytes) + if KDL3UHASH != basemd5.hexdigest(): + raise Exception("Supplied Base Rom does not match known MD5 for US release. " + "Get the correct game and version, then dump it") + get_base_rom_bytes.base_rom_bytes = base_rom_bytes + return base_rom_bytes + + +def get_base_rom_path(file_name: str = "") -> str: + options: Utils.OptionsType = Utils.get_options() + if not file_name: + file_name = options["kdl3_options"]["rom_file"] + if not os.path.exists(file_name): + file_name = Utils.user_path(file_name) + return file_name diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 5288d03e1766..4353eb603299 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -1,4 +1,275 @@ -from typing import Dict, Any - +from BaseClasses import Tutorial, ItemClassification, Entrance, Region, MultiWorld from worlds.AutoWorld import World, WebWorld -from worlds.generic.Rules import set_rule +from worlds.generic.Rules import set_rule, add_rule +from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item +from .Locations import location_table, KDL3Location, stage_locations +from .Options import kdl3_options +from .Names import LocationName +from .Rom import KDL3DeltaPatch, get_base_rom_path, RomData, patch_rom +from .Client import KDL3SNIClient + +import os +import math +import threading +import base64 + + +class KDL3WebWorld(WebWorld): + theme = "party" + tutorials = [ + """ + Tutorial( + "Multiworld Setup Guide", + "A guide to setting up the Kirby's Dream Land 3 randomizer connected to an Archipelago Multiworld.", + "English", + "setup_en.md", + "setup/en", + ["Silvris"] + )""" + ] + + +class KDL3World(World): + """ + Join Kirby and his Animal Friends on an adventure to collect Heart Stars and drive Dark Matter away from Dream Land! + """ + + game: str = "Kirby's Dream Land 3" + option_definitions = kdl3_options + item_name_to_id = {item: item_table[item].code for item in item_table} + location_name_to_id = {location_table[location]: location for location in location_table} + data_version = 0 + web = KDL3WebWorld() + boss_requirements = dict() + + def __init__(self, world: MultiWorld, player: int): + self.rom_name_available_event = threading.Event() + super().__init__(world, player) + + @classmethod + def stage_assert_generate(cls, multiworld: MultiWorld) -> None: + rom_file: str = get_base_rom_path() + if not os.path.exists(rom_file): + raise FileNotFoundError(f"Could not find base ROM for {cls.game}: {rom_file}") + + def create_regions(self) -> None: + menu = Region("Menu", self.player, self.multiworld) + start = Entrance(self.player, "Start Game", menu) + menu.exits.append(start) + level1 = Region("Grass Land", self.player, self.multiworld) + level2 = Region("Ripple Field", self.player, self.multiworld) + level3 = Region("Sand Canyon", self.player, self.multiworld) + level4 = Region("Cloudy Park", self.player, self.multiworld) + level5 = Region("Iceberg", self.player, self.multiworld) + level6 = Region("Hyper Zone", self.player, self.multiworld) + start.connect(level1) + if False: # self.multiworld.level_shuffle[self.player].value != 0: + return + else: + for location in location_table: + if (location & 0x000200) == 0: + idx = location & 0x0000FF + if idx <= 6: + level1.locations.append(KDL3Location(self.player, location_table[location], location, level1)) + elif idx <= 12: + level2.locations.append(KDL3Location(self.player, location_table[location], location, level2)) + elif idx <= 18: + level3.locations.append(KDL3Location(self.player, location_table[location], location, level3)) + elif idx <= 24: + level4.locations.append(KDL3Location(self.player, location_table[location], location, level4)) + elif idx <= 30: + level5.locations.append(KDL3Location(self.player, location_table[location], location, level5)) + level1.locations.append(KDL3Location(self.player, LocationName.grass_land_whispy, 0x770200, level1)) + level2.locations.append(KDL3Location(self.player, LocationName.ripple_field_acro, 0x770201, level2)) + level3.locations.append(KDL3Location(self.player, LocationName.sand_canyon_poncon, 0x770202, level3)) + level4.locations.append(KDL3Location(self.player, LocationName.cloudy_park_ado, 0x770203, level4)) + level5.locations.append(KDL3Location(self.player, LocationName.iceberg_dedede, 0x770204, level5)) + level1.locations.append(KDL3Location(self.player, "Level 1 Boss", None, level1)) + level2.locations.append(KDL3Location(self.player, "Level 2 Boss", None, level2)) + level3.locations.append(KDL3Location(self.player, "Level 3 Boss", None, level3)) + level4.locations.append(KDL3Location(self.player, "Level 4 Boss", None, level4)) + level5.locations.append(KDL3Location(self.player, "Level 5 Boss", None, level5)) + if self.multiworld.goal[self.player] == 1: + level6.locations.append(KDL3Location(self.player, LocationName.boss_butch, None, level6)) + else: + level6.locations.append(KDL3Location(self.player, LocationName.hyper_zone, None, level6)) + tlv2 = Entrance(self.player, "To Level 2", level1) + level1.exits.append(tlv2) + tlv2.connect(level2) + tlv3 = Entrance(self.player, "To Level 3", level1) + level2.exits.append(tlv3) + tlv3.connect(level3) + tlv4 = Entrance(self.player, "To Level 4", level1) + level3.exits.append(tlv4) + tlv4.connect(level4) + tlv5 = Entrance(self.player, "To Level 5", level1) + level4.exits.append(tlv5) + tlv5.connect(level5) + tlv6 = Entrance(self.player, "To Level 6", level1) + level5.exits.append(tlv6) + tlv6.connect(level6) + self.multiworld.regions += [menu, level1, level2, level3, level4, level5, level6] + + def create_item(self, name: str, force_non_progression=False) -> KDL3Item: + item = item_table[name] + classification = ItemClassification.filler + if item.progression and not force_non_progression: + classification = ItemClassification.progression_skip_balancing \ + if item.skip_balancing else ItemClassification.progression + return KDL3Item(name, classification, item.code, self.player) + + def get_filler_item_name(self) -> str: + return self.multiworld.random.choices(list(filler_item_weights.keys()), + weights=list(filler_item_weights.values()))[0] + + def create_items(self) -> None: + itempool = [] + itempool.extend([self.create_item(name) for name in copy_ability_table]) + itempool.extend([self.create_item(name) for name in animal_friend_table]) + required_percentage = self.multiworld.heart_stars_required[self.player].value / 100.0 + remaining_items = len(location_table) - len(itempool) + total_heart_stars = self.multiworld.total_heart_stars[self.player].value + required_heart_stars = math.floor(total_heart_stars * required_percentage) + filler_items = total_heart_stars - required_heart_stars + filler_amount = math.floor(filler_items * (self.multiworld.filler_percentage[self.player].value / 100.0)) + nonrequired_heart_stars = filler_items - filler_amount + # handle boss requirements here + requirements = [required_heart_stars] + for i in range(4): + requirements.append(self.multiworld.per_slot_randoms[self.player].randint( + min(3, required_heart_stars), required_heart_stars)) + self.boss_requirements[self.player] = requirements + itempool.extend([self.create_item("Heart Star") for _ in range(required_heart_stars)]) + itempool.extend([self.create_item(self.get_filler_item_name()) + for _ in range(filler_amount + (remaining_items - total_heart_stars))]) + itempool.extend([self.create_item("Heart Star", True) for _ in range(nonrequired_heart_stars)]) + self.multiworld.itempool += itempool + + def set_rules(self) -> None: + for stage in stage_locations: + set_rule(self.multiworld.get_location(stage_locations[stage], self.player), + lambda state, prev=stage - 1: True if prev == 0x770000 + else state.can_reach(stage_locations[prev], "Location", self.player)) + + # Level 1 + set_rule(self.multiworld.get_location(LocationName.grass_land_muchi, self.player), + lambda state: state.has("ChuChu", self.player)) + set_rule(self.multiworld.get_location(LocationName.grass_land_chao, self.player), + lambda state: state.has("Stone", self.player)) + set_rule(self.multiworld.get_location(LocationName.grass_land_mine, self.player), + lambda state: state.has("Kine", self.player)) + # Level 2 + add_rule(self.multiworld.get_location(LocationName.ripple_field_5, self.player), + lambda state: state.has("Kine", self.player)) + set_rule(self.multiworld.get_location(LocationName.ripple_field_kamuribana, self.player), + lambda state: state.has("Pitch", self.player) and state.has("Clean", self.player)) + set_rule(self.multiworld.get_location(LocationName.ripple_field_bakasa, self.player), + lambda state: state.has("Kine", self.player) and state.has("Parasol", self.player)) + set_rule(self.multiworld.get_location(LocationName.ripple_field_toad, self.player), + lambda state: state.has("Needle", self.player)) + set_rule(self.multiworld.get_location(LocationName.ripple_field_mama_pitch, self.player), + lambda state: state.has("Pitch", self.player) and state.has("Kine", self.player)) + set_rule(self.multiworld.get_location(LocationName.sand_canyon_auntie, self.player), + lambda state: state.has("Clean", self.player)) + set_rule(self.multiworld.get_location(LocationName.sand_canyon_nyupun, self.player), + lambda state: state.has("ChuChu", self.player)) + set_rule(self.multiworld.get_location(LocationName.sand_canyon_rob, self.player), + lambda state: (state.has("Kine", self.player) or state.has("Coo", self.player)) + and state.has("Parasol", self.player) + and state.has("Stone", self.player) + ) + set_rule(self.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, self.player), + lambda state: state.has("Coo", self.player) and state.has("Clean", self.player)) + set_rule(self.multiworld.get_location(LocationName.cloudy_park_piyokeko, self.player), + lambda state: state.has("Needle", self.player)) + set_rule(self.multiworld.get_location(LocationName.cloudy_park_mikarin, self.player), + lambda state: state.has("Coo", self.player)) + set_rule(self.multiworld.get_location(LocationName.cloudy_park_pick, self.player), + lambda state: state.has("Rick", self.player)) + set_rule(self.multiworld.get_location(LocationName.iceberg_kogoesou, self.player), + lambda state: state.has("Burning", self.player)) + set_rule(self.multiworld.get_location(LocationName.iceberg_samus, self.player), + lambda state: state.has("Ice", self.player)) + set_rule(self.multiworld.get_location(LocationName.iceberg_name, self.player), + lambda state: state.has("Coo", self.player) and state.has("Burning", self.player)) + set_rule(self.multiworld.get_location(LocationName.iceberg_shiro, self.player), + lambda state: state.has("Nago", self.player)) + set_rule(self.multiworld.get_location(LocationName.iceberg_angel, self.player), + lambda state: state.has("Copy Ability", self.player, 8)) # easier than writing out 8 ands + + set_rule(self.multiworld.get_location("Level 1 Boss", self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0])) + set_rule(self.multiworld.get_location(LocationName.grass_land_whispy, self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0])) + set_rule(self.multiworld.get_location("Level 2 Boss", self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1])) + set_rule(self.multiworld.get_location(LocationName.ripple_field_acro, self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1])) + set_rule(self.multiworld.get_location("Level 3 Boss", self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2])) + set_rule(self.multiworld.get_location(LocationName.sand_canyon_poncon, self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2])) + set_rule(self.multiworld.get_location("Level 4 Boss", self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3])) + set_rule(self.multiworld.get_location(LocationName.cloudy_park_ado, self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3])) + set_rule(self.multiworld.get_location("Level 5 Boss", self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][4])) + set_rule(self.multiworld.get_location(LocationName.iceberg_dedede, self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][4])) + + set_rule(self.multiworld.get_entrance("To Level 6", self.player), + lambda state: state.has("Level 1 Boss Purified", self.player) + and state.has("Level 2 Boss Purified", self.player) + and state.has("Level 3 Boss Purified", self.player) + and state.has("Level 4 Boss Purified", self.player) + and state.has("Level 5 Boss Purified", self.player)) + + def generate_basic(self) -> None: + goal = self.multiworld.goal[self.player].value + goal_location = self.multiworld.get_location(LocationName.boss_butch, self.player) \ + if goal == 1 else self.multiworld.get_location(LocationName.hyper_zone, self.player) + goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, self.player)) + self.multiworld.get_location("Level 1 Boss", self.player) \ + .place_locked_item(KDL3Item("Level 1 Boss Purified", ItemClassification.progression, None, self.player)) + self.multiworld.get_location("Level 2 Boss", self.player) \ + .place_locked_item(KDL3Item("Level 2 Boss Purified", ItemClassification.progression, None, self.player)) + self.multiworld.get_location("Level 3 Boss", self.player) \ + .place_locked_item(KDL3Item("Level 3 Boss Purified", ItemClassification.progression, None, self.player)) + self.multiworld.get_location("Level 4 Boss", self.player) \ + .place_locked_item(KDL3Item("Level 4 Boss Purified", ItemClassification.progression, None, self.player)) + self.multiworld.get_location("Level 5 Boss", self.player) \ + .place_locked_item(KDL3Item("Level 5 Boss Purified", ItemClassification.progression, None, self.player)) + self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) + + def generate_output(self, output_directory: str): + rompath = "" + try: + world = self.multiworld + player = self.player + + rom = RomData(get_base_rom_path()) + patch_rom(self.multiworld, self.player, rom, self.boss_requirements[self.player]) + + rompath = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") + rom.write_to_file(rompath) + self.rom_name = rom.name + + patch = KDL3DeltaPatch(os.path.splitext(rompath)[0]+KDL3DeltaPatch.patch_file_ending, player=player, + player_name=world.player_name[player], patched_path=rompath) + patch.write() + except: + raise + finally: + self.rom_name_available_event.set() # make sure threading continues and errors are collected + if os.path.exists(rompath): + os.unlink(rompath) + + def modify_multidata(self, multidata: dict): + # 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() + multidata["connect_names"][new_name] = multidata["connect_names"][self.multiworld.player_name[self.player]] From 8f94a5d8d128c0f815df72a017aebd660bc9a7a0 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 12 Mar 2023 20:48:39 -0500 Subject: [PATCH 003/165] adjust logic to require being able to reach stage 6 before leaving a level --- worlds/kdl3/__init__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 4353eb603299..45358db0ec41 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -158,6 +158,8 @@ def set_rules(self) -> None: lambda state: state.has("Stone", self.player)) set_rule(self.multiworld.get_location(LocationName.grass_land_mine, self.player), lambda state: state.has("Kine", self.player)) + set_rule(self.multiworld.get_entrance("To Level 2", self.player), + lambda state: state.can_reach(LocationName.grass_land_6, "Location", self.player)) # Level 2 add_rule(self.multiworld.get_location(LocationName.ripple_field_5, self.player), lambda state: state.has("Kine", self.player)) @@ -169,6 +171,10 @@ def set_rules(self) -> None: lambda state: state.has("Needle", self.player)) set_rule(self.multiworld.get_location(LocationName.ripple_field_mama_pitch, self.player), lambda state: state.has("Pitch", self.player) and state.has("Kine", self.player)) + set_rule(self.multiworld.get_entrance("To Level 3", self.player), + lambda state: state.can_reach(LocationName.ripple_field_6, "Location", self.player)) + + # Level 3 set_rule(self.multiworld.get_location(LocationName.sand_canyon_auntie, self.player), lambda state: state.has("Clean", self.player)) set_rule(self.multiworld.get_location(LocationName.sand_canyon_nyupun, self.player), @@ -178,6 +184,10 @@ def set_rules(self) -> None: and state.has("Parasol", self.player) and state.has("Stone", self.player) ) + set_rule(self.multiworld.get_entrance("To Level 4", self.player), + lambda state: state.can_reach(LocationName.sand_canyon_6, "Location", self.player)) + + # Level 4 set_rule(self.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, self.player), lambda state: state.has("Coo", self.player) and state.has("Clean", self.player)) set_rule(self.multiworld.get_location(LocationName.cloudy_park_piyokeko, self.player), @@ -186,6 +196,10 @@ def set_rules(self) -> None: lambda state: state.has("Coo", self.player)) set_rule(self.multiworld.get_location(LocationName.cloudy_park_pick, self.player), lambda state: state.has("Rick", self.player)) + set_rule(self.multiworld.get_entrance("To Level 5", self.player), + lambda state: state.can_reach(LocationName.cloudy_park_6, "Location", self.player)) + + # Level 5 set_rule(self.multiworld.get_location(LocationName.iceberg_kogoesou, self.player), lambda state: state.has("Burning", self.player)) set_rule(self.multiworld.get_location(LocationName.iceberg_samus, self.player), From 79f4f181f032c455759b74e07683e34b5d51b867 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 12 Mar 2023 22:05:59 -0500 Subject: [PATCH 004/165] allow client to send checks past level 1, startup safeguards --- worlds/kdl3/Client.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 420557e406df..1fa6bd1745b4 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -77,6 +77,9 @@ async def game_watcher(self, ctx) -> None: halken = await snes_read(ctx, WRAM_START, 6) if halken != b"halken": return + current_bgm = await snes_read(ctx, KDL3_CURRENT_BGM, 1) + if current_bgm[0] in (0x00, 0x21, 0x22, 0x23, 0x25): + return # title screen, opening, save select is_debug = await snes_read(ctx, KDL3_DEBUG, 1) if is_debug[0]: return # just in case someone tries to get smart @@ -89,6 +92,8 @@ async def game_watcher(self, ctx) -> None: current_save = await snes_read(ctx, KDL3_GAME_SAVE, 1) goal = await snes_read(ctx, KDL3_GOAL_ADDR, 1) boss_butch_status = await snes_read(ctx, KDL3_BOSS_BUTCH_STATUS + (current_save[0] * 2), 1) + if boss_butch_status[0] == 0xFF: + return # save file is not created, ignore if (goal[0] == 0x00 and boss_butch_status[0] == 0x01) or (goal[0] == 0x01 and boss_butch_status[0] == 0x03): await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) ctx.finished_game = True @@ -97,6 +102,8 @@ async def game_watcher(self, ctx) -> None: # level completion status world_unlocks = await snes_read(ctx, KDL3_WORLD_UNLOCK, 1) level_unlocks = await snes_read(ctx, KDL3_LEVEL_UNLOCK, 1) + if world_unlocks[0] > 0x06: + return # save is not loaded, ignore if world_unlocks[0] >= self.latest_world and level_unlocks[0] > self.latest_level: for loc_id in range(1, ((world_unlocks[0] - 1) * 6) + level_unlocks[0]): if loc_id + 0x770000 not in ctx.checked_locations: @@ -104,6 +111,7 @@ async def game_watcher(self, ctx) -> None: self.latest_level = level_unlocks[0] if world_unlocks[0] > self.latest_world: self.latest_world = world_unlocks[0] + self.latest_level = 1 # reset after beating the boss # heart star status heart_stars = await snes_read(ctx, KDL3_HEART_STARS, 35) for i in range(5): From 544dd36e4b2c2c56e4c23ecef1b9a6a92836b4a5 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 12 Mar 2023 22:37:00 -0500 Subject: [PATCH 005/165] fix mama pitch logic --- worlds/kdl3/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 45358db0ec41..b53834acefb7 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -170,7 +170,8 @@ def set_rules(self) -> None: set_rule(self.multiworld.get_location(LocationName.ripple_field_toad, self.player), lambda state: state.has("Needle", self.player)) set_rule(self.multiworld.get_location(LocationName.ripple_field_mama_pitch, self.player), - lambda state: state.has("Pitch", self.player) and state.has("Kine", self.player)) + lambda state: state.has("Pitch", self.player) and state.has("Kine", self.player) + and state.has("Burning", self.player) and state.has("Stone", self.player)) set_rule(self.multiworld.get_entrance("To Level 3", self.player), lambda state: state.can_reach(LocationName.ripple_field_6, "Location", self.player)) From 1856ad122cd6b6bea4ffefa7c0de4d0c8f6d83bb Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 12 Mar 2023 23:44:03 -0500 Subject: [PATCH 006/165] remove unnecessary ricks --- worlds/kdl3/Rom.py | 4 ++-- worlds/kdl3/__init__.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 3fc4ecf12205..12c1896c826f 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -9,8 +9,8 @@ animal_friends = { # individual spawn addresses for each animal friend 0x770010: [ # Rick - 2960854, 2973713, 3047772, 3109906, 3072123, 2971412, 3164056, 2956485, 3664418, 3057740, 3315310, 2977125, - 3397478, 2994412, 3604390, 3131799, 3132841, 3068643, 3038404, 3285176, 3072609, 3022489, 3015498, 3197815 + 2960854, 2973713, 3047772, 3109906, 3072123, 2971412, 3164056, 2956485, 3057740, 3315310, 2977125, + 3397478, 2994412, 3604390, 3132841, 3068643, 3038404, 3072609, 3022489, 3015498, 3197815 ], 0x770011: [ # Kine 2979317, 2966655, 3084295, 3072115, 3042583, 3026835, 3207394, 2977117, 3039009, 2994404, 3038412, 3022481, diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index b53834acefb7..64fef822df3f 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -171,7 +171,7 @@ def set_rules(self) -> None: lambda state: state.has("Needle", self.player)) set_rule(self.multiworld.get_location(LocationName.ripple_field_mama_pitch, self.player), lambda state: state.has("Pitch", self.player) and state.has("Kine", self.player) - and state.has("Burning", self.player) and state.has("Stone", self.player)) + and state.has("Burning", self.player) and state.has("Stone", self.player)) set_rule(self.multiworld.get_entrance("To Level 3", self.player), lambda state: state.can_reach(LocationName.ripple_field_6, "Location", self.player)) @@ -181,7 +181,7 @@ def set_rules(self) -> None: set_rule(self.multiworld.get_location(LocationName.sand_canyon_nyupun, self.player), lambda state: state.has("ChuChu", self.player)) set_rule(self.multiworld.get_location(LocationName.sand_canyon_rob, self.player), - lambda state: (state.has("Kine", self.player) or state.has("Coo", self.player)) + lambda state: (state.has("Kine", self.player) and state.has("Coo", self.player)) and state.has("Parasol", self.player) and state.has("Stone", self.player) ) @@ -270,8 +270,8 @@ def generate_output(self, output_directory: str): rom.write_to_file(rompath) self.rom_name = rom.name - patch = KDL3DeltaPatch(os.path.splitext(rompath)[0]+KDL3DeltaPatch.patch_file_ending, player=player, - player_name=world.player_name[player], patched_path=rompath) + patch = KDL3DeltaPatch(os.path.splitext(rompath)[0] + KDL3DeltaPatch.patch_file_ending, player=player, + player_name=world.player_name[player], patched_path=rompath) patch.write() except: raise From 42dacace7e9f72c44bce10a6250ba3f49cb349cf Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 13 Mar 2023 01:42:18 -0500 Subject: [PATCH 007/165] 3-5 logic --- worlds/kdl3/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 64fef822df3f..2b8dc58e56ef 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -176,6 +176,8 @@ def set_rules(self) -> None: lambda state: state.can_reach(LocationName.ripple_field_6, "Location", self.player)) # Level 3 + add_rule(self.multiworld.get_location(LocationName.sand_canyon_5, self.player), + lambda state: state.has("Cutter", self.player)) set_rule(self.multiworld.get_location(LocationName.sand_canyon_auntie, self.player), lambda state: state.has("Clean", self.player)) set_rule(self.multiworld.get_location(LocationName.sand_canyon_nyupun, self.player), From d0767fe7254ee760cbaa3725df38d34a9e148e97 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 13 Mar 2023 02:25:39 -0500 Subject: [PATCH 008/165] shuffle boss requirement order --- worlds/kdl3/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 2b8dc58e56ef..e6eb879373d5 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -138,6 +138,7 @@ def create_items(self) -> None: for i in range(4): requirements.append(self.multiworld.per_slot_randoms[self.player].randint( min(3, required_heart_stars), required_heart_stars)) + self.multiworld.per_slot_randoms[self.player].shuffle(requirements) self.boss_requirements[self.player] = requirements itempool.extend([self.create_item("Heart Star") for _ in range(required_heart_stars)]) itempool.extend([self.create_item(self.get_filler_item_name()) From fa51e8623c027d0bac135459382f795b9667ddfd Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 13 Mar 2023 21:24:27 -0500 Subject: [PATCH 009/165] typo, duplicate location name, unnecessary rick --- worlds/kdl3/Names/LocationName.py | 2 +- worlds/kdl3/Options.py | 4 ++-- worlds/kdl3/Rom.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index 46064031ccf3..ff6618c4aa86 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -70,7 +70,7 @@ iceberg_kawasaki = "Iceberg 3 - Chef Kawasaki" iceberg_name = "Iceberg 4 - Name" iceberg_shiro = "Iceberg 5 - Shiro" -iceberg_angel = "Iceberg 6 - Complete" +iceberg_angel = "Iceberg 6 - Angel" iceberg_dedede = "Iceberg - Dedede Purified" # World 6 diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index a01bd407f7ee..3fbc742e6ccf 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -78,7 +78,7 @@ class KirbyFlavorPreset(Choice): option_lime = 5 option_grape = 6 option_chocolate = 7 - option_marshmellow = 8 + option_marshmallow = 8 option_licorice = 9 option_watermelon = 10 option_orange = 11 @@ -105,7 +105,7 @@ class GooeyFlavorPreset(Choice): option_lime = 5 option_grape = 6 option_chocolate = 7 - option_marshmellow = 8 + option_marshmallow = 8 option_licorice = 9 option_watermelon = 10 option_orange = 11 diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 12c1896c826f..3dbfe205875f 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -9,7 +9,7 @@ animal_friends = { # individual spawn addresses for each animal friend 0x770010: [ # Rick - 2960854, 2973713, 3047772, 3109906, 3072123, 2971412, 3164056, 2956485, 3057740, 3315310, 2977125, + 2960854, 2973713, 3047772, 3109906, 3072123, 2971412, 3164056, 2956485, 3057740, 2977125, 3397478, 2994412, 3604390, 3132841, 3068643, 3038404, 3072609, 3022489, 3015498, 3197815 ], 0x770011: [ # Kine From 94be3cb5dfd34263587610f4be50dc6e9a5bbf13 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 13 Mar 2023 22:01:47 -0500 Subject: [PATCH 010/165] rob logic, lost the rick 50/50 --- worlds/kdl3/Rom.py | 2 +- worlds/kdl3/__init__.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 3dbfe205875f..3a822f9d2fdf 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -10,7 +10,7 @@ animal_friends = { # individual spawn addresses for each animal friend 0x770010: [ # Rick 2960854, 2973713, 3047772, 3109906, 3072123, 2971412, 3164056, 2956485, 3057740, 2977125, - 3397478, 2994412, 3604390, 3132841, 3068643, 3038404, 3072609, 3022489, 3015498, 3197815 + 3078359, 2994412, 3604390, 3132841, 3068643, 3038404, 3072609, 3022489, 3015498, 3197815 ], 0x770011: [ # Kine 2979317, 2966655, 3084295, 3072115, 3042583, 3026835, 3207394, 2977117, 3039009, 2994404, 3038412, 3022481, diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index e6eb879373d5..4f0118a2ed30 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -187,6 +187,8 @@ def set_rules(self) -> None: lambda state: (state.has("Kine", self.player) and state.has("Coo", self.player)) and state.has("Parasol", self.player) and state.has("Stone", self.player) + and (state.has("Clean", self.player) or state.has("Spark", self.player)) + and (state.has("Ice", self.player) or state.has("Needle", self.player)) ) set_rule(self.multiworld.get_entrance("To Level 4", self.player), lambda state: state.can_reach(LocationName.sand_canyon_6, "Location", self.player)) @@ -276,7 +278,7 @@ def generate_output(self, output_directory: str): patch = KDL3DeltaPatch(os.path.splitext(rompath)[0] + KDL3DeltaPatch.patch_file_ending, player=player, player_name=world.player_name[player], patched_path=rompath) patch.write() - except: + except Exception: raise finally: self.rom_name_available_event.set() # make sure threading continues and errors are collected From d47fd03716be56c4506ef396610f44a5cd23b382 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 14 Mar 2023 16:42:38 -0500 Subject: [PATCH 011/165] wrong name, 5-4 logic, ado not checked correctly trim color options for the moment while still implementing --- worlds/kdl3/Aesthetics.py | 22 ++++++++++++-- worlds/kdl3/Client.py | 2 +- worlds/kdl3/Names/LocationName.py | 2 +- worlds/kdl3/Options.py | 50 +++++++++++++++---------------- worlds/kdl3/__init__.py | 2 ++ 5 files changed, 49 insertions(+), 29 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index a9728facd0ca..21c16f12ca14 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -1,10 +1,28 @@ import struct from struct import pack +kirby_flavor_presets = { + 3: { + "1": "a6a6ed", + "2": "e6e6fa", + "3": "bcbcf2", + "4": "8484e6", + "5": "2929ec", + "6": "b5b5f0", + "7": "847bd6", + "8": "3232d6", + "9": "d6d6ef", + "10": "4a52ef", + "11": "c6c6e6", + "12": "4343ad", + "13": "9494ea", + "14": "f6f6fd", + "15": "3139b6", + } +} - -def rgb888_to_bgr555(color:str) -> bytes: +def rgb888_to_bgr555(color: str) -> bytes: col = int(color, 16) red = (col & 0xFF0000) >> 19 green = (col & 0x00FF00) >> 11 diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 1fa6bd1745b4..02aa04559bbc 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -134,7 +134,7 @@ async def game_watcher(self, ctx) -> None: new_checks.append(0x770201) if boss_flag & 32 > 0 and 0x770202 not in ctx.checked_locations: new_checks.append(0x770202) - if boss_flag & 18 > 0 and 0x770203 not in ctx.checked_locations: + if boss_flag & 128 > 0 and 0x770203 not in ctx.checked_locations: new_checks.append(0x770203) if boss_flag & 512 > 0 and 0x770204 not in ctx.checked_locations: new_checks.append(0x770204) diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index ff6618c4aa86..7566cbb6cebf 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -52,7 +52,7 @@ cloudy_park_6 = "Cloudy Park 6 - Complete" cloudy_park_hibanamodoki = "Cloudy Park 1 - Hibanamodoki" cloudy_park_piyokeko = "Cloudy Park 2 - Piyo & Keko" -cloudy_park_mrball = "Cloudy Park 3 - Complete" +cloudy_park_mrball = "Cloudy Park 3 - Mr. Ball" cloudy_park_mikarin = "Cloudy Park 4 - Mikarin & Kagami Mocchi" cloudy_park_pick = "Cloudy Park 5 - Pick" cloudy_park_hb007 = "Cloudy Park 6 - HB-007" diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 3fbc742e6ccf..72804925e831 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -70,20 +70,20 @@ class KirbyFlavorPreset(Choice): The color of Kirby, from a list of presets. """ display_name = "Kirby Flavor" - option_default = 0 - option_bubblegum = 1 - option_cherry = 2 + #option_default = 0 + #option_bubblegum = 1 + #option_cherry = 2 option_blueberry = 3 - option_lemon = 4 - option_lime = 5 - option_grape = 6 - option_chocolate = 7 - option_marshmallow = 8 - option_licorice = 9 - option_watermelon = 10 - option_orange = 11 - option_kiwi = 12 - option_lavender = 13 + #option_lemon = 4 + #option_lime = 5 + #option_grape = 6 + #option_chocolate = 7 + #option_marshmallow = 8 + #option_licorice = 9 + #option_watermelon = 10 + #option_orange = 11 + #option_kiwi = 12 + #option_lavender = 13 default = 0 # class KirbyFlavor(OptionDict): @@ -98,19 +98,19 @@ class GooeyFlavorPreset(Choice): """ display_name = "Gooey Flavor" option_default = 0 - option_bubblegum = 1 - option_cherry = 2 + #option_bubblegum = 1 + #option_cherry = 2 option_blueberry = 3 - option_lemon = 4 - option_lime = 5 - option_grape = 6 - option_chocolate = 7 - option_marshmallow = 8 - option_licorice = 9 - option_watermelon = 10 - option_orange = 11 - option_kiwi = 12 - option_lavender = 13 + #option_lemon = 4 + #option_lime = 5 + #option_grape = 6 + #option_chocolate = 7 + #option_marshmallow = 8 + #option_licorice = 9 + #option_watermelon = 10 + #option_orange = 11 + #option_kiwi = 12 + #option_lavender = 13 default = 0 diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 4f0118a2ed30..fbcf43eaff8d 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -206,6 +206,8 @@ def set_rules(self) -> None: lambda state: state.can_reach(LocationName.cloudy_park_6, "Location", self.player)) # Level 5 + add_rule(self.multiworld.get_location(LocationName.iceberg_4, self.player), + lambda state: state.has("Burning", self.player)) set_rule(self.multiworld.get_location(LocationName.iceberg_kogoesou, self.player), lambda state: state.has("Burning", self.player)) set_rule(self.multiworld.get_location(LocationName.iceberg_samus, self.player), From 45d551a2ce3e6108237e162142a08246bbeb3d21 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 15 Mar 2023 19:30:22 -0500 Subject: [PATCH 012/165] basic level shuffle --- worlds/kdl3/Client.py | 22 ++-- worlds/kdl3/Items.py | 4 +- worlds/kdl3/Names/LocationName.py | 41 +++++-- worlds/kdl3/Options.py | 51 +++++++-- worlds/kdl3/Regions.py | 171 ++++++++++++++++++++++++++++++ worlds/kdl3/Rom.py | 46 +++++++- worlds/kdl3/__init__.py | 134 ++++++++++------------- 7 files changed, 361 insertions(+), 108 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 02aa04559bbc..0df19871a1ae 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -18,6 +18,7 @@ KDL3_ROMNAME = ROM_START + 0x7FC0 KDL3_DEATH_LINK_ADDR = ROM_START + 0x3D010 KDL3_GOAL_ADDR = ROM_START + 0x3D012 +KDL3_LEVEL_ADDR = ROM_START + 0x3D020 KDL3_GAME_STATE = SRAM_1_START + 0x36D0 KDL3_GAME_SAVE = SRAM_1_START + 0x3617 @@ -39,6 +40,7 @@ class KDL3SNIClient(SNIClient): game = "Kirby's Dream Land 3" latest_world = 0x01 latest_level = 0x01 + levels = None async def deathlink_kill_player(self, ctx) -> None: from SNIClient import DeathState, snes_buffered_write, snes_flush_writes, snes_read @@ -98,20 +100,24 @@ async def game_watcher(self, ctx) -> None: await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) ctx.finished_game = True + if self.levels is None: + self.levels = dict() + for i in range(5): + level_data = await snes_read(ctx, KDL3_LEVEL_ADDR + (14 * i), 14) + self.levels[i] = unpack("HHHHHHH", level_data) + new_checks = [] # level completion status world_unlocks = await snes_read(ctx, KDL3_WORLD_UNLOCK, 1) level_unlocks = await snes_read(ctx, KDL3_LEVEL_UNLOCK, 1) + current_world = world_unlocks[0] if world_unlocks[0] > 0x06: return # save is not loaded, ignore - if world_unlocks[0] >= self.latest_world and level_unlocks[0] > self.latest_level: - for loc_id in range(1, ((world_unlocks[0] - 1) * 6) + level_unlocks[0]): - if loc_id + 0x770000 not in ctx.checked_locations: - new_checks.append(loc_id + 0x770000) - self.latest_level = level_unlocks[0] - if world_unlocks[0] > self.latest_world: - self.latest_world = world_unlocks[0] - self.latest_level = 1 # reset after beating the boss + for i in range(world_unlocks[0] + 1): + for j in range(7 if current_world > i else level_unlocks[0]): + loc_id = 0x770000 + self.levels[i][j] + if loc_id not in ctx.checked_locations: + new_checks.append(loc_id) # heart star status heart_stars = await snes_read(ctx, KDL3_HEART_STARS, 35) for i in range(5): diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index d816b8423965..fe3b297d084c 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -53,8 +53,8 @@ class KDL3Item(Item): } item_names = { - "copy ability": {name for name in copy_ability_table.keys()}, - "animal friend": {name for name in animal_friend_table.keys()} + "Copy Ability": {name for name in copy_ability_table.keys()}, + "Animal Friend": {name for name in animal_friend_table.keys()} } lookup_name_to_id: typing.Dict[str, int] = {item_name: data.code for item_name, data in item_table.items() if data.code} \ No newline at end of file diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index 7566cbb6cebf..9a5991885ebb 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -1,4 +1,4 @@ -# World 1 +# Level 1 grass_land_1 = "Grass Land 1 - Complete" grass_land_2 = "Grass Land 2 - Complete" grass_land_3 = "Grass Land 3 - Complete" @@ -11,9 +11,9 @@ grass_land_chao = "Grass Land 4 - Chao & Goku" grass_land_mine = "Grass Land 5 - Mine" grass_land_pierre = "Grass Land 6 - Pierre" -grass_land_whispy = "Grass Land - Whispy Woods Purified" +grass_land_whispy = "Grass Land - Boss (Whispy Woods) Purified" -# World 2 +# Level 2 ripple_field_1 = "Ripple Field 1 - Complete" ripple_field_2 = "Ripple Field 2 - Complete" ripple_field_3 = "Ripple Field 3 - Complete" @@ -26,9 +26,9 @@ ripple_field_toad = "Ripple Field 4 - Toad & Little Toad" ripple_field_mama_pitch = "Ripple Field 5 - Mama Pitch" ripple_field_hb002 = "Ripple Field 6 - HB-002" -ripple_field_acro = "Ripple Field - Acro Purified" +ripple_field_acro = "Ripple Field - Boss (Acro) Purified" -# World 3 +# Level 3 sand_canyon_1 = "Sand Canyon 1 - Complete" sand_canyon_2 = "Sand Canyon 2 - Complete" sand_canyon_3 = "Sand Canyon 3 - Complete" @@ -41,9 +41,9 @@ sand_canyon_hikari = "Sand Canyon 4 - Donbe & Hikari" sand_canyon_nyupun = "Sand Canyon 5 - Nyupun" sand_canyon_rob = "Sand Canyon 6 - Professor Hector & R.O.B" -sand_canyon_poncon = "Sand Canyon - Pon & Con Purified" +sand_canyon_poncon = "Sand Canyon - Boss (Pon & Con) Purified" -# World 4 +# Level 4 cloudy_park_1 = "Cloudy Park 1 - Complete" cloudy_park_2 = "Cloudy Park 2 - Complete" cloudy_park_3 = "Cloudy Park 3 - Complete" @@ -56,9 +56,9 @@ cloudy_park_mikarin = "Cloudy Park 4 - Mikarin & Kagami Mocchi" cloudy_park_pick = "Cloudy Park 5 - Pick" cloudy_park_hb007 = "Cloudy Park 6 - HB-007" -cloudy_park_ado = "Cloudy Park - Ado Purified" +cloudy_park_ado = "Cloudy Park - Boss (Ado) Purified" -# World 5 +# Level 5 iceberg_1 = "Iceberg 1 - Complete" iceberg_2 = "Iceberg 2 - Complete" iceberg_3 = "Iceberg 3 - Complete" @@ -71,10 +71,11 @@ iceberg_name = "Iceberg 4 - Name" iceberg_shiro = "Iceberg 5 - Shiro" iceberg_angel = "Iceberg 6 - Angel" -iceberg_dedede = "Iceberg - Dedede Purified" +iceberg_dedede = "Iceberg - Boss (Dedede) Purified" -# World 6 +# Level 6 hyper_zone = "Hyper Zone - Zero" + # Extras boss_butch = "Boss Butch" mg5_1 = "Minigame 5 - 1" @@ -82,3 +83,21 @@ mg5_3 = "Minigame 5 - 3" mg5_4 = "Minigame 5 - 4" mg5_5 = "Minigame 5 - 5" + +# Level Names +level_names = { + "Grass Land": 1, + "Ripple Field": 2, + "Sand Canyon": 3, + "Cloudy Park": 4, + "Iceberg": 5, +} + +# Boss Names +boss_names = { + "Whispy Woods": 0x770200, + "Acro": 0x770201, + "Pon & Con": 0x770202, + "Ado": 0x770203, + "King Dedede": 0x770204 + } \ No newline at end of file diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 72804925e831..e78beef029c0 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -1,5 +1,6 @@ -from Options import Option, DeathLink, Choice, DefaultOnToggle, OptionDict, Range +from Options import Option, DeathLink, Choice, Toggle, OptionDict, Range, PlandoBosses import typing +from .Names import LocationName class Goal(Choice): @@ -36,21 +37,54 @@ class HeartStarsRequired(Range): class LevelShuffle(Choice): """ - None: No level shuffling. - Same World: shuffles levels around their world. - Shuffled: shuffles levels across all worlds. + None: No stage shuffling. + Same World: shuffles stages around their world. + Pattern: shuffles stages according to the stage pattern (stage 3 will always be a minigame stage, etc.) + Shuffled: shuffles stages across all worlds. """ - display_name = "Level Shuffle" + display_name = "Stage Shuffle" option_none = 0 option_same_world = 1 - option_shuffled = 2 + option_pattern = 2 + option_shuffled = 3 default = 0 +class BossShuffle(PlandoBosses): + """ + None: Bosses will remain in their vanilla locations + Shuffled: Bosses will be shuffled amongst each other + Singularity: All (non-Zero) bosses will be replaced with a single boss + Supports plando placement. + """ + bosses = LocationName.boss_names.keys() + + locations = LocationName.level_names.keys() + + duplicate_bosses = True + @classmethod + def can_place_boss(cls, boss: str, location: str) -> bool: + # Kirby has no logic about requiring bosses in specific locations (since we load in their stage) + return True + + display_name = "Boss Shuffle" + option_none = 0 + option_shuffled = 1 + option_singularity = 2 + + +class BossRequirementRandom(Toggle): + """ + If enabled, boss purification will unlock in any order, not sequentially. + """ + display_name = "Randomize Purification Order" + + class GameLanguage(Choice): """ The language that the game should display. This does not have to match the given rom. """ + display_name = "Game Language" option_japanese = 0 option_english = 1 default = 1 @@ -70,7 +104,7 @@ class KirbyFlavorPreset(Choice): The color of Kirby, from a list of presets. """ display_name = "Kirby Flavor" - #option_default = 0 + option_default = 0 #option_bubblegum = 1 #option_cherry = 2 option_blueberry = 3 @@ -121,6 +155,9 @@ class GooeyFlavorPreset(Choice): "total_heart_stars": TotalHeartStars, "heart_stars_required": HeartStarsRequired, "filler_percentage": FillerPercentage, + "stage_shuffle": LevelShuffle, + "boss_shuffle": BossShuffle, + "boss_requirement_random": BossRequirementRandom, "kirby_flavor_preset": KirbyFlavorPreset, # "kirby_flavor": KirbyFlavor, "gooey_flavor_preset": GooeyFlavorPreset, diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index f74bd5df660b..98ad27b699bc 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -1,2 +1,173 @@ import typing +from BaseClasses import Entrance, Region +from worlds.AutoWorld import World +from .Locations import KDL3Location, location_table +from .Names import LocationName +from .Options import BossShuffle +if typing.TYPE_CHECKING: + from . import KDL3World +default_levels = { + 1: [0x770001, 0x770002, 0x770003, 0x770004, 0x770005, 0x770006, 0x770200], + 2: [0x770007, 0x770008, 0x770009, 0x77000A, 0x77000B, 0x77000C, 0x770201], + 3: [0x77000D, 0x77000E, 0x77000F, 0x770010, 0x770011, 0x770012, 0x770202], + 4: [0x770013, 0x770014, 0x770015, 0x770016, 0x770017, 0x770018, 0x770203], + 5: [0x770019, 0x77001A, 0x77001B, 0x77001C, 0x77001D, 0x77001E, 0x770204], +} + +first_stage_blacklist = { + 0x77000B, # 2-5 needs Kine + 0x770012, # 3-5 needs Cutter + 0x77001C, # 5-4 needs Burning +} + +def generate_valid_level(level, stage, possible_stages, slot_random): + new_stage = slot_random.choice(possible_stages) + if level == 1 and stage == 1 and new_stage in first_stage_blacklist: + return generate_valid_level(level, stage, possible_stages, slot_random) + else: + return new_stage + + +def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bool) -> dict: + levels = { + 1: [None for _ in range(7)], + 2: [None for _ in range(7)], + 3: [None for _ in range(7)], + 4: [None for _ in range(7)], + 5: [None for _ in range(7)] + } + + possible_stages = list() + for level in default_levels: + for stage in range(6): + possible_stages.append(default_levels[level][stage]) + + if world.multiworld.plando_connections[world.player]: + for entrance, stage in world.multiworld.plando_connections[world.player]: + try: + entrance_world, entrance_stage = entrance.split("-") + stage_world, stage_stage = stage.split("-") + new_stage = default_levels[LocationName.level_names[stage_world.trim()]][int(stage_stage)] + levels[LocationName.level_names[entrance_world.trim()]][int(entrance_stage)] = new_stage + possible_stages.remove(new_stage) + + except Exception: + raise Exception(f"Invalid connection: {entrance} => {stage} for player {world.player} ({world.multiworld.player_name[world.player]}") + + for level in range(1, 6): + for stage in range(6): + # Randomize bosses separately + try: + if levels[level][stage] is None: + stage_candidates = [candidate for candidate in possible_stages + if (enforce_world and candidate in default_levels[level]) + or (enforce_pattern and candidate % 6 == (stage if stage > 6 else 0)) + or (enforce_pattern == enforce_world) + ] + new_stage = generate_valid_level(level, stage, stage_candidates, + world.multiworld.per_slot_randoms[world.player]) + possible_stages.remove(new_stage) + levels[level][stage] = new_stage + except Exception: + raise Exception(f"Failed to find valid stage for {level}-{stage}. Remaining Stages:{possible_stages}") + + # now handle bosses + boss_shuffle: typing.Union[int, str] = world.multiworld.boss_shuffle[world.player].value + plando_bosses = [] + if isinstance(boss_shuffle, str): + # boss plando + options = boss_shuffle.split(";") + boss_shuffle = BossShuffle.options[options.pop()] + for option in options: + if "-" in option: + loc, boss = option.split("-") + levels[LocationName.level_names[loc]][6] = LocationName.boss_names[boss] + plando_bosses.append(boss) + + if boss_shuffle > 0: + if boss_shuffle == 2: + possible_bosses = [default_levels[world.multiworld.per_slot_randoms[world.player].randint(1, 5)][6] + for _ in range(5 - len(plando_bosses))] + elif boss_shuffle == 3: + boss = world.multiworld.per_slot_randoms[world.player].randint(1, 5) + possible_bosses = [default_levels[boss][6] for _ in range(5 - len(plando_bosses))] + else: + possible_bosses = [default_levels[level][6] for level in default_levels + if default_levels[level][6] not in plando_bosses] + for level in levels: + if levels[level][6] is None: + boss = world.multiworld.per_slot_randoms[world.player].choice(possible_bosses) + levels[level][6] = boss + possible_bosses.remove(boss) + else: + for level in levels: + if levels[level][6] is None: + levels[level][6] = default_levels[level][6] + + return levels + + +def create_levels(world: World) -> None: + menu = Region("Menu", world.player, world.multiworld) + start = Entrance(world.player, "Start Game", menu) + menu.exits.append(start) + level1 = Region("Grass Land", world.player, world.multiworld) + level2 = Region("Ripple Field", world.player, world.multiworld) + level3 = Region("Sand Canyon", world.player, world.multiworld) + level4 = Region("Cloudy Park", world.player, world.multiworld) + level5 = Region("Iceberg", world.player, world.multiworld) + level6 = Region("Hyper Zone", world.player, world.multiworld) + levels = { + 1: level1, + 2: level2, + 3: level3, + 4: level4, + 5: level5, + } + start.connect(level1) + level_shuffle = world.multiworld.stage_shuffle[world.player].value + if level_shuffle != 0: + world.player_levels[world.player] = generate_valid_levels( + world, + level_shuffle == 1, + level_shuffle == 2) + else: + world.player_levels[world.player] = default_levels.copy() + for level in levels: + for stage in world.player_levels[world.player][level]: + if not stage & 0x200: + levels[level].locations.append(KDL3Location(world.player, location_table[stage], stage, levels[level])) + heart_star = stage + 0x100 + levels[level].locations.append(KDL3Location(world.player, location_table[heart_star], + heart_star, levels[level])) + level1.locations.append(KDL3Location(world.player, LocationName.grass_land_whispy, 0x770200, level1)) + level2.locations.append(KDL3Location(world.player, LocationName.ripple_field_acro, 0x770201, level2)) + level3.locations.append(KDL3Location(world.player, LocationName.sand_canyon_poncon, 0x770202, level3)) + level4.locations.append(KDL3Location(world.player, LocationName.cloudy_park_ado, 0x770203, level4)) + level5.locations.append(KDL3Location(world.player, LocationName.iceberg_dedede, 0x770204, level5)) + level1.locations.append(KDL3Location(world.player, "Level 1 Boss", None, level1)) + level2.locations.append(KDL3Location(world.player, "Level 2 Boss", None, level2)) + level3.locations.append(KDL3Location(world.player, "Level 3 Boss", None, level3)) + level4.locations.append(KDL3Location(world.player, "Level 4 Boss", None, level4)) + level5.locations.append(KDL3Location(world.player, "Level 5 Boss", None, level5)) + if world.multiworld.goal[world.player] == 1: + level6.locations.append(KDL3Location(world.player, LocationName.boss_butch, None, level6)) + else: + level6.locations.append(KDL3Location(world.player, LocationName.hyper_zone, None, level6)) + tlv2 = Entrance(world.player, "To Level 2", level1) + level1.exits.append(tlv2) + tlv2.connect(level2) + tlv3 = Entrance(world.player, "To Level 3", level2) + level2.exits.append(tlv3) + tlv3.connect(level3) + tlv4 = Entrance(world.player, "To Level 4", level3) + level3.exits.append(tlv4) + tlv4.connect(level4) + tlv5 = Entrance(world.player, "To Level 5", level4) + level4.exits.append(tlv5) + tlv5.connect(level5) + tlv6 = Entrance(world.player, "To Level 6", level5) + level5.exits.append(tlv6) + tlv6.connect(level6) + world.multiworld.regions += [menu, level1, level2, level3, level4, level5, level6] diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 3a822f9d2fdf..17e70fa52485 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -34,6 +34,43 @@ ], } +level_pointers = { + 0x770001: 0x0084, + 0x770002: 0x009C, + 0x770003: 0x00B8, + 0x770004: 0x00D8, + 0x770005: 0x0104, + 0x770006: 0x0124, + 0x770007: 0x014C, + 0x770008: 0x0170, + 0x770009: 0x0190, + 0x77000A: 0x01B0, + 0x77000B: 0x01E8, + 0x77000C: 0x0218, + 0x77000D: 0x024C, + 0x77000E: 0x0270, + 0x77000F: 0x02A0, + 0x770010: 0x02C4, + 0x770011: 0x02EC, + 0x770012: 0x0314, + 0x770013: 0x03CC, + 0x770014: 0x0404, + 0x770015: 0x042C, + 0x770016: 0x044C, + 0x770017: 0x0478, + 0x770018: 0x049C, + 0x770019: 0x04E4, + 0x77001A: 0x0504, + 0x77001B: 0x0530, + 0x77001C: 0x0554, + 0x77001D: 0x05A8, + 0x77001E: 0x0640, + 0x770200: 0x0148, + 0x770201: 0x0248, + 0x770202: 0x03C8, + 0x770203: 0x04E0, + 0x770204: 0x06A4, +} class KDL3DeltaPatch(APDeltaPatch): hash = KDL3UHASH @@ -75,7 +112,7 @@ def handle_animal_friends(rom): rom.write_byte(address, 3) -def patch_rom(multiworld, player, rom, boss_requirements): +def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): # handle animal friends first handle_animal_friends(rom) @@ -106,6 +143,13 @@ def patch_rom(multiworld, player, rom, boss_requirements): rom.write_byte(0x3D010, multiworld.death_link[player].value) rom.write_byte(0x3D012, multiworld.goal[player].value) + for level in shuffled_levels: + for i in range(len(shuffled_levels[level])): + rom.write_bytes(0x3F002E + ((level - 1) * 14) + (i * 2), + struct.pack("H", level_pointers[shuffled_levels[level][i]])) + rom.write_bytes(0x3D020 + (level - 1) * 14 + (i * 2), + struct.pack("H", shuffled_levels[level][i] & 0x00FFFF)) + from Main import __version__ rom.name = bytearray(f'KDL3{__version__.replace(".", "")[0:3]}_{player}_{multiworld.seed:11}\0', 'utf8')[:21] rom.name.extend([0] * (21 - len(rom.name))) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index fbcf43eaff8d..959bd4121aa2 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -1,8 +1,9 @@ -from BaseClasses import Tutorial, ItemClassification, Entrance, Region, MultiWorld +from BaseClasses import Tutorial, ItemClassification, MultiWorld from worlds.AutoWorld import World, WebWorld from worlds.generic.Rules import set_rule, add_rule from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item from .Locations import location_table, KDL3Location, stage_locations +from .Regions import create_levels from .Options import kdl3_options from .Names import LocationName from .Rom import KDL3DeltaPatch, get_base_rom_path, RomData, patch_rom @@ -38,9 +39,12 @@ class KDL3World(World): option_definitions = kdl3_options item_name_to_id = {item: item_table[item].code for item in item_table} location_name_to_id = {location_table[location]: location for location in location_table} + item_name_groups = item_names data_version = 0 web = KDL3WebWorld() boss_requirements = dict() + player_levels = dict() + topology_present = False def __init__(self, world: MultiWorld, player: int): self.rom_name_available_event = threading.Event() @@ -52,63 +56,7 @@ def stage_assert_generate(cls, multiworld: MultiWorld) -> None: if not os.path.exists(rom_file): raise FileNotFoundError(f"Could not find base ROM for {cls.game}: {rom_file}") - def create_regions(self) -> None: - menu = Region("Menu", self.player, self.multiworld) - start = Entrance(self.player, "Start Game", menu) - menu.exits.append(start) - level1 = Region("Grass Land", self.player, self.multiworld) - level2 = Region("Ripple Field", self.player, self.multiworld) - level3 = Region("Sand Canyon", self.player, self.multiworld) - level4 = Region("Cloudy Park", self.player, self.multiworld) - level5 = Region("Iceberg", self.player, self.multiworld) - level6 = Region("Hyper Zone", self.player, self.multiworld) - start.connect(level1) - if False: # self.multiworld.level_shuffle[self.player].value != 0: - return - else: - for location in location_table: - if (location & 0x000200) == 0: - idx = location & 0x0000FF - if idx <= 6: - level1.locations.append(KDL3Location(self.player, location_table[location], location, level1)) - elif idx <= 12: - level2.locations.append(KDL3Location(self.player, location_table[location], location, level2)) - elif idx <= 18: - level3.locations.append(KDL3Location(self.player, location_table[location], location, level3)) - elif idx <= 24: - level4.locations.append(KDL3Location(self.player, location_table[location], location, level4)) - elif idx <= 30: - level5.locations.append(KDL3Location(self.player, location_table[location], location, level5)) - level1.locations.append(KDL3Location(self.player, LocationName.grass_land_whispy, 0x770200, level1)) - level2.locations.append(KDL3Location(self.player, LocationName.ripple_field_acro, 0x770201, level2)) - level3.locations.append(KDL3Location(self.player, LocationName.sand_canyon_poncon, 0x770202, level3)) - level4.locations.append(KDL3Location(self.player, LocationName.cloudy_park_ado, 0x770203, level4)) - level5.locations.append(KDL3Location(self.player, LocationName.iceberg_dedede, 0x770204, level5)) - level1.locations.append(KDL3Location(self.player, "Level 1 Boss", None, level1)) - level2.locations.append(KDL3Location(self.player, "Level 2 Boss", None, level2)) - level3.locations.append(KDL3Location(self.player, "Level 3 Boss", None, level3)) - level4.locations.append(KDL3Location(self.player, "Level 4 Boss", None, level4)) - level5.locations.append(KDL3Location(self.player, "Level 5 Boss", None, level5)) - if self.multiworld.goal[self.player] == 1: - level6.locations.append(KDL3Location(self.player, LocationName.boss_butch, None, level6)) - else: - level6.locations.append(KDL3Location(self.player, LocationName.hyper_zone, None, level6)) - tlv2 = Entrance(self.player, "To Level 2", level1) - level1.exits.append(tlv2) - tlv2.connect(level2) - tlv3 = Entrance(self.player, "To Level 3", level1) - level2.exits.append(tlv3) - tlv3.connect(level3) - tlv4 = Entrance(self.player, "To Level 4", level1) - level3.exits.append(tlv4) - tlv4.connect(level4) - tlv5 = Entrance(self.player, "To Level 5", level1) - level4.exits.append(tlv5) - tlv5.connect(level5) - tlv6 = Entrance(self.player, "To Level 6", level1) - level5.exits.append(tlv6) - tlv6.connect(level6) - self.multiworld.regions += [menu, level1, level2, level3, level4, level5, level6] + create_regions = create_levels def create_item(self, name: str, force_non_progression=False) -> KDL3Item: item = item_table[name] @@ -138,7 +86,10 @@ def create_items(self) -> None: for i in range(4): requirements.append(self.multiworld.per_slot_randoms[self.player].randint( min(3, required_heart_stars), required_heart_stars)) - self.multiworld.per_slot_randoms[self.player].shuffle(requirements) + if self.multiworld.boss_requirement_random[self.player].value: + self.multiworld.per_slot_randoms[self.player].shuffle(requirements) + else: + requirements.sort() self.boss_requirements[self.player] = requirements itempool.extend([self.create_item("Heart Star") for _ in range(required_heart_stars)]) itempool.extend([self.create_item(self.get_filler_item_name()) @@ -147,10 +98,19 @@ def create_items(self) -> None: self.multiworld.itempool += itempool def set_rules(self) -> None: - for stage in stage_locations: - set_rule(self.multiworld.get_location(stage_locations[stage], self.player), - lambda state, prev=stage - 1: True if prev == 0x770000 - else state.can_reach(stage_locations[prev], "Location", self.player)) + for level in range(1, len(self.player_levels[self.player]) + 1): + for stage in range(len(self.player_levels[self.player][level])): + if stage != 6: + set_rule( + self.multiworld.get_location(stage_locations[self.player_levels[self.player][level][stage]], + self.player), + lambda state, level=level, stage=stage: True if level == 1 and stage == 0 + else state.can_reach(stage_locations[self.player_levels[self.player][level - 1][5]], "Location", + self.player) + if stage == 0 + else state.can_reach( + stage_locations[self.player_levels[self.player][level][stage - 1]], "Location", + self.player)) # Level 1 set_rule(self.multiworld.get_location(LocationName.grass_land_muchi, self.player), @@ -160,7 +120,8 @@ def set_rules(self) -> None: set_rule(self.multiworld.get_location(LocationName.grass_land_mine, self.player), lambda state: state.has("Kine", self.player)) set_rule(self.multiworld.get_entrance("To Level 2", self.player), - lambda state: state.can_reach(LocationName.grass_land_6, "Location", self.player)) + lambda state: state.can_reach(stage_locations[self.player_levels[self.player][1][5]], "Location", + self.player)) # Level 2 add_rule(self.multiworld.get_location(LocationName.ripple_field_5, self.player), lambda state: state.has("Kine", self.player)) @@ -174,7 +135,8 @@ def set_rules(self) -> None: lambda state: state.has("Pitch", self.player) and state.has("Kine", self.player) and state.has("Burning", self.player) and state.has("Stone", self.player)) set_rule(self.multiworld.get_entrance("To Level 3", self.player), - lambda state: state.can_reach(LocationName.ripple_field_6, "Location", self.player)) + lambda state: state.can_reach(stage_locations[self.player_levels[self.player][2][5]], "Location", + self.player)) # Level 3 add_rule(self.multiworld.get_location(LocationName.sand_canyon_5, self.player), @@ -191,7 +153,8 @@ def set_rules(self) -> None: and (state.has("Ice", self.player) or state.has("Needle", self.player)) ) set_rule(self.multiworld.get_entrance("To Level 4", self.player), - lambda state: state.can_reach(LocationName.sand_canyon_6, "Location", self.player)) + lambda state: state.can_reach(stage_locations[self.player_levels[self.player][3][5]], "Location", + self.player)) # Level 4 set_rule(self.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, self.player), @@ -203,7 +166,8 @@ def set_rules(self) -> None: set_rule(self.multiworld.get_location(LocationName.cloudy_park_pick, self.player), lambda state: state.has("Rick", self.player)) set_rule(self.multiworld.get_entrance("To Level 5", self.player), - lambda state: state.can_reach(LocationName.cloudy_park_6, "Location", self.player)) + lambda state: state.can_reach(stage_locations[self.player_levels[self.player][4][5]], "Location", + self.player)) # Level 5 add_rule(self.multiworld.get_location(LocationName.iceberg_4, self.player), @@ -217,28 +181,38 @@ def set_rules(self) -> None: set_rule(self.multiworld.get_location(LocationName.iceberg_shiro, self.player), lambda state: state.has("Nago", self.player)) set_rule(self.multiworld.get_location(LocationName.iceberg_angel, self.player), - lambda state: state.has("Copy Ability", self.player, 8)) # easier than writing out 8 ands + lambda state: state.count_group("Copy Ability", self.player)) # easier than writing out 8 ands set_rule(self.multiworld.get_location("Level 1 Boss", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0])) + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0]) + and state.can_reach(stage_locations[self.player_levels[self.player][1][5]], "Location", self.player)) set_rule(self.multiworld.get_location(LocationName.grass_land_whispy, self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0])) + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0]) + and state.can_reach(stage_locations[self.player_levels[self.player][1][5]], "Location", self.player)) set_rule(self.multiworld.get_location("Level 2 Boss", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1])) + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1]) + and state.can_reach(stage_locations[self.player_levels[self.player][2][5]], "Location", self.player)) set_rule(self.multiworld.get_location(LocationName.ripple_field_acro, self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1])) + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1]) + and state.can_reach(stage_locations[self.player_levels[self.player][2][5]], "Location", self.player)) set_rule(self.multiworld.get_location("Level 3 Boss", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2])) + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2]) + and state.can_reach(stage_locations[self.player_levels[self.player][3][5]], "Location", self.player)) set_rule(self.multiworld.get_location(LocationName.sand_canyon_poncon, self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2])) + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2]) + and state.can_reach(stage_locations[self.player_levels[self.player][3][5]], "Location", self.player)) set_rule(self.multiworld.get_location("Level 4 Boss", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3])) + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3]) + and state.can_reach(stage_locations[self.player_levels[self.player][4][5]], "Location", self.player)) set_rule(self.multiworld.get_location(LocationName.cloudy_park_ado, self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3])) + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3]) + and state.can_reach(stage_locations[self.player_levels[self.player][4][5]], "Location", self.player)) set_rule(self.multiworld.get_location("Level 5 Boss", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][4])) + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][4]) + and state.can_reach(stage_locations[self.player_levels[self.player][5][5]], "Location", self.player)) set_rule(self.multiworld.get_location(LocationName.iceberg_dedede, self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][4])) + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][4]) + and state.can_reach(stage_locations[self.player_levels[self.player][5][5]], "Location", self.player)) set_rule(self.multiworld.get_entrance("To Level 6", self.player), lambda state: state.has("Level 1 Boss Purified", self.player) @@ -248,6 +222,7 @@ def set_rules(self) -> None: and state.has("Level 5 Boss Purified", self.player)) def generate_basic(self) -> None: + self.topology_present = self.multiworld.stage_shuffle[self.player].value > 0 goal = self.multiworld.goal[self.player].value goal_location = self.multiworld.get_location(LocationName.boss_butch, self.player) \ if goal == 1 else self.multiworld.get_location(LocationName.hyper_zone, self.player) @@ -271,7 +246,8 @@ def generate_output(self, output_directory: str): player = self.player rom = RomData(get_base_rom_path()) - patch_rom(self.multiworld, self.player, rom, self.boss_requirements[self.player]) + patch_rom(self.multiworld, self.player, rom, self.boss_requirements[self.player], + self.player_levels[self.player]) rompath = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") rom.write_to_file(rompath) From d9eda8f3250c7fe40ea5bb4f7e9e88c2fa7d27a8 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 16 Mar 2023 00:31:58 -0500 Subject: [PATCH 013/165] level shuffle and rudimentary palette support --- worlds/kdl3/Aesthetics.py | 26 +++++++++- worlds/kdl3/Client.py | 7 +-- worlds/kdl3/Names/LocationName.py | 10 ++-- worlds/kdl3/Options.py | 8 +++- worlds/kdl3/Regions.py | 14 ++++-- worlds/kdl3/Rom.py | 8 ++++ worlds/kdl3/__init__.py | 80 ++++++++++++++++++++----------- 7 files changed, 110 insertions(+), 43 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index 21c16f12ca14..c43bda29e257 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -21,13 +21,35 @@ } } +kirby_target_palettes = { + 0x1E007E: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0), + 0x1E00F6: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0), + 0x1E0216: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0), +} + + +def get_kirby_palette(multiworld, player): + palette = multiworld.kirby_flavor_preset[player].value + if palette in kirby_flavor_presets: + return kirby_flavor_presets[palette] + elif palette == 14: + return multiworld.kirby_flavor[player].value + else: + return None + def rgb888_to_bgr555(color: str) -> bytes: col = int(color, 16) red = (col & 0xFF0000) >> 19 green = (col & 0x00FF00) >> 11 blue = (col & 0x0000FF) >> 3 - print(red, green, blue) outcol = (blue << 10) + (green << 5) + red - print(hex(outcol)) return struct.pack("H", outcol) + + +def get_palette_bytes(palette, target, offset): + output_data = bytearray() + for color in target: + byte_data = rgb888_to_bgr555(str(hex(int(palette[color], 16) + offset))) + output_data.extend(bytearray(byte_data)) + return output_data diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 0df19871a1ae..f3e43a57d189 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -110,11 +110,12 @@ async def game_watcher(self, ctx) -> None: # level completion status world_unlocks = await snes_read(ctx, KDL3_WORLD_UNLOCK, 1) level_unlocks = await snes_read(ctx, KDL3_LEVEL_UNLOCK, 1) - current_world = world_unlocks[0] + current_world = world_unlocks[0] - 1 + current_level = level_unlocks[0] - 1 if world_unlocks[0] > 0x06: return # save is not loaded, ignore - for i in range(world_unlocks[0] + 1): - for j in range(7 if current_world > i else level_unlocks[0]): + for i in range(0, world_unlocks[0]): + for j in range(0, 6 if current_world > i else current_level): loc_id = 0x770000 + self.levels[i][j] if loc_id not in ctx.checked_locations: new_checks.append(loc_id) diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index 9a5991885ebb..7f95d00b0dad 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -95,9 +95,9 @@ # Boss Names boss_names = { - "Whispy Woods": 0x770200, - "Acro": 0x770201, - "Pon & Con": 0x770202, - "Ado": 0x770203, - "King Dedede": 0x770204 + "whispy woods": 0x770200, + "acro": 0x770201, + "pon & con": 0x770202, + "ado": 0x770203, + "king dedede": 0x770204 } \ No newline at end of file diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index e78beef029c0..7e92359d634f 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -70,7 +70,8 @@ def can_place_boss(cls, boss: str, location: str) -> bool: display_name = "Boss Shuffle" option_none = 0 option_shuffled = 1 - option_singularity = 2 + option_full = 2 + option_singularity = 3 class BossRequirementRandom(Toggle): @@ -118,12 +119,15 @@ class KirbyFlavorPreset(Choice): #option_orange = 11 #option_kiwi = 12 #option_lavender = 13 + option_custom = 14 default = 0 -# class KirbyFlavor(OptionDict): + +class KirbyFlavor(OptionDict): """ A custom color for Kirby. """ + default = {} class GooeyFlavorPreset(Choice): diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 98ad27b699bc..77965f4f764f 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -16,14 +16,15 @@ } first_stage_blacklist = { - 0x77000B, # 2-5 needs Kine - 0x770012, # 3-5 needs Cutter - 0x77001C, # 5-4 needs Burning + 0x77000B, # 2-5 needs Kine + 0x770012, # 3-5 needs Cutter + 0x77001C, # 5-4 needs Burning } + def generate_valid_level(level, stage, possible_stages, slot_random): new_stage = slot_random.choice(possible_stages) - if level == 1 and stage == 1 and new_stage in first_stage_blacklist: + if level == 1 and stage == 0 and new_stage in first_stage_blacklist: return generate_valid_level(level, stage, possible_stages, slot_random) else: return new_stage @@ -84,6 +85,11 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo loc, boss = option.split("-") levels[LocationName.level_names[loc]][6] = LocationName.boss_names[boss] plando_bosses.append(boss) + else: + for level in levels: + if levels[level][6] is None: + levels[level][6] = LocationName.boss_names[option] + plando_bosses.append(option) if boss_shuffle > 0: if boss_shuffle == 2: diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 17e70fa52485..391bcb491d31 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -4,6 +4,7 @@ import os import struct from worlds.Files import APDeltaPatch +from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette KDL3UHASH = "201e7658f6194458a3869dde36bf8ec2" @@ -156,6 +157,13 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): rom.write_bytes(0x7FC0, rom.name) rom.write_byte(0x7FD9, multiworld.game_language[player].value) + # handle palette + if multiworld.kirby_flavor_preset[player].value != 0: + for addr in kirby_target_palettes: + target = kirby_target_palettes[addr] + palette = get_kirby_palette(multiworld, player) + rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1])) + def get_base_rom_bytes(file_name: str = "") -> bytes: base_rom_bytes: Optional[bytes] = getattr(get_base_rom_bytes, "base_rom_bytes", None) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 959bd4121aa2..a777aedb9044 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -2,13 +2,14 @@ from worlds.AutoWorld import World, WebWorld from worlds.generic.Rules import set_rule, add_rule from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item -from .Locations import location_table, KDL3Location, stage_locations +from .Locations import location_table, KDL3Location, stage_locations, heart_star_locations from .Regions import create_levels from .Options import kdl3_options from .Names import LocationName from .Rom import KDL3DeltaPatch, get_base_rom_path, RomData, patch_rom from .Client import KDL3SNIClient +from typing import Dict import os import math import threading @@ -17,8 +18,9 @@ class KDL3WebWorld(WebWorld): theme = "party" + """ tutorials = [ - """ + Tutorial( "Multiworld Setup Guide", "A guide to setting up the Kirby's Dream Land 3 randomizer connected to an Archipelago Multiworld.", @@ -26,8 +28,8 @@ class KDL3WebWorld(WebWorld): "setup_en.md", "setup/en", ["Silvris"] - )""" - ] + ) + ]""" class KDL3World(World): @@ -111,76 +113,86 @@ def set_rules(self) -> None: else state.can_reach( stage_locations[self.player_levels[self.player][level][stage - 1]], "Location", self.player)) + set_rule( + self.multiworld.get_location( + heart_star_locations[self.player_levels[self.player][level][stage] + 0x100], self.player), + lambda state, level=level, stage=stage: True if level == 1 and stage == 0 + else state.can_reach(stage_locations[self.player_levels[self.player][level - 1][5]], "Location", + self.player) + if stage == 0 + else state.can_reach( + stage_locations[self.player_levels[self.player][level][stage - 1]], "Location", + self.player)) # Level 1 - set_rule(self.multiworld.get_location(LocationName.grass_land_muchi, self.player), + add_rule(self.multiworld.get_location(LocationName.grass_land_muchi, self.player), lambda state: state.has("ChuChu", self.player)) - set_rule(self.multiworld.get_location(LocationName.grass_land_chao, self.player), + add_rule(self.multiworld.get_location(LocationName.grass_land_chao, self.player), lambda state: state.has("Stone", self.player)) - set_rule(self.multiworld.get_location(LocationName.grass_land_mine, self.player), + add_rule(self.multiworld.get_location(LocationName.grass_land_mine, self.player), lambda state: state.has("Kine", self.player)) - set_rule(self.multiworld.get_entrance("To Level 2", self.player), + add_rule(self.multiworld.get_entrance("To Level 2", self.player), lambda state: state.can_reach(stage_locations[self.player_levels[self.player][1][5]], "Location", self.player)) # Level 2 add_rule(self.multiworld.get_location(LocationName.ripple_field_5, self.player), lambda state: state.has("Kine", self.player)) - set_rule(self.multiworld.get_location(LocationName.ripple_field_kamuribana, self.player), + add_rule(self.multiworld.get_location(LocationName.ripple_field_kamuribana, self.player), lambda state: state.has("Pitch", self.player) and state.has("Clean", self.player)) - set_rule(self.multiworld.get_location(LocationName.ripple_field_bakasa, self.player), + add_rule(self.multiworld.get_location(LocationName.ripple_field_bakasa, self.player), lambda state: state.has("Kine", self.player) and state.has("Parasol", self.player)) - set_rule(self.multiworld.get_location(LocationName.ripple_field_toad, self.player), + add_rule(self.multiworld.get_location(LocationName.ripple_field_toad, self.player), lambda state: state.has("Needle", self.player)) - set_rule(self.multiworld.get_location(LocationName.ripple_field_mama_pitch, self.player), + add_rule(self.multiworld.get_location(LocationName.ripple_field_mama_pitch, self.player), lambda state: state.has("Pitch", self.player) and state.has("Kine", self.player) and state.has("Burning", self.player) and state.has("Stone", self.player)) - set_rule(self.multiworld.get_entrance("To Level 3", self.player), + add_rule(self.multiworld.get_entrance("To Level 3", self.player), lambda state: state.can_reach(stage_locations[self.player_levels[self.player][2][5]], "Location", self.player)) # Level 3 add_rule(self.multiworld.get_location(LocationName.sand_canyon_5, self.player), lambda state: state.has("Cutter", self.player)) - set_rule(self.multiworld.get_location(LocationName.sand_canyon_auntie, self.player), + add_rule(self.multiworld.get_location(LocationName.sand_canyon_auntie, self.player), lambda state: state.has("Clean", self.player)) - set_rule(self.multiworld.get_location(LocationName.sand_canyon_nyupun, self.player), + add_rule(self.multiworld.get_location(LocationName.sand_canyon_nyupun, self.player), lambda state: state.has("ChuChu", self.player)) - set_rule(self.multiworld.get_location(LocationName.sand_canyon_rob, self.player), + add_rule(self.multiworld.get_location(LocationName.sand_canyon_rob, self.player), lambda state: (state.has("Kine", self.player) and state.has("Coo", self.player)) and state.has("Parasol", self.player) and state.has("Stone", self.player) and (state.has("Clean", self.player) or state.has("Spark", self.player)) and (state.has("Ice", self.player) or state.has("Needle", self.player)) ) - set_rule(self.multiworld.get_entrance("To Level 4", self.player), + add_rule(self.multiworld.get_entrance("To Level 4", self.player), lambda state: state.can_reach(stage_locations[self.player_levels[self.player][3][5]], "Location", self.player)) # Level 4 - set_rule(self.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, self.player), + add_rule(self.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, self.player), lambda state: state.has("Coo", self.player) and state.has("Clean", self.player)) - set_rule(self.multiworld.get_location(LocationName.cloudy_park_piyokeko, self.player), + add_rule(self.multiworld.get_location(LocationName.cloudy_park_piyokeko, self.player), lambda state: state.has("Needle", self.player)) - set_rule(self.multiworld.get_location(LocationName.cloudy_park_mikarin, self.player), + add_rule(self.multiworld.get_location(LocationName.cloudy_park_mikarin, self.player), lambda state: state.has("Coo", self.player)) - set_rule(self.multiworld.get_location(LocationName.cloudy_park_pick, self.player), + add_rule(self.multiworld.get_location(LocationName.cloudy_park_pick, self.player), lambda state: state.has("Rick", self.player)) - set_rule(self.multiworld.get_entrance("To Level 5", self.player), + add_rule(self.multiworld.get_entrance("To Level 5", self.player), lambda state: state.can_reach(stage_locations[self.player_levels[self.player][4][5]], "Location", self.player)) # Level 5 add_rule(self.multiworld.get_location(LocationName.iceberg_4, self.player), lambda state: state.has("Burning", self.player)) - set_rule(self.multiworld.get_location(LocationName.iceberg_kogoesou, self.player), + add_rule(self.multiworld.get_location(LocationName.iceberg_kogoesou, self.player), lambda state: state.has("Burning", self.player)) - set_rule(self.multiworld.get_location(LocationName.iceberg_samus, self.player), + add_rule(self.multiworld.get_location(LocationName.iceberg_samus, self.player), lambda state: state.has("Ice", self.player)) - set_rule(self.multiworld.get_location(LocationName.iceberg_name, self.player), + add_rule(self.multiworld.get_location(LocationName.iceberg_name, self.player), lambda state: state.has("Coo", self.player) and state.has("Burning", self.player)) - set_rule(self.multiworld.get_location(LocationName.iceberg_shiro, self.player), + add_rule(self.multiworld.get_location(LocationName.iceberg_shiro, self.player), lambda state: state.has("Nago", self.player)) - set_rule(self.multiworld.get_location(LocationName.iceberg_angel, self.player), + add_rule(self.multiworld.get_location(LocationName.iceberg_angel, self.player), lambda state: state.count_group("Copy Ability", self.player)) # easier than writing out 8 ands set_rule(self.multiworld.get_location("Level 1 Boss", self.player), @@ -271,3 +283,17 @@ def modify_multidata(self, multidata: dict): if rom_name: new_name = base64.b64encode(bytes(self.rom_name)).decode() multidata["connect_names"][new_name] = multidata["connect_names"][self.multiworld.player_name[self.player]] + + def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): + if self.topology_present: + regions = {LocationName.level_names[level]: level for level in LocationName.level_names} + level_hint_data = {} + for level in self.player_levels[self.player]: + for i in range(len(self.player_levels[self.player][level]) - 1): + stage = self.player_levels[self.player][level][i] + level_hint_data[stage] = regions[level] + f" {i + 1}" + if stage & 0x200 == 0: + level_hint_data[stage + 0x100] = regions[level] + f" {i + 1}" + for i in range(5): + level_hint_data[0x770200 + i] = regions[i+1] + " Boss" + hint_data[self.player] = level_hint_data From 0090587e5753f36d40134c7759a868fc8a1e68f4 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 16 Mar 2023 00:50:02 -0500 Subject: [PATCH 014/165] webhost cleanup, re-enable custom palettes --- worlds/kdl3/Options.py | 3 ++- worlds/kdl3/__init__.py | 2 +- worlds/kdl3/docs/en_Kirby's Dream Land 3.md | 27 +++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 worlds/kdl3/docs/en_Kirby's Dream Land 3.md diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 7e92359d634f..782df500bb68 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -95,6 +95,7 @@ class FillerPercentage(Range): """ Percentage of non-required Heart Stars to be converted to filler items (1-Ups, Maxim Tomatoes, Invincibility Candy). """ + display_name = "Filler Percentage" range_start = 0 range_end = 100 default = 50 @@ -163,6 +164,6 @@ class GooeyFlavorPreset(Choice): "boss_shuffle": BossShuffle, "boss_requirement_random": BossRequirementRandom, "kirby_flavor_preset": KirbyFlavorPreset, - # "kirby_flavor": KirbyFlavor, + "kirby_flavor": KirbyFlavor, "gooey_flavor_preset": GooeyFlavorPreset, } diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index a777aedb9044..529d811dc26e 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -17,7 +17,7 @@ class KDL3WebWorld(WebWorld): - theme = "party" + theme = "partyTime" """ tutorials = [ diff --git a/worlds/kdl3/docs/en_Kirby's Dream Land 3.md b/worlds/kdl3/docs/en_Kirby's Dream Land 3.md new file mode 100644 index 000000000000..d2aebb607883 --- /dev/null +++ b/worlds/kdl3/docs/en_Kirby's Dream Land 3.md @@ -0,0 +1,27 @@ +# Kirby's Dream Land 3 + +## 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? +Kirby will be unable to absorb Copy Abilities and meet up with his animal friends until they are sent to him. Items such +as Heart Stars, 1-Ups, and Invincibility Candy will be shuffled into the pool for Kirby to receive. + +## What is considered a location check in Kirby's Dream Land 3? +- Completing a stage for the first time +- Completing the given task of a stage and receiving a Heart Star +- Purifying a boss after acquiring a certain number of Heart Stars + (indicated by their portrait flashing in the level select) + +## When the player receives an item, what happens? +Kirby will immediately receive the effects of that item, such as being able to receive Copy Abilities from enemies that +give said Copy Ability. Animal Friends will require leaving the room you are currently in before they will appear. + +## What is the goal of Kirby's Dream Land 3? +Under the Zero goal, players must collect enough Heart Stars to purify the five bosses and gain access to the Hyper Zone, +where Zero can be found and defeated. + +Under the Boss Butch goal, players must collect enough Heart Stars to purify the five bosses, defeat Zero in the Hyper Zone, +and then complete the Boss Butch game mode accessible from the main menu. From 9babd71d4ad29a11e0635095b6d008f18dc6ff73 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 16 Mar 2023 01:06:33 -0500 Subject: [PATCH 015/165] bad option title, fix pattern shuffle --- worlds/kdl3/Names/LocationName.py | 10 +++++----- worlds/kdl3/Options.py | 2 +- worlds/kdl3/Regions.py | 4 +++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index 7f95d00b0dad..9a5991885ebb 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -95,9 +95,9 @@ # Boss Names boss_names = { - "whispy woods": 0x770200, - "acro": 0x770201, - "pon & con": 0x770202, - "ado": 0x770203, - "king dedede": 0x770204 + "Whispy Woods": 0x770200, + "Acro": 0x770201, + "Pon & Con": 0x770202, + "Ado": 0x770203, + "King Dedede": 0x770204 } \ No newline at end of file diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 782df500bb68..052c03a6e7df 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -29,7 +29,7 @@ class HeartStarsRequired(Range): Percentage of heart stars required to purify the five bosses and reach Zero. Each boss will require a differing amount of heart stars to purify. """ - display_name = "Max Heart Stars" + display_name = "Required Heart Stars" range_start = 1 range_end = 100 default = 50 diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 77965f4f764f..f3eb5111a56e 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -63,7 +63,7 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo if levels[level][stage] is None: stage_candidates = [candidate for candidate in possible_stages if (enforce_world and candidate in default_levels[level]) - or (enforce_pattern and candidate % 6 == (stage if stage > 6 else 0)) + or (enforce_pattern and candidate % 6 == stage) or (enforce_pattern == enforce_world) ] new_stage = generate_valid_level(level, stage, stage_candidates, @@ -83,6 +83,8 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo for option in options: if "-" in option: loc, boss = option.split("-") + loc = loc.title() + boss = boss.title() levels[LocationName.level_names[loc]][6] = LocationName.boss_names[boss] plando_bosses.append(boss) else: From 69bf3483d3fcc213942d41a5ff94be4c70a59ce9 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 18 Mar 2023 21:58:12 -0500 Subject: [PATCH 016/165] add marshmallow, add sfx on received item, boss plando fix --- worlds/kdl3/Aesthetics.py | 28 +++++++++++++--- worlds/kdl3/Client.py | 68 ++++++++++++++++++++++++++------------- worlds/kdl3/Regions.py | 3 +- worlds/kdl3/Rom.py | 9 +++++- 4 files changed, 78 insertions(+), 30 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index c43bda29e257..56a60f3ebd39 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -18,13 +18,31 @@ "13": "9494ea", "14": "f6f6fd", "15": "3139b6", + }, + 8: { + "1": "a6a6a6", + "2": "e6e6e6", + "3": "bcbcbc", + "4": "848484", + "5": "ececec", + "6": "b5b5b5", + "7": "848484", + "8": "646464", + "9": "d6d6d6", + "10": "525252", + "11": "c6c6c6", + "12": "737373", + "13": "949494", + "14": "f6f6f6", + "15": "545454", } } kirby_target_palettes = { - 0x1E007E: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0), - 0x1E00F6: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0), - 0x1E0216: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0), + 0x1E007E: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 1), + 0x1E009C: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 0.5), + 0x1E00F6: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 1), + 0x1E0216: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 1), } @@ -47,9 +65,9 @@ def rgb888_to_bgr555(color: str) -> bytes: return struct.pack("H", outcol) -def get_palette_bytes(palette, target, offset): +def get_palette_bytes(palette, target, offset, factor): output_data = bytearray() for color in target: - byte_data = rgb888_to_bgr555(str(hex(int(palette[color], 16) + offset))) + byte_data = rgb888_to_bgr555(str(hex(int(int(palette[color], 16) * factor) + offset))) output_data.extend(bytearray(byte_data)) return output_data diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index f3e43a57d189..81298beb0951 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -24,6 +24,7 @@ KDL3_GAME_SAVE = SRAM_1_START + 0x3617 KDL3_LIFE_COUNT = SRAM_1_START + 0x39CF KDL3_KIRBY_HP = SRAM_1_START + 0x39D1 +KDL3_LIFE_VISUAL = SRAM_1_START + 0x39E3 KDL3_HEART_STARS = SRAM_1_START + 0x53A7 KDL3_WORLD_UNLOCK = SRAM_1_START + 0x53CB KDL3_LEVEL_UNLOCK = SRAM_1_START + 0x53CD @@ -32,6 +33,7 @@ KDL3_BOSS_BUTCH_STATUS = SRAM_1_START + 0x5EEA KDL3_CURRENT_BGM = SRAM_1_START + 0x733E KDL3_ABILITY_ARRAY = SRAM_1_START + 0x7F50 +KDL3_SOUND_FX = SRAM_1_START + 0x7F62 KDL3_RECV_COUNT = SRAM_1_START + 0x7F70 KDL3_HEART_STAR_COUNT = SRAM_1_START + 0x7F80 @@ -41,6 +43,7 @@ class KDL3SNIClient(SNIClient): latest_world = 0x01 latest_level = 0x01 levels = None + item_queue = [] async def deathlink_kill_player(self, ctx) -> None: from SNIClient import DeathState, snes_buffered_write, snes_flush_writes, snes_read @@ -74,6 +77,39 @@ async def validate_rom(self, ctx) -> bool: return True + async def pop_item(self, ctx): + from SNIClient import snes_buffered_write, snes_read + if len(self.item_queue) > 0: + item = self.item_queue.pop() + # special handling for the remaining three + item = item.item & 0x00000F + if item == 0: + # Heart Star + heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 1) + snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", heart_star_count[0] + 1)) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x16])) + elif item == 1: + # 1-Up + life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 1) + life_bytes = pack("H", life_count[0] + 1) + snes_buffered_write(ctx, KDL3_LIFE_COUNT, life_bytes) + snes_buffered_write(ctx, KDL3_LIFE_VISUAL, life_bytes) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x33])) + elif item == 2: + # Maxim Tomato + # Check for Gooey + gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) + if gooey_hp[0] > 0x00: + snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x08])) + snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, bytes([0x08])) + else: + snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x0A])) + elif item == 3: + # Invincibility Candy + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) + snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x75, 0x03])) + async def game_watcher(self, ctx) -> None: from SNIClient import snes_buffered_write, snes_flush_writes, snes_read halken = await snes_read(ctx, WRAM_START, 6) @@ -158,6 +194,11 @@ async def game_watcher(self, ctx) -> None: await ctx.send_msgs([{"cmd": 'LocationChecks', "locations": [new_check_id]}]) # KDL3_TODO: make the game show items received visually + + if game_state[0] != 0xFF: + await self.pop_item(ctx) + + from .Rom import animal_friends recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 1) recv_amount = recv_count[0] if recv_amount < len(ctx.items_received): @@ -169,35 +210,16 @@ async def game_watcher(self, ctx) -> None: ctx.location_names[item.location], recv_amount, len(ctx.items_received))) snes_buffered_write(ctx, KDL3_RECV_COUNT, pack("H", recv_amount)) - from .Rom import animal_friends if item.item & 0x000030 == 0: ability = item.item & 0x00000F snes_buffered_write(ctx, KDL3_ABILITY_ARRAY + (ability * 2), pack("H", ability)) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) elif item.item & 0x000010 > 0: friend = item.item + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) for addr in animal_friends[friend]: snes_buffered_write(ctx, ROM_START + addr, bytes([0x02])) else: - # special handling for the remaining three - item = item.item & 0x00000F - if item == 0: - # Heart Star - heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 1) - snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", heart_star_count[0] + 1)) - elif item == 1: - # 1-Up - life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 1) - snes_buffered_write(ctx, KDL3_LIFE_COUNT, pack("H", life_count[0] + 1)) - elif item == 2: - # Maxim Tomato - # Check for Gooey - gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) - if gooey_hp[0] > 0x00: - snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x08])) - snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, bytes([0x08])) - else: - snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x0A])) - elif item == 3: - # Invincibility Candy - snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x75, 0x03])) + self.item_queue.append(item) + await snes_flush_writes(ctx) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index f3eb5111a56e..e5d665771849 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -88,6 +88,7 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo levels[LocationName.level_names[loc]][6] = LocationName.boss_names[boss] plando_bosses.append(boss) else: + option = option.title() for level in levels: if levels[level][6] is None: levels[level][6] = LocationName.boss_names[option] @@ -134,7 +135,7 @@ def create_levels(world: World) -> None: 5: level5, } start.connect(level1) - level_shuffle = world.multiworld.stage_shuffle[world.player].value + level_shuffle = world.multiworld.stage_shuffle[world.player] if level_shuffle != 0: world.player_levels[world.player] = generate_valid_levels( world, diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 391bcb491d31..bceab27f5258 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -136,6 +136,13 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xBF, 0x00, 0xD0, 0x07, 0xCD, 0x80, 0x7F, 0x10, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) + # Check for Sound on Main Loop + rom.write_bytes(0x6AE4, [0x22, 0x00, 0x9B, 0x07, 0xEA]) + + # Play Sound Effect at given address + rom.write_bytes(0x39B00, [0x85, 0xD4, 0xEE, 0x24, 0x35, 0xEA, 0xAD, 0x62, 0x7F, 0xF0, 0x07, 0x22, 0x27, 0xD9, + 0x00, 0x9C, 0x62, 0x7F, 0x6B]) + # base patch done, write relevant slot info # boss requirements @@ -162,7 +169,7 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): for addr in kirby_target_palettes: target = kirby_target_palettes[addr] palette = get_kirby_palette(multiworld, player) - rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1])) + rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1], target[2])) def get_base_rom_bytes(file_name: str = "") -> bytes: From d3977bacc2eefaca6b1fe8535f25b841cc2ed44a Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 20 Mar 2023 00:15:56 -0500 Subject: [PATCH 017/165] dedede fix, hs graphic fix attempt 1 --- worlds/kdl3/Aesthetics.py | 2 +- worlds/kdl3/Options.py | 2 +- worlds/kdl3/Rom.py | 45 +++++++++++++++++++++++++++++++++++---- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index 56a60f3ebd39..e83312b0c4b6 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -24,7 +24,7 @@ "2": "e6e6e6", "3": "bcbcbc", "4": "848484", - "5": "ececec", + "5": "909090", "6": "b5b5b5", "7": "848484", "8": "646464", diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 052c03a6e7df..8954239e4bc1 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -114,7 +114,7 @@ class KirbyFlavorPreset(Choice): #option_lime = 5 #option_grape = 6 #option_chocolate = 7 - #option_marshmallow = 8 + option_marshmallow = 8 #option_licorice = 9 #option_watermelon = 10 #option_orange = 11 diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index bceab27f5258..045700d9b2d8 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -118,9 +118,30 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): handle_animal_friends(rom) # Copy Ability - rom.write_bytes(0x399A0, [0xB9, 0xF3, 0x54, 0x48, 0x0A, 0xAA, 0x68, 0xDD, 0x50, 0x7F, 0xEA, 0xEA, 0xF0, 0x03, 0xA9, - 0x00, 0x00, 0x99, 0xA9, 0x54, 0x6B, 0xEA, 0xEA, 0xEA, 0xEA, 0x48, 0x0A, 0xA8, 0x68, 0xD9, 0x50, 0x7F, - 0xEA, 0xF0, 0x03, 0xA9, 0x00, 0x00, 0x9D, 0xA9, 0x54, 0x9D, 0xDF, 0x39, 0x6B, ]) + rom.write_bytes(0x399A0, [0xB9, 0xF3, 0x54, # LDA $54F3 + 0x48, # PHA + 0x0A, # ASL + 0xAA, # TAX + 0x68, # PLA + 0xDD, 0x50, 0x7F, # CMP $7F50, X + 0xEA, 0xEA, # NOP NOP + 0xF0, 0x03, # BEQ $0799B1 + 0xA9, 0x00, 0x00, # LDA #$0000 + 0x99, 0xA9, 0x54, # STA $54A9, Y + 0x6B, # RET + 0xEA, 0xEA, 0xEA, 0xEA, # NOPs to fill gap + 0x48, # PHA + 0x0A, # ASL + 0xA8, # TAX + 0x68, # PLA + 0xD9, 0x50, 0x7F, # CMP $7F50, Y + 0xEA, # NOP + 0xF0, 0x03, # BEQ $0799C6 + 0xA9, 0x00, 0x00, # LDA #$0000 + 0x9D, 0xA9, 0x54, # STA $54A9, X + 0x9D, 0xDF, 0x39, # STA $39DF, X + 0x6B, # RET + ]) # Kirby/Gooey Copy Ability rom.write_bytes(0xAFC8, [0x22, 0x00, 0x9A, 0x07, @@ -143,6 +164,19 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): rom.write_bytes(0x39B00, [0x85, 0xD4, 0xEE, 0x24, 0x35, 0xEA, 0xAD, 0x62, 0x7F, 0xF0, 0x07, 0x22, 0x27, 0xD9, 0x00, 0x9C, 0x62, 0x7F, 0x6B]) + # Dedede - Remove bad ending + rom.write_byte(0xB013, 0x38) # Change CLC to SEC + + # Heart Star Graphics Fix + rom.write_bytes(0x39B50, [0xDA, 0x5A, 0xAE, 0x3F, 0x36, 0xAC, 0x41, 0x36, 0xE0, 0x00, 0x00, 0xF0, 0x09, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0xCA, 0x80, 0xF2, 0xC0, 0x00, 0x00, 0xF0, 0x04, 0x1A, 0x88, 0x80, + 0xF7, 0x0A, 0xAA, 0xBF, 0x80, 0xD0, 0x07, 0xC9, 0x03, 0x00, 0xF0, 0x03, 0x18, 0x80, 0x01, + 0x38, 0x7A, 0xFA, 0x6B, ]) + + # Reroute Heart Star Graphic Check + rom.write_bytes(0x4A01F, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0xB0, ]) # 1-Ups + rom.write_bytes(0x4A0AE, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0x90, ]) # Heart Stars + # base patch done, write relevant slot info # boss requirements @@ -157,6 +191,9 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): struct.pack("H", level_pointers[shuffled_levels[level][i]])) rom.write_bytes(0x3D020 + (level - 1) * 14 + (i * 2), struct.pack("H", shuffled_levels[level][i] & 0x00FFFF)) + if (i == 0) or (i > 0 and i % 6 != 0): + rom.write_bytes(0x3D080 + (level - 1) * 12 + (i * 2), + struct.pack("H", (shuffled_levels[level][i] & 0x00FFFF) % 6)) from Main import __version__ rom.name = bytearray(f'KDL3{__version__.replace(".", "")[0:3]}_{player}_{multiworld.seed:11}\0', 'utf8')[:21] @@ -165,7 +202,7 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): rom.write_byte(0x7FD9, multiworld.game_language[player].value) # handle palette - if multiworld.kirby_flavor_preset[player].value != 0: + if multiworld.kirby_flavor_preset[player] != 0: for addr in kirby_target_palettes: target = kirby_target_palettes[addr] palette = get_kirby_palette(multiworld, player) From f2b58f7608b72c8416f9da1796befa5e38742001 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 21 Mar 2023 21:33:15 -0500 Subject: [PATCH 018/165] 3-5 logic fix --- worlds/kdl3/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 529d811dc26e..e5d88454070b 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -156,7 +156,7 @@ def set_rules(self) -> None: add_rule(self.multiworld.get_location(LocationName.sand_canyon_auntie, self.player), lambda state: state.has("Clean", self.player)) add_rule(self.multiworld.get_location(LocationName.sand_canyon_nyupun, self.player), - lambda state: state.has("ChuChu", self.player)) + lambda state: state.has("ChuChu", self.player) and state.has("Cutter", self.player)) add_rule(self.multiworld.get_location(LocationName.sand_canyon_rob, self.player), lambda state: (state.has("Kine", self.player) and state.has("Coo", self.player)) and state.has("Parasol", self.player) From 87458b2b17b383d3408fc16605d6a3a4dab3728b Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 24 Mar 2023 21:15:20 -0500 Subject: [PATCH 019/165] fix pattern, support JP rom --- worlds/kdl3/Regions.py | 2 +- worlds/kdl3/Rom.py | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index e5d665771849..267a97a8c372 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -63,7 +63,7 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo if levels[level][stage] is None: stage_candidates = [candidate for candidate in possible_stages if (enforce_world and candidate in default_levels[level]) - or (enforce_pattern and candidate % 6 == stage) + or (enforce_pattern and ((candidate - 1) & 0x00FFFF) % 6 == stage) or (enforce_pattern == enforce_world) ] new_stage = generate_valid_level(level, stage, stage_candidates, diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 045700d9b2d8..3a649004992c 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -7,6 +7,7 @@ from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette KDL3UHASH = "201e7658f6194458a3869dde36bf8ec2" +KDL3JHASH = "b2f2d004ea640c3db66df958fce122b2" animal_friends = { # individual spawn addresses for each animal friend 0x770010: [ # Rick @@ -73,8 +74,9 @@ 0x770204: 0x06A4, } + class KDL3DeltaPatch(APDeltaPatch): - hash = KDL3UHASH + hash = {KDL3UHASH, KDL3JHASH} game = "Kirby's Dream Land 3" patch_file_ending = ".apkdl3" @@ -85,7 +87,7 @@ def get_source_data(cls) -> bytes: class RomData: def __init__(self, file, name=None): - self.file = bytes() + self.file = bytearray() self.read_from_file(file) self.name = name @@ -217,8 +219,8 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: basemd5 = hashlib.md5() basemd5.update(base_rom_bytes) - if KDL3UHASH != basemd5.hexdigest(): - raise Exception("Supplied Base Rom does not match known MD5 for US release. " + if basemd5.hexdigest() not in {KDL3UHASH, KDL3JHASH}: + raise Exception("Supplied Base Rom does not match known MD5 for US or JP release. " "Get the correct game and version, then dump it") get_base_rom_bytes.base_rom_bytes = base_rom_bytes return base_rom_bytes From 4335f924ca06399bae95843907a703c5a2ac67b6 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 25 Mar 2023 15:40:39 -0500 Subject: [PATCH 020/165] fix gen, ensure Nago can be reached before 5-5 HS in logic --- worlds/kdl3/Rom.py | 2 +- worlds/kdl3/__init__.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 3a649004992c..51f4e34092c3 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -76,7 +76,7 @@ class KDL3DeltaPatch(APDeltaPatch): - hash = {KDL3UHASH, KDL3JHASH} + hash = [KDL3UHASH, KDL3JHASH] game = "Kirby's Dream Land 3" patch_file_ending = ".apkdl3" diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index e5d88454070b..c40446116955 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -191,7 +191,21 @@ def set_rules(self) -> None: add_rule(self.multiworld.get_location(LocationName.iceberg_name, self.player), lambda state: state.has("Coo", self.player) and state.has("Burning", self.player)) add_rule(self.multiworld.get_location(LocationName.iceberg_shiro, self.player), - lambda state: state.has("Nago", self.player)) + lambda state: state.has("Nago", self.player) and + (state.can_reach(LocationName.grass_land_1, "Location", self.player) + or state.can_reach(LocationName.grass_land_5, "Location", self.player) + or state.can_reach(LocationName.grass_land_6, "Location", self.player) + or state.can_reach(LocationName.ripple_field_1, "Location", self.player) + or state.can_reach(LocationName.ripple_field_4, "Location", self.player) + or state.can_reach(LocationName.ripple_field_6, "Location", self.player) + or state.can_reach(LocationName.sand_canyon_4, "Location", self.player) + or state.can_reach(LocationName.sand_canyon_6, "Location", self.player) + or state.can_reach(LocationName.cloudy_park_1, "Location", self.player) + or state.can_reach(LocationName.cloudy_park_2, "Location", self.player) + or state.can_reach(LocationName.cloudy_park_6, "Location", self.player) + or state.can_reach(LocationName.iceberg_2, "Location", self.player) + or state.can_reach(LocationName.iceberg_3, "Location", self.player) + or state.can_reach(LocationName.iceberg_6, "Location", self.player))) add_rule(self.multiworld.get_location(LocationName.iceberg_angel, self.player), lambda state: state.count_group("Copy Ability", self.player)) # easier than writing out 8 ands From 5a9d778cbc819db717ef75670f10eb3951c33534 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 25 Mar 2023 20:11:21 -0500 Subject: [PATCH 021/165] add placeholder setup guide, fix webhost not showing game info --- worlds/kdl3/__init__.py | 21 ++++++++++----------- worlds/kdl3/docs/en_Kirby's Dream Land 3.md | 2 +- worlds/kdl3/docs/setup_en.md | 1 + 3 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 worlds/kdl3/docs/setup_en.md diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index c40446116955..b27371272f6d 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -18,18 +18,17 @@ class KDL3WebWorld(WebWorld): theme = "partyTime" - """ tutorials = [ - - Tutorial( - "Multiworld Setup Guide", - "A guide to setting up the Kirby's Dream Land 3 randomizer connected to an Archipelago Multiworld.", - "English", - "setup_en.md", - "setup/en", - ["Silvris"] - ) - ]""" + + #Tutorial( + # "Multiworld Setup Guide", + # "A guide to setting up the Kirby's Dream Land 3 randomizer connected to an Archipelago Multiworld.", + # "English", + # "setup_en.md", + # "setup/en", + # ["Silvris"] + #) + ] class KDL3World(World): diff --git a/worlds/kdl3/docs/en_Kirby's Dream Land 3.md b/worlds/kdl3/docs/en_Kirby's Dream Land 3.md index d2aebb607883..7437e66e5dc1 100644 --- a/worlds/kdl3/docs/en_Kirby's Dream Land 3.md +++ b/worlds/kdl3/docs/en_Kirby's Dream Land 3.md @@ -16,7 +16,7 @@ as Heart Stars, 1-Ups, and Invincibility Candy will be shuffled into the pool fo (indicated by their portrait flashing in the level select) ## When the player receives an item, what happens? -Kirby will immediately receive the effects of that item, such as being able to receive Copy Abilities from enemies that +A sound effect will play, and Kirby will immediately receive the effects of that item, such as being able to receive Copy Abilities from enemies that give said Copy Ability. Animal Friends will require leaving the room you are currently in before they will appear. ## What is the goal of Kirby's Dream Land 3? diff --git a/worlds/kdl3/docs/setup_en.md b/worlds/kdl3/docs/setup_en.md new file mode 100644 index 000000000000..fe29a13f6820 --- /dev/null +++ b/worlds/kdl3/docs/setup_en.md @@ -0,0 +1 @@ +Placeholder Text \ No newline at end of file From c089927844e32af230859ac6f3262cec29b102a1 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 29 Mar 2023 00:09:03 -0500 Subject: [PATCH 022/165] move to 0xffff bwram, correct invin time --- worlds/kdl3/Client.py | 2 +- worlds/kdl3/Rom.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 81298beb0951..f6c0904b0396 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -108,7 +108,7 @@ async def pop_item(self, ctx): elif item == 3: # Invincibility Candy snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) - snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x75, 0x03])) + snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x84, 0x03])) async def game_watcher(self, ctx) -> None: from SNIClient import snes_buffered_write, snes_flush_writes, snes_read diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 51f4e34092c3..742d80d7f75b 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -116,6 +116,12 @@ def handle_animal_friends(rom): def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): + # increase BWRAM by 0x8000 + rom.write_byte(0x7FD8, 0x06) + + # initialize new BWRAM size + rom.write_bytes(0x36, [0xA9, 0xFD, 0x9F]) + # handle animal friends first handle_animal_friends(rom) @@ -179,6 +185,9 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): rom.write_bytes(0x4A01F, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0xB0, ]) # 1-Ups rom.write_bytes(0x4A0AE, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0x90, ]) # Heart Stars + # Write checks for 1up-sanity + # rom.write_bytes(0x30037 + # base patch done, write relevant slot info # boss requirements From 5e11827db736077aa75e08116261d94ed771ea2a Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 29 Mar 2023 01:31:50 -0500 Subject: [PATCH 023/165] tentative animal friends rewrite --- worlds/kdl3/Client.py | 7 +++---- worlds/kdl3/Rom.py | 44 ++++++++----------------------------------- 2 files changed, 11 insertions(+), 40 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index f6c0904b0396..eaec7c8776d3 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -36,6 +36,7 @@ KDL3_SOUND_FX = SRAM_1_START + 0x7F62 KDL3_RECV_COUNT = SRAM_1_START + 0x7F70 KDL3_HEART_STAR_COUNT = SRAM_1_START + 0x7F80 +KDL3_ANIMAL_FRIENDS = SRAM_1_START + 0x8000 class KDL3SNIClient(SNIClient): @@ -198,7 +199,6 @@ async def game_watcher(self, ctx) -> None: if game_state[0] != 0xFF: await self.pop_item(ctx) - from .Rom import animal_friends recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 1) recv_amount = recv_count[0] if recv_amount < len(ctx.items_received): @@ -215,10 +215,9 @@ async def game_watcher(self, ctx) -> None: snes_buffered_write(ctx, KDL3_ABILITY_ARRAY + (ability * 2), pack("H", ability)) snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) elif item.item & 0x000010 > 0: - friend = item.item + friend = (item.item & 0x00000F) snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) - for addr in animal_friends[friend]: - snes_buffered_write(ctx, ROM_START + addr, bytes([0x02])) + snes_buffered_write(ctx, KDL3_ANIMAL_FRIENDS + (friend << 1), bytes([friend + 1])) else: self.item_queue.append(item) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 742d80d7f75b..e48c87e1d69f 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -9,33 +9,6 @@ KDL3UHASH = "201e7658f6194458a3869dde36bf8ec2" KDL3JHASH = "b2f2d004ea640c3db66df958fce122b2" -animal_friends = { # individual spawn addresses for each animal friend - 0x770010: [ # Rick - 2960854, 2973713, 3047772, 3109906, 3072123, 2971412, 3164056, 2956485, 3057740, 2977125, - 3078359, 2994412, 3604390, 3132841, 3068643, 3038404, 3072609, 3022489, 3015498, 3197815 - ], - 0x770011: [ # Kine - 2979317, 2966655, 3084295, 3072115, 3042583, 3026835, 3207394, 2977117, 3039009, 2994404, 3038412, 3022481, - 3040192, 3198638 - ], - 0x770012: [ # Coo - 2979325, 2966663, 3023113, 3109914, 2954719, 2952942, 2965879, 2977109, 3039001, 3075075, 3604398, 3132833, - 3019973, 3370321, 3070133, 3040200, 3197823 - ], - 0x770013: [ # Nago - 2960846, 3043722, 2973705, 3023105, 2956052, 3042591, 2971396, 2956501, 2976367, 3063027, 2984649, 3132825, - 3058280, 3019981, 3197831 - ], - 0x770014: [ # ChuChu - 3059881, 3043714, 3047780, 3084303, 3042575, 2952934, 2965887, 3044296, 2976359, 2954276, 2984665, 2994420, - 3075091, 3370313, 3026223, 3015506, 3198646 - ], - 0x770015: [ # Pitch - 3059889, 2956044, 3044878, 2971404, 3164064, 2965871, 2956493, 2976375, 3078817, 2984657, 3068635, 3058288, - 3019965, 3370329, 3026215, 3198654 - ], -} - level_pointers = { 0x770001: 0x0084, 0x770002: 0x009C, @@ -109,21 +82,13 @@ def read_from_file(self, file): self.file = bytearray(stream.read()) -def handle_animal_friends(rom): - for friend in animal_friends: - for address in animal_friends[friend]: - rom.write_byte(address, 3) - def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): # increase BWRAM by 0x8000 rom.write_byte(0x7FD8, 0x06) # initialize new BWRAM size - rom.write_bytes(0x36, [0xA9, 0xFD, 0x9F]) - - # handle animal friends first - handle_animal_friends(rom) + rom.write_bytes(0x36, [0xA9, 0xFD, 0x9F, ]) # Copy Ability rom.write_bytes(0x399A0, [0xB9, 0xF3, 0x54, # LDA $54F3 @@ -158,6 +123,13 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): # Animal Copy Ability rom.write_bytes(0x507E8, [0x22, 0xB9, 0x99, 0x07, 0xEA, 0xEA, ]) + # Entity Spawn + rom.write_bytes(0x21CD7, [0x22, 0x00, 0x9D, 0x07, ]) + + # Check Spawn Animal + rom.write_bytes(0x39D00, [0x48, 0xE0, 0x02, 0x00, 0xD0, 0x0C, 0xEB, 0x48, 0x0A, 0xA8, 0x68, 0x1A, 0xD9, 0x00, 0x80, + 0xF0, 0x01, 0xE8, 0x7A, 0xA9, 0x99, 0x99, 0x6B, ]) + # Allow Purification rom.write_bytes(0x30518, [0x22, 0xA0, 0x99, 0xC3, 0xEA, 0xEA, ]) From fad5897d0ed3996ad059420966e99d5b47f143d4 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 31 Mar 2023 21:23:17 -0500 Subject: [PATCH 024/165] implement mg5 and jumping goals --- worlds/kdl3/Client.py | 86 +++++++++++++++++-------------- worlds/kdl3/Names/LocationName.py | 16 +++--- worlds/kdl3/Options.py | 17 +++++- worlds/kdl3/Regions.py | 5 +- worlds/kdl3/Rom.py | 17 ++++-- worlds/kdl3/__init__.py | 21 +++++--- 6 files changed, 98 insertions(+), 64 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index eaec7c8776d3..8352d977a3b7 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -30,7 +30,9 @@ KDL3_LEVEL_UNLOCK = SRAM_1_START + 0x53CD KDL3_BOSS_STATUS = SRAM_1_START + 0x53D5 KDL3_INVINCIBILITY_TIMER = SRAM_1_START + 0x54B1 +KDL3_MG5_STATUS = SRAM_1_START + 0x5EE4 KDL3_BOSS_BUTCH_STATUS = SRAM_1_START + 0x5EEA +KDL3_JUMPING_STATUS = SRAM_1_START + 0x5EF0 KDL3_CURRENT_BGM = SRAM_1_START + 0x733E KDL3_ABILITY_ARRAY = SRAM_1_START + 0x7F50 KDL3_SOUND_FX = SRAM_1_START + 0x7F62 @@ -84,12 +86,7 @@ async def pop_item(self, ctx): item = self.item_queue.pop() # special handling for the remaining three item = item.item & 0x00000F - if item == 0: - # Heart Star - heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 1) - snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", heart_star_count[0] + 1)) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x16])) - elif item == 1: + if item == 1: # 1-Up life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 1) life_bytes = pack("H", life_count[0] + 1) @@ -116,26 +113,30 @@ async def game_watcher(self, ctx) -> None: halken = await snes_read(ctx, WRAM_START, 6) if halken != b"halken": return - current_bgm = await snes_read(ctx, KDL3_CURRENT_BGM, 1) - if current_bgm[0] in (0x00, 0x21, 0x22, 0x23, 0x25): - return # title screen, opening, save select is_debug = await snes_read(ctx, KDL3_DEBUG, 1) if is_debug[0]: return # just in case someone tries to get smart - game_state = await snes_read(ctx, KDL3_GAME_STATE, 1) - current_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) - if "DeathLink" in ctx.tags and game_state[0] == 0x00 and ctx.last_death_link + 1 < time.time(): - currently_dead = current_hp[0] == 0x00 - await ctx.handle_deathlink_state(currently_dead) - current_save = await snes_read(ctx, KDL3_GAME_SAVE, 1) goal = await snes_read(ctx, KDL3_GOAL_ADDR, 1) boss_butch_status = await snes_read(ctx, KDL3_BOSS_BUTCH_STATUS + (current_save[0] * 2), 1) + mg5_status = await snes_read(ctx, KDL3_MG5_STATUS + (current_save[0] * 2), 1) + jumping_status = await snes_read(ctx, KDL3_JUMPING_STATUS + (current_save[0] * 2), 1) if boss_butch_status[0] == 0xFF: return # save file is not created, ignore - if (goal[0] == 0x00 and boss_butch_status[0] == 0x01) or (goal[0] == 0x01 and boss_butch_status[0] == 0x03): + if (goal[0] == 0x00 and boss_butch_status[0] == 0x01) \ + or (goal[0] == 0x01 and boss_butch_status[0] == 0x03)\ + or (goal[0] == 0x02 and mg5_status[0] == 0x03)\ + or (goal[0] == 0x03 and jumping_status[0] == 0x03): await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) ctx.finished_game = True + current_bgm = await snes_read(ctx, KDL3_CURRENT_BGM, 1) + if current_bgm[0] in (0x00, 0x21, 0x22, 0x23, 0x25): + return # title screen, opening, save select + game_state = await snes_read(ctx, KDL3_GAME_STATE, 1) + current_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) + if "DeathLink" in ctx.tags and game_state[0] == 0x00 and ctx.last_death_link + 1 < time.time(): + currently_dead = current_hp[0] == 0x00 + await ctx.handle_deathlink_state(currently_dead) if self.levels is None: self.levels = dict() @@ -143,6 +144,35 @@ async def game_watcher(self, ctx) -> None: level_data = await snes_read(ctx, KDL3_LEVEL_ADDR + (14 * i), 14) self.levels[i] = unpack("HHHHHHH", level_data) + recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 1) + recv_amount = recv_count[0] + if recv_amount < len(ctx.items_received): + item = ctx.items_received[recv_amount] + recv_amount += 1 + logging.info('Received %s from %s (%s) (%d/%d in list)' % ( + color(ctx.item_names[item.item], 'red', 'bold'), + color(ctx.player_names[item.player], 'yellow'), + ctx.location_names[item.location], recv_amount, len(ctx.items_received))) + + snes_buffered_write(ctx, KDL3_RECV_COUNT, pack("H", recv_amount)) + if item.item & 0x000030 == 0: + ability = item.item & 0x00000F + snes_buffered_write(ctx, KDL3_ABILITY_ARRAY + (ability * 2), pack("H", ability)) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) + elif item.item & 0x000010 > 0: + friend = (item.item & 0x00000F) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) + snes_buffered_write(ctx, KDL3_ANIMAL_FRIENDS + (friend << 1), bytes([friend + 1])) + elif item.item == 0x770020: + # Heart Star + heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 1) + snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", heart_star_count[0] + 1)) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x16])) + else: + self.item_queue.append(item) + + await snes_flush_writes(ctx) + new_checks = [] # level completion status world_unlocks = await snes_read(ctx, KDL3_WORLD_UNLOCK, 1) @@ -198,27 +228,3 @@ async def game_watcher(self, ctx) -> None: if game_state[0] != 0xFF: await self.pop_item(ctx) - - recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 1) - recv_amount = recv_count[0] - if recv_amount < len(ctx.items_received): - item = ctx.items_received[recv_amount] - recv_amount += 1 - logging.info('Received %s from %s (%s) (%d/%d in list)' % ( - color(ctx.item_names[item.item], 'red', 'bold'), - color(ctx.player_names[item.player], 'yellow'), - ctx.location_names[item.location], recv_amount, len(ctx.items_received))) - - snes_buffered_write(ctx, KDL3_RECV_COUNT, pack("H", recv_amount)) - if item.item & 0x000030 == 0: - ability = item.item & 0x00000F - snes_buffered_write(ctx, KDL3_ABILITY_ARRAY + (ability * 2), pack("H", ability)) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) - elif item.item & 0x000010 > 0: - friend = (item.item & 0x00000F) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) - snes_buffered_write(ctx, KDL3_ANIMAL_FRIENDS + (friend << 1), bytes([friend + 1])) - else: - self.item_queue.append(item) - - await snes_flush_writes(ctx) diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index 9a5991885ebb..177503958db0 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -78,11 +78,8 @@ # Extras boss_butch = "Boss Butch" -mg5_1 = "Minigame 5 - 1" -mg5_2 = "Minigame 5 - 2" -mg5_3 = "Minigame 5 - 3" -mg5_4 = "Minigame 5 - 4" -mg5_5 = "Minigame 5 - 5" +mg5_p = "Minigame 5 - Perfect" +jumping_clear = "Jumping - Target Score Reached" # Level Names level_names = { @@ -100,4 +97,11 @@ "Pon & Con": 0x770202, "Ado": 0x770203, "King Dedede": 0x770204 - } \ No newline at end of file + } + +goals = { + 0: hyper_zone, + 1: boss_butch, + 2: mg5_p, + 3: jumping_clear +} \ No newline at end of file diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 8954239e4bc1..2aedcd88bae0 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -6,11 +6,15 @@ class Goal(Choice): """ Zero: collect the Heart Stars, purify the five bosses, and defeat Zero in the Hyper Zone. - Boss Butch: purify the five bosses, and then complete the boss rematches in the Boss Butch mode. + Boss Butch: collect the Heart Stars, and then complete the boss rematches in the Boss Butch mode. + MG5: collect the Heart Stars, and then complete a perfect run through the minigame gauntlet within the MG5 + Jumping: collect the Heart Stars, and then reach a designated score within the Jumping sub-game """ display_name = "Goal" option_zero = 0 option_boss_butch = 1 + option_mg5 = 2 + option_jumping = 3 default = 0 @@ -81,6 +85,16 @@ class BossRequirementRandom(Toggle): display_name = "Randomize Purification Order" +class JumpingTarget(Range): + """ + The required score needed to complete the Jumping minigame. + """ + display_name = "Jumping Target Score" + range_start = 1 + range_end = 25 + default = 10 + + class GameLanguage(Choice): """ The language that the game should display. This does not have to match the given rom. @@ -160,6 +174,7 @@ class GooeyFlavorPreset(Choice): "total_heart_stars": TotalHeartStars, "heart_stars_required": HeartStarsRequired, "filler_percentage": FillerPercentage, + "jumping_target": JumpingTarget, "stage_shuffle": LevelShuffle, "boss_shuffle": BossShuffle, "boss_requirement_random": BossRequirementRandom, diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 267a97a8c372..cd287fe91c52 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -160,10 +160,7 @@ def create_levels(world: World) -> None: level3.locations.append(KDL3Location(world.player, "Level 3 Boss", None, level3)) level4.locations.append(KDL3Location(world.player, "Level 4 Boss", None, level4)) level5.locations.append(KDL3Location(world.player, "Level 5 Boss", None, level5)) - if world.multiworld.goal[world.player] == 1: - level6.locations.append(KDL3Location(world.player, LocationName.boss_butch, None, level6)) - else: - level6.locations.append(KDL3Location(world.player, LocationName.hyper_zone, None, level6)) + level6.locations.append(KDL3Location(world.player, LocationName.goals[world.multiworld.goal[world.player]], None, level6)) tlv2 = Entrance(world.player, "To Level 2", level1) level1.exits.append(tlv2) tlv2.connect(level2) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index e48c87e1d69f..8ad54a5c1592 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -82,8 +82,7 @@ def read_from_file(self, file): self.file = bytearray(stream.read()) - -def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): +def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, shuffled_levels): # increase BWRAM by 0x8000 rom.write_byte(0x7FD8, 0x06) @@ -133,9 +132,11 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): # Allow Purification rom.write_bytes(0x30518, [0x22, 0xA0, 0x99, 0xC3, 0xEA, 0xEA, ]) - # Check Purification - rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xBF, 0x00, 0xD0, 0x07, 0xCD, - 0x80, 0x7F, 0x10, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) + # Check Purification and Enable Sub-games + rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xAD, 0x80, 0x7F, 0x18, 0xCF, + 0x0A, 0xD0, 0x07, 0x90, 0x17, 0xDA, 0xA9, 0x14, 0x00, 0x8D, 0x62, 0x7F, 0xA9, 0x01, 0x00, + 0xAE, 0x17, 0x36, 0x9D, 0xDD, 0x53, 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0xFA, 0xBF, 0x00, + 0xD0, 0x07, 0xCD, 0x80, 0x7F, 0x10, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) # Check for Sound on Main Loop rom.write_bytes(0x6AE4, [0x22, 0x00, 0x9B, 0x07, 0xEA]) @@ -167,6 +168,8 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): boss_requirements[3], boss_requirements[4])) rom.write_byte(0x3D010, multiworld.death_link[player].value) rom.write_byte(0x3D012, multiworld.goal[player].value) + rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal[player] > 0 + else [0xFF, 0xFF])) for level in shuffled_levels: for i in range(len(shuffled_levels[level])): @@ -178,6 +181,10 @@ def patch_rom(multiworld, player, rom, boss_requirements, shuffled_levels): rom.write_bytes(0x3D080 + (level - 1) * 12 + (i * 2), struct.pack("H", (shuffled_levels[level][i] & 0x00FFFF) % 6)) + # write jumping goal + rom.write_bytes(0x94F8, struct.pack("H", multiworld.jumping_target[player])) + rom.write_bytes(0x944E, struct.pack("H", multiworld.jumping_target[player])) + from Main import __version__ rom.name = bytearray(f'KDL3{__version__.replace(".", "")[0:3]}_{player}_{multiworld.seed:11}\0', 'utf8')[:21] rom.name.extend([0] * (21 - len(rom.name))) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index b27371272f6d..51b0ddea2e5b 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -43,6 +43,7 @@ class KDL3World(World): item_name_groups = item_names data_version = 0 web = KDL3WebWorld() + required_heart_stars = dict() boss_requirements = dict() player_levels = dict() topology_present = False @@ -82,6 +83,7 @@ def create_items(self) -> None: filler_items = total_heart_stars - required_heart_stars filler_amount = math.floor(filler_items * (self.multiworld.filler_percentage[self.player].value / 100.0)) nonrequired_heart_stars = filler_items - filler_amount + self.required_heart_stars[self.player] = required_heart_stars # handle boss requirements here requirements = [required_heart_stars] for i in range(4): @@ -240,17 +242,19 @@ def set_rules(self) -> None: and state.can_reach(stage_locations[self.player_levels[self.player][5][5]], "Location", self.player)) set_rule(self.multiworld.get_entrance("To Level 6", self.player), - lambda state: state.has("Level 1 Boss Purified", self.player) - and state.has("Level 2 Boss Purified", self.player) - and state.has("Level 3 Boss Purified", self.player) - and state.has("Level 4 Boss Purified", self.player) - and state.has("Level 5 Boss Purified", self.player)) + lambda state: state.has("Heart Star", self.player, self.required_heart_stars[self.player])) + if self.multiworld.goal[self.player] == 0: + add_rule(self.multiworld.get_entrance("To Level 6", self.player), + lambda state: state.has("Level 1 Boss Purified", self.player) + and state.has("Level 2 Boss Purified", self.player) + and state.has("Level 3 Boss Purified", self.player) + and state.has("Level 4 Boss Purified", self.player) + and state.has("Level 5 Boss Purified", self.player)) def generate_basic(self) -> None: self.topology_present = self.multiworld.stage_shuffle[self.player].value > 0 goal = self.multiworld.goal[self.player].value - goal_location = self.multiworld.get_location(LocationName.boss_butch, self.player) \ - if goal == 1 else self.multiworld.get_location(LocationName.hyper_zone, self.player) + goal_location = self.multiworld.get_location(LocationName.goals[goal], self.player) goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, self.player)) self.multiworld.get_location("Level 1 Boss", self.player) \ .place_locked_item(KDL3Item("Level 1 Boss Purified", ItemClassification.progression, None, self.player)) @@ -271,7 +275,8 @@ def generate_output(self, output_directory: str): player = self.player rom = RomData(get_base_rom_path()) - patch_rom(self.multiworld, self.player, rom, self.boss_requirements[self.player], + patch_rom(self.multiworld, self.player, rom, self.required_heart_stars[self.player], + self.boss_requirements[self.player], self.player_levels[self.player]) rompath = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") From 29bdda5f0fe612515417d583a98e3dd999b77c73 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 31 Mar 2023 21:39:22 -0500 Subject: [PATCH 025/165] enforce at least one heart star required --- worlds/kdl3/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 51b0ddea2e5b..e29c3c2072b7 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -79,7 +79,7 @@ def create_items(self) -> None: required_percentage = self.multiworld.heart_stars_required[self.player].value / 100.0 remaining_items = len(location_table) - len(itempool) total_heart_stars = self.multiworld.total_heart_stars[self.player].value - required_heart_stars = math.floor(total_heart_stars * required_percentage) + required_heart_stars = max(math.floor(total_heart_stars * required_percentage), 1) # ensure at least 1 heart star required filler_items = total_heart_stars - required_heart_stars filler_amount = math.floor(filler_items * (self.multiworld.filler_percentage[self.player].value / 100.0)) nonrequired_heart_stars = filler_items - filler_amount From 569a28073d41b53a5afb6825892863659cc21764 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 2 Apr 2023 19:54:17 -0500 Subject: [PATCH 026/165] hotfix zero goal --- worlds/kdl3/Rom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 8ad54a5c1592..0a5260e7197e 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -169,7 +169,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x3D010, multiworld.death_link[player].value) rom.write_byte(0x3D012, multiworld.goal[player].value) rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal[player] > 0 - else [0xFF, 0xFF])) + else 0xFFFF)) for level in shuffled_levels: for i in range(len(shuffled_levels[level])): From 21796da5440925bedf94a6b6eb61c8ae3f173c72 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 4 Apr 2023 20:30:57 -0500 Subject: [PATCH 027/165] fix deathlink and item receive bugs --- worlds/kdl3/Client.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 8352d977a3b7..d5c94e4110cc 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -24,10 +24,12 @@ KDL3_GAME_SAVE = SRAM_1_START + 0x3617 KDL3_LIFE_COUNT = SRAM_1_START + 0x39CF KDL3_KIRBY_HP = SRAM_1_START + 0x39D1 +KDL3_BOSS_HP = SRAM_1_START + 0x39D5 KDL3_LIFE_VISUAL = SRAM_1_START + 0x39E3 KDL3_HEART_STARS = SRAM_1_START + 0x53A7 KDL3_WORLD_UNLOCK = SRAM_1_START + 0x53CB KDL3_LEVEL_UNLOCK = SRAM_1_START + 0x53CD +KDL3_CURRENT_LEVEL = SRAM_1_START + 0x53D3 KDL3_BOSS_STATUS = SRAM_1_START + 0x53D5 KDL3_INVINCIBILITY_TIMER = SRAM_1_START + 0x54B1 KDL3_MG5_STATUS = SRAM_1_START + 0x5EE4 @@ -51,10 +53,17 @@ class KDL3SNIClient(SNIClient): async def deathlink_kill_player(self, ctx) -> None: from SNIClient import DeathState, snes_buffered_write, snes_flush_writes, snes_read game_state = await snes_read(ctx, KDL3_GAME_STATE, 1) - if game_state == 0xFF: + if game_state[0] == 0xFF: return # despite how funny it is, don't try to kill Kirby in a menu + + current_stage = await snes_read(ctx, KDL3_CURRENT_LEVEL, 1) + if current_stage[0] == 0x7: # boss stage + boss_hp = await snes_read(ctx, KDL3_BOSS_HP, 1) + if boss_hp[0] == 0: + return # sending a deathlink after defeating a boss has softlock potential + current_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) - if current_hp == 0: + if current_hp[0] == 0: return # don't kill Kirby while he's already dead snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x00])) @@ -130,8 +139,8 @@ async def game_watcher(self, ctx) -> None: await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) ctx.finished_game = True current_bgm = await snes_read(ctx, KDL3_CURRENT_BGM, 1) - if current_bgm[0] in (0x00, 0x21, 0x22, 0x23, 0x25): - return # title screen, opening, save select + if current_bgm[0] in (0x00, 0x21, 0x22, 0x23, 0x25, 0x2A, 0x2B): + return # null, title screen, opening, save select, true and false endings game_state = await snes_read(ctx, KDL3_GAME_STATE, 1) current_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) if "DeathLink" in ctx.tags and game_state[0] == 0x00 and ctx.last_death_link + 1 < time.time(): From 9500094e6bc763ccc4ef1459730a854503018051 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 12 Apr 2023 14:49:55 -0500 Subject: [PATCH 028/165] begin documenting for consumable checks --- worlds/kdl3/Names/LocationName.py | 38 +++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index 177503958db0..4b0d1f38afdd 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -81,6 +81,44 @@ mg5_p = "Minigame 5 - Perfect" jumping_clear = "Jumping - Target Score Reached" +# 1-Ups +grass_land_1_u1 = "Grass Land 1 - 1-Up (Parasol)" +grass_land_2_u1 = "Grass Land 2 - 1-Up (Needle)" +grass_land_3_u1 = "Grass Land 3 - 1-Up (Climb)" +grass_land_4_u1 = "Grass Land 4 - 1-Up (Gordo)" +grass_land_6_u1 = "Grass Land 6 - 1-Up (Tower)" +grass_land_6_u2 = "Grass Land 6 - 1-Up (Falling)" +ribbon_field_2_u1 = "Ribbon Field 2 - 1-Up (Currents)" +ribbon_field_3_u1 = "Ribbon Field 3 - 1-Up (Cutter/Spark)" +ribbon_field_4_u1 = "Ribbon Field 4 - 1-Up (Stone)" +ribbon_field_5_u1 = "Ribbon Field 5 - 1-Up (Currents)" +sand_canyon_1_u1 = "Sand Canyon 1 - 1-Up (Polof)" +sand_canyon_2_u1 = "Sand Canyon 2 - 1-Up (Enclave)" +sand_canyon_4_u1 = "Sand Canyon 4 - 1-Up (Clean)" +sand_canyon_5_u1 = "Sand Canyon 5 - 1-Up (Falling Block)" +sand_canyon_5_u2 = "Sand Canyon 5 - 1-Up (Ice 1)" +sand_canyon_5_u3 = "Sand Canyon 5 - 1-Up (Ice 2)" +sand_canyon_5_u4 = "Sand Canyon 5 - 1-Up (Ice 3)" + + +# Maxim Tomatoes +grass_land_1_m1 = "Grass Land 1 - Maxim Tomato (Spark)" +grass_land_3_m1 = "Grass Land 3 - Maxim Tomato (Climb)" +grass_land_4_m1 = "Grass Land 4 - Maxim Tomato (Zebon Right)" +grass_land_4_m2 = "Grass Land 4 - Maxim Tomato (Gordo)" +grass_land_4_m3 = "Grass Land 4 - Maxim Tomato (Cliff)" +ribbon_field_2_m1 = "Ribbon Field 2 - Maxim Tomato (Currents)" +ribbon_field_3_m1 = "Ribbon Field 3 - Maxim Tomato (Cove)" +ribbon_field_4_m1 = "Ribbon Field 4 - Maxim Tomato (Dark)" +ribbon_field_4_m2 = "Ribbon Field 4 - Maxim Tomato (Stone)" +ribbon_field_5_m1 = "Ribbon Field 5 - Maxim Tomato (Exit)" +ribbon_field_5_m2 = "Ribbon Field 5 - Maxim Tomato (Currents)" +sand_canyon_2_m1 = "Sand Canyon 2 - Maxim Tomato (Underwater)" +sand_canyon_4_m1 = "Sand Canyon 4 - Maxim Tomato (Pacto)" +sand_canyon_4_m2 = "Sand Canyon 4 - Maxim Tomato (Needle)" +sand_canyon_5_m1 = "Sand Canyon 5 - Maxim Tomato (Pit)" + + # Level Names level_names = { "Grass Land": 1, From 1f428515f119e62463deee6163018edddec81688 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 15 Apr 2023 21:48:09 -0500 Subject: [PATCH 029/165] write validation info to BWRAM --- worlds/kdl3/Client.py | 13 +++++-------- worlds/kdl3/Rom.py | 9 +++++++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 8352d977a3b7..23a820805dc3 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -14,11 +14,10 @@ SRAM_1_START = 0xE00000 # KDL3 -KDL3_DEBUG = ROM_START + 0x387E -KDL3_ROMNAME = ROM_START + 0x7FC0 -KDL3_DEATH_LINK_ADDR = ROM_START + 0x3D010 -KDL3_GOAL_ADDR = ROM_START + 0x3D012 -KDL3_LEVEL_ADDR = ROM_START + 0x3D020 +KDL3_ROMNAME = SRAM_1_START + 0x8100 +KDL3_DEATH_LINK_ADDR = SRAM_1_START + 0x9010 +KDL3_GOAL_ADDR = SRAM_1_START + 0x9012 +KDL3_LEVEL_ADDR = SRAM_1_START + 0x9020 KDL3_GAME_STATE = SRAM_1_START + 0x36D0 KDL3_GAME_SAVE = SRAM_1_START + 0x3617 @@ -113,9 +112,7 @@ async def game_watcher(self, ctx) -> None: halken = await snes_read(ctx, WRAM_START, 6) if halken != b"halken": return - is_debug = await snes_read(ctx, KDL3_DEBUG, 1) - if is_debug[0]: - return # just in case someone tries to get smart + # can't check debug anymore, without going and copying the value. might be important later. current_save = await snes_read(ctx, KDL3_GAME_SAVE, 1) goal = await snes_read(ctx, KDL3_GOAL_ADDR, 1) boss_butch_status = await snes_read(ctx, KDL3_BOSS_BUTCH_STATUS + (current_save[0] * 2), 1) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 0a5260e7197e..bbaca859b774 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -86,8 +86,13 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # increase BWRAM by 0x8000 rom.write_byte(0x7FD8, 0x06) - # initialize new BWRAM size - rom.write_bytes(0x36, [0xA9, 0xFD, 0x9F, ]) + # hook BWRAM initialization for initializing our new BWRAM + rom.write_bytes(0x33, [0x22, 0x00, 0x9E, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) + + # Initialize BWRAM with ROM parameters + rom.write_bytes(0x39E00, [0xA0, 0x01, 0x60, 0xA9, 0xFD, 0x9F, 0x54, 0x40, 0x40, 0xA2, 0x00, 0xD0, 0xA0, 0x00, 0x90, + 0xA9, 0x00, 0x10, 0x54, 0x40, 0x07, 0xA2, 0xC0, 0xFF, 0xA0, 0x00, 0x81, 0xA9, 0x15, 0x00, + 0x54, 0x40, 0x00, 0x6B, 0xEA, ]) # Copy Ability rom.write_bytes(0x399A0, [0xB9, 0xF3, 0x54, # LDA $54F3 From a9dfd2717bbc8182728fd8d4e76a776c9c7f4582 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 20 Apr 2023 13:02:36 -0500 Subject: [PATCH 030/165] Update LocationName.py --- worlds/kdl3/Names/LocationName.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index 4b0d1f38afdd..5da0561f2014 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -99,7 +99,13 @@ sand_canyon_5_u2 = "Sand Canyon 5 - 1-Up (Ice 1)" sand_canyon_5_u3 = "Sand Canyon 5 - 1-Up (Ice 2)" sand_canyon_5_u4 = "Sand Canyon 5 - 1-Up (Ice 3)" - +cloudy_park_1_u1 = "Cloudy Park 1 - 1-Up (1)" +cloudy_park_4_u1 = "Cloudy Park 4 - 1-Up (1)" +cloudy_park_6_u1 = "Cloudy Park 6 - 1-Up (1)" +iceberg_5_u1 = "Iceberg 5 - 1-Up (1)" +iceberg_5_u2 = "Iceberg 5 - 1-Up (2)" +iceberg_5_u3 = "Iceberg 5 - 1-Up (3)" +iceberg_6_u1 = "Iceberg 6 - 1-Up (1)" # Maxim Tomatoes grass_land_1_m1 = "Grass Land 1 - Maxim Tomato (Spark)" @@ -117,7 +123,11 @@ sand_canyon_4_m1 = "Sand Canyon 4 - Maxim Tomato (Pacto)" sand_canyon_4_m2 = "Sand Canyon 4 - Maxim Tomato (Needle)" sand_canyon_5_m1 = "Sand Canyon 5 - Maxim Tomato (Pit)" - +cloudy_park_1_m1 = "Cloudy Park 1 - Maxim Tomato (1)" +cloudy_park_4_m1 = "Cloudy Park 4 - Maxim Tomato (1)" +cloudy_park_5_m1 = "Cloudy Park 5 - Maxim Tomato (1)" +iceberg_3_m1 = "Iceberg 3 - Maxim Tomato (1)" +iceberg_6_m1 = "Iceberg 6 - Maxim Tomato (1)" # Level Names level_names = { From 90fd5a6f522fd3f4dce7f0ff1dee4161e7230eaa Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 21 Apr 2023 01:48:34 -0500 Subject: [PATCH 031/165] move existing variables out of base bwram --- worlds/kdl3/Client.py | 8 ++++---- worlds/kdl3/Names/LocationName.py | 34 +++++++++++++++---------------- worlds/kdl3/Rom.py | 16 ++++++++------- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index c210a85166cb..fd5f85b95ff1 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -35,11 +35,11 @@ KDL3_BOSS_BUTCH_STATUS = SRAM_1_START + 0x5EEA KDL3_JUMPING_STATUS = SRAM_1_START + 0x5EF0 KDL3_CURRENT_BGM = SRAM_1_START + 0x733E -KDL3_ABILITY_ARRAY = SRAM_1_START + 0x7F50 KDL3_SOUND_FX = SRAM_1_START + 0x7F62 -KDL3_RECV_COUNT = SRAM_1_START + 0x7F70 -KDL3_HEART_STAR_COUNT = SRAM_1_START + 0x7F80 KDL3_ANIMAL_FRIENDS = SRAM_1_START + 0x8000 +KDL3_ABILITY_ARRAY = SRAM_1_START + 0x8020 +KDL3_RECV_COUNT = SRAM_1_START + 0x8050 +KDL3_HEART_STAR_COUNT = SRAM_1_START + 0x8070 class KDL3SNIClient(SNIClient): @@ -59,7 +59,7 @@ async def deathlink_kill_player(self, ctx) -> None: if current_stage[0] == 0x7: # boss stage boss_hp = await snes_read(ctx, KDL3_BOSS_HP, 1) if boss_hp[0] == 0: - return # sending a deathlink after defeating a boss has softlock potential + return # receiving a deathlink after defeating a boss has softlock potential current_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) if current_hp[0] == 0: diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index 4b0d1f38afdd..aedc2e6788a9 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -82,23 +82,23 @@ jumping_clear = "Jumping - Target Score Reached" # 1-Ups -grass_land_1_u1 = "Grass Land 1 - 1-Up (Parasol)" -grass_land_2_u1 = "Grass Land 2 - 1-Up (Needle)" -grass_land_3_u1 = "Grass Land 3 - 1-Up (Climb)" -grass_land_4_u1 = "Grass Land 4 - 1-Up (Gordo)" -grass_land_6_u1 = "Grass Land 6 - 1-Up (Tower)" -grass_land_6_u2 = "Grass Land 6 - 1-Up (Falling)" -ribbon_field_2_u1 = "Ribbon Field 2 - 1-Up (Currents)" -ribbon_field_3_u1 = "Ribbon Field 3 - 1-Up (Cutter/Spark)" -ribbon_field_4_u1 = "Ribbon Field 4 - 1-Up (Stone)" -ribbon_field_5_u1 = "Ribbon Field 5 - 1-Up (Currents)" -sand_canyon_1_u1 = "Sand Canyon 1 - 1-Up (Polof)" -sand_canyon_2_u1 = "Sand Canyon 2 - 1-Up (Enclave)" -sand_canyon_4_u1 = "Sand Canyon 4 - 1-Up (Clean)" -sand_canyon_5_u1 = "Sand Canyon 5 - 1-Up (Falling Block)" -sand_canyon_5_u2 = "Sand Canyon 5 - 1-Up (Ice 1)" -sand_canyon_5_u3 = "Sand Canyon 5 - 1-Up (Ice 2)" -sand_canyon_5_u4 = "Sand Canyon 5 - 1-Up (Ice 3)" +grass_land_1_u1 = "Grass Land 1 - 1-Up (Parasol)" # Parasol +grass_land_2_u1 = "Grass Land 2 - 1-Up (Needle)" # Needle +grass_land_3_u1 = "Grass Land 3 - 1-Up (Climb)" # None +grass_land_4_u1 = "Grass Land 4 - 1-Up (Gordo)" # None +grass_land_6_u1 = "Grass Land 6 - 1-Up (Tower)" # None +grass_land_6_u2 = "Grass Land 6 - 1-Up (Falling)" # None +ribbon_field_2_u1 = "Ribbon Field 2 - 1-Up (Currents)" # Kine +ribbon_field_3_u1 = "Ribbon Field 3 - 1-Up (Cutter/Spark)" # Cutter or Spark +ribbon_field_4_u1 = "Ribbon Field 4 - 1-Up (Stone)" # Stone +ribbon_field_5_u1 = "Ribbon Field 5 - 1-Up (Currents)" # Kine, Burning, Stone +sand_canyon_1_u1 = "Sand Canyon 1 - 1-Up (Polof)" # None +sand_canyon_2_u1 = "Sand Canyon 2 - 1-Up (Enclave)" # None +sand_canyon_4_u1 = "Sand Canyon 4 - 1-Up (Clean)" # Clean +sand_canyon_5_u1 = "Sand Canyon 5 - 1-Up (Falling Block)" # None +sand_canyon_5_u2 = "Sand Canyon 5 - 1-Up (Ice 1)" # Ice +sand_canyon_5_u3 = "Sand Canyon 5 - 1-Up (Ice 2)" # Ice +sand_canyon_5_u4 = "Sand Canyon 5 - 1-Up (Ice 3)" # Ice # Maxim Tomatoes diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index bbaca859b774..eb2f1cdd37d6 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -90,9 +90,11 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(0x33, [0x22, 0x00, 0x9E, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # Initialize BWRAM with ROM parameters - rom.write_bytes(0x39E00, [0xA0, 0x01, 0x60, 0xA9, 0xFD, 0x9F, 0x54, 0x40, 0x40, 0xA2, 0x00, 0xD0, 0xA0, 0x00, 0x90, - 0xA9, 0x00, 0x10, 0x54, 0x40, 0x07, 0xA2, 0xC0, 0xFF, 0xA0, 0x00, 0x81, 0xA9, 0x15, 0x00, - 0x54, 0x40, 0x00, 0x6B, 0xEA, ]) + rom.write_bytes(0x39E00, [0xA0, 0x01, 0x60, 0xA9, 0xFE, 0x1F, 0x54, 0x40, 0x40, 0xA2, 0x00, 0x00, 0xA0, 0x14, 0x00, + 0xBD, 0x00, 0x81, 0xDF, 0xC0, 0xFF, 0x00, 0xD0, 0x06, 0xE8, 0x88, 0x30, 0x2C, 0x80, 0xF1, + 0xA9, 0x00, 0x00, 0x8D, 0x00, 0x80, 0xA2, 0x00, 0x80, 0xA0, 0x01, 0x80, 0xA9, 0xFD, 0x7F, + 0x54, 0x40, 0x40, 0xA2, 0x00, 0xD0, 0xA0, 0x00, 0x90, 0xA9, 0x00, 0x10, 0x54, 0x40, 0x07, + 0xA2, 0xC0, 0xFF, 0xA0, 0x00, 0x81, 0xA9, 0x15, 0x00, 0x54, 0x40, 0x00, 0x6B, ]) # Copy Ability rom.write_bytes(0x399A0, [0xB9, 0xF3, 0x54, # LDA $54F3 @@ -100,7 +102,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0x0A, # ASL 0xAA, # TAX 0x68, # PLA - 0xDD, 0x50, 0x7F, # CMP $7F50, X + 0xDD, 0x20, 0x80, # CMP $7F50, X 0xEA, 0xEA, # NOP NOP 0xF0, 0x03, # BEQ $0799B1 0xA9, 0x00, 0x00, # LDA #$0000 @@ -111,7 +113,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0x0A, # ASL 0xA8, # TAX 0x68, # PLA - 0xD9, 0x50, 0x7F, # CMP $7F50, Y + 0xD9, 0x20, 0x80, # CMP $7F50, Y 0xEA, # NOP 0xF0, 0x03, # BEQ $0799C6 0xA9, 0x00, 0x00, # LDA #$0000 @@ -138,10 +140,10 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(0x30518, [0x22, 0xA0, 0x99, 0xC3, 0xEA, 0xEA, ]) # Check Purification and Enable Sub-games - rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xAD, 0x80, 0x7F, 0x18, 0xCF, + rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xAD, 0x70, 0x80, 0x18, 0xCF, 0x0A, 0xD0, 0x07, 0x90, 0x17, 0xDA, 0xA9, 0x14, 0x00, 0x8D, 0x62, 0x7F, 0xA9, 0x01, 0x00, 0xAE, 0x17, 0x36, 0x9D, 0xDD, 0x53, 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0xFA, 0xBF, 0x00, - 0xD0, 0x07, 0xCD, 0x80, 0x7F, 0x10, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) + 0xD0, 0x07, 0xCD, 0x70, 0x80, 0x10, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) # Check for Sound on Main Loop rom.write_bytes(0x6AE4, [0x22, 0x00, 0x9B, 0x07, 0xEA]) From e8a156b502e67c44660088aebeb849305d958fb4 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 22 Apr 2023 02:40:32 -0500 Subject: [PATCH 032/165] finish consumables, fix 5-4 hs logic --- worlds/kdl3/Client.py | 62 ++++++++++++++- worlds/kdl3/Locations.py | 71 +++++++++++++++++ worlds/kdl3/Names/LocationName.py | 65 +++++++-------- worlds/kdl3/Options.py | 8 ++ worlds/kdl3/Regions.py | 11 ++- worlds/kdl3/Rom.py | 19 ++++- worlds/kdl3/__init__.py | 126 +++++++++++++++++++++++------- 7 files changed, 296 insertions(+), 66 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index fd5f85b95ff1..261b804b94b5 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -40,6 +40,54 @@ KDL3_ABILITY_ARRAY = SRAM_1_START + 0x8020 KDL3_RECV_COUNT = SRAM_1_START + 0x8050 KDL3_HEART_STAR_COUNT = SRAM_1_START + 0x8070 +KDL3_CONSUMABLES = SRAM_1_START + 0xA000 + +consumable_addrs = { + 0: 14, + 1: 15, + 2: 84, + 3: 138, + 4: 139, + 5: 204, + 6: 214, + 7: 215, + 8: 224, + 9: 330, + 10: 353, + 11: 458, + 12: 459, + 13: 522, + 14: 525, + 15: 605, + 16: 606, + 17: 630, + 18: 671, + 19: 672, + 20: 693, + 21: 791, + 22: 851, + 23: 883, + 24: 971, + 25: 985, + 26: 986, + 27: 1024, + 28: 1035, + 29: 1036, + 30: 1038, + 31: 1039, + 32: 1170, + 33: 1171, + 34: 1377, + 35: 1378, + 36: 1413, + 37: 1494, + 38: 1666, + 39: 1808, + 40: 1809, + 41: 1816, + 42: 1856, + 43: 1857, +} class KDL3SNIClient(SNIClient): @@ -130,8 +178,8 @@ async def game_watcher(self, ctx) -> None: if boss_butch_status[0] == 0xFF: return # save file is not created, ignore if (goal[0] == 0x00 and boss_butch_status[0] == 0x01) \ - or (goal[0] == 0x01 and boss_butch_status[0] == 0x03)\ - or (goal[0] == 0x02 and mg5_status[0] == 0x03)\ + or (goal[0] == 0x01 and boss_butch_status[0] == 0x03) \ + or (goal[0] == 0x02 and mg5_status[0] == 0x03) \ or (goal[0] == 0x03 and jumping_status[0] == 0x03): await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) ctx.finished_game = True @@ -198,13 +246,21 @@ async def game_watcher(self, ctx) -> None: start_ind = i * 7 for j in range(1, 7): level_ind = start_ind + j - 1 - loc_id = 0x770100 + (6*i) + j + loc_id = 0x770100 + (6 * i) + j if heart_stars[level_ind] and loc_id not in ctx.checked_locations: new_checks.append(loc_id) elif not heart_stars[level_ind] and loc_id in ctx.checked_locations: # only handle collected heart stars snes_buffered_write(ctx, KDL3_HEART_STARS + level_ind, bytes([0x01])) await snes_flush_writes(ctx) + # consumable status + consumables = await snes_read(ctx, KDL3_CONSUMABLES, 1920) + for consumable in consumable_addrs: + # TODO see if this can be sped up in any way + if consumables[consumable_addrs[consumable]] == 0x01: + loc_id = 0x770300 + consumable + if loc_id not in ctx.checked_locations: + new_checks.append(loc_id) # boss status boss_flag_bytes = await snes_read(ctx, KDL3_BOSS_STATUS, 2) boss_flag = unpack("H", boss_flag_bytes)[0] diff --git a/worlds/kdl3/Locations.py b/worlds/kdl3/Locations.py index ea66ccacf165..26284ddeed10 100644 --- a/worlds/kdl3/Locations.py +++ b/worlds/kdl3/Locations.py @@ -85,8 +85,79 @@ def __init__(self, player: int, name: str, address: typing.Optional[int], parent 0x770204: LocationName.iceberg_dedede, } +consumable_locations = { + 0x770300: LocationName.grass_land_1_u1, + 0x770301: LocationName.grass_land_1_m1, + 0x770302: LocationName.grass_land_2_u1, + 0x770303: LocationName.grass_land_3_u1, + 0x770304: LocationName.grass_land_3_m1, + 0x770305: LocationName.grass_land_4_m1, + 0x770306: LocationName.grass_land_4_u1, + 0x770307: LocationName.grass_land_4_m2, + 0x770308: LocationName.grass_land_4_m3, + 0x770309: LocationName.grass_land_6_u1, + 0x77030A: LocationName.grass_land_6_u2, + 0x77030B: LocationName.ripple_field_2_u1, + 0x77030C: LocationName.ripple_field_2_m1, + 0x77030D: LocationName.ripple_field_3_m1, + 0x77030E: LocationName.ripple_field_3_u1, + 0x77030F: LocationName.ripple_field_4_m2, + 0x770310: LocationName.ripple_field_4_u1, + 0x770311: LocationName.ripple_field_4_m2, + 0x770312: LocationName.ripple_field_5_u1, + 0x770313: LocationName.ripple_field_5_m2, + 0x770314: LocationName.ripple_field_5_m1, + 0x770315: LocationName.sand_canyon_1_u1, + 0x770316: LocationName.sand_canyon_2_u1, + 0x770317: LocationName.sand_canyon_2_m1, + 0x770318: LocationName.sand_canyon_4_m1, + 0x770319: LocationName.sand_canyon_4_u1, + 0x77031A: LocationName.sand_canyon_4_m2, + 0x77031B: LocationName.sand_canyon_5_u1, + 0x77031C: LocationName.sand_canyon_5_u3, + 0x77031D: LocationName.sand_canyon_5_m1, + 0x77031E: LocationName.sand_canyon_5_u4, + 0x77031F: LocationName.sand_canyon_5_u2, + 0x770320: LocationName.cloudy_park_1_m1, + 0x770321: LocationName.cloudy_park_1_u1, + 0x770322: LocationName.cloudy_park_4_u1, + 0x770323: LocationName.cloudy_park_4_m1, + 0x770324: LocationName.cloudy_park_5_m1, + 0x770325: LocationName.cloudy_park_6_u1, + 0x770326: LocationName.iceberg_3_m1, + 0x770327: LocationName.iceberg_5_u1, + 0x770328: LocationName.iceberg_5_u2, + 0x770329: LocationName.iceberg_5_u3, + 0x77032A: LocationName.iceberg_6_m1, + 0x77032B: LocationName.iceberg_6_u1, +} + +level_consumables = { + 1: [0, 1], + 2: [2], + 3: [3, 4], + 4: [5, 6, 7, 8], + 6: [9, 10], + 8: [11, 12], + 9: [13, 14], + 10: [15, 16, 17], + 11: [18, 19, 20], + 13: [21], + 14: [22, 23], + 16: [24, 25, 26], + 17: [27, 28, 29, 30, 31], + 19: [32, 33], + 22: [34, 35], + 23: [36], + 24: [37], + 27: [38], + 29: [39, 40, 41], + 30: [42, 43], +} + location_table = { **stage_locations, **heart_star_locations, **boss_locations, + **consumable_locations, } diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index d85bb4d9ab74..ae7cc5d8aecb 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -88,10 +88,10 @@ grass_land_4_u1 = "Grass Land 4 - 1-Up (Gordo)" # None grass_land_6_u1 = "Grass Land 6 - 1-Up (Tower)" # None grass_land_6_u2 = "Grass Land 6 - 1-Up (Falling)" # None -ribbon_field_2_u1 = "Ribbon Field 2 - 1-Up (Currents)" # Kine -ribbon_field_3_u1 = "Ribbon Field 3 - 1-Up (Cutter/Spark)" # Cutter or Spark -ribbon_field_4_u1 = "Ribbon Field 4 - 1-Up (Stone)" # Stone -ribbon_field_5_u1 = "Ribbon Field 5 - 1-Up (Currents)" # Kine, Burning, Stone +ripple_field_2_u1 = "Ripple Field 2 - 1-Up (Currents)" # Kine +ripple_field_3_u1 = "Ripple Field 3 - 1-Up (Cutter/Spark)" # Cutter or Spark +ripple_field_4_u1 = "Ripple Field 4 - 1-Up (Stone)" # Stone +ripple_field_5_u1 = "Ripple Field 5 - 1-Up (Currents)" # Kine, Burning, Stone sand_canyon_1_u1 = "Sand Canyon 1 - 1-Up (Polof)" # None sand_canyon_2_u1 = "Sand Canyon 2 - 1-Up (Enclave)" # None sand_canyon_4_u1 = "Sand Canyon 4 - 1-Up (Clean)" # Clean @@ -99,35 +99,35 @@ sand_canyon_5_u2 = "Sand Canyon 5 - 1-Up (Ice 1)" # Ice sand_canyon_5_u3 = "Sand Canyon 5 - 1-Up (Ice 2)" # Ice sand_canyon_5_u4 = "Sand Canyon 5 - 1-Up (Ice 3)" # Ice -cloudy_park_1_u1 = "Cloudy Park 1 - 1-Up (1)" -cloudy_park_4_u1 = "Cloudy Park 4 - 1-Up (1)" -cloudy_park_6_u1 = "Cloudy Park 6 - 1-Up (1)" -iceberg_5_u1 = "Iceberg 5 - 1-Up (1)" -iceberg_5_u2 = "Iceberg 5 - 1-Up (2)" -iceberg_5_u3 = "Iceberg 5 - 1-Up (3)" -iceberg_6_u1 = "Iceberg 6 - 1-Up (1)" +cloudy_park_1_u1 = "Cloudy Park 1 - 1-Up (Shotzo)" # None +cloudy_park_4_u1 = "Cloudy Park 4 - 1-Up (Windy)" # Coo +cloudy_park_6_u1 = "Cloudy Park 6 - 1-Up (Cutter)" # Cutter +iceberg_5_u1 = "Iceberg 5 - 1-Up (Boulder)" # None +iceberg_5_u2 = "Iceberg 5 - 1-Up (Floor)" # None +iceberg_5_u3 = "Iceberg 5 - 1-Up (Peloo)" # None, just let yourself get eaten by the Peloo +iceberg_6_u1 = "Iceberg 6 - 1-Up (Middle)" # None # Maxim Tomatoes -grass_land_1_m1 = "Grass Land 1 - Maxim Tomato (Spark)" -grass_land_3_m1 = "Grass Land 3 - Maxim Tomato (Climb)" -grass_land_4_m1 = "Grass Land 4 - Maxim Tomato (Zebon Right)" -grass_land_4_m2 = "Grass Land 4 - Maxim Tomato (Gordo)" -grass_land_4_m3 = "Grass Land 4 - Maxim Tomato (Cliff)" -ribbon_field_2_m1 = "Ribbon Field 2 - Maxim Tomato (Currents)" -ribbon_field_3_m1 = "Ribbon Field 3 - Maxim Tomato (Cove)" -ribbon_field_4_m1 = "Ribbon Field 4 - Maxim Tomato (Dark)" -ribbon_field_4_m2 = "Ribbon Field 4 - Maxim Tomato (Stone)" -ribbon_field_5_m1 = "Ribbon Field 5 - Maxim Tomato (Exit)" -ribbon_field_5_m2 = "Ribbon Field 5 - Maxim Tomato (Currents)" -sand_canyon_2_m1 = "Sand Canyon 2 - Maxim Tomato (Underwater)" -sand_canyon_4_m1 = "Sand Canyon 4 - Maxim Tomato (Pacto)" -sand_canyon_4_m2 = "Sand Canyon 4 - Maxim Tomato (Needle)" -sand_canyon_5_m1 = "Sand Canyon 5 - Maxim Tomato (Pit)" -cloudy_park_1_m1 = "Cloudy Park 1 - Maxim Tomato (1)" -cloudy_park_4_m1 = "Cloudy Park 4 - Maxim Tomato (1)" -cloudy_park_5_m1 = "Cloudy Park 5 - Maxim Tomato (1)" -iceberg_3_m1 = "Iceberg 3 - Maxim Tomato (1)" -iceberg_6_m1 = "Iceberg 6 - Maxim Tomato (1)" +grass_land_1_m1 = "Grass Land 1 - Maxim Tomato (Spark)" # Spark +grass_land_3_m1 = "Grass Land 3 - Maxim Tomato (Climb)" # None +grass_land_4_m1 = "Grass Land 4 - Maxim Tomato (Zebon Right)" # None +grass_land_4_m2 = "Grass Land 4 - Maxim Tomato (Gordo)" # None +grass_land_4_m3 = "Grass Land 4 - Maxim Tomato (Cliff)" # None +ripple_field_2_m1 = "Ripple Field 2 - Maxim Tomato (Currents)" # Kine +ripple_field_3_m1 = "Ripple Field 3 - Maxim Tomato (Cove)" # None +ripple_field_4_m1 = "Ripple Field 4 - Maxim Tomato (Dark)" # None (maybe Spark?) +ripple_field_4_m2 = "Ripple Field 4 - Maxim Tomato (Stone)" # Stone +ripple_field_5_m1 = "Ripple Field 5 - Maxim Tomato (Exit)" # Kine +ripple_field_5_m2 = "Ripple Field 5 - Maxim Tomato (Currents)" # Kine, Burning, Stone +sand_canyon_2_m1 = "Sand Canyon 2 - Maxim Tomato (Underwater)" # None +sand_canyon_4_m1 = "Sand Canyon 4 - Maxim Tomato (Pacto)" # None +sand_canyon_4_m2 = "Sand Canyon 4 - Maxim Tomato (Needle)" # Needle +sand_canyon_5_m1 = "Sand Canyon 5 - Maxim Tomato (Pit)" # None +cloudy_park_1_m1 = "Cloudy Park 1 - Maxim Tomato (Mariel)" # None +cloudy_park_4_m1 = "Cloudy Park 4 - Maxim Tomato (Windy)" # Coo +cloudy_park_5_m1 = "Cloudy Park 5 - Maxim Tomato (Pillars)" # None +iceberg_3_m1 = "Iceberg 3 - Maxim Tomato (Ceiling)" # None +iceberg_6_m1 = "Iceberg 6 - Maxim Tomato (Left)" # None # Level Names level_names = { @@ -147,9 +147,10 @@ "King Dedede": 0x770204 } +# Goal Mapping goals = { 0: hyper_zone, 1: boss_butch, 2: mg5_p, 3: jumping_clear -} \ No newline at end of file +} diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 2aedcd88bae0..000ba8d4eed7 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -115,6 +115,13 @@ class FillerPercentage(Range): default = 50 +class ConsumableChecks(Toggle): + """ + When enabled, adds all 1-Ups and Maxim Tomatoes as possible locations. + """ + display_name = "Consumable-sanity" + + class KirbyFlavorPreset(Choice): """ The color of Kirby, from a list of presets. @@ -178,6 +185,7 @@ class GooeyFlavorPreset(Choice): "stage_shuffle": LevelShuffle, "boss_shuffle": BossShuffle, "boss_requirement_random": BossRequirementRandom, + "consumables": ConsumableChecks, "kirby_flavor_preset": KirbyFlavorPreset, "kirby_flavor": KirbyFlavor, "gooey_flavor_preset": GooeyFlavorPreset, diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index cd287fe91c52..fbe72572476d 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -1,7 +1,7 @@ import typing from BaseClasses import Entrance, Region from worlds.AutoWorld import World -from .Locations import KDL3Location, location_table +from .Locations import KDL3Location, location_table, level_consumables from .Names import LocationName from .Options import BossShuffle if typing.TYPE_CHECKING: @@ -150,6 +150,15 @@ def create_levels(world: World) -> None: heart_star = stage + 0x100 levels[level].locations.append(KDL3Location(world.player, location_table[heart_star], heart_star, levels[level])) + if world.multiworld.consumables[world.player]: + stage_idx = stage & 0xFF + if stage_idx in level_consumables: + for consumable in level_consumables[stage_idx]: + loc_id = 0x770300 + consumable + levels[level].locations.append(KDL3Location(world.player, + location_table[loc_id], + loc_id, levels[level] + )) level1.locations.append(KDL3Location(world.player, LocationName.grass_land_whispy, 0x770200, level1)) level2.locations.append(KDL3Location(world.player, LocationName.ripple_field_acro, 0x770201, level2)) level3.locations.append(KDL3Location(world.player, LocationName.sand_canyon_poncon, 0x770202, level3)) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index eb2f1cdd37d6..55bdf320283a 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -165,11 +165,24 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(0x4A01F, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0xB0, ]) # 1-Ups rom.write_bytes(0x4A0AE, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0x90, ]) # Heart Stars - # Write checks for 1up-sanity - # rom.write_bytes(0x30037 - # base patch done, write relevant slot info + # Write checks for consumable-sanity + if multiworld.consumables[player]: + # Redirect Consumable Effect and write index + rom.write_bytes(0x3001E, [0x22, 0x80, 0x9E, 0x07, 0x4A, 0xC9, 0x05, 0x00, 0xB0, 0xFE, 0x0A, 0xAA, 0x7C, 0x2D, + 0x00, 0x37, 0x00, 0x37, 0x00, 0x7E, 0x00, 0x94, 0x00, 0x37, 0x00, 0xA9, 0x26, 0x00, + 0x22, 0x27, 0xD9, 0x00, 0xA4, 0xD2, 0x6B, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, + 0xEA, 0xEA, 0xEA, ]) + + # Write Consumable Index to index array + rom.write_bytes(0x39E80, [0x48, 0xDA, 0x5A, 0x29, 0xFF, 0x00, 0x48, 0xAE, 0xCF, 0x53, 0xAC, 0xD3, 0x53, 0xA9, + 0x00, 0x00, 0x88, 0xE0, 0x00, 0x00, 0xF0, 0x07, 0x18, 0x69, 0x07, 0x00, 0xCA, 0x80, + 0xF4, 0xC0, 0x00, 0x00, 0xF0, 0x04, 0x1A, 0x88, 0x80, 0xF7, 0x0A, 0xAA, 0xBF, 0x20, + 0xD0, 0x07, 0x3A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0xAA, 0x68, 0xC9, 0x00, 0x00, + 0xF0, 0x04, 0xE8, 0x3A, 0x80, 0xF7, 0xBD, 0x00, 0xA0, 0x09, 0x01, 0x00, 0x9D, 0x00, + 0xA0, 0x7A, 0xFA, 0x68, 0xEB, 0x29, 0xFF, 0x00, 0x6B, ]) + # boss requirements rom.write_bytes(0x3D000, struct.pack("HHHHH", boss_requirements[0], boss_requirements[1], boss_requirements[2], boss_requirements[3], boss_requirements[4])) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index e29c3c2072b7..692c9f8bb37e 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -2,7 +2,7 @@ from worlds.AutoWorld import World, WebWorld from worlds.generic.Rules import set_rule, add_rule from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item -from .Locations import location_table, KDL3Location, stage_locations, heart_star_locations +from .Locations import location_table, KDL3Location, level_consumables, consumable_locations from .Regions import create_levels from .Options import kdl3_options from .Names import LocationName @@ -20,14 +20,14 @@ class KDL3WebWorld(WebWorld): theme = "partyTime" tutorials = [ - #Tutorial( + # Tutorial( # "Multiworld Setup Guide", # "A guide to setting up the Kirby's Dream Land 3 randomizer connected to an Archipelago Multiworld.", # "English", # "setup_en.md", # "setup/en", # ["Silvris"] - #) + # ) ] @@ -77,9 +77,11 @@ def create_items(self) -> None: itempool.extend([self.create_item(name) for name in copy_ability_table]) itempool.extend([self.create_item(name) for name in animal_friend_table]) required_percentage = self.multiworld.heart_stars_required[self.player].value / 100.0 - remaining_items = len(location_table) - len(itempool) + remaining_items = (len(location_table) if self.multiworld.consumables[self.player] + else len(location_table) - len(consumable_locations)) - len(itempool) total_heart_stars = self.multiworld.total_heart_stars[self.player].value - required_heart_stars = max(math.floor(total_heart_stars * required_percentage), 1) # ensure at least 1 heart star required + required_heart_stars = max(math.floor(total_heart_stars * required_percentage), + 1) # ensure at least 1 heart star required filler_items = total_heart_stars - required_heart_stars filler_amount = math.floor(filler_items * (self.multiworld.filler_percentage[self.player].value / 100.0)) nonrequired_heart_stars = filler_items - filler_amount @@ -105,25 +107,41 @@ def set_rules(self) -> None: for stage in range(len(self.player_levels[self.player][level])): if stage != 6: set_rule( - self.multiworld.get_location(stage_locations[self.player_levels[self.player][level][stage]], + self.multiworld.get_location(location_table[self.player_levels[self.player][level][stage]], self.player), lambda state, level=level, stage=stage: True if level == 1 and stage == 0 - else state.can_reach(stage_locations[self.player_levels[self.player][level - 1][5]], "Location", + else state.can_reach(location_table[self.player_levels[self.player][level - 1][5]], "Location", self.player) if stage == 0 else state.can_reach( - stage_locations[self.player_levels[self.player][level][stage - 1]], "Location", + location_table[self.player_levels[self.player][level][stage - 1]], "Location", self.player)) set_rule( self.multiworld.get_location( - heart_star_locations[self.player_levels[self.player][level][stage] + 0x100], self.player), + location_table[self.player_levels[self.player][level][stage] + 0x100], self.player), lambda state, level=level, stage=stage: True if level == 1 and stage == 0 - else state.can_reach(stage_locations[self.player_levels[self.player][level - 1][5]], "Location", + else state.can_reach(location_table[self.player_levels[self.player][level - 1][5]], "Location", self.player) if stage == 0 else state.can_reach( - stage_locations[self.player_levels[self.player][level][stage - 1]], "Location", + location_table[self.player_levels[self.player][level][stage - 1]], "Location", self.player)) + if self.multiworld.consumables[self.player]: + stage_idx = self.player_levels[self.player][level][stage] & 0xFF + if stage_idx in level_consumables: + for consumable in level_consumables[stage_idx]: + set_rule( + self.multiworld.get_location( + location_table[0x770300 + consumable], + self.player), + lambda state, level=level, stage=stage: True if level == 1 and stage == 0 + else state.can_reach(location_table[self.player_levels[self.player][level - 1][5]], + "Location", + self.player) + if stage == 0 + else state.can_reach( + location_table[self.player_levels[self.player][level][stage - 1]], "Location", + self.player)) # Level 1 add_rule(self.multiworld.get_location(LocationName.grass_land_muchi, self.player), @@ -133,7 +151,7 @@ def set_rules(self) -> None: add_rule(self.multiworld.get_location(LocationName.grass_land_mine, self.player), lambda state: state.has("Kine", self.player)) add_rule(self.multiworld.get_entrance("To Level 2", self.player), - lambda state: state.can_reach(stage_locations[self.player_levels[self.player][1][5]], "Location", + lambda state: state.can_reach(location_table[self.player_levels[self.player][1][5]], "Location", self.player)) # Level 2 add_rule(self.multiworld.get_location(LocationName.ripple_field_5, self.player), @@ -148,7 +166,7 @@ def set_rules(self) -> None: lambda state: state.has("Pitch", self.player) and state.has("Kine", self.player) and state.has("Burning", self.player) and state.has("Stone", self.player)) add_rule(self.multiworld.get_entrance("To Level 3", self.player), - lambda state: state.can_reach(stage_locations[self.player_levels[self.player][2][5]], "Location", + lambda state: state.can_reach(location_table[self.player_levels[self.player][2][5]], "Location", self.player)) # Level 3 @@ -166,7 +184,7 @@ def set_rules(self) -> None: and (state.has("Ice", self.player) or state.has("Needle", self.player)) ) add_rule(self.multiworld.get_entrance("To Level 4", self.player), - lambda state: state.can_reach(stage_locations[self.player_levels[self.player][3][5]], "Location", + lambda state: state.can_reach(location_table[self.player_levels[self.player][3][5]], "Location", self.player)) # Level 4 @@ -179,7 +197,7 @@ def set_rules(self) -> None: add_rule(self.multiworld.get_location(LocationName.cloudy_park_pick, self.player), lambda state: state.has("Rick", self.player)) add_rule(self.multiworld.get_entrance("To Level 5", self.player), - lambda state: state.can_reach(stage_locations[self.player_levels[self.player][4][5]], "Location", + lambda state: state.can_reach(location_table[self.player_levels[self.player][4][5]], "Location", self.player)) # Level 5 @@ -190,7 +208,8 @@ def set_rules(self) -> None: add_rule(self.multiworld.get_location(LocationName.iceberg_samus, self.player), lambda state: state.has("Ice", self.player)) add_rule(self.multiworld.get_location(LocationName.iceberg_name, self.player), - lambda state: state.has("Coo", self.player) and state.has("Burning", self.player)) + lambda state: state.has("Coo", self.player) and state.has("Burning", self.player) + and state.has("ChuChu", self.player)) add_rule(self.multiworld.get_location(LocationName.iceberg_shiro, self.player), lambda state: state.has("Nago", self.player) and (state.can_reach(LocationName.grass_land_1, "Location", self.player) @@ -210,36 +229,89 @@ def set_rules(self) -> None: add_rule(self.multiworld.get_location(LocationName.iceberg_angel, self.player), lambda state: state.count_group("Copy Ability", self.player)) # easier than writing out 8 ands + # Consumables + if self.multiworld.consumables[self.player]: + add_rule(self.multiworld.get_location(LocationName.grass_land_1_u1, self.player), + lambda state: state.has("Parasol", self.player)) + add_rule(self.multiworld.get_location(LocationName.grass_land_1_m1, self.player), + lambda state: state.has("Spark", self.player)) + add_rule(self.multiworld.get_location(LocationName.grass_land_2_u1, self.player), + lambda state: state.has("Needle", self.player)) + add_rule(self.multiworld.get_location(LocationName.ripple_field_2_u1, self.player), + lambda state: state.has("Kine", self.player)) + add_rule(self.multiworld.get_location(LocationName.ripple_field_2_m1, self.player), + lambda state: state.has("Kine", self.player)) + add_rule(self.multiworld.get_location(LocationName.ripple_field_3_u1, self.player), + lambda state: state.has("Cutter", self.player) or state.has("Spark", self.player)) + add_rule(self.multiworld.get_location(LocationName.ripple_field_4_u1, self.player), + lambda state: state.has("Stone", self.player)) + add_rule(self.multiworld.get_location(LocationName.ripple_field_4_m2, self.player), + lambda state: state.has("Stone", self.player)) + add_rule(self.multiworld.get_location(LocationName.ripple_field_5_m1, self.player), + lambda state: state.has("Kine", self.player)) + add_rule(self.multiworld.get_location(LocationName.ripple_field_5_u1, self.player), + lambda state: state.has("Kine", self.player) + and state.has("Burning", self.player) and state.has("Stone", self.player)) + add_rule(self.multiworld.get_location(LocationName.ripple_field_5_m2, self.player), + lambda state: state.has("Kine", self.player) + and state.has("Burning", self.player) and state.has("Stone", self.player)) + add_rule(self.multiworld.get_location(LocationName.sand_canyon_4_u1, self.player), + lambda state: state.has("Clean", self.player)) + add_rule(self.multiworld.get_location(LocationName.sand_canyon_4_m2, self.player), + lambda state: state.has("Needle", self.player)) + add_rule(self.multiworld.get_location(LocationName.sand_canyon_5_u2, self.player), + lambda state: state.has("Ice", self.player) and state.has("Rick", self.player)) + add_rule(self.multiworld.get_location(LocationName.sand_canyon_5_u3, self.player), + lambda state: state.has("Ice", self.player) and state.has("Rick", self.player)) + add_rule(self.multiworld.get_location(LocationName.sand_canyon_5_u4, self.player), + lambda state: state.has("Ice", self.player) and state.has("Rick", self.player)) + add_rule(self.multiworld.get_location(LocationName.cloudy_park_4_u1, self.player), + lambda state: state.has("Coo", self.player)) + add_rule(self.multiworld.get_location(LocationName.cloudy_park_4_m1, self.player), + lambda state: state.has("Coo", self.player)) + add_rule(self.multiworld.get_location(LocationName.cloudy_park_6_u1, self.player), + lambda state: state.has("Cutter", self.player)) + set_rule(self.multiworld.get_location("Level 1 Boss", self.player), lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0]) - and state.can_reach(stage_locations[self.player_levels[self.player][1][5]], "Location", self.player)) + and state.can_reach(location_table[self.player_levels[self.player][1][5]], "Location", + self.player)) set_rule(self.multiworld.get_location(LocationName.grass_land_whispy, self.player), lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0]) - and state.can_reach(stage_locations[self.player_levels[self.player][1][5]], "Location", self.player)) + and state.can_reach(location_table[self.player_levels[self.player][1][5]], "Location", + self.player)) set_rule(self.multiworld.get_location("Level 2 Boss", self.player), lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1]) - and state.can_reach(stage_locations[self.player_levels[self.player][2][5]], "Location", self.player)) + and state.can_reach(location_table[self.player_levels[self.player][2][5]], "Location", + self.player)) set_rule(self.multiworld.get_location(LocationName.ripple_field_acro, self.player), lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1]) - and state.can_reach(stage_locations[self.player_levels[self.player][2][5]], "Location", self.player)) + and state.can_reach(location_table[self.player_levels[self.player][2][5]], "Location", + self.player)) set_rule(self.multiworld.get_location("Level 3 Boss", self.player), lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2]) - and state.can_reach(stage_locations[self.player_levels[self.player][3][5]], "Location", self.player)) + and state.can_reach(location_table[self.player_levels[self.player][3][5]], "Location", + self.player)) set_rule(self.multiworld.get_location(LocationName.sand_canyon_poncon, self.player), lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2]) - and state.can_reach(stage_locations[self.player_levels[self.player][3][5]], "Location", self.player)) + and state.can_reach(location_table[self.player_levels[self.player][3][5]], "Location", + self.player)) set_rule(self.multiworld.get_location("Level 4 Boss", self.player), lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3]) - and state.can_reach(stage_locations[self.player_levels[self.player][4][5]], "Location", self.player)) + and state.can_reach(location_table[self.player_levels[self.player][4][5]], "Location", + self.player)) set_rule(self.multiworld.get_location(LocationName.cloudy_park_ado, self.player), lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3]) - and state.can_reach(stage_locations[self.player_levels[self.player][4][5]], "Location", self.player)) + and state.can_reach(location_table[self.player_levels[self.player][4][5]], "Location", + self.player)) set_rule(self.multiworld.get_location("Level 5 Boss", self.player), lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][4]) - and state.can_reach(stage_locations[self.player_levels[self.player][5][5]], "Location", self.player)) + and state.can_reach(location_table[self.player_levels[self.player][5][5]], "Location", + self.player)) set_rule(self.multiworld.get_location(LocationName.iceberg_dedede, self.player), lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][4]) - and state.can_reach(stage_locations[self.player_levels[self.player][5][5]], "Location", self.player)) + and state.can_reach(location_table[self.player_levels[self.player][5][5]], "Location", + self.player)) set_rule(self.multiworld.get_entrance("To Level 6", self.player), lambda state: state.has("Heart Star", self.player, self.required_heart_stars[self.player])) @@ -313,5 +385,5 @@ def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): if stage & 0x200 == 0: level_hint_data[stage + 0x100] = regions[level] + f" {i + 1}" for i in range(5): - level_hint_data[0x770200 + i] = regions[i+1] + " Boss" + level_hint_data[0x770200 + i] = regions[i + 1] + " Boss" hint_data[self.player] = level_hint_data From 0c0c359a300a8029267b50c55a8dc94d13380213 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 24 Apr 2023 23:18:08 -0500 Subject: [PATCH 033/165] consumable hint fix and 2-4 consumable name fix --- worlds/kdl3/Locations.py | 2 +- worlds/kdl3/__init__.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/worlds/kdl3/Locations.py b/worlds/kdl3/Locations.py index 26284ddeed10..0aa21053d59f 100644 --- a/worlds/kdl3/Locations.py +++ b/worlds/kdl3/Locations.py @@ -103,7 +103,7 @@ def __init__(self, player: int, name: str, address: typing.Optional[int], parent 0x77030E: LocationName.ripple_field_3_u1, 0x77030F: LocationName.ripple_field_4_m2, 0x770310: LocationName.ripple_field_4_u1, - 0x770311: LocationName.ripple_field_4_m2, + 0x770311: LocationName.ripple_field_4_m1, 0x770312: LocationName.ripple_field_5_u1, 0x770313: LocationName.ripple_field_5_m2, 0x770314: LocationName.ripple_field_5_m1, diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 692c9f8bb37e..0968d235c515 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -384,6 +384,9 @@ def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): level_hint_data[stage] = regions[level] + f" {i + 1}" if stage & 0x200 == 0: level_hint_data[stage + 0x100] = regions[level] + f" {i + 1}" + if self.multiworld.consumables[self.player] and stage & 0xFF in level_consumables: + for consumable in level_consumables[stage & 0xFF]: + level_hint_data[consumable + 0x770300] = regions[level] + f" {i + 1}" for i in range(5): level_hint_data[0x770200 + i] = regions[i + 1] + " Boss" hint_data[self.player] = level_hint_data From b05d0bb348d227aea5485662de6c823fe513f7af Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 30 Apr 2023 03:31:51 -0500 Subject: [PATCH 034/165] fix 5-6 sound bug, add fast goal, fix 5-6 logic --- worlds/kdl3/Options.py | 13 ++++++++++++- worlds/kdl3/Rom.py | 26 ++++++++++++++++++++++---- worlds/kdl3/__init__.py | 5 +++-- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 000ba8d4eed7..bf0ce347417c 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -5,7 +5,7 @@ class Goal(Choice): """ - Zero: collect the Heart Stars, purify the five bosses, and defeat Zero in the Hyper Zone. + Zero: collect the Heart Stars, and defeat Zero in the Hyper Zone. Boss Butch: collect the Heart Stars, and then complete the boss rematches in the Boss Butch mode. MG5: collect the Heart Stars, and then complete a perfect run through the minigame gauntlet within the MG5 Jumping: collect the Heart Stars, and then reach a designated score within the Jumping sub-game @@ -18,6 +18,16 @@ class Goal(Choice): default = 0 +class GoalSpeed(Choice): + """ + Normal: the goal is unlocked after purifying the five bosses + Fast: the goal is unlocked after acquiring the target number of Heart Stars + """ + display_name = "Goal Speed" + option_normal = 0 + option_fast = 1 + + class TotalHeartStars(Range): """ Total number of heart stars to include in the pool of items. @@ -178,6 +188,7 @@ class GooeyFlavorPreset(Choice): "death_link": DeathLink, "game_language": GameLanguage, "goal": Goal, + "goal_speed": GoalSpeed, "total_heart_stars": TotalHeartStars, "heart_stars_required": HeartStarsRequired, "filler_percentage": FillerPercentage, diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 55bdf320283a..1346ba9becd5 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -141,9 +141,10 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # Check Purification and Enable Sub-games rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xAD, 0x70, 0x80, 0x18, 0xCF, - 0x0A, 0xD0, 0x07, 0x90, 0x17, 0xDA, 0xA9, 0x14, 0x00, 0x8D, 0x62, 0x7F, 0xA9, 0x01, 0x00, - 0xAE, 0x17, 0x36, 0x9D, 0xDD, 0x53, 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0xFA, 0xBF, 0x00, - 0xD0, 0x07, 0xCD, 0x70, 0x80, 0x10, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) + 0x0A, 0xD0, 0x07, 0x90, 0x28, 0xDA, 0xA9, 0x14, 0x00, 0x8D, 0x62, 0x7F, 0xAF, 0x12, 0xD0, + 0x07, 0xC9, 0x00, 0x00, 0xF0, 0x11, 0xA9, 0x01, 0x00, 0xAE, 0x17, 0x36, 0x9D, 0xDD, 0x53, + 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0x80, 0x05, 0xA9, 0x01, 0x00, 0x8D, 0x00, 0x82, 0xFA, + 0xBF, 0x00, 0xD0, 0x07, 0xCD, 0x70, 0x80, 0x10, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) # Check for Sound on Main Loop rom.write_bytes(0x6AE4, [0x22, 0x00, 0x9B, 0x07, 0xEA]) @@ -165,6 +166,22 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(0x4A01F, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0xB0, ]) # 1-Ups rom.write_bytes(0x4A0AE, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0x90, ]) # Heart Stars + # reroute 5-6 miniboss music override + rom.write_bytes(0x93238, [0x22, 0x80, 0x9F, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xB0, + ]) + rom.write_bytes(0x39F80, [0xEA, 0xDA, 0x5A, 0xA9, 0x00, 0x00, 0xAE, 0x3F, 0x36, 0xAC, 0x41, 0x36, 0xE0, 0x00, 0x00, + 0xF0, 0x0A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0xCA, 0x80, 0xF1, 0xC0, 0x00, 0x00, + 0xF0, 0x04, 0x1A, 0x88, 0x80, 0xF7, 0x0A, 0xAA, 0xBF, 0x20, 0xD0, 0x07, 0xC9, 0x1E, 0x00, + 0xF0, 0x03, 0x18, 0x80, 0x01, 0x38, 0x7A, 0xFA, 0x6B, 0xEA, ]) + # reroute zero eligibility + rom.write_bytes(0x137B1, [0x00, 0x82, 0xC9, 0x01, ]) + + # set goal on non-fast goal + rom.write_bytes(0x14463, [0x22, 0x00, 0x9F, 0x07, 0xEA, 0xEA, ]) + rom.write_bytes(0x39F00, [0xDA, 0xAF, 0x12, 0xD0, 0x07, 0xC9, 0x00, 0x00, 0xF0, 0x11, 0xA9, 0x01, 0x00, 0xAE, 0x17, + 0x36, 0x9D, 0xDD, 0x53, 0x9D, 0xDF, 0x53, 0x9D, 0xD1, 0x53, 0x80, 0x06, 0xA9, 0x01, 0x00, + 0x8D, 0x00, 0x82, 0xFA, 0xA9, 0x06, 0x00, 0x8D, 0xC1, 0x5A, 0x6B, ]) + # base patch done, write relevant slot info # Write checks for consumable-sanity @@ -188,7 +205,8 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, boss_requirements[3], boss_requirements[4])) rom.write_byte(0x3D010, multiworld.death_link[player].value) rom.write_byte(0x3D012, multiworld.goal[player].value) - rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal[player] > 0 + + rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal_speed[player] == 1 else 0xFFFF)) for level in shuffled_levels: diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 0968d235c515..8572cf8d4d15 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -227,7 +227,8 @@ def set_rules(self) -> None: or state.can_reach(LocationName.iceberg_3, "Location", self.player) or state.can_reach(LocationName.iceberg_6, "Location", self.player))) add_rule(self.multiworld.get_location(LocationName.iceberg_angel, self.player), - lambda state: state.count_group("Copy Ability", self.player)) # easier than writing out 8 ands + lambda state: state.has_all(self.item_name_groups["Copy Ability"], self.player)) + # easier than writing out 8 ands # Consumables if self.multiworld.consumables[self.player]: @@ -315,7 +316,7 @@ def set_rules(self) -> None: set_rule(self.multiworld.get_entrance("To Level 6", self.player), lambda state: state.has("Heart Star", self.player, self.required_heart_stars[self.player])) - if self.multiworld.goal[self.player] == 0: + if self.multiworld.goal_speed[self.player] == 0: add_rule(self.multiworld.get_entrance("To Level 6", self.player), lambda state: state.has("Level 1 Boss Purified", self.player) and state.has("Level 2 Boss Purified", self.player) From 16655203c2abf69976c271e294063d7484378ab3 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 2 May 2023 02:49:31 -0500 Subject: [PATCH 035/165] fix 3-5 not being blocked from being placed at 1-1 --- worlds/kdl3/Regions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index fbe72572476d..c5687654fe64 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -17,7 +17,7 @@ first_stage_blacklist = { 0x77000B, # 2-5 needs Kine - 0x770012, # 3-5 needs Cutter + 0x770011, # 3-5 needs Cutter 0x77001C, # 5-4 needs Burning } From 3374658f285875e518892f5f394083c86d04c443 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 5 May 2023 16:44:05 -0500 Subject: [PATCH 036/165] rewrite color conversion to fix math error --- worlds/kdl3/Aesthetics.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index e83312b0c4b6..cbccc2e2f737 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -56,11 +56,10 @@ def get_kirby_palette(multiworld, player): return None -def rgb888_to_bgr555(color: str) -> bytes: - col = int(color, 16) - red = (col & 0xFF0000) >> 19 - green = (col & 0x00FF00) >> 11 - blue = (col & 0x0000FF) >> 3 +def rgb888_to_bgr555(red, green, blue) -> bytes: + red = red >> 3 + green = green >> 3 + blue = blue >> 3 outcol = (blue << 10) + (green << 5) + red return struct.pack("H", outcol) @@ -68,6 +67,9 @@ def rgb888_to_bgr555(color: str) -> bytes: def get_palette_bytes(palette, target, offset, factor): output_data = bytearray() for color in target: - byte_data = rgb888_to_bgr555(str(hex(int(int(palette[color], 16) * factor) + offset))) + colint = int(palette[color], 16) + col = ((colint & 0xFF0000) >> 16, (colint & 0xFF00) >> 8, colint & 0xFF) + col = tuple(int(int(factor*x) + offset) for x in col) + byte_data = rgb888_to_bgr555(col[0], col[1], col[2]) output_data.extend(bytearray(byte_data)) return output_data From dfe68870873bc246e0f780092d586aa5832ccf91 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 5 May 2023 21:52:49 -0500 Subject: [PATCH 037/165] reduce 4-4 consumable logic --- worlds/kdl3/__init__.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 8572cf8d4d15..1b4f80cc4f85 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -266,10 +266,6 @@ def set_rules(self) -> None: lambda state: state.has("Ice", self.player) and state.has("Rick", self.player)) add_rule(self.multiworld.get_location(LocationName.sand_canyon_5_u4, self.player), lambda state: state.has("Ice", self.player) and state.has("Rick", self.player)) - add_rule(self.multiworld.get_location(LocationName.cloudy_park_4_u1, self.player), - lambda state: state.has("Coo", self.player)) - add_rule(self.multiworld.get_location(LocationName.cloudy_park_4_m1, self.player), - lambda state: state.has("Coo", self.player)) add_rule(self.multiworld.get_location(LocationName.cloudy_park_6_u1, self.player), lambda state: state.has("Cutter", self.player)) From 3f49f1737c94b4d9ab0decde6d24de4ae3016aad Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 6 May 2023 14:26:13 -0500 Subject: [PATCH 038/165] add gooey palette functionality --- worlds/kdl3/Aesthetics.py | 40 +++++++++++++++++++++++++++++++++++++++ worlds/kdl3/Options.py | 8 ++++++++ worlds/kdl3/Rom.py | 8 +++++++- 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index cbccc2e2f737..82045c2e3ea5 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -38,11 +38,41 @@ } } +gooey_flavor_presets = { + 3: { + "1": "001616", + "2": "102959", + "3": "18315A", + "4": "1839AB", + "5": "1839EB", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + } +} + kirby_target_palettes = { + 0x64646: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 1), + 0x64846: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 1), 0x1E007E: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 1), 0x1E009C: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 0.5), 0x1E00F6: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 1), + 0x1E0114: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 0.5), 0x1E0216: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 1), + 0x1E0234: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 0.5), + 0x1E0486: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 1), + 0x1E04A4: (["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 0, 0.5), +} + +gooey_target_palettes = { + 0x604C2: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), + 0x60592: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), + 0x60692: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), + 0x1E02CA: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), + 0x1E0342: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), + 0x1E05A6: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), + 0x1E05B8: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 0.5), } @@ -56,6 +86,16 @@ def get_kirby_palette(multiworld, player): return None +def get_gooey_palette(multiworld, player): + palette = multiworld.gooey_flavor_preset[player].value + if palette in gooey_flavor_presets: + return gooey_flavor_presets[palette] + elif palette == 14: + return multiworld.gooey_flavor[player].value + else: + return None + + def rgb888_to_bgr555(red, green, blue) -> bytes: red = red >> 3 green = green >> 3 diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index bf0ce347417c..30bc94bb722d 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -184,6 +184,13 @@ class GooeyFlavorPreset(Choice): default = 0 +class GooeyFlavor(OptionDict): + """ + A custom color for Gooey. + """ + default = {} + + kdl3_options: typing.Dict[str, type(Option)] = { "death_link": DeathLink, "game_language": GameLanguage, @@ -200,4 +207,5 @@ class GooeyFlavorPreset(Choice): "kirby_flavor_preset": KirbyFlavorPreset, "kirby_flavor": KirbyFlavor, "gooey_flavor_preset": GooeyFlavorPreset, + "gooey_flavor": GooeyFlavor, } diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 1346ba9becd5..bd318b64dcfe 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -4,7 +4,7 @@ import os import struct from worlds.Files import APDeltaPatch -from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette +from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette, gooey_target_palettes, get_gooey_palette KDL3UHASH = "201e7658f6194458a3869dde36bf8ec2" KDL3JHASH = "b2f2d004ea640c3db66df958fce122b2" @@ -236,6 +236,12 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, palette = get_kirby_palette(multiworld, player) rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1], target[2])) + if multiworld.gooey_flavor_preset[player] != 0: + for addr in gooey_target_palettes: + target = gooey_target_palettes[addr] + palette = get_gooey_palette(multiworld,player) + rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1], target[2])) + def get_base_rom_bytes(file_name: str = "") -> bytes: base_rom_bytes: Optional[bytes] = getattr(get_base_rom_bytes, "base_rom_bytes", None) From 37a5410c05d424fc76bf02039c86218a1cf81807 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 6 May 2023 14:36:38 -0500 Subject: [PATCH 039/165] fix fast minigame bug --- worlds/kdl3/Rom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index bd318b64dcfe..df066aeff671 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -137,13 +137,13 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0xF0, 0x01, 0xE8, 0x7A, 0xA9, 0x99, 0x99, 0x6B, ]) # Allow Purification - rom.write_bytes(0x30518, [0x22, 0xA0, 0x99, 0xC3, 0xEA, 0xEA, ]) + rom.write_bytes(0x30518, [0x22, 0x00, 0x9A, 0x07, 0xEA, 0xEA, ]) # Check Purification and Enable Sub-games rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xAD, 0x70, 0x80, 0x18, 0xCF, 0x0A, 0xD0, 0x07, 0x90, 0x28, 0xDA, 0xA9, 0x14, 0x00, 0x8D, 0x62, 0x7F, 0xAF, 0x12, 0xD0, 0x07, 0xC9, 0x00, 0x00, 0xF0, 0x11, 0xA9, 0x01, 0x00, 0xAE, 0x17, 0x36, 0x9D, 0xDD, 0x53, - 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0x80, 0x05, 0xA9, 0x01, 0x00, 0x8D, 0x00, 0x82, 0xFA, + 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0x80, 0x06, 0xA9, 0x01, 0x00, 0x8D, 0x00, 0x82, 0xFA, 0xBF, 0x00, 0xD0, 0x07, 0xCD, 0x70, 0x80, 0x10, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) # Check for Sound on Main Loop From 1a9ac7c58c35fa956cece2b35baab80fd7124404 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 7 May 2023 21:22:56 -0500 Subject: [PATCH 040/165] fix inverted labelling of copy ability/purification patches --- worlds/kdl3/Rom.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index df066aeff671..dd424b3c0d18 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -123,8 +123,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, ]) # Kirby/Gooey Copy Ability - rom.write_bytes(0xAFC8, [0x22, 0x00, 0x9A, 0x07, - 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) + rom.write_bytes(0x30518, [0x22, 0xA0, 0x99, 0x07, 0xEA, 0xEA, ]) # Animal Copy Ability rom.write_bytes(0x507E8, [0x22, 0xB9, 0x99, 0x07, 0xEA, 0xEA, ]) @@ -137,7 +136,8 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0xF0, 0x01, 0xE8, 0x7A, 0xA9, 0x99, 0x99, 0x6B, ]) # Allow Purification - rom.write_bytes(0x30518, [0x22, 0x00, 0x9A, 0x07, 0xEA, 0xEA, ]) + rom.write_bytes(0xAFC8, [0x22, 0x00, 0x9A, 0x07, + 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # Check Purification and Enable Sub-games rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xAD, 0x70, 0x80, 0x18, 0xCF, From 91df55b8013ae0882fdac42852a5328cea5ec43f Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 8 May 2023 01:37:19 -0500 Subject: [PATCH 041/165] goal tests and resulting cleanup --- worlds/kdl3/Regions.py | 4 +-- worlds/kdl3/test/TestGoal.py | 61 ++++++++++++++++++++++++++++++++++++ worlds/kdl3/test/__init__.py | 5 +++ 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 worlds/kdl3/test/TestGoal.py create mode 100644 worlds/kdl3/test/__init__.py diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index c5687654fe64..561dc2e965d3 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -182,7 +182,7 @@ def create_levels(world: World) -> None: tlv5 = Entrance(world.player, "To Level 5", level4) level4.exits.append(tlv5) tlv5.connect(level5) - tlv6 = Entrance(world.player, "To Level 6", level5) - level5.exits.append(tlv6) + tlv6 = Entrance(world.player, "To Level 6", menu) + menu.exits.append(tlv6) tlv6.connect(level6) world.multiworld.regions += [menu, level1, level2, level3, level4, level5, level6] diff --git a/worlds/kdl3/test/TestGoal.py b/worlds/kdl3/test/TestGoal.py new file mode 100644 index 000000000000..576eef1d881a --- /dev/null +++ b/worlds/kdl3/test/TestGoal.py @@ -0,0 +1,61 @@ +from . import KDL3TestBase + + +class TestFastGoal(KDL3TestBase): + options = { + "goal_speed": "fast", + "total_heart_stars": 30, + "heart_stars_required": 50, + "filler_percentage": 0, + } + + def testGoal(self): + self.assertBeatable(False) + heart_stars = self.get_items_by_name("Heart Star") + self.collect(heart_stars[0:14]) + self.assertEqual(self.count("Heart Star"), 14) + self.assertBeatable(False) + self.collect(heart_stars[14:15]) + self.assertEqual(self.count("Heart Star"), 15) + self.assertBeatable(True) + self.remove([self.get_item_by_name("Love-Love Rod")]) + self.collect_by_name("Kine") # Ensure a little more progress, but leave out cutter and burning + self.collect(heart_stars[15:]) + self.assertBeatable(True) + + +class TestNormalGoal(KDL3TestBase): + options = { + "goal_speed": "normal", + "total_heart_stars": 30, + "heart_stars_required": 50, + "filler_percentage": 0, + } + + def testGoal(self): + self.assertBeatable(False) + heart_stars = self.get_items_by_name("Heart Star") + self.collect(heart_stars[0:14]) + self.assertEqual(self.count("Heart Star"), 14) + self.assertBeatable(False) + self.collect(heart_stars[14:15]) + self.assertEqual(self.count("Heart Star"), 15) + self.assertBeatable(False) + self.collect_by_name(["Burning", "Cutter", "Kine"]) + self.assertBeatable(True) + self.remove([self.get_item_by_name("Love-Love Rod")]) + self.collect(heart_stars) + self.assertEqual(self.count("Heart Star"), 30) + self.assertBeatable(True) + + def testKine(self): + self.collect_by_name(["Cutter", "Burning", "Heart Star"]) + self.assertBeatable(False) + + def testCutter(self): + self.collect_by_name(["Kine", "Burning", "Heart Star"]) + self.assertBeatable(False) + + def testBurning(self): + self.collect_by_name(["Cutter", "Kine", "Heart Star"]) + self.assertBeatable(False) diff --git a/worlds/kdl3/test/__init__.py b/worlds/kdl3/test/__init__.py new file mode 100644 index 000000000000..97c1eda6d23f --- /dev/null +++ b/worlds/kdl3/test/__init__.py @@ -0,0 +1,5 @@ +from test.TestBase import WorldTestBase + + +class KDL3TestBase(WorldTestBase): + game = "Kirby's Dream Land 3" From aa03b8cee9b965a71ac9f482a97f3ea763136875 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 14 May 2023 18:27:55 -0500 Subject: [PATCH 042/165] allow custom gooey, more gooey pal --- worlds/kdl3/Aesthetics.py | 7 +++++-- worlds/kdl3/Options.py | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index 82045c2e3ea5..7a9a9ba2c452 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -67,12 +67,15 @@ gooey_target_palettes = { 0x604C2: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), - 0x60592: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), - 0x60692: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), + 0x64592: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), + 0x64692: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), + 0x64892: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), 0x1E02CA: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), 0x1E0342: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), 0x1E05A6: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), 0x1E05B8: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 0.5), + 0x1E0636: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1), + 0x1E065A: (["1", "2", "3", "4", "5", "6", "7", "8", "9"], 0, 1.5), } diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 30bc94bb722d..729d32f157d0 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -181,6 +181,7 @@ class GooeyFlavorPreset(Choice): #option_orange = 11 #option_kiwi = 12 #option_lavender = 13 + option_custom = 14 default = 0 From 2f8e923d8eda7e6b7a2c0644130d53ad7197a935 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 21 May 2023 22:02:22 -0500 Subject: [PATCH 043/165] begin on strict boss setting --- worlds/kdl3/Client.py | 2 +- worlds/kdl3/Options.py | 12 ++++++++++-- worlds/kdl3/Rom.py | 6 ++++++ worlds/kdl3/__init__.py | 21 +++++++++++++++++---- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 261b804b94b5..c0b9e2d45813 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -256,7 +256,7 @@ async def game_watcher(self, ctx) -> None: # consumable status consumables = await snes_read(ctx, KDL3_CONSUMABLES, 1920) for consumable in consumable_addrs: - # TODO see if this can be sped up in any way + # TODO: see if this can be sped up in any way if consumables[consumable_addrs[consumable]] == 0x01: loc_id = 0x770300 + consumable if loc_id not in ctx.checked_locations: diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 729d32f157d0..376c78c25119 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -1,4 +1,4 @@ -from Options import Option, DeathLink, Choice, Toggle, OptionDict, Range, PlandoBosses +from Options import Option, DeathLink, Choice, Toggle, OptionDict, Range, PlandoBosses, DefaultOnToggle import typing from .Names import LocationName @@ -88,9 +88,16 @@ def can_place_boss(cls, boss: str, location: str) -> bool: option_singularity = 3 +class StrictBosses(DefaultOnToggle): + """ + If enabled, one will not be able to move onto the next world until the previous world's boss has been purified. + """ + display_name = "Strict Bosses" + + class BossRequirementRandom(Toggle): """ - If enabled, boss purification will unlock in any order, not sequentially. + If enabled, boss purification will unlock in any order, requiring a random amount of Heart Stars. """ display_name = "Randomize Purification Order" @@ -203,6 +210,7 @@ class GooeyFlavor(OptionDict): "jumping_target": JumpingTarget, "stage_shuffle": LevelShuffle, "boss_shuffle": BossShuffle, + "strict_bosses": StrictBosses, "boss_requirement_random": BossRequirementRandom, "consumables": ConsumableChecks, "kirby_flavor_preset": KirbyFlavorPreset, diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index dd424b3c0d18..97b14e14e667 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -184,6 +184,12 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # base patch done, write relevant slot info + # Write strict bosses patch + if multiworld.strict_bosses[player]: + rom.write_bytes(0x3A000, [0xDA, 0xAE, 0xCB, 0x53, 0xBF, 0x00, 0xD0, 0x07, 0xCD, 0x70, 0x80, 0x90, 0x0B, 0x8A, 0x1A, + 0x8D, 0xC1, 0x5A, 0x8D, 0xCB, 0x53, 0x9C, 0xCD, 0x53, 0x8A, 0x6B, ]) + rom.write_bytes(0x143E1, [0x22, 0x00, 0xA0, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) + # Write checks for consumable-sanity if multiworld.consumables[player]: # Redirect Consumable Effect and write index diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 1b4f80cc4f85..7e63ccda6035 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -88,13 +88,15 @@ def create_items(self) -> None: self.required_heart_stars[self.player] = required_heart_stars # handle boss requirements here requirements = [required_heart_stars] - for i in range(4): - requirements.append(self.multiworld.per_slot_randoms[self.player].randint( - min(3, required_heart_stars), required_heart_stars)) if self.multiworld.boss_requirement_random[self.player].value: + for i in range(4): + requirements.append(self.multiworld.per_slot_randoms[self.player].randint( + min(3, required_heart_stars), required_heart_stars)) self.multiworld.per_slot_randoms[self.player].shuffle(requirements) else: - requirements.sort() + quotient = required_heart_stars // 5 # since we set the last manually, we can afford imperfect rounding + for i in range(1, 5): + requirements.insert(i - 1, quotient * i) self.boss_requirements[self.player] = requirements itempool.extend([self.create_item("Heart Star") for _ in range(required_heart_stars)]) itempool.extend([self.create_item(self.get_filler_item_name()) @@ -310,8 +312,19 @@ def set_rules(self) -> None: and state.can_reach(location_table[self.player_levels[self.player][5][5]], "Location", self.player)) + if self.multiworld.strict_bosses[self.player]: + add_rule(self.multiworld.get_entrance("To Level 2", self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0])) + add_rule(self.multiworld.get_entrance("To Level 3", self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1])) + add_rule(self.multiworld.get_entrance("To Level 4", self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2])) + add_rule(self.multiworld.get_entrance("To Level 5", self.player), + lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3])) + set_rule(self.multiworld.get_entrance("To Level 6", self.player), lambda state: state.has("Heart Star", self.player, self.required_heart_stars[self.player])) + if self.multiworld.goal_speed[self.player] == 0: add_rule(self.multiworld.get_entrance("To Level 6", self.player), lambda state: state.has("Level 1 Boss Purified", self.player) From 4651eb3b5d78ba5746918da16f9ec24d4ee1995b Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 21 May 2023 22:54:43 -0500 Subject: [PATCH 044/165] fix plando connections (for now, until change occurs on main) --- Generate.py | 2 +- worlds/kdl3/Regions.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Generate.py b/Generate.py index afb34f11c6be..bf9146572419 100644 --- a/Generate.py +++ b/Generate.py @@ -473,7 +473,7 @@ def roll_settings(weights: dict, plando_options: PlandoOptions = PlandoOptions.b handle_option(ret, game_weights, option_key, option, plando_options) if PlandoOptions.items in plando_options: ret.plando_items = game_weights.get("plando_items", []) - if ret.game == "Minecraft" or ret.game == "Ocarina of Time": + if ret.game == "Minecraft" or ret.game == "Ocarina of Time" or ret.game == "Kirby's Dream Land 3": # bad hardcoded behavior to make this work for now ret.plando_connections = [] if PlandoOptions.connections in plando_options: diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 561dc2e965d3..57275fca224d 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -45,16 +45,16 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo possible_stages.append(default_levels[level][stage]) if world.multiworld.plando_connections[world.player]: - for entrance, stage in world.multiworld.plando_connections[world.player]: + for connection in world.multiworld.plando_connections[world.player]: try: - entrance_world, entrance_stage = entrance.split("-") - stage_world, stage_stage = stage.split("-") - new_stage = default_levels[LocationName.level_names[stage_world.trim()]][int(stage_stage)] - levels[LocationName.level_names[entrance_world.trim()]][int(entrance_stage)] = new_stage + entrance_world, entrance_stage = connection.entrance.rsplit(" ", 1) + stage_world, stage_stage = connection.exit.rsplit(" ", 1) + new_stage = default_levels[LocationName.level_names[stage_world.strip()]][int(stage_stage) - 1] + levels[LocationName.level_names[entrance_world.strip()]][int(entrance_stage) - 1] = new_stage possible_stages.remove(new_stage) except Exception: - raise Exception(f"Invalid connection: {entrance} => {stage} for player {world.player} ({world.multiworld.player_name[world.player]}") + raise Exception(f"Invalid connection: {connection.entrance} => {connection.exit} for player {world.player} ({world.multiworld.player_name[world.player]})") for level in range(1, 6): for stage in range(6): From b8231d8310093a97c3acdc1596ecca7a6fd05722 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 22 May 2023 00:02:54 -0500 Subject: [PATCH 045/165] strict bosses, fix purification check off-by-one --- worlds/kdl3/Options.py | 2 +- worlds/kdl3/Rom.py | 2 +- worlds/kdl3/__init__.py | 15 ++++++++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 376c78c25119..eb02b0b2a70b 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -33,7 +33,7 @@ class TotalHeartStars(Range): Total number of heart stars to include in the pool of items. """ display_name = "Total Heart Stars" - range_start = 1 + range_start = 5 # set to 5 so strict bosses does not degrade range_end = 50 # 30 default locations + 30 stage clears + 5 bosses - 14 progression items = 51, so round down default = 30 diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 97b14e14e667..ac4b2a8779cb 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -144,7 +144,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0x0A, 0xD0, 0x07, 0x90, 0x28, 0xDA, 0xA9, 0x14, 0x00, 0x8D, 0x62, 0x7F, 0xAF, 0x12, 0xD0, 0x07, 0xC9, 0x00, 0x00, 0xF0, 0x11, 0xA9, 0x01, 0x00, 0xAE, 0x17, 0x36, 0x9D, 0xDD, 0x53, 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0x80, 0x06, 0xA9, 0x01, 0x00, 0x8D, 0x00, 0x82, 0xFA, - 0xBF, 0x00, 0xD0, 0x07, 0xCD, 0x70, 0x80, 0x10, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) + 0xBF, 0x00, 0xD0, 0x07, 0xCD, 0x70, 0x80, 0x90, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) # Check for Sound on Main Loop rom.write_bytes(0x6AE4, [0x22, 0x00, 0x9B, 0x07, 0xEA]) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 7e63ccda6035..9dbde32d014c 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -1,3 +1,5 @@ +import logging + from BaseClasses import Tutorial, ItemClassification, MultiWorld from worlds.AutoWorld import World, WebWorld from worlds.generic.Rules import set_rule, add_rule @@ -15,6 +17,7 @@ import threading import base64 +logger = logging.getLogger("Kirby's Dream Land 3") class KDL3WebWorld(WebWorld): theme = "partyTime" @@ -72,6 +75,13 @@ def get_filler_item_name(self) -> str: return self.multiworld.random.choices(list(filler_item_weights.keys()), weights=list(filler_item_weights.values()))[0] + def generate_early(self) -> None: + # just check for invalid option combos here + if self.multiworld.strict_bosses[self.player] and self.multiworld.boss_requirement_random[self.player]: + logger.warning(f"boss_requirement_random forced to false for player {self.player}" + + f" because of strict_bosses set to true") + self.multiworld.boss_requirement_random[self.player].value = False + def create_items(self) -> None: itempool = [] itempool.extend([self.create_item(name) for name in copy_ability_table]) @@ -92,7 +102,10 @@ def create_items(self) -> None: for i in range(4): requirements.append(self.multiworld.per_slot_randoms[self.player].randint( min(3, required_heart_stars), required_heart_stars)) - self.multiworld.per_slot_randoms[self.player].shuffle(requirements) + if self.multiworld.strict_bosses[self.player]: + requirements.sort() + else: + self.multiworld.per_slot_randoms[self.player].shuffle(requirements) else: quotient = required_heart_stars // 5 # since we set the last manually, we can afford imperfect rounding for i in range(1, 5): From 7208132eab07e73374b84e4849b8668823303f3a Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 22 May 2023 00:10:17 -0500 Subject: [PATCH 046/165] fix purification result actually this time --- worlds/kdl3/Rom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index ac4b2a8779cb..ef552a660221 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -144,7 +144,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0x0A, 0xD0, 0x07, 0x90, 0x28, 0xDA, 0xA9, 0x14, 0x00, 0x8D, 0x62, 0x7F, 0xAF, 0x12, 0xD0, 0x07, 0xC9, 0x00, 0x00, 0xF0, 0x11, 0xA9, 0x01, 0x00, 0xAE, 0x17, 0x36, 0x9D, 0xDD, 0x53, 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0x80, 0x06, 0xA9, 0x01, 0x00, 0x8D, 0x00, 0x82, 0xFA, - 0xBF, 0x00, 0xD0, 0x07, 0xCD, 0x70, 0x80, 0x90, 0x02, 0x38, 0x6B, 0x18, 0x6B, ]) + 0xAD, 0x70, 0x80, 0xDF, 0x00, 0xD0, 0x07, 0xB0, 0x02, 0x18, 0x6B, 0x38, 0x6B, ]) # Check for Sound on Main Loop rom.write_bytes(0x6AE4, [0x22, 0x00, 0x9B, 0x07, 0xEA]) From e42f1a75898f43a4cdf37e889ed7a55371aa16bf Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 24 May 2023 01:58:54 -0500 Subject: [PATCH 047/165] fix strict bosses patch --- worlds/kdl3/Rom.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index ef552a660221..a688a5f74b59 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -186,9 +186,10 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # Write strict bosses patch if multiworld.strict_bosses[player]: - rom.write_bytes(0x3A000, [0xDA, 0xAE, 0xCB, 0x53, 0xBF, 0x00, 0xD0, 0x07, 0xCD, 0x70, 0x80, 0x90, 0x0B, 0x8A, 0x1A, - 0x8D, 0xC1, 0x5A, 0x8D, 0xCB, 0x53, 0x9C, 0xCD, 0x53, 0x8A, 0x6B, ]) - rom.write_bytes(0x143E1, [0x22, 0x00, 0xA0, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) + rom.write_bytes(0x3A000, [0xDA, 0xAE, 0xCD, 0x53, 0xEC, 0xC1, 0x5A, 0xD0, 0x19, 0xE0, 0x07, 0x00, 0xD0, 0x14, + 0xAE, 0xCB, 0x53, 0xCA, 0x8A, 0x0A, 0xAA, 0xAD, 0x70, 0x80, 0xDF, 0x00, 0xD0, 0x07, + 0xB0, 0x03, 0x18, 0x80, 0x01, 0x38, 0xFA, 0xAD, 0xCD, 0x53, 0x6B, ]) + rom.write_bytes(0x143C7, [0x22, 0x00, 0xA0, 0x07, 0xEA, 0xEA, 0xB0, ]) # Write checks for consumable-sanity if multiworld.consumables[player]: From 4605ed5e02e329201957dbb192da1ba820e94b24 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 24 May 2023 17:59:56 -0500 Subject: [PATCH 048/165] boss shuffle description --- worlds/kdl3/Options.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index eb02b0b2a70b..9133e6321c9d 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -68,6 +68,7 @@ class BossShuffle(PlandoBosses): """ None: Bosses will remain in their vanilla locations Shuffled: Bosses will be shuffled amongst each other + Full: Bosses will be randomized Singularity: All (non-Zero) bosses will be replaced with a single boss Supports plando placement. """ From f1f7f3e1a8614d5c2b4009b65b1eb9e81f053dfc Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 27 May 2023 02:36:30 -0500 Subject: [PATCH 049/165] utils fix, fix strict bosses (final) --- Utils.py | 3 +++ host.yaml | 7 +++---- worlds/kdl3/Rom.py | 6 +++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Utils.py b/Utils.py index 670bbc1ecda4..eb92c41944bc 100644 --- a/Utils.py +++ b/Utils.py @@ -345,6 +345,9 @@ def get_default_options() -> OptionsType: "rom_start": True, "rom_args": "" }, + "kdl3_options":{ + "rom_file": "Kirby's Dream Land 3 (USA).sfc" + } } return options diff --git a/host.yaml b/host.yaml index 7071e937cd58..3d26a461d306 100644 --- a/host.yaml +++ b/host.yaml @@ -144,9 +144,6 @@ dkc3_options: smw_options: # File name of the SMW US rom rom_file: "Super Mario World (USA).sfc" -kdl3_options: - # File name of the KDL3 US rom - rom_file: "Kirby's Dream Land 3 (USA).sfc" pokemon_rb_options: # File names of the Pokemon Red and Blue roms red_rom_file: "Pokemon Red (UE) [S][!].gb" @@ -188,7 +185,9 @@ adventure_options: rom_args: " " # Set this to true to display item received messages in Emuhawk display_msgs: true - +kdl3_options: + # File name of the KDL3 US rom + rom_file: "Kirby's Dream Land 3 (USA).sfc" diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index a688a5f74b59..0abdc936482d 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -186,10 +186,10 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # Write strict bosses patch if multiworld.strict_bosses[player]: - rom.write_bytes(0x3A000, [0xDA, 0xAE, 0xCD, 0x53, 0xEC, 0xC1, 0x5A, 0xD0, 0x19, 0xE0, 0x07, 0x00, 0xD0, 0x14, + rom.write_bytes(0x3A000, [0xDA, 0xAD, 0xCB, 0x53, 0xC9, 0x05, 0x00, 0xB0, 0x15, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xAE, 0xCB, 0x53, 0xCA, 0x8A, 0x0A, 0xAA, 0xAD, 0x70, 0x80, 0xDF, 0x00, 0xD0, 0x07, - 0xB0, 0x03, 0x18, 0x80, 0x01, 0x38, 0xFA, 0xAD, 0xCD, 0x53, 0x6B, ]) - rom.write_bytes(0x143C7, [0x22, 0x00, 0xA0, 0x07, 0xEA, 0xEA, 0xB0, ]) + 0xB0, 0x03, 0x38, 0x80, 0x01, 0x18, 0xFA, 0xAD, 0xCD, 0x53, 0x6B, ]) + rom.write_bytes(0x143D9, [0x22, 0x00, 0xA0, 0x07, 0xEA, 0xEA, ]) # Write checks for consumable-sanity if multiworld.consumables[player]: From b0b511c12bdadfe84fa6e883a408b03362a86241 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 27 May 2023 02:45:16 -0500 Subject: [PATCH 050/165] enable bubblegum kirby and cherry gooey --- worlds/kdl3/Aesthetics.py | 28 ++++++++++++++++++++++++++++ worlds/kdl3/Options.py | 4 ++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index 7a9a9ba2c452..26cf00dc1468 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -2,6 +2,23 @@ from struct import pack kirby_flavor_presets = { + 1: { + "1": "B50029", + "2": "FF91C6", + "3": "B0123B", + "4": "630F0F", + "5": "D60052", + "6": "DE4873", + "7": "D07880", + "8": "000000", + "9": "F770A5", + "10": "E01784", + "11": "CA4C74", + "12": "A7443F", + "13": "FF1784", + "14": "FFA1DE", + "15": "B03830", + }, 3: { "1": "a6a6ed", "2": "e6e6fa", @@ -39,6 +56,17 @@ } gooey_flavor_presets = { + 2: { + "1": "161600", + "2": "592910", + "3": "5A3118", + "4": "AB3918", + "5": "EB3918", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, 3: { "1": "001616", "2": "102959", diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 9133e6321c9d..2d98cebae4fe 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -146,7 +146,7 @@ class KirbyFlavorPreset(Choice): """ display_name = "Kirby Flavor" option_default = 0 - #option_bubblegum = 1 + option_bubblegum = 1 #option_cherry = 2 option_blueberry = 3 #option_lemon = 4 @@ -177,7 +177,7 @@ class GooeyFlavorPreset(Choice): display_name = "Gooey Flavor" option_default = 0 #option_bubblegum = 1 - #option_cherry = 2 + option_cherry = 2 option_blueberry = 3 #option_lemon = 4 #option_lime = 5 From 047aacd0f5a73a405e2736480168a429917069fc Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 3 Jun 2023 19:45:50 -0500 Subject: [PATCH 051/165] stage sprites and open world --- worlds/kdl3/Compression.py | 59 +++++++++ worlds/kdl3/Options.py | 20 +++ worlds/kdl3/Rom.py | 142 +++++++++++++++++++- worlds/kdl3/Rules.py | 260 +++++++++++++++++++++++++++++++++++++ worlds/kdl3/__init__.py | 231 +------------------------------- 5 files changed, 482 insertions(+), 230 deletions(-) create mode 100644 worlds/kdl3/Compression.py create mode 100644 worlds/kdl3/Rules.py diff --git a/worlds/kdl3/Compression.py b/worlds/kdl3/Compression.py new file mode 100644 index 000000000000..59627fd312bb --- /dev/null +++ b/worlds/kdl3/Compression.py @@ -0,0 +1,59 @@ +""" +HAL decompression based on exhal by devinacker +https://github.com/devinacker/exhal +""" + + +def hal_decompress(comp: bytes) -> bytes: + inpos = 0 + + input = 0 + output = bytearray() + while input != 0xFF: + remaining = 65536 - inpos + if remaining < 1: + return bytes() + input = comp[inpos] + inpos += 1 + if input == 0xFF: + break + if (input & 0xE0) == 0xE0: + command = (input >> 2) & 0x07 + length = (((input & 0x03) << 8) | comp[inpos]) + 1 + inpos += 1 + else: + command = input >> 5 + length = (input & 0x1F) + 1 + if (command == 2 and ((len(output) + 2*length) > 65536)) or (len(output) + length) > 65536: + return bytes() + if command == 0: + output.extend(comp[inpos:inpos+length]) + inpos += length + elif command == 1: + output.extend([comp[inpos] for _ in range(length)]) + inpos += 1 + elif command == 2: + output.extend([comp[x] for _ in range(length) for x in (inpos, inpos+1)]) + inpos += 2 + elif command == 3: + output.extend([comp[inpos] + i for i in range(length)]) + inpos += 1 + elif command == 4 or command == 7: + offset = (comp[inpos] << 8) | comp[inpos + 1] + if (offset + length) > 65536: + return bytes() + output.extend(output[offset:offset+length]) + inpos += 2 + elif command == 5: + offset = (comp[inpos] << 8) | comp[inpos + 1] + if (offset + length) > 65536: + return bytes() + output.extend([int('{:08b}'.format(x)[::-1], 2) for x in output[offset:offset+length]]) + inpos += 2 + elif command == 6: + offset = (comp[inpos] << 8) | comp[inpos + 1] + if offset < length - 1: + return bytes() + output.extend([output[offset - x] for x in range(length)]) + inpos += 2 + return bytes(output) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 2d98cebae4fe..bdfa23ab4a58 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -96,6 +96,24 @@ class StrictBosses(DefaultOnToggle): display_name = "Strict Bosses" +class OpenWorld(Toggle): + """ + If enabled, all 6 stages will be unlocked upon entering a world for the first time. A certain amount of stages + will need to be completed in order to unlock the bosses + """ + display_name = "Open World" + + +class OpenWorldBossRequirement(Range): + """ + The amount of stages completed needed to unlock the boss of a world when Open World is turned on. + """ + display_name = "Open World Boss Requirement" + range_start = 1 + range_end = 6 + default = 3 + + class BossRequirementRandom(Toggle): """ If enabled, boss purification will unlock in any order, requiring a random amount of Heart Stars. @@ -212,6 +230,8 @@ class GooeyFlavor(OptionDict): "stage_shuffle": LevelShuffle, "boss_shuffle": BossShuffle, "strict_bosses": StrictBosses, + "open_world": OpenWorld, + "ow_boss_requirement": OpenWorldBossRequirement, "boss_requirement_random": BossRequirementRandom, "consumables": ConsumableChecks, "kirby_flavor_preset": KirbyFlavorPreset, diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 0abdc936482d..aff26025abf8 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -5,6 +5,7 @@ import struct from worlds.Files import APDeltaPatch from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette, gooey_target_palettes, get_gooey_palette +from .Compression import hal_decompress KDL3UHASH = "201e7658f6194458a3869dde36bf8ec2" KDL3JHASH = "b2f2d004ea640c3db66df958fce122b2" @@ -47,6 +48,85 @@ 0x770204: 0x06A4, } +level_sprites = { + 0x19B2C6: 1827, + 0x1A195C: 1584, + 0x19F6F3: 1679, + 0x19DC8B: 1717, + 0x197900: 1872 +} + +stage_tiles = { + 0: [ + 0, 1, 2, + 16, 17, 18, + 32, 33, 34, + 48, 49, 50 + ], + 1: [ + 3, 4, 5, + 19, 20, 21, + 35, 36, 37, + 51, 52, 53 + ], + 2: [ + 6, 7, 8, + 22, 23, 24, + 38, 39, 40, + 54, 55, 56 + ], + 3: [ + 9, 10, 11, + 25, 26, 27, + 41, 42, 43, + 57, 58, 59, + ], + 4: [ + 12, 13, 64, + 28, 29, 65, + 44, 45, 66, + 60, 61, 67 + ], + 5: [ + 14, 15, 68, + 30, 31, 69, + 46, 47, 70, + 62, 63, 71 + ] +} + +stage_palettes = [0x60964, 0x60B64, 0x60D64, 0x60F64, 0x61164] + + +def handle_level_sprites(stages, sprites, palettes): + palette_by_level = list() + for palette in palettes: + palette_by_level.extend(palette[10:16]) + for i in range(5): + for j in range(6): + palettes[i][10+j] = palette_by_level[stages[i][j]-1] + palettes[i] = [x for palette in palettes[i] for x in palette] + tiles_by_level = list() + for spritesheet in sprites: + decompressed = hal_decompress(spritesheet) + tiles = [decompressed[i:i+32] for i in range(0, 2304, 32)] + tiles_by_level.extend([[tiles[x] for x in stage_tiles[stage]] for stage in stage_tiles]) + for world in range(5): + levels = [stages[world][x] - 1 for x in range(6)] + world_tiles = [None for _ in range(72)] + for i in range(6): + for x in range(12): + world_tiles[stage_tiles[i][x]] = tiles_by_level[levels[i]][x] + sprites[world] = list() + for tile in world_tiles: + sprites[world].extend(tile) + # insert our fake compression + sprites[world][0:0] = [0xe3, 0xff] + sprites[world][1026:1026] = [0xe3, 0xff] + sprites[world][2052:2052] = [0xe0, 0xff] + sprites[world].append(0xff) + return sprites, palettes + class KDL3DeltaPatch(APDeltaPatch): hash = [KDL3UHASH, KDL3JHASH] @@ -57,6 +137,25 @@ class KDL3DeltaPatch(APDeltaPatch): def get_source_data(cls) -> bytes: return get_base_rom_bytes() + def patch(self, target: str): + super().patch(target) + rom = RomData(target) + if rom.read_bytes(0x3D014, 1)[0] > 0: + stages = [struct.unpack("HHHHHHH", rom.read_bytes(0x3D020 + x*14, 14)) for x in range(5)] + palettes = [rom.read_bytes(full_pal, 512) for full_pal in stage_palettes] + palettes = [[palette[i:i+32] for i in range(0, 512, 32)] for palette in palettes] + sprites = [rom.read_bytes(offset, level_sprites[offset]) for offset in level_sprites] + sprites, palettes = handle_level_sprites(stages, sprites, palettes) + for addr, palette in zip(stage_palettes, palettes): + rom.write_bytes(addr, palette) + for addr, level_sprite in zip([0x1CA000, 0x1CA920, 0x1CB230, 0x1CBB40, 0x1CC450], sprites): + rom.write_bytes(addr, level_sprite) + rom.write_bytes(0x460A, [0x00, 0xA0, 0x39, 0x20, 0xA9, 0x39, 0x30, 0xB2, 0x39, 0x40, 0xBB, 0x39, + 0x50, 0xC4, 0x39]) + rom.write_to_file(target) + + + class RomData: def __init__(self, file, name=None): @@ -182,6 +281,14 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0x36, 0x9D, 0xDD, 0x53, 0x9D, 0xDF, 0x53, 0x9D, 0xD1, 0x53, 0x80, 0x06, 0xA9, 0x01, 0x00, 0x8D, 0x00, 0x82, 0xFA, 0xA9, 0x06, 0x00, 0x8D, 0xC1, 0x5A, 0x6B, ]) + # set flag for completing a stage + rom.write_bytes(0x143C7, [0x22, 0x80, 0xA0, 0x07, 0xEA, 0xEA, ]) + rom.write_bytes(0x3A080, [0xDA, 0xA9, 0x00, 0x00, 0xAE, 0xCF, 0x53, 0xE0, 0x00, 0x00, 0xF0, 0x0A, 0xCA, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x80, 0xF1, 0xAE, 0xD3, 0x53, 0xE0, 0x07, 0x00, 0xF0, 0x1B, + 0xCA, 0xE0, 0x00, 0x00, 0xF0, 0x04, 0x1A, 0xCA, 0x80, 0xF7, 0x0A, 0xAA, 0xBD, 0x20, 0x90, + 0x3A, 0x0A, 0xAA, 0xA9, 0x01, 0x00, 0x1D, 0x00, 0x82, 0x9D, 0x00, 0x82, 0xFA, 0xAD, 0xCD, + 0x53, 0xCD, 0xC1, 0x5A, 0x6B, ]) + # base patch done, write relevant slot info # Write strict bosses patch @@ -191,6 +298,38 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0xB0, 0x03, 0x38, 0x80, 0x01, 0x18, 0xFA, 0xAD, 0xCD, 0x53, 0x6B, ]) rom.write_bytes(0x143D9, [0x22, 0x00, 0xA0, 0x07, 0xEA, 0xEA, ]) + # Write open world patch + if multiworld.open_world[player]: + rom.write_bytes(0x14238, [0xA9, 0x06, 0x00, # LDA #$0006 + 0x22, 0x80, 0x9A, 0x07, # JSL $079A80 + 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # set starting stages to 6 + rom.write_bytes(0x39A80, [0x8D, 0xC1, 0x5A, # STA $5AC1 (cutscene) + 0x8D, 0xCD, 0x53, # STA $53CD (unlocked stages) + 0x1A, # INC + 0x8D, 0xB9, 0x5A, # STA $5AB9 (currently selectable stages) + 0xA9, 0x01, 0x00, # LDA #$0001 + 0x8D, 0x9D, 0x5A, # STA $5A9D + 0x8D, 0x9F, 0x5A, # STA $5A9F + 0x8D, 0xA1, 0x5A, # STA $5AA1 + 0x8D, 0xA3, 0x5A, # STA $5AA3 + 0x8D, 0xA5, 0x5A, # STA $5AA5 + 0x6B, # RTL + ]) + rom.write_bytes(0x3A0BD, [0xCD, 0xCD, 0x53]) # changes the stage flag function to compare $53CD to $53CD, + # always running the "new stage" function + # This has further checks present for bosses already, so we just + # need to handle regular stages + # write check for boss to be unlocked + rom.write_bytes(0x3A100, [0xDA, 0x5A, 0xAD, 0xCD, 0x53, 0xC9, 0x06, 0x00, 0xD0, 0x4E, 0xAD, 0xCF, 0x53, 0x1A, + 0xCD, 0xCB, 0x53, 0xD0, 0x45, 0xA9, 0x00, 0x00, 0xAE, 0xCF, 0x53, 0xE0, 0x00, 0x00, + 0xF0, 0x06, 0x69, 0x06, 0x00, 0xCA, 0x80, 0xF5, 0xAA, 0xA9, 0x00, 0x00, 0xA0, 0x06, + 0x00, 0x5A, 0xDA, 0xFA, 0xBC, 0x20, 0x90, 0x88, 0xE8, 0xE8, 0x48, 0x98, 0x0A, 0xA8, + 0x68, 0x79, 0x00, 0x82, 0x7A, 0x88, 0x5A, 0xDA, 0xC0, 0x00, 0x00, 0xD0, 0xE8, 0xFA, + 0x7A, 0xCD, 0x16, 0x90, 0x90, 0x0C, 0xAD, 0xCD, 0x53, 0x1A, 0x8D, 0xCD, 0x53, 0x8D, + 0xC1, 0x5A, 0x80, 0x03, 0x9C, 0xC1, 0x5A, 0x7A, 0xFA, 0x6B, ]) + # write hook to boss check + rom.write_bytes(0x143F0, [0x22, 0x00, 0xA1, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) + # Write checks for consumable-sanity if multiworld.consumables[player]: # Redirect Consumable Effect and write index @@ -212,7 +351,8 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, boss_requirements[3], boss_requirements[4])) rom.write_byte(0x3D010, multiworld.death_link[player].value) rom.write_byte(0x3D012, multiworld.goal[player].value) - + rom.write_byte(0x3D014, multiworld.stage_shuffle[player].value) + rom.write_byte(0x3D016, multiworld.ow_boss_requirement[player].value) rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal_speed[player] == 1 else 0xFFFF)) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py new file mode 100644 index 000000000000..78b19711b4a5 --- /dev/null +++ b/worlds/kdl3/Rules.py @@ -0,0 +1,260 @@ +from worlds.generic.Rules import set_rule, add_rule +from .Locations import location_table, level_consumables +from .Names import LocationName +import typing +if typing.TYPE_CHECKING: + from . import KDL3World + from BaseClasses import CollectionState + + +def can_reach_coo(state: "CollectionState", player: int) -> bool: + return state.can_reach("Grass Land 3 - Complete", "Location", player) or \ + state.can_reach("Grass Land 5 - Complete", "Location", player) or \ + state.can_reach("Grass Land 6 - Complete", "Location", player) or \ + state.can_reach("Ripple Field 2 - Complete", "Location", player) or \ + state.can_reach("Ripple Field 6 - Complete", "Location", player) or \ + state.can_reach("Sand Canyon 2 - Complete", "Location", player) or \ + state.can_reach("Sand Canyon 3 - Complete", "Location", player) or \ + state.can_reach("Sand Canyon 6 - Complete", "Location", player) or \ + state.can_reach("Cloudy Park 1 - Complete", "Location", player) or \ + state.can_reach("Cloudy Park 4 - Complete", "Location", player) or \ + state.can_reach("Cloudy Park 5 - Complete", "Location", player) or \ + state.can_reach("Cloudy Park 6 - Complete", "Location", player) or \ + state.can_reach("Iceberg 3 - Complete", "Location", player) or \ + state.can_reach("Iceberg 5 - Complete", "Location", player) or \ + state.can_reach("Iceberg 6 - Complete", "Location", player) + # We purposefully leave out Iceberg 4 here, since access to Coo is conditional + # on having either Coo and Burning, or potentially Nago and Burning + + +def can_reach_nago(state: "CollectionState", player: int) -> bool: + return state.can_reach(LocationName.grass_land_1, "Location", player) \ + or state.can_reach(LocationName.grass_land_5, "Location", player) \ + or state.can_reach(LocationName.grass_land_6, "Location", player) \ + or state.can_reach(LocationName.ripple_field_1, "Location", player) \ + or state.can_reach(LocationName.ripple_field_4, "Location", player) \ + or state.can_reach(LocationName.ripple_field_6, "Location", player) \ + or state.can_reach(LocationName.sand_canyon_4, "Location", player) \ + or state.can_reach(LocationName.sand_canyon_6, "Location", player) \ + or state.can_reach(LocationName.cloudy_park_1, "Location", player) \ + or state.can_reach(LocationName.cloudy_park_2, "Location", player) \ + or state.can_reach(LocationName.cloudy_park_6, "Location", player) \ + or state.can_reach(LocationName.iceberg_2, "Location", player) \ + or state.can_reach(LocationName.iceberg_3, "Location", player) \ + or state.can_reach(LocationName.iceberg_6, "Location", player) + + +def set_rules(world: "KDL3World") -> None: + for level in range(1, len(world.player_levels[world.player]) + 1): + for stage in range(len(world.player_levels[world.player][level])): + if stage != 6: + set_rule( + world.multiworld.get_location(location_table[world.player_levels[world.player][level][stage]], + world.player), + lambda state, level=level, stage=stage: True if level == 1 and stage == 0 + else state.can_reach(location_table[world.player_levels[world.player][level - 1][5]], "Location", + world.player) + if stage == 0 + else state.can_reach( + location_table[world.player_levels[world.player][level][stage - 1]], "Location", + world.player)) + set_rule( + world.multiworld.get_location( + location_table[world.player_levels[world.player][level][stage] + 0x100], world.player), + lambda state, level=level, stage=stage: True if level == 1 and stage == 0 + else state.can_reach(location_table[world.player_levels[world.player][level - 1][5]], "Location", + world.player) + if stage == 0 + else state.can_reach( + location_table[world.player_levels[world.player][level][stage - 1]], "Location", + world.player)) + if world.multiworld.consumables[world.player]: + stage_idx = world.player_levels[world.player][level][stage] & 0xFF + if stage_idx in level_consumables: + for consumable in level_consumables[stage_idx]: + set_rule( + world.multiworld.get_location( + location_table[0x770300 + consumable], + world.player), + lambda state, level=level, stage=stage: True if level == 1 and stage == 0 + else state.can_reach(location_table[world.player_levels[world.player][level - 1][5]], + "Location", + world.player) + if stage == 0 + else state.can_reach( + location_table[world.player_levels[world.player][level][stage - 1]], "Location", + world.player)) + + # Level 1 + add_rule(world.multiworld.get_location(LocationName.grass_land_muchi, world.player), + lambda state: state.has("ChuChu", world.player)) + add_rule(world.multiworld.get_location(LocationName.grass_land_chao, world.player), + lambda state: state.has("Stone", world.player)) + add_rule(world.multiworld.get_location(LocationName.grass_land_mine, world.player), + lambda state: state.has("Kine", world.player)) + add_rule(world.multiworld.get_entrance("To Level 2", world.player), + lambda state: state.can_reach(location_table[world.player_levels[world.player][1][5]], "Location", + world.player)) + # Level 2 + add_rule(world.multiworld.get_location(LocationName.ripple_field_5, world.player), + lambda state: state.has("Kine", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_kamuribana, world.player), + lambda state: state.has("Pitch", world.player) and state.has("Clean", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_bakasa, world.player), + lambda state: state.has("Kine", world.player) and state.has("Parasol", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_toad, world.player), + lambda state: state.has("Needle", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_mama_pitch, world.player), + lambda state: state.has("Pitch", world.player) and state.has("Kine", world.player) + and state.has("Burning", world.player) and state.has("Stone", world.player)) + add_rule(world.multiworld.get_entrance("To Level 3", world.player), + lambda state: state.can_reach(location_table[world.player_levels[world.player][2][5]], "Location", + world.player)) + + # Level 3 + add_rule(world.multiworld.get_location(LocationName.sand_canyon_5, world.player), + lambda state: state.has("Cutter", world.player)) + add_rule(world.multiworld.get_location(LocationName.sand_canyon_auntie, world.player), + lambda state: state.has("Clean", world.player)) + add_rule(world.multiworld.get_location(LocationName.sand_canyon_nyupun, world.player), + lambda state: state.has("ChuChu", world.player) and state.has("Cutter", world.player)) + add_rule(world.multiworld.get_location(LocationName.sand_canyon_rob, world.player), + lambda state: (state.has("Kine", world.player) and state.has("Coo", world.player)) + and state.has("Parasol", world.player) + and state.has("Stone", world.player) + and (state.has("Clean", world.player) or state.has("Spark", world.player)) + and (state.has("Ice", world.player) or state.has("Needle", world.player)) + ) + add_rule(world.multiworld.get_entrance("To Level 4", world.player), + lambda state: state.can_reach(location_table[world.player_levels[world.player][3][5]], "Location", + world.player)) + + # Level 4 + add_rule(world.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, world.player), + lambda state: state.has("Coo", world.player) and state.has("Clean", world.player)) + add_rule(world.multiworld.get_location(LocationName.cloudy_park_piyokeko, world.player), + lambda state: state.has("Needle", world.player)) + add_rule(world.multiworld.get_location(LocationName.cloudy_park_mikarin, world.player), + lambda state: state.has("Coo", world.player)) + add_rule(world.multiworld.get_location(LocationName.cloudy_park_pick, world.player), + lambda state: state.has("Rick", world.player)) + add_rule(world.multiworld.get_entrance("To Level 5", world.player), + lambda state: state.can_reach(location_table[world.player_levels[world.player][4][5]], "Location", + world.player)) + + # Level 5 + add_rule(world.multiworld.get_location(LocationName.iceberg_4, world.player), + lambda state: state.has("Burning", world.player)) + add_rule(world.multiworld.get_location(LocationName.iceberg_kogoesou, world.player), + lambda state: state.has("Burning", world.player)) + add_rule(world.multiworld.get_location(LocationName.iceberg_samus, world.player), + lambda state: state.has("Ice", world.player)) + add_rule(world.multiworld.get_location(LocationName.iceberg_name, world.player), + lambda state: state.has("Coo", world.player) and state.has("Burning", world.player) + and state.has("ChuChu", world.player) and can_reach_coo(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.iceberg_shiro, world.player), + lambda state: state.has("Nago", world.player) and can_reach_nago(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.iceberg_angel, world.player), + lambda state: state.has_all(world.item_name_groups["Copy Ability"], world.player)) + # easier than writing out 8 ands + + # Consumables + if world.multiworld.consumables[world.player]: + add_rule(world.multiworld.get_location(LocationName.grass_land_1_u1, world.player), + lambda state: state.has("Parasol", world.player)) + add_rule(world.multiworld.get_location(LocationName.grass_land_1_m1, world.player), + lambda state: state.has("Spark", world.player)) + add_rule(world.multiworld.get_location(LocationName.grass_land_2_u1, world.player), + lambda state: state.has("Needle", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_2_u1, world.player), + lambda state: state.has("Kine", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_2_m1, world.player), + lambda state: state.has("Kine", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_3_u1, world.player), + lambda state: state.has("Cutter", world.player) or state.has("Spark", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_4_u1, world.player), + lambda state: state.has("Stone", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_4_m2, world.player), + lambda state: state.has("Stone", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_5_m1, world.player), + lambda state: state.has("Kine", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_5_u1, world.player), + lambda state: state.has("Kine", world.player) + and state.has("Burning", world.player) and state.has("Stone", world.player)) + add_rule(world.multiworld.get_location(LocationName.ripple_field_5_m2, world.player), + lambda state: state.has("Kine", world.player) + and state.has("Burning", world.player) and state.has("Stone", world.player)) + add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_u1, world.player), + lambda state: state.has("Clean", world.player)) + add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_m2, world.player), + lambda state: state.has("Needle", world.player)) + add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u2, world.player), + lambda state: state.has("Ice", world.player) and state.has("Rick", world.player)) + add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u3, world.player), + lambda state: state.has("Ice", world.player) and state.has("Rick", world.player)) + add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u4, world.player), + lambda state: state.has("Ice", world.player) and state.has("Rick", world.player)) + add_rule(world.multiworld.get_location(LocationName.cloudy_park_6_u1, world.player), + lambda state: state.has("Cutter", world.player)) + + set_rule(world.multiworld.get_location("Level 1 Boss", world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][0]) + and state.can_reach(location_table[world.player_levels[world.player][1][5]], "Location", + world.player)) + set_rule(world.multiworld.get_location(LocationName.grass_land_whispy, world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][0]) + and state.can_reach(location_table[world.player_levels[world.player][1][5]], "Location", + world.player)) + set_rule(world.multiworld.get_location("Level 2 Boss", world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][1]) + and state.can_reach(location_table[world.player_levels[world.player][2][5]], "Location", + world.player)) + set_rule(world.multiworld.get_location(LocationName.ripple_field_acro, world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][1]) + and state.can_reach(location_table[world.player_levels[world.player][2][5]], "Location", + world.player)) + set_rule(world.multiworld.get_location("Level 3 Boss", world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][2]) + and state.can_reach(location_table[world.player_levels[world.player][3][5]], "Location", + world.player)) + set_rule(world.multiworld.get_location(LocationName.sand_canyon_poncon, world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][2]) + and state.can_reach(location_table[world.player_levels[world.player][3][5]], "Location", + world.player)) + set_rule(world.multiworld.get_location("Level 4 Boss", world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][3]) + and state.can_reach(location_table[world.player_levels[world.player][4][5]], "Location", + world.player)) + set_rule(world.multiworld.get_location(LocationName.cloudy_park_ado, world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][3]) + and state.can_reach(location_table[world.player_levels[world.player][4][5]], "Location", + world.player)) + set_rule(world.multiworld.get_location("Level 5 Boss", world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][4]) + and state.can_reach(location_table[world.player_levels[world.player][5][5]], "Location", + world.player)) + set_rule(world.multiworld.get_location(LocationName.iceberg_dedede, world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][4]) + and state.can_reach(location_table[world.player_levels[world.player][5][5]], "Location", + world.player)) + + if world.multiworld.strict_bosses[world.player]: + add_rule(world.multiworld.get_entrance("To Level 2", world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][0])) + add_rule(world.multiworld.get_entrance("To Level 3", world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][1])) + add_rule(world.multiworld.get_entrance("To Level 4", world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][2])) + add_rule(world.multiworld.get_entrance("To Level 5", world.player), + lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][3])) + + set_rule(world.multiworld.get_entrance("To Level 6", world.player), + lambda state: state.has("Heart Star", world.player, world.required_heart_stars[world.player])) + + if world.multiworld.goal_speed[world.player] == 0: + add_rule(world.multiworld.get_entrance("To Level 6", world.player), + lambda state: state.has("Level 1 Boss Purified", world.player) + and state.has("Level 2 Boss Purified", world.player) + and state.has("Level 3 Boss Purified", world.player) + and state.has("Level 4 Boss Purified", world.player) + and state.has("Level 5 Boss Purified", world.player)) \ No newline at end of file diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 9dbde32d014c..3d1f29a8d67b 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -2,12 +2,12 @@ from BaseClasses import Tutorial, ItemClassification, MultiWorld from worlds.AutoWorld import World, WebWorld -from worlds.generic.Rules import set_rule, add_rule from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item from .Locations import location_table, KDL3Location, level_consumables, consumable_locations from .Regions import create_levels from .Options import kdl3_options from .Names import LocationName +from .Rules import set_rules from .Rom import KDL3DeltaPatch, get_base_rom_path, RomData, patch_rom from .Client import KDL3SNIClient @@ -117,234 +117,7 @@ def create_items(self) -> None: itempool.extend([self.create_item("Heart Star", True) for _ in range(nonrequired_heart_stars)]) self.multiworld.itempool += itempool - def set_rules(self) -> None: - for level in range(1, len(self.player_levels[self.player]) + 1): - for stage in range(len(self.player_levels[self.player][level])): - if stage != 6: - set_rule( - self.multiworld.get_location(location_table[self.player_levels[self.player][level][stage]], - self.player), - lambda state, level=level, stage=stage: True if level == 1 and stage == 0 - else state.can_reach(location_table[self.player_levels[self.player][level - 1][5]], "Location", - self.player) - if stage == 0 - else state.can_reach( - location_table[self.player_levels[self.player][level][stage - 1]], "Location", - self.player)) - set_rule( - self.multiworld.get_location( - location_table[self.player_levels[self.player][level][stage] + 0x100], self.player), - lambda state, level=level, stage=stage: True if level == 1 and stage == 0 - else state.can_reach(location_table[self.player_levels[self.player][level - 1][5]], "Location", - self.player) - if stage == 0 - else state.can_reach( - location_table[self.player_levels[self.player][level][stage - 1]], "Location", - self.player)) - if self.multiworld.consumables[self.player]: - stage_idx = self.player_levels[self.player][level][stage] & 0xFF - if stage_idx in level_consumables: - for consumable in level_consumables[stage_idx]: - set_rule( - self.multiworld.get_location( - location_table[0x770300 + consumable], - self.player), - lambda state, level=level, stage=stage: True if level == 1 and stage == 0 - else state.can_reach(location_table[self.player_levels[self.player][level - 1][5]], - "Location", - self.player) - if stage == 0 - else state.can_reach( - location_table[self.player_levels[self.player][level][stage - 1]], "Location", - self.player)) - - # Level 1 - add_rule(self.multiworld.get_location(LocationName.grass_land_muchi, self.player), - lambda state: state.has("ChuChu", self.player)) - add_rule(self.multiworld.get_location(LocationName.grass_land_chao, self.player), - lambda state: state.has("Stone", self.player)) - add_rule(self.multiworld.get_location(LocationName.grass_land_mine, self.player), - lambda state: state.has("Kine", self.player)) - add_rule(self.multiworld.get_entrance("To Level 2", self.player), - lambda state: state.can_reach(location_table[self.player_levels[self.player][1][5]], "Location", - self.player)) - # Level 2 - add_rule(self.multiworld.get_location(LocationName.ripple_field_5, self.player), - lambda state: state.has("Kine", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_kamuribana, self.player), - lambda state: state.has("Pitch", self.player) and state.has("Clean", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_bakasa, self.player), - lambda state: state.has("Kine", self.player) and state.has("Parasol", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_toad, self.player), - lambda state: state.has("Needle", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_mama_pitch, self.player), - lambda state: state.has("Pitch", self.player) and state.has("Kine", self.player) - and state.has("Burning", self.player) and state.has("Stone", self.player)) - add_rule(self.multiworld.get_entrance("To Level 3", self.player), - lambda state: state.can_reach(location_table[self.player_levels[self.player][2][5]], "Location", - self.player)) - - # Level 3 - add_rule(self.multiworld.get_location(LocationName.sand_canyon_5, self.player), - lambda state: state.has("Cutter", self.player)) - add_rule(self.multiworld.get_location(LocationName.sand_canyon_auntie, self.player), - lambda state: state.has("Clean", self.player)) - add_rule(self.multiworld.get_location(LocationName.sand_canyon_nyupun, self.player), - lambda state: state.has("ChuChu", self.player) and state.has("Cutter", self.player)) - add_rule(self.multiworld.get_location(LocationName.sand_canyon_rob, self.player), - lambda state: (state.has("Kine", self.player) and state.has("Coo", self.player)) - and state.has("Parasol", self.player) - and state.has("Stone", self.player) - and (state.has("Clean", self.player) or state.has("Spark", self.player)) - and (state.has("Ice", self.player) or state.has("Needle", self.player)) - ) - add_rule(self.multiworld.get_entrance("To Level 4", self.player), - lambda state: state.can_reach(location_table[self.player_levels[self.player][3][5]], "Location", - self.player)) - - # Level 4 - add_rule(self.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, self.player), - lambda state: state.has("Coo", self.player) and state.has("Clean", self.player)) - add_rule(self.multiworld.get_location(LocationName.cloudy_park_piyokeko, self.player), - lambda state: state.has("Needle", self.player)) - add_rule(self.multiworld.get_location(LocationName.cloudy_park_mikarin, self.player), - lambda state: state.has("Coo", self.player)) - add_rule(self.multiworld.get_location(LocationName.cloudy_park_pick, self.player), - lambda state: state.has("Rick", self.player)) - add_rule(self.multiworld.get_entrance("To Level 5", self.player), - lambda state: state.can_reach(location_table[self.player_levels[self.player][4][5]], "Location", - self.player)) - - # Level 5 - add_rule(self.multiworld.get_location(LocationName.iceberg_4, self.player), - lambda state: state.has("Burning", self.player)) - add_rule(self.multiworld.get_location(LocationName.iceberg_kogoesou, self.player), - lambda state: state.has("Burning", self.player)) - add_rule(self.multiworld.get_location(LocationName.iceberg_samus, self.player), - lambda state: state.has("Ice", self.player)) - add_rule(self.multiworld.get_location(LocationName.iceberg_name, self.player), - lambda state: state.has("Coo", self.player) and state.has("Burning", self.player) - and state.has("ChuChu", self.player)) - add_rule(self.multiworld.get_location(LocationName.iceberg_shiro, self.player), - lambda state: state.has("Nago", self.player) and - (state.can_reach(LocationName.grass_land_1, "Location", self.player) - or state.can_reach(LocationName.grass_land_5, "Location", self.player) - or state.can_reach(LocationName.grass_land_6, "Location", self.player) - or state.can_reach(LocationName.ripple_field_1, "Location", self.player) - or state.can_reach(LocationName.ripple_field_4, "Location", self.player) - or state.can_reach(LocationName.ripple_field_6, "Location", self.player) - or state.can_reach(LocationName.sand_canyon_4, "Location", self.player) - or state.can_reach(LocationName.sand_canyon_6, "Location", self.player) - or state.can_reach(LocationName.cloudy_park_1, "Location", self.player) - or state.can_reach(LocationName.cloudy_park_2, "Location", self.player) - or state.can_reach(LocationName.cloudy_park_6, "Location", self.player) - or state.can_reach(LocationName.iceberg_2, "Location", self.player) - or state.can_reach(LocationName.iceberg_3, "Location", self.player) - or state.can_reach(LocationName.iceberg_6, "Location", self.player))) - add_rule(self.multiworld.get_location(LocationName.iceberg_angel, self.player), - lambda state: state.has_all(self.item_name_groups["Copy Ability"], self.player)) - # easier than writing out 8 ands - - # Consumables - if self.multiworld.consumables[self.player]: - add_rule(self.multiworld.get_location(LocationName.grass_land_1_u1, self.player), - lambda state: state.has("Parasol", self.player)) - add_rule(self.multiworld.get_location(LocationName.grass_land_1_m1, self.player), - lambda state: state.has("Spark", self.player)) - add_rule(self.multiworld.get_location(LocationName.grass_land_2_u1, self.player), - lambda state: state.has("Needle", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_2_u1, self.player), - lambda state: state.has("Kine", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_2_m1, self.player), - lambda state: state.has("Kine", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_3_u1, self.player), - lambda state: state.has("Cutter", self.player) or state.has("Spark", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_4_u1, self.player), - lambda state: state.has("Stone", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_4_m2, self.player), - lambda state: state.has("Stone", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_5_m1, self.player), - lambda state: state.has("Kine", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_5_u1, self.player), - lambda state: state.has("Kine", self.player) - and state.has("Burning", self.player) and state.has("Stone", self.player)) - add_rule(self.multiworld.get_location(LocationName.ripple_field_5_m2, self.player), - lambda state: state.has("Kine", self.player) - and state.has("Burning", self.player) and state.has("Stone", self.player)) - add_rule(self.multiworld.get_location(LocationName.sand_canyon_4_u1, self.player), - lambda state: state.has("Clean", self.player)) - add_rule(self.multiworld.get_location(LocationName.sand_canyon_4_m2, self.player), - lambda state: state.has("Needle", self.player)) - add_rule(self.multiworld.get_location(LocationName.sand_canyon_5_u2, self.player), - lambda state: state.has("Ice", self.player) and state.has("Rick", self.player)) - add_rule(self.multiworld.get_location(LocationName.sand_canyon_5_u3, self.player), - lambda state: state.has("Ice", self.player) and state.has("Rick", self.player)) - add_rule(self.multiworld.get_location(LocationName.sand_canyon_5_u4, self.player), - lambda state: state.has("Ice", self.player) and state.has("Rick", self.player)) - add_rule(self.multiworld.get_location(LocationName.cloudy_park_6_u1, self.player), - lambda state: state.has("Cutter", self.player)) - - set_rule(self.multiworld.get_location("Level 1 Boss", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0]) - and state.can_reach(location_table[self.player_levels[self.player][1][5]], "Location", - self.player)) - set_rule(self.multiworld.get_location(LocationName.grass_land_whispy, self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0]) - and state.can_reach(location_table[self.player_levels[self.player][1][5]], "Location", - self.player)) - set_rule(self.multiworld.get_location("Level 2 Boss", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1]) - and state.can_reach(location_table[self.player_levels[self.player][2][5]], "Location", - self.player)) - set_rule(self.multiworld.get_location(LocationName.ripple_field_acro, self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1]) - and state.can_reach(location_table[self.player_levels[self.player][2][5]], "Location", - self.player)) - set_rule(self.multiworld.get_location("Level 3 Boss", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2]) - and state.can_reach(location_table[self.player_levels[self.player][3][5]], "Location", - self.player)) - set_rule(self.multiworld.get_location(LocationName.sand_canyon_poncon, self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2]) - and state.can_reach(location_table[self.player_levels[self.player][3][5]], "Location", - self.player)) - set_rule(self.multiworld.get_location("Level 4 Boss", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3]) - and state.can_reach(location_table[self.player_levels[self.player][4][5]], "Location", - self.player)) - set_rule(self.multiworld.get_location(LocationName.cloudy_park_ado, self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3]) - and state.can_reach(location_table[self.player_levels[self.player][4][5]], "Location", - self.player)) - set_rule(self.multiworld.get_location("Level 5 Boss", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][4]) - and state.can_reach(location_table[self.player_levels[self.player][5][5]], "Location", - self.player)) - set_rule(self.multiworld.get_location(LocationName.iceberg_dedede, self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][4]) - and state.can_reach(location_table[self.player_levels[self.player][5][5]], "Location", - self.player)) - - if self.multiworld.strict_bosses[self.player]: - add_rule(self.multiworld.get_entrance("To Level 2", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][0])) - add_rule(self.multiworld.get_entrance("To Level 3", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][1])) - add_rule(self.multiworld.get_entrance("To Level 4", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][2])) - add_rule(self.multiworld.get_entrance("To Level 5", self.player), - lambda state: state.has("Heart Star", self.player, self.boss_requirements[self.player][3])) - - set_rule(self.multiworld.get_entrance("To Level 6", self.player), - lambda state: state.has("Heart Star", self.player, self.required_heart_stars[self.player])) - - if self.multiworld.goal_speed[self.player] == 0: - add_rule(self.multiworld.get_entrance("To Level 6", self.player), - lambda state: state.has("Level 1 Boss Purified", self.player) - and state.has("Level 2 Boss Purified", self.player) - and state.has("Level 3 Boss Purified", self.player) - and state.has("Level 4 Boss Purified", self.player) - and state.has("Level 5 Boss Purified", self.player)) + set_rules = set_rules def generate_basic(self) -> None: self.topology_present = self.multiworld.stage_shuffle[self.player].value > 0 From 13ba20afbdf5aad7637faf773fcab66734c8bc58 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 14 Jun 2023 21:39:55 -0500 Subject: [PATCH 052/165] open world, traps, music shuffle --- host.yaml | 2 +- worlds/kdl3/Client.py | 48 +++- worlds/kdl3/Items.py | 8 + worlds/kdl3/Options.py | 56 ++++ worlds/kdl3/Rom.py | 582 ++++++++++++++++++++++++++++++++++++---- worlds/kdl3/Rules.py | 37 +++ worlds/kdl3/__init__.py | 17 +- 7 files changed, 690 insertions(+), 60 deletions(-) diff --git a/host.yaml b/host.yaml index 3d26a461d306..f58bdd29e4f4 100644 --- a/host.yaml +++ b/host.yaml @@ -82,7 +82,7 @@ generator: race: 0 # List of options that can be plando'd. Can be combined, for example "bosses, items" # Available options: bosses, items, texts, connections - plando_options: "bosses" + plando_options: "bosses, items, texts, connections" sni_options: # Set this to your SNI folder location if you want the MultiClient to attempt an auto start, does nothing if not found sni_path: "SNI" diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index c0b9e2d45813..8d2c71c32eca 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -1,4 +1,5 @@ import logging +import struct import time from struct import unpack, pack @@ -40,6 +41,10 @@ KDL3_ABILITY_ARRAY = SRAM_1_START + 0x8020 KDL3_RECV_COUNT = SRAM_1_START + 0x8050 KDL3_HEART_STAR_COUNT = SRAM_1_START + 0x8070 +KDL3_GOOEY_TRAP = SRAM_1_START + 0x8080 +KDL3_SLOWNESS_TRAP = SRAM_1_START + 0x8082 +KDL3_ABILITY_TRAP = SRAM_1_START + 0x8084 +KDL3_COMPLETED_STAGES = SRAM_1_START + 0x8200 KDL3_CONSUMABLES = SRAM_1_START + 0xA000 consumable_addrs = { @@ -141,15 +146,15 @@ async def pop_item(self, ctx): if len(self.item_queue) > 0: item = self.item_queue.pop() # special handling for the remaining three - item = item.item & 0x00000F - if item == 1: + item = item.item & 0x0000FF + if item == 0x21: # 1-Up life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 1) life_bytes = pack("H", life_count[0] + 1) snes_buffered_write(ctx, KDL3_LIFE_COUNT, life_bytes) snes_buffered_write(ctx, KDL3_LIFE_VISUAL, life_bytes) snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x33])) - elif item == 2: + elif item == 0x22: # Maxim Tomato # Check for Gooey gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) @@ -159,10 +164,32 @@ async def pop_item(self, ctx): snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, bytes([0x08])) else: snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x0A])) - elif item == 3: + elif item == 0x23: # Invincibility Candy snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x84, 0x03])) + elif item == 0x40: + check_gooey_r = await snes_read(ctx, KDL3_GOOEY_TRAP, 2) + check_gooey = struct.unpack("H", check_gooey_r) + if check_gooey[0] == 0: + snes_buffered_write(ctx, KDL3_GOOEY_TRAP, bytes([0x01, 0x00])) + else: + self.item_queue.append(item) # We can't apply this yet + elif item == 0x41: + check_slow_r = await snes_read(ctx, KDL3_SLOWNESS_TRAP, 2) + check_slow = struct.unpack("H", check_slow_r) + if check_slow[0] == 0: + snes_buffered_write(ctx, KDL3_SLOWNESS_TRAP, bytes([0x84, 0x03])) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0xA7])) + else: + self.item_queue.append(item) # We can't apply this yet + elif item == 0x42: + check_ability_r = await snes_read(ctx, KDL3_ABILITY_TRAP, 2) + check_ability = struct.unpack("H", check_ability_r) + if check_ability[0] == 0: + snes_buffered_write(ctx, KDL3_ABILITY_TRAP, bytes([0x01, 0x00])) + else: + self.item_queue.append(item) # We can't apply this yet async def game_watcher(self, ctx) -> None: from SNIClient import snes_buffered_write, snes_flush_writes, snes_read @@ -209,7 +236,7 @@ async def game_watcher(self, ctx) -> None: ctx.location_names[item.location], recv_amount, len(ctx.items_received))) snes_buffered_write(ctx, KDL3_RECV_COUNT, pack("H", recv_amount)) - if item.item & 0x000030 == 0: + if item.item & 0x000070 == 0: ability = item.item & 0x00000F snes_buffered_write(ctx, KDL3_ABILITY_ARRAY + (ability * 2), pack("H", ability)) snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) @@ -230,14 +257,13 @@ async def game_watcher(self, ctx) -> None: new_checks = [] # level completion status world_unlocks = await snes_read(ctx, KDL3_WORLD_UNLOCK, 1) - level_unlocks = await snes_read(ctx, KDL3_LEVEL_UNLOCK, 1) - current_world = world_unlocks[0] - 1 - current_level = level_unlocks[0] - 1 if world_unlocks[0] > 0x06: return # save is not loaded, ignore - for i in range(0, world_unlocks[0]): - for j in range(0, 6 if current_world > i else current_level): - loc_id = 0x770000 + self.levels[i][j] + stages_raw = await snes_read(ctx, KDL3_COMPLETED_STAGES, 60) + stages = struct.unpack("HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", stages_raw) + for i in range(30): + if stages[i] == 1: + loc_id = 0x770000 + i + 1 if loc_id not in ctx.checked_locations: new_checks.append(loc_id) # heart star status diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index fe3b297d084c..ed7ddb862e7a 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -40,16 +40,24 @@ class KDL3Item(Item): "Invincible Candy": ItemData(0x770023, False), } +trap_item_table = { + "Gooey Bag": ItemData(0x770040, False, False, True), + "Slowness": ItemData(0x770041, False, False, True), + "Eject Ability": ItemData(0x770042, False, False, True) +} + filler_item_weights = { "1-Up": 4, "Maxim Tomato": 2, "Invincible Candy": 2 } + item_table = { **copy_ability_table, **animal_friend_table, **misc_item_table, + **trap_item_table } item_names = { diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index bdfa23ab4a58..1e988941a3e5 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -151,6 +151,43 @@ class FillerPercentage(Range): default = 50 +class TrapPercentage(Range): + """ + Percentage of non-required Heart Stars to be converted to trap items (Gooey Bags, Slowness, Eject Ability). + """ + display_name = "Trap Percentage" + range_start = 0 + range_end = 100 + default = 50 + +class GooeyTrapPercentage(Range): + """ + Percentage of non-required Heart Stars to be converted to trap items (Gooey Bags, Slowness, Eject Ability). + """ + display_name = "Gooey Trap Percentage" + range_start = 0 + range_end = 100 + default = 50 + +class SlowTrapPercentage(Range): + """ + Percentage of non-required Heart Stars to be converted to trap items (Gooey Bags, Slowness, Eject Ability). + """ + display_name = "Slowness Trap Percentage" + range_start = 0 + range_end = 100 + default = 50 + +class AbilityTrapPercentage(Range): + """ + Percentage of traps that are Eject Ability (ejects your ability when you receive it). + """ + display_name = "Ability Trap Percentage" + range_start = 0 + range_end = 100 + default = 50 + + class ConsumableChecks(Toggle): """ When enabled, adds all 1-Ups and Maxim Tomatoes as possible locations. @@ -218,6 +255,20 @@ class GooeyFlavor(OptionDict): default = {} +class MusicShuffle(Choice): + """ + None: default music will play + Shuffled: music will be shuffled amongst each other + Full: random music will play in each room + Note that certain songs will not be chosen in shuffled or full + """ + display_name = "Music Randomization" + option_none = 0 + option_shuffled = 1 + option_full = 2 + default = 0 + + kdl3_options: typing.Dict[str, type(Option)] = { "death_link": DeathLink, "game_language": GameLanguage, @@ -226,6 +277,10 @@ class GooeyFlavor(OptionDict): "total_heart_stars": TotalHeartStars, "heart_stars_required": HeartStarsRequired, "filler_percentage": FillerPercentage, + "trap_percentage": TrapPercentage, + "gooey_trap_weight": GooeyTrapPercentage, + "slow_trap_weight": SlowTrapPercentage, + "ability_trap_weight": AbilityTrapPercentage, "jumping_target": JumpingTarget, "stage_shuffle": LevelShuffle, "boss_shuffle": BossShuffle, @@ -238,4 +293,5 @@ class GooeyFlavor(OptionDict): "kirby_flavor": KirbyFlavor, "gooey_flavor_preset": GooeyFlavorPreset, "gooey_flavor": GooeyFlavor, + "music_shuffle": MusicShuffle, } diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index aff26025abf8..451d30535d09 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -4,7 +4,8 @@ import os import struct from worlds.Files import APDeltaPatch -from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette, gooey_target_palettes, get_gooey_palette +from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette, gooey_target_palettes, \ + get_gooey_palette from .Compression import hal_decompress KDL3UHASH = "201e7658f6194458a3869dde36bf8ec2" @@ -97,6 +98,437 @@ stage_palettes = [0x60964, 0x60B64, 0x60D64, 0x60F64, 0x61164] +music_choices = [ + 2, # Boss 1 + 3, # Boss 2 (Unused) + 4, # Boss 3 (Miniboss) + 5, # Star Floating (required) + 7, # Dedede + 8, # Heart Star + 9, # Event 2 (used once) + 10, # Field 1 + 11, # Field 2 + 12, # Field 3 + 13, # Field 4 + 14, # Field 5 + 15, # Field 6 + 16, # Field 7 + 17, # Field 8 + 18, # Field 9 + 19, # Field 10 + 20, # Field 11 + 21, # Field 12 (Gourmet Race) + 23, # Dark Matter in the Hyper Zone + 24, # Zero + 25, # Level 1 + 26, # Level 2 + 27, # Level 4 + 28, # Level 3 + 29, # Heart Star Failed + 30, # Level 5 + 31, # Minigame + 38, # Animal Friend 1 + 39, # Animal Friend 2 + 40, # Animal Friend 3 +] + +room_pointers = [ + 0x346711, + 0x3365b5, + 0x2d2d0a, + 0x3513aa, + 0x2d7256, + 0x2c1c53, + 0x3240a3, + 0x2eafe5, + 0x345ead, + 0x2d51ad, + 0x3698a6, + 0x2d4229, + 0x2c0f25, + 0x300f8b, + 0x30e74b, + 0x30d442, + 0x2d29a8, + 0x2d7531, + 0x2dbe33, + 0x2f124c, + 0x2c1e35, + 0x34f7b4, + 0x346f71, + 0x2e60a9, + 0x38cdda, + 0x326e14, + 0x35608f, + 0x30387f, + 0x2e5299, + 0x2d9ee2, + 0x2e70be, + 0x2c12e9, + 0x32688d, + 0x2e850e, + 0x32c42b, + 0x2d43bb, + 0x2d5f45, + 0x2d33af, + 0x2c0c52, + 0x31ac7f, + 0x3386e8, + 0x33ce35, + 0x338049, + 0x32b461, + 0x354403, + 0x2ef2a1, + 0x2e8098, + 0x2e203d, + 0x2c03d9, + 0x2d88a9, + 0x320bef, + 0x36c250, + 0x2d1a48, + 0x364dac, + 0x2d623f, + 0x2e8ff9, + 0x2e896e, + 0x2eca27, + 0x2c15bc, + 0x330000, + 0x2f0f43, + 0x34a947, + 0x3810d7, + 0x2d5c48, + 0x2f734e, + 0x2d5dc7, + 0x2c1a71, + 0x35ab46, + 0x370000, + 0x38b164, + 0x2edfaf, + 0x2d54ba, + 0x2d95ee, + 0x2c13da, + 0x303c20, + 0x2f092c, + 0x2d3d6e, + 0x2e0f07, + 0x2d9886, + 0x2c079d, + 0x2e6c2d, + 0x315bf5, + 0x30260c, + 0x331e0f, + 0x2e8b9d, + 0x2e9225, + 0x33ae5e, + 0x305853, + 0x2d248e, + 0x3171b1, + 0x362188, + 0x371abf, + 0x3be88d, + 0x2e2ecf, + 0x30f0a5, + 0x3530c8, + 0x3942fa, + 0x2e754a, + 0x2d36f9, + 0x2e6e76, + 0x2c0a70, + 0x2d01c8, + 0x2d5640, + 0x3781f5, + 0x2f3054, + 0x2fcf3f, + 0x358632, + 0x310000, + 0x36b7f7, + 0x37426b, + 0x2d151b, + 0x2ed5fe, + 0x2c0b61, + 0x302d7a, + 0x35c6ab, + 0x3046d4, + 0x3598d4, + 0x38bfea, + 0x34341c, + 0x30e0fd, + 0x2fe3dc, + 0x2d9b16, + 0x2c06ac, + 0x37f992, + 0x2d0e22, + 0x35e194, + 0x31ccf3, + 0x2ef0cc, + 0x3262f5, + 0x39fe24, + 0x2ee760, + 0x2eb616, + 0x34b166, + 0x2db285, + 0x2c2017, + 0x361664, + 0x2d4097, + 0x38dbbe, + 0x3422e6, + 0x366383, + 0x2d60c3, + 0x318f61, + 0x2c1016, + 0x2d49f9, + 0x35bda2, + 0x2d1c01, + 0x357cd0, + 0x341189, + 0x32791c, + 0x2d188f, + 0x2f3943, + 0x352724, + 0x2dcee6, + 0x2c088e, + 0x37e296, + 0x2e944e, + 0x2ea788, + 0x342b83, + 0x379af5, + 0x2e7304, + 0x3379a9, + 0x2d3a3c, + 0x2c1980, + 0x37a720, + 0x329449, + 0x2d6c91, + 0x2d73c5, + 0x307e62, + 0x308bfb, + 0x307af9, + 0x3092bb, + 0x30741d, + 0x308532, + 0x30778e, + 0x3081ca, + 0x2d9c5d, + 0x2e050b, + 0x2d6b1b, + 0x2e3d40, + 0x2d5ac9, + 0x2d0fe2, + 0x2d11a1, + 0x2da65b, + 0x2d63bb, + 0x2d5026, + 0x2d69a3, + 0x2d071a, + 0x328979, + 0x2efba6, + 0x2ec82a, + 0x2ebe33, + 0x2ecc24, + 0x2ece21, + 0x2d0390, + 0x2d9204, + 0x2edbd2, + 0x2e9ce1, + 0x2e9675, + 0x2e9899, + 0x2e9abd, + 0x2d90b4, + 0x2ee949, + 0x2d57c5, + 0x2ec032, + 0x2ec230, + 0x2ec42e, + 0x2ed40b, + 0x2d99cf, + 0x2c0d43, + 0x2da51d, + 0x3069bb, + 0x2ef813, + 0x32237a, + 0x2ebc2f, + 0x33d479, + 0x2e5e55, + 0x35f378, + 0x2d1360, + 0x34e0bf, + 0x2ef9dd, + 0x3211d6, + 0x35b478, + 0x2d2642, + 0x2c097f, + 0x2ff32b, + 0x316055, + 0x3251de, + 0x32fb1f, + 0x34c17c, + 0x31f496, + 0x2d8a05, + 0x2d8e0a, + 0x2da2a1, + 0x2c179e, + 0x2f50bb, + 0x30f9f7, + 0x311339, + 0x2db020, + 0x3145df, + 0x2d4e9c, + 0x3eff12, + 0x2c05bb, + 0x2ee389, + 0x2eeb2f, + 0x327e99, + 0x324c23, + 0x32d3b4, + 0x32d8cc, + 0x31a43e, + 0x2d486a, + 0x2d7f0c, + 0x2de601, + 0x2c11f8, + 0x30b736, + 0x2e8dcc, + 0x36fee2, + 0x2fc76a, + 0x2da024, + 0x2d66b2, + 0x306d33, + 0x2da8d4, + 0x2c1f26, + 0x31e4d7, + 0x31a018, + 0x2e360e, + 0x2fca07, + 0x2f8998, + 0x3186f1, + 0x3164b4, + 0x31c8f1, + 0x2e313b, + 0x2f2460, + 0x2fcca3, + 0x2e0c8a, + 0x2e54f4, + 0x2d3f03, + 0x2ef474, + 0x2eb822, + 0x2c14cb, + 0x2dc19a, + 0x335127, + 0x36e0ec, + 0x322f30, + 0x2ed217, + 0x315791, + 0x33f935, + 0x2d8f5f, + 0x2c2108, + 0x2f67f0, + 0x32e2b9, + 0x350000, + 0x2e574e, + 0x2e503e, + 0x2fbce7, + 0x31e8c9, + 0x3104d5, + 0x2db153, + 0x2ea9a4, + 0x2c0e34, + 0x34b972, + 0x2e13f9, + 0x373549, + 0x37b340, + 0x2e5c00, + 0x2dfd32, + 0x374f55, + 0x2d9da0, + 0x2c188f, + 0x31f87f, + 0x337304, + 0x321d9a, + 0x30434d, + 0x31c4ef, + 0x3117f6, + 0x2f6da9, + 0x330f1a, + 0x2ea127, + 0x2ea349, + 0x31b4ac, + 0x2f0c3a, + 0x3007cc, + 0x336c5d, + 0x2ea56a, + 0x2f8c5c, + 0x2ed7f1, + 0x2ee19d, + 0x33f331, + 0x2eeef2, + 0x2c1107, + 0x3299a7, + 0x2e59a7, + 0x2f5c62, + 0x2fd99b, + 0x308897, + 0x2f6510, + 0x320000, + 0x2f5f49, + 0x30c0f1, + 0x2f1b5e, + 0x32af0c, + 0x2fe66a, + 0x2f9497, + 0x2e1b5a, + 0x2e29f6, + 0x3054d5, + 0x2e4b86, + 0x2f4dcf, + 0x2e3fa3, + 0x2f622e, + 0x2f9750, + 0x30ddd5, + 0x2e0000, + 0x305156, + 0x2e3876, + 0x3029c4, + 0x2fba45, + 0x31b097, + 0x2e3adb, + 0x35cfa8, + 0x2e1dcd, + 0x2e2c63, + 0x2e62fc, + 0x2e0286, + 0x309ccc, + 0x3afc23, + 0x2e251a, + 0x2c1b62, + 0x33a7d9, + 0x30ca9f, + 0x2f4219, + 0x30cdd6, + 0x30fd0b, + 0x30c768, + 0x30f3c2, + 0x2facfe, + 0x2f761f, + 0x2fe8f8, + 0x2f9a08, + 0x2fee13, + 0x2faa4c, + 0x2ff83d, + 0x2f9cbf, + 0x2fd706, + 0x2fa798, + 0x2ffac5, + 0x2f9f76, + 0x2e0a0c, + 0x2fa22d, + 0x2ffd4c, + 0x2f8f1e, + 0x2e778f, + 0x2c16ad, + 0x2d796f, + 0x2eff36 +] + def handle_level_sprites(stages, sprites, palettes): palette_by_level = list() @@ -104,12 +536,12 @@ def handle_level_sprites(stages, sprites, palettes): palette_by_level.extend(palette[10:16]) for i in range(5): for j in range(6): - palettes[i][10+j] = palette_by_level[stages[i][j]-1] + palettes[i][10 + j] = palette_by_level[stages[i][j] - 1] palettes[i] = [x for palette in palettes[i] for x in palette] tiles_by_level = list() for spritesheet in sprites: decompressed = hal_decompress(spritesheet) - tiles = [decompressed[i:i+32] for i in range(0, 2304, 32)] + tiles = [decompressed[i:i + 32] for i in range(0, 2304, 32)] tiles_by_level.extend([[tiles[x] for x in stage_tiles[stage]] for stage in stage_tiles]) for world in range(5): levels = [stages[world][x] - 1 for x in range(6)] @@ -141,9 +573,9 @@ def patch(self, target: str): super().patch(target) rom = RomData(target) if rom.read_bytes(0x3D014, 1)[0] > 0: - stages = [struct.unpack("HHHHHHH", rom.read_bytes(0x3D020 + x*14, 14)) for x in range(5)] + stages = [struct.unpack("HHHHHHH", rom.read_bytes(0x3D020 + x * 14, 14)) for x in range(5)] palettes = [rom.read_bytes(full_pal, 512) for full_pal in stage_palettes] - palettes = [[palette[i:i+32] for i in range(0, 512, 32)] for palette in palettes] + palettes = [[palette[i:i + 32] for i in range(0, 512, 32)] for palette in palettes] sprites = [rom.read_bytes(offset, level_sprites[offset]) for offset in level_sprites] sprites, palettes = handle_level_sprites(stages, sprites, palettes) for addr, palette in zip(stage_palettes, palettes): @@ -155,22 +587,23 @@ def patch(self, target: str): rom.write_to_file(target) - - class RomData: def __init__(self, file, name=None): self.file = bytearray() self.read_from_file(file) self.name = name + def read_byte(self, offset): + return self.file[offset] + def read_bytes(self, offset, length): - return self.file[offset:offset+length] + return self.file[offset:offset + length] def write_byte(self, offset, value): self.file[offset] = value def write_bytes(self, offset, values): - self.file[offset:offset+len(values)] = values + self.file[offset:offset + len(values)] = values def write_to_file(self, file): with open(file, 'wb') as outfile: @@ -242,15 +675,19 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xAD, 0x70, 0x80, 0x18, 0xCF, 0x0A, 0xD0, 0x07, 0x90, 0x28, 0xDA, 0xA9, 0x14, 0x00, 0x8D, 0x62, 0x7F, 0xAF, 0x12, 0xD0, 0x07, 0xC9, 0x00, 0x00, 0xF0, 0x11, 0xA9, 0x01, 0x00, 0xAE, 0x17, 0x36, 0x9D, 0xDD, 0x53, - 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0x80, 0x06, 0xA9, 0x01, 0x00, 0x8D, 0x00, 0x82, 0xFA, + 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0x80, 0x06, 0xA9, 0x01, 0x00, 0x8D, 0xA0, 0x80, 0xFA, 0xAD, 0x70, 0x80, 0xDF, 0x00, 0xD0, 0x07, 0xB0, 0x02, 0x18, 0x6B, 0x38, 0x6B, ]) # Check for Sound on Main Loop rom.write_bytes(0x6AE4, [0x22, 0x00, 0x9B, 0x07, 0xEA]) - # Play Sound Effect at given address - rom.write_bytes(0x39B00, [0x85, 0xD4, 0xEE, 0x24, 0x35, 0xEA, 0xAD, 0x62, 0x7F, 0xF0, 0x07, 0x22, 0x27, 0xD9, - 0x00, 0x9C, 0x62, 0x7F, 0x6B]) + # Play Sound Effect at given address and check/update traps + rom.write_bytes(0x39B00, [0x85, 0xD4, 0xEE, 0x24, 0x35, 0xEA, 0xAD, 0x62, 0x7F, 0xF0, 0x07, 0x22, 0x27, 0xD9, 0x00, + 0x9C, 0x62, 0x7F, 0xAD, 0xD0, 0x36, 0xC9, 0xFF, 0xFF, 0xF0, 0x34, 0xAD, 0xD3, 0x39, 0xD0, + 0x0F, 0xAD, 0x80, 0x80, 0xC9, 0x00, 0x00, 0xF0, 0x07, 0x22, 0x80, 0xA1, 0x07, 0x9C, 0x80, + 0x80, 0xAD, 0x82, 0x80, 0xF0, 0x04, 0x3A, 0x8D, 0x82, 0x80, 0xDA, 0x5A, 0xAD, 0xA9, 0x54, + 0xF0, 0x0E, 0xAD, 0x84, 0x80, 0xF0, 0x09, 0xA9, 0x00, 0x20, 0x8D, 0xC1, 0x60, 0x9C, 0x84, + 0x80, 0x7A, 0xFA, 0x6B, ]) # Dedede - Remove bad ending rom.write_byte(0xB013, 0x38) # Change CLC to SEC @@ -273,21 +710,61 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0xF0, 0x04, 0x1A, 0x88, 0x80, 0xF7, 0x0A, 0xAA, 0xBF, 0x20, 0xD0, 0x07, 0xC9, 0x1E, 0x00, 0xF0, 0x03, 0x18, 0x80, 0x01, 0x38, 0x7A, 0xFA, 0x6B, 0xEA, ]) # reroute zero eligibility - rom.write_bytes(0x137B1, [0x00, 0x82, 0xC9, 0x01, ]) + rom.write_bytes(0x137B1, [0xA0, 0x80, 0xC9, 0x01, ]) # set goal on non-fast goal rom.write_bytes(0x14463, [0x22, 0x00, 0x9F, 0x07, 0xEA, 0xEA, ]) rom.write_bytes(0x39F00, [0xDA, 0xAF, 0x12, 0xD0, 0x07, 0xC9, 0x00, 0x00, 0xF0, 0x11, 0xA9, 0x01, 0x00, 0xAE, 0x17, 0x36, 0x9D, 0xDD, 0x53, 0x9D, 0xDF, 0x53, 0x9D, 0xD1, 0x53, 0x80, 0x06, 0xA9, 0x01, 0x00, - 0x8D, 0x00, 0x82, 0xFA, 0xA9, 0x06, 0x00, 0x8D, 0xC1, 0x5A, 0x6B, ]) + 0x8D, 0xA0, 0x80, 0xFA, 0xA9, 0x06, 0x00, 0x8D, 0xC1, 0x5A, 0x6B, ]) # set flag for completing a stage - rom.write_bytes(0x143C7, [0x22, 0x80, 0xA0, 0x07, 0xEA, 0xEA, ]) + rom.write_bytes(0x1439D, [0x22, 0x80, 0xA0, 0x07, 0xEA, 0xEA, ]) rom.write_bytes(0x3A080, [0xDA, 0xA9, 0x00, 0x00, 0xAE, 0xCF, 0x53, 0xE0, 0x00, 0x00, 0xF0, 0x0A, 0xCA, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x80, 0xF1, 0xAE, 0xD3, 0x53, 0xE0, 0x07, 0x00, 0xF0, 0x1B, 0xCA, 0xE0, 0x00, 0x00, 0xF0, 0x04, 0x1A, 0xCA, 0x80, 0xF7, 0x0A, 0xAA, 0xBD, 0x20, 0x90, - 0x3A, 0x0A, 0xAA, 0xA9, 0x01, 0x00, 0x1D, 0x00, 0x82, 0x9D, 0x00, 0x82, 0xFA, 0xAD, 0xCD, - 0x53, 0xCD, 0xC1, 0x5A, 0x6B, ]) + 0x3A, 0x0A, 0xAA, 0xA9, 0x01, 0x00, 0x1D, 0x00, 0x82, 0x9D, 0x00, 0x82, 0xFA, 0xAD, 0xCF, + 0x53, 0xCD, 0xCB, 0x53, 0x6B, ]) + + # spawn Gooey for Gooey trap + rom.write_bytes(0x3A180, [0x5A, 0xDA, 0xA2, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x8D, 0x43, 0x55, 0xB9, 0x22, 0x19, 0x85, + 0xC0, 0xB9, 0xA2, 0x19, 0x85, 0xC2, 0xA9, 0x08, 0x00, 0x85, 0xC4, 0xA9, 0x02, 0x00, 0x8D, + 0x2A, 0x35, 0xA9, 0x03, 0x00, 0x22, 0x4F, 0xF5, 0x00, 0x8E, 0x41, 0x55, 0xA9, 0xFF, 0xFF, + 0x9D, 0x22, 0x06, 0x22, 0xEF, 0xBA, 0x00, 0x22, 0x3C, 0x88, 0xC4, 0xAE, 0xD1, 0x39, 0xE0, + 0x01, 0x00, 0xF0, 0x0D, 0xA9, 0xFF, 0xFF, 0xE0, 0x02, 0x00, 0xF0, 0x01, 0x3A, 0x22, 0x22, + 0x3C, 0xC4, 0xFA, 0x7A, 0x6B, ]) + + # limit player speed when speed trap enabled + rom.write_bytes(0x3A200, [0xDA, 0xAE, 0x82, 0x80, 0xF0, 0x01, 0x4A, + 0xFA, 0x99, 0x22, 0x1F, 0x49, 0xFF, 0xFF, 0x6B, ]) + rom.write_bytes(0x785E, [0x22, 0x00, 0xA2, 0x07, 0xEA, 0xEA, ]) + + # write heart star count + rom.write_bytes(0x2246, [0x0D, 0xDA, 0xBD, 0xA0, 0x6C, 0xAA, 0xBD, 0x22, 0x6E, 0x20, 0x5B, 0xA2, 0xFA, 0xE8, 0x22, + 0x80, 0xA2, 0x07, ]) + rom.write_bytes(0x14317, [0x22, 0x00, 0xA3, 0x07, ]) + rom.write_bytes(0x3A280, [0xE0, 0x00, 0x00, 0xF0, 0x01, 0xE8, 0xEC, 0x1E, 0x65, 0x90, 0x66, 0xE0, 0x00, 0x00, 0xF0, + 0x61, 0xAF, 0xD0, 0x36, 0x40, 0x29, 0xFF, 0x00, 0xF0, 0x57, 0xAD, 0x00, 0x30, 0x29, 0x00, + 0x02, 0xC9, 0x00, 0x00, 0xD0, 0x4C, 0x5A, 0xAD, 0x00, 0x30, 0xA8, 0x18, 0x69, 0x14, 0x00, + 0x8D, 0x00, 0x30, 0xAF, 0x70, 0x80, 0x40, 0xA2, 0x00, 0x00, 0xC9, 0x0A, 0x00, 0x90, 0x07, + 0x38, 0xE9, 0x0A, 0x00, 0xE8, 0x80, 0xF4, 0xDA, 0xAA, 0x68, 0x09, 0x00, 0x25, 0x48, 0xA9, + 0x70, 0x2C, 0x99, 0x00, 0x00, 0x68, 0xC8, 0xC8, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0x8A, 0x09, + 0x00, 0x25, 0x48, 0xA9, 0x78, 0x2C, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0x68, 0x99, 0x00, 0x00, + 0xC8, 0xC8, 0x22, 0x80, 0xA3, 0x07, 0x7A, 0x38, 0x6B, ]) + rom.write_bytes(0x3A300, [0x22, 0x9F, 0xD2, 0x00, 0xDA, 0x8B, 0xA9, 0x00, 0x00, 0x48, 0xAB, 0xAB, 0xA9, 0x00, 0x70, + 0x8D, 0x16, 0x21, 0xA2, 0x00, 0x00, 0xE0, 0x40, 0x01, 0xF0, 0x0B, 0xBF, 0x50, 0x2F, 0xD9, + 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0x80, 0xF0, 0xA2, 0x00, 0x00, 0xE0, 0x20, 0x00, 0xF0, 0x0B, + 0xBF, 0x10, 0x2E, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0x80, 0xF0, 0xAB, 0xFA, 0x6B, ]) + rom.write_bytes(0x3A380, [0xA9, 0x80, 0x2C, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, 0x0A, 0x25, 0x99, 0x00, 0x00, 0xC8, + 0xC8, 0xAF, 0xCF, 0x53, 0x40, 0x0A, 0xAA, 0xBF, 0x00, 0x90, 0x40, 0xA2, 0x00, 0x00, 0xC9, + 0x0A, 0x00, 0x90, 0x07, 0x38, 0xE9, 0x0A, 0x00, 0xE8, 0x80, 0xF4, 0xDA, 0xAA, 0x68, 0x09, + 0x00, 0x25, 0x48, 0xA9, 0x88, 0x2C, 0x99, 0x00, 0x00, 0x68, 0xC8, 0xC8, 0x99, 0x00, 0x00, + 0xC8, 0xC8, 0x8A, 0x09, 0x00, 0x25, 0x48, 0xA9, 0x90, 0x2C, 0x99, 0x00, 0x00, 0xC8, 0xC8, + 0x68, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xAD, 0x00, 0x30, 0x38, 0xE9, 0x34, 0x30, 0x4A, 0x4A, + 0xC9, 0x04, 0x00, 0x90, 0x06, 0x3A, 0x3A, 0x3A, 0x3A, 0x80, 0xF5, 0x8D, 0x40, 0x32, 0xA9, + 0x04, 0x00, 0x38, 0xED, 0x40, 0x32, 0xAA, 0xA9, 0xFF, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x05, + 0x4A, 0x4A, 0xCA, 0x80, 0xF6, 0xAC, 0x02, 0x30, 0x39, 0x00, 0x00, 0x99, 0x00, 0x00, 0xC8, + 0xA9, 0x00, 0x00, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0x99, 0x00, 0x00, 0x6B, ]) # base patch done, write relevant slot info @@ -300,33 +777,34 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # Write open world patch if multiworld.open_world[player]: - rom.write_bytes(0x14238, [0xA9, 0x06, 0x00, # LDA #$0006 - 0x22, 0x80, 0x9A, 0x07, # JSL $079A80 - 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # set starting stages to 6 - rom.write_bytes(0x39A80, [0x8D, 0xC1, 0x5A, # STA $5AC1 (cutscene) - 0x8D, 0xCD, 0x53, # STA $53CD (unlocked stages) - 0x1A, # INC - 0x8D, 0xB9, 0x5A, # STA $5AB9 (currently selectable stages) - 0xA9, 0x01, 0x00, # LDA #$0001 - 0x8D, 0x9D, 0x5A, # STA $5A9D - 0x8D, 0x9F, 0x5A, # STA $5A9F - 0x8D, 0xA1, 0x5A, # STA $5AA1 - 0x8D, 0xA3, 0x5A, # STA $5AA3 - 0x8D, 0xA5, 0x5A, # STA $5AA5 - 0x6B, # RTL - ]) - rom.write_bytes(0x3A0BD, [0xCD, 0xCD, 0x53]) # changes the stage flag function to compare $53CD to $53CD, - # always running the "new stage" function - # This has further checks present for bosses already, so we just - # need to handle regular stages + rom.write_bytes(0x14238, [0xA9, 0x06, 0x00, # LDA #$0006 + 0x22, 0x80, 0x9A, 0x07, # JSL $079A80 + 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # set starting stages to 6 + rom.write_bytes(0x39A80, [0x8D, 0xC1, 0x5A, # STA $5AC1 (cutscene) + 0x8D, 0xCD, 0x53, # STA $53CD (unlocked stages) + 0x1A, # INC + 0x8D, 0xB9, 0x5A, # STA $5AB9 (currently selectable stages) + 0xA9, 0x01, 0x00, # LDA #$0001 + 0x8D, 0x9D, 0x5A, # STA $5A9D + 0x8D, 0x9F, 0x5A, # STA $5A9F + 0x8D, 0xA1, 0x5A, # STA $5AA1 + 0x8D, 0xA3, 0x5A, # STA $5AA3 + 0x8D, 0xA5, 0x5A, # STA $5AA5 + 0x6B, # RTL + ]) + rom.write_bytes(0x143C7, [0xAD, 0xC1, 0x5A, 0xCD, 0xC1, 0x5A, ]) + # changes the stage flag function to compare $5AC1 to $5AC1, + # always running the "new stage" function + # This has further checks present for bosses already, so we just + # need to handle regular stages # write check for boss to be unlocked - rom.write_bytes(0x3A100, [0xDA, 0x5A, 0xAD, 0xCD, 0x53, 0xC9, 0x06, 0x00, 0xD0, 0x4E, 0xAD, 0xCF, 0x53, 0x1A, - 0xCD, 0xCB, 0x53, 0xD0, 0x45, 0xA9, 0x00, 0x00, 0xAE, 0xCF, 0x53, 0xE0, 0x00, 0x00, - 0xF0, 0x06, 0x69, 0x06, 0x00, 0xCA, 0x80, 0xF5, 0xAA, 0xA9, 0x00, 0x00, 0xA0, 0x06, - 0x00, 0x5A, 0xDA, 0xFA, 0xBC, 0x20, 0x90, 0x88, 0xE8, 0xE8, 0x48, 0x98, 0x0A, 0xA8, - 0x68, 0x79, 0x00, 0x82, 0x7A, 0x88, 0x5A, 0xDA, 0xC0, 0x00, 0x00, 0xD0, 0xE8, 0xFA, - 0x7A, 0xCD, 0x16, 0x90, 0x90, 0x0C, 0xAD, 0xCD, 0x53, 0x1A, 0x8D, 0xCD, 0x53, 0x8D, - 0xC1, 0x5A, 0x80, 0x03, 0x9C, 0xC1, 0x5A, 0x7A, 0xFA, 0x6B, ]) + rom.write_bytes(0x3A100, [0xDA, 0x5A, 0xAD, 0xCD, 0x53, 0xC9, 0x06, 0x00, 0xD0, 0x50, 0xAD, 0xCF, 0x53, 0x1A, + 0xCD, 0xCB, 0x53, 0xD0, 0x47, 0xA9, 0x00, 0x00, 0xAE, 0xCF, 0x53, 0xE0, 0x00, 0x00, + 0xF0, 0x06, 0x69, 0x06, 0x00, 0xCA, 0x80, 0xF5, 0x0A, 0xAA, 0xA9, 0x00, 0x00, 0xA0, + 0x06, 0x00, 0x5A, 0xDA, 0xFA, 0xBC, 0x20, 0x90, 0x88, 0xE8, 0xE8, 0x48, 0x98, 0x0A, + 0xA8, 0x68, 0x79, 0x00, 0x82, 0x7A, 0x88, 0x5A, 0xDA, 0xC0, 0x00, 0x00, 0xD0, 0xE8, + 0xFA, 0x7A, 0x38, 0xED, 0x16, 0x90, 0x90, 0x0C, 0xAD, 0xCD, 0x53, 0x1A, 0x8D, 0xCD, + 0x53, 0x8D, 0xC1, 0x5A, 0x80, 0x03, 0x9C, 0xC1, 0x5A, 0x7A, 0xFA, 0x6B, ]) # write hook to boss check rom.write_bytes(0x143F0, [0x22, 0x00, 0xA1, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) @@ -346,6 +824,18 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0xF0, 0x04, 0xE8, 0x3A, 0x80, 0xF7, 0xBD, 0x00, 0xA0, 0x09, 0x01, 0x00, 0x9D, 0x00, 0xA0, 0x7A, 0xFA, 0x68, 0xEB, 0x29, 0xFF, 0x00, 0x6B, ]) + if multiworld.music_shuffle[player] > 0: + if multiworld.music_shuffle[player] == 1: + shuffled_music = music_choices.copy() + multiworld.per_slot_randoms[player].shuffle(shuffled_music) + music_map = dict(zip(music_choices, shuffled_music)) + for room in room_pointers: + old_music = rom.read_byte(room+2) + rom.write_byte(room + 2, music_map[old_music]) + elif multiworld.music_shuffle[player] == 2: + for room in room_pointers: + rom.write_byte(room + 2, multiworld.per_slot_randoms[player].choice(music_choices)) + # boss requirements rom.write_bytes(0x3D000, struct.pack("HHHHH", boss_requirements[0], boss_requirements[1], boss_requirements[2], boss_requirements[3], boss_requirements[4])) @@ -354,7 +844,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x3D014, multiworld.stage_shuffle[player].value) rom.write_byte(0x3D016, multiworld.ow_boss_requirement[player].value) rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal_speed[player] == 1 - else 0xFFFF)) + else 0xFFFF)) for level in shuffled_levels: for i in range(len(shuffled_levels[level])): @@ -386,7 +876,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, if multiworld.gooey_flavor_preset[player] != 0: for addr in gooey_target_palettes: target = gooey_target_palettes[addr] - palette = get_gooey_palette(multiworld,player) + palette = get_gooey_palette(multiworld, player) rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1], target[2])) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 78b19711b4a5..eab4b05b235c 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -7,6 +7,20 @@ from BaseClasses import CollectionState +def can_reach_level(state: "CollectionState", player: int, level: int, player_levels: dict, ow_boss_req: int): + if level == 1: + return True + else: + finishable_stages = 0 + for stage in player_levels[level - 1]: + if state.can_reach(location_table[stage], "Location", player): + finishable_stages += 1 + if finishable_stages >= ow_boss_req: + return True + else: + return False + + def can_reach_coo(state: "CollectionState", player: int) -> bool: return state.can_reach("Grass Land 3 - Complete", "Location", player) or \ state.can_reach("Grass Land 5 - Complete", "Location", player) or \ @@ -52,6 +66,7 @@ def set_rules(world: "KDL3World") -> None: world.multiworld.get_location(location_table[world.player_levels[world.player][level][stage]], world.player), lambda state, level=level, stage=stage: True if level == 1 and stage == 0 + or world.multiworld.open_world[world.player] else state.can_reach(location_table[world.player_levels[world.player][level - 1][5]], "Location", world.player) if stage == 0 @@ -62,6 +77,7 @@ def set_rules(world: "KDL3World") -> None: world.multiworld.get_location( location_table[world.player_levels[world.player][level][stage] + 0x100], world.player), lambda state, level=level, stage=stage: True if level == 1 and stage == 0 + or world.multiworld.open_world[world.player] else state.can_reach(location_table[world.player_levels[world.player][level - 1][5]], "Location", world.player) if stage == 0 @@ -77,6 +93,7 @@ def set_rules(world: "KDL3World") -> None: location_table[0x770300 + consumable], world.player), lambda state, level=level, stage=stage: True if level == 1 and stage == 0 + or world.multiworld.open_world[world.player] else state.can_reach(location_table[world.player_levels[world.player][level - 1][5]], "Location", world.player) @@ -251,6 +268,26 @@ def set_rules(world: "KDL3World") -> None: set_rule(world.multiworld.get_entrance("To Level 6", world.player), lambda state: state.has("Heart Star", world.player, world.required_heart_stars[world.player])) + if world.multiworld.open_world[world.player]: + add_rule(world.multiworld.get_entrance("To Level 2", world.player), + lambda state: can_reach_level(state, world.player, 2, + world.player_levels[world.player], + world.multiworld.ow_boss_requirement[world.player])) + add_rule(world.multiworld.get_entrance("To Level 3", world.player), + lambda state: can_reach_level(state, world.player, 3, + world.player_levels[world.player], + world.multiworld.ow_boss_requirement[world.player])) + add_rule(world.multiworld.get_entrance("To Level 4", world.player), + lambda state: can_reach_level(state, world.player, 4, + world.player_levels[world.player], + world.multiworld.ow_boss_requirement[world.player])) + add_rule(world.multiworld.get_entrance("To Level 5", world.player), + lambda state: can_reach_level(state, world.player, 5, + world.player_levels[world.player], + world.multiworld.ow_boss_requirement[world.player])) + + + if world.multiworld.goal_speed[world.player] == 0: add_rule(world.multiworld.get_entrance("To Level 6", world.player), lambda state: state.has("Level 1 Boss Purified", world.player) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 3d1f29a8d67b..39f288f24a03 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -2,7 +2,8 @@ from BaseClasses import Tutorial, ItemClassification, MultiWorld from worlds.AutoWorld import World, WebWorld -from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item +from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item, \ + trap_item_table from .Locations import location_table, KDL3Location, level_consumables, consumable_locations from .Regions import create_levels from .Options import kdl3_options @@ -69,12 +70,20 @@ def create_item(self, name: str, force_non_progression=False) -> KDL3Item: if item.progression and not force_non_progression: classification = ItemClassification.progression_skip_balancing \ if item.skip_balancing else ItemClassification.progression + elif item.trap: + classification = ItemClassification.trap return KDL3Item(name, classification, item.code, self.player) def get_filler_item_name(self) -> str: return self.multiworld.random.choices(list(filler_item_weights.keys()), weights=list(filler_item_weights.values()))[0] + def get_trap_item_name(self) -> str: + return self.multiworld.random.choices( ["Gooey Bag", "Slowness", "Eject Ability"], + weights=[self.multiworld.gooey_trap_weight[self.player], + self.multiworld.slow_trap_weight[self.player], + self.multiworld.ability_trap_weight[self.player]])[0] + def generate_early(self) -> None: # just check for invalid option combos here if self.multiworld.strict_bosses[self.player] and self.multiworld.boss_requirement_random[self.player]: @@ -94,7 +103,9 @@ def create_items(self) -> None: 1) # ensure at least 1 heart star required filler_items = total_heart_stars - required_heart_stars filler_amount = math.floor(filler_items * (self.multiworld.filler_percentage[self.player].value / 100.0)) - nonrequired_heart_stars = filler_items - filler_amount + trap_amount = math.floor(filler_amount * (self.multiworld.trap_percentage[self.player] / 100.0)) + filler_amount -= trap_amount + nonrequired_heart_stars = filler_items - filler_amount - trap_amount self.required_heart_stars[self.player] = required_heart_stars # handle boss requirements here requirements = [required_heart_stars] @@ -114,6 +125,8 @@ def create_items(self) -> None: itempool.extend([self.create_item("Heart Star") for _ in range(required_heart_stars)]) itempool.extend([self.create_item(self.get_filler_item_name()) for _ in range(filler_amount + (remaining_items - total_heart_stars))]) + itempool.extend([self.create_item(self.get_trap_item_name()) + for _ in range(trap_amount)]) itempool.extend([self.create_item("Heart Star", True) for _ in range(nonrequired_heart_stars)]) self.multiworld.itempool += itempool From 7fd3407fe73c3b074c7dfe9b5fa8c67da7d4c3d0 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 15 Jun 2023 03:38:14 -0500 Subject: [PATCH 053/165] kirby and gooey palettes finished --- worlds/kdl3/Aesthetics.py | 306 +++++++++++++++++++++++++++++++++++++- worlds/kdl3/Options.py | 40 ++--- 2 files changed, 319 insertions(+), 27 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index 26cf00dc1468..7eac75607bec 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -1,8 +1,9 @@ import struct +from .Options import KirbyFlavorPreset, GooeyFlavorPreset from struct import pack kirby_flavor_presets = { - 1: { + 1: { "1": "B50029", "2": "FF91C6", "3": "B0123B", @@ -19,8 +20,25 @@ "14": "FFA1DE", "15": "B03830", }, + 2: { + "1": "C70057", + "2": "FF3554", + "3": "AA0040", + "4": "C02D47", + "5": "E02068", + "6": "C2183F", + "7": "D03F80", + "8": "872939", + "9": "E82B47", + "10": "E80067", + "11": "D52F40", + "12": "9F1C33", + "13": "FD187F", + "14": "F85068", + "15": "D2386F", + }, 3: { - "1": "a6a6ed", + "1": "5858e2", "2": "e6e6fa", "3": "bcbcf2", "4": "8484e6", @@ -32,10 +50,78 @@ "10": "4a52ef", "11": "c6c6e6", "12": "4343ad", - "13": "9494ea", + "13": "6767ff", "14": "f6f6fd", "15": "3139b6", }, + 4: { + "1": "B01810", + "2": "F0E08D", + "3": "C8A060", + "4": "A87043", + "5": "E03700", + "6": "EFC063", + "7": "D07818", + "8": "A8501C", + "9": "E8D070", + "10": "E2501E", + "11": "E8C55C", + "12": "B08833", + "13": "E8783B", + "14": "F8F8A5", + "15": "B03800", + }, + 5: { + "1": "9F4410", + "2": "88F27B", + "3": "57A044", + "4": "227029", + "5": "C75418", + "6": "57BA23", + "7": "1C6B00", + "8": "2D6823", + "9": "3FD744", + "10": "E06C16", + "11": "54C053", + "12": "1A541E", + "13": "F06B10", + "14": "98F89A", + "15": "B05830", + }, + 6: { + "1": "7C1060", + "2": "CA8AE8", + "3": "8250A5", + "4": "604B7B", + "5": "A52068", + "6": "8D64B8", + "7": "B73B80", + "8": "672D9A", + "9": "BA82D5", + "10": "B55098", + "11": "9F5CCF", + "12": "632B74", + "13": "CF78B5", + "14": "DA98F8", + "15": "8D3863", + }, + 7: { + "1": "6F1410", + "2": "C2735C", + "3": "5C351C", + "4": "875440", + "5": "9F2F0C", + "6": "874C3B", + "7": "88534C", + "8": "4C1E00", + "9": "B06458", + "10": "921C16", + "11": "9F5C54", + "12": "5B3125", + "13": "C01A14", + "14": "CF785B", + "15": "6B3125", + }, 8: { "1": "a6a6a6", "2": "e6e6e6", @@ -52,10 +138,106 @@ "13": "949494", "14": "f6f6f6", "15": "545454", - } + }, + 9: { + "1": "400000", + "2": "6B6B6B", + "3": "2B2B2B", + "4": "181818", + "5": "640000", + "6": "3D3D3D", + "7": "878787", + "8": "020202", + "9": "606060", + "10": "980000", + "11": "505050", + "12": "474747", + "13": "C80000", + "14": "808080", + "15": "AF0000", + }, + 10: { + "1": "2B4B10", + "2": "EF8A9D", + "3": "C84F6B", + "4": "B74F54", + "5": "126018", + "6": "D85F6F", + "7": "D06870", + "8": "A24858", + "9": "E77B8D", + "10": "168025", + "11": "DF5C68", + "12": "9D4353", + "13": "48953F", + "14": "F897AD", + "15": "B03830", + }, + 11: { + "1": "7B290C", + "2": "FF9A00", + "3": "B05C1C", + "4": "8F3F0E", + "5": "D23B0C", + "6": "E08200", + "7": "D05800", + "8": "8A2B16", + "9": "EF970A", + "10": "E24800", + "11": "E58F00", + "12": "A03700", + "13": "ED3B00", + "14": "FFAF27", + "15": "A84700", + }, + 12: { + "1": "AFA810", + "2": "4FF29D", + "3": "2BA04C", + "4": "007043", + "5": "C7C218", + "6": "33BA5F", + "7": "006B40", + "8": "2D6823", + "9": "1CD773", + "10": "E0CF16", + "11": "2DC06C", + "12": "00543F", + "13": "F0F010", + "14": "43F8B2", + "15": "B0A230", + }, + 13: { + "1": "7C73B0", + "2": "CACAE7", + "3": "7B7BA8", + "4": "5F5FA7", + "5": "B57EDC", + "6": "8585C5", + "7": "5B5B82", + "8": "474796", + "9": "B2B2D8", + "10": "B790EF", + "11": "9898C2", + "12": "6B6BB7", + "13": "CDADFA", + "14": "E6E6FA", + "15": "976FBD", + }, } gooey_flavor_presets = { + 1: { + "1": "CD539D", + "2": "D270AD", + "3": "F27CBF", + "4": "FF91C6", + "5": "FFA1DE", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, 2: { "1": "161600", "2": "592910", @@ -77,7 +259,117 @@ "7": "EF524A", "8": "D6C6C6", "9": "FFFFFF", - } + }, + 4: { + "1": "C8A031", + "2": "C5BD38", + "3": "D2CD48", + "4": "E2E040", + "5": "EAE2A0", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, + 5: { + "1": "54A208", + "2": "5CB021", + "3": "6CB206", + "4": "8AC54C", + "5": "8DD554", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, + 6: { + "1": "3D083D", + "2": "4B024B", + "3": "4C104C", + "4": "5F0A5F", + "5": "9F1D9F", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, + 7: { + "1": "270C08", + "2": "481C10", + "3": "581E10", + "4": "5B2712", + "5": "743316", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, + 8: { + "1": "7F7F7F", + "2": "909090", + "3": "9D9D9D", + "4": "BFBFBF", + "5": "D2D2D2", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, + 9: { + "1": "141414", + "2": "2D2D2D", + "3": "404040", + "4": "585858", + "5": "7F7F7F", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, + 10: { + "1": "954353", + "2": "AF4F68", + "3": "CD6073", + "4": "E06774", + "5": "E587A2", + "6": "17AF10", + "7": "4FE748", + "8": "D6C6C6", + "9": "FFFFFF", + }, + 11: { + "1": "CF4700", + "2": "D85C08", + "3": "E26C04", + "4": "EA7B16", + "5": "EF8506", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, + 12: { + "1": "1C4708", + "2": "105B1C", + "3": "186827", + "4": "187C3B", + "5": "188831", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, + 13: { + "1": "501E70", + "2": "673B87", + "3": "7848A7", + "4": "9067C7", + "5": "B57EDC", + "6": "B51810", + "7": "EF524A", + "8": "D6C6C6", + "9": "FFFFFF", + }, } kirby_target_palettes = { @@ -111,7 +403,7 @@ def get_kirby_palette(multiworld, player): palette = multiworld.kirby_flavor_preset[player].value if palette in kirby_flavor_presets: return kirby_flavor_presets[palette] - elif palette == 14: + elif palette == KirbyFlavorPreset.option_custom: return multiworld.kirby_flavor[player].value else: return None @@ -121,7 +413,7 @@ def get_gooey_palette(multiworld, player): palette = multiworld.gooey_flavor_preset[player].value if palette in gooey_flavor_presets: return gooey_flavor_presets[palette] - elif palette == 14: + elif palette == GooeyFlavorPreset.option_custom: return multiworld.gooey_flavor[player].value else: return None diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 1e988941a3e5..15ac60e15924 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -202,18 +202,18 @@ class KirbyFlavorPreset(Choice): display_name = "Kirby Flavor" option_default = 0 option_bubblegum = 1 - #option_cherry = 2 + option_cherry = 2 option_blueberry = 3 - #option_lemon = 4 - #option_lime = 5 - #option_grape = 6 - #option_chocolate = 7 + option_lemon = 4 + option_kiwi = 5 + option_grape = 6 + option_chocolate = 7 option_marshmallow = 8 - #option_licorice = 9 - #option_watermelon = 10 - #option_orange = 11 - #option_kiwi = 12 - #option_lavender = 13 + option_licorice = 9 + option_watermelon = 10 + option_orange = 11 + option_lime = 12 + option_lavender = 13 option_custom = 14 default = 0 @@ -231,18 +231,18 @@ class GooeyFlavorPreset(Choice): """ display_name = "Gooey Flavor" option_default = 0 - #option_bubblegum = 1 + option_bubblegum = 1 option_cherry = 2 option_blueberry = 3 - #option_lemon = 4 - #option_lime = 5 - #option_grape = 6 - #option_chocolate = 7 - #option_marshmallow = 8 - #option_licorice = 9 - #option_watermelon = 10 - #option_orange = 11 - #option_kiwi = 12 + option_lemon = 4 + option_kiwi = 5 + option_grape = 6 + option_chocolate = 7 + option_marshmallow = 8 + option_licorice = 9 + option_watermelon = 10 + option_orange = 11 + option_lime = 12 #option_lavender = 13 option_custom = 14 default = 0 From e2f53632104081f53651cfb58892f11044a7b620 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 16 Jun 2023 01:26:10 -0500 Subject: [PATCH 054/165] music shuffle, general cleanup, tests --- worlds/kdl3/Aesthetics.py | 1 - worlds/kdl3/Compression.py | 10 +- worlds/kdl3/Items.py | 2 +- worlds/kdl3/Options.py | 2 +- worlds/kdl3/Regions.py | 60 +++---- worlds/kdl3/Rom.py | 19 ++- worlds/kdl3/Rules.py | 251 ++++++++++++------------------ worlds/kdl3/__init__.py | 33 ++-- worlds/kdl3/test/TestLocations.py | 90 +++++++++++ worlds/kdl3/test/__init__.py | 33 +++- 10 files changed, 290 insertions(+), 211 deletions(-) create mode 100644 worlds/kdl3/test/TestLocations.py diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index 7eac75607bec..476b0122cd48 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -1,6 +1,5 @@ import struct from .Options import KirbyFlavorPreset, GooeyFlavorPreset -from struct import pack kirby_flavor_presets = { 1: { diff --git a/worlds/kdl3/Compression.py b/worlds/kdl3/Compression.py index 59627fd312bb..04dc2c1d697d 100644 --- a/worlds/kdl3/Compression.py +++ b/worlds/kdl3/Compression.py @@ -1,10 +1,8 @@ -""" -HAL decompression based on exhal by devinacker -https://github.com/devinacker/exhal -""" - - def hal_decompress(comp: bytes) -> bytes: + """ + HAL decompression based on exhal by devinacker + https://github.com/devinacker/exhal + """ inpos = 0 input = 0 diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index ed7ddb862e7a..c3e8ae459e27 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -1,4 +1,4 @@ -from BaseClasses import Item, ItemClassification +from BaseClasses import Item import typing diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 15ac60e15924..03197bc20cbc 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -243,7 +243,7 @@ class GooeyFlavorPreset(Choice): option_watermelon = 10 option_orange = 11 option_lime = 12 - #option_lavender = 13 + option_lavender = 13 option_custom = 14 default = 0 diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 57275fca224d..9ccc6a8d05ea 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -4,6 +4,7 @@ from .Locations import KDL3Location, location_table, level_consumables from .Names import LocationName from .Options import BossShuffle + if typing.TYPE_CHECKING: from . import KDL3World @@ -54,7 +55,8 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo possible_stages.remove(new_stage) except Exception: - raise Exception(f"Invalid connection: {connection.entrance} => {connection.exit} for player {world.player} ({world.multiworld.player_name[world.player]})") + raise Exception( + f"Invalid connection: {connection.entrance} => {connection.exit} for player {world.player} ({world.multiworld.player_name[world.player]})") for level in range(1, 6): for stage in range(6): @@ -117,6 +119,21 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo return levels +def generate_locations_from_stages(stages: typing.List[int], consumables: bool) -> typing.Dict[str, typing.Optional[int]]: + locations = dict() + for stage in stages[:-1]: + locations[location_table[stage]] = stage + locations[location_table[stage + 0x100]] = stage + 0x100 + if consumables: + stage_idx = stage & 0xFF + if stage_idx in level_consumables: + for consumable in level_consumables[stage_idx]: + loc_id = consumable + 0x770300 + locations[location_table[loc_id]] = loc_id + + return locations + + def create_levels(world: World) -> None: menu = Region("Menu", world.player, world.multiworld) start = Entrance(world.player, "Start Game", menu) @@ -144,32 +161,21 @@ def create_levels(world: World) -> None: else: world.player_levels[world.player] = default_levels.copy() for level in levels: - for stage in world.player_levels[world.player][level]: - if not stage & 0x200: - levels[level].locations.append(KDL3Location(world.player, location_table[stage], stage, levels[level])) - heart_star = stage + 0x100 - levels[level].locations.append(KDL3Location(world.player, location_table[heart_star], - heart_star, levels[level])) - if world.multiworld.consumables[world.player]: - stage_idx = stage & 0xFF - if stage_idx in level_consumables: - for consumable in level_consumables[stage_idx]: - loc_id = 0x770300 + consumable - levels[level].locations.append(KDL3Location(world.player, - location_table[loc_id], - loc_id, levels[level] - )) - level1.locations.append(KDL3Location(world.player, LocationName.grass_land_whispy, 0x770200, level1)) - level2.locations.append(KDL3Location(world.player, LocationName.ripple_field_acro, 0x770201, level2)) - level3.locations.append(KDL3Location(world.player, LocationName.sand_canyon_poncon, 0x770202, level3)) - level4.locations.append(KDL3Location(world.player, LocationName.cloudy_park_ado, 0x770203, level4)) - level5.locations.append(KDL3Location(world.player, LocationName.iceberg_dedede, 0x770204, level5)) - level1.locations.append(KDL3Location(world.player, "Level 1 Boss", None, level1)) - level2.locations.append(KDL3Location(world.player, "Level 2 Boss", None, level2)) - level3.locations.append(KDL3Location(world.player, "Level 3 Boss", None, level3)) - level4.locations.append(KDL3Location(world.player, "Level 4 Boss", None, level4)) - level5.locations.append(KDL3Location(world.player, "Level 5 Boss", None, level5)) - level6.locations.append(KDL3Location(world.player, LocationName.goals[world.multiworld.goal[world.player]], None, level6)) + levels[level].add_locations(generate_locations_from_stages(world.player_levels[world.player][level], + world.multiworld.consumables[world.player]), + KDL3Location) + + for boss_flag, purification, id, level in zip(["Level 1 Boss", "Level 2 Boss", + "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], + [LocationName.grass_land_whispy, LocationName.ripple_field_acro, + LocationName.sand_canyon_poncon, LocationName.cloudy_park_ado, + LocationName.iceberg_dedede], + [0x770200, 0x770201, 0x770202, 0x770203, 0x770204], + [level1, level2, level3, level4, level5]): + level.add_locations({boss_flag: None, purification: id, }, KDL3Location) + + level6.add_locations({LocationName.goals[world.multiworld.goal[world.player]]: None}, KDL3Location) + tlv2 = Entrance(world.player, "To Level 2", level1) level1.exits.append(tlv2) tlv2.connect(level2) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 451d30535d09..dbfc86faba4c 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -102,7 +102,6 @@ 2, # Boss 1 3, # Boss 2 (Unused) 4, # Boss 3 (Miniboss) - 5, # Star Floating (required) 7, # Dedede 8, # Heart Star 9, # Event 2 (used once) @@ -829,12 +828,30 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, shuffled_music = music_choices.copy() multiworld.per_slot_randoms[player].shuffle(shuffled_music) music_map = dict(zip(music_choices, shuffled_music)) + music_map[5] = multiworld.per_slot_randoms[player].choice(music_choices) for room in room_pointers: old_music = rom.read_byte(room+2) rom.write_byte(room + 2, music_map[old_music]) + for i in range(5): + # level themes + old_music = rom.read_byte(0x133F2 + i) + rom.write_byte(0x133F2 + i, music_map[old_music]) + # Zero + rom.write_byte(0x9AE79, music_map[0x18]) + # Heart Star success and fail + rom.write_byte(0x4A388, music_map[0x08]) + rom.write_byte(0x4A38D, music_map[0x1D]) elif multiworld.music_shuffle[player] == 2: for room in room_pointers: rom.write_byte(room + 2, multiworld.per_slot_randoms[player].choice(music_choices)) + for i in range(5): + # level themes + rom.write_byte(0x133F2 + i, multiworld.per_slot_randoms[player].choice(music_choices)) + # Zero + rom.write_byte(0x9AE79, multiworld.per_slot_randoms[player].choice(music_choices)) + # Heart Star success and fail + rom.write_byte(0x4A388, multiworld.per_slot_randoms[player].choice(music_choices)) + rom.write_byte(0x4A38D, multiworld.per_slot_randoms[player].choice(music_choices)) # boss requirements rom.write_bytes(0x3D000, struct.pack("HHHHH", boss_requirements[0], boss_requirements[1], boss_requirements[2], diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index eab4b05b235c..ad5d997ddbce 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -2,105 +2,98 @@ from .Locations import location_table, level_consumables from .Names import LocationName import typing + if typing.TYPE_CHECKING: from . import KDL3World from BaseClasses import CollectionState -def can_reach_level(state: "CollectionState", player: int, level: int, player_levels: dict, ow_boss_req: int): +def can_reach_level(state: "CollectionState", player: int, level: int, player_levels: dict, open_world: bool, + ow_boss_req: int): if level == 1: return True else: - finishable_stages = 0 - for stage in player_levels[level - 1]: - if state.can_reach(location_table[stage], "Location", player): - finishable_stages += 1 - if finishable_stages >= ow_boss_req: - return True + if open_world: + finishable_stages = 0 + for stage in player_levels[level - 1]: + if state.can_reach(location_table[stage], "Location", player): + finishable_stages += 1 + if finishable_stages >= ow_boss_req: + return True + else: + return False else: - return False + return state.can_reach(location_table[player_levels[level - 1][5]], "Location", player) def can_reach_coo(state: "CollectionState", player: int) -> bool: return state.can_reach("Grass Land 3 - Complete", "Location", player) or \ - state.can_reach("Grass Land 5 - Complete", "Location", player) or \ - state.can_reach("Grass Land 6 - Complete", "Location", player) or \ - state.can_reach("Ripple Field 2 - Complete", "Location", player) or \ - state.can_reach("Ripple Field 6 - Complete", "Location", player) or \ - state.can_reach("Sand Canyon 2 - Complete", "Location", player) or \ - state.can_reach("Sand Canyon 3 - Complete", "Location", player) or \ - state.can_reach("Sand Canyon 6 - Complete", "Location", player) or \ - state.can_reach("Cloudy Park 1 - Complete", "Location", player) or \ - state.can_reach("Cloudy Park 4 - Complete", "Location", player) or \ - state.can_reach("Cloudy Park 5 - Complete", "Location", player) or \ - state.can_reach("Cloudy Park 6 - Complete", "Location", player) or \ - state.can_reach("Iceberg 3 - Complete", "Location", player) or \ - state.can_reach("Iceberg 5 - Complete", "Location", player) or \ - state.can_reach("Iceberg 6 - Complete", "Location", player) + state.can_reach("Grass Land 5 - Complete", "Location", player) or \ + state.can_reach("Grass Land 6 - Complete", "Location", player) or \ + state.can_reach("Ripple Field 2 - Complete", "Location", player) or \ + state.can_reach("Ripple Field 6 - Complete", "Location", player) or \ + state.can_reach("Sand Canyon 2 - Complete", "Location", player) or \ + state.can_reach("Sand Canyon 3 - Complete", "Location", player) or \ + state.can_reach("Sand Canyon 6 - Complete", "Location", player) or \ + state.can_reach("Cloudy Park 1 - Complete", "Location", player) or \ + state.can_reach("Cloudy Park 4 - Complete", "Location", player) or \ + state.can_reach("Cloudy Park 5 - Complete", "Location", player) or \ + state.can_reach("Cloudy Park 6 - Complete", "Location", player) or \ + state.can_reach("Iceberg 3 - Complete", "Location", player) or \ + state.can_reach("Iceberg 5 - Complete", "Location", player) or \ + state.can_reach("Iceberg 6 - Complete", "Location", player) # We purposefully leave out Iceberg 4 here, since access to Coo is conditional # on having either Coo and Burning, or potentially Nago and Burning def can_reach_nago(state: "CollectionState", player: int) -> bool: return state.can_reach(LocationName.grass_land_1, "Location", player) \ - or state.can_reach(LocationName.grass_land_5, "Location", player) \ - or state.can_reach(LocationName.grass_land_6, "Location", player) \ - or state.can_reach(LocationName.ripple_field_1, "Location", player) \ - or state.can_reach(LocationName.ripple_field_4, "Location", player) \ - or state.can_reach(LocationName.ripple_field_6, "Location", player) \ - or state.can_reach(LocationName.sand_canyon_4, "Location", player) \ - or state.can_reach(LocationName.sand_canyon_6, "Location", player) \ - or state.can_reach(LocationName.cloudy_park_1, "Location", player) \ - or state.can_reach(LocationName.cloudy_park_2, "Location", player) \ - or state.can_reach(LocationName.cloudy_park_6, "Location", player) \ - or state.can_reach(LocationName.iceberg_2, "Location", player) \ - or state.can_reach(LocationName.iceberg_3, "Location", player) \ - or state.can_reach(LocationName.iceberg_6, "Location", player) + or state.can_reach(LocationName.grass_land_5, "Location", player) \ + or state.can_reach(LocationName.grass_land_6, "Location", player) \ + or state.can_reach(LocationName.ripple_field_1, "Location", player) \ + or state.can_reach(LocationName.ripple_field_4, "Location", player) \ + or state.can_reach(LocationName.ripple_field_6, "Location", player) \ + or state.can_reach(LocationName.sand_canyon_4, "Location", player) \ + or state.can_reach(LocationName.sand_canyon_6, "Location", player) \ + or state.can_reach(LocationName.cloudy_park_1, "Location", player) \ + or state.can_reach(LocationName.cloudy_park_2, "Location", player) \ + or state.can_reach(LocationName.cloudy_park_6, "Location", player) \ + or state.can_reach(LocationName.iceberg_2, "Location", player) \ + or state.can_reach(LocationName.iceberg_3, "Location", player) \ + or state.can_reach(LocationName.iceberg_6, "Location", player) def set_rules(world: "KDL3World") -> None: for level in range(1, len(world.player_levels[world.player]) + 1): for stage in range(len(world.player_levels[world.player][level])): if stage != 6: - set_rule( - world.multiworld.get_location(location_table[world.player_levels[world.player][level][stage]], - world.player), - lambda state, level=level, stage=stage: True if level == 1 and stage == 0 - or world.multiworld.open_world[world.player] - else state.can_reach(location_table[world.player_levels[world.player][level - 1][5]], "Location", - world.player) - if stage == 0 - else state.can_reach( - location_table[world.player_levels[world.player][level][stage - 1]], "Location", - world.player)) - set_rule( - world.multiworld.get_location( - location_table[world.player_levels[world.player][level][stage] + 0x100], world.player), - lambda state, level=level, stage=stage: True if level == 1 and stage == 0 - or world.multiworld.open_world[world.player] - else state.can_reach(location_table[world.player_levels[world.player][level - 1][5]], "Location", - world.player) - if stage == 0 - else state.can_reach( - location_table[world.player_levels[world.player][level][stage - 1]], "Location", - world.player)) - if world.multiworld.consumables[world.player]: - stage_idx = world.player_levels[world.player][level][stage] & 0xFF - if stage_idx in level_consumables: - for consumable in level_consumables[stage_idx]: - set_rule( - world.multiworld.get_location( - location_table[0x770300 + consumable], - world.player), - lambda state, level=level, stage=stage: True if level == 1 and stage == 0 - or world.multiworld.open_world[world.player] - else state.can_reach(location_table[world.player_levels[world.player][level - 1][5]], - "Location", - world.player) - if stage == 0 - else state.can_reach( - location_table[world.player_levels[world.player][level][stage - 1]], "Location", - world.player)) + if not world.multiworld.open_world[world.player]: + set_rule( + world.multiworld.get_location(location_table[world.player_levels[world.player][level][stage]], + world.player), + lambda state, level=level, stage=stage: True if stage == 0 + else state.can_reach( + location_table[world.player_levels[world.player][level][stage - 1]], "Location", + world.player)) + set_rule( + world.multiworld.get_location( + location_table[world.player_levels[world.player][level][stage] + 0x100], world.player), + lambda state, level=level, stage=stage: True if stage == 0 + else state.can_reach( + location_table[world.player_levels[world.player][level][stage - 1]], "Location", + world.player)) + if world.multiworld.consumables[world.player]: + stage_idx = world.player_levels[world.player][level][stage] & 0xFF + if stage_idx in level_consumables: + for consumable in level_consumables[stage_idx]: + set_rule( + world.multiworld.get_location( + location_table[0x770300 + consumable], + world.player), + lambda state, level=level, stage=stage: True if stage == 0 + else state.can_reach( + location_table[world.player_levels[world.player][level][stage - 1]], "Location", + world.player)) # Level 1 add_rule(world.multiworld.get_location(LocationName.grass_land_muchi, world.player), @@ -109,9 +102,7 @@ def set_rules(world: "KDL3World") -> None: lambda state: state.has("Stone", world.player)) add_rule(world.multiworld.get_location(LocationName.grass_land_mine, world.player), lambda state: state.has("Kine", world.player)) - add_rule(world.multiworld.get_entrance("To Level 2", world.player), - lambda state: state.can_reach(location_table[world.player_levels[world.player][1][5]], "Location", - world.player)) + # Level 2 add_rule(world.multiworld.get_location(LocationName.ripple_field_5, world.player), lambda state: state.has("Kine", world.player)) @@ -124,9 +115,6 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.ripple_field_mama_pitch, world.player), lambda state: state.has("Pitch", world.player) and state.has("Kine", world.player) and state.has("Burning", world.player) and state.has("Stone", world.player)) - add_rule(world.multiworld.get_entrance("To Level 3", world.player), - lambda state: state.can_reach(location_table[world.player_levels[world.player][2][5]], "Location", - world.player)) # Level 3 add_rule(world.multiworld.get_location(LocationName.sand_canyon_5, world.player), @@ -142,9 +130,6 @@ def set_rules(world: "KDL3World") -> None: and (state.has("Clean", world.player) or state.has("Spark", world.player)) and (state.has("Ice", world.player) or state.has("Needle", world.player)) ) - add_rule(world.multiworld.get_entrance("To Level 4", world.player), - lambda state: state.can_reach(location_table[world.player_levels[world.player][3][5]], "Location", - world.player)) # Level 4 add_rule(world.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, world.player), @@ -155,9 +140,6 @@ def set_rules(world: "KDL3World") -> None: lambda state: state.has("Coo", world.player)) add_rule(world.multiworld.get_location(LocationName.cloudy_park_pick, world.player), lambda state: state.has("Rick", world.player)) - add_rule(world.multiworld.get_entrance("To Level 5", world.player), - lambda state: state.can_reach(location_table[world.player_levels[world.player][4][5]], "Location", - world.player)) # Level 5 add_rule(world.multiworld.get_location(LocationName.iceberg_4, world.player), @@ -173,7 +155,7 @@ def set_rules(world: "KDL3World") -> None: lambda state: state.has("Nago", world.player) and can_reach_nago(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_angel, world.player), lambda state: state.has_all(world.item_name_groups["Copy Ability"], world.player)) - # easier than writing out 8 ands + # cleaner than writing out 8 ands # Consumables if world.multiworld.consumables[world.player]: @@ -214,79 +196,38 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.cloudy_park_6_u1, world.player), lambda state: state.has("Cutter", world.player)) - set_rule(world.multiworld.get_location("Level 1 Boss", world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][0]) - and state.can_reach(location_table[world.player_levels[world.player][1][5]], "Location", - world.player)) - set_rule(world.multiworld.get_location(LocationName.grass_land_whispy, world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][0]) - and state.can_reach(location_table[world.player_levels[world.player][1][5]], "Location", - world.player)) - set_rule(world.multiworld.get_location("Level 2 Boss", world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][1]) - and state.can_reach(location_table[world.player_levels[world.player][2][5]], "Location", - world.player)) - set_rule(world.multiworld.get_location(LocationName.ripple_field_acro, world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][1]) - and state.can_reach(location_table[world.player_levels[world.player][2][5]], "Location", - world.player)) - set_rule(world.multiworld.get_location("Level 3 Boss", world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][2]) - and state.can_reach(location_table[world.player_levels[world.player][3][5]], "Location", - world.player)) - set_rule(world.multiworld.get_location(LocationName.sand_canyon_poncon, world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][2]) - and state.can_reach(location_table[world.player_levels[world.player][3][5]], "Location", - world.player)) - set_rule(world.multiworld.get_location("Level 4 Boss", world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][3]) - and state.can_reach(location_table[world.player_levels[world.player][4][5]], "Location", - world.player)) - set_rule(world.multiworld.get_location(LocationName.cloudy_park_ado, world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][3]) - and state.can_reach(location_table[world.player_levels[world.player][4][5]], "Location", - world.player)) - set_rule(world.multiworld.get_location("Level 5 Boss", world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][4]) - and state.can_reach(location_table[world.player_levels[world.player][5][5]], "Location", - world.player)) - set_rule(world.multiworld.get_location(LocationName.iceberg_dedede, world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][4]) - and state.can_reach(location_table[world.player_levels[world.player][5][5]], "Location", - world.player)) + for boss_flag, purification, i in zip(["Level 1 Boss", "Level 2 Boss", + "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], + [LocationName.grass_land_whispy, LocationName.ripple_field_acro, + LocationName.sand_canyon_poncon, LocationName.cloudy_park_ado, + LocationName.iceberg_dedede], + range(1, 6)): + set_rule(world.multiworld.get_location(boss_flag, world.player), + lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[world.player][i - 1]) + and state.can_reach(location_table[world.player_levels[world.player][i][5]], + "Location", + world.player)) + set_rule(world.multiworld.get_location(purification, world.player), + lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[world.player][i - 1]) + and state.can_reach(location_table[world.player_levels[world.player][i][5]], + "Location", + world.player)) if world.multiworld.strict_bosses[world.player]: - add_rule(world.multiworld.get_entrance("To Level 2", world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][0])) - add_rule(world.multiworld.get_entrance("To Level 3", world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][1])) - add_rule(world.multiworld.get_entrance("To Level 4", world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][2])) - add_rule(world.multiworld.get_entrance("To Level 5", world.player), - lambda state: state.has("Heart Star", world.player, world.boss_requirements[world.player][3])) + for level in range(2, 6): + add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), + lambda state, i=level: state.has("Heart Star", world.player, + world.boss_requirements[world.player][i - 2])) set_rule(world.multiworld.get_entrance("To Level 6", world.player), lambda state: state.has("Heart Star", world.player, world.required_heart_stars[world.player])) - if world.multiworld.open_world[world.player]: - add_rule(world.multiworld.get_entrance("To Level 2", world.player), - lambda state: can_reach_level(state, world.player, 2, - world.player_levels[world.player], - world.multiworld.ow_boss_requirement[world.player])) - add_rule(world.multiworld.get_entrance("To Level 3", world.player), - lambda state: can_reach_level(state, world.player, 3, - world.player_levels[world.player], - world.multiworld.ow_boss_requirement[world.player])) - add_rule(world.multiworld.get_entrance("To Level 4", world.player), - lambda state: can_reach_level(state, world.player, 4, - world.player_levels[world.player], - world.multiworld.ow_boss_requirement[world.player])) - add_rule(world.multiworld.get_entrance("To Level 5", world.player), - lambda state: can_reach_level(state, world.player, 5, - world.player_levels[world.player], - world.multiworld.ow_boss_requirement[world.player])) - - + for level in range(2, 6): + add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), + lambda state, i=level: can_reach_level(state, world.player, i, + world.player_levels[world.player], + world.multiworld.open_world[world.player], + world.multiworld.ow_boss_requirement[world.player])) if world.multiworld.goal_speed[world.player] == 0: add_rule(world.multiworld.get_entrance("To Level 6", world.player), @@ -294,4 +235,4 @@ def set_rules(world: "KDL3World") -> None: and state.has("Level 2 Boss Purified", world.player) and state.has("Level 3 Boss Purified", world.player) and state.has("Level 4 Boss Purified", world.player) - and state.has("Level 5 Boss Purified", world.player)) \ No newline at end of file + and state.has("Level 5 Boss Purified", world.player)) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 39f288f24a03..d1545107311a 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -12,7 +12,7 @@ from .Rom import KDL3DeltaPatch, get_base_rom_path, RomData, patch_rom from .Client import KDL3SNIClient -from typing import Dict +from typing import Dict, TextIO import os import math import threading @@ -50,7 +50,7 @@ class KDL3World(World): required_heart_stars = dict() boss_requirements = dict() player_levels = dict() - topology_present = False + stage_shuffle_enabled = False def __init__(self, world: MultiWorld, player: int): self.rom_name_available_event = threading.Event() @@ -79,7 +79,7 @@ def get_filler_item_name(self) -> str: weights=list(filler_item_weights.values()))[0] def get_trap_item_name(self) -> str: - return self.multiworld.random.choices( ["Gooey Bag", "Slowness", "Eject Ability"], + return self.multiworld.random.choices(["Gooey Bag", "Slowness", "Eject Ability"], weights=[self.multiworld.gooey_trap_weight[self.player], self.multiworld.slow_trap_weight[self.player], self.multiworld.ability_trap_weight[self.player]])[0] @@ -113,9 +113,6 @@ def create_items(self) -> None: for i in range(4): requirements.append(self.multiworld.per_slot_randoms[self.player].randint( min(3, required_heart_stars), required_heart_stars)) - if self.multiworld.strict_bosses[self.player]: - requirements.sort() - else: self.multiworld.per_slot_randoms[self.player].shuffle(requirements) else: quotient = required_heart_stars // 5 # since we set the last manually, we can afford imperfect rounding @@ -133,20 +130,13 @@ def create_items(self) -> None: set_rules = set_rules def generate_basic(self) -> None: - self.topology_present = self.multiworld.stage_shuffle[self.player].value > 0 + self.stage_shuffle_enabled = self.multiworld.stage_shuffle[self.player].value > 0 goal = self.multiworld.goal[self.player].value goal_location = self.multiworld.get_location(LocationName.goals[goal], self.player) goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, self.player)) - self.multiworld.get_location("Level 1 Boss", self.player) \ - .place_locked_item(KDL3Item("Level 1 Boss Purified", ItemClassification.progression, None, self.player)) - self.multiworld.get_location("Level 2 Boss", self.player) \ - .place_locked_item(KDL3Item("Level 2 Boss Purified", ItemClassification.progression, None, self.player)) - self.multiworld.get_location("Level 3 Boss", self.player) \ - .place_locked_item(KDL3Item("Level 3 Boss Purified", ItemClassification.progression, None, self.player)) - self.multiworld.get_location("Level 4 Boss", self.player) \ - .place_locked_item(KDL3Item("Level 4 Boss Purified", ItemClassification.progression, None, self.player)) - self.multiworld.get_location("Level 5 Boss", self.player) \ - .place_locked_item(KDL3Item("Level 5 Boss Purified", ItemClassification.progression, None, self.player)) + for level in range(1, 6): + self.multiworld.get_location(f"Level {level} Boss", self.player) \ + .place_locked_item(KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) def generate_output(self, output_directory: str): @@ -183,8 +173,15 @@ def modify_multidata(self, multidata: dict): new_name = base64.b64encode(bytes(self.rom_name)).decode() multidata["connect_names"][new_name] = multidata["connect_names"][self.multiworld.player_name[self.player]] + def write_spoiler(self, spoiler_handle: TextIO) -> None: + if self.stage_shuffle_enabled: + spoiler_handle.write("\nLevel Layout:\n") + for level in LocationName.level_names: + for stage, i in zip(self.player_levels[self.player][LocationName.level_names[level]], range(1, 7)): + spoiler_handle.write(f"{level} {i}: {location_table[stage].replace(' - Complete', '')}\n") + def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): - if self.topology_present: + if self.stage_shuffle_enabled: regions = {LocationName.level_names[level]: level for level in LocationName.level_names} level_hint_data = {} for level in self.player_levels[self.player]: diff --git a/worlds/kdl3/test/TestLocations.py b/worlds/kdl3/test/TestLocations.py new file mode 100644 index 000000000000..a768d8162573 --- /dev/null +++ b/worlds/kdl3/test/TestLocations.py @@ -0,0 +1,90 @@ +from . import KDL3TestBase +from worlds.generic import PlandoConnection +from ..Names import LocationName +import typing + + +class TestLocations(KDL3TestBase): + options = { + "open_world": True, + "ow_boss_requirement": 1, + "strict_bosses": False + # these ensure we can always reach all stages physically + } + + def testSimpleHeartStars(self): + self.run_location_test(LocationName.grass_land_muchi, ["ChuChu"]) + self.run_location_test(LocationName.grass_land_chao, ["Stone"]) + self.run_location_test(LocationName.grass_land_mine, ["Kine"]) + self.run_location_test(LocationName.ripple_field_kamuribana, ["Pitch", "Clean"]) + self.run_location_test(LocationName.ripple_field_bakasa, ["Kine", "Parasol"]) + self.run_location_test(LocationName.ripple_field_toad, ["Needle"]) + self.run_location_test(LocationName.ripple_field_mama_pitch, ["Pitch", "Kine", "Burning", "Stone"]) + self.run_location_test(LocationName.sand_canyon_auntie, ["Clean"]) + self.run_location_test(LocationName.sand_canyon_nyupun, ["ChuChu", "Cutter"]) + self.run_location_test(LocationName.sand_canyon_rob, ["Stone", "Kine", "Coo", "Parasol", "Spark", "Ice"]) + self.run_location_test(LocationName.cloudy_park_hibanamodoki, ["Coo", "Clean"]) + self.run_location_test(LocationName.cloudy_park_piyokeko, ["Needle"]) + self.run_location_test(LocationName.cloudy_park_mikarin, ["Coo"]) + self.run_location_test(LocationName.cloudy_park_pick, ["Rick"]) + self.run_location_test(LocationName.iceberg_kogoesou, ["Burning"]) + self.run_location_test(LocationName.iceberg_samus, ["Ice"]) + self.run_location_test(LocationName.iceberg_angel, ["Cutter", "Burning", "Spark", "Parasol", "Needle", "Clean", "Stone", "Ice"]) + + def run_location_test(self, location: str, itempool: typing.List[str]): + items = itempool.copy() + while len(itempool) > 0: + assert not self.can_reach_location(location) + self.collect_by_name(itempool.pop()) + assert self.can_reach_location(location) + self.remove(self.get_items_by_name(items)) + + +class TestName(KDL3TestBase): + options = { + "plando_connections": [ + [], + [ + PlandoConnection("Grass Land 1", "Grass Land 4", "both"), + PlandoConnection("Grass Land 2", "Iceberg 4", "both"), + PlandoConnection("Grass Land 3", "Sand Canyon 5", "both"), + PlandoConnection("Grass Land 4", "Grass Land 3", "both") + ]], + "stage_shuffle": "shuffled", + "plando_options": "connections" + } + + def testName(self): + assert not self.can_reach_location("Iceberg 4 - Name") + self.collect_by_name("Coo") + self.collect_by_name("ChuChu") + self.collect_by_name("Burning") + assert not self.can_reach_location("Iceberg 4 - Name") + # despite Name only requiring Burning/ChuChu/Coo for logic, it cannot be in logic because our + # three accessible stages do not actually give the player access to Coo, thus we need Cutter to pass 3-5 + self.collect_by_name("Cutter") + assert self.can_reach_location("Iceberg 4 - Name") + + +class TestShiro(KDL3TestBase): + options = { + "plando_connections": [ + [], + [ + PlandoConnection("Grass Land 1", "Iceberg 5", "both"), + PlandoConnection("Grass Land 2", "Ripple Field 5", "both"), + PlandoConnection("Grass Land 3", "Grass Land 1", "both") + ]], + "stage_shuffle": "shuffled", + "plando_options": "connections" + } + + def testShiro(self): + assert not self.can_reach_location("Iceberg 5 - Shiro") + self.collect_by_name("Nago") + assert not self.can_reach_location("Iceberg 5 - Shiro") + # despite Shiro only requiring Nago for logic, it cannot be in logic because our two accessible stages + # do not actually give the player access to Nago, thus we need Kine to pass 2-5 + self.collect_by_name("Kine") + assert self.can_reach_location("Iceberg 5 - Shiro") + diff --git a/worlds/kdl3/test/__init__.py b/worlds/kdl3/test/__init__.py index 97c1eda6d23f..64a2ec44f070 100644 --- a/worlds/kdl3/test/__init__.py +++ b/worlds/kdl3/test/__init__.py @@ -1,5 +1,36 @@ -from test.TestBase import WorldTestBase +import typing +from argparse import Namespace +from BaseClasses import MultiWorld, PlandoOptions +from test.TestBase import WorldTestBase +from test.general import gen_steps +from ... import AutoWorld +from ...AutoWorld import call_all class KDL3TestBase(WorldTestBase): game = "Kirby's Dream Land 3" + + def world_setup(self, seed: typing.Optional[int] = None) -> None: + if type(self) is WorldTestBase or \ + (hasattr(WorldTestBase, self._testMethodName) + and not self.run_default_tests and + getattr(self, self._testMethodName).__code__ is + getattr(WorldTestBase, self._testMethodName, None).__code__): + return # setUp gets called for tests defined in the base class. We skip world_setup here. + if not hasattr(self, "game"): + raise NotImplementedError("didn't define game name") + self.multiworld = MultiWorld(1) + self.multiworld.game[1] = self.game + self.multiworld.player_name = {1: "Tester"} + self.multiworld.set_seed(seed) + args = Namespace() + for name, option in AutoWorld.AutoWorldRegister.world_types[self.game].option_definitions.items(): + setattr(args, name, { + 1: option.from_any(self.options.get(name, getattr(option, "default"))) + }) + self.multiworld.set_options(args) + self.multiworld.set_default_common_options() + self.multiworld.plando_options = PlandoOptions.connections + self.multiworld.plando_connections = self.options["plando_connections"] if "plando_connections" in self.options.keys() else [] + for step in gen_steps: + call_all(self.multiworld, step) From 3c423f415a43df64b264deaf49f332500f953877 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 16 Jun 2023 01:28:34 -0500 Subject: [PATCH 055/165] Add KDL3 to apworlds list --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 13b12251e276..2666bfd87b5d 100644 --- a/setup.py +++ b/setup.py @@ -74,6 +74,7 @@ "Links Awakening DX", "Super Metroid", "SMZ3", + "Kirby's Dream Land 3", } From 66c6c7e927fe73fd4bbba724b858c82212f2b8a8 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 16 Jun 2023 01:35:02 -0500 Subject: [PATCH 056/165] revert host.yaml changes from testing --- host.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host.yaml b/host.yaml index f58bdd29e4f4..3d26a461d306 100644 --- a/host.yaml +++ b/host.yaml @@ -82,7 +82,7 @@ generator: race: 0 # List of options that can be plando'd. Can be combined, for example "bosses, items" # Available options: bosses, items, texts, connections - plando_options: "bosses, items, texts, connections" + plando_options: "bosses" sni_options: # Set this to your SNI folder location if you want the MultiClient to attempt an auto start, does nothing if not found sni_path: "SNI" From 6a07bee70c77c41d9e7736b71c214c36b0977abf Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 16 Jun 2023 13:36:13 -0500 Subject: [PATCH 057/165] docs cleanup --- worlds/kdl3/Options.py | 12 +-- worlds/kdl3/__init__.py | 17 ++-- worlds/kdl3/docs/setup_en.md | 148 ++++++++++++++++++++++++++++++++++- 3 files changed, 163 insertions(+), 14 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 03197bc20cbc..e76b3fea1400 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -162,7 +162,7 @@ class TrapPercentage(Range): class GooeyTrapPercentage(Range): """ - Percentage of non-required Heart Stars to be converted to trap items (Gooey Bags, Slowness, Eject Ability). + Chance that any given trap is a Gooey Bag (spawns Gooey when you receive it). """ display_name = "Gooey Trap Percentage" range_start = 0 @@ -171,7 +171,7 @@ class GooeyTrapPercentage(Range): class SlowTrapPercentage(Range): """ - Percentage of non-required Heart Stars to be converted to trap items (Gooey Bags, Slowness, Eject Ability). + Chance that any given trap is Slowness (halves your max speed for 15 seconds when you receive it). """ display_name = "Slowness Trap Percentage" range_start = 0 @@ -180,7 +180,7 @@ class SlowTrapPercentage(Range): class AbilityTrapPercentage(Range): """ - Percentage of traps that are Eject Ability (ejects your ability when you receive it). + Chance that any given trap is an Eject Ability (ejects your ability when you receive it). """ display_name = "Ability Trap Percentage" range_start = 0 @@ -220,7 +220,8 @@ class KirbyFlavorPreset(Choice): class KirbyFlavor(OptionDict): """ - A custom color for Kirby. + A custom color for Kirby. To use a custom color, set the preset to Custom and then define a dict of keys from "1" to + "15", with their values being an HTML hex color. """ default = {} @@ -250,7 +251,8 @@ class GooeyFlavorPreset(Choice): class GooeyFlavor(OptionDict): """ - A custom color for Gooey. + A custom color for Gooey. To use a custom color, set the preset to Custom and then define a dict of keys from "1" to + "15", with their values being an HTML hex color. """ default = {} diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index d1545107311a..f4a68547c631 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -20,18 +20,19 @@ logger = logging.getLogger("Kirby's Dream Land 3") + class KDL3WebWorld(WebWorld): theme = "partyTime" tutorials = [ - # Tutorial( - # "Multiworld Setup Guide", - # "A guide to setting up the Kirby's Dream Land 3 randomizer connected to an Archipelago Multiworld.", - # "English", - # "setup_en.md", - # "setup/en", - # ["Silvris"] - # ) + Tutorial( + "Multiworld Setup Guide", + "A guide to setting up the Kirby's Dream Land 3 randomizer connected to an Archipelago Multiworld.", + "English", + "setup_en.md", + "setup/en", + ["Silvris"] + ) ] diff --git a/worlds/kdl3/docs/setup_en.md b/worlds/kdl3/docs/setup_en.md index fe29a13f6820..ca1dee4351d7 100644 --- a/worlds/kdl3/docs/setup_en.md +++ b/worlds/kdl3/docs/setup_en.md @@ -1 +1,147 @@ -Placeholder Text \ No newline at end of file +# Kirby's Dream Land 3 Randomizer Setup Guide + +## Required Software + +- [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases). Make sure to check the box for `SNI Client - Kirby's Dream Land 3 Patch Setup` +- Hardware or software capable of loading and playing SNES ROM files + - An emulator capable of connecting to SNI with ROM access. Any one of the following will work: + - snes9x-rr from: [snes9x-rr Releases Page](https://github.com/gocha/snes9x-rr/releases) + - BizHawk from: [BizHawk Website](http://tasvideos.org/BizHawk.html) + - bsnes-plus-nwa from: [bsnes-plus GitHub](https://github.com/black-sliver/bsnes-plus) + - **RetroArch is currently incompatible with Kirby's Dream Land 3** + - Or SD2SNES, FXPak Pro ([FXPak Pro Store Page](https://krikzz.com/store/home/54-fxpak-pro.html)), or other + compatible hardware. +- Your KDL3 ROM file, probably named either `Kirby's Dream Land 3 (USA).sfc` or `Hoshi no Kirby 3 (J).sfc` + +## Installation Procedures + +1. Download and install SNIClient from the link above, making sure to install the most recent version. + **The installer file is located in the assets section at the bottom of the version information**. + - During setup, you will be asked to locate your base ROM file. This is your Kirby's Dream Land 3 ROM file. + +2. If you are using an emulator, you should assign your SNI-compatible 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? + +Your config file contains a set of configuration options which provide the generator with information about how it +should generate your game. Each player of a multiworld will provide their own config file. This setup allows each player +to enjoy an experience customized for their taste, and different players in the same multiworld can all have different +options. + +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](/games/Kirby's%20Dream%20Land%203/player-settings) page on the website allows you to configure +your personal settings and export a config file from them. + +### 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](/mysterycheck) page. + +## Generating a Single-Player Game + +1. Navigate to the [Player Settings](/games/Kirby's%20Dream%20Land%203/player-settings) page, configure your options, + and click the "Generate Game" button. +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 patch file. +5. Double-click on your patch file, and SNIClient will launch automatically, create your ROM from the patch file, and + open your emulator for you. + +## 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 `.apkdl3` extension. + +Put your patch file on your desktop or somewhere convenient, and double click it. This should automatically launch the +client, and will also create your ROM in the same place as your patch file. + +### 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/Connector.lua` +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 Script -> Open Script... +5. Select the `Connector.lua` file you downloaded above + - Look in the Archipelago folder for `/SNI/lua/Connector.lua` + +##### bsnes-plus-nwa + +This should automatically connect to SNI. If this is its first time launching, you may be prompted to allow it to +communicate through the Windows Firewall. + +#### 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 +[here](https://github.com/RedGuyyyy/sd2snes/releases). Other hardware may find helpful information +[on this 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! You can execute various commands in your client. For more information regarding +these commands you can use `/help` for local client commands and `!help` for server commands. + +## Hosting a MultiWorld game + +The recommended way to host a game is to use our [hosting service](/generate). 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 website linked above. +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. From 6816d3945debbdbd32b1122cb6ec7efeb8ebf5dc Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 16 Jun 2023 16:57:31 -0500 Subject: [PATCH 058/165] fix open world allowing checks to be sent by doing nothing --- worlds/kdl3/Rom.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index dbfc86faba4c..34830a5d2c53 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -719,11 +719,11 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # set flag for completing a stage rom.write_bytes(0x1439D, [0x22, 0x80, 0xA0, 0x07, 0xEA, 0xEA, ]) - rom.write_bytes(0x3A080, [0xDA, 0xA9, 0x00, 0x00, 0xAE, 0xCF, 0x53, 0xE0, 0x00, 0x00, 0xF0, 0x0A, 0xCA, 0x1A, 0x1A, - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x80, 0xF1, 0xAE, 0xD3, 0x53, 0xE0, 0x07, 0x00, 0xF0, 0x1B, - 0xCA, 0xE0, 0x00, 0x00, 0xF0, 0x04, 0x1A, 0xCA, 0x80, 0xF7, 0x0A, 0xAA, 0xBD, 0x20, 0x90, - 0x3A, 0x0A, 0xAA, 0xA9, 0x01, 0x00, 0x1D, 0x00, 0x82, 0x9D, 0x00, 0x82, 0xFA, 0xAD, 0xCF, - 0x53, 0xCD, 0xCB, 0x53, 0x6B, ]) + rom.write_bytes(0x3A080, [0xDA, 0xAD, 0xC1, 0x5A, 0xF0, 0x38, 0xA9, 0x00, 0x00, 0xAE, 0xCF, 0x53, 0xE0, 0x00, 0x00, + 0xF0, 0x0A, 0xCA, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x80, 0xF1, 0xAE, 0xD3, 0x53, + 0xE0, 0x07, 0x00, 0xF0, 0x1B, 0xCA, 0xE0, 0x00, 0x00, 0xF0, 0x04, 0x1A, 0xCA, 0x80, 0xF7, + 0x0A, 0xAA, 0xBD, 0x20, 0x90, 0x3A, 0x0A, 0xAA, 0xA9, 0x01, 0x00, 0x1D, 0x00, 0x82, 0x9D, + 0x00, 0x82, 0xFA, 0xAD, 0xCF, 0x53, 0xCD, 0xCB, 0x53, 0x6B, ]) # spawn Gooey for Gooey trap rom.write_bytes(0x3A180, [0x5A, 0xDA, 0xA2, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x8D, 0x43, 0x55, 0xB9, 0x22, 0x19, 0x85, From f949e02195c5aac9800414b3f0bf6736031ef178 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 17 Jun 2023 00:27:37 -0500 Subject: [PATCH 059/165] block custom random color, bb bosses --- worlds/kdl3/Options.py | 36 ++++++++++++++++++++++++++++++++++++ worlds/kdl3/Rom.py | 16 +++++++++++++++- worlds/kdl3/__init__.py | 11 ++++++++++- 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index e76b3fea1400..0a4b3d785284 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -1,3 +1,5 @@ +import random + from Options import Option, DeathLink, Choice, Toggle, OptionDict, Range, PlandoBosses, DefaultOnToggle import typing from .Names import LocationName @@ -89,6 +91,20 @@ def can_place_boss(cls, boss: str, location: str) -> bool: option_singularity = 3 +class BossShuffleAllowBB(Choice): + """ + Allow Boss Butch variants of bosses in Boss Shuffle. + Enabled: any boss placed will have a 50% chance of being the Boss Butch variant, including bosses not present + Enforced: all bosses will be their Boss Butch variant. + Boss Butch boss changes are only visual. + """ + auto_display_name = "Allow Boss Butch Bosses" + option_disabled = 0 + option_enabled = 1 + option_enforced = 2 + default = 0 + + class StrictBosses(DefaultOnToggle): """ If enabled, one will not be able to move onto the next world until the previous world's boss has been purified. @@ -160,6 +176,7 @@ class TrapPercentage(Range): range_end = 100 default = 50 + class GooeyTrapPercentage(Range): """ Chance that any given trap is a Gooey Bag (spawns Gooey when you receive it). @@ -169,6 +186,7 @@ class GooeyTrapPercentage(Range): range_end = 100 default = 50 + class SlowTrapPercentage(Range): """ Chance that any given trap is Slowness (halves your max speed for 15 seconds when you receive it). @@ -178,6 +196,7 @@ class SlowTrapPercentage(Range): range_end = 100 default = 50 + class AbilityTrapPercentage(Range): """ Chance that any given trap is an Eject Ability (ejects your ability when you receive it). @@ -217,6 +236,14 @@ class KirbyFlavorPreset(Choice): option_custom = 14 default = 0 + @classmethod + def from_text(cls, text: str) -> Choice: + if text == "random": + choice_list = list(cls.name_lookup) + choice_list.remove(14) + return cls(random.choice(choice_list)) + super().from_text(text) + class KirbyFlavor(OptionDict): """ @@ -248,6 +275,14 @@ class GooeyFlavorPreset(Choice): option_custom = 14 default = 0 + @classmethod + def from_text(cls, text: str) -> Choice: + if text == "random": + choice_list = list(cls.name_lookup) + choice_list.remove(14) + return cls(random.choice(choice_list)) + super().from_text(text) + class GooeyFlavor(OptionDict): """ @@ -286,6 +321,7 @@ class MusicShuffle(Choice): "jumping_target": JumpingTarget, "stage_shuffle": LevelShuffle, "boss_shuffle": BossShuffle, + "allow_bb": BossShuffleAllowBB, "strict_bosses": StrictBosses, "open_world": OpenWorld, "ow_boss_requirement": OpenWorldBossRequirement, diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 34830a5d2c53..0f0700e5dbc4 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -47,6 +47,16 @@ 0x770202: 0x03C8, 0x770203: 0x04E0, 0x770204: 0x06A4, + 0x770205: 0x06A8, +} + +bb_bosses = { + 0x770200: 0xED85F1, + 0x770201: 0xF01360, + 0x770202: 0xEDA3DF, + 0x770203: 0xEDC2B9, + 0x770204: 0xED7C3F, + 0x770205: 0xEC29D2, } level_sprites = { @@ -613,7 +623,7 @@ def read_from_file(self, file): self.file = bytearray(stream.read()) -def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, shuffled_levels): +def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, shuffled_levels, bb_boss_enabled): # increase BWRAM by 0x8000 rom.write_byte(0x7FD8, 0x06) @@ -873,6 +883,10 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(0x3D080 + (level - 1) * 12 + (i * 2), struct.pack("H", (shuffled_levels[level][i] & 0x00FFFF) % 6)) + for i in range(6): + if bb_boss_enabled[i]: + rom.write_bytes(0x3F0000 + (level_pointers[0x770200 + i]), struct.pack("I", bb_bosses[0x770200 + i])) + # write jumping goal rom.write_bytes(0x94F8, struct.pack("H", multiworld.jumping_target[player])) rom.write_bytes(0x944E, struct.pack("H", multiworld.jumping_target[player])) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index f4a68547c631..3117bc310f7d 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -52,6 +52,7 @@ class KDL3World(World): boss_requirements = dict() player_levels = dict() stage_shuffle_enabled = False + boss_butch_bosses = dict() def __init__(self, world: MultiWorld, player: int): self.rom_name_available_event = threading.Event() @@ -139,6 +140,13 @@ def generate_basic(self) -> None: self.multiworld.get_location(f"Level {level} Boss", self.player) \ .place_locked_item(KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) + self.boss_butch_bosses[self.player] = [False for _ in range(6)] + if self.multiworld.allow_bb[self.player]: + for i in range(6): + if self.multiworld.allow_bb[self.player] == 1: + self.boss_butch_bosses[self.player][i] = self.multiworld.per_slot_randoms[self.player].choice([True, False]) + else: + self.boss_butch_bosses[self.player][i] = True def generate_output(self, output_directory: str): rompath = "" @@ -149,7 +157,8 @@ def generate_output(self, output_directory: str): rom = RomData(get_base_rom_path()) patch_rom(self.multiworld, self.player, rom, self.required_heart_stars[self.player], self.boss_requirements[self.player], - self.player_levels[self.player]) + self.player_levels[self.player], + self.boss_butch_bosses[self.player]) rompath = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") rom.write_to_file(rompath) From 92d2043e97e50940f70ad3bfa743c90e2e23cfb1 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 17 Jun 2023 01:31:12 -0500 Subject: [PATCH 060/165] forgot return in presets --- worlds/kdl3/Options.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 0a4b3d785284..93d98233f804 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -242,7 +242,7 @@ def from_text(cls, text: str) -> Choice: choice_list = list(cls.name_lookup) choice_list.remove(14) return cls(random.choice(choice_list)) - super().from_text(text) + return super().from_text(text) class KirbyFlavor(OptionDict): @@ -277,11 +277,12 @@ class GooeyFlavorPreset(Choice): @classmethod def from_text(cls, text: str) -> Choice: + text = text.lower() if text == "random": choice_list = list(cls.name_lookup) choice_list.remove(14) return cls(random.choice(choice_list)) - super().from_text(text) + return super().from_text(text) class GooeyFlavor(OptionDict): From 6b7dc7050bb564b7f867fa187779f2d4ef255520 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 27 Jun 2023 00:44:58 -0500 Subject: [PATCH 061/165] docs and options update, goal is now displayed on level select --- worlds/kdl3/Options.py | 2 +- worlds/kdl3/Rom.py | 30 +++++++++++++++------ worlds/kdl3/docs/en_Kirby's Dream Land 3.md | 7 +++++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 93d98233f804..1727cef3ea92 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -98,7 +98,7 @@ class BossShuffleAllowBB(Choice): Enforced: all bosses will be their Boss Butch variant. Boss Butch boss changes are only visual. """ - auto_display_name = "Allow Boss Butch Bosses" + display_name = "Allow Boss Butch Bosses" option_disabled = 0 option_enabled = 1 option_enforced = 2 diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 0f0700e5dbc4..9a7b2e87e25a 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -1,3 +1,5 @@ +import typing + import Utils from typing import Optional import hashlib @@ -554,7 +556,7 @@ def handle_level_sprites(stages, sprites, palettes): tiles_by_level.extend([[tiles[x] for x in stage_tiles[stage]] for stage in stage_tiles]) for world in range(5): levels = [stages[world][x] - 1 for x in range(6)] - world_tiles = [None for _ in range(72)] + world_tiles = [typing.Optional[bytes] for _ in range(72)] for i in range(6): for x in range(12): world_tiles[stage_tiles[i][x]] = tiles_by_level[levels[i]][x] @@ -754,7 +756,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(0x14317, [0x22, 0x00, 0xA3, 0x07, ]) rom.write_bytes(0x3A280, [0xE0, 0x00, 0x00, 0xF0, 0x01, 0xE8, 0xEC, 0x1E, 0x65, 0x90, 0x66, 0xE0, 0x00, 0x00, 0xF0, 0x61, 0xAF, 0xD0, 0x36, 0x40, 0x29, 0xFF, 0x00, 0xF0, 0x57, 0xAD, 0x00, 0x30, 0x29, 0x00, - 0x02, 0xC9, 0x00, 0x00, 0xD0, 0x4C, 0x5A, 0xAD, 0x00, 0x30, 0xA8, 0x18, 0x69, 0x14, 0x00, + 0x02, 0xC9, 0x00, 0x00, 0xD0, 0x4C, 0x5A, 0xAD, 0x00, 0x30, 0xA8, 0x18, 0x69, 0x20, 0x00, 0x8D, 0x00, 0x30, 0xAF, 0x70, 0x80, 0x40, 0xA2, 0x00, 0x00, 0xC9, 0x0A, 0x00, 0x90, 0x07, 0x38, 0xE9, 0x0A, 0x00, 0xE8, 0x80, 0xF4, 0xDA, 0xAA, 0x68, 0x09, 0x00, 0x25, 0x48, 0xA9, 0x70, 0x2C, 0x99, 0x00, 0x00, 0x68, 0xC8, 0xC8, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0x8A, 0x09, @@ -763,17 +765,28 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(0x3A300, [0x22, 0x9F, 0xD2, 0x00, 0xDA, 0x8B, 0xA9, 0x00, 0x00, 0x48, 0xAB, 0xAB, 0xA9, 0x00, 0x70, 0x8D, 0x16, 0x21, 0xA2, 0x00, 0x00, 0xE0, 0x40, 0x01, 0xF0, 0x0B, 0xBF, 0x50, 0x2F, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0x80, 0xF0, 0xA2, 0x00, 0x00, 0xE0, 0x20, 0x00, 0xF0, 0x0B, - 0xBF, 0x10, 0x2E, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0x80, 0xF0, 0xAB, 0xFA, 0x6B, ]) + 0xBF, 0x10, 0x2E, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0x80, 0xF0, 0x5A, 0xAF, 0x12, 0xD0, + 0x07, 0x0A, 0xAA, 0xBF, 0x00, 0xE0, 0x07, 0xAA, 0xA0, 0x00, 0x00, 0xC0, 0x20, 0x00, 0xF0, + 0x0D, 0xBF, 0x70, 0x31, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0xC8, 0xC8, 0x80, 0xEE, 0xAF, + 0x0C, 0xD0, 0x07, 0x0A, 0xAA, 0xBF, 0x10, 0xE0, 0x07, 0xAA, 0xA0, 0x00, 0x00, 0xC0, 0x20, + 0x00, 0xF0, 0x0D, 0xBF, 0x70, 0x31, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0xC8, 0xC8, 0x80, + 0xEE, 0x7A, 0xAB, 0xFA, 0x6B, ]) rom.write_bytes(0x3A380, [0xA9, 0x80, 0x2C, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, 0x0A, 0x25, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xAF, 0xCF, 0x53, 0x40, 0x0A, 0xAA, 0xBF, 0x00, 0x90, 0x40, 0xA2, 0x00, 0x00, 0xC9, 0x0A, 0x00, 0x90, 0x07, 0x38, 0xE9, 0x0A, 0x00, 0xE8, 0x80, 0xF4, 0xDA, 0xAA, 0x68, 0x09, 0x00, 0x25, 0x48, 0xA9, 0x88, 0x2C, 0x99, 0x00, 0x00, 0x68, 0xC8, 0xC8, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0x8A, 0x09, 0x00, 0x25, 0x48, 0xA9, 0x90, 0x2C, 0x99, 0x00, 0x00, 0xC8, 0xC8, - 0x68, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xAD, 0x00, 0x30, 0x38, 0xE9, 0x34, 0x30, 0x4A, 0x4A, - 0xC9, 0x04, 0x00, 0x90, 0x06, 0x3A, 0x3A, 0x3A, 0x3A, 0x80, 0xF5, 0x8D, 0x40, 0x32, 0xA9, - 0x04, 0x00, 0x38, 0xED, 0x40, 0x32, 0xAA, 0xA9, 0xFF, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x05, - 0x4A, 0x4A, 0xCA, 0x80, 0xF6, 0xAC, 0x02, 0x30, 0x39, 0x00, 0x00, 0x99, 0x00, 0x00, 0xC8, - 0xA9, 0x00, 0x00, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0x99, 0x00, 0x00, 0x6B, ]) + 0x68, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, 0xD8, 0x14, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, + 0x0B, 0x25, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, 0xE0, 0x14, 0x99, 0x00, 0x00, 0xC8, 0xC8, + 0xA9, 0x0A, 0x25, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, 0xE8, 0x14, 0x99, 0x00, 0x00, 0xC8, + 0xC8, 0xA9, 0x0C, 0x25, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xAD, 0x00, 0x30, 0x38, 0xE9, 0x40, + 0x30, 0x4A, 0x4A, 0xC9, 0x04, 0x00, 0x90, 0x06, 0x3A, 0x3A, 0x3A, 0x3A, 0x80, 0xF5, 0x8D, + 0x40, 0x32, 0xA9, 0x04, 0x00, 0x38, 0xED, 0x40, 0x32, 0xAA, 0xA9, 0xFF, 0x00, 0xE0, 0x00, + 0x00, 0xF0, 0x05, 0x4A, 0x4A, 0xCA, 0x80, 0xF6, 0xAC, 0x02, 0x30, 0x39, 0x00, 0x00, 0x99, + 0x00, 0x00, 0xC8, 0xA9, 0x00, 0x00, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0x99, 0x00, 0x00, 0x6B, + ]) + rom.write_bytes(0x3E000, [0x20, 0x03, 0x20, 0x00, 0x80, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xA0, 0x01, 0xA0, 0x00, ]) # base patch done, write relevant slot info @@ -872,6 +885,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x3D016, multiworld.ow_boss_requirement[player].value) rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal_speed[player] == 1 else 0xFFFF)) + rom.write_byte(0x3D00C, multiworld.goal_speed[player]) for level in shuffled_levels: for i in range(len(shuffled_levels[level])): diff --git a/worlds/kdl3/docs/en_Kirby's Dream Land 3.md b/worlds/kdl3/docs/en_Kirby's Dream Land 3.md index 7437e66e5dc1..cd0485cc1017 100644 --- a/worlds/kdl3/docs/en_Kirby's Dream Land 3.md +++ b/worlds/kdl3/docs/en_Kirby's Dream Land 3.md @@ -14,6 +14,7 @@ as Heart Stars, 1-Ups, and Invincibility Candy will be shuffled into the pool fo - Completing the given task of a stage and receiving a Heart Star - Purifying a boss after acquiring a certain number of Heart Stars (indicated by their portrait flashing in the level select) +- If enabled, 1-Ups and Maxim Tomatoes ## When the player receives an item, what happens? A sound effect will play, and Kirby will immediately receive the effects of that item, such as being able to receive Copy Abilities from enemies that @@ -25,3 +26,9 @@ where Zero can be found and defeated. Under the Boss Butch goal, players must collect enough Heart Stars to purify the five bosses, defeat Zero in the Hyper Zone, and then complete the Boss Butch game mode accessible from the main menu. + +Under the MG5 goal, players must collect enough Heart Stars to purify the five bosses, defeat Zero in the Hyper Zone, +and then perfect the Super MG5 game mode accessible from the main menu. + +Under the Jumping goal, players must collect enough Heart Stars to purify the five bosses, defeat Zero in the Hyper Zone, +and then reach a target score in the Jumping game mode accessible from the main menu. From 426425c8b56b69bf3e86ac06403b56162a628d8c Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 27 Jun 2023 01:58:28 -0500 Subject: [PATCH 062/165] raise min heart stars to 5, rename visual for max hs option --- worlds/kdl3/Options.py | 4 ++-- worlds/kdl3/__init__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 1727cef3ea92..758ab6897158 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -32,9 +32,9 @@ class GoalSpeed(Choice): class TotalHeartStars(Range): """ - Total number of heart stars to include in the pool of items. + Maximum number of heart stars to include in the pool of items. """ - display_name = "Total Heart Stars" + display_name = "Max Heart Stars" range_start = 5 # set to 5 so strict bosses does not degrade range_end = 50 # 30 default locations + 30 stage clears + 5 bosses - 14 progression items = 51, so round down default = 30 diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 3117bc310f7d..ef4508f7b107 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -102,7 +102,7 @@ def create_items(self) -> None: else len(location_table) - len(consumable_locations)) - len(itempool) total_heart_stars = self.multiworld.total_heart_stars[self.player].value required_heart_stars = max(math.floor(total_heart_stars * required_percentage), - 1) # ensure at least 1 heart star required + 5) # ensure at least 1 heart star required filler_items = total_heart_stars - required_heart_stars filler_amount = math.floor(filler_items * (self.multiworld.filler_percentage[self.player].value / 100.0)) trap_amount = math.floor(filler_amount * (self.multiworld.trap_percentage[self.player] / 100.0)) From 8b52d358cdc5a468a69af32d78aa360549f98c36 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 27 Jun 2023 02:46:56 -0500 Subject: [PATCH 063/165] webhost cleanup --- worlds/kdl3/Options.py | 9 ++++++++- worlds/kdl3/docs/en_Kirby's Dream Land 3.md | 10 +++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 758ab6897158..91ae07a93826 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -15,10 +15,17 @@ class Goal(Choice): display_name = "Goal" option_zero = 0 option_boss_butch = 1 - option_mg5 = 2 + option_MG5 = 2 option_jumping = 3 default = 0 + @classmethod + def get_option_name(cls, value) -> str: + if cls.auto_display_name and value == 2: + return cls.name_lookup[value].upper() + else: + return cls.name_lookup[value].title().replace("_", " ") + class GoalSpeed(Choice): """ diff --git a/worlds/kdl3/docs/en_Kirby's Dream Land 3.md b/worlds/kdl3/docs/en_Kirby's Dream Land 3.md index cd0485cc1017..c1e36fed546a 100644 --- a/worlds/kdl3/docs/en_Kirby's Dream Land 3.md +++ b/worlds/kdl3/docs/en_Kirby's Dream Land 3.md @@ -24,11 +24,15 @@ give said Copy Ability. Animal Friends will require leaving the room you are cur Under the Zero goal, players must collect enough Heart Stars to purify the five bosses and gain access to the Hyper Zone, where Zero can be found and defeated. -Under the Boss Butch goal, players must collect enough Heart Stars to purify the five bosses, defeat Zero in the Hyper Zone, +Under the Boss Butch goal, players must collect enough Heart Stars to purify the five bosses and then complete the Boss Butch game mode accessible from the main menu. -Under the MG5 goal, players must collect enough Heart Stars to purify the five bosses, defeat Zero in the Hyper Zone, +Under the MG5 goal, players must collect enough Heart Stars to purify the five bosses and then perfect the Super MG5 game mode accessible from the main menu. -Under the Jumping goal, players must collect enough Heart Stars to purify the five bosses, defeat Zero in the Hyper Zone, +Under the Jumping goal, players must collect enough Heart Stars to purify the five bosses and then reach a target score in the Jumping game mode accessible from the main menu. + +## Why is EmuHawk resizing itself while I'm playing? +Kirby's Dream Land 3 changes the SNES's display resolution from 1x to 2x many times during gameplay (particularly in rooms with foreground effects). +To counter-act this resizing, set SNES -> Options -> "Always use double-size frame buffer". From dd96c0751ec30618bd02709c6afbec7d7741b638 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 28 Jun 2023 18:46:11 -0500 Subject: [PATCH 064/165] option access cleanup --- worlds/kdl3/Rom.py | 8 ++++---- worlds/kdl3/__init__.py | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 9a7b2e87e25a..adb8dffc96f2 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -879,10 +879,10 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # boss requirements rom.write_bytes(0x3D000, struct.pack("HHHHH", boss_requirements[0], boss_requirements[1], boss_requirements[2], boss_requirements[3], boss_requirements[4])) - rom.write_byte(0x3D010, multiworld.death_link[player].value) - rom.write_byte(0x3D012, multiworld.goal[player].value) - rom.write_byte(0x3D014, multiworld.stage_shuffle[player].value) - rom.write_byte(0x3D016, multiworld.ow_boss_requirement[player].value) + rom.write_byte(0x3D010, multiworld.death_link[player]) + rom.write_byte(0x3D012, multiworld.goal[player]) + rom.write_byte(0x3D014, multiworld.stage_shuffle[player]) + rom.write_byte(0x3D016, multiworld.ow_boss_requirement[player]) rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal_speed[player] == 1 else 0xFFFF)) rom.write_byte(0x3D00C, multiworld.goal_speed[player]) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index ef4508f7b107..a876d825c9db 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -91,27 +91,27 @@ def generate_early(self) -> None: if self.multiworld.strict_bosses[self.player] and self.multiworld.boss_requirement_random[self.player]: logger.warning(f"boss_requirement_random forced to false for player {self.player}" + f" because of strict_bosses set to true") - self.multiworld.boss_requirement_random[self.player].value = False + self.multiworld.boss_requirement_random[self.player] = False def create_items(self) -> None: itempool = [] itempool.extend([self.create_item(name) for name in copy_ability_table]) itempool.extend([self.create_item(name) for name in animal_friend_table]) - required_percentage = self.multiworld.heart_stars_required[self.player].value / 100.0 + required_percentage = self.multiworld.heart_stars_required[self.player] / 100.0 remaining_items = (len(location_table) if self.multiworld.consumables[self.player] else len(location_table) - len(consumable_locations)) - len(itempool) - total_heart_stars = self.multiworld.total_heart_stars[self.player].value + total_heart_stars = self.multiworld.total_heart_stars[self.player] required_heart_stars = max(math.floor(total_heart_stars * required_percentage), 5) # ensure at least 1 heart star required filler_items = total_heart_stars - required_heart_stars - filler_amount = math.floor(filler_items * (self.multiworld.filler_percentage[self.player].value / 100.0)) + filler_amount = math.floor(filler_items * (self.multiworld.filler_percentage[self.player] / 100.0)) trap_amount = math.floor(filler_amount * (self.multiworld.trap_percentage[self.player] / 100.0)) filler_amount -= trap_amount nonrequired_heart_stars = filler_items - filler_amount - trap_amount self.required_heart_stars[self.player] = required_heart_stars # handle boss requirements here requirements = [required_heart_stars] - if self.multiworld.boss_requirement_random[self.player].value: + if self.multiworld.boss_requirement_random[self.player]: for i in range(4): requirements.append(self.multiworld.per_slot_randoms[self.player].randint( min(3, required_heart_stars), required_heart_stars)) @@ -132,8 +132,8 @@ def create_items(self) -> None: set_rules = set_rules def generate_basic(self) -> None: - self.stage_shuffle_enabled = self.multiworld.stage_shuffle[self.player].value > 0 - goal = self.multiworld.goal[self.player].value + self.stage_shuffle_enabled = self.multiworld.stage_shuffle[self.player] > 0 + goal = self.multiworld.goal[self.player] goal_location = self.multiworld.get_location(LocationName.goals[goal], self.player) goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, self.player)) for level in range(1, 6): From c15f5d306a8cfb833c41b9e5c6629a2a635a4483 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 30 Jun 2023 17:45:20 -0500 Subject: [PATCH 065/165] typing and pep cleanup --- worlds/kdl3/Client.py | 2 -- worlds/kdl3/Items.py | 2 +- worlds/kdl3/Options.py | 1 + worlds/kdl3/Regions.py | 24 +++++++++++++----------- worlds/kdl3/Rom.py | 7 +++---- worlds/kdl3/Rules.py | 3 ++- worlds/kdl3/__init__.py | 20 ++++++++++---------- 7 files changed, 30 insertions(+), 29 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 8d2c71c32eca..23faaae656e6 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -312,7 +312,5 @@ async def game_watcher(self, ctx) -> None: f'New Check: {location} ({len(ctx.locations_checked)}/{len(ctx.missing_locations) + len(ctx.checked_locations)})') await ctx.send_msgs([{"cmd": 'LocationChecks', "locations": [new_check_id]}]) - # KDL3_TODO: make the game show items received visually - if game_state[0] != 0xFF: await self.pop_item(ctx) diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index c3e8ae459e27..4b7bfde417d3 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -65,4 +65,4 @@ class KDL3Item(Item): "Animal Friend": {name for name in animal_friend_table.keys()} } -lookup_name_to_id: typing.Dict[str, int] = {item_name: data.code for item_name, data in item_table.items() if data.code} \ No newline at end of file +lookup_name_to_id: typing.Dict[str, int] = {item_name: data.code for item_name, data in item_table.items() if data.code} diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 91ae07a93826..a91ae1a53442 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -86,6 +86,7 @@ class BossShuffle(PlandoBosses): locations = LocationName.level_names.keys() duplicate_bosses = True + @classmethod def can_place_boss(cls, boss: str, location: str) -> bool: # Kirby has no logic about requiring bosses in specific locations (since we load in their stage) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 9ccc6a8d05ea..df7e8200b8da 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -32,7 +32,7 @@ def generate_valid_level(level, stage, possible_stages, slot_random): def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bool) -> dict: - levels = { + levels: typing.Dict[int, typing.List[typing.Optional[int]]] = { 1: [None for _ in range(7)], 2: [None for _ in range(7)], 3: [None for _ in range(7)], @@ -56,7 +56,8 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo except Exception: raise Exception( - f"Invalid connection: {connection.entrance} => {connection.exit} for player {world.player} ({world.multiworld.player_name[world.player]})") + f"Invalid connection: {connection.entrance} =>" + f" {connection.exit} for player {world.player} ({world.multiworld.player_name[world.player]})") for level in range(1, 6): for stage in range(6): @@ -119,7 +120,8 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo return levels -def generate_locations_from_stages(stages: typing.List[int], consumables: bool) -> typing.Dict[str, typing.Optional[int]]: +def generate_locations_from_stages(stages: typing.List[int], + consumables: bool) -> typing.Dict[str, typing.Optional[int]]: locations = dict() for stage in stages[:-1]: locations[location_table[stage]] = stage @@ -165,14 +167,14 @@ def create_levels(world: World) -> None: world.multiworld.consumables[world.player]), KDL3Location) - for boss_flag, purification, id, level in zip(["Level 1 Boss", "Level 2 Boss", - "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], - [LocationName.grass_land_whispy, LocationName.ripple_field_acro, - LocationName.sand_canyon_poncon, LocationName.cloudy_park_ado, - LocationName.iceberg_dedede], - [0x770200, 0x770201, 0x770202, 0x770203, 0x770204], - [level1, level2, level3, level4, level5]): - level.add_locations({boss_flag: None, purification: id, }, KDL3Location) + for boss_flag, purification, idx, level in zip(["Level 1 Boss", "Level 2 Boss", + "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], + [LocationName.grass_land_whispy, LocationName.ripple_field_acro, + LocationName.sand_canyon_poncon, LocationName.cloudy_park_ado, + LocationName.iceberg_dedede], + [0x770200, 0x770201, 0x770202, 0x770203, 0x770204], + [level1, level2, level3, level4, level5]): + level.add_locations({boss_flag: None, purification: idx, }, KDL3Location) level6.add_locations({LocationName.goals[world.multiworld.goal[world.player]]: None}, KDL3Location) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index adb8dffc96f2..b8c14e44aef6 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -770,7 +770,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0x0D, 0xBF, 0x70, 0x31, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0xC8, 0xC8, 0x80, 0xEE, 0xAF, 0x0C, 0xD0, 0x07, 0x0A, 0xAA, 0xBF, 0x10, 0xE0, 0x07, 0xAA, 0xA0, 0x00, 0x00, 0xC0, 0x20, 0x00, 0xF0, 0x0D, 0xBF, 0x70, 0x31, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0xC8, 0xC8, 0x80, - 0xEE, 0x7A, 0xAB, 0xFA, 0x6B, ]) + 0xEE, 0x7A, 0xAB, 0xFA, 0x6B, ]) rom.write_bytes(0x3A380, [0xA9, 0x80, 0x2C, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, 0x0A, 0x25, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xAF, 0xCF, 0x53, 0x40, 0x0A, 0xAA, 0xBF, 0x00, 0x90, 0x40, 0xA2, 0x00, 0x00, 0xC9, 0x0A, 0x00, 0x90, 0x07, 0x38, 0xE9, 0x0A, 0x00, 0xE8, 0x80, 0xF4, 0xDA, 0xAA, 0x68, 0x09, @@ -853,7 +853,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, music_map = dict(zip(music_choices, shuffled_music)) music_map[5] = multiworld.per_slot_randoms[player].choice(music_choices) for room in room_pointers: - old_music = rom.read_byte(room+2) + old_music = rom.read_byte(room + 2) rom.write_byte(room + 2, music_map[old_music]) for i in range(5): # level themes @@ -883,8 +883,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x3D012, multiworld.goal[player]) rom.write_byte(0x3D014, multiworld.stage_shuffle[player]) rom.write_byte(0x3D016, multiworld.ow_boss_requirement[player]) - rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal_speed[player] == 1 - else 0xFFFF)) + rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal_speed[player] == 1 else 0xFFFF)) rom.write_byte(0x3D00C, multiworld.goal_speed[player]) for level in shuffled_levels: diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index ad5d997ddbce..6efa383f5e76 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -1,6 +1,7 @@ from worlds.generic.Rules import set_rule, add_rule from .Locations import location_table, level_consumables from .Names import LocationName +from .Items import copy_ability_table import typing if typing.TYPE_CHECKING: @@ -154,7 +155,7 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.iceberg_shiro, world.player), lambda state: state.has("Nago", world.player) and can_reach_nago(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_angel, world.player), - lambda state: state.has_all(world.item_name_groups["Copy Ability"], world.player)) + lambda state: state.has_all([ability for ability in copy_ability_table.keys()], world.player)) # cleaner than writing out 8 ands # Consumables diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index a876d825c9db..1445bd9a6cad 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -41,7 +41,7 @@ class KDL3World(World): Join Kirby and his Animal Friends on an adventure to collect Heart Stars and drive Dark Matter away from Dream Land! """ - game: str = "Kirby's Dream Land 3" + game = "Kirby's Dream Land 3" option_definitions = kdl3_options item_name_to_id = {item: item_table[item].code for item in item_table} location_name_to_id = {location_table[location]: location for location in location_table} @@ -107,7 +107,7 @@ def create_items(self) -> None: filler_amount = math.floor(filler_items * (self.multiworld.filler_percentage[self.player] / 100.0)) trap_amount = math.floor(filler_amount * (self.multiworld.trap_percentage[self.player] / 100.0)) filler_amount -= trap_amount - nonrequired_heart_stars = filler_items - filler_amount - trap_amount + non_required_heart_stars = filler_items - filler_amount - trap_amount self.required_heart_stars[self.player] = required_heart_stars # handle boss requirements here requirements = [required_heart_stars] @@ -126,7 +126,7 @@ def create_items(self) -> None: for _ in range(filler_amount + (remaining_items - total_heart_stars))]) itempool.extend([self.create_item(self.get_trap_item_name()) for _ in range(trap_amount)]) - itempool.extend([self.create_item("Heart Star", True) for _ in range(nonrequired_heart_stars)]) + itempool.extend([self.create_item("Heart Star", True) for _ in range(non_required_heart_stars)]) self.multiworld.itempool += itempool set_rules = set_rules @@ -149,7 +149,7 @@ def generate_basic(self) -> None: self.boss_butch_bosses[self.player][i] = True def generate_output(self, output_directory: str): - rompath = "" + rom_path = "" try: world = self.multiworld player = self.player @@ -160,19 +160,19 @@ def generate_output(self, output_directory: str): self.player_levels[self.player], self.boss_butch_bosses[self.player]) - rompath = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") - rom.write_to_file(rompath) + rom_path = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") + rom.write_to_file(rom_path) self.rom_name = rom.name - patch = KDL3DeltaPatch(os.path.splitext(rompath)[0] + KDL3DeltaPatch.patch_file_ending, player=player, - player_name=world.player_name[player], patched_path=rompath) + patch = KDL3DeltaPatch(os.path.splitext(rom_path)[0] + KDL3DeltaPatch.patch_file_ending, player=player, + player_name=world.player_name[player], patched_path=rom_path) patch.write() except Exception: raise finally: self.rom_name_available_event.set() # make sure threading continues and errors are collected - if os.path.exists(rompath): - os.unlink(rompath) + if os.path.exists(rom_path): + os.unlink(rom_path) def modify_multidata(self, multidata: dict): # wait for self.rom_name to be available. From 08a02edad5f02eeacc2c97045c39840fd82be1ac Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 1 Jul 2023 02:28:29 -0500 Subject: [PATCH 066/165] consumable and heart star sprites --- worlds/kdl3/Rom.py | 99 +++++++++++++++++--------- worlds/kdl3/data/APConsumable.bsdiff4 | Bin 0 -> 572 bytes worlds/kdl3/data/APHeartStar.bsdiff4 | Bin 0 -> 603 bytes 3 files changed, 67 insertions(+), 32 deletions(-) create mode 100644 worlds/kdl3/data/APConsumable.bsdiff4 create mode 100644 worlds/kdl3/data/APHeartStar.bsdiff4 diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index b8c14e44aef6..9c7e35ee1085 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -1,4 +1,5 @@ import typing +from pkgutil import get_data import Utils from typing import Optional @@ -9,6 +10,7 @@ from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette, gooey_target_palettes, \ get_gooey_palette from .Compression import hal_decompress +import bsdiff4 KDL3UHASH = "201e7658f6194458a3869dde36bf8ec2" KDL3JHASH = "b2f2d004ea640c3db66df958fce122b2" @@ -108,6 +110,11 @@ ] } +heart_star_address = 0x2D0000 +heart_star_size = 456 +consumable_address = 0x2F91DD +consumable_size = 698 + stage_palettes = [0x60964, 0x60B64, 0x60D64, 0x60F64, 0x61164] music_choices = [ @@ -115,7 +122,6 @@ 3, # Boss 2 (Unused) 4, # Boss 3 (Miniboss) 7, # Dedede - 8, # Heart Star 9, # Event 2 (used once) 10, # Field 1 11, # Field 2 @@ -541,6 +547,33 @@ ] +class RomData: + def __init__(self, file, name=None): + self.file = bytearray() + self.read_from_file(file) + self.name = name + + def read_byte(self, offset): + return self.file[offset] + + def read_bytes(self, offset, length): + return self.file[offset:offset + length] + + def write_byte(self, offset, value): + self.file[offset] = value + + def write_bytes(self, offset, values): + self.file[offset:offset + len(values)] = values + + def write_to_file(self, file): + with open(file, 'wb') as outfile: + outfile.write(self.file) + + def read_from_file(self, file): + with open(file, 'rb') as stream: + self.file = bytearray(stream.read()) + + def handle_level_sprites(stages, sprites, palettes): palette_by_level = list() for palette in palettes: @@ -556,7 +589,7 @@ def handle_level_sprites(stages, sprites, palettes): tiles_by_level.extend([[tiles[x] for x in stage_tiles[stage]] for stage in stage_tiles]) for world in range(5): levels = [stages[world][x] - 1 for x in range(6)] - world_tiles = [typing.Optional[bytes] for _ in range(72)] + world_tiles: typing.List[typing.Optional[bytes]] = [None for _ in range(72)] for i in range(6): for x in range(12): world_tiles[stage_tiles[i][x]] = tiles_by_level[levels[i]][x] @@ -571,6 +604,28 @@ def handle_level_sprites(stages, sprites, palettes): return sprites, palettes +def write_heart_star_sprites(rom: RomData): + compressed = rom.read_bytes(heart_star_address, heart_star_size) + decompressed = hal_decompress(compressed) + patch = get_data(__name__, os.path.join(os.path.dirname(__file__), "data", "APHeartStar.bsdiff4")) + patched = bytearray(bsdiff4.patch(decompressed, patch)) + patched[0:0] = [0xE3, 0xFF] + patched.append(0xFF) + rom.write_bytes(0x1CD000, patched) + rom.write_bytes(0x3F0EBF, [0x00, 0xD0, 0x39]) + + +def write_consumable_sprites(rom: RomData): + compressed = rom.read_bytes(consumable_address, consumable_size) + decompressed = hal_decompress(compressed) + patch = get_data(__name__, os.path.join(os.path.dirname(__file__), "data", "APConsumable.bsdiff4")) + patched = bytearray(bsdiff4.patch(decompressed, patch)) + patched[0:0] = [0xE3, 0xFF] + patched.append(0xFF) + rom.write_bytes(0x1CD500, patched) + rom.write_bytes(0x3F0DAE, [0x00, 0xD5, 0x39]) + + class KDL3DeltaPatch(APDeltaPatch): hash = [KDL3UHASH, KDL3JHASH] game = "Kirby's Dream Land 3" @@ -583,6 +638,7 @@ def get_source_data(cls) -> bytes: def patch(self, target: str): super().patch(target) rom = RomData(target) + write_heart_star_sprites(rom) if rom.read_bytes(0x3D014, 1)[0] > 0: stages = [struct.unpack("HHHHHHH", rom.read_bytes(0x3D020 + x * 14, 14)) for x in range(5)] palettes = [rom.read_bytes(full_pal, 512) for full_pal in stage_palettes] @@ -595,34 +651,9 @@ def patch(self, target: str): rom.write_bytes(addr, level_sprite) rom.write_bytes(0x460A, [0x00, 0xA0, 0x39, 0x20, 0xA9, 0x39, 0x30, 0xB2, 0x39, 0x40, 0xBB, 0x39, 0x50, 0xC4, 0x39]) - rom.write_to_file(target) - - -class RomData: - def __init__(self, file, name=None): - self.file = bytearray() - self.read_from_file(file) - self.name = name - - def read_byte(self, offset): - return self.file[offset] - - def read_bytes(self, offset, length): - return self.file[offset:offset + length] - - def write_byte(self, offset, value): - self.file[offset] = value - - def write_bytes(self, offset, values): - self.file[offset:offset + len(values)] = values - - def write_to_file(self, file): - with open(file, 'wb') as outfile: - outfile.write(self.file) - - def read_from_file(self, file): - with open(file, 'rb') as stream: - self.file = bytearray(stream.read()) + if rom.read_bytes(0x3D018, 1)[0] > 0: + write_consumable_sprites(rom) + rom.write_to_file(target) def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, shuffled_levels, bb_boss_enabled): @@ -851,7 +882,10 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, shuffled_music = music_choices.copy() multiworld.per_slot_randoms[player].shuffle(shuffled_music) music_map = dict(zip(music_choices, shuffled_music)) + # Avoid putting star twinkle in the pool music_map[5] = multiworld.per_slot_randoms[player].choice(music_choices) + # Heart Star music doesn't work on regular stages + music_map[8] = multiworld.per_slot_randoms[player].choice(music_choices) for room in room_pointers: old_music = rom.read_byte(room + 2) rom.write_byte(room + 2, music_map[old_music]) @@ -879,12 +913,13 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # boss requirements rom.write_bytes(0x3D000, struct.pack("HHHHH", boss_requirements[0], boss_requirements[1], boss_requirements[2], boss_requirements[3], boss_requirements[4])) + rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal_speed[player] == 1 else 0xFFFF)) + rom.write_byte(0x3D00C, multiworld.goal_speed[player]) rom.write_byte(0x3D010, multiworld.death_link[player]) rom.write_byte(0x3D012, multiworld.goal[player]) rom.write_byte(0x3D014, multiworld.stage_shuffle[player]) rom.write_byte(0x3D016, multiworld.ow_boss_requirement[player]) - rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal_speed[player] == 1 else 0xFFFF)) - rom.write_byte(0x3D00C, multiworld.goal_speed[player]) + rom.write_byte(0x3D018, multiworld.consumables[player]) for level in shuffled_levels: for i in range(len(shuffled_levels[level])): diff --git a/worlds/kdl3/data/APConsumable.bsdiff4 b/worlds/kdl3/data/APConsumable.bsdiff4 new file mode 100644 index 0000000000000000000000000000000000000000..83c6b920ae983decb26a4d2d80af10d83ebc0451 GIT binary patch literal 572 zcmZdtA8e!{Fv?XzR?-%*Zp#psjbIiBYclD~>Y@Y<*Y*mo-(n zu^d~zI{u z5Mq*xwxje3$#|Q$z2sC_`JbUV*2Al3_A)I{n@kDutoWBv*<^KlL@De z>Q|fjF#9E)xcL2L9=mmrZTqds0SYz^_AlqXkh~T-`|Ao0`)k@#6Mj73T;eMfa&Fpo z7FC^dPT!yIa&uM}F}h$}%)Yc``@*SH{I5COVQkPWW^LEru#fRekGlXT+qSZRPp9v$ zjSOF`a>8)Zzf;T;nal(mPjS8!$i33*`tiR0kKL0r54E(d5jgk&6upqh2Bi)F;6&#I literal 0 HcmV?d00001 diff --git a/worlds/kdl3/data/APHeartStar.bsdiff4 b/worlds/kdl3/data/APHeartStar.bsdiff4 new file mode 100644 index 0000000000000000000000000000000000000000..e442604f26009c5981c79d4cdd497dee2d6003d0 GIT binary patch literal 603 zcmZmL5CI1U0R{yIMUBiC z25e<~?OS3`iad03%==um2cdjcgFy)c1JD2e|38PMUJFSGzq`PJ-M@i>?a{`o0eKGs z6zhLDupg_?&fmaTu_EBAf0n8LMgL&6Hn(0WBMIkADVYlx7cMZ$oM6Ii()eU{@TrUf z23{b{U|_h|!5{^4oD_qpky^`9<6viJw^__rG8mYB86>5oB-t7m8041btnpzjI+V36 z`QfR!Q(K-FYCNjmGuLYoyW@gR#vjLpd9SKYW0>VQw{6lzjiwXfZx2jinV>YuL-OhE zssbTZi)>Y!q?IfJ#)5Jdj*_klMQ4u84mr(lCM0%8Gd0LIbjjvFON)E7JU|aRq zT`;8PkCn>gBr(yPBW4R7_W$LO_|hBZlIi`^OlnqqSyI|VuhK(FoeD;=Of4Vpd{S5= zt;^P7u=r=6km{ABTJcNDahEQwwEh*cG^NAf@T;1u&Kea9cv?@ydPQ2UsTF2s*_j;})-8WayNt+3cvE{&ktw!P|w` zOm1&=;ykp)OZet8$)s6%YBTT5xhh@Q^n~9bvf%K;*mqm^m2gO`l5=zw{69k^D<;mT eBv$yotM?yp>^o&K9J~OEeeoh!i+~BB_yGVyZ1K|o literal 0 HcmV?d00001 From f220157de3384296874fee98cd8bea692ad3f3be Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 1 Jul 2023 03:39:02 -0500 Subject: [PATCH 067/165] fix patch issue and added to launchercomponents --- worlds/LauncherComponents.py | 2 +- worlds/kdl3/Rom.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index aeb55cf9303f..d138a53da209 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -88,7 +88,7 @@ def launch_textclient(): # SNI Component('SNI Client', 'SNIClient', file_identifier=SuffixIdentifier('.apz3', '.apm3', '.apsoe', '.aplttp', '.apsm', '.apsmz3', '.apdkc3', - '.apsmw', '.apl2ac')), + '.apsmw', '.apl2ac', '.apkdl3')), Component('Links Awakening DX Client', 'LinksAwakeningClient', file_identifier=SuffixIdentifier('.apladx')), Component('LttP Adjuster', 'LttPAdjuster'), diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 9c7e35ee1085..e392ce284b9e 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -607,7 +607,7 @@ def handle_level_sprites(stages, sprites, palettes): def write_heart_star_sprites(rom: RomData): compressed = rom.read_bytes(heart_star_address, heart_star_size) decompressed = hal_decompress(compressed) - patch = get_data(__name__, os.path.join(os.path.dirname(__file__), "data", "APHeartStar.bsdiff4")) + patch = get_data(__name__, os.path.join("data", "APHeartStar.bsdiff4")) patched = bytearray(bsdiff4.patch(decompressed, patch)) patched[0:0] = [0xE3, 0xFF] patched.append(0xFF) @@ -618,7 +618,7 @@ def write_heart_star_sprites(rom: RomData): def write_consumable_sprites(rom: RomData): compressed = rom.read_bytes(consumable_address, consumable_size) decompressed = hal_decompress(compressed) - patch = get_data(__name__, os.path.join(os.path.dirname(__file__), "data", "APConsumable.bsdiff4")) + patch = get_data(__name__, os.path.join("data", "APConsumable.bsdiff4")) patched = bytearray(bsdiff4.patch(decompressed, patch)) patched[0:0] = [0xE3, 0xFF] patched.append(0xFF) From db2a8760142404bc1c9e76da06362144770c910b Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 3 Jul 2023 01:12:31 -0500 Subject: [PATCH 068/165] inno setup --- host.yaml | 2 +- inno_setup.iss | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/host.yaml b/host.yaml index 1f513b7cc1fc..527848b6da7e 100644 --- a/host.yaml +++ b/host.yaml @@ -190,5 +190,5 @@ adventure_options: display_msgs: true kdl3_options: # File name of the KDL3 US rom - rom_file: "Kirby's Dream Land 3 (USA).sfc" + rom_file: "Kirby's Dream Land 3.sfc" \ No newline at end of file diff --git a/inno_setup.iss b/inno_setup.iss index 5e289187ffd2..2dcdb2605eaa 100644 --- a/inno_setup.iss +++ b/inno_setup.iss @@ -58,6 +58,7 @@ Name: "generator/dkc3"; Description: "Donkey Kong Country 3 ROM Setup"; Types: Name: "generator/smw"; Description: "Super Mario World ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning Name: "generator/soe"; Description: "Secret of Evermore ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning Name: "generator/l2ac"; Description: "Lufia II Ancient Cave ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 2621440; Flags: disablenouninstallwarning +Name: "generator/kdl3"; Description: "Kirby's Dream Land 3 ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 4194304; Flags: disablenouninstallwarning Name: "generator/lttp"; Description: "A Link to the Past ROM Setup and Enemizer"; Types: full hosting; ExtraDiskSpaceRequired: 5191680 Name: "generator/oot"; Description: "Ocarina of Time ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 100663296; Flags: disablenouninstallwarning Name: "generator/zl"; Description: "Zillion ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 150000; Flags: disablenouninstallwarning @@ -74,6 +75,7 @@ Name: "client/sni/sm"; Description: "SNI Client - Super Metroid Patch Setup"; Name: "client/sni/dkc3"; Description: "SNI Client - Donkey Kong Country 3 Patch Setup"; Types: full playing; Flags: disablenouninstallwarning Name: "client/sni/smw"; Description: "SNI Client - Super Mario World Patch Setup"; Types: full playing; Flags: disablenouninstallwarning Name: "client/sni/l2ac"; Description: "SNI Client - Lufia II Ancient Cave Patch Setup"; Types: full playing; Flags: disablenouninstallwarning +Name: "client/sni/kdl3"; Description: "SNI Client - Kirby's Dream Land 3 Setup"; Types: full playing; Flags: disablenouninstallwarning Name: "client/factorio"; Description: "Factorio"; Types: full playing Name: "client/kh2"; Description: "Kingdom Hearts 2"; Types: full playing Name: "client/minecraft"; Description: "Minecraft"; Types: full playing; ExtraDiskSpaceRequired: 226894278 @@ -111,6 +113,7 @@ Source: "{code:GetBN3ROMPath}"; DestDir: "{app}"; DestName: "Mega Man Battle Net Source: "{code:GetLADXROMPath}"; DestDir: "{app}"; DestName: "Legend of Zelda, The - Link's Awakening DX (USA, Europe) (SGB Enhanced).gbc"; Flags: external; Components: client/ladx or generator/ladx Source: "{code:GetTLoZROMPath}"; DestDir: "{app}"; DestName: "Legend of Zelda, The (U) (PRG0) [!].nes"; Flags: external; Components: client/tloz or generator/tloz Source: "{code:GetAdvnROMPath}"; DestDir: "{app}"; DestName: "ADVNTURE.BIN"; Flags: external; Components: client/advn +Source: "{code:GetKDL3ROMPath}"; DestDir: "{app}"; DestName: "Kirby's Dream Land 3.sfc"; Flags: external; Components: generator/kdl3 or client/sni/kdl3 Source: "{#source_path}\*"; Excludes: "*.sfc, *.log, data\sprites\alttpr, SNI, EnemizerCLI, Archipelago*.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#source_path}\SNI\*"; Excludes: "*.sfc, *.log"; DestDir: "{app}\SNI"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: client/sni Source: "{#source_path}\EnemizerCLI\*"; Excludes: "*.sfc, *.log"; DestDir: "{app}\EnemizerCLI"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: generator/lttp @@ -235,6 +238,11 @@ Root: HKCR; Subkey: "{#MyAppName}l2acpatch"; ValueData: "Arc Root: HKCR; Subkey: "{#MyAppName}l2acpatch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: ""; Components: client/sni Root: HKCR; Subkey: "{#MyAppName}l2acpatch\shell\open\command"; ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1"""; ValueType: string; ValueName: ""; Components: client/sni +Root: HKCR; Subkey: ".apkdl3"; ValueData: "{#MyAppName}kdl3patch"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Components: client/sni +Root: HKCR; Subkey: "{#MyAppName}kdl3patch"; ValueData: "Archipelago Kirby's Dream Land 3 Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Components: client/sni +Root: HKCR; Subkey: "{#MyAppName}kdl3patch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: ""; Components: client/sni +Root: HKCR; Subkey: "{#MyAppName}kdl3patch\shell\open\command"; ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1"""; ValueType: string; ValueName: ""; Components: client/sni + Root: HKCR; Subkey: ".apmc"; ValueData: "{#MyAppName}mcdata"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Components: client/minecraft Root: HKCR; Subkey: "{#MyAppName}mcdata"; ValueData: "Archipelago Minecraft Data"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Components: client/minecraft Root: HKCR; Subkey: "{#MyAppName}mcdata\DefaultIcon"; ValueData: "{app}\ArchipelagoMinecraftClient.exe,0"; ValueType: string; ValueName: ""; Components: client/minecraft @@ -330,6 +338,9 @@ var SoERomFilePage: TInputFileWizardPage; var l2acrom: string; var L2ACROMFilePage: TInputFileWizardPage; +var kdl3rom: string; +var KDL3ROMFilePage: TInputFileWizardPage; + var ootrom: string; var OoTROMFilePage: TInputFileWizardPage; @@ -433,6 +444,26 @@ begin end; end; +function CheckKDL3Rom(name: string): string; +var rom: string; +begin + log('Handling ' + name) + rom := FileSearch(name, WizardDirValue()); + if Length(rom) > 0 then + begin + log('existing ROM found'); + log(IntToStr(CompareStr(GetSNESMD5OfFile(rom), '201e7658f6194458a3869dde36bf8ec2'))); + log(IntToStr(CompareStr(GetSNESMD5OfFile(rom), 'b2f2d004ea640c3db66df958fce122b2'))); + if CompareStr(GetSNESMD5OfFile(rom), '201e7658f6194458a3869dde36bf8ec2') * CompareStr(GetSNESMD5OfFile(rom), 'b2f2d004ea640c3db66df958fce122b2') = 0 then + begin + log('existing ROM verified'); + Result := rom; + exit; + end; + log('existing ROM failed verification'); + end; +end; + function AddRomPage(name: string): TInputFileWizardPage; begin Result := @@ -566,6 +597,8 @@ begin Result := not (SoEROMFilePage.Values[0] = '') else if (assigned(L2ACROMFilePage)) and (CurPageID = L2ACROMFilePage.ID) then Result := not (L2ACROMFilePage.Values[0] = '') + else if (assigned(KDL3ROMFilePage)) and (CurPageID = KDL3ROMFilePage.ID) then + Result := not (KDL3ROMFilePage.Values[0] = '') else if (assigned(OoTROMFilePage)) and (CurPageID = OoTROMFilePage.ID) then Result := not (OoTROMFilePage.Values[0] = '') else if (assigned(BN3ROMFilePage)) and (CurPageID = BN3ROMFilePage.ID) then @@ -810,6 +843,22 @@ begin Result := ''; end; +function GetKDL3ROMPath(Param: string): string; +begin + if Length(kdl3rom) > 0 then + Result := kdl3rom + else if Assigned(KDL3ROMFilePage) then + begin + R := CompareStr(GetMD5OfFile(KDL3ROMFilePage.Values[0]), '201e7658f6194458a3869dde36bf8ec2') * CompareStr(GetMD5OfFile(KDL3ROMFilePage.Values[0]), 'b2f2d004ea640c3db66df958fce122b2'); + if R <> 0 then + MsgBox('Kirby''s Dream Land 3 ROM validation failed. Very likely wrong file.', mbInformation, MB_OK); + + Result := KDL3ROMFilePage.Values[0] + end + else + Result := ''; +end; + procedure InitializeWizard(); begin AddOoTRomPage(); @@ -865,6 +914,10 @@ begin advnrom := CheckSMSRom('ADVNTURE.BIN', '157bddb7192754a45372be196797f284'); if Length(advnrom) = 0 then AdvnROMFilePage:= AddA26Page('ADVNTURE.BIN'); + + kdl3rom := CheckKDL3Rom('Kirby''s Dream Land 3.sfc'); + if Length(kdl3rom) = 0 then + KDL3ROMFilePage:= AddRomPage('Kirby''s Dream Land 3.sfc'); end; @@ -883,6 +936,8 @@ begin Result := not (WizardIsComponentSelected('client/sni/l2ac') or WizardIsComponentSelected('generator/l2ac')); if (assigned(SoEROMFilePage)) and (PageID = SoEROMFilePage.ID) then Result := not (WizardIsComponentSelected('generator/soe')); + if (assigned(KDL3ROMFilePage)) and (PageID = KDL3ROMFilePage.ID) then + Result := not (WizardIsComponentSelected('client/sni/kdl3') or WizardIsComponentSelected('generator/kdl3')); if (assigned(OoTROMFilePage)) and (PageID = OoTROMFilePage.ID) then Result := not (WizardIsComponentSelected('generator/oot') or WizardIsComponentSelected('client/oot')); if (assigned(ZlROMFilePage)) and (PageID = ZlROMFilePage.ID) then From 6878acfd96ee9a141f8a139d1d3877bc3623b7ac Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 3 Jul 2023 17:06:02 -0500 Subject: [PATCH 069/165] swap inno to use snesmd5 function --- inno_setup.iss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inno_setup.iss b/inno_setup.iss index 2dcdb2605eaa..40d69ac61b26 100644 --- a/inno_setup.iss +++ b/inno_setup.iss @@ -849,7 +849,7 @@ begin Result := kdl3rom else if Assigned(KDL3ROMFilePage) then begin - R := CompareStr(GetMD5OfFile(KDL3ROMFilePage.Values[0]), '201e7658f6194458a3869dde36bf8ec2') * CompareStr(GetMD5OfFile(KDL3ROMFilePage.Values[0]), 'b2f2d004ea640c3db66df958fce122b2'); + R := CompareStr(GetSNESMD5OfFile(KDL3ROMFilePage.Values[0]), '201e7658f6194458a3869dde36bf8ec2') * CompareStr(GetSNESMD5OfFile(KDL3ROMFilePage.Values[0]), 'b2f2d004ea640c3db66df958fce122b2'); if R <> 0 then MsgBox('Kirby''s Dream Land 3 ROM validation failed. Very likely wrong file.', mbInformation, MB_OK); From a0c6a4ea8ecf9c0cb97093759d444868a59ee95f Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 3 Jul 2023 17:33:26 -0500 Subject: [PATCH 070/165] fix utils, fix incorrect plando boss list --- Utils.py | 2 +- worlds/kdl3/Regions.py | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Utils.py b/Utils.py index ffa5640ed539..e5fd384fcf30 100644 --- a/Utils.py +++ b/Utils.py @@ -350,7 +350,7 @@ def get_default_options() -> OptionsType: "rom_args": "" }, "kdl3_options":{ - "rom_file": "Kirby's Dream Land 3 (USA).sfc" + "rom_file": "Kirby's Dream Land 3.sfc" } } return options diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index df7e8200b8da..5d83c9c3c83d 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -89,13 +89,13 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo loc = loc.title() boss = boss.title() levels[LocationName.level_names[loc]][6] = LocationName.boss_names[boss] - plando_bosses.append(boss) + plando_bosses.append(LocationName.boss_names[boss]) else: option = option.title() for level in levels: if levels[level][6] is None: levels[level][6] = LocationName.boss_names[option] - plando_bosses.append(option) + plando_bosses.append(LocationName.boss_names[option]) if boss_shuffle > 0: if boss_shuffle == 2: @@ -117,6 +117,10 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo if levels[level][6] is None: levels[level][6] = default_levels[level][6] + for level in levels: + for stage in range(7): + assert levels[level][stage] is not None, "Level tried to be sent with a None stage, incorrect plando?" + return levels From 7a4b4013678233042bd68d03bd18c54fb373e40d Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 3 Jul 2023 17:49:32 -0500 Subject: [PATCH 071/165] cleanup zip function, pep8 --- worlds/kdl3/Regions.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 5d83c9c3c83d..94cac71563b1 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -171,14 +171,11 @@ def create_levels(world: World) -> None: world.multiworld.consumables[world.player]), KDL3Location) - for boss_flag, purification, idx, level in zip(["Level 1 Boss", "Level 2 Boss", - "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], - [LocationName.grass_land_whispy, LocationName.ripple_field_acro, - LocationName.sand_canyon_poncon, LocationName.cloudy_park_ado, - LocationName.iceberg_dedede], - [0x770200, 0x770201, 0x770202, 0x770203, 0x770204], - [level1, level2, level3, level4, level5]): - level.add_locations({boss_flag: None, purification: idx, }, KDL3Location) + for boss_flag, idx, level in zip(["Level 1 Boss", "Level 2 Boss", + "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], + [0x770200, 0x770201, 0x770202, 0x770203, 0x770204], + [level1, level2, level3, level4, level5]): + level.add_locations({boss_flag: None, location_table[idx]: idx, }, KDL3Location) level6.add_locations({LocationName.goals[world.multiworld.goal[world.player]]: None}, KDL3Location) From 6cdc32f444c49168ffb1e0e14dc228d660eae102 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 3 Jul 2023 18:11:32 -0500 Subject: [PATCH 072/165] open world fixes and optimization --- worlds/kdl3/Rules.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 6efa383f5e76..d566b86a1ca5 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -65,10 +65,11 @@ def can_reach_nago(state: "CollectionState", player: int) -> bool: def set_rules(world: "KDL3World") -> None: - for level in range(1, len(world.player_levels[world.player]) + 1): - for stage in range(len(world.player_levels[world.player][level])): - if stage != 6: - if not world.multiworld.open_world[world.player]: + if not world.multiworld.open_world[world.player]: + for level in range(1, len(world.player_levels[world.player]) + 1): + for stage in range(len(world.player_levels[world.player][level])): + if stage != 6: + # Cannot complete stage if we cannot complete the stage before it set_rule( world.multiworld.get_location(location_table[world.player_levels[world.player][level][stage]], world.player), @@ -76,6 +77,7 @@ def set_rules(world: "KDL3World") -> None: else state.can_reach( location_table[world.player_levels[world.player][level][stage - 1]], "Location", world.player)) + # Cannot complete stage's heart star if we cannot complete the stage before it set_rule( world.multiworld.get_location( location_table[world.player_levels[world.player][level][stage] + 0x100], world.player), @@ -205,14 +207,16 @@ def set_rules(world: "KDL3World") -> None: range(1, 6)): set_rule(world.multiworld.get_location(boss_flag, world.player), lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[world.player][i - 1]) - and state.can_reach(location_table[world.player_levels[world.player][i][5]], - "Location", - world.player)) + and (True if world.multiworld.open_world[world.player] else + state.can_reach(location_table[world.player_levels[world.player][i][5]], + "Location", + world.player))) set_rule(world.multiworld.get_location(purification, world.player), lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[world.player][i - 1]) - and state.can_reach(location_table[world.player_levels[world.player][i][5]], - "Location", - world.player)) + and (True if world.multiworld.open_world[world.player] else + state.can_reach(location_table[world.player_levels[world.player][i][5]], + "Location", + world.player))) if world.multiworld.strict_bosses[world.player]: for level in range(2, 6): From 939eedf565f0d7974b9a035b8101402edfff82e1 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 3 Jul 2023 19:42:20 -0500 Subject: [PATCH 073/165] Add KDL3 to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ac14c4b818cd..7ff57159667a 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ Currently, the following games are supported: * Mega Man Battle Network 3: Blue Version * Muse Dash * DOOM 1993 +* Kirby's Dream Land 3 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 From cc8bc583474d97fb818ce6dd1058da65419f9013 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 4 Jul 2023 03:37:25 -0500 Subject: [PATCH 074/165] fix rare hs 1-up glitch, jp-en compat --- worlds/kdl3/Rom.py | 173 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 145 insertions(+), 28 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index e392ce284b9e..d929d0478f4a 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -661,14 +661,37 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x7FD8, 0x06) # hook BWRAM initialization for initializing our new BWRAM - rom.write_bytes(0x33, [0x22, 0x00, 0x9E, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) + rom.write_bytes(0x33, [0x22, 0x00, 0x9E, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # JSL $079E00, NOP the rest # Initialize BWRAM with ROM parameters - rom.write_bytes(0x39E00, [0xA0, 0x01, 0x60, 0xA9, 0xFE, 0x1F, 0x54, 0x40, 0x40, 0xA2, 0x00, 0x00, 0xA0, 0x14, 0x00, - 0xBD, 0x00, 0x81, 0xDF, 0xC0, 0xFF, 0x00, 0xD0, 0x06, 0xE8, 0x88, 0x30, 0x2C, 0x80, 0xF1, - 0xA9, 0x00, 0x00, 0x8D, 0x00, 0x80, 0xA2, 0x00, 0x80, 0xA0, 0x01, 0x80, 0xA9, 0xFD, 0x7F, - 0x54, 0x40, 0x40, 0xA2, 0x00, 0xD0, 0xA0, 0x00, 0x90, 0xA9, 0x00, 0x10, 0x54, 0x40, 0x07, - 0xA2, 0xC0, 0xFF, 0xA0, 0x00, 0x81, 0xA9, 0x15, 0x00, 0x54, 0x40, 0x00, 0x6B, ]) + rom.write_bytes(0x39E00, [0xA0, 0x01, 0x60, # LDA #$6001 starting addr + 0xA9, 0xFE, 0x1F, # LDY #$1FFE bytes to write + 0x54, 0x40, 0x40, # MVN $40, $40 copy $406000 from 406001 to 407FFE + 0xA2, 0x00, 0x00, # LDX #$0000 + 0xA0, 0x14, 0x00, # LDY #$0014 + 0xBD, 0x00, 0x81, # LDA $8100, X - rom header + 0xDF, 0x00, 0xC0, 0x07, # CMP $07C000, X - compare to real rom name + 0xD0, 0x06, # BNE $079E1E - area is uninitialized or corrupt, reset + 0xE8, # INX + 0x88, # DEY + 0x30, 0x2C, # BMI $079E48 - if Y is negative, rom header matches, valid bwram + 0x80, 0xF1, # BRA $079E0F - else continue loop + 0xA9, 0x00, 0x00, # LDA #$0000 + 0x8D, 0x00, 0x80, # STA $8000 - initialize first byte that gets copied + 0xA2, 0x00, 0x80, # LDX #$8000 + 0xA0, 0x01, 0x80, # LDY #$8001 + 0xA9, 0xFD, 0x7F, # LDA #$7FFD + 0x54, 0x40, 0x40, # MVN $40, $40 - initialize 0x8000 onward + 0xA2, 0x00, 0xD0, # LDX #$D000 - seed info 0x3D000 + 0xA0, 0x00, 0x90, # LDY #$9000 - target location + 0xA9, 0x00, 0x10, # LDA #$1000 + 0x54, 0x40, 0x07, # MVN $07, $40 + 0xA2, 0x00, 0xC0, # LDX #$C000 - ROM name + 0xA0, 0x00, 0x81, # LDY #$8100 - target + 0xA9, 0x15, 0x00, # LDA #$0015 + 0x54, 0x40, 0x07, # MVN $07, $40 + 0x6B, # RTL + ]) # Copy Ability rom.write_bytes(0x399A0, [0xB9, 0xF3, 0x54, # LDA $54F3 @@ -697,48 +720,142 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, ]) # Kirby/Gooey Copy Ability - rom.write_bytes(0x30518, [0x22, 0xA0, 0x99, 0x07, 0xEA, 0xEA, ]) + rom.write_bytes(0x30518, [0x22, 0xA0, 0x99, 0x07, 0xEA, 0xEA, ]) # JSL $0799A0 # Animal Copy Ability - rom.write_bytes(0x507E8, [0x22, 0xB9, 0x99, 0x07, 0xEA, 0xEA, ]) + rom.write_bytes(0x507E8, [0x22, 0xB9, 0x99, 0x07, 0xEA, 0xEA, ]) # JSL $0799B0 # Entity Spawn - rom.write_bytes(0x21CD7, [0x22, 0x00, 0x9D, 0x07, ]) + rom.write_bytes(0x21CD7, [0x22, 0x00, 0x9D, 0x07, ]) # JSL $079D00 # Check Spawn Animal - rom.write_bytes(0x39D00, [0x48, 0xE0, 0x02, 0x00, 0xD0, 0x0C, 0xEB, 0x48, 0x0A, 0xA8, 0x68, 0x1A, 0xD9, 0x00, 0x80, - 0xF0, 0x01, 0xE8, 0x7A, 0xA9, 0x99, 0x99, 0x6B, ]) + rom.write_bytes(0x39D00, [0x48, # PHA + 0xE0, 0x02, 0x00, # CPX #$0002 - is this an animal friend? + 0xD0, 0x0C, # BNE $079D12 + 0xEB, # XBA + 0x48, # PHA + 0x0A, # ASL + 0xA8, # TAY + 0x68, # PLA + 0x1A, # INC + 0xD9, 0x00, 0x80, # CMP $8000, Y - do we have this animal friend + 0xF0, 0x01, # BEQ $079D12 - we have this animal friend + 0xE8, # INX + 0x7A, # PLY + 0xA9, 0x99, 0x99, # LDA #$9999 + 0x6B, # RTL + ]) # Allow Purification - rom.write_bytes(0xAFC8, [0x22, 0x00, 0x9A, 0x07, + rom.write_bytes(0xAFC8, [0x22, 0x00, 0x9A, 0x07, # JSL $079A00 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # Check Purification and Enable Sub-games - rom.write_bytes(0x39A00, [0x8A, 0xC9, 0x00, 0x00, 0xF0, 0x03, 0x4A, 0x4A, 0x1A, 0xAA, 0xAD, 0x70, 0x80, 0x18, 0xCF, - 0x0A, 0xD0, 0x07, 0x90, 0x28, 0xDA, 0xA9, 0x14, 0x00, 0x8D, 0x62, 0x7F, 0xAF, 0x12, 0xD0, - 0x07, 0xC9, 0x00, 0x00, 0xF0, 0x11, 0xA9, 0x01, 0x00, 0xAE, 0x17, 0x36, 0x9D, 0xDD, 0x53, - 0x9D, 0xDF, 0x53, 0x9D, 0xE1, 0x53, 0x80, 0x06, 0xA9, 0x01, 0x00, 0x8D, 0xA0, 0x80, 0xFA, - 0xAD, 0x70, 0x80, 0xDF, 0x00, 0xD0, 0x07, 0xB0, 0x02, 0x18, 0x6B, 0x38, 0x6B, ]) + rom.write_bytes(0x39A00, [0x8A, # TXA + 0xC9, 0x00, 0x00, # CMP #$0000 - is this level 1 + 0xF0, 0x03, # BEQ $079A09 + 0x4A, # LSR + 0x4A, # LSR + 0x1A, # INC + 0xAA, # TAX + 0xAD, 0x70, 0x80, # LDA $8070 - heart stars + 0x18, # CLC + 0xCF, 0x0A, 0xD0, 0x07, # Compare to goal heart stars + 0x90, 0x28, # BCC $079A3C - we don't have enough + 0xDA, # PHX + 0xA9, 0x14, 0x00, # LDA #$0014 + 0x8D, 0x62, 0x7F, # STA #$7F62 - play sound fx 0x14 + 0xAF, 0x12, 0xD0, 0x07, # LDA $07D012 - goal + 0xC9, 0x00, 0x00, # CMP #$0000 - are we on zero goal? + 0xF0, 0x11, # BEQ $079A35 - we are + 0xA9, 0x01, 0x00, # LDA #$0001 + 0xAE, 0x17, 0x36, # LDX $3617 - current save + 0x9D, 0xDD, 0x53, # STA $53DD - boss butch + 0x9D, 0xDF, 0x53, # STA $53DF - MG5 + 0x9D, 0xE1, 0x53, # STA $53E1 - Jumping + 0x80, 0x06, # BRA $079A3B + 0xA9, 0x01, 0x00, # LDA #$0001 + 0x8D, 0xA0, 0x80, # STA $80A0 - zero unlock address + 0xFA, # PLX + 0xAD, 0x70, 0x80, # LDA $8070 - current heart stars + 0xDF, 0x00, 0xD0, 0x07, # CMP $07D000, X - compare to world heart stars + 0xB0, 0x02, # BCS $079A47 + 0x18, # CLC + 0x6B, # RTL + 0x38, # SEC + 0x6B, # RTL + ]) # Check for Sound on Main Loop - rom.write_bytes(0x6AE4, [0x22, 0x00, 0x9B, 0x07, 0xEA]) + rom.write_bytes(0x6AE4, [0x22, 0x00, 0x9B, 0x07, 0xEA]) # JSL $079B00 # Play Sound Effect at given address and check/update traps - rom.write_bytes(0x39B00, [0x85, 0xD4, 0xEE, 0x24, 0x35, 0xEA, 0xAD, 0x62, 0x7F, 0xF0, 0x07, 0x22, 0x27, 0xD9, 0x00, - 0x9C, 0x62, 0x7F, 0xAD, 0xD0, 0x36, 0xC9, 0xFF, 0xFF, 0xF0, 0x34, 0xAD, 0xD3, 0x39, 0xD0, - 0x0F, 0xAD, 0x80, 0x80, 0xC9, 0x00, 0x00, 0xF0, 0x07, 0x22, 0x80, 0xA1, 0x07, 0x9C, 0x80, - 0x80, 0xAD, 0x82, 0x80, 0xF0, 0x04, 0x3A, 0x8D, 0x82, 0x80, 0xDA, 0x5A, 0xAD, 0xA9, 0x54, - 0xF0, 0x0E, 0xAD, 0x84, 0x80, 0xF0, 0x09, 0xA9, 0x00, 0x20, 0x8D, 0xC1, 0x60, 0x9C, 0x84, - 0x80, 0x7A, 0xFA, 0x6B, ]) + rom.write_bytes(0x39B00, [0x85, 0xD4, # STA $D4 + 0xEE, 0x24, 0x35, # INC $3524 + 0xEA, # NOP + 0xAD, 0x62, 0x7F, # LDA $7F62 - sfx to be played + 0xF0, 0x07, # BEQ $079B12 - skip if 0 + 0x22, 0x27, 0xD9, 0x00, # JSL $00D927 - play sfx + 0x9C, 0x62, 0x7F, # STZ $7F62 + 0xAD, 0xD0, 0x36, # LDA $36D0 + 0xC9, 0xFF, 0xFF, # CMP #$FFFF - are we in menus? + 0xF0, 0x34, # BEQ $079B4E - return if we are + 0xAD, 0xD3, 0x39, # LDA $39D3 - gooey hp + 0xD0, 0x0F, # BNE $079B2E - gooey is already spawned + 0xAD, 0x80, 0x80, # LDA $8080 + 0xC9, 0x00, 0x00, # CMP #$0000 - did we get a gooey trap + 0xF0, 0x07, # BEQ $079B2E - branch if we did not + 0x22, 0x80, 0xA1, 0x07, # JSL $07A180 - spawn gooey + 0x9C, 0x80, 0x80, # STZ $8080 + 0xAD, 0x82, 0x80, # LDA $8082 - slowness + 0xF0, 0x04, # BEQ $079B37 - are we under the effects of a slowness trap + 0x3A, # DEC + 0x8D, 0x82, 0x80, # STA $8082 - dec by 1 each frame + 0xDA, # PHX + 0x5A, # PHY + 0xAD, 0xA9, 0x54, # LDA $54A9 - copy ability + 0xF0, 0x0E, # BEQ $079B4C - branch if we do not have a copy ability + 0xAD, 0x84, 0x80, # LDA $8084 - eject ability + 0xF0, 0x09, # BEQ $079B4C - branch if we haven't received eject + 0xA9, 0x00, 0x20, # LDA #$2000 - select button press + 0x8D, 0xC1, 0x60, # STA $60C1 - write to controller mirror + 0x9C, 0x84, 0x80, # STZ $8084 + 0x7A, # PLY + 0xFA, # PLX + 0x6B, # RTL + ]) # Dedede - Remove bad ending rom.write_byte(0xB013, 0x38) # Change CLC to SEC # Heart Star Graphics Fix - rom.write_bytes(0x39B50, [0xDA, 0x5A, 0xAE, 0x3F, 0x36, 0xAC, 0x41, 0x36, 0xE0, 0x00, 0x00, 0xF0, 0x09, 0x1A, 0x1A, - 0x1A, 0x1A, 0x1A, 0x1A, 0xCA, 0x80, 0xF2, 0xC0, 0x00, 0x00, 0xF0, 0x04, 0x1A, 0x88, 0x80, - 0xF7, 0x0A, 0xAA, 0xBF, 0x80, 0xD0, 0x07, 0xC9, 0x03, 0x00, 0xF0, 0x03, 0x18, 0x80, 0x01, - 0x38, 0x7A, 0xFA, 0x6B, ]) + rom.write_bytes(0x39B50, [0xA9, 0x00, 0x00, # LDA #$0000 + 0xDA, # PHX + 0x5A, # PHY + 0xAE, 0x3F, 0x36, # LDX $363F - current level + 0xAC, 0x41, 0x36, # LDY $3641 - current stage + 0xE0, 0x00, 0x00, # CPX #$0000 + 0xF0, 0x09, # BEQ $079B69 + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, # INC x6 + 0xCA, # DEX + 0x80, 0xF2, # BRA $079B5B - return to loop head + 0xC0, 0x00, 0x00, # CPY #$0000 + 0xF0, 0x04, # BEQ $079B72 + 0x1A, # INC + 0x88, # DEY + 0x80, 0xF7, # BRA $079B69 - return to loop head + 0x0A, # ASL + 0xAA, # TAX + 0xBF, 0x80, 0xD0, 0x07, # LDA $079D080, X - table of original stage number + 0xC9, 0x03, 0x00, # CMP #$0003 - is the current stage a minigame stage? + 0xF0, 0x03, # BEQ $079B80 - branch if so + 0x18, # CLC + 0x80, 0x01, # BRA $079B81 + 0x38, # SEC + 0x7A, # PLY + 0xFA, # PLX + 0x6B, # RTL + ]) # Reroute Heart Star Graphic Check rom.write_bytes(0x4A01F, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0xB0, ]) # 1-Ups From f815f474c193a035c6fb84295eafd9800e5d1931 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 4 Jul 2023 12:41:08 -0500 Subject: [PATCH 075/165] JP-EN interaction fixes --- worlds/kdl3/Rom.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index d929d0478f4a..162504afa752 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -638,6 +638,8 @@ def get_source_data(cls) -> bytes: def patch(self, target: str): super().patch(target) rom = RomData(target) + target_language = rom.read_byte(0x3C020) + rom.write_byte(0x7FD9, target_language) write_heart_star_sprites(rom) if rom.read_bytes(0x3D014, 1)[0] > 0: stages = [struct.unpack("HHHHHHH", rom.read_bytes(0x3D020 + x * 14, 14)) for x in range(5)] @@ -1059,8 +1061,8 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, from Main import __version__ rom.name = bytearray(f'KDL3{__version__.replace(".", "")[0:3]}_{player}_{multiworld.seed:11}\0', 'utf8')[:21] rom.name.extend([0] * (21 - len(rom.name))) - rom.write_bytes(0x7FC0, rom.name) - rom.write_byte(0x7FD9, multiworld.game_language[player].value) + rom.write_bytes(0x3C000, rom.name) + rom.write_byte(0x3C020, multiworld.game_language[player].value) # handle palette if multiworld.kirby_flavor_preset[player] != 0: From 436def143d38d32cb9912fc5a125771363df95c0 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 5 Jul 2023 02:01:50 -0500 Subject: [PATCH 076/165] rom docs, block deathlink and checks in demo --- worlds/kdl3/Client.py | 5 +- worlds/kdl3/Rom.py | 487 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 429 insertions(+), 63 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 23faaae656e6..ee9f5fd2077d 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -19,7 +19,7 @@ KDL3_DEATH_LINK_ADDR = SRAM_1_START + 0x9010 KDL3_GOAL_ADDR = SRAM_1_START + 0x9012 KDL3_LEVEL_ADDR = SRAM_1_START + 0x9020 - +KDL3_IS_DEMO = SRAM_1_START + 0x5AD5 KDL3_GAME_STATE = SRAM_1_START + 0x36D0 KDL3_GAME_SAVE = SRAM_1_START + 0x3617 KDL3_LIFE_COUNT = SRAM_1_START + 0x39CF @@ -197,6 +197,9 @@ async def game_watcher(self, ctx) -> None: if halken != b"halken": return # can't check debug anymore, without going and copying the value. might be important later. + is_demo = await snes_read(ctx, KDL3_IS_DEMO, 1) # 1 - recording a demo, 2 - playing back recorded, 3+ is a demo + if is_demo[0] > 0x00: + return current_save = await snes_read(ctx, KDL3_GAME_SAVE, 1) goal = await snes_read(ctx, KDL3_GOAL_ADDR, 1) boss_butch_status = await snes_read(ctx, KDL3_BOSS_BUTCH_STATUS + (current_save[0] * 2), 1) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 162504afa752..0e8fe88690ce 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -866,26 +866,92 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # reroute 5-6 miniboss music override rom.write_bytes(0x93238, [0x22, 0x80, 0x9F, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xB0, ]) - rom.write_bytes(0x39F80, [0xEA, 0xDA, 0x5A, 0xA9, 0x00, 0x00, 0xAE, 0x3F, 0x36, 0xAC, 0x41, 0x36, 0xE0, 0x00, 0x00, - 0xF0, 0x0A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0xCA, 0x80, 0xF1, 0xC0, 0x00, 0x00, - 0xF0, 0x04, 0x1A, 0x88, 0x80, 0xF7, 0x0A, 0xAA, 0xBF, 0x20, 0xD0, 0x07, 0xC9, 0x1E, 0x00, - 0xF0, 0x03, 0x18, 0x80, 0x01, 0x38, 0x7A, 0xFA, 0x6B, 0xEA, ]) + rom.write_bytes(0x39F80, [0xEA, + 0xDA, # PHX + 0x5A, # PHY + 0xA9, 0x00, 0x00, # LDA #0000 + 0xAE, 0x3F, 0x36, # LDX $363F + 0xAC, 0x41, 0x36, # LDY $3641 + 0xE0, 0x00, 0x00, # CPX #$0000 + 0xF0, 0x0A, # BEQ $079F9B + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, # INC x6 + 0xCA, # DEX + 0x80, 0xF1, # BRA $079F8C - return to loop head + 0xC0, 0x00, 0x00, # CPY #$0000 + 0xF0, 0x04, # BEQ $079FA4 + 0x1A, # INC + 0x88, # DEY + 0x80, 0xF7, # BRA $079F9B - return to loop head + 0x0A, # ASL + 0xAA, # TAX + 0xBF, 0x20, 0xD0, 0x07, # LDA $07D020, X + 0xC9, 0x1E, 0x00, # CMP #$001E + 0xF0, 0x03, # BEQ $079FB2 + 0x18, # CLC + 0x80, 0x01, # BRA $079FB3 + 0x38, # SEC + 0x7A, # PLY + 0xFA, # PLX + 0x6B, # RTL + ]) # reroute zero eligibility - rom.write_bytes(0x137B1, [0xA0, 0x80, 0xC9, 0x01, ]) + rom.write_bytes(0x137B1, [0xA0, 0x80, 0xC9, 0x01, ]) # compare $80A0 to #$0001 for validating zero access # set goal on non-fast goal rom.write_bytes(0x14463, [0x22, 0x00, 0x9F, 0x07, 0xEA, 0xEA, ]) - rom.write_bytes(0x39F00, [0xDA, 0xAF, 0x12, 0xD0, 0x07, 0xC9, 0x00, 0x00, 0xF0, 0x11, 0xA9, 0x01, 0x00, 0xAE, 0x17, - 0x36, 0x9D, 0xDD, 0x53, 0x9D, 0xDF, 0x53, 0x9D, 0xD1, 0x53, 0x80, 0x06, 0xA9, 0x01, 0x00, - 0x8D, 0xA0, 0x80, 0xFA, 0xA9, 0x06, 0x00, 0x8D, 0xC1, 0x5A, 0x6B, ]) + rom.write_bytes(0x39F00, [0xDA, # PHX + 0xAF, 0x12, 0xD0, 0x07, # LDA $07D012 + 0xC9, 0x00, 0x00, # CMP #$0000 + 0xF0, 0x11, # BEQ $079F1B + 0xA9, 0x01, 0x00, # LDA #$0001 + 0xAE, 0x17, 0x36, # LDX $3617 - current save + 0x9D, 0xDD, 0x53, # STA $53DD, X - Boss butch + 0x9D, 0xDF, 0x53, # STA $53DF, X - MG5 + 0x9D, 0xD1, 0x53, # STA $53D1, X - Jumping + 0x80, 0x06, # BRA $079F21 + 0xA9, 0x01, 0x00, # LDA #$0001 + 0x8D, 0xA0, 0x80, # STA $80A0 + 0xFA, # PLX + 0xA9, 0x06, 0x00, # LDA #$0006 + 0x8D, 0xC1, 0x5A, # STA $5AC1 - cutscene + 0x6B, # RTL + ]) # set flag for completing a stage rom.write_bytes(0x1439D, [0x22, 0x80, 0xA0, 0x07, 0xEA, 0xEA, ]) - rom.write_bytes(0x3A080, [0xDA, 0xAD, 0xC1, 0x5A, 0xF0, 0x38, 0xA9, 0x00, 0x00, 0xAE, 0xCF, 0x53, 0xE0, 0x00, 0x00, - 0xF0, 0x0A, 0xCA, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x80, 0xF1, 0xAE, 0xD3, 0x53, - 0xE0, 0x07, 0x00, 0xF0, 0x1B, 0xCA, 0xE0, 0x00, 0x00, 0xF0, 0x04, 0x1A, 0xCA, 0x80, 0xF7, - 0x0A, 0xAA, 0xBD, 0x20, 0x90, 0x3A, 0x0A, 0xAA, 0xA9, 0x01, 0x00, 0x1D, 0x00, 0x82, 0x9D, - 0x00, 0x82, 0xFA, 0xAD, 0xCF, 0x53, 0xCD, 0xCB, 0x53, 0x6B, ]) + rom.write_bytes(0x3A080, [0xDA, # PHX + 0xAD, 0xC1, 0x5A, # LDA $5AC1 - completed stage cutscene + 0xF0, 0x38, # BEQ $07A0BE - we have not completed a stage + 0xA9, 0x00, 0x00, # LDA #$0000 + 0xAE, 0xCF, 0x53, # LDX $53CF - current level + 0xE0, 0x00, 0x00, # CPX #$0000 + 0xF0, 0x0A, # BEQ $07A09B + 0xCA, # DEX + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, # INC x6 + 0x80, 0xF1, # BRA $07A08C - return to loop head + 0xAE, 0xD3, 0x53, # LDX $53D3 - current stage + 0xE0, 0x07, 0x00, # CPX #$0007 - is this a boss stage + 0xF0, 0x1B, # BEQ $07A0BE - return if so + 0xCA, # DEX + 0xE0, 0x00, 0x00, # CPX #$0000 + 0xF0, 0x04, # BEQ $07A0AD + 0x1A, # INC + 0xCA, # DEX + 0x80, 0xF7, # BRA $07A0A4 - return to loop head + 0x0A, # ASL + 0xAA, # TAX + 0xBD, 0x20, 0x90, # LDA $9020, X - load the stage we completed + 0x3A, # DEC + 0x0A, # ASL + 0xAA, # TAX + 0xA9, 0x01, 0x00, # LDA #$0001 + 0x1D, 0x00, 0x82, # ORA $8200, X + 0x9D, 0x00, 0x82, # STA $8200, X + 0xFA, # PLX + 0xAD, 0xCF, 0x53, # LDA $53CF + 0xCD, 0xCB, 0x53, # CMP $53CB + 0x6B, # RTL + ]) # spawn Gooey for Gooey trap rom.write_bytes(0x3A180, [0x5A, 0xDA, 0xA2, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x8D, 0x43, 0x55, 0xB9, 0x22, 0x19, 0x85, @@ -894,47 +960,242 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0x9D, 0x22, 0x06, 0x22, 0xEF, 0xBA, 0x00, 0x22, 0x3C, 0x88, 0xC4, 0xAE, 0xD1, 0x39, 0xE0, 0x01, 0x00, 0xF0, 0x0D, 0xA9, 0xFF, 0xFF, 0xE0, 0x02, 0x00, 0xF0, 0x01, 0x3A, 0x22, 0x22, 0x3C, 0xC4, 0xFA, 0x7A, 0x6B, ]) + # this is mostly just a copy of the function to spawn gooey when you press the A button, could probably be simpler # limit player speed when speed trap enabled - rom.write_bytes(0x3A200, [0xDA, 0xAE, 0x82, 0x80, 0xF0, 0x01, 0x4A, - 0xFA, 0x99, 0x22, 0x1F, 0x49, 0xFF, 0xFF, 0x6B, ]) + rom.write_bytes(0x3A200, [0xDA, # PHX + 0xAE, 0x82, 0x80, # LDX $8082 - do we have slowness + 0xF0, 0x01, # BEQ $07A207 - branch if we do not + 0x4A, # LSR + 0xFA, # PLX + 0x99, 0x22, 0x1F, # STA $1F22, Y - player max speed + 0x49, 0xFF, 0xFF, # EOR #$FFFF + 0x6B, # RTL + ]) rom.write_bytes(0x785E, [0x22, 0x00, 0xA2, 0x07, 0xEA, 0xEA, ]) # write heart star count rom.write_bytes(0x2246, [0x0D, 0xDA, 0xBD, 0xA0, 0x6C, 0xAA, 0xBD, 0x22, 0x6E, 0x20, 0x5B, 0xA2, 0xFA, 0xE8, 0x22, - 0x80, 0xA2, 0x07, ]) + 0x80, 0xA2, 0x07, ]) # change upper branch to hit our JSL, then JSL rom.write_bytes(0x14317, [0x22, 0x00, 0xA3, 0x07, ]) - rom.write_bytes(0x3A280, [0xE0, 0x00, 0x00, 0xF0, 0x01, 0xE8, 0xEC, 0x1E, 0x65, 0x90, 0x66, 0xE0, 0x00, 0x00, 0xF0, - 0x61, 0xAF, 0xD0, 0x36, 0x40, 0x29, 0xFF, 0x00, 0xF0, 0x57, 0xAD, 0x00, 0x30, 0x29, 0x00, - 0x02, 0xC9, 0x00, 0x00, 0xD0, 0x4C, 0x5A, 0xAD, 0x00, 0x30, 0xA8, 0x18, 0x69, 0x20, 0x00, - 0x8D, 0x00, 0x30, 0xAF, 0x70, 0x80, 0x40, 0xA2, 0x00, 0x00, 0xC9, 0x0A, 0x00, 0x90, 0x07, - 0x38, 0xE9, 0x0A, 0x00, 0xE8, 0x80, 0xF4, 0xDA, 0xAA, 0x68, 0x09, 0x00, 0x25, 0x48, 0xA9, - 0x70, 0x2C, 0x99, 0x00, 0x00, 0x68, 0xC8, 0xC8, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0x8A, 0x09, - 0x00, 0x25, 0x48, 0xA9, 0x78, 0x2C, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0x68, 0x99, 0x00, 0x00, - 0xC8, 0xC8, 0x22, 0x80, 0xA3, 0x07, 0x7A, 0x38, 0x6B, ]) - rom.write_bytes(0x3A300, [0x22, 0x9F, 0xD2, 0x00, 0xDA, 0x8B, 0xA9, 0x00, 0x00, 0x48, 0xAB, 0xAB, 0xA9, 0x00, 0x70, - 0x8D, 0x16, 0x21, 0xA2, 0x00, 0x00, 0xE0, 0x40, 0x01, 0xF0, 0x0B, 0xBF, 0x50, 0x2F, 0xD9, - 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0x80, 0xF0, 0xA2, 0x00, 0x00, 0xE0, 0x20, 0x00, 0xF0, 0x0B, - 0xBF, 0x10, 0x2E, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0x80, 0xF0, 0x5A, 0xAF, 0x12, 0xD0, - 0x07, 0x0A, 0xAA, 0xBF, 0x00, 0xE0, 0x07, 0xAA, 0xA0, 0x00, 0x00, 0xC0, 0x20, 0x00, 0xF0, - 0x0D, 0xBF, 0x70, 0x31, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0xC8, 0xC8, 0x80, 0xEE, 0xAF, - 0x0C, 0xD0, 0x07, 0x0A, 0xAA, 0xBF, 0x10, 0xE0, 0x07, 0xAA, 0xA0, 0x00, 0x00, 0xC0, 0x20, - 0x00, 0xF0, 0x0D, 0xBF, 0x70, 0x31, 0xD9, 0x8D, 0x18, 0x21, 0xE8, 0xE8, 0xC8, 0xC8, 0x80, - 0xEE, 0x7A, 0xAB, 0xFA, 0x6B, ]) - rom.write_bytes(0x3A380, [0xA9, 0x80, 0x2C, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, 0x0A, 0x25, 0x99, 0x00, 0x00, 0xC8, - 0xC8, 0xAF, 0xCF, 0x53, 0x40, 0x0A, 0xAA, 0xBF, 0x00, 0x90, 0x40, 0xA2, 0x00, 0x00, 0xC9, - 0x0A, 0x00, 0x90, 0x07, 0x38, 0xE9, 0x0A, 0x00, 0xE8, 0x80, 0xF4, 0xDA, 0xAA, 0x68, 0x09, - 0x00, 0x25, 0x48, 0xA9, 0x88, 0x2C, 0x99, 0x00, 0x00, 0x68, 0xC8, 0xC8, 0x99, 0x00, 0x00, - 0xC8, 0xC8, 0x8A, 0x09, 0x00, 0x25, 0x48, 0xA9, 0x90, 0x2C, 0x99, 0x00, 0x00, 0xC8, 0xC8, - 0x68, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, 0xD8, 0x14, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, - 0x0B, 0x25, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, 0xE0, 0x14, 0x99, 0x00, 0x00, 0xC8, 0xC8, - 0xA9, 0x0A, 0x25, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xA9, 0xE8, 0x14, 0x99, 0x00, 0x00, 0xC8, - 0xC8, 0xA9, 0x0C, 0x25, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0xAD, 0x00, 0x30, 0x38, 0xE9, 0x40, - 0x30, 0x4A, 0x4A, 0xC9, 0x04, 0x00, 0x90, 0x06, 0x3A, 0x3A, 0x3A, 0x3A, 0x80, 0xF5, 0x8D, - 0x40, 0x32, 0xA9, 0x04, 0x00, 0x38, 0xED, 0x40, 0x32, 0xAA, 0xA9, 0xFF, 0x00, 0xE0, 0x00, - 0x00, 0xF0, 0x05, 0x4A, 0x4A, 0xCA, 0x80, 0xF6, 0xAC, 0x02, 0x30, 0x39, 0x00, 0x00, 0x99, - 0x00, 0x00, 0xC8, 0xA9, 0x00, 0x00, 0x99, 0x00, 0x00, 0xC8, 0xC8, 0x99, 0x00, 0x00, 0x6B, + rom.write_bytes(0x3A280, [0xE0, 0x00, 0x00, # CPX #$0000 + 0xF0, 0x01, # BEQ $07A286 + 0xE8, # INX + 0xEC, 0x1E, 0x65, # CPX $651E + 0x90, 0x66, # BCC 07A2F1 + 0xE0, 0x00, 0x00, # CPX #$0000 + 0xF0, 0x61, # BEQ $07A2F1 + 0xAF, 0xD0, 0x36, 0x40, # LDA $4036D0 + 0x29, 0xFF, 0x00, # AND #$00FF + 0xF0, 0x57, # BEQ $07A2F0 + 0xAD, 0x00, 0x30, # LDA $3000 + 0x29, 0x00, 0x02, # AND #$0200 + 0xC9, 0x00, 0x00, # CMP #$0000 + 0xD0, 0x4C, # BNE $07A2F0 + 0x5A, # PHY + 0xAD, 0x00, 0x30, # LDA $3000 + 0xA8, # TAY + 0x18, # CLC + 0x69, 0x20, 0x00, # ADC #$0020 + 0x8D, 0x00, 0x30, # STA $3000 + 0xAF, 0x70, 0x80, 0x40, # LDA $408070 + 0xA2, 0x00, 0x00, # LDX #$0000 + 0xC9, 0x0A, 0x00, # CMP $000A + 0x90, 0x07, # BCC $07A2C3 + 0x38, # SEC + 0xE9, 0x0A, 0x00, # SBC #$000A + 0xE8, # INX + 0x80, 0xF4, # BRA $07A2B7 + 0xDA, # PHX + 0xAA, # TAX + 0x68, # PLA + 0x09, 0x00, 0x25, # ORA #$2500 + 0x48, # PHA + 0xA9, 0x70, 0x2C, # LDA #$2C70 + 0x99, 0x00, 0x00, # STA $0000, Y + 0x68, # PLA + 0xC8, # INY + 0xC8, # INY + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0x8A, # TXA + 0x09, 0x00, 0x25, # ORA #$2500 + 0x48, # PHA + 0xA9, 0x78, 0x2C, # LDA #$2C78 + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0x68, # PLA + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0x22, 0x80, 0xA3, 0x07, # JSL $07A380 - we ran out of room + 0x7A, # PLY + 0x38, # SEC + 0x6B, # RTL ]) + rom.write_bytes(0x3A300, [0x22, 0x9F, 0xD2, 0x00, # JSL $00D29F - play sfx + 0xDA, # PHX + 0x8B, # PHB + 0xA9, 0x00, 0x00, + 0x48, # PHA + 0xAB, # PLB + 0xAB, # PLB + 0xA9, 0x00, 0x70, # LDA #$7000 + 0x8D, 0x16, 0x21, # STA $2116 + 0xA2, 0x00, 0x00, # LDX #$0000 + 0xE0, 0x40, 0x01, # CPX #$0140 + 0xF0, 0x0B, # BEQ $07A325 + 0xBF, 0x50, 0x2F, 0xD9, # LDA $D92F50, X + 0x8D, 0x18, 0x21, # STA $2118 + 0xE8, # INX + 0xE8, # INX + 0x80, 0xF0, # BRA $07A315 + 0xA2, 0x00, 0x00, # LDX #$0000 + 0xE0, 0x20, 0x00, # CPX #$0020 + 0xF0, 0x0B, # BEQ $07A338 + 0xBF, 0x10, 0x2E, 0xD9, # LDA $D92E10, X + 0x8D, 0x18, 0x21, # STA $2118 + 0xE8, # INX + 0xE8, # INX + 0x80, 0xF0, # BRA $07A328 + 0x5A, # PHY + 0xAF, 0x12, 0xD0, 0x07, # LDA $07D012 + 0x0A, # ASL + 0xAA, # TAX + 0xBF, 0x00, 0xE0, 0x07, # LDA $07E000, X + 0xAA, # TAX + 0xA0, 0x00, 0x00, # LDY #$0000 + 0xC0, 0x20, 0x00, # CPY #$0020 + 0xF0, 0x0D, # BEQ $07A359 + 0xBF, 0x70, 0x31, 0xD9, # LDA $D93170, X + 0x8D, 0x18, 0x21, # STA $2118 + 0xE8, # INX + 0xE8, # INX + 0xC8, # INY + 0xC8, # INY + 0x80, 0xEE, # BRA $07A347 + 0xAF, 0x0C, 0xD0, 0x07, # LDA $07D00C + 0x0A, # ASL + 0xAA, # TAX + 0xBF, 0x10, 0xE0, 0x07, # LDA $07E010, X + 0xAA, # TAX + 0xA0, 0x00, 0x00, # LDY #$0000 + 0xC0, 0x20, 0x00, # CPY #$0020 + 0xF0, 0x0D, # BEQ $07A379 + 0xBF, 0x70, 0x31, 0xD9, # LDA $D93170, X + 0x8D, 0x18, 0x21, # STA $2118 + 0xE8, # INX + 0xE8, # INX + 0xC8, # INY + 0xC8, # INY + 0x80, 0xEE, # BRA $07A367 + 0x7A, # PLY + 0xAB, # PLB + 0xFA, # PLX + 0x6B, # RTL + ]) + rom.write_bytes(0x3A380, [0xA9, 0x80, 0x2C, # LDA #$2C80 + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0xA9, 0x0A, 0x25, # LDA #$250A + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0xAF, 0xCF, 0x53, 0x40, # LDA $4053CF + 0x0A, # ASL + 0xAA, # TAX + 0xBF, 0x00, 0x90, 0x40, # LDA $409000, X + 0xA2, 0x00, 0x00, # LDX #$0000 + 0xC9, 0x0A, 0x00, # CMP #$000A + 0x90, 0x07, # BCC $07A3A9 + 0x38, # SEC + 0xE9, 0x0A, 0x00, # SBC #$000A + 0xE8, # INX + 0x80, 0xF4, # BRA $07A39D - return to loop head + 0xDA, # PHX + 0xAA, # TAX + 0x68, # PLA + 0x09, 0x00, 0x25, # ORA #$2500 + 0x48, # PHA + 0xA9, 0x88, 0x2C, # LDA #$2C88 + 0x99, 0x00, 0x00, # STA $0000, Y + 0x68, # PLA + 0xC8, # INY + 0xC8, # INY + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0x8A, # TXA + 0x09, 0x00, 0x25, # ORA #$2500 + 0x48, # PHA + 0xA9, 0x90, 0x2C, # LDA #$2C90 + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0x68, # PLA + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0xA9, 0xD8, 0x14, # LDA #$14D8 + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0xA9, 0x0B, 0x25, # LDA #$250B + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0xA9, 0xE0, 0x14, # LDA #$14E0 + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0xA9, 0x0A, 0x25, # LDA #$250A + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0xA9, 0xE8, 0x14, # LDA #$14E8 + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0xA9, 0x0C, 0x25, # LDA #$250C + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0xAD, 0x00, 0x30, # LDA $3000 + 0x38, # SEC + 0xE9, 0x40, 0x30, # SBC #$3040 + 0x4A, # LSR + 0x4A, # LSR + 0xC9, 0x04, 0x00, # CMP #$0004 + 0x90, 0x06, # BCC $07A415 + 0x3A, 0x3A, 0x3A, 0x3A, # DEC x4 + 0x80, 0xF5, # BRA $07A40A - return to loop head + 0x8D, 0x40, 0x32, # STA $3240 + 0xA9, 0x04, 0x00, # LDA #$0004 + 0x38, # SEC + 0xED, 0x40, 0x32, # SBC $3240 + 0xAA, # TAX + 0xA9, 0xFF, 0x00, # LDA #$00FF + 0xE0, 0x00, 0x00, # CPX #$0000 + 0xF0, 0x05, # BEQ $07A42D + 0x4A, # LSR + 0x4A, # LSR + 0xCA, # DEX + 0x80, 0xF6, # BRA $07A423 + 0xAC, 0x02, 0x30, # LDY $3002 + 0x39, 0x00, 0x00, # AND $0000, Y + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xA9, 0x00, 0x00, # LDA #$0000 + 0x99, 0x00, 0x00, # STA $0000, Y + 0xC8, # INY + 0xC8, # INY + 0x99, 0x00, 0x00, # STA $0000, Y + 0x6B, # RTL + ]) + # Goal/Goal Speed letter offsets rom.write_bytes(0x3E000, [0x20, 0x03, 0x20, 0x00, 0x80, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x01, 0xA0, 0x00, ]) @@ -942,9 +1203,26 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # Write strict bosses patch if multiworld.strict_bosses[player]: - rom.write_bytes(0x3A000, [0xDA, 0xAD, 0xCB, 0x53, 0xC9, 0x05, 0x00, 0xB0, 0x15, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, - 0xAE, 0xCB, 0x53, 0xCA, 0x8A, 0x0A, 0xAA, 0xAD, 0x70, 0x80, 0xDF, 0x00, 0xD0, 0x07, - 0xB0, 0x03, 0x38, 0x80, 0x01, 0x18, 0xFA, 0xAD, 0xCD, 0x53, 0x6B, ]) + rom.write_bytes(0x3A000, [0xDA, # PHX + 0xAD, 0xCB, 0x53, # LDA $53CB - unlocked level + 0xC9, 0x05, 0x00, # CMP #$0005 - have we unlocked level 5? + 0xB0, 0x15, # BCS $07A01E - we don't need to do anything if so + 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, # NOP x5, unsure when these got here + 0xAE, 0xCB, 0x53, # LDX $53CB + 0xCA, # DEX + 0x8A, # TXA + 0x0A, # ASL + 0xAA, # TAX + 0xAD, 0x70, 0x80, # LDA $8070 - current heart stars + 0xDF, 0x00, 0xD0, 0x07, # CMP $07D000, X - do we have enough HS to purify? + 0xB0, 0x03, # BCS $07A021 - branch if we do not + 0x38, # SEC + 0x80, 0x01, # BRA $07A022 + 0x18, # CLC + 0xFA, # PLX + 0xAD, 0xCD, 0x53, # LDA $53CD + 0x6B, # RTL + ]) rom.write_bytes(0x143D9, [0x22, 0x00, 0xA0, 0x07, 0xEA, 0xEA, ]) # Write open world patch @@ -970,13 +1248,60 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, # This has further checks present for bosses already, so we just # need to handle regular stages # write check for boss to be unlocked - rom.write_bytes(0x3A100, [0xDA, 0x5A, 0xAD, 0xCD, 0x53, 0xC9, 0x06, 0x00, 0xD0, 0x50, 0xAD, 0xCF, 0x53, 0x1A, - 0xCD, 0xCB, 0x53, 0xD0, 0x47, 0xA9, 0x00, 0x00, 0xAE, 0xCF, 0x53, 0xE0, 0x00, 0x00, - 0xF0, 0x06, 0x69, 0x06, 0x00, 0xCA, 0x80, 0xF5, 0x0A, 0xAA, 0xA9, 0x00, 0x00, 0xA0, - 0x06, 0x00, 0x5A, 0xDA, 0xFA, 0xBC, 0x20, 0x90, 0x88, 0xE8, 0xE8, 0x48, 0x98, 0x0A, - 0xA8, 0x68, 0x79, 0x00, 0x82, 0x7A, 0x88, 0x5A, 0xDA, 0xC0, 0x00, 0x00, 0xD0, 0xE8, - 0xFA, 0x7A, 0x38, 0xED, 0x16, 0x90, 0x90, 0x0C, 0xAD, 0xCD, 0x53, 0x1A, 0x8D, 0xCD, - 0x53, 0x8D, 0xC1, 0x5A, 0x80, 0x03, 0x9C, 0xC1, 0x5A, 0x7A, 0xFA, 0x6B, ]) + rom.write_bytes(0x3A100, [0xDA, # PHX + 0x5A, # PHY + 0xAD, 0xCD, 0x53, # LDA $53CD + 0xC9, 0x06, 0x00, # CMP #$0006 + 0xD0, 0x50, # BNE $07A15A - return if we aren't on stage 6 + 0xAD, 0xCF, 0x53, # LDA $53CF + 0x1A, # INC + 0xCD, 0xCB, 0x53, # CMP $53CB - are we on the most unlocked level? + 0xD0, 0x47, # BNE $07A15A - return if we aren't + 0xA9, 0x00, 0x00, # LDA #$0000 + 0xAE, 0xCF, 0x53, # LDX $53CF + 0xE0, 0x00, 0x00, # CPX #$0000 + 0xF0, 0x06, # BEQ $07A124 + 0x69, 0x06, 0x00, # ADC #$0006 + 0xCA, # DEX + 0x80, 0xF5, # BRA $07A119 - return to loop head + 0x0A, # ASL + 0xAA, # TAX + 0xA9, 0x00, 0x00, # LDA #$0000 + 0xA0, 0x06, 0x00, # LDX #$0006 + 0x5A, # PHY + 0xDA, # PHX + 0xFA, # PLX + 0xBC, 0x20, 0x90, # LDY $9020, X - get stage id + 0x88, # DEY + 0xE8, # INX + 0xE8, # INX + 0x48, # PHA + 0x98, # TYA + 0x0A, # ASL + 0xA8, # TAY + 0x68, # PLA + 0x79, 0x00, 0x82, # ADC $8200, Y - add current stage value to total + 0x7A, # PLY + 0x88, # DEY + 0x5A, # PHY + 0xDA, # PHX + 0xC0, 0x00, 0x00, # CPY #$0000 + 0xD0, 0xE8, # BNE $07A12E - return to loop head + 0xFA, # PLX + 0x7A, # PLY + 0x38, # SEC + 0xED, 0x16, 0x90, # SBC $9016 + 0x90, 0x0C, # BCC $07A12E + 0xAD, 0xCD, 0x53, # LDA $53CD + 0x1A, # INC + 0x8D, 0xCD, 0x53, # STA $53CD + 0x8D, 0xC1, 0x5A, # STA $5AC1 + 0x80, 0x03, # BRA 07A15D + 0x9C, 0xC1, 0x5A, # STZ $5AC1 + 0x7A, # PLY + 0xFA, # PLX + 0x6B, # RTL + ]) # write hook to boss check rom.write_bytes(0x143F0, [0x22, 0x00, 0xA1, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) @@ -987,14 +1312,52 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0x00, 0x37, 0x00, 0x37, 0x00, 0x7E, 0x00, 0x94, 0x00, 0x37, 0x00, 0xA9, 0x26, 0x00, 0x22, 0x27, 0xD9, 0x00, 0xA4, 0xD2, 0x6B, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) + # JSL first, then edit the following sections to point 1-ups and heart stars to the same function, function just + # calls sound effect playing and prepares for the next function # Write Consumable Index to index array - rom.write_bytes(0x39E80, [0x48, 0xDA, 0x5A, 0x29, 0xFF, 0x00, 0x48, 0xAE, 0xCF, 0x53, 0xAC, 0xD3, 0x53, 0xA9, - 0x00, 0x00, 0x88, 0xE0, 0x00, 0x00, 0xF0, 0x07, 0x18, 0x69, 0x07, 0x00, 0xCA, 0x80, - 0xF4, 0xC0, 0x00, 0x00, 0xF0, 0x04, 0x1A, 0x88, 0x80, 0xF7, 0x0A, 0xAA, 0xBF, 0x20, - 0xD0, 0x07, 0x3A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0xAA, 0x68, 0xC9, 0x00, 0x00, - 0xF0, 0x04, 0xE8, 0x3A, 0x80, 0xF7, 0xBD, 0x00, 0xA0, 0x09, 0x01, 0x00, 0x9D, 0x00, - 0xA0, 0x7A, 0xFA, 0x68, 0xEB, 0x29, 0xFF, 0x00, 0x6B, ]) + rom.write_bytes(0x39E80, [0x48, # PHA + 0xDA, # PHX + 0x5A, # PHY + 0x29, 0xFF, 0x00, # AND #$00FF + 0x48, # PHA + 0xAE, 0xCF, 0x53, # LDX $53CF + 0xAC, 0xD3, 0x53, # LDY $53D3 + 0xA9, 0x00, 0x00, # LDA #$0000 + 0x88, # DEY + 0xE0, 0x00, 0x00, # CPX #$0000 + 0xF0, 0x07, # BEQ $079E9D + 0x18, # CLC + 0x69, 0x07, 0x00, # ADC #$0007 + 0xCA, # DEX + 0x80, 0xF4, # BRA $079E91 - return to loop head + 0xC0, 0x00, 0x00, # CPY #$0000 + 0xF0, 0x04, # BEQ $079EA6 + 0x1A, # INC + 0x88, # DEY + 0x80, 0xF7, # BRA $079E9D - return to loop head + 0x0A, # ASL + 0xAA, # TAX + 0xBF, 0x20, 0xD0, 0x07, # LDA $07D020, X - current stage + 0x3A, # DEC + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, # ASL x6 + 0xAA, # TAX + 0x68, # PLA + 0xC9, 0x00, 0x00, # CMP #$0000 + 0xF0, 0x04, # BEQ $079EBE + 0xE8, # INX + 0x3A, # DEC + 0x80, 0xF7, # BRA $079EB5 - return to loop head + 0xBD, 0x00, 0xA0, # LDA $A000, X - consumables index + 0x09, 0x01, 0x00, # ORA #$0001 + 0x9D, 0x00, 0xA0, # STA $A000, X + 0x7A, # PLY + 0xFA, # PLX + 0x68, # PLA + 0xEB, # XBA + 0x29, 0xFF, 0x00, # AND #$00FF + 0x6B, # RTL + ]) if multiworld.music_shuffle[player] > 0: if multiworld.music_shuffle[player] == 1: From b50ff6aa32ac89ed9ae6669ab46199a38383a728 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 5 Jul 2023 02:12:33 -0500 Subject: [PATCH 077/165] collect stage completion (doesn't unlock next stage) --- worlds/kdl3/Client.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index ee9f5fd2077d..5716d312f7cc 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -265,10 +265,12 @@ async def game_watcher(self, ctx) -> None: stages_raw = await snes_read(ctx, KDL3_COMPLETED_STAGES, 60) stages = struct.unpack("HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", stages_raw) for i in range(30): - if stages[i] == 1: - loc_id = 0x770000 + i + 1 - if loc_id not in ctx.checked_locations: - new_checks.append(loc_id) + loc_id = 0x770000 + i + 1 + if stages[i] == 1 and loc_id not in ctx.checked_locations: + new_checks.append(loc_id) + elif stages[i] == 0 and loc_id in ctx.checked_locations: + snes_buffered_write(ctx, KDL3_COMPLETED_STAGES + (i * 2), struct.pack("H", 1)) + # heart star status heart_stars = await snes_read(ctx, KDL3_HEART_STARS, 35) for i in range(5): From 4b29800525a75c1dd32c6c1142017beea04707b7 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 5 Jul 2023 16:14:55 -0500 Subject: [PATCH 078/165] fix vanilla heart star sprites on minigames --- worlds/kdl3/Rom.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 0e8fe88690ce..274c5711a821 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -609,6 +609,7 @@ def write_heart_star_sprites(rom: RomData): decompressed = hal_decompress(compressed) patch = get_data(__name__, os.path.join("data", "APHeartStar.bsdiff4")) patched = bytearray(bsdiff4.patch(decompressed, patch)) + rom.write_bytes(0x1AF7DF, patched) patched[0:0] = [0xE3, 0xFF] patched.append(0xFF) rom.write_bytes(0x1CD000, patched) From 30d164484c88b5f6c83fbf8faca282ebaa26ff69 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 5 Jul 2023 17:39:25 -0500 Subject: [PATCH 079/165] update for auto host yaml --- worlds/kdl3/__init__.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 1445bd9a6cad..adf8abb5ec7e 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -1,5 +1,7 @@ import logging +import typing +import settings from BaseClasses import Tutorial, ItemClassification, MultiWorld from worlds.AutoWorld import World, WebWorld from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item, \ @@ -9,7 +11,7 @@ from .Options import kdl3_options from .Names import LocationName from .Rules import set_rules -from .Rom import KDL3DeltaPatch, get_base_rom_path, RomData, patch_rom +from .Rom import KDL3DeltaPatch, get_base_rom_path, RomData, patch_rom, KDL3JHASH, KDL3UHASH from .Client import KDL3SNIClient from typing import Dict, TextIO @@ -21,6 +23,16 @@ logger = logging.getLogger("Kirby's Dream Land 3") +class KDL3Settings(settings.Group): + class RomFile(settings.SNESRomPath): + """File name of the KDL3 JP or EN rom""" + description = "Kirby's Dream Land 3 ROM File" + copy_to = "Kirby's Dream Land 3.sfc" + md5s = [KDL3JHASH, KDL3UHASH] + + rom_file: RomFile = RomFile(RomFile.copy_to) + + class KDL3WebWorld(WebWorld): theme = "partyTime" tutorials = [ @@ -43,6 +55,7 @@ class KDL3World(World): game = "Kirby's Dream Land 3" option_definitions = kdl3_options + settings: typing.ClassVar[KDL3Settings] item_name_to_id = {item: item_table[item].code for item in item_table} location_name_to_id = {location_table[location]: location for location in location_table} item_name_groups = item_names From 2f4755209cb1dfc3454a50c5ea2051bdcf639004 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 5 Jul 2023 18:08:56 -0500 Subject: [PATCH 080/165] typing and cleanup --- worlds/kdl3/Rom.py | 20 ++++++++++---------- worlds/kdl3/__init__.py | 1 + 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 274c5711a821..770877d71ebc 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -548,28 +548,28 @@ class RomData: - def __init__(self, file, name=None): + def __init__(self, file: str, name: typing.Optional[str] = None): self.file = bytearray() self.read_from_file(file) self.name = name - def read_byte(self, offset): + def read_byte(self, offset: int): return self.file[offset] - def read_bytes(self, offset, length): + def read_bytes(self, offset: int, length: int): return self.file[offset:offset + length] - def write_byte(self, offset, value): + def write_byte(self, offset: int, value: int): self.file[offset] = value - def write_bytes(self, offset, values): + def write_bytes(self, offset: int, values): self.file[offset:offset + len(values)] = values - def write_to_file(self, file): + def write_to_file(self, file: str): with open(file, 'wb') as outfile: outfile.write(self.file) - def read_from_file(self, file): + def read_from_file(self, file: str): with open(file, 'rb') as stream: self.file = bytearray(stream.read()) @@ -1442,11 +1442,11 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1], target[2])) -def get_base_rom_bytes(file_name: str = "") -> bytes: +def get_base_rom_bytes() -> bytes: + rom_file: str = get_base_rom_path() base_rom_bytes: Optional[bytes] = getattr(get_base_rom_bytes, "base_rom_bytes", None) if not base_rom_bytes: - file_name: str = get_base_rom_path(file_name) - base_rom_bytes = bytes(Utils.read_snes_rom(open(file_name, "rb"))) + base_rom_bytes = bytes(Utils.read_snes_rom(open(rom_file, "rb"))) basemd5 = hashlib.md5() basemd5.update(base_rom_bytes) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index adf8abb5ec7e..738efbad65ba 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -68,6 +68,7 @@ class KDL3World(World): boss_butch_bosses = dict() def __init__(self, world: MultiWorld, player: int): + self.rom_name = None self.rom_name_available_event = threading.Event() super().__init__(world, player) From eba4b74b0925d8cf2652ba12b63a5a3bc750ed30 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 5 Jul 2023 18:56:42 -0500 Subject: [PATCH 081/165] hotfix for 0.4.1 support --- worlds/kdl3/__init__.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 738efbad65ba..0598e3ba2d56 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -1,7 +1,6 @@ import logging import typing -import settings from BaseClasses import Tutorial, ItemClassification, MultiWorld from worlds.AutoWorld import World, WebWorld from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item, \ @@ -19,18 +18,21 @@ import math import threading import base64 - +from Main import __version__ as APVersion logger = logging.getLogger("Kirby's Dream Land 3") -class KDL3Settings(settings.Group): - class RomFile(settings.SNESRomPath): - """File name of the KDL3 JP or EN rom""" - description = "Kirby's Dream Land 3 ROM File" - copy_to = "Kirby's Dream Land 3.sfc" - md5s = [KDL3JHASH, KDL3UHASH] +if APVersion == "0.4.2": + import settings + + class KDL3Settings(settings.Group): + class RomFile(settings.SNESRomPath): + """File name of the KDL3 JP or EN rom""" + description = "Kirby's Dream Land 3 ROM File" + copy_to = "Kirby's Dream Land 3.sfc" + md5s = [KDL3JHASH, KDL3UHASH] - rom_file: RomFile = RomFile(RomFile.copy_to) + rom_file: RomFile = RomFile(RomFile.copy_to) class KDL3WebWorld(WebWorld): @@ -55,7 +57,6 @@ class KDL3World(World): game = "Kirby's Dream Land 3" option_definitions = kdl3_options - settings: typing.ClassVar[KDL3Settings] item_name_to_id = {item: item_table[item].code for item in item_table} location_name_to_id = {location_table[location]: location for location in location_table} item_name_groups = item_names @@ -67,6 +68,9 @@ class KDL3World(World): stage_shuffle_enabled = False boss_butch_bosses = dict() + if APVersion == "0.4.2": + settings: typing.ClassVar[KDL3Settings] + def __init__(self, world: MultiWorld, player: int): self.rom_name = None self.rom_name_available_event = threading.Event() From 6388ffb24786f06560524c0c45116df155e3d132 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 6 Jul 2023 19:00:57 -0500 Subject: [PATCH 082/165] beginning work on room logic refactor --- worlds/kdl3/Locations.py | 4 + worlds/kdl3/Names/AnimalFriendSpawns.py | 57 +++ worlds/kdl3/Regions.py | 3 + worlds/kdl3/Room.py | 459 ++++++++++++++++++++++++ worlds/kdl3/Rules.py | 2 + 5 files changed, 525 insertions(+) create mode 100644 worlds/kdl3/Names/AnimalFriendSpawns.py create mode 100644 worlds/kdl3/Room.py diff --git a/worlds/kdl3/Locations.py b/worlds/kdl3/Locations.py index 0aa21053d59f..2fe7b965c84c 100644 --- a/worlds/kdl3/Locations.py +++ b/worlds/kdl3/Locations.py @@ -2,9 +2,13 @@ from BaseClasses import Location from .Names import LocationName +if typing.TYPE_CHECKING: + from .Room import Room + class KDL3Location(Location): game: str = "Kirby's Dream Land 3" + room: typing.Optional["Room"] = None def __init__(self, player: int, name: str, address: typing.Optional[int], parent): super().__init__(player, name, address, parent) diff --git a/worlds/kdl3/Names/AnimalFriendSpawns.py b/worlds/kdl3/Names/AnimalFriendSpawns.py new file mode 100644 index 000000000000..ccba84db9c10 --- /dev/null +++ b/worlds/kdl3/Names/AnimalFriendSpawns.py @@ -0,0 +1,57 @@ +grass_land_1_a1 = "Grass Land 1 - Animal 1" # Nago +grass_land_1_a2 = "Grass Land 1 - Animal 2" # Rick +grass_land_2_a1 = "Grass Land 2 - Animal 1" # ChuChu +grass_land_2_a2 = "Grass Land 2 - Animal 2" # Pitch +grass_land_3_a1 = "Grass Land 3 - Animal 1" # Kine +grass_land_3_a2 = "Grass Land 3 - Animal 2" # Coo +grass_land_4_a1 = "Grass Land 4 - Animal 1" # ChuChu +grass_land_4_a2 = "Grass Land 4 - Animal 2" # Nago +grass_land_5_a1 = "Grass Land 5 - Animal 1" # Coo +grass_land_5_a2 = "Grass Land 5 - Animal 2" # Kine +grass_land_5_a3 = "Grass Land 5 - Animal 3" # Nago +grass_land_5_a4 = "Grass Land 5 - Animal 4" # Rick +grass_land_6_a1 = "Grass Land 6 - Animal 1" # Rick +grass_land_6_a2 = "Grass Land 6 - Animal 2" # ChuChu +grass_land_6_a3 = "Grass Land 6 - Animal 3" # Nago +grass_land_6_a4 = "Grass Land 6 - Animal 4" # Coo +ripple_field_1_a1 = "Ripple Field 1 - Animal 1" # Pitch +ripple_field_1_a2 = "Ripple Field 1 - Animal 2" # Nago +ripple_field_2_a1 = "Ripple Field 2 - Animal 1" # Kine +ripple_field_2_a2 = "Ripple Field 2 - Animal 2" # ChuChu +ripple_field_2_a3 = "Ripple Field 2 - Animal 3" # Rick +ripple_field_2_a4 = "Ripple Field 2 - Animal 4" # Coo +ripple_field_3_a1 = "Ripple Field 3 - Animal 1" # Kine +ripple_field_3_a2 = "Ripple Field 3 - Animal 2" # Rick +ripple_field_4_a1 = "Ripple Field 4 - Animal 1" # ChuChu +ripple_field_4_a2 = "Ripple Field 4 - Animal 2" # Kine +ripple_field_4_a3 = "Ripple Field 4 - Animal 3" # Nago +ripple_field_5_a1 = "Ripple Field 5 - Animal 1" # Kine +ripple_field_5_a2 = "Ripple Field 5 - Animal 2" # Pitch +ripple_field_6_a1 = "Ripple Field 6 - Animal 1" # Nago +ripple_field_6_a2 = "Ripple Field 6 - Animal 2" # Pitch +ripple_field_6_a3 = "Ripple Field 6 - Animal 3" # Rick +ripple_field_6_a4 = "Ripple Field 6 - Animal 4" # Coo +sand_canyon_1_a1 = "Sand Canyon 1 - Animal 1" # Rick +sand_canyon_1_a2 = "Sand Canyon 1 - Animal 2" # Pitch +sand_canyon_2_a1 = "Sand Canyon 2 - Animal 1" # ChuChu +sand_canyon_2_a2 = "Sand Canyon 2 - Animal 2" # Coo +sand_canyon_3_a1 = "Sand Canyon 3 - Animal 1" # Pitch +sand_canyon_3_a2 = "Sand Canyon 3 - Animal 2" # Coo +sand_canyon_3_a3 = "Sand Canyon 3 - Animal 3" # ChuChu +sand_canyon_4_a1 = "Sand Canyon 4 - Animal 1" # Rick +sand_canyon_4_a2 = "Sand Canyon 4 - Animal 2" # Pitch +sand_canyon_4_a3 = "Sand Canyon 4 - Animal 3" # Nago +sand_canyon_5_a1 = "Sand Canyon 5 - Animal 1" # Rick +sand_canyon_5_a2 = "Sand Canyon 5 - Animal 2" # ChuChu +sand_canyon_6_a1 = "Sand Canyon 6 - Animal 1" # Coo +sand_canyon_6_a2 = "Sand Canyon 6 - Animal 2" # Kine +sand_canyon_6_a3 = "Sand Canyon 6 - Animal 3" # Rick +sand_canyon_6_a4 = "Sand Canyon 6 - Animal 4" # ChuChu +sand_canyon_6_a5 = "Sand Canyon 6 - Animal 5" # Nago +sand_canyon_6_a6 = "Sand Canyon 6 - Animal 6" # Pitch +cloudy_park_1_a1 = "Cloudy Park 1 - Animal 1" # Rick +cloudy_park_1_a2 = "Cloudy Park 1 - Animal 2" # Nago +cloudy_park_1_a3 = "Cloudy Park 1 - Animal 3" # Coo +cloudy_park_1_a4 = "Cloudy Park 1 - Animal 4" # Kine +cloudy_park_1_a5 = "Cloudy Park 1 - Animal 5" # ChuChu +cloudy_park_1_a6 = "Cloudy Park 1 - Animal 6" # Pitch diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 94cac71563b1..d7d9a36f7720 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -31,6 +31,9 @@ def generate_valid_level(level, stage, possible_stages, slot_random): return new_stage +#def generate_rooms(world: World, door_shuffle: bool, ) + + def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bool) -> dict: levels: typing.Dict[int, typing.List[typing.Optional[int]]] = { 1: [None for _ in range(7)], diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py new file mode 100644 index 000000000000..b98dc473357e --- /dev/null +++ b/worlds/kdl3/Room.py @@ -0,0 +1,459 @@ +import struct +import typing +from BaseClasses import CollectionState +from struct import unpack +from .Rom import RomData +from .Locations import KDL3Location + + +class Room: + exits: typing.List = list() + pointer: int = 0 + level: int = 0 + stage: int = 0 + access_rule: typing.Callable[["CollectionState"], bool] = staticmethod(lambda state: True) + animal_access_rule: typing.Callable[["CollectionState"], bool] = staticmethod(lambda state: True) + parents: typing.List = list() + locations: typing.Dict[KDL3Location, typing.Callable[["CollectionState"], bool]] + + def __init__(self, exits, level, stage, access_rule, animal_access_rule, parents, locations): + self.exits = exits + self.level = level + self.stage = stage + self.access_rule = access_rule + self.animal_access_rule = animal_access_rule + self.parents = parents + self.locations = locations + + + def can_reach(self, state: "CollectionState", need_animal: bool): + if len(self.parents) == 0 or any([x.can_reach(state, need_animal) for x in self.parents]): + if need_animal: + return self.access_rule(state) & self.animal_access_rule(state) + else: + return self.access_rule(state) + + def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Dict[int, int]]], should_animal: bool): + if music: + if isinstance(music, int): + rom.write_byte(self.pointer + 2, music) + else: + old_music = rom.read_byte(self.pointer + 2) + rom.write_byte(self.pointer + 2, music[old_music]) + if should_animal: + animals = [x.item for x in self.locations if "Animal" in x.name] + entity_pointer = self.pointer + 168 + while unpack("H", rom.read_bytes(entity_pointer, 2)) != 0xFFFF: + entity_pointer += 2 + while unpack("H", rom.read_bytes(entity_pointer, 2)) != 0xFFFF: + entity_pointer += 2 + # we have to move two lists before reaching entities + entity_count = unpack("H", rom.read_bytes(entity_pointer, 2))[0] + entity_pointer += 2 + if entity_count == 0xFFFF: + return + entity_pointer += 2 # we don't need size + for _ in range(entity_count): + entity_pointer += 4 + entity_type = struct.unpack("H", rom.read_bytes(entity_pointer, 2))[0] + entity_pointer += 2 + if entity_type == 0x02: + entity_pointer += 1 # don't need idx + + +room_data = [ + 0x346711, + 0x3365b5, + 0x2d2d0a, + 0x3513aa, + 0x2d7256, + 0x2c1c53, + 0x3240a3, + 0x2eafe5, + 0x345ead, + 0x2d51ad, + 0x3698a6, + 0x2d4229, + 0x2c0f25, + 0x300f8b, + 0x30e74b, + 0x30d442, + 0x2d29a8, + 0x2d7531, + 0x2dbe33, + 0x2f124c, + 0x2c1e35, + 0x34f7b4, + 0x346f71, + 0x2e60a9, + 0x38cdda, + 0x326e14, + 0x35608f, + 0x30387f, + 0x2e5299, + 0x2d9ee2, + 0x2e70be, + 0x2c12e9, + 0x32688d, + 0x2e850e, + 0x32c42b, + 0x2d43bb, + 0x2d5f45, + 0x2d33af, + 0x2c0c52, + 0x31ac7f, + 0x3386e8, + 0x33ce35, + 0x338049, + 0x32b461, + 0x354403, + 0x2ef2a1, + 0x2e8098, + 0x2e203d, + 0x2c03d9, + 0x2d88a9, + 0x320bef, + 0x36c250, + 0x2d1a48, + 0x364dac, + 0x2d623f, + 0x2e8ff9, + 0x2e896e, + 0x2eca27, + 0x2c15bc, + 0x330000, + 0x2f0f43, + 0x34a947, + 0x3810d7, + 0x2d5c48, + 0x2f734e, + 0x2d5dc7, + 0x2c1a71, + 0x35ab46, + 0x370000, + 0x38b164, + 0x2edfaf, + 0x2d54ba, + 0x2d95ee, + 0x2c13da, + 0x303c20, + 0x2f092c, + 0x2d3d6e, + 0x2e0f07, + 0x2d9886, + 0x2c079d, + 0x2e6c2d, + 0x315bf5, + 0x30260c, + 0x331e0f, + 0x2e8b9d, + 0x2e9225, + 0x33ae5e, + 0x305853, + 0x2d248e, + 0x3171b1, + 0x362188, + 0x371abf, + 0x3be88d, + 0x2e2ecf, + 0x30f0a5, + 0x3530c8, + 0x3942fa, + 0x2e754a, + 0x2d36f9, + 0x2e6e76, + 0x2c0a70, + 0x2d01c8, + 0x2d5640, + 0x3781f5, + 0x2f3054, + 0x2fcf3f, + 0x358632, + 0x310000, + 0x36b7f7, + 0x37426b, + 0x2d151b, + 0x2ed5fe, + 0x2c0b61, + 0x302d7a, + 0x35c6ab, + 0x3046d4, + 0x3598d4, + 0x38bfea, + 0x34341c, + 0x30e0fd, + 0x2fe3dc, + 0x2d9b16, + 0x2c06ac, + 0x37f992, + 0x2d0e22, + 0x35e194, + 0x31ccf3, + 0x2ef0cc, + 0x3262f5, + 0x39fe24, + 0x2ee760, + 0x2eb616, + 0x34b166, + 0x2db285, + 0x2c2017, + 0x361664, + 0x2d4097, + 0x38dbbe, + 0x3422e6, + 0x366383, + 0x2d60c3, + 0x318f61, + 0x2c1016, + 0x2d49f9, + 0x35bda2, + 0x2d1c01, + 0x357cd0, + 0x341189, + 0x32791c, + 0x2d188f, + 0x2f3943, + 0x352724, + 0x2dcee6, + 0x2c088e, + 0x37e296, + 0x2e944e, + 0x2ea788, + 0x342b83, + 0x379af5, + 0x2e7304, + 0x3379a9, + 0x2d3a3c, + 0x2c1980, + 0x37a720, + 0x329449, + 0x2d6c91, + 0x2d73c5, + 0x307e62, + 0x308bfb, + 0x307af9, + 0x3092bb, + 0x30741d, + 0x308532, + 0x30778e, + 0x3081ca, + 0x2d9c5d, + 0x2e050b, + 0x2d6b1b, + 0x2e3d40, + 0x2d5ac9, + 0x2d0fe2, + 0x2d11a1, + 0x2da65b, + 0x2d63bb, + 0x2d5026, + 0x2d69a3, + 0x2d071a, + 0x328979, + 0x2efba6, + 0x2ec82a, + 0x2ebe33, + 0x2ecc24, + 0x2ece21, + 0x2d0390, + 0x2d9204, + 0x2edbd2, + 0x2e9ce1, + 0x2e9675, + 0x2e9899, + 0x2e9abd, + 0x2d90b4, + 0x2ee949, + 0x2d57c5, + 0x2ec032, + 0x2ec230, + 0x2ec42e, + 0x2ed40b, + 0x2d99cf, + 0x2c0d43, + 0x2da51d, + 0x3069bb, + 0x2ef813, + 0x32237a, + 0x2ebc2f, + 0x33d479, + 0x2e5e55, + 0x35f378, + 0x2d1360, + 0x34e0bf, + 0x2ef9dd, + 0x3211d6, + 0x35b478, + 0x2d2642, + 0x2c097f, + 0x2ff32b, + 0x316055, + 0x3251de, + 0x32fb1f, + 0x34c17c, + 0x31f496, + 0x2d8a05, + 0x2d8e0a, + 0x2da2a1, + 0x2c179e, + 0x2f50bb, + 0x30f9f7, + 0x311339, + 0x2db020, + 0x3145df, + 0x2d4e9c, + 0x3eff12, + 0x2c05bb, + 0x2ee389, + 0x2eeb2f, + 0x327e99, + 0x324c23, + 0x32d3b4, + 0x32d8cc, + 0x31a43e, + 0x2d486a, + 0x2d7f0c, + 0x2de601, + 0x2c11f8, + 0x30b736, + 0x2e8dcc, + 0x36fee2, + 0x2fc76a, + 0x2da024, + 0x2d66b2, + 0x306d33, + 0x2da8d4, + 0x2c1f26, + 0x31e4d7, + 0x31a018, + 0x2e360e, + 0x2fca07, + 0x2f8998, + 0x3186f1, + 0x3164b4, + 0x31c8f1, + 0x2e313b, + 0x2f2460, + 0x2fcca3, + 0x2e0c8a, + 0x2e54f4, + 0x2d3f03, + 0x2ef474, + 0x2eb822, + 0x2c14cb, + 0x2dc19a, + 0x335127, + 0x36e0ec, + 0x322f30, + 0x2ed217, + 0x315791, + 0x33f935, + 0x2d8f5f, + 0x2c2108, + 0x2f67f0, + 0x32e2b9, + 0x350000, + 0x2e574e, + 0x2e503e, + 0x2fbce7, + 0x31e8c9, + 0x3104d5, + 0x2db153, + 0x2ea9a4, + 0x2c0e34, + 0x34b972, + 0x2e13f9, + 0x373549, + 0x37b340, + 0x2e5c00, + 0x2dfd32, + 0x374f55, + 0x2d9da0, + 0x2c188f, + 0x31f87f, + 0x337304, + 0x321d9a, + 0x30434d, + 0x31c4ef, + 0x3117f6, + 0x2f6da9, + 0x330f1a, + 0x2ea127, + 0x2ea349, + 0x31b4ac, + 0x2f0c3a, + 0x3007cc, + 0x336c5d, + 0x2ea56a, + 0x2f8c5c, + 0x2ed7f1, + 0x2ee19d, + 0x33f331, + 0x2eeef2, + 0x2c1107, + 0x3299a7, + 0x2e59a7, + 0x2f5c62, + 0x2fd99b, + 0x308897, + 0x2f6510, + 0x320000, + 0x2f5f49, + 0x30c0f1, + 0x2f1b5e, + 0x32af0c, + 0x2fe66a, + 0x2f9497, + 0x2e1b5a, + 0x2e29f6, + 0x3054d5, + 0x2e4b86, + 0x2f4dcf, + 0x2e3fa3, + 0x2f622e, + 0x2f9750, + 0x30ddd5, + 0x2e0000, + 0x305156, + 0x2e3876, + 0x3029c4, + 0x2fba45, + 0x31b097, + 0x2e3adb, + 0x35cfa8, + 0x2e1dcd, + 0x2e2c63, + 0x2e62fc, + 0x2e0286, + 0x309ccc, + 0x3afc23, + 0x2e251a, + 0x2c1b62, + 0x33a7d9, + 0x30ca9f, + 0x2f4219, + 0x30cdd6, + 0x30fd0b, + 0x30c768, + 0x30f3c2, + 0x2facfe, + 0x2f761f, + 0x2fe8f8, + 0x2f9a08, + 0x2fee13, + 0x2faa4c, + 0x2ff83d, + 0x2f9cbf, + 0x2fd706, + 0x2fa798, + 0x2ffac5, + 0x2f9f76, + 0x2e0a0c, + 0x2fa22d, + 0x2ffd4c, + 0x2f8f1e, + 0x2e778f, + 0x2c16ad, + 0x2d796f, + 0x2eff36 +] \ No newline at end of file diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index d566b86a1ca5..3aade407a2e2 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -3,6 +3,7 @@ from .Names import LocationName from .Items import copy_ability_table import typing +from BaseClasses import MultiWorld if typing.TYPE_CHECKING: from . import KDL3World @@ -26,6 +27,7 @@ def can_reach_level(state: "CollectionState", player: int, level: int, player_le else: return state.can_reach(location_table[player_levels[level - 1][5]], "Location", player) +#def can_reach_rick(state: "CollectionState", multiworld: MultiWorld, player: int) -> bool: def can_reach_coo(state: "CollectionState", player: int) -> bool: return state.can_reach("Grass Land 3 - Complete", "Location", player) or \ From fe2bff6dec751408c280adea2bc9e9a7a4ea684d Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 12 Jul 2023 21:20:07 -0500 Subject: [PATCH 083/165] initial base for room logic, animal rando --- worlds/kdl3/Items.py | 10 + worlds/kdl3/Names/AnimalFriendSpawns.py | 142 + worlds/kdl3/Names/LocationName.py | 4 + worlds/kdl3/Options.py | 14 + worlds/kdl3/Regions.py | 99 +- worlds/kdl3/Rom.py | 410 +- worlds/kdl3/Room.py | 116 +- worlds/kdl3/Rules.py | 135 +- worlds/kdl3/__init__.py | 18 +- worlds/kdl3/data/Rooms.json | 9266 +++++++++++++++++++++++ worlds/kdl3/test/TestLocations.py | 27 +- 11 files changed, 9672 insertions(+), 569 deletions(-) create mode 100644 worlds/kdl3/data/Rooms.json diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index 4b7bfde417d3..0a00704b830d 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -33,6 +33,15 @@ class KDL3Item(Item): "Pitch": ItemData(0x770015, True) } +animal_friend_spawn_table = { + "Rick Spawn": ItemData(None, True), + "Kine Spawn": ItemData(None, True), + "Coo Spawn": ItemData(None, True), + "Nago Spawn": ItemData(None, True), + "ChuChu Spawn": ItemData(None, True), + "Pitch Spawn": ItemData(None, True) +} + misc_item_table = { "Heart Star": ItemData(0x770020, True, True), "1-Up": ItemData(0x770021, False), @@ -56,6 +65,7 @@ class KDL3Item(Item): item_table = { **copy_ability_table, **animal_friend_table, + **animal_friend_spawn_table, **misc_item_table, **trap_item_table } diff --git a/worlds/kdl3/Names/AnimalFriendSpawns.py b/worlds/kdl3/Names/AnimalFriendSpawns.py index ccba84db9c10..4520cf143803 100644 --- a/worlds/kdl3/Names/AnimalFriendSpawns.py +++ b/worlds/kdl3/Names/AnimalFriendSpawns.py @@ -55,3 +55,145 @@ cloudy_park_1_a4 = "Cloudy Park 1 - Animal 4" # Kine cloudy_park_1_a5 = "Cloudy Park 1 - Animal 5" # ChuChu cloudy_park_1_a6 = "Cloudy Park 1 - Animal 6" # Pitch +cloudy_park_2_a1 = "Cloudy Park 2 - Animal 1" # Nago +cloudy_park_2_a2 = "Cloudy Park 2 - Animal 2" # Pitch +cloudy_park_2_a3 = "Cloudy Park 2 - Animal 3" # ChuChu +cloudy_park_3_a1 = "Cloudy Park 3 - Animal 1" # Kine +cloudy_park_3_a2 = "Cloudy Park 3 - Animal 2" # Rick +cloudy_park_3_a3 = "Cloudy Park 3 - Animal 3" # ChuChu +cloudy_park_4_a1 = "Cloudy Park 4 - Animal 1" # Coo +cloudy_park_4_a2 = "Cloudy Park 4 - Animal 2" # ChuChu +cloudy_park_5_a1 = "Cloudy Park 5 - Animal 1" # Rick +cloudy_park_5_a2 = "Cloudy Park 5 - Animal 2" # Coo +cloudy_park_6_a1 = "Cloudy Park 6 - Animal 1" # Nago +cloudy_park_6_a2 = "Cloudy Park 6 - Animal 2" # Coo +cloudy_park_6_a3 = "Cloudy Park 6 - Animal 3" # Rick +iceberg_1_a1 = "Iceberg 1 - Animal 1" # Pitch +iceberg_1_a2 = "Iceberg 1 - Animal 2" # Rick +iceberg_2_a1 = "Iceberg 2 - Animal 1" # Nago +iceberg_2_a2 = "Iceberg 2 - Animal 2" # Pitch +iceberg_3_a1 = "Iceberg 3 - Animal 1" # Pitch +iceberg_3_a2 = "Iceberg 3 - Animal 2" # Coo +iceberg_3_a3 = "Iceberg 3 - Animal 3" # Nago +iceberg_3_a4 = "Iceberg 3 - Animal 4" # Rick +iceberg_3_a5 = "Iceberg 3 - Animal 5" # Kine +iceberg_4_a1 = "Iceberg 4 - Animal 1" # ChuChu +iceberg_4_a2 = "Iceberg 4 - Animal 2" # Coo +iceberg_4_a3 = "Iceberg 4 - Animal 3" # Pitch +iceberg_4_a4 = "Iceberg 4 - Animal 4" # Coo +iceberg_4_a5 = "Iceberg 4 - Animal 5" # Rick +iceberg_5_a1 = "Iceberg 5 - Animal 1" # Kine +iceberg_5_a2 = "Iceberg 5 - Animal 2" # Rick +iceberg_5_a3 = "Iceberg 5 - Animal 3" # Pitch +iceberg_5_a4 = "Iceberg 5 - Animal 4" # ChuChu +iceberg_5_a5 = "Iceberg 5 - Animal 5" # Kine +iceberg_5_a6 = "Iceberg 5 - Animal 6" # Coo +iceberg_5_a7 = "Iceberg 5 - Animal 7" # Rick +iceberg_5_a8 = "Iceberg 5 - Animal 8" # ChuChu +iceberg_6_a1 = "Iceberg 6 - Animal 1" # Rick +iceberg_6_a2 = "Iceberg 6 - Animal 2" # Coo +iceberg_6_a3 = "Iceberg 6 - Animal 3" # Nago +iceberg_6_a4 = "Iceberg 6 - Animal 4" # Kine +iceberg_6_a5 = "Iceberg 6 - Animal 5" # ChuChu +iceberg_6_a6 = "Iceberg 6 - Animal 6" # Nago + +animal_friend_spawns = { + grass_land_1_a1: "Nago Spawn", + grass_land_1_a2: "Rick Spawn", + grass_land_2_a1: "ChuChu Spawn", + grass_land_2_a2: "Pitch Spawn", + grass_land_3_a1: "Kine Spawn", + grass_land_3_a2: "Coo Spawn", + grass_land_4_a1: "ChuChu Spawn", + grass_land_4_a2: "Nago Spawn", + grass_land_5_a1: "Coo Spawn", + grass_land_5_a2: "Kine Spawn", + grass_land_5_a3: "Nago Spawn", + grass_land_5_a4: "Rick Spawn", + grass_land_6_a1: "Rick Spawn", + grass_land_6_a2: "ChuChu Spawn", + grass_land_6_a3: "Nago Spawn", + grass_land_6_a4: "Coo Spawn", + ripple_field_1_a1: "Pitch Spawn", + ripple_field_1_a2: "Nago Spawn", + ripple_field_2_a1: "Kine Spawn", + ripple_field_2_a2: "ChuChu Spawn", + ripple_field_2_a3: "Rick Spawn", + ripple_field_2_a4: "Coo Spawn", + ripple_field_3_a1: "Kine Spawn", + ripple_field_3_a2: "Rick Spawn", + ripple_field_4_a1: "ChuChu Spawn", + ripple_field_4_a2: "Kine Spawn", + ripple_field_4_a3: "Nago Spawn", + ripple_field_5_a1: "Kine Spawn", + ripple_field_5_a2: "Pitch Spawn", + ripple_field_6_a1: "Nago Spawn", + ripple_field_6_a2: "Pitch Spawn", + ripple_field_6_a3: "Rick Spawn", + ripple_field_6_a4: "Coo Spawn", + sand_canyon_1_a1: "Rick Spawn", + sand_canyon_1_a2: "Pitch Spawn", + sand_canyon_2_a1: "ChuChu Spawn", + sand_canyon_2_a2: "Coo Spawn", + sand_canyon_3_a1: "Pitch Spawn", + sand_canyon_3_a2: "Coo Spawn", + sand_canyon_3_a3: "ChuChu Spawn", + sand_canyon_4_a1: "Rick Spawn", + sand_canyon_4_a2: "Pitch Spawn", + sand_canyon_4_a3: "Nago Spawn", + sand_canyon_5_a1: "Rick Spawn", + sand_canyon_5_a2: "ChuChu Spawn", + sand_canyon_6_a1: "Coo Spawn", + sand_canyon_6_a2: "Kine Spawn", + sand_canyon_6_a3: "Rick Spawn", + sand_canyon_6_a4: "ChuChu Spawn", + sand_canyon_6_a5: "Nago Spawn", + sand_canyon_6_a6: "Pitch Spawn", + cloudy_park_1_a1: "Rick Spawn", + cloudy_park_1_a2: "Nago Spawn", + cloudy_park_1_a3: "Coo Spawn", + cloudy_park_1_a4: "Kine Spawn", + cloudy_park_1_a5: "ChuChu Spawn", + cloudy_park_1_a6: "Pitch Spawn", + cloudy_park_2_a1: "Nago Spawn", + cloudy_park_2_a2: "Pitch Spawn", + cloudy_park_2_a3: "ChuChu Spawn", + cloudy_park_3_a1: "Kine Spawn", + cloudy_park_3_a2: "Rick Spawn", + cloudy_park_3_a3: "ChuChu Spawn", + cloudy_park_4_a1: "Coo Spawn", + cloudy_park_4_a2: "ChuChu Spawn", + cloudy_park_5_a1: "Rick Spawn", + cloudy_park_5_a2: "Coo Spawn", + cloudy_park_6_a1: "Nago Spawn", + cloudy_park_6_a2: "Coo Spawn", + cloudy_park_6_a3: "Rick Spawn", + iceberg_1_a1: "Pitch Spawn", + iceberg_1_a2: "Rick Spawn", + iceberg_2_a1: "Nago Spawn", + iceberg_2_a2: "Pitch Spawn", + iceberg_3_a1: "Pitch Spawn", + iceberg_3_a2: "Coo Spawn", + iceberg_3_a3: "Nago Spawn", + iceberg_3_a4: "Rick Spawn", + iceberg_3_a5: "Kine Spawn", + iceberg_4_a1: "ChuChu Spawn", + iceberg_4_a2: "Coo Spawn", + iceberg_4_a3: "Pitch Spawn", + iceberg_4_a4: "Coo Spawn", + iceberg_4_a5: "Rick Spawn", + iceberg_5_a1: "Kine Spawn", + iceberg_5_a2: "Rick Spawn", + iceberg_5_a3: "Pitch Spawn", + iceberg_5_a4: "ChuChu Spawn", + iceberg_5_a5: "Kine Spawn", + iceberg_5_a6: "Coo Spawn", + iceberg_5_a7: "Rick Spawn", + iceberg_5_a8: "ChuChu Spawn", + iceberg_6_a1: "Rick Spawn", + iceberg_6_a2: "Coo Spawn", + iceberg_6_a3: "Nago Spawn", + iceberg_6_a4: "Kine Spawn", + iceberg_6_a5: "ChuChu Spawn", + iceberg_6_a6: "Nago Spawn", +} diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index ae7cc5d8aecb..006e26230cd5 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -138,6 +138,10 @@ "Iceberg": 5, } +level_names_inverse = { + level_names[level]: level for level in level_names +} + # Boss Names boss_names = { "Whispy Woods": 0x770200, diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index a91ae1a53442..77e887ce9443 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -113,6 +113,19 @@ class BossShuffleAllowBB(Choice): default = 0 +class AnimalRandomization(Choice): + """ + Disabled: all animal positions will be vanilla. + Shuffled: all animal positions will be shuffled amongst each other. + Full: random animals will be placed across the levels. At least one of each animal is guaranteed. + """ + display_name = "Animal Randomization" + option_disabled = 0 + option_shuffled = 1 + option_full = 2 + default = 0 + + class StrictBosses(DefaultOnToggle): """ If enabled, one will not be able to move onto the next world until the previous world's boss has been purified. @@ -331,6 +344,7 @@ class MusicShuffle(Choice): "stage_shuffle": LevelShuffle, "boss_shuffle": BossShuffle, "allow_bb": BossShuffleAllowBB, + "animal_randomization": AnimalRandomization, "strict_bosses": StrictBosses, "open_world": OpenWorld, "ow_boss_requirement": OpenWorldBossRequirement, diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index d7d9a36f7720..866b85158549 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -1,9 +1,16 @@ +import json +import os import typing +from pkgutil import get_data + from BaseClasses import Entrance, Region from worlds.AutoWorld import World from .Locations import KDL3Location, location_table, level_consumables from .Names import LocationName +from .Names.AnimalFriendSpawns import animal_friend_spawns from .Options import BossShuffle +from .Room import Room +from ..generic.Rules import add_item_rule, add_rule if typing.TYPE_CHECKING: from . import KDL3World @@ -31,7 +38,86 @@ def generate_valid_level(level, stage, possible_stages, slot_random): return new_stage -#def generate_rooms(world: World, door_shuffle: bool, ) +def generate_rooms(world: World, door_shuffle: bool, level_regions: typing.Dict[int, Region]): + level_names = {LocationName.level_names[level]: level for level in LocationName.level_names} + room_data = json.loads(get_data(__name__, os.path.join("data", "Rooms.json"))) + rooms: typing.Dict[str, Room] = dict() + for room_entry in room_data: + room = Room(room_entry["name"], world.player, world.multiworld, None, room_entry["level"], room_entry["stage"], + room_entry["room"], room_entry["pointer"], room_entry["music"], room_entry["default_exits"]) + room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else + None for location in room_entry["locations"] if not any([x in location for x in ["1-Up", "Maxim"]]) or + world.multiworld.consumables[world.player]}, KDL3Location) + rooms[room.name] = room + world.multiworld.regions.extend([rooms[room] for room in rooms]) + # fill animals, and set item rule + animal_friends = dict() + if world.multiworld.animal_randomization[world.player] == 1: + animal_pool = [animal_friend_spawns[spawn] for spawn in animal_friend_spawns + if spawn != "Ripple Field 5 - Animal 2"] + if world.multiworld.accessibility[world.player] == 2: + animal_pool.append("Pitch Spawn") + world.multiworld.per_slot_randoms[world.player].shuffle( + animal_pool) # TODO: change to world.random once 0.4.1 support is deprecated + if world.multiworld.accessibility[world.player] != 2: + animal_pool.insert(28, "Pitch Spawn") + # Ripple Field 5 - Animal 2 needs to be Pitch to ensure accessibility on non-minimal and non-door rando + animal_friends = dict(zip(animal_friend_spawns.keys(), animal_pool)) + elif world.multiworld.animal_randomization[world.player] == 2: + animal_base = ["Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn"] + animal_pool = [world.multiworld.per_slot_randoms[world.player].choice(animal_base) + for _ in range(len(animal_friend_spawns) - + (7 if world.multiworld.accessibility[world.player] < 2 else 6))] + # have to guarantee one of each animal + animal_pool.extend(animal_base) + world.multiworld.per_slot_randoms[world.player].shuffle( + animal_pool) # TODO: change to world.random once 0.4.1 support is deprecated + if world.multiworld.accessibility[world.player] != 2: + animal_pool.insert(28, "Pitch Spawn") + animal_friends = dict(zip(animal_friend_spawns.keys(), animal_pool)) + else: + animal_friends = animal_friend_spawns.copy() + for name in rooms: + room = rooms[name] + for location in room.locations: + if "Animal" in location.name: + add_item_rule(location, lambda item: item.name in { + "Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn" + }) + location.place_locked_item(world.create_item(animal_friends[location.name])) + first_rooms: typing.Dict[int, Room] = dict() + if not door_shuffle: + for name in rooms: + room = rooms[name] + if room.room == 0: + if room.stage == 7: + first_rooms[0x770200 + room.level - 1] = room + else: + first_rooms[0x770000 + ((room.level - 1) * 6) + room.stage] = room + exits = dict() + for def_exit in room.default_exits: + target = f"{level_names[room.level]} {room.stage} - {def_exit['room']}" + access_rule = tuple(def_exit["access_rule"]) + exits[target] = lambda state, rule=access_rule: state.has_all(rule, world.player) + room.add_exits( + exits.keys(), + exits + ) + if any(["Complete" in location.name for location in room.locations]): + room.add_locations({f"{level_names[room.level]} {room.stage} - Stage Completion": None}, KDL3Location) + + for level in world.player_levels[world.player]: + for stage in range(6): + proper_stage = world.player_levels[world.player][level][stage] + level_regions[level].add_exits([first_rooms[proper_stage].name], + {first_rooms[proper_stage].name: + (lambda state: True) if world.multiworld.open_world[world.player] or + stage == 0 else lambda state, level=level, stage=stage: state.has( + f"{LocationName.level_names_inverse[level]} " + f"{f'{stage}'}" + f" - Stage Completion", world.player)}) + else: + level_regions[level].add_exits([first_rooms[0x770200 + level - 1].name]) def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bool) -> dict: @@ -169,16 +255,7 @@ def create_levels(world: World) -> None: level_shuffle == 2) else: world.player_levels[world.player] = default_levels.copy() - for level in levels: - levels[level].add_locations(generate_locations_from_stages(world.player_levels[world.player][level], - world.multiworld.consumables[world.player]), - KDL3Location) - - for boss_flag, idx, level in zip(["Level 1 Boss", "Level 2 Boss", - "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], - [0x770200, 0x770201, 0x770202, 0x770203, 0x770204], - [level1, level2, level3, level4, level5]): - level.add_locations({boss_flag: None, location_table[idx]: idx, }, KDL3Location) + generate_rooms(world, False, levels) level6.add_locations({LocationName.goals[world.multiworld.goal[world.player]]: None}, KDL3Location) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 770877d71ebc..d4e35ebc3f01 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -12,6 +12,8 @@ from .Compression import hal_decompress import bsdiff4 +from .Room import Room + KDL3UHASH = "201e7658f6194458a3869dde36bf8ec2" KDL3JHASH = "b2f2d004ea640c3db66df958fce122b2" @@ -148,402 +150,15 @@ 39, # Animal Friend 2 40, # Animal Friend 3 ] - +# extra room pointers we don't want to track other than for music room_pointers = [ - 0x346711, - 0x3365b5, - 0x2d2d0a, - 0x3513aa, - 0x2d7256, - 0x2c1c53, - 0x3240a3, - 0x2eafe5, - 0x345ead, - 0x2d51ad, - 0x3698a6, - 0x2d4229, - 0x2c0f25, - 0x300f8b, - 0x30e74b, - 0x30d442, - 0x2d29a8, - 0x2d7531, - 0x2dbe33, - 0x2f124c, - 0x2c1e35, - 0x34f7b4, - 0x346f71, - 0x2e60a9, - 0x38cdda, - 0x326e14, - 0x35608f, - 0x30387f, - 0x2e5299, - 0x2d9ee2, - 0x2e70be, - 0x2c12e9, - 0x32688d, - 0x2e850e, - 0x32c42b, - 0x2d43bb, - 0x2d5f45, - 0x2d33af, - 0x2c0c52, - 0x31ac7f, - 0x3386e8, - 0x33ce35, - 0x338049, - 0x32b461, - 0x354403, - 0x2ef2a1, - 0x2e8098, - 0x2e203d, - 0x2c03d9, - 0x2d88a9, - 0x320bef, - 0x36c250, - 0x2d1a48, - 0x364dac, - 0x2d623f, - 0x2e8ff9, - 0x2e896e, - 0x2eca27, - 0x2c15bc, - 0x330000, - 0x2f0f43, - 0x34a947, - 0x3810d7, - 0x2d5c48, - 0x2f734e, - 0x2d5dc7, - 0x2c1a71, - 0x35ab46, - 0x370000, - 0x38b164, - 0x2edfaf, - 0x2d54ba, - 0x2d95ee, - 0x2c13da, - 0x303c20, - 0x2f092c, - 0x2d3d6e, - 0x2e0f07, - 0x2d9886, - 0x2c079d, - 0x2e6c2d, - 0x315bf5, - 0x30260c, - 0x331e0f, - 0x2e8b9d, - 0x2e9225, - 0x33ae5e, - 0x305853, - 0x2d248e, - 0x3171b1, - 0x362188, - 0x371abf, - 0x3be88d, - 0x2e2ecf, - 0x30f0a5, - 0x3530c8, - 0x3942fa, - 0x2e754a, - 0x2d36f9, - 0x2e6e76, - 0x2c0a70, - 0x2d01c8, - 0x2d5640, - 0x3781f5, - 0x2f3054, - 0x2fcf3f, - 0x358632, - 0x310000, - 0x36b7f7, - 0x37426b, - 0x2d151b, - 0x2ed5fe, - 0x2c0b61, - 0x302d7a, - 0x35c6ab, - 0x3046d4, - 0x3598d4, - 0x38bfea, - 0x34341c, - 0x30e0fd, - 0x2fe3dc, - 0x2d9b16, - 0x2c06ac, - 0x37f992, - 0x2d0e22, - 0x35e194, - 0x31ccf3, - 0x2ef0cc, - 0x3262f5, - 0x39fe24, - 0x2ee760, - 0x2eb616, - 0x34b166, - 0x2db285, - 0x2c2017, - 0x361664, - 0x2d4097, - 0x38dbbe, - 0x3422e6, - 0x366383, - 0x2d60c3, - 0x318f61, - 0x2c1016, - 0x2d49f9, - 0x35bda2, - 0x2d1c01, - 0x357cd0, - 0x341189, - 0x32791c, - 0x2d188f, - 0x2f3943, - 0x352724, - 0x2dcee6, - 0x2c088e, - 0x37e296, - 0x2e944e, - 0x2ea788, - 0x342b83, - 0x379af5, - 0x2e7304, - 0x3379a9, - 0x2d3a3c, - 0x2c1980, - 0x37a720, - 0x329449, - 0x2d6c91, - 0x2d73c5, - 0x307e62, - 0x308bfb, - 0x307af9, - 0x3092bb, - 0x30741d, - 0x308532, - 0x30778e, - 0x3081ca, - 0x2d9c5d, - 0x2e050b, - 0x2d6b1b, - 0x2e3d40, - 0x2d5ac9, - 0x2d0fe2, - 0x2d11a1, - 0x2da65b, - 0x2d63bb, - 0x2d5026, - 0x2d69a3, - 0x2d071a, - 0x328979, - 0x2efba6, - 0x2ec82a, - 0x2ebe33, - 0x2ecc24, - 0x2ece21, - 0x2d0390, - 0x2d9204, - 0x2edbd2, - 0x2e9ce1, - 0x2e9675, - 0x2e9899, - 0x2e9abd, - 0x2d90b4, - 0x2ee949, - 0x2d57c5, - 0x2ec032, - 0x2ec230, - 0x2ec42e, - 0x2ed40b, - 0x2d99cf, - 0x2c0d43, - 0x2da51d, - 0x3069bb, - 0x2ef813, - 0x32237a, - 0x2ebc2f, - 0x33d479, - 0x2e5e55, - 0x35f378, - 0x2d1360, - 0x34e0bf, - 0x2ef9dd, - 0x3211d6, - 0x35b478, - 0x2d2642, - 0x2c097f, - 0x2ff32b, - 0x316055, - 0x3251de, - 0x32fb1f, - 0x34c17c, - 0x31f496, - 0x2d8a05, - 0x2d8e0a, - 0x2da2a1, - 0x2c179e, - 0x2f50bb, - 0x30f9f7, - 0x311339, - 0x2db020, - 0x3145df, - 0x2d4e9c, - 0x3eff12, - 0x2c05bb, - 0x2ee389, - 0x2eeb2f, - 0x327e99, - 0x324c23, - 0x32d3b4, - 0x32d8cc, - 0x31a43e, - 0x2d486a, - 0x2d7f0c, - 0x2de601, - 0x2c11f8, - 0x30b736, - 0x2e8dcc, - 0x36fee2, - 0x2fc76a, - 0x2da024, - 0x2d66b2, - 0x306d33, - 0x2da8d4, - 0x2c1f26, - 0x31e4d7, - 0x31a018, - 0x2e360e, - 0x2fca07, - 0x2f8998, - 0x3186f1, - 0x3164b4, - 0x31c8f1, - 0x2e313b, - 0x2f2460, - 0x2fcca3, - 0x2e0c8a, - 0x2e54f4, - 0x2d3f03, - 0x2ef474, - 0x2eb822, - 0x2c14cb, - 0x2dc19a, - 0x335127, - 0x36e0ec, - 0x322f30, - 0x2ed217, - 0x315791, - 0x33f935, - 0x2d8f5f, - 0x2c2108, - 0x2f67f0, - 0x32e2b9, - 0x350000, - 0x2e574e, - 0x2e503e, - 0x2fbce7, - 0x31e8c9, - 0x3104d5, - 0x2db153, - 0x2ea9a4, - 0x2c0e34, - 0x34b972, - 0x2e13f9, - 0x373549, - 0x37b340, - 0x2e5c00, - 0x2dfd32, - 0x374f55, - 0x2d9da0, - 0x2c188f, - 0x31f87f, - 0x337304, - 0x321d9a, - 0x30434d, - 0x31c4ef, - 0x3117f6, - 0x2f6da9, - 0x330f1a, - 0x2ea127, - 0x2ea349, - 0x31b4ac, - 0x2f0c3a, - 0x3007cc, - 0x336c5d, - 0x2ea56a, - 0x2f8c5c, - 0x2ed7f1, - 0x2ee19d, - 0x33f331, - 0x2eeef2, - 0x2c1107, - 0x3299a7, - 0x2e59a7, - 0x2f5c62, - 0x2fd99b, - 0x308897, - 0x2f6510, - 0x320000, - 0x2f5f49, - 0x30c0f1, - 0x2f1b5e, - 0x32af0c, - 0x2fe66a, - 0x2f9497, - 0x2e1b5a, - 0x2e29f6, - 0x3054d5, - 0x2e4b86, - 0x2f4dcf, - 0x2e3fa3, - 0x2f622e, - 0x2f9750, - 0x30ddd5, - 0x2e0000, - 0x305156, - 0x2e3876, - 0x3029c4, - 0x2fba45, - 0x31b097, - 0x2e3adb, - 0x35cfa8, - 0x2e1dcd, - 0x2e2c63, - 0x2e62fc, - 0x2e0286, - 0x309ccc, - 0x3afc23, - 0x2e251a, - 0x2c1b62, - 0x33a7d9, - 0x30ca9f, - 0x2f4219, - 0x30cdd6, - 0x30fd0b, - 0x30c768, - 0x30f3c2, - 0x2facfe, - 0x2f761f, - 0x2fe8f8, - 0x2f9a08, - 0x2fee13, - 0x2faa4c, - 0x2ff83d, - 0x2f9cbf, - 0x2fd706, - 0x2fa798, - 0x2ffac5, - 0x2f9f76, - 0x2e0a0c, - 0x2fa22d, - 0x2ffd4c, - 0x2f8f1e, - 0x2e778f, - 0x2c16ad, - 0x2d796f, - 0x2eff36 + 3079990, # Zero + 2983409, # BB Whispy + 3150688, # BB Acro + 2991071, # BB PonCon + 2998969, # BB Ado + 2980927, # BB Dedede + 2894290 # BB Zero ] @@ -1369,6 +984,8 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, music_map[5] = multiworld.per_slot_randoms[player].choice(music_choices) # Heart Star music doesn't work on regular stages music_map[8] = multiworld.per_slot_randoms[player].choice(music_choices) + for room in [region for region in multiworld.regions if region.player == player and isinstance(region, Room)]: + room.patch(rom) for room in room_pointers: old_music = rom.read_byte(room + 2) rom.write_byte(room + 2, music_map[old_music]) @@ -1418,6 +1035,9 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, if bb_boss_enabled[i]: rom.write_bytes(0x3F0000 + (level_pointers[0x770200 + i]), struct.pack("I", bb_bosses[0x770200 + i])) + # copy ability shuffle + # copy ability array at 0xB3CAC + # write jumping goal rom.write_bytes(0x94F8, struct.pack("H", multiworld.jumping_target[player])) rom.write_bytes(0x944E, struct.pack("H", multiworld.jumping_target[player])) diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index b98dc473357e..f198d695f60d 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -1,51 +1,46 @@ import struct import typing -from BaseClasses import CollectionState +from BaseClasses import CollectionState, Region from struct import unpack -from .Rom import RomData -from .Locations import KDL3Location +if typing.TYPE_CHECKING: + from .Rom import RomData -class Room: - exits: typing.List = list() +animal_map = { + "Rick Spawn": 0, + "Kine Spawn": 1, + "Coo Spawn": 2, + "Nago Spawn": 3, + "ChuChu Spawn": 4, + "Pitch Spawn": 5 +} + + +class Room(Region): pointer: int = 0 level: int = 0 stage: int = 0 - access_rule: typing.Callable[["CollectionState"], bool] = staticmethod(lambda state: True) - animal_access_rule: typing.Callable[["CollectionState"], bool] = staticmethod(lambda state: True) - parents: typing.List = list() - locations: typing.Dict[KDL3Location, typing.Callable[["CollectionState"], bool]] + room: int = 0 + music: int = 0 + default_exits: typing.List[typing.Dict[str, typing.Union[int, typing.List[str]]]] - def __init__(self, exits, level, stage, access_rule, animal_access_rule, parents, locations): - self.exits = exits + def __init__(self, name, player, multiworld, hint, level, stage, room, pointer, music, default_exits): + super().__init__(name, player, multiworld, hint) self.level = level self.stage = stage - self.access_rule = access_rule - self.animal_access_rule = animal_access_rule - self.parents = parents - self.locations = locations - - - def can_reach(self, state: "CollectionState", need_animal: bool): - if len(self.parents) == 0 or any([x.can_reach(state, need_animal) for x in self.parents]): - if need_animal: - return self.access_rule(state) & self.animal_access_rule(state) - else: - return self.access_rule(state) - - def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Dict[int, int]]], should_animal: bool): - if music: - if isinstance(music, int): - rom.write_byte(self.pointer + 2, music) - else: - old_music = rom.read_byte(self.pointer + 2) - rom.write_byte(self.pointer + 2, music[old_music]) - if should_animal: - animals = [x.item for x in self.locations if "Animal" in x.name] + self.room = room + self.pointer = pointer + self.music = music + self.default_exits = default_exits + + def patch(self, rom: "RomData"): + rom.write_byte(self.pointer + 2, self.music) + animals = [x.item for x in self.locations if "Animal" in x.name] + if len(animals) > 0: entity_pointer = self.pointer + 168 - while unpack("H", rom.read_bytes(entity_pointer, 2)) != 0xFFFF: + while unpack("H", rom.read_bytes(entity_pointer, 2))[0] != 0xFFFF: entity_pointer += 2 - while unpack("H", rom.read_bytes(entity_pointer, 2)) != 0xFFFF: + while unpack("H", rom.read_bytes(entity_pointer, 2))[0] != 0xFFFF: entity_pointer += 2 # we have to move two lists before reaching entities entity_count = unpack("H", rom.read_bytes(entity_pointer, 2))[0] @@ -53,12 +48,17 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di if entity_count == 0xFFFF: return entity_pointer += 2 # we don't need size + current_animal = 0 for _ in range(entity_count): entity_pointer += 4 entity_type = struct.unpack("H", rom.read_bytes(entity_pointer, 2))[0] entity_pointer += 2 if entity_type == 0x02: entity_pointer += 1 # don't need idx + rom.write_byte(entity_pointer, animal_map[animals[current_animal]]) + entity_pointer += 1 + else: + entity_pointer += 2 room_data = [ @@ -68,6 +68,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x3513aa, 0x2d7256, 0x2c1c53, + 0x3240a3, 0x2eafe5, 0x345ead, @@ -75,6 +76,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x3698a6, 0x2d4229, 0x2c0f25, + 0x300f8b, 0x30e74b, 0x30d442, @@ -83,6 +85,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2dbe33, 0x2f124c, 0x2c1e35, + 0x34f7b4, 0x346f71, 0x2e60a9, @@ -94,6 +97,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2d9ee2, 0x2e70be, 0x2c12e9, + 0x32688d, 0x2e850e, 0x32c42b, @@ -102,6 +106,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2d33af, 0x2c0c52, 0x31ac7f, + 0x3386e8, 0x33ce35, 0x338049, @@ -111,7 +116,9 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2e8098, 0x2e203d, 0x2c03d9, + 0x2d88a9, + 0x320bef, 0x36c250, 0x2d1a48, @@ -121,6 +128,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2e896e, 0x2eca27, 0x2c15bc, + 0x330000, 0x2f0f43, 0x34a947, @@ -129,6 +137,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2f734e, 0x2d5dc7, 0x2c1a71, + 0x35ab46, 0x370000, 0x38b164, @@ -137,6 +146,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2d95ee, 0x2c13da, 0x303c20, + 0x2f092c, 0x2d3d6e, 0x2e0f07, @@ -151,6 +161,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x33ae5e, 0x305853, 0x2d248e, + 0x3171b1, 0x362188, 0x371abf, @@ -163,6 +174,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2d36f9, 0x2e6e76, 0x2c0a70, + 0x2d01c8, 0x2d5640, 0x3781f5, @@ -175,7 +187,9 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2d151b, 0x2ed5fe, 0x2c0b61, + 0x302d7a, + 0x35c6ab, 0x3046d4, 0x3598d4, @@ -185,6 +199,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2fe3dc, 0x2d9b16, 0x2c06ac, + 0x37f992, 0x2d0e22, 0x35e194, @@ -197,6 +212,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x34b166, 0x2db285, 0x2c2017, + 0x361664, 0x2d4097, 0x38dbbe, @@ -206,6 +222,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x318f61, 0x2c1016, 0x2d49f9, + 0x35bda2, 0x2d1c01, 0x357cd0, @@ -216,6 +233,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x352724, 0x2dcee6, 0x2c088e, + 0x37e296, 0x2e944e, 0x2ea788, @@ -226,6 +244,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2d3a3c, 0x2c1980, 0x37a720, + 0x329449, 0x2d6c91, 0x2d73c5, @@ -271,7 +290,9 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2ed40b, 0x2d99cf, 0x2c0d43, + 0x2da51d, + 0x3069bb, 0x2ef813, 0x32237a, @@ -286,6 +307,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x35b478, 0x2d2642, 0x2c097f, + 0x2ff32b, 0x316055, 0x3251de, @@ -296,6 +318,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2d8e0a, 0x2da2a1, 0x2c179e, + 0x2f50bb, 0x30f9f7, 0x311339, @@ -304,6 +327,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2d4e9c, 0x3eff12, 0x2c05bb, + 0x2ee389, 0x2eeb2f, 0x327e99, @@ -315,6 +339,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2d7f0c, 0x2de601, 0x2c11f8, + 0x30b736, 0x2e8dcc, 0x36fee2, @@ -324,6 +349,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x306d33, 0x2da8d4, 0x2c1f26, + 0x31e4d7, 0x31a018, 0x2e360e, @@ -341,7 +367,9 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2ef474, 0x2eb822, 0x2c14cb, + 0x2dc19a, + 0x335127, 0x36e0ec, 0x322f30, @@ -350,6 +378,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x33f935, 0x2d8f5f, 0x2c2108, + 0x2f67f0, 0x32e2b9, 0x350000, @@ -361,6 +390,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2db153, 0x2ea9a4, 0x2c0e34, + 0x34b972, 0x2e13f9, 0x373549, @@ -370,6 +400,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x374f55, 0x2d9da0, 0x2c188f, + 0x31f87f, 0x337304, 0x321d9a, @@ -391,6 +422,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x33f331, 0x2eeef2, 0x2c1107, + 0x3299a7, 0x2e59a7, 0x2f5c62, @@ -429,6 +461,7 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x3afc23, 0x2e251a, 0x2c1b62, + 0x33a7d9, 0x30ca9f, 0x2f4219, @@ -454,6 +487,15 @@ def patch(self, rom: RomData, music: typing.Optional[typing.Union[int, typing.Di 0x2f8f1e, 0x2e778f, 0x2c16ad, + 0x2d796f, - 0x2eff36 -] \ No newline at end of file + + 0x2eff36, + + 0x2d85f1, + 0x301360, + 0x2da3df, + 0x2dc2b9, + 0x2d7c3f, + 0x2c29d2 +] diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 3aade407a2e2..1da14f369c10 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -1,6 +1,6 @@ from worlds.generic.Rules import set_rule, add_rule from .Locations import location_table, level_consumables -from .Names import LocationName +from .Names import LocationName, AnimalFriendSpawns from .Items import copy_ability_table import typing from BaseClasses import MultiWorld @@ -10,115 +10,62 @@ from BaseClasses import CollectionState -def can_reach_level(state: "CollectionState", player: int, level: int, player_levels: dict, open_world: bool, +def can_reach_level(state: "CollectionState", player: int, level: int, open_world: bool, ow_boss_req: int): if level == 1: return True else: if open_world: - finishable_stages = 0 - for stage in player_levels[level - 1]: - if state.can_reach(location_table[stage], "Location", player): - finishable_stages += 1 - if finishable_stages >= ow_boss_req: - return True - else: - return False + return state.has(f"{LocationName.level_names_inverse[level-1]} - Stage Completion", player, ow_boss_req) else: - return state.can_reach(location_table[player_levels[level - 1][5]], "Location", player) + return state.has(f"{LocationName.level_names_inverse[level-1]} 6 - Stage Completion", player) + + +def can_reach_rick(state: "CollectionState", player: int) -> bool: + return state.has("Rick", player) and state.has("Rick Spawn", player) + + +def can_reach_kine(state: "CollectionState", player: int) -> bool: + return state.has("Kine", player) and state.has("Kine Spawn", player) -#def can_reach_rick(state: "CollectionState", multiworld: MultiWorld, player: int) -> bool: def can_reach_coo(state: "CollectionState", player: int) -> bool: - return state.can_reach("Grass Land 3 - Complete", "Location", player) or \ - state.can_reach("Grass Land 5 - Complete", "Location", player) or \ - state.can_reach("Grass Land 6 - Complete", "Location", player) or \ - state.can_reach("Ripple Field 2 - Complete", "Location", player) or \ - state.can_reach("Ripple Field 6 - Complete", "Location", player) or \ - state.can_reach("Sand Canyon 2 - Complete", "Location", player) or \ - state.can_reach("Sand Canyon 3 - Complete", "Location", player) or \ - state.can_reach("Sand Canyon 6 - Complete", "Location", player) or \ - state.can_reach("Cloudy Park 1 - Complete", "Location", player) or \ - state.can_reach("Cloudy Park 4 - Complete", "Location", player) or \ - state.can_reach("Cloudy Park 5 - Complete", "Location", player) or \ - state.can_reach("Cloudy Park 6 - Complete", "Location", player) or \ - state.can_reach("Iceberg 3 - Complete", "Location", player) or \ - state.can_reach("Iceberg 5 - Complete", "Location", player) or \ - state.can_reach("Iceberg 6 - Complete", "Location", player) - # We purposefully leave out Iceberg 4 here, since access to Coo is conditional - # on having either Coo and Burning, or potentially Nago and Burning + return state.has("Coo", player) and state.has("Coo Spawn", player) def can_reach_nago(state: "CollectionState", player: int) -> bool: - return state.can_reach(LocationName.grass_land_1, "Location", player) \ - or state.can_reach(LocationName.grass_land_5, "Location", player) \ - or state.can_reach(LocationName.grass_land_6, "Location", player) \ - or state.can_reach(LocationName.ripple_field_1, "Location", player) \ - or state.can_reach(LocationName.ripple_field_4, "Location", player) \ - or state.can_reach(LocationName.ripple_field_6, "Location", player) \ - or state.can_reach(LocationName.sand_canyon_4, "Location", player) \ - or state.can_reach(LocationName.sand_canyon_6, "Location", player) \ - or state.can_reach(LocationName.cloudy_park_1, "Location", player) \ - or state.can_reach(LocationName.cloudy_park_2, "Location", player) \ - or state.can_reach(LocationName.cloudy_park_6, "Location", player) \ - or state.can_reach(LocationName.iceberg_2, "Location", player) \ - or state.can_reach(LocationName.iceberg_3, "Location", player) \ - or state.can_reach(LocationName.iceberg_6, "Location", player) + return state.has("Nago", player) and state.has("Nago Spawn", player) + + +def can_reach_chuchu(state: "CollectionState", player: int) -> bool: + return state.has("ChuChu", player) and state.has("ChuChu Spawn", player) + + +def can_reach_pitch(state: "CollectionState", player: int) -> bool: + return state.has("Pitch", player) and state.has("Pitch Spawn", player) def set_rules(world: "KDL3World") -> None: - if not world.multiworld.open_world[world.player]: - for level in range(1, len(world.player_levels[world.player]) + 1): - for stage in range(len(world.player_levels[world.player][level])): - if stage != 6: - # Cannot complete stage if we cannot complete the stage before it - set_rule( - world.multiworld.get_location(location_table[world.player_levels[world.player][level][stage]], - world.player), - lambda state, level=level, stage=stage: True if stage == 0 - else state.can_reach( - location_table[world.player_levels[world.player][level][stage - 1]], "Location", - world.player)) - # Cannot complete stage's heart star if we cannot complete the stage before it - set_rule( - world.multiworld.get_location( - location_table[world.player_levels[world.player][level][stage] + 0x100], world.player), - lambda state, level=level, stage=stage: True if stage == 0 - else state.can_reach( - location_table[world.player_levels[world.player][level][stage - 1]], "Location", - world.player)) - if world.multiworld.consumables[world.player]: - stage_idx = world.player_levels[world.player][level][stage] & 0xFF - if stage_idx in level_consumables: - for consumable in level_consumables[stage_idx]: - set_rule( - world.multiworld.get_location( - location_table[0x770300 + consumable], - world.player), - lambda state, level=level, stage=stage: True if stage == 0 - else state.can_reach( - location_table[world.player_levels[world.player][level][stage - 1]], "Location", - world.player)) # Level 1 add_rule(world.multiworld.get_location(LocationName.grass_land_muchi, world.player), - lambda state: state.has("ChuChu", world.player)) + lambda state: can_reach_chuchu(state, world.player)) add_rule(world.multiworld.get_location(LocationName.grass_land_chao, world.player), lambda state: state.has("Stone", world.player)) add_rule(world.multiworld.get_location(LocationName.grass_land_mine, world.player), - lambda state: state.has("Kine", world.player)) + lambda state: can_reach_kine(state, world.player)) # Level 2 add_rule(world.multiworld.get_location(LocationName.ripple_field_5, world.player), - lambda state: state.has("Kine", world.player)) + lambda state: can_reach_kine(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_kamuribana, world.player), - lambda state: state.has("Pitch", world.player) and state.has("Clean", world.player)) + lambda state: can_reach_pitch(state, world.player) and state.has("Clean", world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_bakasa, world.player), - lambda state: state.has("Kine", world.player) and state.has("Parasol", world.player)) + lambda state: can_reach_kine(state, world.player) and state.has("Parasol", world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_toad, world.player), lambda state: state.has("Needle", world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_mama_pitch, world.player), - lambda state: state.has("Pitch", world.player) and state.has("Kine", world.player) + lambda state: can_reach_pitch(state, world.player) and can_reach_kine(state, world.player) and state.has("Burning", world.player) and state.has("Stone", world.player)) # Level 3 @@ -162,6 +109,7 @@ def set_rules(world: "KDL3World") -> None: lambda state: state.has_all([ability for ability in copy_ability_table.keys()], world.player)) # cleaner than writing out 8 ands + # Consumables if world.multiworld.consumables[world.player]: add_rule(world.multiworld.get_location(LocationName.grass_land_1_u1, world.player), @@ -209,22 +157,19 @@ def set_rules(world: "KDL3World") -> None: range(1, 6)): set_rule(world.multiworld.get_location(boss_flag, world.player), lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[world.player][i - 1]) - and (True if world.multiworld.open_world[world.player] else - state.can_reach(location_table[world.player_levels[world.player][i][5]], - "Location", - world.player))) + and can_reach_level(state, world.player, i+1, + world.multiworld.open_world[world.player], + world.multiworld.ow_boss_requirement[world.player])) set_rule(world.multiworld.get_location(purification, world.player), lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[world.player][i - 1]) - and (True if world.multiworld.open_world[world.player] else - state.can_reach(location_table[world.player_levels[world.player][i][5]], - "Location", - world.player))) + and can_reach_level(state, world.player, i+1, + world.multiworld.open_world[world.player], + world.multiworld.ow_boss_requirement[world.player])) if world.multiworld.strict_bosses[world.player]: for level in range(2, 6): add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), - lambda state, i=level: state.has("Heart Star", world.player, - world.boss_requirements[world.player][i - 2])) + lambda state, i=level: state.has(f"Level {i - 1} Boss Purified", world.player)) set_rule(world.multiworld.get_entrance("To Level 6", world.player), lambda state: state.has("Heart Star", world.player, world.required_heart_stars[world.player])) @@ -232,14 +177,10 @@ def set_rules(world: "KDL3World") -> None: for level in range(2, 6): add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), lambda state, i=level: can_reach_level(state, world.player, i, - world.player_levels[world.player], world.multiworld.open_world[world.player], world.multiworld.ow_boss_requirement[world.player])) if world.multiworld.goal_speed[world.player] == 0: add_rule(world.multiworld.get_entrance("To Level 6", world.player), - lambda state: state.has("Level 1 Boss Purified", world.player) - and state.has("Level 2 Boss Purified", world.player) - and state.has("Level 3 Boss Purified", world.player) - and state.has("Level 4 Boss Purified", world.player) - and state.has("Level 5 Boss Purified", world.player)) + lambda state: state.has_all(["Level 1 Boss Purified", "Level 2 Boss Purified", "Level 3 Boss Purified", + "Level 4 Boss Purified", "Level 5 Boss Purified"], world.player)) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 0598e3ba2d56..9a502a784bc6 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -19,12 +19,13 @@ import threading import base64 from Main import __version__ as APVersion -logger = logging.getLogger("Kirby's Dream Land 3") +logger = logging.getLogger("Kirby's Dream Land 3") if APVersion == "0.4.2": import settings + class KDL3Settings(settings.Group): class RomFile(settings.SNESRomPath): """File name of the KDL3 JP or EN rom""" @@ -147,6 +148,15 @@ def create_items(self) -> None: itempool.extend([self.create_item("Heart Star", True) for _ in range(non_required_heart_stars)]) self.multiworld.itempool += itempool + for level in self.player_levels[self.player]: + for stage in range(0, 6): + self.multiworld.get_location(location_table[self.player_levels[self.player][level][stage]] + .replace("Complete", "Stage Completion"), self.player) \ + .place_locked_item(KDL3Item( + f"{LocationName.level_names_inverse[level]}" + f"{f' {stage + 1} ' if not self.multiworld.open_world[self.player] else ' '}- Stage Completion", + ItemClassification.progression, None, self.player)) + set_rules = set_rules def generate_basic(self) -> None: @@ -156,13 +166,15 @@ def generate_basic(self) -> None: goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, self.player)) for level in range(1, 6): self.multiworld.get_location(f"Level {level} Boss", self.player) \ - .place_locked_item(KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) + .place_locked_item( + KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) self.boss_butch_bosses[self.player] = [False for _ in range(6)] if self.multiworld.allow_bb[self.player]: for i in range(6): if self.multiworld.allow_bb[self.player] == 1: - self.boss_butch_bosses[self.player][i] = self.multiworld.per_slot_randoms[self.player].choice([True, False]) + self.boss_butch_bosses[self.player][i] = self.multiworld.per_slot_randoms[self.player].choice( + [True, False]) else: self.boss_butch_bosses[self.player][i] = True diff --git a/worlds/kdl3/data/Rooms.json b/worlds/kdl3/data/Rooms.json new file mode 100644 index 000000000000..65ba41a28ae4 --- /dev/null +++ b/worlds/kdl3/data/Rooms.json @@ -0,0 +1,9266 @@ +[ + { + "name": "Grass Land 1 - 0", + "level": 1, + "stage": 1, + "room": 0, + "pointer": 3434257, + "default_exits": [ + { + "room": 1, + "unkn1": 205, + "unkn2": 8, + "x": 72, + "y": 200, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 87, + "unkn2": 9, + "x": 104, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Grass Land 1 - 1", + "level": 1, + "stage": 1, + "room": 1, + "pointer": 3368373, + "default_exits": [ + { + "room": 3, + "unkn1": 143, + "unkn2": 6, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 1 - 1-Up (Parasol)", + "Grass Land 1 - Maxim Tomato (Spark)" + ], + "music": 20 + }, + { + "name": "Grass Land 1 - 2", + "level": 1, + "stage": 1, + "room": 2, + "pointer": 2960650, + "default_exits": [ + { + "room": 0, + "unkn1": 5, + "unkn2": 9, + "x": 1416, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 1 - Animal 1", + "Grass Land 1 - Animal 2" + ], + "music": 38 + }, + { + "name": "Grass Land 1 - 3", + "level": 1, + "stage": 1, + "room": 3, + "pointer": 3478442, + "default_exits": [ + { + "room": 4, + "unkn1": 179, + "unkn2": 9, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Grass Land 1 - 4", + "level": 1, + "stage": 1, + "room": 4, + "pointer": 2978390, + "default_exits": [ + { + "room": 5, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 1 - Tulip" + ], + "music": 8 + }, + { + "name": "Grass Land 1 - 5", + "level": 1, + "stage": 1, + "room": 5, + "pointer": 2890835, + "default_exits": [], + "locations": [ + "Grass Land 1 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land 2 - 0", + "level": 1, + "stage": 2, + "room": 0, + "pointer": 3293347, + "default_exits": [ + { + "room": 1, + "unkn1": 112, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Grass Land 2 - 1", + "level": 1, + "stage": 2, + "room": 1, + "pointer": 3059685, + "default_exits": [ + { + "room": 2, + "unkn1": 20, + "unkn2": 9, + "x": 56, + "y": 136, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 2 - Animal 1", + "Grass Land 2 - Animal 2" + ], + "music": 39 + }, + { + "name": "Grass Land 2 - 2", + "level": 1, + "stage": 2, + "room": 2, + "pointer": 3432109, + "default_exits": [ + { + "room": 4, + "unkn1": 133, + "unkn2": 11, + "x": 72, + "y": 200, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 52, + "unkn2": 12, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Grass Land 2 - 3", + "level": 1, + "stage": 2, + "room": 3, + "pointer": 2970029, + "default_exits": [ + { + "room": 2, + "unkn1": 2, + "unkn2": 9, + "x": 840, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Grass Land 2 - 4", + "level": 1, + "stage": 2, + "room": 4, + "pointer": 3578022, + "default_exits": [ + { + "room": 5, + "unkn1": 154, + "unkn2": 12, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 2 - 1-Up (Needle)" + ], + "music": 11 + }, + { + "name": "Grass Land 2 - 5", + "level": 1, + "stage": 2, + "room": 5, + "pointer": 2966057, + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 2 - Muchimuchi" + ], + "music": 8 + }, + { + "name": "Grass Land 2 - 6", + "level": 1, + "stage": 2, + "room": 6, + "pointer": 2887461, + "default_exits": [], + "locations": [ + "Grass Land 2 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land 3 - 0", + "level": 1, + "stage": 3, + "room": 0, + "pointer": 3149707, + "default_exits": [ + { + "room": 1, + "unkn1": 107, + "unkn2": 7, + "x": 72, + "y": 840, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 46, + "unkn2": 9, + "x": 152, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Grass Land 3 - 1", + "level": 1, + "stage": 3, + "room": 1, + "pointer": 3204939, + "default_exits": [ + { + "room": 3, + "unkn1": 9, + "unkn2": 9, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 3 - 1-Up (Climb)", + "Grass Land 3 - Maxim Tomato (Climb)" + ], + "music": 19 + }, + { + "name": "Grass Land 3 - 2", + "level": 1, + "stage": 3, + "room": 2, + "pointer": 3200066, + "default_exits": [ + { + "room": 6, + "unkn1": 13, + "unkn2": 55, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Grass Land 3 - 3", + "level": 1, + "stage": 3, + "room": 3, + "pointer": 2959784, + "default_exits": [ + { + "room": 2, + "unkn1": 15, + "unkn2": 9, + "x": 56, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 31 + }, + { + "name": "Grass Land 3 - 4", + "level": 1, + "stage": 3, + "room": 4, + "pointer": 2979121, + "default_exits": [ + { + "room": 0, + "unkn1": 8, + "unkn2": 9, + "x": 760, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 3 - Animal 1", + "Grass Land 3 - Animal 2" + ], + "music": 40 + }, + { + "name": "Grass Land 3 - 5", + "level": 1, + "stage": 3, + "room": 5, + "pointer": 2997811, + "default_exits": [ + { + "room": 7, + "unkn1": 15, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 8 + }, + { + "name": "Grass Land 3 - 6", + "level": 1, + "stage": 3, + "room": 6, + "pointer": 3084876, + "default_exits": [ + { + "room": 5, + "unkn1": 96, + "unkn2": 9, + "x": 40, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 3 - Pitcherman" + ], + "music": 19 + }, + { + "name": "Grass Land 3 - 7", + "level": 1, + "stage": 3, + "room": 7, + "pointer": 2891317, + "default_exits": [], + "locations": [ + "Grass Land 3 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land 4 - 0", + "level": 1, + "stage": 4, + "room": 0, + "pointer": 3471284, + "default_exits": [ + { + "room": 1, + "unkn1": 145, + "unkn2": 13, + "x": 72, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 10 + }, + { + "name": "Grass Land 4 - 1", + "level": 1, + "stage": 4, + "room": 1, + "pointer": 3436401, + "default_exits": [ + { + "room": 5, + "unkn1": 58, + "unkn2": 5, + "x": 184, + "y": 312, + "access_rule": [] + }, + { + "room": 9, + "unkn1": 42, + "unkn2": 18, + "x": 168, + "y": 88, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 4 - Maxim Tomato (Zebon Right)" + ], + "music": 10 + }, + { + "name": "Grass Land 4 - 2", + "level": 1, + "stage": 4, + "room": 2, + "pointer": 3039401, + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 4, + "x": 56, + "y": 72, + "access_rule": [] + } + ], + "locations": [], + "music": 9 + }, + { + "name": "Grass Land 4 - 3", + "level": 1, + "stage": 4, + "room": 3, + "pointer": 3722714, + "default_exits": [ + { + "room": 4, + "unkn1": 95, + "unkn2": 5, + "x": 72, + "y": 200, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 4 - Maxim Tomato (Gordo)", + "Grass Land 4 - 1-Up (Gordo)" + ], + "music": 10 + }, + { + "name": "Grass Land 4 - 4", + "level": 1, + "stage": 4, + "room": 4, + "pointer": 3304980, + "default_exits": [ + { + "room": 8, + "unkn1": 94, + "unkn2": 9, + "x": 40, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 4 - Maxim Tomato (Cliff)" + ], + "music": 10 + }, + { + "name": "Grass Land 4 - 5", + "level": 1, + "stage": 4, + "room": 5, + "pointer": 3498127, + "default_exits": [ + { + "room": 2, + "unkn1": 61, + "unkn2": 13, + "x": 56, + "y": 72, + "access_rule": [] + }, + { + "room": 7, + "unkn1": 61, + "unkn2": 18, + "x": 56, + "y": 200, + "access_rule": [] + } + ], + "locations": [], + "music": 10 + }, + { + "name": "Grass Land 4 - 6", + "level": 1, + "stage": 4, + "room": 6, + "pointer": 3160191, + "default_exits": [ + { + "room": 3, + "unkn1": 28, + "unkn2": 4, + "x": 72, + "y": 376, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 28, + "unkn2": 12, + "x": 72, + "y": 440, + "access_rule": [] + } + ], + "locations": [], + "music": 10 + }, + { + "name": "Grass Land 4 - 7", + "level": 1, + "stage": 4, + "room": 7, + "pointer": 3035801, + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 12, + "x": 56, + "y": 200, + "access_rule": [] + } + ], + "locations": [], + "music": 4 + }, + { + "name": "Grass Land 4 - 8", + "level": 1, + "stage": 4, + "room": 8, + "pointer": 2989794, + "default_exits": [ + { + "room": 10, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 4 - Chao & Goku" + ], + "music": 8 + }, + { + "name": "Grass Land 4 - 9", + "level": 1, + "stage": 4, + "room": 9, + "pointer": 3043518, + "default_exits": [ + { + "room": 1, + "unkn1": 9, + "unkn2": 5, + "x": 696, + "y": 296, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 4 - Animal 1", + "Grass Land 4 - Animal 2" + ], + "music": 38 + }, + { + "name": "Grass Land 4 - 10", + "level": 1, + "stage": 4, + "room": 10, + "pointer": 2888425, + "default_exits": [], + "locations": [ + "Grass Land 4 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land 5 - 0", + "level": 1, + "stage": 5, + "room": 0, + "pointer": 3303565, + "default_exits": [ + { + "room": 1, + "unkn1": 120, + "unkn2": 9, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Grass Land 5 - 1", + "level": 1, + "stage": 5, + "room": 1, + "pointer": 3048718, + "default_exits": [ + { + "room": 3, + "unkn1": 18, + "unkn2": 4, + "x": 184, + "y": 152, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 21, + "unkn2": 4, + "x": 184, + "y": 152, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 36, + "unkn2": 9, + "x": 56, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Grass Land 5 - 2", + "level": 1, + "stage": 5, + "room": 2, + "pointer": 3327019, + "default_exits": [ + { + "room": 7, + "unkn1": 121, + "unkn2": 6, + "x": 56, + "y": 72, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Grass Land 5 - 3", + "level": 1, + "stage": 5, + "room": 3, + "pointer": 2966459, + "default_exits": [ + { + "room": 1, + "unkn1": 10, + "unkn2": 9, + "x": 312, + "y": 72, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 5 - Animal 1", + "Grass Land 5 - Animal 2" + ], + "music": 38 + }, + { + "name": "Grass Land 5 - 4", + "level": 1, + "stage": 5, + "room": 4, + "pointer": 2973509, + "default_exits": [ + { + "room": 1, + "unkn1": 10, + "unkn2": 9, + "x": 360, + "y": 72, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 5 - Animal 3", + "Grass Land 5 - Animal 4" + ], + "music": 38 + }, + { + "name": "Grass Land 5 - 5", + "level": 1, + "stage": 5, + "room": 5, + "pointer": 2962351, + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 5 - Mine" + ], + "music": 8 + }, + { + "name": "Grass Land 5 - 6", + "level": 1, + "stage": 5, + "room": 6, + "pointer": 2886738, + "default_exits": [], + "locations": [ + "Grass Land 5 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land 5 - 7", + "level": 1, + "stage": 5, + "room": 7, + "pointer": 3255423, + "default_exits": [ + { + "room": 5, + "unkn1": 96, + "unkn2": 9, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Grass Land 6 - 0", + "level": 1, + "stage": 6, + "room": 0, + "pointer": 3376872, + "default_exits": [ + { + "room": 6, + "unkn1": 51, + "unkn2": 9, + "x": 216, + "y": 152, + "access_rule": [] + }, + { + "room": 1, + "unkn1": 96, + "unkn2": 9, + "x": 216, + "y": 1144, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Grass Land 6 - 1", + "level": 1, + "stage": 6, + "room": 1, + "pointer": 3395125, + "default_exits": [ + { + "room": 2, + "unkn1": 16, + "unkn2": 5, + "x": 72, + "y": 88, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 6 - 1-Up (Tower)" + ], + "music": 20 + }, + { + "name": "Grass Land 6 - 2", + "level": 1, + "stage": 6, + "room": 2, + "pointer": 3375177, + "default_exits": [ + { + "room": 3, + "unkn1": 93, + "unkn2": 6, + "x": 200, + "y": 152, + "access_rule": [] + }, + { + "room": 7, + "unkn1": 49, + "unkn2": 7, + "x": 216, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Grass Land 6 - 3", + "level": 1, + "stage": 6, + "room": 3, + "pointer": 3322977, + "default_exits": [ + { + "room": 4, + "unkn1": 12, + "unkn2": 52, + "x": 72, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Grass Land 6 - 4", + "level": 1, + "stage": 6, + "room": 4, + "pointer": 3490819, + "default_exits": [ + { + "room": 5, + "unkn1": 145, + "unkn2": 6, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 6 - 1-Up (Falling)" + ], + "music": 20 + }, + { + "name": "Grass Land 6 - 5", + "level": 1, + "stage": 6, + "room": 5, + "pointer": 3076769, + "default_exits": [ + { + "room": 8, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 6 - Pierre" + ], + "music": 8 + }, + { + "name": "Grass Land 6 - 6", + "level": 1, + "stage": 6, + "room": 6, + "pointer": 3047576, + "default_exits": [ + { + "room": 0, + "unkn1": 12, + "unkn2": 9, + "x": 840, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 6 - Animal 1", + "Grass Land 6 - Animal 2" + ], + "music": 39 + }, + { + "name": "Grass Land 6 - 7", + "level": 1, + "stage": 6, + "room": 7, + "pointer": 3022909, + "default_exits": [ + { + "room": 2, + "unkn1": 12, + "unkn2": 6, + "x": 808, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Grass Land 6 - Animal 3", + "Grass Land 6 - Animal 4" + ], + "music": 38 + }, + { + "name": "Grass Land 6 - 8", + "level": 1, + "stage": 6, + "room": 8, + "pointer": 2884569, + "default_exits": [], + "locations": [ + "Grass Land 6 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land Boss - 0", + "level": 1, + "stage": 7, + "room": 0, + "pointer": 2984105, + "default_exits": [], + "locations": [ + "Grass Land - Boss (Whispy Woods) Purified", + "Level 1 Boss" + ], + "music": 2 + }, + { + "name": "Ripple Field 1 - 0", + "level": 2, + "stage": 1, + "room": 0, + "pointer": 3279855, + "default_exits": [ + { + "room": 2, + "unkn1": 102, + "unkn2": 8, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 1 - 1", + "level": 2, + "stage": 1, + "room": 1, + "pointer": 3588688, + "default_exits": [ + { + "room": 3, + "unkn1": 146, + "unkn2": 11, + "x": 40, + "y": 232, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 73, + "unkn2": 16, + "x": 200, + "y": 184, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 108, + "unkn2": 16, + "x": 200, + "y": 184, + "access_rule": [] + }, + { + "room": 7, + "unkn1": 138, + "unkn2": 16, + "x": 200, + "y": 184, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 1 - 2", + "level": 2, + "stage": 1, + "room": 2, + "pointer": 2955848, + "default_exits": [ + { + "room": 1, + "unkn1": 18, + "unkn2": 9, + "x": 56, + "y": 168, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 1 - Animal 1", + "Ripple Field 1 - Animal 2" + ], + "music": 40 + }, + { + "name": "Ripple Field 1 - 3", + "level": 2, + "stage": 1, + "room": 3, + "pointer": 3558828, + "default_exits": [ + { + "room": 4, + "unkn1": 171, + "unkn2": 5, + "x": 40, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 1 - 4", + "level": 2, + "stage": 1, + "room": 4, + "pointer": 2974271, + "default_exits": [ + { + "room": 8, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 1 - Kamuribana" + ], + "music": 8 + }, + { + "name": "Ripple Field 1 - 5", + "level": 2, + "stage": 1, + "room": 5, + "pointer": 3051513, + "default_exits": [ + { + "room": 1, + "unkn1": 11, + "unkn2": 11, + "x": 1192, + "y": 264, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 1 - 6", + "level": 2, + "stage": 1, + "room": 6, + "pointer": 3049838, + "default_exits": [ + { + "room": 1, + "unkn1": 11, + "unkn2": 11, + "x": 1752, + "y": 264, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 1 - 7", + "level": 2, + "stage": 1, + "room": 7, + "pointer": 3066407, + "default_exits": [ + { + "room": 1, + "unkn1": 11, + "unkn2": 11, + "x": 2232, + "y": 264, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 1 - 8", + "level": 2, + "stage": 1, + "room": 8, + "pointer": 2889148, + "default_exits": [], + "locations": [ + "Ripple Field 1 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field 2 - 0", + "level": 2, + "stage": 2, + "room": 0, + "pointer": 3342336, + "default_exits": [ + { + "room": 1, + "unkn1": 103, + "unkn2": 15, + "x": 56, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 10 + }, + { + "name": "Ripple Field 2 - 1", + "level": 2, + "stage": 2, + "room": 1, + "pointer": 3084099, + "default_exits": [ + { + "room": 3, + "unkn1": 23, + "unkn2": 8, + "x": 72, + "y": 248, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 2 - Animal 1", + "Ripple Field 2 - Animal 2" + ], + "music": 39 + }, + { + "name": "Ripple Field 2 - 2", + "level": 2, + "stage": 2, + "room": 2, + "pointer": 3451207, + "default_exits": [ + { + "room": 4, + "unkn1": 31, + "unkn2": 5, + "x": 72, + "y": 152, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 96, + "unkn2": 6, + "x": 56, + "y": 152, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 56, + "unkn2": 17, + "x": 136, + "y": 264, + "access_rule": [] + } + ], + "locations": [], + "music": 10 + }, + { + "name": "Ripple Field 2 - 3", + "level": 2, + "stage": 2, + "room": 3, + "pointer": 3674327, + "default_exits": [ + { + "room": 2, + "unkn1": 134, + "unkn2": 5, + "x": 40, + "y": 136, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 2 - 1-Up (Currents)", + "Ripple Field 2 - Maxim Tomato (Currents)" + ], + "music": 10 + }, + { + "name": "Ripple Field 2 - 4", + "level": 2, + "stage": 2, + "room": 4, + "pointer": 2972744, + "default_exits": [ + { + "room": 2, + "unkn1": 3, + "unkn2": 9, + "x": 520, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 10 + }, + { + "name": "Ripple Field 2 - 5", + "level": 2, + "stage": 2, + "room": 5, + "pointer": 3109710, + "default_exits": [ + { + "room": 2, + "unkn1": 16, + "unkn2": 16, + "x": 1048, + "y": 280, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 2 - Animal 3", + "Ripple Field 2 - Animal 4" + ], + "music": 38 + }, + { + "name": "Ripple Field 2 - 6", + "level": 2, + "stage": 2, + "room": 6, + "pointer": 2973127, + "default_exits": [ + { + "room": 7, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 2 - Bakasa" + ], + "music": 8 + }, + { + "name": "Ripple Field 2 - 7", + "level": 2, + "stage": 2, + "room": 7, + "pointer": 2890353, + "default_exits": [], + "locations": [ + "Ripple Field 2 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field 3 - 0", + "level": 2, + "stage": 3, + "room": 0, + "pointer": 3517254, + "default_exits": [ + { + "room": 3, + "unkn1": 105, + "unkn2": 8, + "x": 40, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Ripple Field 3 - 1", + "level": 2, + "stage": 3, + "room": 1, + "pointer": 3604480, + "default_exits": [ + { + "room": 7, + "unkn1": 80, + "unkn2": 24, + "x": 104, + "y": 328, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 3 - Maxim Tomato (Cove)", + "Ripple Field 3 - 1-Up (Cutter/Spark)" + ], + "music": 18 + }, + { + "name": "Ripple Field 3 - 2", + "level": 2, + "stage": 3, + "room": 2, + "pointer": 3715428, + "default_exits": [ + { + "room": 4, + "unkn1": 118, + "unkn2": 9, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Ripple Field 3 - 3", + "level": 2, + "stage": 3, + "room": 3, + "pointer": 3071919, + "default_exits": [ + { + "room": 1, + "unkn1": 15, + "unkn2": 6, + "x": 56, + "y": 104, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 3 - Animal 1", + "Ripple Field 3 - Animal 2" + ], + "music": 39 + }, + { + "name": "Ripple Field 3 - 4", + "level": 2, + "stage": 3, + "room": 4, + "pointer": 2970810, + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 3 - Elieel" + ], + "music": 8 + }, + { + "name": "Ripple Field 3 - 5", + "level": 2, + "stage": 3, + "room": 5, + "pointer": 2987502, + "default_exits": [ + { + "room": 7, + "unkn1": 15, + "unkn2": 9, + "x": 232, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 31 + }, + { + "name": "Ripple Field 3 - 6", + "level": 2, + "stage": 3, + "room": 6, + "pointer": 2888666, + "default_exits": [], + "locations": [ + "Ripple Field 3 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field 3 - 7", + "level": 2, + "stage": 3, + "room": 7, + "pointer": 3161120, + "default_exits": [ + { + "room": 5, + "unkn1": 3, + "unkn2": 5, + "x": 40, + "y": 152, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 11, + "unkn2": 20, + "x": 56, + "y": 216, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Ripple Field 4 - 0", + "level": 2, + "stage": 4, + "room": 0, + "pointer": 3082540, + "default_exits": [ + { + "room": 6, + "unkn1": 4, + "unkn2": 16, + "x": 72, + "y": 232, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 4 - 1", + "level": 2, + "stage": 4, + "room": 1, + "pointer": 2964846, + "default_exits": [ + { + "room": 2, + "unkn1": 14, + "unkn2": 8, + "x": 72, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 4 + }, + { + "name": "Ripple Field 4 - 2", + "level": 2, + "stage": 4, + "room": 2, + "pointer": 3018503, + "default_exits": [ + { + "room": 11, + "unkn1": 25, + "unkn2": 5, + "x": 56, + "y": 88, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 25, + "unkn2": 15, + "x": 56, + "y": 216, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 4 - 3", + "level": 2, + "stage": 4, + "room": 3, + "pointer": 2988166, + "default_exits": [ + { + "room": 4, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 4 - Toad & Little Toad" + ], + "music": 8 + }, + { + "name": "Ripple Field 4 - 4", + "level": 2, + "stage": 4, + "room": 4, + "pointer": 2885533, + "default_exits": [], + "locations": [ + "Ripple Field 4 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field 4 - 5", + "level": 2, + "stage": 4, + "room": 5, + "pointer": 3042349, + "default_exits": [ + { + "room": 6, + "unkn1": 5, + "unkn2": 5, + "x": 360, + "y": 120, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 15, + "unkn2": 5, + "x": 488, + "y": 120, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 16, + "unkn2": 5, + "x": 104, + "y": 88, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 10, + "unkn2": 11, + "x": 440, + "y": 216, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 4 - Animal 1", + "Ripple Field 4 - Animal 2", + "Ripple Field 4 - Animal 3" + ], + "music": 40 + }, + { + "name": "Ripple Field 4 - 6", + "level": 2, + "stage": 4, + "room": 6, + "pointer": 3234805, + "default_exits": [ + { + "room": 5, + "unkn1": 21, + "unkn2": 7, + "x": 104, + "y": 88, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 31, + "unkn2": 7, + "x": 232, + "y": 88, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 26, + "unkn2": 13, + "x": 184, + "y": 184, + "access_rule": [] + }, + { + "room": 12, + "unkn1": 48, + "unkn2": 15, + "x": 88, + "y": 216, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 4 - 7", + "level": 2, + "stage": 4, + "room": 7, + "pointer": 3155468, + "default_exits": [ + { + "room": 1, + "unkn1": 11, + "unkn2": 6, + "x": 104, + "y": 136, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 18, + "unkn2": 9, + "x": 72, + "y": 248, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 4 - 8", + "level": 2, + "stage": 4, + "room": 8, + "pointer": 3350031, + "default_exits": [ + { + "room": 7, + "unkn1": 24, + "unkn2": 22, + "x": 184, + "y": 440, + "access_rule": [] + }, + { + "room": 7, + "unkn1": 34, + "unkn2": 22, + "x": 296, + "y": 440, + "access_rule": [] + }, + { + "room": 9, + "unkn1": 16, + "unkn2": 72, + "x": 168, + "y": 152, + "access_rule": [] + }, + { + "room": 10, + "unkn1": 23, + "unkn2": 72, + "x": 120, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 4 - 9", + "level": 2, + "stage": 4, + "room": 9, + "pointer": 3050397, + "default_exits": [ + { + "room": 8, + "unkn1": 11, + "unkn2": 9, + "x": 264, + "y": 1144, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 4 - Maxim Tomato (Stone)" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 10", + "level": 2, + "stage": 4, + "room": 10, + "pointer": 3052069, + "default_exits": [ + { + "room": 8, + "unkn1": 6, + "unkn2": 9, + "x": 376, + "y": 1144, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 4 - 1-Up (Stone)" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 11", + "level": 2, + "stage": 4, + "room": 11, + "pointer": 3386974, + "default_exits": [ + { + "room": 3, + "unkn1": 146, + "unkn2": 13, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 4 - 12", + "level": 2, + "stage": 4, + "room": 12, + "pointer": 3168339, + "default_exits": [ + { + "room": 8, + "unkn1": 67, + "unkn2": 7, + "x": 88, + "y": 1224, + "access_rule": [] + }, + { + "room": 13, + "unkn1": 75, + "unkn2": 7, + "x": 88, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 4 - 13", + "level": 2, + "stage": 4, + "room": 13, + "pointer": 2958478, + "default_exits": [ + { + "room": 12, + "unkn1": 4, + "unkn2": 8, + "x": 1192, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 4 - Maxim Tomato (Dark)" + ], + "music": 15 + }, + { + "name": "Ripple Field 5 - 0", + "level": 2, + "stage": 5, + "room": 0, + "pointer": 3240369, + "default_exits": [ + { + "room": 2, + "unkn1": 9, + "unkn2": 43, + "x": 88, + "y": 344, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Ripple Field 5 - 1", + "level": 2, + "stage": 5, + "room": 1, + "pointer": 3547528, + "default_exits": [ + { + "room": 6, + "unkn1": 15, + "unkn2": 4, + "x": 184, + "y": 344, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Ripple Field 5 - 2", + "level": 2, + "stage": 5, + "room": 2, + "pointer": 3611327, + "default_exits": [ + { + "room": 4, + "unkn1": 95, + "unkn2": 21, + "x": 56, + "y": 184, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Ripple Field 5 - 3", + "level": 2, + "stage": 5, + "room": 3, + "pointer": 3926157, + "default_exits": [ + { + "room": 8, + "unkn1": 4, + "unkn2": 38, + "x": 152, + "y": 152, + "access_rule": [] + }, + { + "room": 1, + "unkn1": 95, + "unkn2": 38, + "x": 248, + "y": 1064, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 5 - 1-Up (Currents)", + "Ripple Field 5 - Maxim Tomato (Currents)" + ], + "music": 16 + }, + { + "name": "Ripple Field 5 - 4", + "level": 2, + "stage": 5, + "room": 4, + "pointer": 3026639, + "default_exits": [ + { + "room": 5, + "unkn1": 14, + "unkn2": 4, + "x": 232, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 5 - Animal 1" + ], + "music": 40 + }, + { + "name": "Ripple Field 5 - 5", + "level": 2, + "stage": 5, + "room": 5, + "pointer": 3207333, + "default_exits": [ + { + "room": 4, + "unkn1": 4, + "unkn2": 9, + "x": 56, + "y": 72, + "access_rule": [] + }, + { + "room": 7, + "unkn1": 24, + "unkn2": 9, + "x": 120, + "y": 552, + "access_rule": [ + "Kine" + ] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Ripple Field 5 - 6", + "level": 2, + "stage": 5, + "room": 6, + "pointer": 3485896, + "default_exits": [ + { + "room": 9, + "unkn1": 121, + "unkn2": 11, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Ripple Field 5 - 7", + "level": 2, + "stage": 5, + "room": 7, + "pointer": 3752698, + "default_exits": [ + { + "room": 10, + "unkn1": 45, + "unkn2": 31, + "x": 152, + "y": 152, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 94, + "unkn2": 40, + "x": 88, + "y": 200, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 5 - Maxim Tomato (Exit)" + ], + "music": 16 + }, + { + "name": "Ripple Field 5 - 8", + "level": 2, + "stage": 5, + "room": 8, + "pointer": 3044682, + "default_exits": [ + { + "room": 3, + "unkn1": 8, + "unkn2": 9, + "x": 88, + "y": 616, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 5 - Animal 2" + ], + "music": 39 + }, + { + "name": "Ripple Field 5 - 9", + "level": 2, + "stage": 5, + "room": 9, + "pointer": 2963193, + "default_exits": [ + { + "room": 11, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 5 - Mama Pitch" + ], + "music": 8 + }, + { + "name": "Ripple Field 5 - 10", + "level": 2, + "stage": 5, + "room": 10, + "pointer": 3042934, + "default_exits": [ + { + "room": 7, + "unkn1": 8, + "unkn2": 9, + "x": 712, + "y": 504, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Ripple Field 5 - 11", + "level": 2, + "stage": 5, + "room": 11, + "pointer": 2886256, + "default_exits": [], + "locations": [ + "Ripple Field 5 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field 6 - 0", + "level": 2, + "stage": 6, + "room": 0, + "pointer": 2949576, + "default_exits": [ + { + "room": 1, + "unkn1": 56, + "unkn2": 7, + "x": 40, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 1", + "level": 2, + "stage": 6, + "room": 1, + "pointer": 2971200, + "default_exits": [ + { + "room": 7, + "unkn1": 23, + "unkn2": 9, + "x": 56, + "y": 264, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 6 - Animal 1", + "Ripple Field 6 - Animal 2", + "Ripple Field 6 - Animal 3" + ], + "music": 38 + }, + { + "name": "Ripple Field 6 - 2", + "level": 2, + "stage": 6, + "room": 2, + "pointer": 3637749, + "default_exits": [ + { + "room": 8, + "unkn1": 95, + "unkn2": 9, + "x": 104, + "y": 872, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 50, + "unkn2": 22, + "x": 184, + "y": 88, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 45, + "unkn2": 26, + "x": 88, + "y": 88, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 55, + "unkn2": 26, + "x": 248, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 3", + "level": 2, + "stage": 6, + "room": 3, + "pointer": 3092564, + "default_exits": [ + { + "room": 2, + "unkn1": 4, + "unkn2": 5, + "x": 744, + "y": 424, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 16, + "unkn2": 5, + "x": 872, + "y": 424, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 4", + "level": 2, + "stage": 6, + "room": 4, + "pointer": 3133247, + "default_exits": [ + { + "room": 2, + "unkn1": 10, + "unkn2": 5, + "x": 824, + "y": 360, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 5", + "level": 2, + "stage": 6, + "room": 5, + "pointer": 3507762, + "default_exits": [ + { + "room": 6, + "unkn1": 76, + "unkn2": 4, + "x": 680, + "y": 72, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 49, + "unkn2": 6, + "x": 440, + "y": 104, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 49, + "unkn2": 10, + "x": 440, + "y": 168, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 88, + "unkn2": 10, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 22, + "unkn2": 12, + "x": 200, + "y": 200, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 76, + "unkn2": 12, + "x": 680, + "y": 200, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 76, + "unkn2": 16, + "x": 680, + "y": 264, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 6", + "level": 2, + "stage": 6, + "room": 6, + "pointer": 3211264, + "default_exits": [ + { + "room": 5, + "unkn1": 4, + "unkn2": 10, + "x": 72, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 7", + "level": 2, + "stage": 6, + "room": 7, + "pointer": 3586039, + "default_exits": [ + { + "room": 5, + "unkn1": 134, + "unkn2": 16, + "x": 72, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 8", + "level": 2, + "stage": 6, + "room": 8, + "pointer": 3621483, + "default_exits": [ + { + "room": 10, + "unkn1": 70, + "unkn2": 11, + "x": 56, + "y": 152, + "access_rule": [] + }, + { + "room": 9, + "unkn1": 26, + "unkn2": 54, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 9", + "level": 2, + "stage": 6, + "room": 9, + "pointer": 2954523, + "default_exits": [ + { + "room": 8, + "unkn1": 3, + "unkn2": 9, + "x": 408, + "y": 872, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 6 - Animal 4" + ], + "music": 39 + }, + { + "name": "Ripple Field 6 - 10", + "level": 2, + "stage": 6, + "room": 10, + "pointer": 3069438, + "default_exits": [ + { + "room": 11, + "unkn1": 15, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Ripple Field 6 - HB-002" + ], + "music": 8 + }, + { + "name": "Ripple Field 6 - 11", + "level": 2, + "stage": 6, + "room": 11, + "pointer": 2886497, + "default_exits": [], + "locations": [ + "Ripple Field 6 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field Boss - 0", + "level": 2, + "stage": 7, + "room": 0, + "pointer": 3157370, + "default_exits": [], + "locations": [ + "Ripple Field - Boss (Acro) Purified", + "Level 2 Boss" + ], + "music": 2 + }, + { + "name": "Sand Canyon 1 - 0", + "level": 3, + "stage": 1, + "room": 0, + "pointer": 3524267, + "default_exits": [ + { + "room": 5, + "unkn1": 196, + "unkn2": 7, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 1", + "level": 3, + "stage": 1, + "room": 1, + "pointer": 3163860, + "default_exits": [ + { + "room": 2, + "unkn1": 34, + "unkn2": 5, + "x": 104, + "y": 408, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 1 - Animal 1", + "Sand Canyon 1 - Animal 2" + ], + "music": 38 + }, + { + "name": "Sand Canyon 1 - 2", + "level": 3, + "stage": 1, + "room": 2, + "pointer": 3512532, + "default_exits": [ + { + "room": 3, + "unkn1": 73, + "unkn2": 6, + "x": 56, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 3", + "level": 3, + "stage": 1, + "room": 3, + "pointer": 3719146, + "default_exits": [ + { + "room": 4, + "unkn1": 25, + "unkn2": 73, + "x": 72, + "y": 280, + "access_rule": [] + } + ], + "locations": [], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 4", + "level": 3, + "stage": 1, + "room": 4, + "pointer": 3421212, + "default_exits": [ + { + "room": 7, + "unkn1": 196, + "unkn2": 8, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 5", + "level": 3, + "stage": 1, + "room": 5, + "pointer": 3203325, + "default_exits": [ + { + "room": 6, + "unkn1": 32, + "unkn2": 9, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 1, + "unkn1": 46, + "unkn2": 9, + "x": 56, + "y": 344, + "access_rule": [] + } + ], + "locations": [], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 6", + "level": 3, + "stage": 1, + "room": 6, + "pointer": 3138524, + "default_exits": [ + { + "room": 5, + "unkn1": 5, + "unkn2": 9, + "x": 536, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 1 - 1-Up (Polof)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 7", + "level": 3, + "stage": 1, + "room": 7, + "pointer": 2988822, + "default_exits": [ + { + "room": 8, + "unkn1": 15, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 1 - Geromuzudake" + ], + "music": 8 + }, + { + "name": "Sand Canyon 1 - 8", + "level": 3, + "stage": 1, + "room": 8, + "pointer": 2885292, + "default_exits": [], + "locations": [ + "Sand Canyon 1 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon 2 - 0", + "level": 3, + "stage": 2, + "room": 0, + "pointer": 3668370, + "default_exits": [ + { + "room": 1, + "unkn1": 178, + "unkn2": 8, + "x": 184, + "y": 104, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 244, + "unkn2": 11, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 1", + "level": 3, + "stage": 2, + "room": 1, + "pointer": 2952738, + "default_exits": [ + { + "room": 0, + "unkn1": 10, + "unkn2": 6, + "x": 2872, + "y": 136, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 2 - Animal 1", + "Sand Canyon 2 - Animal 2" + ], + "music": 40 + }, + { + "name": "Sand Canyon 2 - 2", + "level": 3, + "stage": 2, + "room": 2, + "pointer": 3531156, + "default_exits": [ + { + "room": 9, + "unkn1": 45, + "unkn2": 60, + "x": 88, + "y": 184, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 3", + "level": 3, + "stage": 2, + "room": 3, + "pointer": 3263731, + "default_exits": [ + { + "room": 4, + "unkn1": 63, + "unkn2": 5, + "x": 88, + "y": 184, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 68, + "unkn2": 5, + "x": 184, + "y": 184, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 73, + "unkn2": 5, + "x": 248, + "y": 184, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 130, + "unkn2": 9, + "x": 72, + "y": 312, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 4", + "level": 3, + "stage": 2, + "room": 4, + "pointer": 3076300, + "default_exits": [ + { + "room": 3, + "unkn1": 5, + "unkn2": 11, + "x": 1016, + "y": 88, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 10, + "unkn2": 11, + "x": 1112, + "y": 88, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 15, + "unkn2": 11, + "x": 1176, + "y": 88, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 2 - 1-Up (Enclave)" + ], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 5", + "level": 3, + "stage": 2, + "room": 5, + "pointer": 3302133, + "default_exits": [ + { + "room": 6, + "unkn1": 63, + "unkn2": 15, + "x": 120, + "y": 216, + "access_rule": [] + }, + { + "room": 8, + "unkn1": 71, + "unkn2": 18, + "x": 152, + "y": 136, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 130, + "unkn2": 19, + "x": 72, + "y": 952, + "access_rule": [] + }, + { + "room": 7, + "unkn1": 56, + "unkn2": 23, + "x": 88, + "y": 216, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 6", + "level": 3, + "stage": 2, + "room": 6, + "pointer": 3800612, + "default_exits": [ + { + "room": 5, + "unkn1": 17, + "unkn2": 13, + "x": 1144, + "y": 248, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 7", + "level": 3, + "stage": 2, + "room": 7, + "pointer": 3073888, + "default_exits": [ + { + "room": 5, + "unkn1": 15, + "unkn2": 8, + "x": 1016, + "y": 296, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 5, + "unkn2": 13, + "x": 904, + "y": 376, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 8", + "level": 3, + "stage": 2, + "room": 8, + "pointer": 3061270, + "default_exits": [ + { + "room": 5, + "unkn1": 19, + "unkn2": 13, + "x": 1256, + "y": 376, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 9", + "level": 3, + "stage": 2, + "room": 9, + "pointer": 3453286, + "default_exits": [ + { + "room": 10, + "unkn1": 246, + "unkn2": 10, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 2 - Maxim Tomato (Underwater)" + ], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 10", + "level": 3, + "stage": 2, + "room": 10, + "pointer": 2994821, + "default_exits": [ + { + "room": 11, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 2 - Auntie" + ], + "music": 8 + }, + { + "name": "Sand Canyon 2 - 11", + "level": 3, + "stage": 2, + "room": 11, + "pointer": 2891799, + "default_exits": [], + "locations": [ + "Sand Canyon 2 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon 3 - 0", + "level": 3, + "stage": 3, + "room": 0, + "pointer": 3544676, + "default_exits": [ + { + "room": 1, + "unkn1": 6, + "unkn2": 57, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 1, + "unkn1": 11, + "unkn2": 57, + "x": 200, + "y": 152, + "access_rule": [] + }, + { + "room": 1, + "unkn1": 16, + "unkn2": 57, + "x": 296, + "y": 152, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 23, + "unkn2": 109, + "x": 104, + "y": 72, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Sand Canyon 3 - 1", + "level": 3, + "stage": 3, + "room": 1, + "pointer": 2965655, + "default_exits": [ + { + "room": 0, + "unkn1": 5, + "unkn2": 9, + "x": 88, + "y": 920, + "access_rule": [] + }, + { + "room": 0, + "unkn1": 11, + "unkn2": 9, + "x": 168, + "y": 920, + "access_rule": [] + }, + { + "room": 0, + "unkn1": 17, + "unkn2": 9, + "x": 248, + "y": 920, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 3 - Animal 1", + "Sand Canyon 3 - Animal 2", + "Sand Canyon 3 - Animal 3" + ], + "music": 39 + }, + { + "name": "Sand Canyon 3 - 2", + "level": 3, + "stage": 3, + "room": 2, + "pointer": 3726270, + "default_exits": [ + { + "room": 3, + "unkn1": 184, + "unkn2": 20, + "x": 104, + "y": 232, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Sand Canyon 3 - 3", + "level": 3, + "stage": 3, + "room": 3, + "pointer": 3416806, + "default_exits": [ + { + "room": 8, + "unkn1": 130, + "unkn2": 14, + "x": 40, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Sand Canyon 3 - 4", + "level": 3, + "stage": 3, + "room": 4, + "pointer": 3564419, + "default_exits": [ + { + "room": 5, + "unkn1": 135, + "unkn2": 11, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Sand Canyon 3 - 5", + "level": 3, + "stage": 3, + "room": 5, + "pointer": 2973891, + "default_exits": [ + { + "room": 7, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 3 - Caramello" + ], + "music": 8 + }, + { + "name": "Sand Canyon 3 - 6", + "level": 3, + "stage": 3, + "room": 6, + "pointer": 3247969, + "default_exits": [ + { + "room": 4, + "unkn1": 95, + "unkn2": 8, + "x": 88, + "y": 424, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Sand Canyon 3 - 7", + "level": 3, + "stage": 3, + "room": 7, + "pointer": 2887702, + "default_exits": [], + "locations": [ + "Sand Canyon 3 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon 3 - 8", + "level": 3, + "stage": 3, + "room": 8, + "pointer": 2968057, + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 9, + "x": 104, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 31 + }, + { + "name": "Sand Canyon 4 - 0", + "level": 3, + "stage": 4, + "room": 0, + "pointer": 3521954, + "default_exits": [ + { + "room": 1, + "unkn1": 95, + "unkn2": 8, + "x": 216, + "y": 88, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 199, + "unkn2": 15, + "x": 104, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 1", + "level": 3, + "stage": 4, + "room": 1, + "pointer": 2956289, + "default_exits": [ + { + "room": 0, + "unkn1": 12, + "unkn2": 5, + "x": 1544, + "y": 136, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 4 - Animal 1", + "Sand Canyon 4 - Animal 2", + "Sand Canyon 4 - Animal 3" + ], + "music": 39 + }, + { + "name": "Sand Canyon 4 - 2", + "level": 3, + "stage": 4, + "room": 2, + "pointer": 3505360, + "default_exits": [ + { + "room": 3, + "unkn1": 149, + "unkn2": 14, + "x": 88, + "y": 216, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 4 - Maxim Tomato (Pacto)" + ], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 3", + "level": 3, + "stage": 4, + "room": 3, + "pointer": 3412361, + "default_exits": [ + { + "room": 4, + "unkn1": 115, + "unkn2": 6, + "x": 776, + "y": 120, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 29, + "unkn2": 8, + "x": 72, + "y": 88, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 105, + "unkn2": 14, + "x": 104, + "y": 216, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 115, + "unkn2": 20, + "x": 776, + "y": 248, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 64, + "unkn2": 21, + "x": 408, + "y": 232, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 4", + "level": 3, + "stage": 4, + "room": 4, + "pointer": 3307804, + "default_exits": [ + { + "room": 6, + "unkn1": 60, + "unkn2": 6, + "x": 88, + "y": 104, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 60, + "unkn2": 16, + "x": 88, + "y": 360, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 5", + "level": 3, + "stage": 4, + "room": 5, + "pointer": 2955407, + "default_exits": [ + { + "room": 6, + "unkn1": 16, + "unkn2": 13, + "x": 88, + "y": 232, + "access_rule": [] + } + ], + "locations": [], + "music": 4 + }, + { + "name": "Sand Canyon 4 - 6", + "level": 3, + "stage": 4, + "room": 6, + "pointer": 3094851, + "default_exits": [ + { + "room": 7, + "unkn1": 24, + "unkn2": 6, + "x": 56, + "y": 56, + "access_rule": [] + }, + { + "room": 7, + "unkn1": 24, + "unkn2": 14, + "x": 56, + "y": 104, + "access_rule": [] + }, + { + "room": 7, + "unkn1": 24, + "unkn2": 22, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 7", + "level": 3, + "stage": 4, + "room": 7, + "pointer": 3483428, + "default_exits": [ + { + "room": 8, + "unkn1": 266, + "unkn2": 9, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 4 - 1-Up (Clean)", + "Sand Canyon 4 - Maxim Tomato (Needle)" + ], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 8", + "level": 3, + "stage": 4, + "room": 8, + "pointer": 3002086, + "default_exits": [ + { + "room": 9, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 4 - Donbe & Hikari" + ], + "music": 8 + }, + { + "name": "Sand Canyon 4 - 9", + "level": 3, + "stage": 4, + "room": 9, + "pointer": 2885774, + "default_exits": [], + "locations": [ + "Sand Canyon 4 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon 5 - 0", + "level": 3, + "stage": 5, + "room": 0, + "pointer": 3662486, + "default_exits": [ + { + "room": 3, + "unkn1": 151, + "unkn2": 15, + "x": 184, + "y": 56, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 83, + "unkn2": 16, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 5 - 1-Up (Falling Block)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 5 - 1", + "level": 3, + "stage": 5, + "room": 1, + "pointer": 3052622, + "default_exits": [ + { + "room": 9, + "unkn1": 6, + "unkn2": 9, + "x": 216, + "y": 1128, + "access_rule": [] + } + ], + "locations": [], + "music": 13 + }, + { + "name": "Sand Canyon 5 - 2", + "level": 3, + "stage": 5, + "room": 2, + "pointer": 3057544, + "default_exits": [ + { + "room": 0, + "unkn1": 3, + "unkn2": 7, + "x": 1320, + "y": 264, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 5 - Animal 1" + ], + "music": 40 + }, + { + "name": "Sand Canyon 5 - 3", + "level": 3, + "stage": 5, + "room": 3, + "pointer": 3419011, + "default_exits": [ + { + "room": 4, + "unkn1": 12, + "unkn2": 66, + "x": 88, + "y": 88, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 5 - Maxim Tomato (Pit)", + "Sand Canyon 5 - 1-Up (Ice 1)", + "Sand Canyon 5 - 1-Up (Ice 2)", + "Sand Canyon 5 - 1-Up (Ice 3)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 5 - 4", + "level": 3, + "stage": 5, + "room": 4, + "pointer": 3644149, + "default_exits": [ + { + "room": 5, + "unkn1": 76, + "unkn2": 9, + "x": 88, + "y": 120, + "access_rule": [] + }, + { + "room": 9, + "unkn1": 116, + "unkn2": 14, + "x": 200, + "y": 1256, + "access_rule": [] + } + ], + "locations": [], + "music": 13 + }, + { + "name": "Sand Canyon 5 - 5", + "level": 3, + "stage": 5, + "room": 5, + "pointer": 3044100, + "default_exits": [ + { + "room": 4, + "unkn1": 4, + "unkn2": 7, + "x": 1240, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 5 - Animal 2" + ], + "music": 39 + }, + { + "name": "Sand Canyon 5 - 6", + "level": 3, + "stage": 5, + "room": 6, + "pointer": 3373481, + "default_exits": [ + { + "room": 7, + "unkn1": 25, + "unkn2": 5, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 13 + }, + { + "name": "Sand Canyon 5 - 7", + "level": 3, + "stage": 5, + "room": 7, + "pointer": 2964028, + "default_exits": [ + { + "room": 8, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 5 - Nyupun" + ], + "music": 8 + }, + { + "name": "Sand Canyon 5 - 8", + "level": 3, + "stage": 5, + "room": 8, + "pointer": 2890112, + "default_exits": [], + "locations": [ + "Sand Canyon 5 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon 5 - 9", + "level": 3, + "stage": 5, + "room": 9, + "pointer": 3647264, + "default_exits": [ + { + "room": 6, + "unkn1": 12, + "unkn2": 6, + "x": 72, + "y": 760, + "access_rule": [ + "Cutter" + ] + }, + { + "room": 1, + "unkn1": 12, + "unkn2": 70, + "x": 120, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 13 + }, + { + "name": "Sand Canyon 6 - 0", + "level": 3, + "stage": 6, + "room": 0, + "pointer": 3314761, + "default_exits": [ + { + "room": 2, + "unkn1": 132, + "unkn2": 16, + "x": 56, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 1", + "level": 3, + "stage": 6, + "room": 1, + "pointer": 2976913, + "default_exits": [ + { + "room": 22, + "unkn1": 24, + "unkn2": 13, + "x": 168, + "y": 216, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 6 - Animal 1", + "Sand Canyon 6 - Animal 2", + "Sand Canyon 6 - Animal 3" + ], + "music": 39 + }, + { + "name": "Sand Canyon 6 - 2", + "level": 3, + "stage": 6, + "room": 2, + "pointer": 2978757, + "default_exits": [ + { + "room": 11, + "unkn1": 55, + "unkn2": 6, + "x": 104, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 3", + "level": 3, + "stage": 6, + "room": 3, + "pointer": 3178082, + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 4", + "level": 3, + "stage": 6, + "room": 4, + "pointer": 3181563, + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 5", + "level": 3, + "stage": 6, + "room": 5, + "pointer": 3177209, + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 6", + "level": 3, + "stage": 6, + "room": 6, + "pointer": 3183291, + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 7", + "level": 3, + "stage": 6, + "room": 7, + "pointer": 3175453, + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 8", + "level": 3, + "stage": 6, + "room": 8, + "pointer": 3179826, + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 9", + "level": 3, + "stage": 6, + "room": 9, + "pointer": 3176334, + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 10", + "level": 3, + "stage": 6, + "room": 10, + "pointer": 3178954, + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 11", + "level": 3, + "stage": 6, + "room": 11, + "pointer": 2989149, + "default_exits": [ + { + "room": 3, + "unkn1": 37, + "unkn2": 6, + "x": 88, + "y": 264, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 12", + "level": 3, + "stage": 6, + "room": 12, + "pointer": 3015947, + "default_exits": [ + { + "room": 7, + "unkn1": 4, + "unkn2": 8, + "x": 440, + "y": 264, + "access_rule": [] + }, + { + "room": 13, + "unkn1": 86, + "unkn2": 8, + "x": 72, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 13", + "level": 3, + "stage": 6, + "room": 13, + "pointer": 2976539, + "default_exits": [ + { + "room": 23, + "unkn1": 55, + "unkn2": 8, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 14", + "level": 3, + "stage": 6, + "room": 14, + "pointer": 3030336, + "default_exits": [ + { + "room": 15, + "unkn1": 5, + "unkn2": 9, + "x": 200, + "y": 152, + "access_rule": [] + }, + { + "room": 8, + "unkn1": 35, + "unkn2": 9, + "x": 152, + "y": 392, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 15", + "level": 3, + "stage": 6, + "room": 15, + "pointer": 2972361, + "default_exits": [ + { + "room": 14, + "unkn1": 13, + "unkn2": 9, + "x": 104, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 16", + "level": 3, + "stage": 6, + "room": 16, + "pointer": 2953186, + "default_exits": [ + { + "room": 18, + "unkn1": 10, + "unkn2": 19, + "x": 248, + "y": 152, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 10, + "unkn2": 44, + "x": 264, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 17", + "level": 3, + "stage": 6, + "room": 17, + "pointer": 2953633, + "default_exits": [ + { + "room": 18, + "unkn1": 10, + "unkn2": 19, + "x": 248, + "y": 152, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 10, + "unkn2": 44, + "x": 264, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 18", + "level": 3, + "stage": 6, + "room": 18, + "pointer": 2991707, + "default_exits": [ + { + "room": 17, + "unkn1": 14, + "unkn2": 9, + "x": 184, + "y": 312, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 19", + "level": 3, + "stage": 6, + "room": 19, + "pointer": 2974651, + "default_exits": [ + { + "room": 10, + "unkn1": 5, + "unkn2": 9, + "x": 376, + "y": 392, + "access_rule": [] + }, + { + "room": 20, + "unkn1": 35, + "unkn2": 9, + "x": 88, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 20", + "level": 3, + "stage": 6, + "room": 20, + "pointer": 2969638, + "default_exits": [ + { + "room": 19, + "unkn1": 4, + "unkn2": 9, + "x": 552, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 21", + "level": 3, + "stage": 6, + "room": 21, + "pointer": 2976163, + "default_exits": [ + { + "room": 22, + "unkn1": 9, + "unkn2": 13, + "x": 296, + "y": 216, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 6 - Animal 4", + "Sand Canyon 6 - Animal 5", + "Sand Canyon 6 - Animal 6" + ], + "music": 40 + }, + { + "name": "Sand Canyon 6 - 22", + "level": 3, + "stage": 6, + "room": 22, + "pointer": 2950938, + "default_exits": [ + { + "room": 38, + "unkn1": 14, + "unkn2": 8, + "x": 168, + "y": 376, + "access_rule": [] + }, + { + "room": 1, + "unkn1": 9, + "unkn2": 13, + "x": 376, + "y": 216, + "access_rule": [] + }, + { + "room": 21, + "unkn1": 19, + "unkn2": 13, + "x": 168, + "y": 216, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 23", + "level": 3, + "stage": 6, + "room": 23, + "pointer": 3311993, + "default_exits": [ + { + "room": 43, + "unkn1": 145, + "unkn2": 7, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 24", + "level": 3, + "stage": 6, + "room": 24, + "pointer": 3079078, + "default_exits": [ + { + "room": 39, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 25, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 39, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 25", + "level": 3, + "stage": 6, + "room": 25, + "pointer": 3065898, + "default_exits": [ + { + "room": 26, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 40, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 40, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 26", + "level": 3, + "stage": 6, + "room": 26, + "pointer": 3063347, + "default_exits": [ + { + "room": 41, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 41, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 27, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 27", + "level": 3, + "stage": 6, + "room": 27, + "pointer": 3066916, + "default_exits": [ + { + "room": 28, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 42, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 42, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 28", + "level": 3, + "stage": 6, + "room": 28, + "pointer": 3067425, + "default_exits": [ + { + "room": 29, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 344, + "access_rule": [] + }, + { + "room": 29, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 344, + "access_rule": [] + }, + { + "room": 29, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 344, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 29", + "level": 3, + "stage": 6, + "room": 29, + "pointer": 2950032, + "default_exits": [ + { + "room": 30, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 30", + "level": 3, + "stage": 6, + "room": 30, + "pointer": 2986500, + "default_exits": [ + { + "room": 4, + "unkn1": 10, + "unkn2": 44, + "x": 136, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 31", + "level": 3, + "stage": 6, + "room": 31, + "pointer": 3070930, + "default_exits": [ + { + "room": 32, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 648, + "access_rule": [] + }, + { + "room": 32, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 32", + "level": 3, + "stage": 6, + "room": 32, + "pointer": 3054817, + "default_exits": [ + { + "room": 33, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 536, + "access_rule": [] + }, + { + "room": 33, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 33", + "level": 3, + "stage": 6, + "room": 33, + "pointer": 3053173, + "default_exits": [ + { + "room": 34, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 440, + "access_rule": [] + }, + { + "room": 34, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 34", + "level": 3, + "stage": 6, + "room": 34, + "pointer": 3053721, + "default_exits": [ + { + "room": 35, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 344, + "access_rule": [] + }, + { + "room": 35, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 35", + "level": 3, + "stage": 6, + "room": 35, + "pointer": 3054269, + "default_exits": [ + { + "room": 37, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 344, + "access_rule": [] + }, + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 248, + "access_rule": [] + }, + { + "room": 37, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 344, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 36", + "level": 3, + "stage": 6, + "room": 36, + "pointer": 2986164, + "default_exits": [ + { + "room": 6, + "unkn1": 10, + "unkn2": 44, + "x": 392, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 37", + "level": 3, + "stage": 6, + "room": 37, + "pointer": 3074377, + "default_exits": [ + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 38", + "level": 3, + "stage": 6, + "room": 38, + "pointer": 2971589, + "default_exits": [ + { + "room": 9, + "unkn1": 10, + "unkn2": 5, + "x": 264, + "y": 440, + "access_rule": [] + }, + { + "room": 22, + "unkn1": 10, + "unkn2": 23, + "x": 248, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 39", + "level": 3, + "stage": 6, + "room": 39, + "pointer": 3063858, + "default_exits": [ + { + "room": 40, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 40, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 40, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 40", + "level": 3, + "stage": 6, + "room": 40, + "pointer": 3064368, + "default_exits": [ + { + "room": 41, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 41, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 41, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 41", + "level": 3, + "stage": 6, + "room": 41, + "pointer": 3064878, + "default_exits": [ + { + "room": 42, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "access_rule": [] + }, + { + "room": 42, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "access_rule": [] + }, + { + "room": 42, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 42", + "level": 3, + "stage": 6, + "room": 42, + "pointer": 3068939, + "default_exits": [ + { + "room": 29, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 344, + "access_rule": [] + }, + { + "room": 29, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 344, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 43", + "level": 3, + "stage": 6, + "room": 43, + "pointer": 2988495, + "default_exits": [ + { + "room": 44, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Sand Canyon 6 - Professor Hector & R.O.B" + ], + "music": 8 + }, + { + "name": "Sand Canyon 6 - 44", + "level": 3, + "stage": 6, + "room": 44, + "pointer": 2886979, + "default_exits": [], + "locations": [ + "Sand Canyon 6 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon Boss - 0", + "level": 3, + "stage": 7, + "room": 0, + "pointer": 2991389, + "default_exits": [], + "locations": [ + "Sand Canyon - Boss (Pon & Con) Purified", + "Level 3 Boss" + ], + "music": 2 + }, + { + "name": "Cloudy Park 1 - 0", + "level": 4, + "stage": 1, + "room": 0, + "pointer": 3172795, + "default_exits": [ + { + "room": 1, + "unkn1": 95, + "unkn2": 5, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 1", + "level": 4, + "stage": 1, + "room": 1, + "pointer": 3078163, + "default_exits": [ + { + "room": 2, + "unkn1": 14, + "unkn2": 8, + "x": 88, + "y": 424, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 1 - Animal 1" + ], + "music": 39 + }, + { + "name": "Cloudy Park 1 - 2", + "level": 4, + "stage": 1, + "room": 2, + "pointer": 3285882, + "default_exits": [ + { + "room": 3, + "unkn1": 95, + "unkn2": 8, + "x": 40, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 3", + "level": 4, + "stage": 1, + "room": 3, + "pointer": 3062831, + "default_exits": [ + { + "room": 10, + "unkn1": 15, + "unkn2": 6, + "x": 56, + "y": 264, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 1 - Animal 2" + ], + "music": 39 + }, + { + "name": "Cloudy Park 1 - 4", + "level": 4, + "stage": 1, + "room": 4, + "pointer": 3396729, + "default_exits": [ + { + "room": 7, + "unkn1": 92, + "unkn2": 16, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 5", + "level": 4, + "stage": 1, + "room": 5, + "pointer": 3038805, + "default_exits": [ + { + "room": 6, + "unkn1": 6, + "unkn2": 5, + "x": 2344, + "y": 232, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 1 - Animal 3", + "Cloudy Park 1 - Animal 4" + ], + "music": 39 + }, + { + "name": "Cloudy Park 1 - 6", + "level": 4, + "stage": 1, + "room": 6, + "pointer": 3535736, + "default_exits": [ + { + "room": 8, + "unkn1": 5, + "unkn2": 8, + "x": 72, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 7", + "level": 4, + "stage": 1, + "room": 7, + "pointer": 2954080, + "default_exits": [ + { + "room": 11, + "unkn1": 14, + "unkn2": 6, + "x": 88, + "y": 104, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 1 - Animal 5" + ], + "music": 39 + }, + { + "name": "Cloudy Park 1 - 8", + "level": 4, + "stage": 1, + "room": 8, + "pointer": 3465407, + "default_exits": [ + { + "room": 12, + "unkn1": 181, + "unkn2": 6, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 9", + "level": 4, + "stage": 1, + "room": 9, + "pointer": 3078621, + "default_exits": [ + { + "room": 4, + "unkn1": 14, + "unkn2": 9, + "x": 56, + "y": 264, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 1 - Animal 6" + ], + "music": 39 + }, + { + "name": "Cloudy Park 1 - 10", + "level": 4, + "stage": 1, + "room": 10, + "pointer": 3281366, + "default_exits": [ + { + "room": 9, + "unkn1": 99, + "unkn2": 8, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 11", + "level": 4, + "stage": 1, + "room": 11, + "pointer": 3519608, + "default_exits": [ + { + "room": 5, + "unkn1": 64, + "unkn2": 6, + "x": 104, + "y": 216, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 1 - 1-Up (Shotzo)", + "Cloudy Park 1 - Maxim Tomato (Mariel)" + ], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 12", + "level": 4, + "stage": 1, + "room": 12, + "pointer": 2958914, + "default_exits": [ + { + "room": 13, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 1 - Hibanamodoki" + ], + "music": 8 + }, + { + "name": "Cloudy Park 1 - 13", + "level": 4, + "stage": 1, + "room": 13, + "pointer": 2886015, + "default_exits": [], + "locations": [ + "Cloudy Park 1 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park 2 - 0", + "level": 4, + "stage": 2, + "room": 0, + "pointer": 3142443, + "default_exits": [ + { + "room": 6, + "unkn1": 96, + "unkn2": 7, + "x": 56, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 1", + "level": 4, + "stage": 2, + "room": 1, + "pointer": 3235925, + "default_exits": [ + { + "room": 2, + "unkn1": 146, + "unkn2": 5, + "x": 88, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 2", + "level": 4, + "stage": 2, + "room": 2, + "pointer": 3297758, + "default_exits": [ + { + "room": 3, + "unkn1": 147, + "unkn2": 8, + "x": 72, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 3", + "level": 4, + "stage": 2, + "room": 3, + "pointer": 3341087, + "default_exits": [ + { + "room": 4, + "unkn1": 145, + "unkn2": 12, + "x": 72, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 4", + "level": 4, + "stage": 2, + "room": 4, + "pointer": 3457404, + "default_exits": [ + { + "room": 5, + "unkn1": 165, + "unkn2": 5, + "x": 72, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 5", + "level": 4, + "stage": 2, + "room": 5, + "pointer": 3273878, + "default_exits": [ + { + "room": 7, + "unkn1": 96, + "unkn2": 8, + "x": 56, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 6", + "level": 4, + "stage": 2, + "room": 6, + "pointer": 2984453, + "default_exits": [ + { + "room": 1, + "unkn1": 25, + "unkn2": 5, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 2 - Animal 1", + "Cloudy Park 2 - Animal 2", + "Cloudy Park 2 - Animal 3" + ], + "music": 38 + }, + { + "name": "Cloudy Park 2 - 7", + "level": 4, + "stage": 2, + "room": 7, + "pointer": 2985482, + "default_exits": [ + { + "room": 8, + "unkn1": 15, + "unkn2": 5, + "x": 40, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 8", + "level": 4, + "stage": 2, + "room": 8, + "pointer": 2990753, + "default_exits": [ + { + "room": 9, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 2 - Piyo & Keko" + ], + "music": 8 + }, + { + "name": "Cloudy Park 2 - 9", + "level": 4, + "stage": 2, + "room": 9, + "pointer": 2889630, + "default_exits": [], + "locations": [ + "Cloudy Park 2 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park 3 - 0", + "level": 4, + "stage": 3, + "room": 0, + "pointer": 3100859, + "default_exits": [ + { + "room": 2, + "unkn1": 145, + "unkn2": 8, + "x": 56, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Cloudy Park 3 - 1", + "level": 4, + "stage": 3, + "room": 1, + "pointer": 3209719, + "default_exits": [ + { + "room": 5, + "unkn1": 13, + "unkn2": 14, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Cloudy Park 3 - 2", + "level": 4, + "stage": 3, + "room": 2, + "pointer": 3216185, + "default_exits": [ + { + "room": 1, + "unkn1": 145, + "unkn2": 6, + "x": 216, + "y": 1064, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 24, + "unkn2": 14, + "x": 104, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Cloudy Park 3 - 3", + "level": 4, + "stage": 3, + "room": 3, + "pointer": 2994208, + "default_exits": [ + { + "room": 2, + "unkn1": 5, + "unkn2": 9, + "x": 408, + "y": 232, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 3 - Animal 1", + "Cloudy Park 3 - Animal 2", + "Cloudy Park 3 - Animal 3" + ], + "music": 40 + }, + { + "name": "Cloudy Park 3 - 4", + "level": 4, + "stage": 3, + "room": 4, + "pointer": 3229151, + "default_exits": [ + { + "room": 6, + "unkn1": 156, + "unkn2": 6, + "x": 56, + "y": 152, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 126, + "unkn2": 9, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 15 + }, + { + "name": "Cloudy Park 3 - 5", + "level": 4, + "stage": 3, + "room": 5, + "pointer": 2969244, + "default_exits": [ + { + "room": 4, + "unkn1": 14, + "unkn2": 9, + "x": 88, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 31 + }, + { + "name": "Cloudy Park 3 - 6", + "level": 4, + "stage": 3, + "room": 6, + "pointer": 4128530, + "default_exits": [ + { + "room": 7, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 3 - Mr. Ball" + ], + "music": 8 + }, + { + "name": "Cloudy Park 3 - 7", + "level": 4, + "stage": 3, + "room": 7, + "pointer": 2885051, + "default_exits": [], + "locations": [ + "Cloudy Park 3 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park 4 - 0", + "level": 4, + "stage": 4, + "room": 0, + "pointer": 3072905, + "default_exits": [ + { + "room": 1, + "unkn1": 95, + "unkn2": 9, + "x": 88, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 1", + "level": 4, + "stage": 4, + "room": 1, + "pointer": 3074863, + "default_exits": [ + { + "room": 2, + "unkn1": 21, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 4 - Animal 1", + "Cloudy Park 4 - Animal 2" + ], + "music": 38 + }, + { + "name": "Cloudy Park 4 - 2", + "level": 4, + "stage": 4, + "room": 2, + "pointer": 3309209, + "default_exits": [ + { + "room": 3, + "unkn1": 145, + "unkn2": 9, + "x": 104, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 3", + "level": 4, + "stage": 4, + "room": 3, + "pointer": 3296291, + "default_exits": [ + { + "room": 5, + "unkn1": 144, + "unkn2": 9, + "x": 56, + "y": 136, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 4 - 1-Up (Windy)", + "Cloudy Park 4 - Maxim Tomato (Windy)" + ], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 4", + "level": 4, + "stage": 4, + "room": 4, + "pointer": 3330996, + "default_exits": [ + { + "room": 7, + "unkn1": 4, + "unkn2": 15, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 5", + "level": 4, + "stage": 4, + "room": 5, + "pointer": 3332300, + "default_exits": [ + { + "room": 4, + "unkn1": 21, + "unkn2": 51, + "x": 2328, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 6", + "level": 4, + "stage": 4, + "room": 6, + "pointer": 3253310, + "default_exits": [ + { + "room": 9, + "unkn1": 3, + "unkn2": 6, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 7", + "level": 4, + "stage": 4, + "room": 7, + "pointer": 2967658, + "default_exits": [ + { + "room": 8, + "unkn1": 12, + "unkn2": 9, + "x": 152, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 4 + }, + { + "name": "Cloudy Park 4 - 8", + "level": 4, + "stage": 4, + "room": 8, + "pointer": 2981644, + "default_exits": [ + { + "room": 6, + "unkn1": 13, + "unkn2": 9, + "x": 344, + "y": 680, + "access_rule": [] + } + ], + "locations": [], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 9", + "level": 4, + "stage": 4, + "room": 9, + "pointer": 3008001, + "default_exits": [ + { + "room": 10, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 4 - Mikarin & Kagami Mocchi" + ], + "music": 8 + }, + { + "name": "Cloudy Park 4 - 10", + "level": 4, + "stage": 4, + "room": 10, + "pointer": 2888184, + "default_exits": [], + "locations": [ + "Cloudy Park 4 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park 5 - 0", + "level": 4, + "stage": 5, + "room": 0, + "pointer": 3192630, + "default_exits": [ + { + "room": 1, + "unkn1": 146, + "unkn2": 6, + "x": 168, + "y": 616, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 1", + "level": 4, + "stage": 5, + "room": 1, + "pointer": 3050956, + "default_exits": [ + { + "room": 2, + "unkn1": 32, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 5 - Maxim Tomato (Pillars)" + ], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 2", + "level": 4, + "stage": 5, + "room": 2, + "pointer": 3604194, + "default_exits": [ + { + "room": 3, + "unkn1": 17, + "unkn2": 9, + "x": 72, + "y": 88, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 5 - Animal 1", + "Cloudy Park 5 - Animal 2" + ], + "music": 40 + }, + { + "name": "Cloudy Park 5 - 3", + "level": 4, + "stage": 5, + "room": 3, + "pointer": 3131242, + "default_exits": [ + { + "room": 4, + "unkn1": 98, + "unkn2": 5, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 4", + "level": 4, + "stage": 5, + "room": 4, + "pointer": 2990116, + "default_exits": [ + { + "room": 5, + "unkn1": 23, + "unkn2": 7, + "x": 216, + "y": 744, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 5", + "level": 4, + "stage": 5, + "room": 5, + "pointer": 2975410, + "default_exits": [ + { + "room": 6, + "unkn1": 5, + "unkn2": 4, + "x": 104, + "y": 296, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 6", + "level": 4, + "stage": 5, + "room": 6, + "pointer": 3173683, + "default_exits": [ + { + "room": 7, + "unkn1": 115, + "unkn2": 6, + "x": 56, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 7", + "level": 4, + "stage": 5, + "room": 7, + "pointer": 2992340, + "default_exits": [ + { + "room": 8, + "unkn1": 14, + "unkn2": 8, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 5 - Pick" + ], + "music": 8 + }, + { + "name": "Cloudy Park 5 - 8", + "level": 4, + "stage": 5, + "room": 8, + "pointer": 2891558, + "default_exits": [], + "locations": [ + "Cloudy Park 5 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park 6 - 0", + "level": 4, + "stage": 6, + "room": 0, + "pointer": 3269847, + "default_exits": [ + { + "room": 2, + "unkn1": 65, + "unkn2": 9, + "x": 88, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 1", + "level": 4, + "stage": 6, + "room": 1, + "pointer": 3252248, + "default_exits": [ + { + "room": 10, + "unkn1": 3, + "unkn2": 25, + "x": 72, + "y": 72, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 2", + "level": 4, + "stage": 6, + "room": 2, + "pointer": 3028494, + "default_exits": [ + { + "room": 0, + "unkn1": 4, + "unkn2": 9, + "x": 1032, + "y": 152, + "access_rule": [] + }, + { + "room": 1, + "unkn1": 13, + "unkn2": 9, + "x": 56, + "y": 72, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 3", + "level": 4, + "stage": 6, + "room": 3, + "pointer": 3131911, + "default_exits": [ + { + "room": 10, + "unkn1": 4, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + }, + { + "room": 10, + "unkn1": 8, + "unkn2": 9, + "x": 136, + "y": 152, + "access_rule": [] + }, + { + "room": 10, + "unkn1": 12, + "unkn2": 9, + "x": 200, + "y": 152, + "access_rule": [] + }, + { + "room": 10, + "unkn1": 16, + "unkn2": 9, + "x": 264, + "y": 152, + "access_rule": [] + }, + { + "room": 10, + "unkn1": 20, + "unkn2": 9, + "x": 328, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 4", + "level": 4, + "stage": 6, + "room": 4, + "pointer": 3115416, + "default_exits": [ + { + "room": 8, + "unkn1": 20, + "unkn2": 4, + "x": 72, + "y": 488, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 8, + "unkn2": 9, + "x": 200, + "y": 152, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 12, + "unkn2": 9, + "x": 328, + "y": 152, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 16, + "unkn2": 9, + "x": 136, + "y": 152, + "access_rule": [] + }, + { + "room": 11, + "unkn1": 20, + "unkn2": 9, + "x": 264, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 5", + "level": 4, + "stage": 6, + "room": 5, + "pointer": 3245809, + "default_exits": [ + { + "room": 15, + "unkn1": 65, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 6", + "level": 4, + "stage": 6, + "room": 6, + "pointer": 3237044, + "default_exits": [ + { + "room": 7, + "unkn1": 56, + "unkn2": 9, + "x": 72, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 7", + "level": 4, + "stage": 6, + "room": 7, + "pointer": 3262705, + "default_exits": [ + { + "room": 13, + "unkn1": 12, + "unkn2": 8, + "x": 184, + "y": 216, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 57, + "unkn2": 8, + "x": 184, + "y": 216, + "access_rule": [] + }, + { + "room": 9, + "unkn1": 64, + "unkn2": 8, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 8", + "level": 4, + "stage": 6, + "room": 8, + "pointer": 3027259, + "default_exits": [ + { + "room": 12, + "unkn1": 13, + "unkn2": 4, + "x": 88, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 6 - 1-Up (Cutter)" + ], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 9", + "level": 4, + "stage": 6, + "room": 9, + "pointer": 3089504, + "default_exits": [ + { + "room": 4, + "unkn1": 35, + "unkn2": 7, + "x": 72, + "y": 72, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 10", + "level": 4, + "stage": 6, + "room": 10, + "pointer": 3132579, + "default_exits": [ + { + "room": 6, + "unkn1": 20, + "unkn2": 4, + "x": 72, + "y": 152, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 4, + "unkn2": 9, + "x": 88, + "y": 152, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 8, + "unkn2": 9, + "x": 136, + "y": 152, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 12, + "unkn2": 9, + "x": 200, + "y": 152, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 16, + "unkn2": 9, + "x": 264, + "y": 152, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 20, + "unkn2": 9, + "x": 328, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 6 - Animal 1", + "Cloudy Park 6 - Animal 2", + "Cloudy Park 6 - Animal 3" + ], + "music": 40 + }, + { + "name": "Cloudy Park 6 - 11", + "level": 4, + "stage": 6, + "room": 11, + "pointer": 3017866, + "default_exits": [ + { + "room": 4, + "unkn1": 4, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 8, + "unkn2": 9, + "x": 264, + "y": 152, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 12, + "unkn2": 9, + "x": 136, + "y": 152, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 16, + "unkn2": 9, + "x": 328, + "y": 152, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 20, + "unkn2": 9, + "x": 200, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 12", + "level": 4, + "stage": 6, + "room": 12, + "pointer": 3036404, + "default_exits": [ + { + "room": 8, + "unkn1": 4, + "unkn2": 9, + "x": 200, + "y": 72, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 13, + "unkn2": 9, + "x": 88, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 13", + "level": 4, + "stage": 6, + "room": 13, + "pointer": 2965251, + "default_exits": [ + { + "room": 7, + "unkn1": 10, + "unkn2": 13, + "x": 216, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 14", + "level": 4, + "stage": 6, + "room": 14, + "pointer": 3077236, + "default_exits": [ + { + "room": 7, + "unkn1": 10, + "unkn2": 13, + "x": 936, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 15", + "level": 4, + "stage": 6, + "room": 15, + "pointer": 3061794, + "default_exits": [ + { + "room": 16, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Cloudy Park 6 - HB-007" + ], + "music": 8 + }, + { + "name": "Cloudy Park 6 - 16", + "level": 4, + "stage": 6, + "room": 16, + "pointer": 2888907, + "default_exits": [], + "locations": [ + "Cloudy Park 6 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park Boss - 0", + "level": 4, + "stage": 7, + "room": 0, + "pointer": 2998682, + "default_exits": [], + "locations": [ + "Cloudy Park - Boss (Ado) Purified", + "Level 4 Boss" + ], + "music": 2 + }, + { + "name": "Iceberg 1 - 0", + "level": 5, + "stage": 1, + "room": 0, + "pointer": 3363111, + "default_exits": [ + { + "room": 1, + "unkn1": 104, + "unkn2": 8, + "x": 312, + "y": 1384, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Iceberg 1 - 1", + "level": 5, + "stage": 1, + "room": 1, + "pointer": 3596524, + "default_exits": [ + { + "room": 2, + "unkn1": 20, + "unkn2": 8, + "x": 72, + "y": 344, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Iceberg 1 - 2", + "level": 5, + "stage": 1, + "room": 2, + "pointer": 3288880, + "default_exits": [ + { + "room": 3, + "unkn1": 49, + "unkn2": 9, + "x": 184, + "y": 152, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 94, + "unkn2": 21, + "x": 120, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Iceberg 1 - 3", + "level": 5, + "stage": 1, + "room": 3, + "pointer": 3068439, + "default_exits": [ + { + "room": 2, + "unkn1": 10, + "unkn2": 9, + "x": 808, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 1 - Animal 1", + "Iceberg 1 - Animal 2" + ], + "music": 38 + }, + { + "name": "Iceberg 1 - 4", + "level": 5, + "stage": 1, + "room": 4, + "pointer": 3233681, + "default_exits": [ + { + "room": 6, + "unkn1": 74, + "unkn2": 4, + "x": 56, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Iceberg 1 - 5", + "level": 5, + "stage": 1, + "room": 5, + "pointer": 3406133, + "default_exits": [ + { + "room": 4, + "unkn1": 196, + "unkn2": 9, + "x": 72, + "y": 744, + "access_rule": [] + } + ], + "locations": [], + "music": 18 + }, + { + "name": "Iceberg 1 - 6", + "level": 5, + "stage": 1, + "room": 6, + "pointer": 2985823, + "default_exits": [ + { + "room": 7, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 1 - Kogoesou" + ], + "music": 8 + }, + { + "name": "Iceberg 1 - 7", + "level": 5, + "stage": 1, + "room": 7, + "pointer": 2892040, + "default_exits": [], + "locations": [ + "Iceberg 1 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg 2 - 0", + "level": 5, + "stage": 2, + "room": 0, + "pointer": 3106800, + "default_exits": [ + { + "room": 1, + "unkn1": 113, + "unkn2": 36, + "x": 88, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Iceberg 2 - 1", + "level": 5, + "stage": 2, + "room": 1, + "pointer": 3334841, + "default_exits": [ + { + "room": 2, + "unkn1": 109, + "unkn2": 20, + "x": 88, + "y": 72, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Iceberg 2 - 2", + "level": 5, + "stage": 2, + "room": 2, + "pointer": 3473408, + "default_exits": [ + { + "room": 6, + "unkn1": 102, + "unkn2": 5, + "x": 88, + "y": 152, + "access_rule": [] + }, + { + "room": 9, + "unkn1": 24, + "unkn2": 18, + "x": 88, + "y": 152, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 37, + "unkn2": 26, + "x": 200, + "y": 184, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 55, + "unkn2": 26, + "x": 200, + "y": 184, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 73, + "unkn2": 26, + "x": 200, + "y": 184, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Iceberg 2 - 3", + "level": 5, + "stage": 2, + "room": 3, + "pointer": 3037006, + "default_exits": [ + { + "room": 2, + "unkn1": 11, + "unkn2": 11, + "x": 616, + "y": 424, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Iceberg 2 - 4", + "level": 5, + "stage": 2, + "room": 4, + "pointer": 3035198, + "default_exits": [ + { + "room": 2, + "unkn1": 11, + "unkn2": 11, + "x": 904, + "y": 424, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Iceberg 2 - 5", + "level": 5, + "stage": 2, + "room": 5, + "pointer": 3128551, + "default_exits": [ + { + "room": 2, + "unkn1": 11, + "unkn2": 11, + "x": 1192, + "y": 424, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Iceberg 2 - 6", + "level": 5, + "stage": 2, + "room": 6, + "pointer": 3270857, + "default_exits": [ + { + "room": 7, + "unkn1": 65, + "unkn2": 9, + "x": 88, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Iceberg 2 - 7", + "level": 5, + "stage": 2, + "room": 7, + "pointer": 3212501, + "default_exits": [ + { + "room": 8, + "unkn1": 124, + "unkn2": 8, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 20 + }, + { + "name": "Iceberg 2 - 8", + "level": 5, + "stage": 2, + "room": 8, + "pointer": 2994515, + "default_exits": [ + { + "room": 10, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 2 - Samus" + ], + "music": 8 + }, + { + "name": "Iceberg 2 - 9", + "level": 5, + "stage": 2, + "room": 9, + "pointer": 3058084, + "default_exits": [ + { + "room": 2, + "unkn1": 4, + "unkn2": 9, + "x": 408, + "y": 296, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 2 - Animal 1", + "Iceberg 2 - Animal 2" + ], + "music": 39 + }, + { + "name": "Iceberg 2 - 10", + "level": 5, + "stage": 2, + "room": 10, + "pointer": 2887220, + "default_exits": [], + "locations": [ + "Iceberg 2 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg 3 - 0", + "level": 5, + "stage": 3, + "room": 0, + "pointer": 3455346, + "default_exits": [ + { + "room": 1, + "unkn1": 98, + "unkn2": 6, + "x": 200, + "y": 232, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 217, + "unkn2": 7, + "x": 40, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Iceberg 3 - 1", + "level": 5, + "stage": 3, + "room": 1, + "pointer": 3019769, + "default_exits": [ + { + "room": 0, + "unkn1": 11, + "unkn2": 14, + "x": 1592, + "y": 104, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 3 - Animal 1", + "Iceberg 3 - Animal 2", + "Iceberg 3 - Animal 3" + ], + "music": 38 + }, + { + "name": "Iceberg 3 - 2", + "level": 5, + "stage": 3, + "room": 2, + "pointer": 3618121, + "default_exits": [ + { + "room": 3, + "unkn1": 196, + "unkn2": 11, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 3 - Maxim Tomato (Ceiling)" + ], + "music": 14 + }, + { + "name": "Iceberg 3 - 3", + "level": 5, + "stage": 3, + "room": 3, + "pointer": 3650368, + "default_exits": [ + { + "room": 5, + "unkn1": 116, + "unkn2": 11, + "x": 40, + "y": 152, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 63, + "unkn2": 13, + "x": 184, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Iceberg 3 - 4", + "level": 5, + "stage": 3, + "room": 4, + "pointer": 3038208, + "default_exits": [ + { + "room": 3, + "unkn1": 10, + "unkn2": 8, + "x": 1032, + "y": 216, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 3 - Animal 4", + "Iceberg 3 - Animal 5" + ], + "music": 39 + }, + { + "name": "Iceberg 3 - 5", + "level": 5, + "stage": 3, + "room": 5, + "pointer": 3013938, + "default_exits": [ + { + "room": 6, + "unkn1": 15, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 31 + }, + { + "name": "Iceberg 3 - 6", + "level": 5, + "stage": 3, + "room": 6, + "pointer": 3624789, + "default_exits": [ + { + "room": 7, + "unkn1": 211, + "unkn2": 7, + "x": 40, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 14 + }, + { + "name": "Iceberg 3 - 7", + "level": 5, + "stage": 3, + "room": 7, + "pointer": 2989472, + "default_exits": [ + { + "room": 8, + "unkn1": 15, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 3 - Chef Kawasaki" + ], + "music": 8 + }, + { + "name": "Iceberg 3 - 8", + "level": 5, + "stage": 3, + "room": 8, + "pointer": 2889871, + "default_exits": [], + "locations": [ + "Iceberg 3 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg 4 - 0", + "level": 5, + "stage": 4, + "room": 0, + "pointer": 3274879, + "default_exits": [ + { + "room": 1, + "unkn1": 111, + "unkn2": 8, + "x": 72, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 1", + "level": 5, + "stage": 4, + "room": 1, + "pointer": 3371780, + "default_exits": [ + { + "room": 2, + "unkn1": 60, + "unkn2": 36, + "x": 216, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 2", + "level": 5, + "stage": 4, + "room": 2, + "pointer": 3284378, + "default_exits": [ + { + "room": 16, + "unkn1": 8, + "unkn2": 39, + "x": 168, + "y": 152, + "access_rule": [ + "Burning" + ] + }, + { + "room": 3, + "unkn1": 13, + "unkn2": 39, + "x": 88, + "y": 136, + "access_rule": [] + }, + { + "room": 17, + "unkn1": 18, + "unkn2": 39, + "x": 120, + "y": 152, + "access_rule": [ + "Burning" + ] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 3", + "level": 5, + "stage": 4, + "room": 3, + "pointer": 3162957, + "default_exits": [ + { + "room": 4, + "unkn1": 44, + "unkn2": 8, + "x": 216, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 4", + "level": 5, + "stage": 4, + "room": 4, + "pointer": 3261679, + "default_exits": [ + { + "room": 5, + "unkn1": 4, + "unkn2": 42, + "x": 104, + "y": 840, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 5", + "level": 5, + "stage": 4, + "room": 5, + "pointer": 3217398, + "default_exits": [ + { + "room": 6, + "unkn1": 19, + "unkn2": 5, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 6", + "level": 5, + "stage": 4, + "room": 6, + "pointer": 3108265, + "default_exits": [ + { + "room": 7, + "unkn1": 61, + "unkn2": 7, + "x": 456, + "y": 72, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 7", + "level": 5, + "stage": 4, + "room": 7, + "pointer": 3346202, + "default_exits": [ + { + "room": 8, + "unkn1": 39, + "unkn2": 6, + "x": 168, + "y": 104, + "access_rule": [] + }, + { + "room": 13, + "unkn1": 4, + "unkn2": 21, + "x": 88, + "y": 168, + "access_rule": [ + "Burning" + ] + }, + { + "room": 13, + "unkn1": 21, + "unkn2": 21, + "x": 280, + "y": 168, + "access_rule": [ + "Burning" + ] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 8", + "level": 5, + "stage": 4, + "room": 8, + "pointer": 3055911, + "default_exits": [ + { + "room": 7, + "unkn1": 10, + "unkn2": 5, + "x": 648, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 9", + "level": 5, + "stage": 4, + "room": 9, + "pointer": 3056457, + "default_exits": [ + { + "room": 11, + "unkn1": 13, + "unkn2": 9, + "x": 136, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 4 + }, + { + "name": "Iceberg 4 - 10", + "level": 5, + "stage": 4, + "room": 10, + "pointer": 3257516, + "default_exits": [ + { + "room": 9, + "unkn1": 8, + "unkn2": 37, + "x": 88, + "y": 40, + "access_rule": [] + }, + { + "room": 9, + "unkn1": 15, + "unkn2": 37, + "x": 200, + "y": 40, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 11", + "level": 5, + "stage": 4, + "room": 11, + "pointer": 3083322, + "default_exits": [ + { + "room": 12, + "unkn1": 46, + "unkn2": 8, + "x": 88, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 12", + "level": 5, + "stage": 4, + "room": 12, + "pointer": 3147724, + "default_exits": [ + { + "room": 18, + "unkn1": 64, + "unkn2": 7, + "x": 72, + "y": 456, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 13", + "level": 5, + "stage": 4, + "room": 13, + "pointer": 3370077, + "default_exits": [ + { + "room": 15, + "unkn1": 31, + "unkn2": 4, + "x": 216, + "y": 120, + "access_rule": [] + }, + { + "room": 10, + "unkn1": 46, + "unkn2": 10, + "x": 72, + "y": 88, + "access_rule": [] + }, + { + "room": 10, + "unkn1": 57, + "unkn2": 10, + "x": 312, + "y": 88, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 28, + "unkn2": 21, + "x": 152, + "y": 136, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 34, + "unkn2": 21, + "x": 280, + "y": 136, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 4 - Animal 1", + "Iceberg 4 - Animal 2", + "Iceberg 4 - Animal 3" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 14", + "level": 5, + "stage": 4, + "room": 14, + "pointer": 3057002, + "default_exits": [ + { + "room": 15, + "unkn1": 4, + "unkn2": 8, + "x": 88, + "y": 360, + "access_rule": [] + }, + { + "room": 13, + "unkn1": 10, + "unkn2": 8, + "x": 440, + "y": 344, + "access_rule": [] + }, + { + "room": 13, + "unkn1": 16, + "unkn2": 8, + "x": 568, + "y": 344, + "access_rule": [] + }, + { + "room": 15, + "unkn1": 22, + "unkn2": 8, + "x": 344, + "y": 360, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 15", + "level": 5, + "stage": 4, + "room": 15, + "pointer": 3116124, + "default_exits": [ + { + "room": 13, + "unkn1": 13, + "unkn2": 6, + "x": 520, + "y": 72, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 4, + "unkn2": 22, + "x": 88, + "y": 136, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 22, + "unkn2": 22, + "x": 344, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 16", + "level": 5, + "stage": 4, + "room": 16, + "pointer": 3069937, + "default_exits": [ + { + "room": 2, + "unkn1": 11, + "unkn2": 9, + "x": 152, + "y": 632, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 4 - Animal 4" + ], + "music": 38 + }, + { + "name": "Iceberg 4 - 17", + "level": 5, + "stage": 4, + "room": 17, + "pointer": 3072413, + "default_exits": [ + { + "room": 2, + "unkn1": 6, + "unkn2": 9, + "x": 280, + "y": 632, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 4 - Animal 5" + ], + "music": 38 + }, + { + "name": "Iceberg 4 - 18", + "level": 5, + "stage": 4, + "room": 18, + "pointer": 3404593, + "default_exits": [ + { + "room": 19, + "unkn1": 94, + "unkn2": 12, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 19", + "level": 5, + "stage": 4, + "room": 19, + "pointer": 3075826, + "default_exits": [ + { + "room": 20, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 4 - Name" + ], + "music": 8 + }, + { + "name": "Iceberg 4 - 20", + "level": 5, + "stage": 4, + "room": 20, + "pointer": 2887943, + "default_exits": [], + "locations": [ + "Iceberg 4 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg 5 - 0", + "level": 5, + "stage": 5, + "room": 0, + "pointer": 3316135, + "default_exits": [ + { + "room": 30, + "unkn1": 75, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 1", + "level": 5, + "stage": 5, + "room": 1, + "pointer": 3037607, + "default_exits": [ + { + "room": 2, + "unkn1": 12, + "unkn2": 6, + "x": 72, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 2", + "level": 5, + "stage": 5, + "room": 2, + "pointer": 3103842, + "default_exits": [ + { + "room": 25, + "unkn1": 27, + "unkn2": 6, + "x": 72, + "y": 200, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 3", + "level": 5, + "stage": 5, + "room": 3, + "pointer": 3135899, + "default_exits": [ + { + "room": 4, + "unkn1": 20, + "unkn2": 7, + "x": 72, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 4", + "level": 5, + "stage": 5, + "room": 4, + "pointer": 3180695, + "default_exits": [ + { + "room": 5, + "unkn1": 26, + "unkn2": 5, + "x": 56, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 5", + "level": 5, + "stage": 5, + "room": 5, + "pointer": 3106064, + "default_exits": [ + { + "room": 24, + "unkn1": 14, + "unkn2": 6, + "x": 168, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 6", + "level": 5, + "stage": 5, + "room": 6, + "pointer": 3276800, + "default_exits": [ + { + "room": 7, + "unkn1": 59, + "unkn2": 12, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 7", + "level": 5, + "stage": 5, + "room": 7, + "pointer": 3104585, + "default_exits": [ + { + "room": 26, + "unkn1": 25, + "unkn2": 7, + "x": 72, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 8", + "level": 5, + "stage": 5, + "room": 8, + "pointer": 3195121, + "default_exits": [ + { + "room": 9, + "unkn1": 35, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 9", + "level": 5, + "stage": 5, + "room": 9, + "pointer": 3087198, + "default_exits": [ + { + "room": 28, + "unkn1": 20, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 5 - 1-Up (Boulder)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 10", + "level": 5, + "stage": 5, + "room": 10, + "pointer": 3321612, + "default_exits": [ + { + "room": 32, + "unkn1": 45, + "unkn2": 15, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 11", + "level": 5, + "stage": 5, + "room": 11, + "pointer": 3139178, + "default_exits": [ + { + "room": 12, + "unkn1": 17, + "unkn2": 7, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 5 - 1-Up (Floor)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 12", + "level": 5, + "stage": 5, + "room": 12, + "pointer": 3118231, + "default_exits": [ + { + "room": 13, + "unkn1": 13, + "unkn2": 7, + "x": 72, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 13", + "level": 5, + "stage": 5, + "room": 13, + "pointer": 3021658, + "default_exits": [ + { + "room": 27, + "unkn1": 16, + "unkn2": 6, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 14", + "level": 5, + "stage": 5, + "room": 14, + "pointer": 3025398, + "default_exits": [ + { + "room": 15, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 216, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 5 - 1-Up (Peloo)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 15", + "level": 5, + "stage": 5, + "room": 15, + "pointer": 3167445, + "default_exits": [ + { + "room": 16, + "unkn1": 13, + "unkn2": 13, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 16", + "level": 5, + "stage": 5, + "room": 16, + "pointer": 3033990, + "default_exits": [ + { + "room": 33, + "unkn1": 36, + "unkn2": 9, + "x": 168, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 17", + "level": 5, + "stage": 5, + "room": 17, + "pointer": 3100111, + "default_exits": [ + { + "room": 20, + "unkn1": 40, + "unkn2": 7, + "x": 72, + "y": 200, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 18", + "level": 5, + "stage": 5, + "room": 18, + "pointer": 3030947, + "default_exits": [ + { + "room": 17, + "unkn1": 13, + "unkn2": 7, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 19", + "level": 5, + "stage": 5, + "room": 19, + "pointer": 3105326, + "default_exits": [ + { + "room": 21, + "unkn1": 13, + "unkn2": 4, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 20", + "level": 5, + "stage": 5, + "room": 20, + "pointer": 3118928, + "default_exits": [ + { + "room": 19, + "unkn1": 13, + "unkn2": 6, + "x": 72, + "y": 264, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 21", + "level": 5, + "stage": 5, + "room": 21, + "pointer": 3202517, + "default_exits": [ + { + "room": 22, + "unkn1": 29, + "unkn2": 9, + "x": 72, + "y": 72, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 22", + "level": 5, + "stage": 5, + "room": 22, + "pointer": 3014656, + "default_exits": [ + { + "room": 23, + "unkn1": 13, + "unkn2": 4, + "x": 72, + "y": 104, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 23", + "level": 5, + "stage": 5, + "room": 23, + "pointer": 3166550, + "default_exits": [ + { + "room": 34, + "unkn1": 27, + "unkn2": 6, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 24", + "level": 5, + "stage": 5, + "room": 24, + "pointer": 3029110, + "default_exits": [ + { + "room": 31, + "unkn1": 10, + "unkn2": 4, + "x": 72, + "y": 88, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 25", + "level": 5, + "stage": 5, + "room": 25, + "pointer": 3156420, + "default_exits": [ + { + "room": 3, + "unkn1": 25, + "unkn2": 7, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 26", + "level": 5, + "stage": 5, + "room": 26, + "pointer": 3127877, + "default_exits": [ + { + "room": 8, + "unkn1": 24, + "unkn2": 8, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 27", + "level": 5, + "stage": 5, + "room": 27, + "pointer": 3256471, + "default_exits": [ + { + "room": 14, + "unkn1": 26, + "unkn2": 9, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 28", + "level": 5, + "stage": 5, + "room": 28, + "pointer": 3029723, + "default_exits": [ + { + "room": 10, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 248, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 29", + "level": 5, + "stage": 5, + "room": 29, + "pointer": 3526568, + "default_exits": [ + { + "room": 36, + "unkn1": 10, + "unkn2": 6, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 30", + "level": 5, + "stage": 5, + "room": 30, + "pointer": 3022285, + "default_exits": [ + { + "room": 1, + "unkn1": 13, + "unkn2": 5, + "x": 88, + "y": 104, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 5 - Animal 1", + "Iceberg 5 - Animal 2" + ], + "music": 40 + }, + { + "name": "Iceberg 5 - 31", + "level": 5, + "stage": 5, + "room": 31, + "pointer": 3026019, + "default_exits": [ + { + "room": 6, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 200, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 5 - Animal 3", + "Iceberg 5 - Animal 4" + ], + "music": 40 + }, + { + "name": "Iceberg 5 - 32", + "level": 5, + "stage": 5, + "room": 32, + "pointer": 3039996, + "default_exits": [ + { + "room": 11, + "unkn1": 13, + "unkn2": 7, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 5 - Animal 5", + "Iceberg 5 - Animal 6" + ], + "music": 40 + }, + { + "name": "Iceberg 5 - 33", + "level": 5, + "stage": 5, + "room": 33, + "pointer": 3015302, + "default_exits": [ + { + "room": 18, + "unkn1": 10, + "unkn2": 6, + "x": 72, + "y": 152, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 5 - Animal 7", + "Iceberg 5 - Animal 8" + ], + "music": 40 + }, + { + "name": "Iceberg 5 - 34", + "level": 5, + "stage": 5, + "room": 34, + "pointer": 3185868, + "default_exits": [ + { + "room": 35, + "unkn1": 35, + "unkn2": 9, + "x": 200, + "y": 328, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 35", + "level": 5, + "stage": 5, + "room": 35, + "pointer": 3865635, + "default_exits": [ + { + "room": 29, + "unkn1": 12, + "unkn2": 7, + "x": 168, + "y": 1384, + "access_rule": [] + } + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 36", + "level": 5, + "stage": 5, + "room": 36, + "pointer": 3024154, + "default_exits": [ + { + "room": 37, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 5 - Shiro" + ], + "music": 8 + }, + { + "name": "Iceberg 5 - 37", + "level": 5, + "stage": 5, + "room": 37, + "pointer": 2890594, + "default_exits": [], + "locations": [ + "Iceberg 5 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg 6 - 0", + "level": 5, + "stage": 6, + "room": 0, + "pointer": 3385305, + "default_exits": [ + { + "room": 1, + "unkn1": 6, + "unkn2": 28, + "x": 136, + "y": 184, + "access_rule": [] + }, + { + "room": 1, + "unkn1": 12, + "unkn2": 28, + "x": 248, + "y": 184, + "access_rule": [] + }, + { + "room": 1, + "unkn1": 18, + "unkn2": 28, + "x": 360, + "y": 184, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 1", + "level": 5, + "stage": 6, + "room": 1, + "pointer": 3197599, + "default_exits": [ + { + "room": 2, + "unkn1": 8, + "unkn2": 5, + "x": 152, + "y": 184, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 15, + "unkn2": 5, + "x": 248, + "y": 184, + "access_rule": [] + }, + { + "room": 2, + "unkn1": 22, + "unkn2": 5, + "x": 344, + "y": 184, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 6 - Animal 1", + "Iceberg 6 - Animal 2", + "Iceberg 6 - Animal 3" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 2", + "level": 5, + "stage": 6, + "room": 2, + "pointer": 3097113, + "default_exits": [ + { + "room": 5, + "unkn1": 9, + "unkn2": 5, + "x": 136, + "y": 184, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 15, + "unkn2": 5, + "x": 248, + "y": 184, + "access_rule": [] + }, + { + "room": 5, + "unkn1": 21, + "unkn2": 5, + "x": 360, + "y": 184, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 3", + "level": 5, + "stage": 6, + "room": 3, + "pointer": 3198422, + "default_exits": [ + { + "room": 6, + "unkn1": 8, + "unkn2": 5, + "x": 152, + "y": 184, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 15, + "unkn2": 5, + "x": 248, + "y": 184, + "access_rule": [] + }, + { + "room": 6, + "unkn1": 22, + "unkn2": 5, + "x": 344, + "y": 184, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 6 - Animal 4", + "Iceberg 6 - Animal 5", + "Iceberg 6 - Animal 6" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 4", + "level": 5, + "stage": 6, + "room": 4, + "pointer": 3210507, + "default_exits": [ + { + "room": 3, + "unkn1": 9, + "unkn2": 5, + "x": 136, + "y": 184, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 15, + "unkn2": 5, + "x": 248, + "y": 184, + "access_rule": [] + }, + { + "room": 3, + "unkn1": 21, + "unkn2": 5, + "x": 360, + "y": 184, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 5", + "level": 5, + "stage": 6, + "room": 5, + "pointer": 3196776, + "default_exits": [ + { + "room": 4, + "unkn1": 8, + "unkn2": 5, + "x": 152, + "y": 184, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 15, + "unkn2": 5, + "x": 248, + "y": 184, + "access_rule": [] + }, + { + "room": 4, + "unkn1": 22, + "unkn2": 5, + "x": 344, + "y": 184, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 6 - Maxim Tomato (Left)", + "Iceberg 6 - 1-Up (Middle)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 6", + "level": 5, + "stage": 6, + "room": 6, + "pointer": 3208130, + "default_exits": [ + { + "room": 7, + "unkn1": 9, + "unkn2": 5, + "x": 136, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 7", + "level": 5, + "stage": 6, + "room": 7, + "pointer": 3124478, + "default_exits": [ + { + "room": 8, + "unkn1": 17, + "unkn2": 10, + "x": 296, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 8", + "level": 5, + "stage": 6, + "room": 8, + "pointer": 3110431, + "default_exits": [ + { + "room": 9, + "unkn1": 7, + "unkn2": 5, + "x": 152, + "y": 168, + "access_rule": [] + }, + { + "room": 14, + "unkn1": 14, + "unkn2": 5, + "x": 296, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 9", + "level": 5, + "stage": 6, + "room": 9, + "pointer": 3139832, + "default_exits": [ + { + "room": 10, + "unkn1": 16, + "unkn2": 10, + "x": 296, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 10", + "level": 5, + "stage": 6, + "room": 10, + "pointer": 3119624, + "default_exits": [ + { + "room": 11, + "unkn1": 7, + "unkn2": 5, + "x": 152, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 11", + "level": 5, + "stage": 6, + "room": 11, + "pointer": 3141139, + "default_exits": [ + { + "room": 12, + "unkn1": 16, + "unkn2": 10, + "x": 296, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 12", + "level": 5, + "stage": 6, + "room": 12, + "pointer": 3123788, + "default_exits": [ + { + "room": 13, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 13", + "level": 5, + "stage": 6, + "room": 13, + "pointer": 3143741, + "default_exits": [ + { + "room": 14, + "unkn1": 15, + "unkn2": 10, + "x": 296, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 14", + "level": 5, + "stage": 6, + "room": 14, + "pointer": 3120319, + "default_exits": [ + { + "room": 15, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 15", + "level": 5, + "stage": 6, + "room": 15, + "pointer": 3135238, + "default_exits": [ + { + "room": 16, + "unkn1": 15, + "unkn2": 10, + "x": 296, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 16", + "level": 5, + "stage": 6, + "room": 16, + "pointer": 3123096, + "default_exits": [ + { + "room": 17, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 17", + "level": 5, + "stage": 6, + "room": 17, + "pointer": 3144389, + "default_exits": [ + { + "room": 18, + "unkn1": 15, + "unkn2": 10, + "x": 296, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 18", + "level": 5, + "stage": 6, + "room": 18, + "pointer": 3121014, + "default_exits": [ + { + "room": 19, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 19", + "level": 5, + "stage": 6, + "room": 19, + "pointer": 3017228, + "default_exits": [ + { + "room": 20, + "unkn1": 15, + "unkn2": 10, + "x": 296, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 20", + "level": 5, + "stage": 6, + "room": 20, + "pointer": 3121709, + "default_exits": [ + { + "room": 21, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 168, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 21", + "level": 5, + "stage": 6, + "room": 21, + "pointer": 3145036, + "default_exits": [ + { + "room": 22, + "unkn1": 15, + "unkn2": 10, + "x": 296, + "y": 136, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 22", + "level": 5, + "stage": 6, + "room": 22, + "pointer": 3116830, + "default_exits": [ + { + "room": 23, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 152, + "access_rule": [] + } + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 23", + "level": 5, + "stage": 6, + "room": 23, + "pointer": 3045263, + "default_exits": [ + { + "room": 24, + "unkn1": 17, + "unkn2": 9, + "x": 72, + "y": 120, + "access_rule": [] + } + ], + "locations": [ + "Iceberg 6 - Angel" + ], + "music": 8 + }, + { + "name": "Iceberg 6 - 24", + "level": 5, + "stage": 6, + "room": 24, + "pointer": 2889389, + "default_exits": [], + "locations": [ + "Iceberg 6 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg Boss - 0", + "level": 5, + "stage": 7, + "room": 0, + "pointer": 2980207, + "default_exits": [], + "locations": [ + "Iceberg - Boss (Dedede) Purified", + "Level 5 Boss" + ], + "music": 7 + } +] \ No newline at end of file diff --git a/worlds/kdl3/test/TestLocations.py b/worlds/kdl3/test/TestLocations.py index a768d8162573..fec9568f6144 100644 --- a/worlds/kdl3/test/TestLocations.py +++ b/worlds/kdl3/test/TestLocations.py @@ -29,6 +29,7 @@ def testSimpleHeartStars(self): self.run_location_test(LocationName.cloudy_park_pick, ["Rick"]) self.run_location_test(LocationName.iceberg_kogoesou, ["Burning"]) self.run_location_test(LocationName.iceberg_samus, ["Ice"]) + self.run_location_test(LocationName.iceberg_name, ["Burning", "Coo", "ChuChu"]) self.run_location_test(LocationName.iceberg_angel, ["Cutter", "Burning", "Spark", "Parasol", "Needle", "Clean", "Stone", "Ice"]) def run_location_test(self, location: str, itempool: typing.List[str]): @@ -40,32 +41,6 @@ def run_location_test(self, location: str, itempool: typing.List[str]): self.remove(self.get_items_by_name(items)) -class TestName(KDL3TestBase): - options = { - "plando_connections": [ - [], - [ - PlandoConnection("Grass Land 1", "Grass Land 4", "both"), - PlandoConnection("Grass Land 2", "Iceberg 4", "both"), - PlandoConnection("Grass Land 3", "Sand Canyon 5", "both"), - PlandoConnection("Grass Land 4", "Grass Land 3", "both") - ]], - "stage_shuffle": "shuffled", - "plando_options": "connections" - } - - def testName(self): - assert not self.can_reach_location("Iceberg 4 - Name") - self.collect_by_name("Coo") - self.collect_by_name("ChuChu") - self.collect_by_name("Burning") - assert not self.can_reach_location("Iceberg 4 - Name") - # despite Name only requiring Burning/ChuChu/Coo for logic, it cannot be in logic because our - # three accessible stages do not actually give the player access to Coo, thus we need Cutter to pass 3-5 - self.collect_by_name("Cutter") - assert self.can_reach_location("Iceberg 4 - Name") - - class TestShiro(KDL3TestBase): options = { "plando_connections": [ From a08a29bf0209f16aaa1d5dc48b6067aca1bc6cde Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 14 Jul 2023 22:40:18 -0500 Subject: [PATCH 084/165] Add player to spoiler writing --- worlds/kdl3/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 9a502a784bc6..185314a4b42a 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -215,7 +215,7 @@ def modify_multidata(self, multidata: dict): def write_spoiler(self, spoiler_handle: TextIO) -> None: if self.stage_shuffle_enabled: - spoiler_handle.write("\nLevel Layout:\n") + spoiler_handle.write(f"\nLevel Layout ({self.multiworld.get_player_name(self.player)}):\n") for level in LocationName.level_names: for stage, i in zip(self.player_levels[self.player][LocationName.level_names[level]], range(1, 7)): spoiler_handle.write(f"{level} {i}: {location_table[stage].replace(' - Complete', '')}\n") From 355af8d0dea9e43b498723448df0029499bd08c9 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 22 Jul 2023 20:38:29 -0500 Subject: [PATCH 085/165] small optimization for animal writing --- worlds/kdl3/Regions.py | 4 +- worlds/kdl3/Room.py | 28 +- worlds/kdl3/data/Rooms.json | 539 ++++++++++++++++++++++++++++++++++++ 3 files changed, 546 insertions(+), 25 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 866b85158549..d5ed83fb6296 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -44,14 +44,14 @@ def generate_rooms(world: World, door_shuffle: bool, level_regions: typing.Dict[ rooms: typing.Dict[str, Room] = dict() for room_entry in room_data: room = Room(room_entry["name"], world.player, world.multiworld, None, room_entry["level"], room_entry["stage"], - room_entry["room"], room_entry["pointer"], room_entry["music"], room_entry["default_exits"]) + room_entry["room"], room_entry["pointer"], room_entry["music"], room_entry["default_exits"], + room_entry["animal_pointers"]) room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else None for location in room_entry["locations"] if not any([x in location for x in ["1-Up", "Maxim"]]) or world.multiworld.consumables[world.player]}, KDL3Location) rooms[room.name] = room world.multiworld.regions.extend([rooms[room] for room in rooms]) # fill animals, and set item rule - animal_friends = dict() if world.multiworld.animal_randomization[world.player] == 1: animal_pool = [animal_friend_spawns[spawn] for spawn in animal_friend_spawns if spawn != "Ripple Field 5 - Animal 2"] diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index f198d695f60d..b57fb17f6f6f 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -23,8 +23,9 @@ class Room(Region): room: int = 0 music: int = 0 default_exits: typing.List[typing.Dict[str, typing.Union[int, typing.List[str]]]] + animal_pointers: typing.List[int] - def __init__(self, name, player, multiworld, hint, level, stage, room, pointer, music, default_exits): + def __init__(self, name, player, multiworld, hint, level, stage, room, pointer, music, default_exits, animal_pointers): super().__init__(name, player, multiworld, hint) self.level = level self.stage = stage @@ -32,33 +33,14 @@ def __init__(self, name, player, multiworld, hint, level, stage, room, pointer, self.pointer = pointer self.music = music self.default_exits = default_exits + self.animal_pointers = animal_pointers def patch(self, rom: "RomData"): rom.write_byte(self.pointer + 2, self.music) animals = [x.item for x in self.locations if "Animal" in x.name] if len(animals) > 0: - entity_pointer = self.pointer + 168 - while unpack("H", rom.read_bytes(entity_pointer, 2))[0] != 0xFFFF: - entity_pointer += 2 - while unpack("H", rom.read_bytes(entity_pointer, 2))[0] != 0xFFFF: - entity_pointer += 2 - # we have to move two lists before reaching entities - entity_count = unpack("H", rom.read_bytes(entity_pointer, 2))[0] - entity_pointer += 2 - if entity_count == 0xFFFF: - return - entity_pointer += 2 # we don't need size - current_animal = 0 - for _ in range(entity_count): - entity_pointer += 4 - entity_type = struct.unpack("H", rom.read_bytes(entity_pointer, 2))[0] - entity_pointer += 2 - if entity_type == 0x02: - entity_pointer += 1 # don't need idx - rom.write_byte(entity_pointer, animal_map[animals[current_animal]]) - entity_pointer += 1 - else: - entity_pointer += 2 + for current_animal, address in zip(animals, self.animal_pointers): + rom.write_byte(address + 7, animal_map[animals[current_animal]]) room_data = [ diff --git a/worlds/kdl3/data/Rooms.json b/worlds/kdl3/data/Rooms.json index 65ba41a28ae4..f8d956f565d9 100644 --- a/worlds/kdl3/data/Rooms.json +++ b/worlds/kdl3/data/Rooms.json @@ -5,6 +5,7 @@ "stage": 1, "room": 0, "pointer": 3434257, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -32,6 +33,7 @@ "stage": 1, "room": 1, "pointer": 3368373, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -54,6 +56,10 @@ "stage": 1, "room": 2, "pointer": 2960650, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 0, @@ -76,6 +82,7 @@ "stage": 1, "room": 3, "pointer": 3478442, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -95,6 +102,7 @@ "stage": 1, "room": 4, "pointer": 2978390, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -116,6 +124,7 @@ "stage": 1, "room": 5, "pointer": 2890835, + "animal_pointers": [], "default_exits": [], "locations": [ "Grass Land 1 - Complete" @@ -128,6 +137,7 @@ "stage": 2, "room": 0, "pointer": 3293347, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -147,6 +157,10 @@ "stage": 2, "room": 1, "pointer": 3059685, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 2, @@ -169,6 +183,7 @@ "stage": 2, "room": 2, "pointer": 3432109, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -196,6 +211,7 @@ "stage": 2, "room": 3, "pointer": 2970029, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -215,6 +231,7 @@ "stage": 2, "room": 4, "pointer": 3578022, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -236,6 +253,7 @@ "stage": 2, "room": 5, "pointer": 2966057, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -257,6 +275,7 @@ "stage": 2, "room": 6, "pointer": 2887461, + "animal_pointers": [], "default_exits": [], "locations": [ "Grass Land 2 - Complete" @@ -269,6 +288,7 @@ "stage": 3, "room": 0, "pointer": 3149707, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -296,6 +316,7 @@ "stage": 3, "room": 1, "pointer": 3204939, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -318,6 +339,7 @@ "stage": 3, "room": 2, "pointer": 3200066, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -337,6 +359,7 @@ "stage": 3, "room": 3, "pointer": 2959784, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -356,6 +379,10 @@ "stage": 3, "room": 4, "pointer": 2979121, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 0, @@ -378,6 +405,7 @@ "stage": 3, "room": 5, "pointer": 2997811, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -397,6 +425,7 @@ "stage": 3, "room": 6, "pointer": 3084876, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -418,6 +447,7 @@ "stage": 3, "room": 7, "pointer": 2891317, + "animal_pointers": [], "default_exits": [], "locations": [ "Grass Land 3 - Complete" @@ -430,6 +460,7 @@ "stage": 4, "room": 0, "pointer": 3471284, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -449,6 +480,7 @@ "stage": 4, "room": 1, "pointer": 3436401, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -478,6 +510,7 @@ "stage": 4, "room": 2, "pointer": 3039401, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -497,6 +530,7 @@ "stage": 4, "room": 3, "pointer": 3722714, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -519,6 +553,7 @@ "stage": 4, "room": 4, "pointer": 3304980, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -540,6 +575,7 @@ "stage": 4, "room": 5, "pointer": 3498127, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -567,6 +603,7 @@ "stage": 4, "room": 6, "pointer": 3160191, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -594,6 +631,7 @@ "stage": 4, "room": 7, "pointer": 3035801, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -613,6 +651,7 @@ "stage": 4, "room": 8, "pointer": 2989794, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -634,6 +673,10 @@ "stage": 4, "room": 9, "pointer": 3043518, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 1, @@ -656,6 +699,7 @@ "stage": 4, "room": 10, "pointer": 2888425, + "animal_pointers": [], "default_exits": [], "locations": [ "Grass Land 4 - Complete" @@ -668,6 +712,7 @@ "stage": 5, "room": 0, "pointer": 3303565, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -687,6 +732,7 @@ "stage": 5, "room": 1, "pointer": 3048718, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -722,6 +768,7 @@ "stage": 5, "room": 2, "pointer": 3327019, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -741,6 +788,10 @@ "stage": 5, "room": 3, "pointer": 2966459, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 1, @@ -763,6 +814,10 @@ "stage": 5, "room": 4, "pointer": 2973509, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 1, @@ -785,6 +840,7 @@ "stage": 5, "room": 5, "pointer": 2962351, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -806,6 +862,7 @@ "stage": 5, "room": 6, "pointer": 2886738, + "animal_pointers": [], "default_exits": [], "locations": [ "Grass Land 5 - Complete" @@ -818,6 +875,7 @@ "stage": 5, "room": 7, "pointer": 3255423, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -837,6 +895,7 @@ "stage": 6, "room": 0, "pointer": 3376872, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -864,6 +923,7 @@ "stage": 6, "room": 1, "pointer": 3395125, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -885,6 +945,7 @@ "stage": 6, "room": 2, "pointer": 3375177, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -912,6 +973,7 @@ "stage": 6, "room": 3, "pointer": 3322977, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -931,6 +993,7 @@ "stage": 6, "room": 4, "pointer": 3490819, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -952,6 +1015,7 @@ "stage": 6, "room": 5, "pointer": 3076769, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -973,6 +1037,10 @@ "stage": 6, "room": 6, "pointer": 3047576, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 0, @@ -995,6 +1063,10 @@ "stage": 6, "room": 7, "pointer": 3022909, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 2, @@ -1017,6 +1089,7 @@ "stage": 6, "room": 8, "pointer": 2884569, + "animal_pointers": [], "default_exits": [], "locations": [ "Grass Land 6 - Complete" @@ -1029,6 +1102,7 @@ "stage": 7, "room": 0, "pointer": 2984105, + "animal_pointers": [], "default_exits": [], "locations": [ "Grass Land - Boss (Whispy Woods) Purified", @@ -1042,6 +1116,7 @@ "stage": 1, "room": 0, "pointer": 3279855, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -1061,6 +1136,7 @@ "stage": 1, "room": 1, "pointer": 3588688, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -1104,6 +1180,10 @@ "stage": 1, "room": 2, "pointer": 2955848, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 1, @@ -1126,6 +1206,7 @@ "stage": 1, "room": 3, "pointer": 3558828, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -1145,6 +1226,7 @@ "stage": 1, "room": 4, "pointer": 2974271, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -1166,6 +1248,7 @@ "stage": 1, "room": 5, "pointer": 3051513, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -1185,6 +1268,7 @@ "stage": 1, "room": 6, "pointer": 3049838, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -1204,6 +1288,7 @@ "stage": 1, "room": 7, "pointer": 3066407, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -1223,6 +1308,7 @@ "stage": 1, "room": 8, "pointer": 2889148, + "animal_pointers": [], "default_exits": [], "locations": [ "Ripple Field 1 - Complete" @@ -1235,6 +1321,7 @@ "stage": 2, "room": 0, "pointer": 3342336, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -1254,6 +1341,10 @@ "stage": 2, "room": 1, "pointer": 3084099, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 3, @@ -1276,6 +1367,7 @@ "stage": 2, "room": 2, "pointer": 3451207, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -1311,6 +1403,7 @@ "stage": 2, "room": 3, "pointer": 3674327, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -1333,6 +1426,7 @@ "stage": 2, "room": 4, "pointer": 2972744, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -1352,6 +1446,10 @@ "stage": 2, "room": 5, "pointer": 3109710, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 2, @@ -1374,6 +1472,7 @@ "stage": 2, "room": 6, "pointer": 2973127, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -1395,6 +1494,7 @@ "stage": 2, "room": 7, "pointer": 2890353, + "animal_pointers": [], "default_exits": [], "locations": [ "Ripple Field 2 - Complete" @@ -1407,6 +1507,7 @@ "stage": 3, "room": 0, "pointer": 3517254, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -1426,6 +1527,7 @@ "stage": 3, "room": 1, "pointer": 3604480, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -1448,6 +1550,7 @@ "stage": 3, "room": 2, "pointer": 3715428, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -1467,6 +1570,10 @@ "stage": 3, "room": 3, "pointer": 3071919, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 1, @@ -1489,6 +1596,7 @@ "stage": 3, "room": 4, "pointer": 2970810, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -1510,6 +1618,7 @@ "stage": 3, "room": 5, "pointer": 2987502, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -1529,6 +1638,7 @@ "stage": 3, "room": 6, "pointer": 2888666, + "animal_pointers": [], "default_exits": [], "locations": [ "Ripple Field 3 - Complete" @@ -1541,6 +1651,7 @@ "stage": 3, "room": 7, "pointer": 3161120, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -1568,6 +1679,7 @@ "stage": 4, "room": 0, "pointer": 3082540, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -1587,6 +1699,7 @@ "stage": 4, "room": 1, "pointer": 2964846, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -1606,6 +1719,7 @@ "stage": 4, "room": 2, "pointer": 3018503, + "animal_pointers": [], "default_exits": [ { "room": 11, @@ -1633,6 +1747,7 @@ "stage": 4, "room": 3, "pointer": 2988166, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -1654,6 +1769,7 @@ "stage": 4, "room": 4, "pointer": 2885533, + "animal_pointers": [], "default_exits": [], "locations": [ "Ripple Field 4 - Complete" @@ -1666,6 +1782,11 @@ "stage": 4, "room": 5, "pointer": 3042349, + "animal_pointers": [ + 222, + 230, + 238 + ], "default_exits": [ { "room": 6, @@ -1713,6 +1834,7 @@ "stage": 4, "room": 6, "pointer": 3234805, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -1756,6 +1878,7 @@ "stage": 4, "room": 7, "pointer": 3155468, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -1783,6 +1906,7 @@ "stage": 4, "room": 8, "pointer": 3350031, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -1826,6 +1950,7 @@ "stage": 4, "room": 9, "pointer": 3050397, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -1847,6 +1972,7 @@ "stage": 4, "room": 10, "pointer": 3052069, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -1868,6 +1994,7 @@ "stage": 4, "room": 11, "pointer": 3386974, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -1887,6 +2014,7 @@ "stage": 4, "room": 12, "pointer": 3168339, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -1914,6 +2042,7 @@ "stage": 4, "room": 13, "pointer": 2958478, + "animal_pointers": [], "default_exits": [ { "room": 12, @@ -1935,6 +2064,7 @@ "stage": 5, "room": 0, "pointer": 3240369, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -1954,6 +2084,7 @@ "stage": 5, "room": 1, "pointer": 3547528, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -1973,6 +2104,7 @@ "stage": 5, "room": 2, "pointer": 3611327, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -1992,6 +2124,7 @@ "stage": 5, "room": 3, "pointer": 3926157, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -2022,6 +2155,9 @@ "stage": 5, "room": 4, "pointer": 3026639, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 5, @@ -2043,6 +2179,7 @@ "stage": 5, "room": 5, "pointer": 3207333, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -2072,6 +2209,7 @@ "stage": 5, "room": 6, "pointer": 3485896, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -2091,6 +2229,7 @@ "stage": 5, "room": 7, "pointer": 3752698, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -2120,6 +2259,9 @@ "stage": 5, "room": 8, "pointer": 3044682, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 3, @@ -2141,6 +2283,7 @@ "stage": 5, "room": 9, "pointer": 2963193, + "animal_pointers": [], "default_exits": [ { "room": 11, @@ -2162,6 +2305,7 @@ "stage": 5, "room": 10, "pointer": 3042934, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -2181,6 +2325,7 @@ "stage": 5, "room": 11, "pointer": 2886256, + "animal_pointers": [], "default_exits": [], "locations": [ "Ripple Field 5 - Complete" @@ -2193,6 +2338,7 @@ "stage": 6, "room": 0, "pointer": 2949576, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -2212,6 +2358,11 @@ "stage": 6, "room": 1, "pointer": 2971200, + "animal_pointers": [ + 192, + 200, + 208 + ], "default_exits": [ { "room": 7, @@ -2235,6 +2386,7 @@ "stage": 6, "room": 2, "pointer": 3637749, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -2278,6 +2430,7 @@ "stage": 6, "room": 3, "pointer": 3092564, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -2305,6 +2458,7 @@ "stage": 6, "room": 4, "pointer": 3133247, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -2324,6 +2478,7 @@ "stage": 6, "room": 5, "pointer": 3507762, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -2391,6 +2546,7 @@ "stage": 6, "room": 6, "pointer": 3211264, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -2410,6 +2566,7 @@ "stage": 6, "room": 7, "pointer": 3586039, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -2429,6 +2586,7 @@ "stage": 6, "room": 8, "pointer": 3621483, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -2456,6 +2614,9 @@ "stage": 6, "room": 9, "pointer": 2954523, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 8, @@ -2477,6 +2638,7 @@ "stage": 6, "room": 10, "pointer": 3069438, + "animal_pointers": [], "default_exits": [ { "room": 11, @@ -2498,6 +2660,7 @@ "stage": 6, "room": 11, "pointer": 2886497, + "animal_pointers": [], "default_exits": [], "locations": [ "Ripple Field 6 - Complete" @@ -2510,6 +2673,7 @@ "stage": 7, "room": 0, "pointer": 3157370, + "animal_pointers": [], "default_exits": [], "locations": [ "Ripple Field - Boss (Acro) Purified", @@ -2523,6 +2687,7 @@ "stage": 1, "room": 0, "pointer": 3524267, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -2542,6 +2707,10 @@ "stage": 1, "room": 1, "pointer": 3163860, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 2, @@ -2564,6 +2733,7 @@ "stage": 1, "room": 2, "pointer": 3512532, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -2583,6 +2753,7 @@ "stage": 1, "room": 3, "pointer": 3719146, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -2602,6 +2773,7 @@ "stage": 1, "room": 4, "pointer": 3421212, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -2621,6 +2793,7 @@ "stage": 1, "room": 5, "pointer": 3203325, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -2648,6 +2821,7 @@ "stage": 1, "room": 6, "pointer": 3138524, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -2669,6 +2843,7 @@ "stage": 1, "room": 7, "pointer": 2988822, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -2690,6 +2865,7 @@ "stage": 1, "room": 8, "pointer": 2885292, + "animal_pointers": [], "default_exits": [], "locations": [ "Sand Canyon 1 - Complete" @@ -2702,6 +2878,7 @@ "stage": 2, "room": 0, "pointer": 3668370, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -2729,6 +2906,10 @@ "stage": 2, "room": 1, "pointer": 2952738, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 0, @@ -2751,6 +2932,7 @@ "stage": 2, "room": 2, "pointer": 3531156, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -2770,6 +2952,7 @@ "stage": 2, "room": 3, "pointer": 3263731, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -2813,6 +2996,7 @@ "stage": 2, "room": 4, "pointer": 3076300, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -2850,6 +3034,7 @@ "stage": 2, "room": 5, "pointer": 3302133, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -2893,6 +3078,7 @@ "stage": 2, "room": 6, "pointer": 3800612, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -2912,6 +3098,7 @@ "stage": 2, "room": 7, "pointer": 3073888, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -2939,6 +3126,7 @@ "stage": 2, "room": 8, "pointer": 3061270, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -2958,6 +3146,7 @@ "stage": 2, "room": 9, "pointer": 3453286, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -2979,6 +3168,7 @@ "stage": 2, "room": 10, "pointer": 2994821, + "animal_pointers": [], "default_exits": [ { "room": 11, @@ -3000,6 +3190,7 @@ "stage": 2, "room": 11, "pointer": 2891799, + "animal_pointers": [], "default_exits": [], "locations": [ "Sand Canyon 2 - Complete" @@ -3012,6 +3203,7 @@ "stage": 3, "room": 0, "pointer": 3544676, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -3055,6 +3247,11 @@ "stage": 3, "room": 1, "pointer": 2965655, + "animal_pointers": [ + 212, + 220, + 228 + ], "default_exits": [ { "room": 0, @@ -3094,6 +3291,7 @@ "stage": 3, "room": 2, "pointer": 3726270, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -3113,6 +3311,7 @@ "stage": 3, "room": 3, "pointer": 3416806, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -3132,6 +3331,7 @@ "stage": 3, "room": 4, "pointer": 3564419, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -3151,6 +3351,7 @@ "stage": 3, "room": 5, "pointer": 2973891, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -3172,6 +3373,7 @@ "stage": 3, "room": 6, "pointer": 3247969, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -3191,6 +3393,7 @@ "stage": 3, "room": 7, "pointer": 2887702, + "animal_pointers": [], "default_exits": [], "locations": [ "Sand Canyon 3 - Complete" @@ -3203,6 +3406,7 @@ "stage": 3, "room": 8, "pointer": 2968057, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -3222,6 +3426,7 @@ "stage": 4, "room": 0, "pointer": 3521954, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -3249,6 +3454,11 @@ "stage": 4, "room": 1, "pointer": 2956289, + "animal_pointers": [ + 192, + 200, + 208 + ], "default_exits": [ { "room": 0, @@ -3272,6 +3482,7 @@ "stage": 4, "room": 2, "pointer": 3505360, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -3293,6 +3504,7 @@ "stage": 4, "room": 3, "pointer": 3412361, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -3344,6 +3556,7 @@ "stage": 4, "room": 4, "pointer": 3307804, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -3371,6 +3584,7 @@ "stage": 4, "room": 5, "pointer": 2955407, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -3390,6 +3604,7 @@ "stage": 4, "room": 6, "pointer": 3094851, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -3425,6 +3640,7 @@ "stage": 4, "room": 7, "pointer": 3483428, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -3447,6 +3663,7 @@ "stage": 4, "room": 8, "pointer": 3002086, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -3468,6 +3685,7 @@ "stage": 4, "room": 9, "pointer": 2885774, + "animal_pointers": [], "default_exits": [], "locations": [ "Sand Canyon 4 - Complete" @@ -3480,6 +3698,7 @@ "stage": 5, "room": 0, "pointer": 3662486, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -3509,6 +3728,7 @@ "stage": 5, "room": 1, "pointer": 3052622, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -3528,6 +3748,9 @@ "stage": 5, "room": 2, "pointer": 3057544, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 0, @@ -3549,6 +3772,7 @@ "stage": 5, "room": 3, "pointer": 3419011, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -3573,6 +3797,7 @@ "stage": 5, "room": 4, "pointer": 3644149, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -3600,6 +3825,9 @@ "stage": 5, "room": 5, "pointer": 3044100, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 4, @@ -3621,6 +3849,7 @@ "stage": 5, "room": 6, "pointer": 3373481, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -3640,6 +3869,7 @@ "stage": 5, "room": 7, "pointer": 2964028, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -3661,6 +3891,7 @@ "stage": 5, "room": 8, "pointer": 2890112, + "animal_pointers": [], "default_exits": [], "locations": [ "Sand Canyon 5 - Complete" @@ -3673,6 +3904,7 @@ "stage": 5, "room": 9, "pointer": 3647264, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -3702,6 +3934,7 @@ "stage": 6, "room": 0, "pointer": 3314761, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -3721,6 +3954,11 @@ "stage": 6, "room": 1, "pointer": 2976913, + "animal_pointers": [ + 192, + 200, + 208 + ], "default_exits": [ { "room": 22, @@ -3744,6 +3982,7 @@ "stage": 6, "room": 2, "pointer": 2978757, + "animal_pointers": [], "default_exits": [ { "room": 11, @@ -3763,6 +4002,7 @@ "stage": 6, "room": 3, "pointer": 3178082, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -3838,6 +4078,7 @@ "stage": 6, "room": 4, "pointer": 3181563, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -3913,6 +4154,7 @@ "stage": 6, "room": 5, "pointer": 3177209, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -3988,6 +4230,7 @@ "stage": 6, "room": 6, "pointer": 3183291, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -4063,6 +4306,7 @@ "stage": 6, "room": 7, "pointer": 3175453, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -4138,6 +4382,7 @@ "stage": 6, "room": 8, "pointer": 3179826, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -4213,6 +4458,7 @@ "stage": 6, "room": 9, "pointer": 3176334, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -4288,6 +4534,7 @@ "stage": 6, "room": 10, "pointer": 3178954, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -4363,6 +4610,7 @@ "stage": 6, "room": 11, "pointer": 2989149, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -4382,6 +4630,7 @@ "stage": 6, "room": 12, "pointer": 3015947, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -4409,6 +4658,7 @@ "stage": 6, "room": 13, "pointer": 2976539, + "animal_pointers": [], "default_exits": [ { "room": 23, @@ -4428,6 +4678,7 @@ "stage": 6, "room": 14, "pointer": 3030336, + "animal_pointers": [], "default_exits": [ { "room": 15, @@ -4455,6 +4706,7 @@ "stage": 6, "room": 15, "pointer": 2972361, + "animal_pointers": [], "default_exits": [ { "room": 14, @@ -4474,6 +4726,7 @@ "stage": 6, "room": 16, "pointer": 2953186, + "animal_pointers": [], "default_exits": [ { "room": 18, @@ -4501,6 +4754,7 @@ "stage": 6, "room": 17, "pointer": 2953633, + "animal_pointers": [], "default_exits": [ { "room": 18, @@ -4528,6 +4782,7 @@ "stage": 6, "room": 18, "pointer": 2991707, + "animal_pointers": [], "default_exits": [ { "room": 17, @@ -4547,6 +4802,7 @@ "stage": 6, "room": 19, "pointer": 2974651, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -4574,6 +4830,7 @@ "stage": 6, "room": 20, "pointer": 2969638, + "animal_pointers": [], "default_exits": [ { "room": 19, @@ -4593,6 +4850,11 @@ "stage": 6, "room": 21, "pointer": 2976163, + "animal_pointers": [ + 192, + 200, + 208 + ], "default_exits": [ { "room": 22, @@ -4616,6 +4878,7 @@ "stage": 6, "room": 22, "pointer": 2950938, + "animal_pointers": [], "default_exits": [ { "room": 38, @@ -4651,6 +4914,7 @@ "stage": 6, "room": 23, "pointer": 3311993, + "animal_pointers": [], "default_exits": [ { "room": 43, @@ -4670,6 +4934,7 @@ "stage": 6, "room": 24, "pointer": 3079078, + "animal_pointers": [], "default_exits": [ { "room": 39, @@ -4705,6 +4970,7 @@ "stage": 6, "room": 25, "pointer": 3065898, + "animal_pointers": [], "default_exits": [ { "room": 26, @@ -4740,6 +5006,7 @@ "stage": 6, "room": 26, "pointer": 3063347, + "animal_pointers": [], "default_exits": [ { "room": 41, @@ -4775,6 +5042,7 @@ "stage": 6, "room": 27, "pointer": 3066916, + "animal_pointers": [], "default_exits": [ { "room": 28, @@ -4810,6 +5078,7 @@ "stage": 6, "room": 28, "pointer": 3067425, + "animal_pointers": [], "default_exits": [ { "room": 29, @@ -4845,6 +5114,7 @@ "stage": 6, "room": 29, "pointer": 2950032, + "animal_pointers": [], "default_exits": [ { "room": 30, @@ -4864,6 +5134,7 @@ "stage": 6, "room": 30, "pointer": 2986500, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -4883,6 +5154,7 @@ "stage": 6, "room": 31, "pointer": 3070930, + "animal_pointers": [], "default_exits": [ { "room": 32, @@ -4918,6 +5190,7 @@ "stage": 6, "room": 32, "pointer": 3054817, + "animal_pointers": [], "default_exits": [ { "room": 33, @@ -4953,6 +5226,7 @@ "stage": 6, "room": 33, "pointer": 3053173, + "animal_pointers": [], "default_exits": [ { "room": 34, @@ -4988,6 +5262,7 @@ "stage": 6, "room": 34, "pointer": 3053721, + "animal_pointers": [], "default_exits": [ { "room": 35, @@ -5023,6 +5298,7 @@ "stage": 6, "room": 35, "pointer": 3054269, + "animal_pointers": [], "default_exits": [ { "room": 37, @@ -5058,6 +5334,7 @@ "stage": 6, "room": 36, "pointer": 2986164, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -5077,6 +5354,7 @@ "stage": 6, "room": 37, "pointer": 3074377, + "animal_pointers": [], "default_exits": [ { "room": 36, @@ -5096,6 +5374,7 @@ "stage": 6, "room": 38, "pointer": 2971589, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -5123,6 +5402,7 @@ "stage": 6, "room": 39, "pointer": 3063858, + "animal_pointers": [], "default_exits": [ { "room": 40, @@ -5158,6 +5438,7 @@ "stage": 6, "room": 40, "pointer": 3064368, + "animal_pointers": [], "default_exits": [ { "room": 41, @@ -5193,6 +5474,7 @@ "stage": 6, "room": 41, "pointer": 3064878, + "animal_pointers": [], "default_exits": [ { "room": 42, @@ -5228,6 +5510,7 @@ "stage": 6, "room": 42, "pointer": 3068939, + "animal_pointers": [], "default_exits": [ { "room": 29, @@ -5255,6 +5538,7 @@ "stage": 6, "room": 43, "pointer": 2988495, + "animal_pointers": [], "default_exits": [ { "room": 44, @@ -5276,6 +5560,7 @@ "stage": 6, "room": 44, "pointer": 2886979, + "animal_pointers": [], "default_exits": [], "locations": [ "Sand Canyon 6 - Complete" @@ -5288,6 +5573,7 @@ "stage": 7, "room": 0, "pointer": 2991389, + "animal_pointers": [], "default_exits": [], "locations": [ "Sand Canyon - Boss (Pon & Con) Purified", @@ -5301,6 +5587,7 @@ "stage": 1, "room": 0, "pointer": 3172795, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -5320,6 +5607,9 @@ "stage": 1, "room": 1, "pointer": 3078163, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 2, @@ -5341,6 +5631,7 @@ "stage": 1, "room": 2, "pointer": 3285882, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -5360,6 +5651,9 @@ "stage": 1, "room": 3, "pointer": 3062831, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 10, @@ -5381,6 +5675,7 @@ "stage": 1, "room": 4, "pointer": 3396729, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -5400,6 +5695,10 @@ "stage": 1, "room": 5, "pointer": 3038805, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 6, @@ -5422,6 +5721,7 @@ "stage": 1, "room": 6, "pointer": 3535736, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -5441,6 +5741,9 @@ "stage": 1, "room": 7, "pointer": 2954080, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 11, @@ -5462,6 +5765,7 @@ "stage": 1, "room": 8, "pointer": 3465407, + "animal_pointers": [], "default_exits": [ { "room": 12, @@ -5481,6 +5785,9 @@ "stage": 1, "room": 9, "pointer": 3078621, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 4, @@ -5502,6 +5809,7 @@ "stage": 1, "room": 10, "pointer": 3281366, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -5521,6 +5829,7 @@ "stage": 1, "room": 11, "pointer": 3519608, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -5543,6 +5852,7 @@ "stage": 1, "room": 12, "pointer": 2958914, + "animal_pointers": [], "default_exits": [ { "room": 13, @@ -5564,6 +5874,7 @@ "stage": 1, "room": 13, "pointer": 2886015, + "animal_pointers": [], "default_exits": [], "locations": [ "Cloudy Park 1 - Complete" @@ -5576,6 +5887,7 @@ "stage": 2, "room": 0, "pointer": 3142443, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -5595,6 +5907,7 @@ "stage": 2, "room": 1, "pointer": 3235925, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -5614,6 +5927,7 @@ "stage": 2, "room": 2, "pointer": 3297758, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -5633,6 +5947,7 @@ "stage": 2, "room": 3, "pointer": 3341087, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -5652,6 +5967,7 @@ "stage": 2, "room": 4, "pointer": 3457404, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -5671,6 +5987,7 @@ "stage": 2, "room": 5, "pointer": 3273878, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -5690,6 +6007,11 @@ "stage": 2, "room": 6, "pointer": 2984453, + "animal_pointers": [ + 192, + 200, + 208 + ], "default_exits": [ { "room": 1, @@ -5713,6 +6035,7 @@ "stage": 2, "room": 7, "pointer": 2985482, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -5732,6 +6055,7 @@ "stage": 2, "room": 8, "pointer": 2990753, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -5753,6 +6077,7 @@ "stage": 2, "room": 9, "pointer": 2889630, + "animal_pointers": [], "default_exits": [], "locations": [ "Cloudy Park 2 - Complete" @@ -5765,6 +6090,7 @@ "stage": 3, "room": 0, "pointer": 3100859, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -5784,6 +6110,7 @@ "stage": 3, "room": 1, "pointer": 3209719, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -5803,6 +6130,7 @@ "stage": 3, "room": 2, "pointer": 3216185, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -5830,6 +6158,11 @@ "stage": 3, "room": 3, "pointer": 2994208, + "animal_pointers": [ + 192, + 200, + 208 + ], "default_exits": [ { "room": 2, @@ -5853,6 +6186,7 @@ "stage": 3, "room": 4, "pointer": 3229151, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -5880,6 +6214,7 @@ "stage": 3, "room": 5, "pointer": 2969244, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -5899,6 +6234,7 @@ "stage": 3, "room": 6, "pointer": 4128530, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -5920,6 +6256,7 @@ "stage": 3, "room": 7, "pointer": 2885051, + "animal_pointers": [], "default_exits": [], "locations": [ "Cloudy Park 3 - Complete" @@ -5932,6 +6269,7 @@ "stage": 4, "room": 0, "pointer": 3072905, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -5951,6 +6289,10 @@ "stage": 4, "room": 1, "pointer": 3074863, + "animal_pointers": [ + 208, + 224 + ], "default_exits": [ { "room": 2, @@ -5973,6 +6315,7 @@ "stage": 4, "room": 2, "pointer": 3309209, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -5992,6 +6335,7 @@ "stage": 4, "room": 3, "pointer": 3296291, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -6014,6 +6358,7 @@ "stage": 4, "room": 4, "pointer": 3330996, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -6033,6 +6378,7 @@ "stage": 4, "room": 5, "pointer": 3332300, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -6052,6 +6398,7 @@ "stage": 4, "room": 6, "pointer": 3253310, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -6071,6 +6418,7 @@ "stage": 4, "room": 7, "pointer": 2967658, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -6090,6 +6438,7 @@ "stage": 4, "room": 8, "pointer": 2981644, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -6109,6 +6458,7 @@ "stage": 4, "room": 9, "pointer": 3008001, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -6130,6 +6480,7 @@ "stage": 4, "room": 10, "pointer": 2888184, + "animal_pointers": [], "default_exits": [], "locations": [ "Cloudy Park 4 - Complete" @@ -6142,6 +6493,7 @@ "stage": 5, "room": 0, "pointer": 3192630, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -6161,6 +6513,7 @@ "stage": 5, "room": 1, "pointer": 3050956, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -6182,6 +6535,10 @@ "stage": 5, "room": 2, "pointer": 3604194, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 3, @@ -6204,6 +6561,7 @@ "stage": 5, "room": 3, "pointer": 3131242, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -6223,6 +6581,7 @@ "stage": 5, "room": 4, "pointer": 2990116, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -6242,6 +6601,7 @@ "stage": 5, "room": 5, "pointer": 2975410, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -6261,6 +6621,7 @@ "stage": 5, "room": 6, "pointer": 3173683, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -6280,6 +6641,7 @@ "stage": 5, "room": 7, "pointer": 2992340, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -6301,6 +6663,7 @@ "stage": 5, "room": 8, "pointer": 2891558, + "animal_pointers": [], "default_exits": [], "locations": [ "Cloudy Park 5 - Complete" @@ -6313,6 +6676,7 @@ "stage": 6, "room": 0, "pointer": 3269847, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -6332,6 +6696,7 @@ "stage": 6, "room": 1, "pointer": 3252248, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -6351,6 +6716,7 @@ "stage": 6, "room": 2, "pointer": 3028494, + "animal_pointers": [], "default_exits": [ { "room": 0, @@ -6378,6 +6744,7 @@ "stage": 6, "room": 3, "pointer": 3131911, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -6429,6 +6796,7 @@ "stage": 6, "room": 4, "pointer": 3115416, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -6488,6 +6856,7 @@ "stage": 6, "room": 5, "pointer": 3245809, + "animal_pointers": [], "default_exits": [ { "room": 15, @@ -6507,6 +6876,7 @@ "stage": 6, "room": 6, "pointer": 3237044, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -6526,6 +6896,7 @@ "stage": 6, "room": 7, "pointer": 3262705, + "animal_pointers": [], "default_exits": [ { "room": 13, @@ -6561,6 +6932,7 @@ "stage": 6, "room": 8, "pointer": 3027259, + "animal_pointers": [], "default_exits": [ { "room": 12, @@ -6582,6 +6954,7 @@ "stage": 6, "room": 9, "pointer": 3089504, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -6601,6 +6974,11 @@ "stage": 6, "room": 10, "pointer": 3132579, + "animal_pointers": [ + 242, + 250, + 258 + ], "default_exits": [ { "room": 6, @@ -6664,6 +7042,7 @@ "stage": 6, "room": 11, "pointer": 3017866, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -6715,6 +7094,7 @@ "stage": 6, "room": 12, "pointer": 3036404, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -6742,6 +7122,7 @@ "stage": 6, "room": 13, "pointer": 2965251, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -6761,6 +7142,7 @@ "stage": 6, "room": 14, "pointer": 3077236, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -6780,6 +7162,7 @@ "stage": 6, "room": 15, "pointer": 3061794, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -6801,6 +7184,7 @@ "stage": 6, "room": 16, "pointer": 2888907, + "animal_pointers": [], "default_exits": [], "locations": [ "Cloudy Park 6 - Complete" @@ -6813,6 +7197,7 @@ "stage": 7, "room": 0, "pointer": 2998682, + "animal_pointers": [], "default_exits": [], "locations": [ "Cloudy Park - Boss (Ado) Purified", @@ -6826,6 +7211,7 @@ "stage": 1, "room": 0, "pointer": 3363111, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -6845,6 +7231,7 @@ "stage": 1, "room": 1, "pointer": 3596524, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -6864,6 +7251,7 @@ "stage": 1, "room": 2, "pointer": 3288880, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -6891,6 +7279,10 @@ "stage": 1, "room": 3, "pointer": 3068439, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 2, @@ -6913,6 +7305,7 @@ "stage": 1, "room": 4, "pointer": 3233681, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -6932,6 +7325,7 @@ "stage": 1, "room": 5, "pointer": 3406133, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -6951,6 +7345,7 @@ "stage": 1, "room": 6, "pointer": 2985823, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -6972,6 +7367,7 @@ "stage": 1, "room": 7, "pointer": 2892040, + "animal_pointers": [], "default_exits": [], "locations": [ "Iceberg 1 - Complete" @@ -6984,6 +7380,7 @@ "stage": 2, "room": 0, "pointer": 3106800, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -7003,6 +7400,7 @@ "stage": 2, "room": 1, "pointer": 3334841, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -7022,6 +7420,7 @@ "stage": 2, "room": 2, "pointer": 3473408, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -7073,6 +7472,7 @@ "stage": 2, "room": 3, "pointer": 3037006, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -7092,6 +7492,7 @@ "stage": 2, "room": 4, "pointer": 3035198, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -7111,6 +7512,7 @@ "stage": 2, "room": 5, "pointer": 3128551, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -7130,6 +7532,7 @@ "stage": 2, "room": 6, "pointer": 3270857, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -7149,6 +7552,7 @@ "stage": 2, "room": 7, "pointer": 3212501, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -7168,6 +7572,7 @@ "stage": 2, "room": 8, "pointer": 2994515, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -7189,6 +7594,10 @@ "stage": 2, "room": 9, "pointer": 3058084, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 2, @@ -7211,6 +7620,7 @@ "stage": 2, "room": 10, "pointer": 2887220, + "animal_pointers": [], "default_exits": [], "locations": [ "Iceberg 2 - Complete" @@ -7223,6 +7633,7 @@ "stage": 3, "room": 0, "pointer": 3455346, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -7250,6 +7661,11 @@ "stage": 3, "room": 1, "pointer": 3019769, + "animal_pointers": [ + 192, + 200, + 208 + ], "default_exits": [ { "room": 0, @@ -7273,6 +7689,7 @@ "stage": 3, "room": 2, "pointer": 3618121, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -7294,6 +7711,7 @@ "stage": 3, "room": 3, "pointer": 3650368, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -7321,6 +7739,10 @@ "stage": 3, "room": 4, "pointer": 3038208, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 3, @@ -7343,6 +7765,7 @@ "stage": 3, "room": 5, "pointer": 3013938, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -7362,6 +7785,7 @@ "stage": 3, "room": 6, "pointer": 3624789, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -7381,6 +7805,7 @@ "stage": 3, "room": 7, "pointer": 2989472, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -7402,6 +7827,7 @@ "stage": 3, "room": 8, "pointer": 2889871, + "animal_pointers": [], "default_exits": [], "locations": [ "Iceberg 3 - Complete" @@ -7414,6 +7840,7 @@ "stage": 4, "room": 0, "pointer": 3274879, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -7433,6 +7860,7 @@ "stage": 4, "room": 1, "pointer": 3371780, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -7452,6 +7880,7 @@ "stage": 4, "room": 2, "pointer": 3284378, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -7491,6 +7920,7 @@ "stage": 4, "room": 3, "pointer": 3162957, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -7510,6 +7940,7 @@ "stage": 4, "room": 4, "pointer": 3261679, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -7529,6 +7960,7 @@ "stage": 4, "room": 5, "pointer": 3217398, + "animal_pointers": [], "default_exits": [ { "room": 6, @@ -7548,6 +7980,7 @@ "stage": 4, "room": 6, "pointer": 3108265, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -7567,6 +8000,7 @@ "stage": 4, "room": 7, "pointer": 3346202, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -7606,6 +8040,7 @@ "stage": 4, "room": 8, "pointer": 3055911, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -7625,6 +8060,7 @@ "stage": 4, "room": 9, "pointer": 3056457, + "animal_pointers": [], "default_exits": [ { "room": 11, @@ -7644,6 +8080,7 @@ "stage": 4, "room": 10, "pointer": 3257516, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -7671,6 +8108,7 @@ "stage": 4, "room": 11, "pointer": 3083322, + "animal_pointers": [], "default_exits": [ { "room": 12, @@ -7690,6 +8128,7 @@ "stage": 4, "room": 12, "pointer": 3147724, + "animal_pointers": [], "default_exits": [ { "room": 18, @@ -7709,6 +8148,11 @@ "stage": 4, "room": 13, "pointer": 3370077, + "animal_pointers": [ + 232, + 240, + 248 + ], "default_exits": [ { "room": 15, @@ -7764,6 +8208,7 @@ "stage": 4, "room": 14, "pointer": 3057002, + "animal_pointers": [], "default_exits": [ { "room": 15, @@ -7807,6 +8252,7 @@ "stage": 4, "room": 15, "pointer": 3116124, + "animal_pointers": [], "default_exits": [ { "room": 13, @@ -7842,6 +8288,9 @@ "stage": 4, "room": 16, "pointer": 3069937, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 2, @@ -7863,6 +8312,9 @@ "stage": 4, "room": 17, "pointer": 3072413, + "animal_pointers": [ + 192 + ], "default_exits": [ { "room": 2, @@ -7884,6 +8336,7 @@ "stage": 4, "room": 18, "pointer": 3404593, + "animal_pointers": [], "default_exits": [ { "room": 19, @@ -7903,6 +8356,7 @@ "stage": 4, "room": 19, "pointer": 3075826, + "animal_pointers": [], "default_exits": [ { "room": 20, @@ -7924,6 +8378,7 @@ "stage": 4, "room": 20, "pointer": 2887943, + "animal_pointers": [], "default_exits": [], "locations": [ "Iceberg 4 - Complete" @@ -7936,6 +8391,7 @@ "stage": 5, "room": 0, "pointer": 3316135, + "animal_pointers": [], "default_exits": [ { "room": 30, @@ -7955,6 +8411,7 @@ "stage": 5, "room": 1, "pointer": 3037607, + "animal_pointers": [], "default_exits": [ { "room": 2, @@ -7974,6 +8431,7 @@ "stage": 5, "room": 2, "pointer": 3103842, + "animal_pointers": [], "default_exits": [ { "room": 25, @@ -7993,6 +8451,7 @@ "stage": 5, "room": 3, "pointer": 3135899, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -8012,6 +8471,7 @@ "stage": 5, "room": 4, "pointer": 3180695, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -8031,6 +8491,7 @@ "stage": 5, "room": 5, "pointer": 3106064, + "animal_pointers": [], "default_exits": [ { "room": 24, @@ -8050,6 +8511,7 @@ "stage": 5, "room": 6, "pointer": 3276800, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -8069,6 +8531,7 @@ "stage": 5, "room": 7, "pointer": 3104585, + "animal_pointers": [], "default_exits": [ { "room": 26, @@ -8088,6 +8551,7 @@ "stage": 5, "room": 8, "pointer": 3195121, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -8107,6 +8571,7 @@ "stage": 5, "room": 9, "pointer": 3087198, + "animal_pointers": [], "default_exits": [ { "room": 28, @@ -8128,6 +8593,7 @@ "stage": 5, "room": 10, "pointer": 3321612, + "animal_pointers": [], "default_exits": [ { "room": 32, @@ -8147,6 +8613,7 @@ "stage": 5, "room": 11, "pointer": 3139178, + "animal_pointers": [], "default_exits": [ { "room": 12, @@ -8168,6 +8635,7 @@ "stage": 5, "room": 12, "pointer": 3118231, + "animal_pointers": [], "default_exits": [ { "room": 13, @@ -8187,6 +8655,7 @@ "stage": 5, "room": 13, "pointer": 3021658, + "animal_pointers": [], "default_exits": [ { "room": 27, @@ -8206,6 +8675,7 @@ "stage": 5, "room": 14, "pointer": 3025398, + "animal_pointers": [], "default_exits": [ { "room": 15, @@ -8227,6 +8697,7 @@ "stage": 5, "room": 15, "pointer": 3167445, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -8246,6 +8717,7 @@ "stage": 5, "room": 16, "pointer": 3033990, + "animal_pointers": [], "default_exits": [ { "room": 33, @@ -8265,6 +8737,7 @@ "stage": 5, "room": 17, "pointer": 3100111, + "animal_pointers": [], "default_exits": [ { "room": 20, @@ -8284,6 +8757,7 @@ "stage": 5, "room": 18, "pointer": 3030947, + "animal_pointers": [], "default_exits": [ { "room": 17, @@ -8303,6 +8777,7 @@ "stage": 5, "room": 19, "pointer": 3105326, + "animal_pointers": [], "default_exits": [ { "room": 21, @@ -8322,6 +8797,7 @@ "stage": 5, "room": 20, "pointer": 3118928, + "animal_pointers": [], "default_exits": [ { "room": 19, @@ -8341,6 +8817,7 @@ "stage": 5, "room": 21, "pointer": 3202517, + "animal_pointers": [], "default_exits": [ { "room": 22, @@ -8360,6 +8837,7 @@ "stage": 5, "room": 22, "pointer": 3014656, + "animal_pointers": [], "default_exits": [ { "room": 23, @@ -8379,6 +8857,7 @@ "stage": 5, "room": 23, "pointer": 3166550, + "animal_pointers": [], "default_exits": [ { "room": 34, @@ -8398,6 +8877,7 @@ "stage": 5, "room": 24, "pointer": 3029110, + "animal_pointers": [], "default_exits": [ { "room": 31, @@ -8417,6 +8897,7 @@ "stage": 5, "room": 25, "pointer": 3156420, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -8436,6 +8917,7 @@ "stage": 5, "room": 26, "pointer": 3127877, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -8455,6 +8937,7 @@ "stage": 5, "room": 27, "pointer": 3256471, + "animal_pointers": [], "default_exits": [ { "room": 14, @@ -8474,6 +8957,7 @@ "stage": 5, "room": 28, "pointer": 3029723, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -8493,6 +8977,7 @@ "stage": 5, "room": 29, "pointer": 3526568, + "animal_pointers": [], "default_exits": [ { "room": 36, @@ -8512,6 +8997,10 @@ "stage": 5, "room": 30, "pointer": 3022285, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 1, @@ -8534,6 +9023,10 @@ "stage": 5, "room": 31, "pointer": 3026019, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 6, @@ -8556,6 +9049,10 @@ "stage": 5, "room": 32, "pointer": 3039996, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 11, @@ -8578,6 +9075,10 @@ "stage": 5, "room": 33, "pointer": 3015302, + "animal_pointers": [ + 192, + 200 + ], "default_exits": [ { "room": 18, @@ -8600,6 +9101,7 @@ "stage": 5, "room": 34, "pointer": 3185868, + "animal_pointers": [], "default_exits": [ { "room": 35, @@ -8619,6 +9121,7 @@ "stage": 5, "room": 35, "pointer": 3865635, + "animal_pointers": [], "default_exits": [ { "room": 29, @@ -8638,6 +9141,7 @@ "stage": 5, "room": 36, "pointer": 3024154, + "animal_pointers": [], "default_exits": [ { "room": 37, @@ -8659,6 +9163,7 @@ "stage": 5, "room": 37, "pointer": 2890594, + "animal_pointers": [], "default_exits": [], "locations": [ "Iceberg 5 - Complete" @@ -8671,6 +9176,7 @@ "stage": 6, "room": 0, "pointer": 3385305, + "animal_pointers": [], "default_exits": [ { "room": 1, @@ -8706,6 +9212,11 @@ "stage": 6, "room": 1, "pointer": 3197599, + "animal_pointers": [ + 212, + 220, + 228 + ], "default_exits": [ { "room": 2, @@ -8745,6 +9256,7 @@ "stage": 6, "room": 2, "pointer": 3097113, + "animal_pointers": [], "default_exits": [ { "room": 5, @@ -8780,6 +9292,11 @@ "stage": 6, "room": 3, "pointer": 3198422, + "animal_pointers": [ + 212, + 220, + 228 + ], "default_exits": [ { "room": 6, @@ -8819,6 +9336,7 @@ "stage": 6, "room": 4, "pointer": 3210507, + "animal_pointers": [], "default_exits": [ { "room": 3, @@ -8854,6 +9372,7 @@ "stage": 6, "room": 5, "pointer": 3196776, + "animal_pointers": [], "default_exits": [ { "room": 4, @@ -8892,6 +9411,7 @@ "stage": 6, "room": 6, "pointer": 3208130, + "animal_pointers": [], "default_exits": [ { "room": 7, @@ -8911,6 +9431,7 @@ "stage": 6, "room": 7, "pointer": 3124478, + "animal_pointers": [], "default_exits": [ { "room": 8, @@ -8930,6 +9451,7 @@ "stage": 6, "room": 8, "pointer": 3110431, + "animal_pointers": [], "default_exits": [ { "room": 9, @@ -8957,6 +9479,7 @@ "stage": 6, "room": 9, "pointer": 3139832, + "animal_pointers": [], "default_exits": [ { "room": 10, @@ -8976,6 +9499,7 @@ "stage": 6, "room": 10, "pointer": 3119624, + "animal_pointers": [], "default_exits": [ { "room": 11, @@ -8995,6 +9519,7 @@ "stage": 6, "room": 11, "pointer": 3141139, + "animal_pointers": [], "default_exits": [ { "room": 12, @@ -9014,6 +9539,7 @@ "stage": 6, "room": 12, "pointer": 3123788, + "animal_pointers": [], "default_exits": [ { "room": 13, @@ -9033,6 +9559,7 @@ "stage": 6, "room": 13, "pointer": 3143741, + "animal_pointers": [], "default_exits": [ { "room": 14, @@ -9052,6 +9579,7 @@ "stage": 6, "room": 14, "pointer": 3120319, + "animal_pointers": [], "default_exits": [ { "room": 15, @@ -9071,6 +9599,7 @@ "stage": 6, "room": 15, "pointer": 3135238, + "animal_pointers": [], "default_exits": [ { "room": 16, @@ -9090,6 +9619,7 @@ "stage": 6, "room": 16, "pointer": 3123096, + "animal_pointers": [], "default_exits": [ { "room": 17, @@ -9109,6 +9639,7 @@ "stage": 6, "room": 17, "pointer": 3144389, + "animal_pointers": [], "default_exits": [ { "room": 18, @@ -9128,6 +9659,7 @@ "stage": 6, "room": 18, "pointer": 3121014, + "animal_pointers": [], "default_exits": [ { "room": 19, @@ -9147,6 +9679,7 @@ "stage": 6, "room": 19, "pointer": 3017228, + "animal_pointers": [], "default_exits": [ { "room": 20, @@ -9166,6 +9699,7 @@ "stage": 6, "room": 20, "pointer": 3121709, + "animal_pointers": [], "default_exits": [ { "room": 21, @@ -9185,6 +9719,7 @@ "stage": 6, "room": 21, "pointer": 3145036, + "animal_pointers": [], "default_exits": [ { "room": 22, @@ -9204,6 +9739,7 @@ "stage": 6, "room": 22, "pointer": 3116830, + "animal_pointers": [], "default_exits": [ { "room": 23, @@ -9223,6 +9759,7 @@ "stage": 6, "room": 23, "pointer": 3045263, + "animal_pointers": [], "default_exits": [ { "room": 24, @@ -9244,6 +9781,7 @@ "stage": 6, "room": 24, "pointer": 2889389, + "animal_pointers": [], "default_exits": [], "locations": [ "Iceberg 6 - Complete" @@ -9256,6 +9794,7 @@ "stage": 7, "room": 0, "pointer": 2980207, + "animal_pointers": [], "default_exits": [], "locations": [ "Iceberg - Boss (Dedede) Purified", From ba2283cc3394a3280061fd33d9e9c70fa3e4dff2 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 29 Jul 2023 17:58:55 -0500 Subject: [PATCH 086/165] fill_restrictive animals, vc fixes --- worlds/kdl3/Names/EnemyAbilities.py | 707 +++++++++ worlds/kdl3/Options.py | 28 + worlds/kdl3/Regions.py | 43 +- worlds/kdl3/Rom.py | 89 +- worlds/kdl3/Room.py | 5 +- worlds/kdl3/Rules.py | 2 +- worlds/kdl3/__init__.py | 44 +- worlds/kdl3/data/Rooms.json | 2284 +++++++++++++++++++++++++-- 8 files changed, 3006 insertions(+), 196 deletions(-) create mode 100644 worlds/kdl3/Names/EnemyAbilities.py diff --git a/worlds/kdl3/Names/EnemyAbilities.py b/worlds/kdl3/Names/EnemyAbilities.py new file mode 100644 index 000000000000..b3c7db2f9d4e --- /dev/null +++ b/worlds/kdl3/Names/EnemyAbilities.py @@ -0,0 +1,707 @@ +Grass_Land_1_E1 = "Grass Land 1 - Enemy 1 (Waddle Dee)" +Grass_Land_1_E2 = "Grass Land 1 - Enemy 2 (Sir Kibble)" +Grass_Land_1_E3 = "Grass Land 1 - Enemy 3 (Cappy)" +Grass_Land_1_E4 = "Grass Land 1 - Enemy 4 (Sparky)" +Grass_Land_1_E5 = "Grass Land 1 - Enemy 5 (Bronto Burt)" +Grass_Land_1_E6 = "Grass Land 1 - Enemy 6 (Sasuke)" +Grass_Land_1_E7 = "Grass Land 1 - Enemy 7 (Poppy Bros Jr.)" +Grass_Land_2_E1 = "Grass Land 2 - Enemy 1 (Rocky)" +Grass_Land_2_E2 = "Grass Land 2 - Enemy 2 (KeKe)" +Grass_Land_2_E3 = "Grass Land 2 - Enemy 3 (Bobo)" +Grass_Land_2_E4 = "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)" +Grass_Land_2_E5 = "Grass Land 2 - Enemy 5 (Waddle Dee)" +Grass_Land_2_E6 = "Grass Land 2 - Enemy 6 (Popon Ball)" +Grass_Land_2_E7 = "Grass Land 2 - Enemy 7 (Bouncy)" +Grass_Land_2_E8 = "Grass Land 2 - Enemy 8 (Tick)" +Grass_Land_2_E9 = "Grass Land 2 - Enemy 9 (Bronto Burt)" +Grass_Land_2_E10 = "Grass Land 2 - Enemy 10 (Nruff)" +Grass_Land_3_E1 = "Grass Land 3 - Enemy 1 (Sparky)" +Grass_Land_3_E2 = "Grass Land 3 - Enemy 2 (Rocky)" +Grass_Land_3_E3 = "Grass Land 3 - Enemy 3 (Nruff)" +Grass_Land_3_E4 = "Grass Land 3 - Enemy 4 (Bouncy)" +Grass_Land_4_E1 = "Grass Land 4 - Enemy 1 (Loud)" +Grass_Land_4_E2 = "Grass Land 4 - Enemy 2 (Babut)" +Grass_Land_4_E3 = "Grass Land 4 - Enemy 3 (Rocky)" +Grass_Land_4_E4 = "Grass Land 4 - Enemy 4 (Kapar)" +Grass_Land_4_E5 = "Grass Land 4 - Enemy 5 (Glunk)" +Grass_Land_4_E6 = "Grass Land 4 - Enemy 6 (Oro)" +Grass_Land_4_E7 = "Grass Land 4 - Enemy 7 (Peran)" +Grass_Land_5_E1 = "Grass Land 5 - Enemy 1 (Propeller)" +Grass_Land_5_E2 = "Grass Land 5 - Enemy 2 (Broom Hatter)" +Grass_Land_5_E3 = "Grass Land 5 - Enemy 3 (Bouncy)" +Grass_Land_5_E4 = "Grass Land 5 - Enemy 4 (Sir Kibble)" +Grass_Land_5_E5 = "Grass Land 5 - Enemy 5 (Waddle Dee)" +Grass_Land_5_E6 = "Grass Land 5 - Enemy 6 (Sasuke)" +Grass_Land_5_E7 = "Grass Land 5 - Enemy 7 (Nruff)" +Grass_Land_5_E8 = "Grass Land 5 - Enemy 8 (Tick)" +Grass_Land_6_E1 = "Grass Land 6 - Enemy 1 (Como)" +Grass_Land_6_E2 = "Grass Land 6 - Enemy 2 (Togezo)" +Grass_Land_6_E3 = "Grass Land 6 - Enemy 3 (Bronto Burt)" +Grass_Land_6_E4 = "Grass Land 6 - Enemy 4 (Cappy)" +Grass_Land_6_E5 = "Grass Land 6 - Enemy 5 (Bobo)" +Grass_Land_6_E6 = "Grass Land 6 - Enemy 6 (Mariel)" +Grass_Land_6_E7 = "Grass Land 6 - Enemy 7 (Yaban)" +Grass_Land_6_E8 = "Grass Land 6 - Enemy 8 (Broom Hatter)" +Grass_Land_6_E9 = "Grass Land 6 - Enemy 9 (Apolo)" +Grass_Land_6_E10 = "Grass Land 6 - Enemy 10 (Sasuke)" +Grass_Land_6_E11 = "Grass Land 6 - Enemy 11 (Rocky)" +Ripple_Field_1_E1 = "Ripple Field 1 - Enemy 1 (Waddle Dee)" +Ripple_Field_1_E2 = "Ripple Field 1 - Enemy 2 (Glunk)" +Ripple_Field_1_E3 = "Ripple Field 1 - Enemy 3 (Broom Hatter)" +Ripple_Field_1_E4 = "Ripple Field 1 - Enemy 4 (Cappy)" +Ripple_Field_1_E5 = "Ripple Field 1 - Enemy 5 (Bronto Burt)" +Ripple_Field_1_E6 = "Ripple Field 1 - Enemy 6 (Rocky)" +Ripple_Field_1_E7 = "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)" +Ripple_Field_1_E8 = "Ripple Field 1 - Enemy 8 (Bobin)" +Ripple_Field_2_E1 = "Ripple Field 2 - Enemy 1 (Togezo)" +Ripple_Field_2_E2 = "Ripple Field 2 - Enemy 2 (Coconut)" +Ripple_Field_2_E3 = "Ripple Field 2 - Enemy 3 (Blipper)" +Ripple_Field_2_E4 = "Ripple Field 2 - Enemy 4 (Sasuke)" +Ripple_Field_2_E5 = "Ripple Field 2 - Enemy 5 (Kany)" +Ripple_Field_2_E6 = "Ripple Field 2 - Enemy 6 (Glunk)" +Ripple_Field_3_E1 = "Ripple Field 3 - Enemy 1 (Raft Waddle Dee)" +Ripple_Field_3_E2 = "Ripple Field 3 - Enemy 2 (Kapar)" +Ripple_Field_3_E3 = "Ripple Field 3 - Enemy 3 (Blipper)" +Ripple_Field_3_E4 = "Ripple Field 3 - Enemy 4 (Sparky)" +Ripple_Field_3_E5 = "Ripple Field 3 - Enemy 5 (Glunk)" +Ripple_Field_3_E6 = "Ripple Field 3 - Enemy 6 (Joe)" +Ripple_Field_3_E7 = "Ripple Field 3 - Enemy 7 (Bobo)" +Ripple_Field_4_E1 = "Ripple Field 4 - Enemy 1 (Bukiset (Stone))" +Ripple_Field_4_E2 = "Ripple Field 4 - Enemy 2 (Bukiset (Needle))" +Ripple_Field_4_E3 = "Ripple Field 4 - Enemy 3 (Bukiset (Clean))" +Ripple_Field_4_E4 = "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))" +Ripple_Field_4_E5 = "Ripple Field 4 - Enemy 5 (Mony)" +Ripple_Field_4_E6 = "Ripple Field 4 - Enemy 6 (Bukiset (Burning))" +Ripple_Field_4_E7 = "Ripple Field 4 - Enemy 7 (Bobin)" +Ripple_Field_4_E8 = "Ripple Field 4 - Enemy 8 (Blipper)" +Ripple_Field_4_E9 = "Ripple Field 4 - Enemy 9 (Como)" +Ripple_Field_4_E10 = "Ripple Field 4 - Enemy 10 (Oro)" +Ripple_Field_4_E11 = "Ripple Field 4 - Enemy 11 (Gansan)" +Ripple_Field_4_E12 = "Ripple Field 4 - Enemy 12 (Waddle Dee)" +Ripple_Field_4_E13 = "Ripple Field 4 - Enemy 13 (Kapar)" +Ripple_Field_4_E14 = "Ripple Field 4 - Enemy 14 (Squishy)" +Ripple_Field_4_E15 = "Ripple Field 4 - Enemy 15 (Nidoo)" +Ripple_Field_5_E1 = "Ripple Field 5 - Enemy 1 (Glunk)" +Ripple_Field_5_E2 = "Ripple Field 5 - Enemy 2 (Joe)" +Ripple_Field_5_E3 = "Ripple Field 5 - Enemy 3 (Bobin)" +Ripple_Field_5_E4 = "Ripple Field 5 - Enemy 4 (Mony)" +Ripple_Field_5_E5 = "Ripple Field 5 - Enemy 5 (Squishy)" +Ripple_Field_5_E6 = "Ripple Field 5 - Enemy 6 (Yaban)" +Ripple_Field_5_E7 = "Ripple Field 5 - Enemy 7 (Broom Hatter)" +Ripple_Field_5_E8 = "Ripple Field 5 - Enemy 8 (Bouncy)" +Ripple_Field_5_E9 = "Ripple Field 5 - Enemy 9 (Sparky)" +Ripple_Field_5_E10 = "Ripple Field 5 - Enemy 10 (Rocky)" +Ripple_Field_5_E11 = "Ripple Field 5 - Enemy 11 (Babut)" +Ripple_Field_5_E12 = "Ripple Field 5 - Enemy 12 (Galbo)" +Ripple_Field_6_E1 = "Ripple Field 6 - Enemy 1 (Kany)" +Ripple_Field_6_E2 = "Ripple Field 6 - Enemy 2 (KeKe)" +Ripple_Field_6_E3 = "Ripple Field 6 - Enemy 3 (Kapar)" +Ripple_Field_6_E4 = "Ripple Field 6 - Enemy 4 (Rocky)" +Ripple_Field_6_E5 = "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)" +Ripple_Field_6_E6 = "Ripple Field 6 - Enemy 6 (Propeller)" +Ripple_Field_6_E7 = "Ripple Field 6 - Enemy 7 (Coconut)" +Ripple_Field_6_E8 = "Ripple Field 6 - Enemy 8 (Sasuke)" +Ripple_Field_6_E9 = "Ripple Field 6 - Enemy 9 (Nruff)" +Sand_Canyon_1_E1 = "Sand Canyon 1 - Enemy 1 (Bronto Burt)" +Sand_Canyon_1_E2 = "Sand Canyon 1 - Enemy 2 (Galbo)" +Sand_Canyon_1_E3 = "Sand Canyon 1 - Enemy 3 (Oro)" +Sand_Canyon_1_E4 = "Sand Canyon 1 - Enemy 4 (Sparky)" +Sand_Canyon_1_E5 = "Sand Canyon 1 - Enemy 5 (Propeller)" +Sand_Canyon_1_E6 = "Sand Canyon 1 - Enemy 6 (Gansan)" +Sand_Canyon_1_E7 = "Sand Canyon 1 - Enemy 7 (Babut)" +Sand_Canyon_1_E8 = "Sand Canyon 1 - Enemy 8 (Loud)" +Sand_Canyon_1_E9 = "Sand Canyon 1 - Enemy 9 (Dogon)" +Sand_Canyon_1_E10 = "Sand Canyon 1 - Enemy 10 (Bouncy)" +Sand_Canyon_1_E11 = "Sand Canyon 1 - Enemy 11 (Pteran)" +Sand_Canyon_1_E12 = "Sand Canyon 1 - Enemy 12 (Polof)" +Sand_Canyon_2_E1 = "Sand Canyon 2 - Enemy 1 (KeKe)" +Sand_Canyon_2_E2 = "Sand Canyon 2 - Enemy 2 (Doka)" +Sand_Canyon_2_E3 = "Sand Canyon 2 - Enemy 3 (Boten)" +Sand_Canyon_2_E4 = "Sand Canyon 2 - Enemy 4 (Propeller)" +Sand_Canyon_2_E5 = "Sand Canyon 2 - Enemy 5 (Waddle Dee)" +Sand_Canyon_2_E6 = "Sand Canyon 2 - Enemy 6 (Sparky)" +Sand_Canyon_2_E7 = "Sand Canyon 2 - Enemy 7 (Sasuke)" +Sand_Canyon_2_E8 = "Sand Canyon 2 - Enemy 8 (Como)" +Sand_Canyon_2_E9 = "Sand Canyon 2 - Enemy 9 (Bukiset (Ice))" +Sand_Canyon_2_E10 = "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))" +Sand_Canyon_2_E11 = "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))" +Sand_Canyon_2_E12 = "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))" +Sand_Canyon_2_E13 = "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))" +Sand_Canyon_2_E14 = "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))" +Sand_Canyon_2_E15 = "Sand Canyon 2 - Enemy 15 (Nidoo)" +Sand_Canyon_2_E16 = "Sand Canyon 2 - Enemy 16 (Mariel)" +Sand_Canyon_2_E17 = "Sand Canyon 2 - Enemy 17 (Yaban)" +Sand_Canyon_2_E18 = "Sand Canyon 2 - Enemy 18 (Wapod)" +Sand_Canyon_2_E19 = "Sand Canyon 2 - Enemy 19 (Squishy)" +Sand_Canyon_2_E20 = "Sand Canyon 2 - Enemy 20 (Pteran)" +Sand_Canyon_3_E1 = "Sand Canyon 3 - Enemy 1 (Sir Kibble)" +Sand_Canyon_3_E2 = "Sand Canyon 3 - Enemy 2 (Broom Hatter)" +Sand_Canyon_3_E3 = "Sand Canyon 3 - Enemy 3 (Rocky)" +Sand_Canyon_3_E4 = "Sand Canyon 3 - Enemy 4 (Gabon)" +Sand_Canyon_3_E5 = "Sand Canyon 3 - Enemy 5 (Kany)" +Sand_Canyon_3_E6 = "Sand Canyon 3 - Enemy 6 (Galbo)" +Sand_Canyon_3_E7 = "Sand Canyon 3 - Enemy 7 (Propeller)" +Sand_Canyon_3_E8 = "Sand Canyon 3 - Enemy 8 (Sasuke)" +Sand_Canyon_3_E9 = "Sand Canyon 3 - Enemy 9 (Wapod)" +Sand_Canyon_3_E10 = "Sand Canyon 3 - Enemy 10 (Bobo)" +Sand_Canyon_3_E11 = "Sand Canyon 3 - Enemy 11 (Babut)" +Sand_Canyon_3_E12 = "Sand Canyon 3 - Enemy 12 (Magoo)" +Sand_Canyon_4_E1 = "Sand Canyon 4 - Enemy 1 (Popon Ball)" +Sand_Canyon_4_E2 = "Sand Canyon 4 - Enemy 2 (Mariel)" +Sand_Canyon_4_E3 = "Sand Canyon 4 - Enemy 3 (Chilly)" +Sand_Canyon_4_E4 = "Sand Canyon 4 - Enemy 4 (Tick)" +Sand_Canyon_4_E5 = "Sand Canyon 4 - Enemy 5 (Bronto Burt)" +Sand_Canyon_4_E6 = "Sand Canyon 4 - Enemy 6 (Babut)" +Sand_Canyon_4_E7 = "Sand Canyon 4 - Enemy 7 (Bobin)" +Sand_Canyon_4_E8 = "Sand Canyon 4 - Enemy 8 (Joe)" +Sand_Canyon_4_E9 = "Sand Canyon 4 - Enemy 9 (Mony)" +Sand_Canyon_4_E10 = "Sand Canyon 4 - Enemy 10 (Blipper)" +Sand_Canyon_4_E11 = "Sand Canyon 4 - Enemy 11 (Togezo)" +Sand_Canyon_4_E12 = "Sand Canyon 4 - Enemy 12 (Rocky)" +Sand_Canyon_4_E13 = "Sand Canyon 4 - Enemy 13 (Bobo)" +Sand_Canyon_5_E1 = "Sand Canyon 5 - Enemy 1 (Wapod)" +Sand_Canyon_5_E2 = "Sand Canyon 5 - Enemy 2 (Dogon)" +Sand_Canyon_5_E3 = "Sand Canyon 5 - Enemy 3 (Tick)" +Sand_Canyon_5_E4 = "Sand Canyon 5 - Enemy 4 (Rocky)" +Sand_Canyon_5_E5 = "Sand Canyon 5 - Enemy 5 (Bobo)" +Sand_Canyon_5_E6 = "Sand Canyon 5 - Enemy 6 (Chilly)" +Sand_Canyon_5_E7 = "Sand Canyon 5 - Enemy 7 (Sparky)" +Sand_Canyon_5_E8 = "Sand Canyon 5 - Enemy 8 (Togezo)" +Sand_Canyon_5_E9 = "Sand Canyon 5 - Enemy 9 (Bronto Burt)" +Sand_Canyon_5_E10 = "Sand Canyon 5 - Enemy 10 (Sasuke)" +Sand_Canyon_5_E11 = "Sand Canyon 5 - Enemy 11 (Oro)" +Sand_Canyon_5_E12 = "Sand Canyon 5 - Enemy 12 (Galbo)" +Sand_Canyon_5_E13 = "Sand Canyon 5 - Enemy 13 (Nidoo)" +Sand_Canyon_5_E14 = "Sand Canyon 5 - Enemy 14 (Propeller)" +Sand_Canyon_5_E15 = "Sand Canyon 5 - Enemy 15 (Sir Kibble)" +Sand_Canyon_5_E16 = "Sand Canyon 5 - Enemy 16 (KeKe)" +Sand_Canyon_5_E17 = "Sand Canyon 5 - Enemy 17 (Kabu)" +Sand_Canyon_6_E1 = "Sand Canyon 6 - Enemy 1 (Sparky)" +Sand_Canyon_6_E2 = "Sand Canyon 6 - Enemy 2 (Doka)" +Sand_Canyon_6_E3 = "Sand Canyon 6 - Enemy 3 (Cappy)" +Sand_Canyon_6_E4 = "Sand Canyon 6 - Enemy 4 (Pteran)" +Sand_Canyon_6_E5 = "Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))" +Sand_Canyon_6_E6 = "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))" +Sand_Canyon_6_E7 = "Sand Canyon 6 - Enemy 7 (Bukiset (Clean))" +Sand_Canyon_6_E8 = "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))" +Sand_Canyon_6_E9 = "Sand Canyon 6 - Enemy 9 (Bukiset (Ice))" +Sand_Canyon_6_E10 = "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))" +Sand_Canyon_6_E11 = "Sand Canyon 6 - Enemy 11 (Bukiset (Burning))" +Sand_Canyon_6_E12 = "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))" +Sand_Canyon_6_E13 = "Sand Canyon 6 - Enemy 13 (Nidoo)" +Cloudy_Park_1_E1 = "Cloudy Park 1 - Enemy 1 (Waddle Dee)" +Cloudy_Park_1_E2 = "Cloudy Park 1 - Enemy 2 (KeKe)" +Cloudy_Park_1_E3 = "Cloudy Park 1 - Enemy 3 (Cappy)" +Cloudy_Park_1_E4 = "Cloudy Park 1 - Enemy 4 (Yaban)" +Cloudy_Park_1_E5 = "Cloudy Park 1 - Enemy 5 (Togezo)" +Cloudy_Park_1_E6 = "Cloudy Park 1 - Enemy 6 (Galbo)" +Cloudy_Park_1_E7 = "Cloudy Park 1 - Enemy 7 (Sparky)" +Cloudy_Park_1_E8 = "Cloudy Park 1 - Enemy 8 (Como)" +Cloudy_Park_1_E9 = "Cloudy Park 1 - Enemy 9 (Bronto Burt)" +Cloudy_Park_1_E10 = "Cloudy Park 1 - Enemy 10 (Gabon)" +Cloudy_Park_1_E11 = "Cloudy Park 1 - Enemy 11 (Sir Kibble)" +Cloudy_Park_1_E12 = "Cloudy Park 1 - Enemy 12 (Mariel)" +Cloudy_Park_1_E13 = "Cloudy Park 1 - Enemy 13 (Nruff)" +Cloudy_Park_2_E1 = "Cloudy Park 2 - Enemy 1 (Chilly)" +Cloudy_Park_2_E2 = "Cloudy Park 2 - Enemy 2 (Sasuke)" +Cloudy_Park_2_E3 = "Cloudy Park 2 - Enemy 3 (Waddle Dee)" +Cloudy_Park_2_E4 = "Cloudy Park 2 - Enemy 4 (Sparky)" +Cloudy_Park_2_E5 = "Cloudy Park 2 - Enemy 5 (Broom Hatter)" +Cloudy_Park_2_E6 = "Cloudy Park 2 - Enemy 6 (Sir Kibble)" +Cloudy_Park_2_E7 = "Cloudy Park 2 - Enemy 7 (Pteran)" +Cloudy_Park_2_E8 = "Cloudy Park 2 - Enemy 8 (Propeller)" +Cloudy_Park_2_E9 = "Cloudy Park 2 - Enemy 9 (Dogon)" +Cloudy_Park_2_E10 = "Cloudy Park 2 - Enemy 10 (Togezo)" +Cloudy_Park_2_E11 = "Cloudy Park 2 - Enemy 11 (Oro)" +Cloudy_Park_2_E12 = "Cloudy Park 2 - Enemy 12 (Bronto Burt)" +Cloudy_Park_2_E13 = "Cloudy Park 2 - Enemy 13 (Rocky)" +Cloudy_Park_2_E14 = "Cloudy Park 2 - Enemy 14 (Galbo)" +Cloudy_Park_2_E15 = "Cloudy Park 2 - Enemy 15 (Kapar)" +Cloudy_Park_3_E1 = "Cloudy Park 3 - Enemy 1 (Bronto Burt)" +Cloudy_Park_3_E2 = "Cloudy Park 3 - Enemy 2 (Mopoo)" +Cloudy_Park_3_E3 = "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)" +Cloudy_Park_3_E4 = "Cloudy Park 3 - Enemy 4 (Como)" +Cloudy_Park_3_E5 = "Cloudy Park 3 - Enemy 5 (Glunk)" +Cloudy_Park_3_E6 = "Cloudy Park 3 - Enemy 6 (Bobin)" +Cloudy_Park_3_E7 = "Cloudy Park 3 - Enemy 7 (Loud)" +Cloudy_Park_3_E8 = "Cloudy Park 3 - Enemy 8 (Kapar)" +Cloudy_Park_3_E9 = "Cloudy Park 3 - Enemy 9 (Galbo)" +Cloudy_Park_3_E10 = "Cloudy Park 3 - Enemy 10 (Batamon)" +Cloudy_Park_3_E11 = "Cloudy Park 3 - Enemy 11 (Bouncy)" +Cloudy_Park_4_E1 = "Cloudy Park 4 - Enemy 1 (Gabon)" +Cloudy_Park_4_E2 = "Cloudy Park 4 - Enemy 2 (Como)" +Cloudy_Park_4_E3 = "Cloudy Park 4 - Enemy 3 (Wapod)" +Cloudy_Park_4_E4 = "Cloudy Park 4 - Enemy 4 (Cappy)" +Cloudy_Park_4_E5 = "Cloudy Park 4 - Enemy 5 (Sparky)" +Cloudy_Park_4_E6 = "Cloudy Park 4 - Enemy 6 (Togezo)" +Cloudy_Park_4_E7 = "Cloudy Park 4 - Enemy 7 (Bronto Burt)" +Cloudy_Park_4_E8 = "Cloudy Park 4 - Enemy 8 (KeKe)" +Cloudy_Park_4_E9 = "Cloudy Park 4 - Enemy 9 (Bouncy)" +Cloudy_Park_4_E10 = "Cloudy Park 4 - Enemy 10 (Sir Kibble)" +Cloudy_Park_4_E11 = "Cloudy Park 4 - Enemy 11 (Mariel)" +Cloudy_Park_4_E12 = "Cloudy Park 4 - Enemy 12 (Kabu)" +Cloudy_Park_4_E13 = "Cloudy Park 4 - Enemy 13 (Wappa)" +Cloudy_Park_5_E1 = "Cloudy Park 5 - Enemy 1 (Yaban)" +Cloudy_Park_5_E2 = "Cloudy Park 5 - Enemy 2 (Sir Kibble)" +Cloudy_Park_5_E3 = "Cloudy Park 5 - Enemy 3 (Cappy)" +Cloudy_Park_5_E4 = "Cloudy Park 5 - Enemy 4 (Wappa)" +Cloudy_Park_5_E5 = "Cloudy Park 5 - Enemy 5 (Galbo)" +Cloudy_Park_5_E6 = "Cloudy Park 5 - Enemy 6 (Bronto Burt)" +Cloudy_Park_5_E7 = "Cloudy Park 5 - Enemy 7 (KeKe)" +Cloudy_Park_5_E8 = "Cloudy Park 5 - Enemy 8 (Propeller)" +Cloudy_Park_5_E9 = "Cloudy Park 5 - Enemy 9 (Klinko)" +Cloudy_Park_5_E10 = "Cloudy Park 5 - Enemy 10 (Wapod)" +Cloudy_Park_5_E11 = "Cloudy Park 5 - Enemy 11 (Pteran)" +Cloudy_Park_6_E1 = "Cloudy Park 6 - Enemy 1 (Madoo)" +Cloudy_Park_6_E2 = "Cloudy Park 6 - Enemy 2 (Tick)" +Cloudy_Park_6_E3 = "Cloudy Park 6 - Enemy 3 (Como)" +Cloudy_Park_6_E4 = "Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)" +Cloudy_Park_6_E5 = "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)" +Cloudy_Park_6_E6 = "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)" +Cloudy_Park_6_E7 = "Cloudy Park 6 - Enemy 7 (Propeller)" +Cloudy_Park_6_E8 = "Cloudy Park 6 - Enemy 8 (Mopoo)" +Cloudy_Park_6_E9 = "Cloudy Park 6 - Enemy 9 (Bukiset (Burning))" +Cloudy_Park_6_E10 = "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))" +Cloudy_Park_6_E11 = "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))" +Cloudy_Park_6_E12 = "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))" +Cloudy_Park_6_E13 = "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))" +Iceberg_1_E1 = "Iceberg 1 - Enemy 1 (Waddle Dee)" +Iceberg_1_E2 = "Iceberg 1 - Enemy 2 (Klinko)" +Iceberg_1_E3 = "Iceberg 1 - Enemy 3 (KeKe)" +Iceberg_1_E4 = "Iceberg 1 - Enemy 4 (Como)" +Iceberg_1_E5 = "Iceberg 1 - Enemy 5 (Galbo)" +Iceberg_1_E6 = "Iceberg 1 - Enemy 6 (Rocky)" +Iceberg_1_E7 = "Iceberg 1 - Enemy 7 (Kapar)" +Iceberg_1_E8 = "Iceberg 1 - Enemy 8 (Mopoo)" +Iceberg_1_E9 = "Iceberg 1 - Enemy 9 (Babut)" +Iceberg_1_E10 = "Iceberg 1 - Enemy 10 (Wappa)" +Iceberg_1_E11 = "Iceberg 1 - Enemy 11 (Bronto Burt)" +Iceberg_1_E12 = "Iceberg 1 - Enemy 12 (Chilly)" +Iceberg_1_E13 = "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)" +Iceberg_2_E1 = "Iceberg 2 - Enemy 1 (Gabon)" +Iceberg_2_E2 = "Iceberg 2 - Enemy 2 (Nruff)" +Iceberg_2_E3 = "Iceberg 2 - Enemy 3 (Waddle Dee)" +Iceberg_2_E4 = "Iceberg 2 - Enemy 4 (Chilly)" +Iceberg_2_E5 = "Iceberg 2 - Enemy 5 (Pteran)" +Iceberg_2_E6 = "Iceberg 2 - Enemy 6 (Glunk)" +Iceberg_2_E7 = "Iceberg 2 - Enemy 7 (Galbo)" +Iceberg_2_E8 = "Iceberg 2 - Enemy 8 (Babut)" +Iceberg_2_E9 = "Iceberg 2 - Enemy 9 (Magoo)" +Iceberg_2_E10 = "Iceberg 2 - Enemy 10 (Propeller)" +Iceberg_2_E11 = "Iceberg 2 - Enemy 11 (Nidoo)" +Iceberg_2_E12 = "Iceberg 2 - Enemy 12 (Oro)" +Iceberg_2_E13 = "Iceberg 2 - Enemy 13 (Klinko)" +Iceberg_2_E14 = "Iceberg 2 - Enemy 14 (Bronto Burt)" +Iceberg_3_E1 = "Iceberg 3 - Enemy 1 (Corori)" +Iceberg_3_E2 = "Iceberg 3 - Enemy 2 (Bouncy)" +Iceberg_3_E3 = "Iceberg 3 - Enemy 3 (Chilly)" +Iceberg_3_E4 = "Iceberg 3 - Enemy 4 (Pteran)" +Iceberg_3_E5 = "Iceberg 3 - Enemy 5 (Raft Waddle Dee)" +Iceberg_3_E6 = "Iceberg 3 - Enemy 6 (Kapar)" +Iceberg_3_E7 = "Iceberg 3 - Enemy 7 (Blipper)" +Iceberg_3_E8 = "Iceberg 3 - Enemy 8 (Wapod)" +Iceberg_3_E9 = "Iceberg 3 - Enemy 9 (Glunk)" +Iceberg_3_E10 = "Iceberg 3 - Enemy 10 (Icicle)" +Iceberg_4_E1 = "Iceberg 4 - Enemy 1 (Bronto Burt)" +Iceberg_4_E2 = "Iceberg 4 - Enemy 2 (Galbo)" +Iceberg_4_E3 = "Iceberg 4 - Enemy 3 (Klinko)" +Iceberg_4_E4 = "Iceberg 4 - Enemy 4 (Chilly)" +Iceberg_4_E5 = "Iceberg 4 - Enemy 5 (Babut)" +Iceberg_4_E6 = "Iceberg 4 - Enemy 6 (Wappa)" +Iceberg_4_E7 = "Iceberg 4 - Enemy 7 (Icicle)" +Iceberg_4_E8 = "Iceberg 4 - Enemy 8 (Corori)" +Iceberg_4_E9 = "Iceberg 4 - Enemy 9 (Gabon)" +Iceberg_4_E10 = "Iceberg 4 - Enemy 10 (Kabu)" +Iceberg_4_E11 = "Iceberg 4 - Enemy 11 (Broom Hatter)" +Iceberg_4_E12 = "Iceberg 4 - Enemy 12 (Sasuke)" +Iceberg_4_E13 = "Iceberg 4 - Enemy 13 (Nruff)" +Iceberg_5_E1 = "Iceberg 5 - Enemy 1 (Bukiset (Burning))" +Iceberg_5_E2 = "Iceberg 5 - Enemy 2 (Bukiset (Stone))" +Iceberg_5_E3 = "Iceberg 5 - Enemy 3 (Bukiset (Ice))" +Iceberg_5_E4 = "Iceberg 5 - Enemy 4 (Bukiset (Needle))" +Iceberg_5_E5 = "Iceberg 5 - Enemy 5 (Bukiset (Clean))" +Iceberg_5_E6 = "Iceberg 5 - Enemy 6 (Bukiset (Parasol))" +Iceberg_5_E7 = "Iceberg 5 - Enemy 7 (Bukiset (Spark))" +Iceberg_5_E8 = "Iceberg 5 - Enemy 8 (Bukiset (Cutter))" +Iceberg_5_E9 = "Iceberg 5 - Enemy 9 (Glunk)" +Iceberg_5_E10 = "Iceberg 5 - Enemy 10 (Wapod)" +Iceberg_5_E11 = "Iceberg 5 - Enemy 11 (Tick)" +Iceberg_5_E12 = "Iceberg 5 - Enemy 12 (Madoo)" +Iceberg_5_E13 = "Iceberg 5 - Enemy 13 (Yaban)" +Iceberg_5_E14 = "Iceberg 5 - Enemy 14 (Propeller)" +Iceberg_5_E15 = "Iceberg 5 - Enemy 15 (Mariel)" +Iceberg_5_E16 = "Iceberg 5 - Enemy 16 (Pteran)" +Iceberg_5_E17 = "Iceberg 5 - Enemy 17 (Galbo)" +Iceberg_5_E18 = "Iceberg 5 - Enemy 18 (KeKe)" +Iceberg_5_E19 = "Iceberg 5 - Enemy 19 (Nidoo)" +Iceberg_5_E20 = "Iceberg 5 - Enemy 20 (Waddle Dee Drawing)" +Iceberg_5_E21 = "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)" +Iceberg_5_E22 = "Iceberg 5 - Enemy 22 (Bouncy Drawing)" +Iceberg_5_E23 = "Iceberg 5 - Enemy 23 (Joe)" +Iceberg_5_E24 = "Iceberg 5 - Enemy 24 (Kapar)" +Iceberg_5_E25 = "Iceberg 5 - Enemy 25 (Gansan)" +Iceberg_5_E26 = "Iceberg 5 - Enemy 26 (Sasuke)" +Iceberg_5_E27 = "Iceberg 5 - Enemy 27 (Togezo)" +Iceberg_5_E28 = "Iceberg 5 - Enemy 28 (Sparky)" +Iceberg_5_E29 = "Iceberg 5 - Enemy 29 (Bobin)" +Iceberg_5_E30 = "Iceberg 5 - Enemy 30 (Chilly)" +Iceberg_5_E31 = "Iceberg 5 - Enemy 31 (Peran)" +Iceberg_6_E1 = "Iceberg 6 - Enemy 1 (Nruff)" +Iceberg_6_E2 = "Iceberg 6 - Enemy 2 (Nidoo)" +Iceberg_6_E3 = "Iceberg 6 - Enemy 3 (Sparky)" +Iceberg_6_E4 = "Iceberg 6 - Enemy 4 (Sir Kibble)" + +vanilla_abilities = { + Grass_Land_1_E1: "Waddle Dee", + Grass_Land_1_E2: "Sir Kibble", + Grass_Land_1_E3: "Cappy", + Grass_Land_1_E4: "Sparky", + Grass_Land_1_E5: "Bronto Burt", + Grass_Land_1_E6: "Sasuke", + Grass_Land_1_E7: "Poppy Bros Jr.", + Grass_Land_2_E1: "Rocky", + Grass_Land_2_E2: "KeKe", + Grass_Land_2_E3: "Bobo", + Grass_Land_2_E4: "Poppy Bros Jr.", + Grass_Land_2_E5: "Waddle Dee", + Grass_Land_2_E6: "Popon Ball", + Grass_Land_2_E7: "Bouncy", + Grass_Land_2_E8: "Tick", + Grass_Land_2_E9: "Bronto Burt", + Grass_Land_2_E10: "Nruff", + Grass_Land_3_E1: "Sparky", + Grass_Land_3_E2: "Rocky", + Grass_Land_3_E3: "Nruff", + Grass_Land_3_E4: "Bouncy", + Grass_Land_4_E1: "Loud", + Grass_Land_4_E2: "Babut", + Grass_Land_4_E3: "Rocky", + Grass_Land_4_E4: "Kapar", + Grass_Land_4_E5: "Glunk", + Grass_Land_4_E6: "Oro", + Grass_Land_4_E7: "Peran", + Grass_Land_5_E1: "Propeller", + Grass_Land_5_E2: "Broom Hatter", + Grass_Land_5_E3: "Bouncy", + Grass_Land_5_E4: "Sir Kibble", + Grass_Land_5_E5: "Waddle Dee", + Grass_Land_5_E6: "Sasuke", + Grass_Land_5_E7: "Nruff", + Grass_Land_5_E8: "Tick", + Grass_Land_6_E1: "Como", + Grass_Land_6_E2: "Togezo", + Grass_Land_6_E3: "Bronto Burt", + Grass_Land_6_E4: "Cappy", + Grass_Land_6_E5: "Bobo", + Grass_Land_6_E6: "Mariel", + Grass_Land_6_E7: "Yaban", + Grass_Land_6_E8: "Broom Hatter", + Grass_Land_6_E9: "Apolo", + Grass_Land_6_E10: "Sasuke", + Grass_Land_6_E11: "Rocky", + Ripple_Field_1_E1: "Waddle Dee", + Ripple_Field_1_E2: "Glunk", + Ripple_Field_1_E3: "Broom Hatter", + Ripple_Field_1_E4: "Cappy", + Ripple_Field_1_E5: "Bronto Burt", + Ripple_Field_1_E6: "Rocky", + Ripple_Field_1_E7: "Poppy Bros Jr.", + Ripple_Field_1_E8: "Bobin", + Ripple_Field_2_E1: "Togezo", + Ripple_Field_2_E2: "Coconut", + Ripple_Field_2_E3: "Blipper", + Ripple_Field_2_E4: "Sasuke", + Ripple_Field_2_E5: "Kany", + Ripple_Field_2_E6: "Glunk", + Ripple_Field_3_E1: "Raft Waddle Dee", + Ripple_Field_3_E2: "Kapar", + Ripple_Field_3_E3: "Blipper", + Ripple_Field_3_E4: "Sparky", + Ripple_Field_3_E5: "Glunk", + Ripple_Field_3_E6: "Joe", + Ripple_Field_3_E7: "Bobo", + Ripple_Field_4_E1: "Bukiset (Stone)", + Ripple_Field_4_E2: "Bukiset (Needle)", + Ripple_Field_4_E3: "Bukiset (Clean)", + Ripple_Field_4_E4: "Bukiset (Parasol)", + Ripple_Field_4_E5: "Mony", + Ripple_Field_4_E6: "Bukiset (Burning)", + Ripple_Field_4_E7: "Bobin", + Ripple_Field_4_E8: "Blipper", + Ripple_Field_4_E9: "Como", + Ripple_Field_4_E10: "Oro", + Ripple_Field_4_E11: "Gansan", + Ripple_Field_4_E12: "Waddle Dee", + Ripple_Field_4_E13: "Kapar", + Ripple_Field_4_E14: "Squishy", + Ripple_Field_4_E15: "Nidoo", + Ripple_Field_5_E1: "Glunk", + Ripple_Field_5_E2: "Joe", + Ripple_Field_5_E3: "Bobin", + Ripple_Field_5_E4: "Mony", + Ripple_Field_5_E5: "Squishy", + Ripple_Field_5_E6: "Yaban", + Ripple_Field_5_E7: "Broom Hatter", + Ripple_Field_5_E8: "Bouncy", + Ripple_Field_5_E9: "Sparky", + Ripple_Field_5_E10: "Rocky", + Ripple_Field_5_E11: "Babut", + Ripple_Field_5_E12: "Galbo", + Ripple_Field_6_E1: "Kany", + Ripple_Field_6_E2: "KeKe", + Ripple_Field_6_E3: "Kapar", + Ripple_Field_6_E4: "Rocky", + Ripple_Field_6_E5: "Poppy Bros Jr.", + Ripple_Field_6_E6: "Propeller", + Ripple_Field_6_E7: "Coconut", + Ripple_Field_6_E8: "Sasuke", + Ripple_Field_6_E9: "Nruff", + Sand_Canyon_1_E1: "Bronto Burt", + Sand_Canyon_1_E2: "Galbo", + Sand_Canyon_1_E3: "Oro", + Sand_Canyon_1_E4: "Sparky", + Sand_Canyon_1_E5: "Propeller", + Sand_Canyon_1_E6: "Gansan", + Sand_Canyon_1_E7: "Babut", + Sand_Canyon_1_E8: "Loud", + Sand_Canyon_1_E9: "Dogon", + Sand_Canyon_1_E10: "Bouncy", + Sand_Canyon_1_E11: "Pteran", + Sand_Canyon_1_E12: "Polof", + Sand_Canyon_2_E1: "KeKe", + Sand_Canyon_2_E2: "Doka", + Sand_Canyon_2_E3: "Boten", + Sand_Canyon_2_E4: "Propeller", + Sand_Canyon_2_E5: "Waddle Dee", + Sand_Canyon_2_E6: "Sparky", + Sand_Canyon_2_E7: "Sasuke", + Sand_Canyon_2_E8: "Como", + Sand_Canyon_2_E9: "Bukiset (Ice)", + Sand_Canyon_2_E10: "Bukiset (Needle)", + Sand_Canyon_2_E11: "Bukiset (Clean)", + Sand_Canyon_2_E12: "Bukiset (Parasol)", + Sand_Canyon_2_E13: "Bukiset (Spark)", + Sand_Canyon_2_E14: "Bukiset (Cutter)", + Sand_Canyon_2_E15: "Nidoo", + Sand_Canyon_2_E16: "Mariel", + Sand_Canyon_2_E17: "Yaban", + Sand_Canyon_2_E18: "Wapod", + Sand_Canyon_2_E19: "Squishy", + Sand_Canyon_2_E20: "Pteran", + Sand_Canyon_3_E1: "Sir Kibble", + Sand_Canyon_3_E2: "Broom Hatter", + Sand_Canyon_3_E3: "Rocky", + Sand_Canyon_3_E4: "Gabon", + Sand_Canyon_3_E5: "Kany", + Sand_Canyon_3_E6: "Galbo", + Sand_Canyon_3_E7: "Propeller", + Sand_Canyon_3_E8: "Sasuke", + Sand_Canyon_3_E9: "Wapod", + Sand_Canyon_3_E10: "Bobo", + Sand_Canyon_3_E11: "Babut", + Sand_Canyon_3_E12: "Magoo", + Sand_Canyon_4_E1: "Popon Ball", + Sand_Canyon_4_E2: "Mariel", + Sand_Canyon_4_E3: "Chilly", + Sand_Canyon_4_E4: "Tick", + Sand_Canyon_4_E5: "Bronto Burt", + Sand_Canyon_4_E6: "Babut", + Sand_Canyon_4_E7: "Bobin", + Sand_Canyon_4_E8: "Joe", + Sand_Canyon_4_E9: "Mony", + Sand_Canyon_4_E10: "Blipper", + Sand_Canyon_4_E11: "Togezo", + Sand_Canyon_4_E12: "Rocky", + Sand_Canyon_4_E13: "Bobo", + Sand_Canyon_5_E1: "Wapod", + Sand_Canyon_5_E2: "Dogon", + Sand_Canyon_5_E3: "Tick", + Sand_Canyon_5_E4: "Rocky", + Sand_Canyon_5_E5: "Bobo", + Sand_Canyon_5_E6: "Chilly", + Sand_Canyon_5_E7: "Sparky", + Sand_Canyon_5_E8: "Togezo", + Sand_Canyon_5_E9: "Bronto Burt", + Sand_Canyon_5_E10: "Sasuke", + Sand_Canyon_5_E11: "Oro", + Sand_Canyon_5_E12: "Galbo", + Sand_Canyon_5_E13: "Nidoo", + Sand_Canyon_5_E14: "Propeller", + Sand_Canyon_5_E15: "Sir Kibble", + Sand_Canyon_5_E16: "KeKe", + Sand_Canyon_5_E17: "Kabu", + Sand_Canyon_6_E1: "Sparky", + Sand_Canyon_6_E2: "Doka", + Sand_Canyon_6_E3: "Cappy", + Sand_Canyon_6_E4: "Pteran", + Sand_Canyon_6_E5: "Bukiset (Parasol)", + Sand_Canyon_6_E6: "Bukiset (Cutter)", + Sand_Canyon_6_E7: "Bukiset (Clean)", + Sand_Canyon_6_E8: "Bukiset (Spark)", + Sand_Canyon_6_E9: "Bukiset (Ice)", + Sand_Canyon_6_E10: "Bukiset (Needle)", + Sand_Canyon_6_E11: "Bukiset (Burning)", + Sand_Canyon_6_E12: "Bukiset (Stone)", + Sand_Canyon_6_E13: "Nidoo", + Cloudy_Park_1_E1: "Waddle Dee", + Cloudy_Park_1_E2: "KeKe", + Cloudy_Park_1_E3: "Cappy", + Cloudy_Park_1_E4: "Yaban", + Cloudy_Park_1_E5: "Togezo", + Cloudy_Park_1_E6: "Galbo", + Cloudy_Park_1_E7: "Sparky", + Cloudy_Park_1_E8: "Como", + Cloudy_Park_1_E9: "Bronto Burt", + Cloudy_Park_1_E10: "Gabon", + Cloudy_Park_1_E11: "Sir Kibble", + Cloudy_Park_1_E12: "Mariel", + Cloudy_Park_1_E13: "Nruff", + Cloudy_Park_2_E1: "Chilly", + Cloudy_Park_2_E2: "Sasuke", + Cloudy_Park_2_E3: "Waddle Dee", + Cloudy_Park_2_E4: "Sparky", + Cloudy_Park_2_E5: "Broom Hatter", + Cloudy_Park_2_E6: "Sir Kibble", + Cloudy_Park_2_E7: "Pteran", + Cloudy_Park_2_E8: "Propeller", + Cloudy_Park_2_E9: "Dogon", + Cloudy_Park_2_E10: "Togezo", + Cloudy_Park_2_E11: "Oro", + Cloudy_Park_2_E12: "Bronto Burt", + Cloudy_Park_2_E13: "Rocky", + Cloudy_Park_2_E14: "Galbo", + Cloudy_Park_2_E15: "Kapar", + Cloudy_Park_3_E1: "Bronto Burt", + Cloudy_Park_3_E2: "Mopoo", + Cloudy_Park_3_E3: "Poppy Bros Jr.", + Cloudy_Park_3_E4: "Como", + Cloudy_Park_3_E5: "Glunk", + Cloudy_Park_3_E6: "Bobin", + Cloudy_Park_3_E7: "Loud", + Cloudy_Park_3_E8: "Kapar", + Cloudy_Park_3_E9: "Galbo", + Cloudy_Park_3_E10: "Batamon", + Cloudy_Park_3_E11: "Bouncy", + Cloudy_Park_4_E1: "Gabon", + Cloudy_Park_4_E2: "Como", + Cloudy_Park_4_E3: "Wapod", + Cloudy_Park_4_E4: "Cappy", + Cloudy_Park_4_E5: "Sparky", + Cloudy_Park_4_E6: "Togezo", + Cloudy_Park_4_E7: "Bronto Burt", + Cloudy_Park_4_E8: "KeKe", + Cloudy_Park_4_E9: "Bouncy", + Cloudy_Park_4_E10: "Sir Kibble", + Cloudy_Park_4_E11: "Mariel", + Cloudy_Park_4_E12: "Kabu", + Cloudy_Park_4_E13: "Wappa", + Cloudy_Park_5_E1: "Yaban", + Cloudy_Park_5_E2: "Sir Kibble", + Cloudy_Park_5_E3: "Cappy", + Cloudy_Park_5_E4: "Wappa", + Cloudy_Park_5_E5: "Galbo", + Cloudy_Park_5_E6: "Bronto Burt", + Cloudy_Park_5_E7: "KeKe", + Cloudy_Park_5_E8: "Propeller", + Cloudy_Park_5_E9: "Klinko", + Cloudy_Park_5_E10: "Wapod", + Cloudy_Park_5_E11: "Pteran", + Cloudy_Park_6_E1: "Madoo", + Cloudy_Park_6_E2: "Tick", + Cloudy_Park_6_E3: "Como", + Cloudy_Park_6_E4: "Waddle Dee Drawing", + Cloudy_Park_6_E5: "Bronto Burt Drawing", + Cloudy_Park_6_E6: "Bouncy Drawing", + Cloudy_Park_6_E7: "Propeller", + Cloudy_Park_6_E8: "Mopoo", + Cloudy_Park_6_E9: "Bukiset (Burning)", + Cloudy_Park_6_E10: "Bukiset (Ice)", + Cloudy_Park_6_E11: "Bukiset (Needle)", + Cloudy_Park_6_E12: "Bukiset (Clean)", + Cloudy_Park_6_E13: "Bukiset (Cutter)", + Iceberg_1_E1: "Waddle Dee", + Iceberg_1_E2: "Klinko", + Iceberg_1_E3: "KeKe", + Iceberg_1_E4: "Como", + Iceberg_1_E5: "Galbo", + Iceberg_1_E6: "Rocky", + Iceberg_1_E7: "Kapar", + Iceberg_1_E8: "Mopoo", + Iceberg_1_E9: "Babut", + Iceberg_1_E10: "Wappa", + Iceberg_1_E11: "Bronto Burt", + Iceberg_1_E12: "Chilly", + Iceberg_1_E13: "Poppy Bros Jr.", + Iceberg_2_E1: "Gabon", + Iceberg_2_E2: "Nruff", + Iceberg_2_E3: "Waddle Dee", + Iceberg_2_E4: "Chilly", + Iceberg_2_E5: "Pteran", + Iceberg_2_E6: "Glunk", + Iceberg_2_E7: "Galbo", + Iceberg_2_E8: "Babut", + Iceberg_2_E9: "Magoo", + Iceberg_2_E10: "Propeller", + Iceberg_2_E11: "Nidoo", + Iceberg_2_E12: "Oro", + Iceberg_2_E13: "Klinko", + Iceberg_2_E14: "Bronto Burt", + Iceberg_3_E1: "Corori", + Iceberg_3_E2: "Bouncy", + Iceberg_3_E3: "Chilly", + Iceberg_3_E4: "Pteran", + Iceberg_3_E5: "Raft Waddle Dee", + Iceberg_3_E6: "Kapar", + Iceberg_3_E7: "Blipper", + Iceberg_3_E8: "Wapod", + Iceberg_3_E9: "Glunk", + Iceberg_3_E10: "Icicle", + Iceberg_4_E1: "Bronto Burt", + Iceberg_4_E2: "Galbo", + Iceberg_4_E3: "Klinko", + Iceberg_4_E4: "Chilly", + Iceberg_4_E5: "Babut", + Iceberg_4_E6: "Wappa", + Iceberg_4_E7: "Icicle", + Iceberg_4_E8: "Corori", + Iceberg_4_E9: "Gabon", + Iceberg_4_E10: "Kabu", + Iceberg_4_E11: "Broom Hatter", + Iceberg_4_E12: "Sasuke", + Iceberg_4_E13: "Nruff", + Iceberg_5_E1: "Bukiset (Burning)", + Iceberg_5_E2: "Bukiset (Stone)", + Iceberg_5_E3: "Bukiset (Ice)", + Iceberg_5_E4: "Bukiset (Needle)", + Iceberg_5_E5: "Bukiset (Clean)", + Iceberg_5_E6: "Bukiset (Parasol)", + Iceberg_5_E7: "Bukiset (Spark)", + Iceberg_5_E8: "Bukiset (Cutter)", + Iceberg_5_E9: "Glunk", + Iceberg_5_E10: "Wapod", + Iceberg_5_E11: "Tick", + Iceberg_5_E12: "Madoo", + Iceberg_5_E13: "Yaban", + Iceberg_5_E14: "Propeller", + Iceberg_5_E15: "Mariel", + Iceberg_5_E16: "Pteran", + Iceberg_5_E17: "Galbo", + Iceberg_5_E18: "KeKe", + Iceberg_5_E19: "Nidoo", + Iceberg_5_E20: "Waddle Dee Drawing", + Iceberg_5_E21: "Bronto Burt Drawing", + Iceberg_5_E22: "Bouncy Drawing", + Iceberg_5_E23: "Joe", + Iceberg_5_E24: "Kapar", + Iceberg_5_E25: "Gansan", + Iceberg_5_E26: "Sasuke", + Iceberg_5_E27: "Togezo", + Iceberg_5_E28: "Sparky", + Iceberg_5_E29: "Bobin", + Iceberg_5_E30: "Chilly", + Iceberg_5_E31: "Peran", + Iceberg_6_E1: "Nruff", + Iceberg_6_E2: "Nidoo", + Iceberg_6_E3: "Sparky", + Iceberg_6_E4: "Sir Kibble", +} diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 77e887ce9443..cc027068d6e4 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -126,6 +126,18 @@ class AnimalRandomization(Choice): default = 0 +class CopyAbilityRandomization(Choice): + """ + Disabled: enemies give regular copy abilities and health. + Enabled: all enemies (except minibosses) will have the copy ability received from them randomized. + Enabled Plus Minus: enemies can additionally give you anywhere from +3 health to -3 health when eaten. + """ + display_name = "Copy Ability Randomization" + option_disabled = 0 + option_enabled = 1 + option_enabled_plus_minus = 2 + + class StrictBosses(DefaultOnToggle): """ If enabled, one will not be able to move onto the next world until the previous world's boss has been purified. @@ -328,6 +340,20 @@ class MusicShuffle(Choice): default = 0 +class VirtualConsoleChanges(Choice): + """ + Adds the ability to enable 2 of the Virtual Console changes. + Flash Reduction: reduces the flashing during the Zero battle. + Color Changes: changes the color of the background within the Zero Boss Butch rematch. + """ + display_name = "Virtual Console Changes" + option_none = 0 + option_flash_reduction = 1 + option_color_changes = 2 + option_both = 3 + default = 1 + + kdl3_options: typing.Dict[str, type(Option)] = { "death_link": DeathLink, "game_language": GameLanguage, @@ -345,6 +371,7 @@ class MusicShuffle(Choice): "boss_shuffle": BossShuffle, "allow_bb": BossShuffleAllowBB, "animal_randomization": AnimalRandomization, + "copy_ability_randomization": CopyAbilityRandomization, "strict_bosses": StrictBosses, "open_world": OpenWorld, "ow_boss_requirement": OpenWorldBossRequirement, @@ -355,4 +382,5 @@ class MusicShuffle(Choice): "gooey_flavor_preset": GooeyFlavorPreset, "gooey_flavor": GooeyFlavor, "music_shuffle": MusicShuffle, + "virtual_console": VirtualConsoleChanges, } diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index d5ed83fb6296..edb181c455f6 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -4,6 +4,7 @@ from pkgutil import get_data from BaseClasses import Entrance, Region +from Fill import fill_restrictive from worlds.AutoWorld import World from .Locations import KDL3Location, location_table, level_consumables from .Names import LocationName @@ -45,48 +46,26 @@ def generate_rooms(world: World, door_shuffle: bool, level_regions: typing.Dict[ for room_entry in room_data: room = Room(room_entry["name"], world.player, world.multiworld, None, room_entry["level"], room_entry["stage"], room_entry["room"], room_entry["pointer"], room_entry["music"], room_entry["default_exits"], - room_entry["animal_pointers"]) + room_entry["animal_pointers"], room_entry["enemies"]) room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else None for location in room_entry["locations"] if not any([x in location for x in ["1-Up", "Maxim"]]) or world.multiworld.consumables[world.player]}, KDL3Location) rooms[room.name] = room - world.multiworld.regions.extend([rooms[room] for room in rooms]) - # fill animals, and set item rule - if world.multiworld.animal_randomization[world.player] == 1: - animal_pool = [animal_friend_spawns[spawn] for spawn in animal_friend_spawns - if spawn != "Ripple Field 5 - Animal 2"] - if world.multiworld.accessibility[world.player] == 2: - animal_pool.append("Pitch Spawn") - world.multiworld.per_slot_randoms[world.player].shuffle( - animal_pool) # TODO: change to world.random once 0.4.1 support is deprecated - if world.multiworld.accessibility[world.player] != 2: - animal_pool.insert(28, "Pitch Spawn") - # Ripple Field 5 - Animal 2 needs to be Pitch to ensure accessibility on non-minimal and non-door rando - animal_friends = dict(zip(animal_friend_spawns.keys(), animal_pool)) - elif world.multiworld.animal_randomization[world.player] == 2: - animal_base = ["Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn"] - animal_pool = [world.multiworld.per_slot_randoms[world.player].choice(animal_base) - for _ in range(len(animal_friend_spawns) - - (7 if world.multiworld.accessibility[world.player] < 2 else 6))] - # have to guarantee one of each animal - animal_pool.extend(animal_base) - world.multiworld.per_slot_randoms[world.player].shuffle( - animal_pool) # TODO: change to world.random once 0.4.1 support is deprecated - if world.multiworld.accessibility[world.player] != 2: - animal_pool.insert(28, "Pitch Spawn") - animal_friends = dict(zip(animal_friend_spawns.keys(), animal_pool)) - else: - animal_friends = animal_friend_spawns.copy() - for name in rooms: - room = rooms[name] for location in room.locations: if "Animal" in location.name: add_item_rule(location, lambda item: item.name in { "Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn" }) - location.place_locked_item(world.create_item(animal_friends[location.name])) + world.multiworld.regions.extend([rooms[room] for room in rooms]) first_rooms: typing.Dict[int, Room] = dict() - if not door_shuffle: + if door_shuffle: + # first, we need to generate the notable edge cases + # 5-6 is the first, being the most restrictive + # half of its rooms are required to be vanilla, but can be in different orders + # the room before it *must* contain the copy ability required to unlock the room's goal + + raise NotImplementedError() + else: for name in rooms: room = rooms[name] if room.room == 0: diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index d4e35ebc3f01..23f060f0b9f6 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -158,9 +158,79 @@ 2991071, # BB PonCon 2998969, # BB Ado 2980927, # BB Dedede - 2894290 # BB Zero + 2894290 # BB Zero ] +enemy_remap = { + "Waddle Dee": 0, + "Bronto Burt": 2, + "Rocky": 3, + "Bobo": 5, + "Chilly": 6, + "Poppy Bros Jr.": 7, + "Sparky": 8, + "Polof": 9, + "Broom Hatter": 11, + "Cappy": 12, + "Bouncy": 13, + "Nruff": 15, + "Glunk": 16, + "Togezo": 18, + "Kabu": 19, + "Mony": 20, + "Blipper": 21, + "Squishy": 22, + "Gabon": 24, + "Oro": 25, + "Galbo": 26, + "Sir Kibble": 27, + "Nidoo": 28, + "Kany": 29, + "Sasuke": 30, + "Yaban": 32, + "Boten": 33, + "Coconut": 34, + "Doka": 35, + "Icicle": 36, + "Pteran": 39, + "Loud": 40, + "Como": 41, + "Klinko": 42, + "Babut": 43, + "Wappa": 44, + "Mariel": 45, + "Tick": 48, + "Apolo": 49, + "Popon Ball": 50, + "KeKe": 51, + "Magoo": 53, + "Raft Waddle Dee": 57, + "Madoo": 58, + "Corori": 60, + "Kapar": 67, + "Batamon": 68, + "Peran": 72, + "Bobin": 73, + "Mopoo": 74, + "Gansan": 75, + "Bukiset (Burning)": 76, + "Bukiset (Stone)": 77, + "Bukiset (Ice)": 78, + "Bukiset (Needle)": 79, + "Bukiset (Clean)": 80, + "Bukiset (Parasol)": 81, + "Bukiset (Spark)": 82, + "Bukiset (Cutter)": 83, + "Waddle Dee Drawing": 84, + "Bronto Burt Drawing": 85, + "Bouncy Drawing": 86, + "Kabu (Dekabu)": 87, + "Wapod": 88, + "Propeller": 89, + "Dogon": 90, + "Joe": 91 +} + class RomData: def __init__(self, file: str, name: typing.Optional[str] = None): @@ -984,7 +1054,8 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, music_map[5] = multiworld.per_slot_randoms[player].choice(music_choices) # Heart Star music doesn't work on regular stages music_map[8] = multiworld.per_slot_randoms[player].choice(music_choices) - for room in [region for region in multiworld.regions if region.player == player and isinstance(region, Room)]: + for room in [region for region in multiworld.regions if + region.player == player and isinstance(region, Room)]: room.patch(rom) for room in room_pointers: old_music = rom.read_byte(room + 2) @@ -1010,6 +1081,20 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x4A388, multiworld.per_slot_randoms[player].choice(music_choices)) rom.write_byte(0x4A38D, multiworld.per_slot_randoms[player].choice(music_choices)) + if multiworld.virtual_console[player] in [1, 3]: + # Flash Reduction + rom.write_byte(0x9AE68, 0x10) + rom.write_bytes(0x9AE8E, [0x08, 0x00, 0x22, 0x5D, 0xF7, 0x00, 0xA2, 0x08, ]) + rom.write_byte(0x9AEA1, 0x08) + rom.write_byte(0x9AEC9, 0x01) + rom.write_bytes(0x9AED2, [0xA9, 0x1F]) + rom.write_byte(0x9AEE1, 0x08) + + if multiworld.virtual_console[player] in [2, 3]: + # Hyper Zone BB colors + rom.write_bytes(0x2C5E16, [0xEE, 0x1B, 0x18, 0x5B, 0xD3, 0x4A, 0xF4, 0x3B, ]) + rom.write_bytes(0x2C8217, [0xFF, 0x1E, ]) + # boss requirements rom.write_bytes(0x3D000, struct.pack("HHHHH", boss_requirements[0], boss_requirements[1], boss_requirements[2], boss_requirements[3], boss_requirements[4])) diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index b57fb17f6f6f..694752bd3b46 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -24,8 +24,10 @@ class Room(Region): music: int = 0 default_exits: typing.List[typing.Dict[str, typing.Union[int, typing.List[str]]]] animal_pointers: typing.List[int] + enemies: typing.List[str] - def __init__(self, name, player, multiworld, hint, level, stage, room, pointer, music, default_exits, animal_pointers): + def __init__(self, name, player, multiworld, hint, level, stage, room, pointer, music, default_exits, + animal_pointers, enemies): super().__init__(name, player, multiworld, hint) self.level = level self.stage = stage @@ -34,6 +36,7 @@ def __init__(self, name, player, multiworld, hint, level, stage, room, pointer, self.music = music self.default_exits = default_exits self.animal_pointers = animal_pointers + self.enemies = enemies def patch(self, rom: "RomData"): rom.write_byte(self.pointer + 2, self.music) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 1da14f369c10..19393ea347a2 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -104,7 +104,7 @@ def set_rules(world: "KDL3World") -> None: lambda state: state.has("Coo", world.player) and state.has("Burning", world.player) and state.has("ChuChu", world.player) and can_reach_coo(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_shiro, world.player), - lambda state: state.has("Nago", world.player) and can_reach_nago(state, world.player)) + lambda state: can_reach_nago(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_angel, world.player), lambda state: state.has_all([ability for ability in copy_ability_table.keys()], world.player)) # cleaner than writing out 8 ands diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 185314a4b42a..b682eafa0b5e 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -2,10 +2,12 @@ import typing from BaseClasses import Tutorial, ItemClassification, MultiWorld +from Fill import fill_restrictive from worlds.AutoWorld import World, WebWorld from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item, \ trap_item_table from .Locations import location_table, KDL3Location, level_consumables, consumable_locations +from .Names.AnimalFriendSpawns import animal_friend_spawns from .Regions import create_levels from .Options import kdl3_options from .Names import LocationName @@ -19,9 +21,12 @@ import threading import base64 from Main import __version__ as APVersion - +from worlds.LauncherComponents import components logger = logging.getLogger("Kirby's Dream Land 3") +#SNIComponent = next(x for x in components if x.display_name == "SNI Client") +#SNIComponent.file_identifier.suffixes.append(".apkdl3") + if APVersion == "0.4.2": import settings @@ -112,6 +117,43 @@ def generate_early(self) -> None: f" because of strict_bosses set to true") self.multiworld.boss_requirement_random[self.player] = False + def pre_fill(self) -> None: + # fill animals + if self.multiworld.animal_randomization[self.player] != 0: + self.multiworld.get_location("Iceberg 4 - Animal 1", self.player) \ + .place_locked_item(self.create_item("ChuChu Spawn")) + # Not having ChuChu here makes the room impossible (since only she has vertical burning) + if self.multiworld.accessibility[self.player] < 2: + self.multiworld.get_location("Ripple Field 5 - Animal 2", self.player) \ + .place_locked_item(self.create_item("Pitch Spawn")) + # Ripple Field 5 - Animal 2 needs to be Pitch to ensure accessibility on non-minimal and non-door rando + if self.multiworld.animal_randomization[self.player] == 1: + animal_pool = [animal_friend_spawns[spawn] for spawn in animal_friend_spawns + if spawn not in ["Ripple Field 5 - Animal 2", "Iceberg 4 - Animal 1"]] + if self.multiworld.accessibility[self.player] == 2: + animal_pool.append("Pitch Spawn") + else: + animal_base = ["Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn"] + animal_pool = [self.multiworld.per_slot_randoms[self.player].choice(animal_base) + for _ in range(len(animal_friend_spawns) - + (7 if self.multiworld.accessibility[self.player] < 2 else 6))] + # have to guarantee one of each animal + animal_pool.extend(animal_base) + self.multiworld.per_slot_randoms[self.player].shuffle( + animal_pool) # TODO: change to world.random once 0.4.1 support is deprecated + locations = [self.multiworld.get_location(animal, self.player) for animal in animal_friend_spawns.keys()] + items = [self.create_item(animal) for animal in animal_pool] + fill_restrictive(self.multiworld, self.multiworld.get_all_state(False), locations, items) + else: + animal_friends = animal_friend_spawns.copy() + for animal in animal_friends: + self.multiworld.get_location(animal, self.player)\ + .place_locked_item(self.create_item(animal_friends[animal])) + + # if self.multiworld.copy_ability_randomization[self.player]: + + + def create_items(self) -> None: itempool = [] itempool.extend([self.create_item(name) for name in copy_ability_table]) diff --git a/worlds/kdl3/data/Rooms.json b/worlds/kdl3/data/Rooms.json index f8d956f565d9..559655ff784d 100644 --- a/worlds/kdl3/data/Rooms.json +++ b/worlds/kdl3/data/Rooms.json @@ -6,6 +6,11 @@ "room": 0, "pointer": 3434257, "animal_pointers": [], + "enemies": [ + "Waddle Dee", + "Sir Kibble", + "Cappy" + ], "default_exits": [ { "room": 1, @@ -13,6 +18,7 @@ "unkn2": 8, "x": 72, "y": 200, + "name": "Grass Land 1 - 0 Exit 0", "access_rule": [] }, { @@ -21,10 +27,15 @@ "unkn2": 9, "x": 104, "y": 152, + "name": "Grass Land 1 - 0 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 1 - Enemy 1 (Waddle Dee)", + "Grass Land 1 - Enemy 2 (Sir Kibble)", + "Grass Land 1 - Enemy 3 (Cappy)" + ], "music": 20 }, { @@ -34,6 +45,11 @@ "room": 1, "pointer": 3368373, "animal_pointers": [], + "enemies": [ + "Sparky", + "Bronto Burt", + "Sasuke" + ], "default_exits": [ { "room": 3, @@ -41,12 +57,16 @@ "unkn2": 6, "x": 56, "y": 152, + "name": "Grass Land 1 - 1 Exit 0", "access_rule": [] } ], "locations": [ "Grass Land 1 - 1-Up (Parasol)", - "Grass Land 1 - Maxim Tomato (Spark)" + "Grass Land 1 - Maxim Tomato (Spark)", + "Grass Land 1 - Enemy 4 (Sparky)", + "Grass Land 1 - Enemy 5 (Bronto Burt)", + "Grass Land 1 - Enemy 6 (Sasuke)" ], "music": 20 }, @@ -60,6 +80,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 0, @@ -67,6 +88,7 @@ "unkn2": 9, "x": 1416, "y": 152, + "name": "Grass Land 1 - 2 Exit 0", "access_rule": [] } ], @@ -83,6 +105,9 @@ "room": 3, "pointer": 3478442, "animal_pointers": [], + "enemies": [ + "Poppy Bros Jr." + ], "default_exits": [ { "room": 4, @@ -90,10 +115,13 @@ "unkn2": 9, "x": 56, "y": 152, + "name": "Grass Land 1 - 3 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 1 - Enemy 7 (Poppy Bros Jr.)" + ], "music": 20 }, { @@ -103,6 +131,7 @@ "room": 4, "pointer": 2978390, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 5, @@ -110,6 +139,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Grass Land 1 - 4 Exit 0", "access_rule": [] } ], @@ -125,6 +155,7 @@ "room": 5, "pointer": 2890835, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Grass Land 1 - Complete" @@ -138,6 +169,12 @@ "room": 0, "pointer": 3293347, "animal_pointers": [], + "enemies": [ + "Rocky", + "KeKe", + "Bobo", + "Poppy Bros Jr." + ], "default_exits": [ { "room": 1, @@ -145,10 +182,16 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Grass Land 2 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 2 - Enemy 1 (Rocky)", + "Grass Land 2 - Enemy 2 (KeKe)", + "Grass Land 2 - Enemy 3 (Bobo)", + "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)" + ], "music": 11 }, { @@ -161,6 +204,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -168,6 +212,7 @@ "unkn2": 9, "x": 56, "y": 136, + "name": "Grass Land 2 - 1 Exit 0", "access_rule": [] } ], @@ -184,6 +229,11 @@ "room": 2, "pointer": 3432109, "animal_pointers": [], + "enemies": [ + "Waddle Dee", + "Popon Ball", + "Bouncy" + ], "default_exits": [ { "room": 4, @@ -191,6 +241,7 @@ "unkn2": 11, "x": 72, "y": 200, + "name": "Grass Land 2 - 2 Exit 0", "access_rule": [] }, { @@ -199,10 +250,15 @@ "unkn2": 12, "x": 56, "y": 152, + "name": "Grass Land 2 - 2 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 2 - Enemy 5 (Waddle Dee)", + "Grass Land 2 - Enemy 6 (Popon Ball)", + "Grass Land 2 - Enemy 7 (Bouncy)" + ], "music": 11 }, { @@ -212,6 +268,7 @@ "room": 3, "pointer": 2970029, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -219,6 +276,7 @@ "unkn2": 9, "x": 840, "y": 168, + "name": "Grass Land 2 - 3 Exit 0", "access_rule": [] } ], @@ -232,6 +290,11 @@ "room": 4, "pointer": 3578022, "animal_pointers": [], + "enemies": [ + "Tick", + "Bronto Burt", + "Nruff" + ], "default_exits": [ { "room": 5, @@ -239,11 +302,15 @@ "unkn2": 12, "x": 72, "y": 152, + "name": "Grass Land 2 - 4 Exit 0", "access_rule": [] } ], "locations": [ - "Grass Land 2 - 1-Up (Needle)" + "Grass Land 2 - 1-Up (Needle)", + "Grass Land 2 - Enemy 8 (Tick)", + "Grass Land 2 - Enemy 9 (Bronto Burt)", + "Grass Land 2 - Enemy 10 (Nruff)" ], "music": 11 }, @@ -254,6 +321,7 @@ "room": 5, "pointer": 2966057, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -261,6 +329,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Grass Land 2 - 5 Exit 0", "access_rule": [] } ], @@ -276,6 +345,7 @@ "room": 6, "pointer": 2887461, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Grass Land 2 - Complete" @@ -289,6 +359,11 @@ "room": 0, "pointer": 3149707, "animal_pointers": [], + "enemies": [ + "Sparky", + "Rocky", + "Nruff" + ], "default_exits": [ { "room": 1, @@ -296,6 +371,7 @@ "unkn2": 7, "x": 72, "y": 840, + "name": "Grass Land 3 - 0 Exit 0", "access_rule": [] }, { @@ -304,10 +380,15 @@ "unkn2": 9, "x": 152, "y": 152, + "name": "Grass Land 3 - 0 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 3 - Enemy 1 (Sparky)", + "Grass Land 3 - Enemy 2 (Rocky)", + "Grass Land 3 - Enemy 3 (Nruff)" + ], "music": 19 }, { @@ -317,6 +398,7 @@ "room": 1, "pointer": 3204939, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 3, @@ -324,6 +406,7 @@ "unkn2": 9, "x": 56, "y": 152, + "name": "Grass Land 3 - 1 Exit 0", "access_rule": [] } ], @@ -340,6 +423,7 @@ "room": 2, "pointer": 3200066, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -347,6 +431,7 @@ "unkn2": 55, "x": 56, "y": 152, + "name": "Grass Land 3 - 2 Exit 0", "access_rule": [] } ], @@ -360,6 +445,7 @@ "room": 3, "pointer": 2959784, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -367,6 +453,7 @@ "unkn2": 9, "x": 56, "y": 120, + "name": "Grass Land 3 - 3 Exit 0", "access_rule": [] } ], @@ -383,6 +470,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 0, @@ -390,6 +478,7 @@ "unkn2": 9, "x": 760, "y": 152, + "name": "Grass Land 3 - 4 Exit 0", "access_rule": [] } ], @@ -406,6 +495,7 @@ "room": 5, "pointer": 2997811, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -413,6 +503,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Grass Land 3 - 5 Exit 0", "access_rule": [] } ], @@ -426,6 +517,9 @@ "room": 6, "pointer": 3084876, "animal_pointers": [], + "enemies": [ + "Bouncy" + ], "default_exits": [ { "room": 5, @@ -433,11 +527,13 @@ "unkn2": 9, "x": 40, "y": 152, + "name": "Grass Land 3 - 6 Exit 0", "access_rule": [] } ], "locations": [ - "Grass Land 3 - Pitcherman" + "Grass Land 3 - Pitcherman", + "Grass Land 3 - Enemy 4 (Bouncy)" ], "music": 19 }, @@ -448,6 +544,7 @@ "room": 7, "pointer": 2891317, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Grass Land 3 - Complete" @@ -461,6 +558,11 @@ "room": 0, "pointer": 3471284, "animal_pointers": [], + "enemies": [ + "Loud", + "Babut", + "Rocky" + ], "default_exits": [ { "room": 1, @@ -468,10 +570,15 @@ "unkn2": 13, "x": 72, "y": 136, + "name": "Grass Land 4 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 4 - Enemy 1 (Loud)", + "Grass Land 4 - Enemy 2 (Babut)", + "Grass Land 4 - Enemy 3 (Rocky)" + ], "music": 10 }, { @@ -481,6 +588,9 @@ "room": 1, "pointer": 3436401, "animal_pointers": [], + "enemies": [ + "Kapar" + ], "default_exits": [ { "room": 5, @@ -488,6 +598,7 @@ "unkn2": 5, "x": 184, "y": 312, + "name": "Grass Land 4 - 1 Exit 0", "access_rule": [] }, { @@ -496,11 +607,13 @@ "unkn2": 18, "x": 168, "y": 88, + "name": "Grass Land 4 - 1 Exit 1", "access_rule": [] } ], "locations": [ - "Grass Land 4 - Maxim Tomato (Zebon Right)" + "Grass Land 4 - Maxim Tomato (Zebon Right)", + "Grass Land 4 - Enemy 4 (Kapar)" ], "music": 10 }, @@ -511,6 +624,7 @@ "room": 2, "pointer": 3039401, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -518,6 +632,7 @@ "unkn2": 4, "x": 56, "y": 72, + "name": "Grass Land 4 - 2 Exit 0", "access_rule": [] } ], @@ -531,6 +646,10 @@ "room": 3, "pointer": 3722714, "animal_pointers": [], + "enemies": [ + "Glunk", + "Oro" + ], "default_exits": [ { "room": 4, @@ -538,12 +657,15 @@ "unkn2": 5, "x": 72, "y": 200, + "name": "Grass Land 4 - 3 Exit 0", "access_rule": [] } ], "locations": [ "Grass Land 4 - Maxim Tomato (Gordo)", - "Grass Land 4 - 1-Up (Gordo)" + "Grass Land 4 - 1-Up (Gordo)", + "Grass Land 4 - Enemy 5 (Glunk)", + "Grass Land 4 - Enemy 6 (Oro)" ], "music": 10 }, @@ -554,6 +676,7 @@ "room": 4, "pointer": 3304980, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -561,6 +684,7 @@ "unkn2": 9, "x": 40, "y": 152, + "name": "Grass Land 4 - 4 Exit 0", "access_rule": [] } ], @@ -576,6 +700,9 @@ "room": 5, "pointer": 3498127, "animal_pointers": [], + "enemies": [ + "Peran" + ], "default_exits": [ { "room": 2, @@ -583,6 +710,7 @@ "unkn2": 13, "x": 56, "y": 72, + "name": "Grass Land 4 - 5 Exit 0", "access_rule": [] }, { @@ -591,10 +719,13 @@ "unkn2": 18, "x": 56, "y": 200, + "name": "Grass Land 4 - 5 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 4 - Enemy 7 (Peran)" + ], "music": 10 }, { @@ -604,6 +735,7 @@ "room": 6, "pointer": 3160191, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 3, @@ -611,6 +743,7 @@ "unkn2": 4, "x": 72, "y": 376, + "name": "Grass Land 4 - 6 Exit 0", "access_rule": [] }, { @@ -619,6 +752,7 @@ "unkn2": 12, "x": 72, "y": 440, + "name": "Grass Land 4 - 6 Exit 1", "access_rule": [] } ], @@ -632,6 +766,7 @@ "room": 7, "pointer": 3035801, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -639,6 +774,7 @@ "unkn2": 12, "x": 56, "y": 200, + "name": "Grass Land 4 - 7 Exit 0", "access_rule": [] } ], @@ -652,6 +788,7 @@ "room": 8, "pointer": 2989794, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 10, @@ -659,6 +796,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Grass Land 4 - 8 Exit 0", "access_rule": [] } ], @@ -677,6 +815,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 1, @@ -684,6 +823,7 @@ "unkn2": 5, "x": 696, "y": 296, + "name": "Grass Land 4 - 9 Exit 0", "access_rule": [] } ], @@ -700,6 +840,7 @@ "room": 10, "pointer": 2888425, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Grass Land 4 - Complete" @@ -713,6 +854,11 @@ "room": 0, "pointer": 3303565, "animal_pointers": [], + "enemies": [ + "Propeller", + "Broom Hatter", + "Bouncy" + ], "default_exits": [ { "room": 1, @@ -720,10 +866,15 @@ "unkn2": 9, "x": 56, "y": 152, + "name": "Grass Land 5 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 5 - Enemy 1 (Propeller)", + "Grass Land 5 - Enemy 2 (Broom Hatter)", + "Grass Land 5 - Enemy 3 (Bouncy)" + ], "music": 11 }, { @@ -733,6 +884,9 @@ "room": 1, "pointer": 3048718, "animal_pointers": [], + "enemies": [ + "Sir Kibble" + ], "default_exits": [ { "room": 3, @@ -740,6 +894,7 @@ "unkn2": 4, "x": 184, "y": 152, + "name": "Grass Land 5 - 1 Exit 0", "access_rule": [] }, { @@ -748,6 +903,7 @@ "unkn2": 4, "x": 184, "y": 152, + "name": "Grass Land 5 - 1 Exit 1", "access_rule": [] }, { @@ -756,10 +912,13 @@ "unkn2": 9, "x": 56, "y": 88, + "name": "Grass Land 5 - 1 Exit 2", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 5 - Enemy 4 (Sir Kibble)" + ], "music": 11 }, { @@ -769,6 +928,11 @@ "room": 2, "pointer": 3327019, "animal_pointers": [], + "enemies": [ + "Waddle Dee", + "Sasuke", + "Nruff" + ], "default_exits": [ { "room": 7, @@ -776,10 +940,15 @@ "unkn2": 6, "x": 56, "y": 72, + "name": "Grass Land 5 - 2 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 5 - Enemy 5 (Waddle Dee)", + "Grass Land 5 - Enemy 6 (Sasuke)", + "Grass Land 5 - Enemy 7 (Nruff)" + ], "music": 11 }, { @@ -792,6 +961,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 1, @@ -799,6 +969,7 @@ "unkn2": 9, "x": 312, "y": 72, + "name": "Grass Land 5 - 3 Exit 0", "access_rule": [] } ], @@ -818,6 +989,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 1, @@ -825,6 +997,7 @@ "unkn2": 9, "x": 360, "y": 72, + "name": "Grass Land 5 - 4 Exit 0", "access_rule": [] } ], @@ -841,6 +1014,7 @@ "room": 5, "pointer": 2962351, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -848,6 +1022,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Grass Land 5 - 5 Exit 0", "access_rule": [] } ], @@ -863,6 +1038,7 @@ "room": 6, "pointer": 2886738, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Grass Land 5 - Complete" @@ -876,6 +1052,9 @@ "room": 7, "pointer": 3255423, "animal_pointers": [], + "enemies": [ + "Tick" + ], "default_exits": [ { "room": 5, @@ -883,10 +1062,13 @@ "unkn2": 9, "x": 56, "y": 152, + "name": "Grass Land 5 - 7 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 5 - Enemy 8 (Tick)" + ], "music": 11 }, { @@ -896,6 +1078,12 @@ "room": 0, "pointer": 3376872, "animal_pointers": [], + "enemies": [ + "Como", + "Togezo", + "Bronto Burt", + "Cappy" + ], "default_exits": [ { "room": 6, @@ -903,6 +1091,7 @@ "unkn2": 9, "x": 216, "y": 152, + "name": "Grass Land 6 - 0 Exit 0", "access_rule": [] }, { @@ -911,10 +1100,16 @@ "unkn2": 9, "x": 216, "y": 1144, + "name": "Grass Land 6 - 0 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 6 - Enemy 1 (Como)", + "Grass Land 6 - Enemy 2 (Togezo)", + "Grass Land 6 - Enemy 3 (Bronto Burt)", + "Grass Land 6 - Enemy 4 (Cappy)" + ], "music": 20 }, { @@ -924,6 +1119,10 @@ "room": 1, "pointer": 3395125, "animal_pointers": [], + "enemies": [ + "Bobo", + "Mariel" + ], "default_exits": [ { "room": 2, @@ -931,11 +1130,14 @@ "unkn2": 5, "x": 72, "y": 88, + "name": "Grass Land 6 - 1 Exit 0", "access_rule": [] } ], "locations": [ - "Grass Land 6 - 1-Up (Tower)" + "Grass Land 6 - 1-Up (Tower)", + "Grass Land 6 - Enemy 5 (Bobo)", + "Grass Land 6 - Enemy 6 (Mariel)" ], "music": 20 }, @@ -946,6 +1148,10 @@ "room": 2, "pointer": 3375177, "animal_pointers": [], + "enemies": [ + "Yaban", + "Broom Hatter" + ], "default_exits": [ { "room": 3, @@ -953,6 +1159,7 @@ "unkn2": 6, "x": 200, "y": 152, + "name": "Grass Land 6 - 2 Exit 0", "access_rule": [] }, { @@ -961,10 +1168,14 @@ "unkn2": 7, "x": 216, "y": 104, + "name": "Grass Land 6 - 2 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 6 - Enemy 7 (Yaban)", + "Grass Land 6 - Enemy 8 (Broom Hatter)" + ], "music": 20 }, { @@ -974,6 +1185,10 @@ "room": 3, "pointer": 3322977, "animal_pointers": [], + "enemies": [ + "Apolo", + "Sasuke" + ], "default_exits": [ { "room": 4, @@ -981,10 +1196,14 @@ "unkn2": 52, "x": 72, "y": 104, + "name": "Grass Land 6 - 3 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 6 - Enemy 9 (Apolo)", + "Grass Land 6 - Enemy 10 (Sasuke)" + ], "music": 20 }, { @@ -994,6 +1213,9 @@ "room": 4, "pointer": 3490819, "animal_pointers": [], + "enemies": [ + "Rocky" + ], "default_exits": [ { "room": 5, @@ -1001,11 +1223,13 @@ "unkn2": 6, "x": 56, "y": 152, + "name": "Grass Land 6 - 4 Exit 0", "access_rule": [] } ], "locations": [ - "Grass Land 6 - 1-Up (Falling)" + "Grass Land 6 - 1-Up (Falling)", + "Grass Land 6 - Enemy 11 (Rocky)" ], "music": 20 }, @@ -1016,6 +1240,7 @@ "room": 5, "pointer": 3076769, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -1023,6 +1248,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Grass Land 6 - 5 Exit 0", "access_rule": [] } ], @@ -1041,6 +1267,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 0, @@ -1048,6 +1275,7 @@ "unkn2": 9, "x": 840, "y": 152, + "name": "Grass Land 6 - 6 Exit 0", "access_rule": [] } ], @@ -1067,6 +1295,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -1074,6 +1303,7 @@ "unkn2": 6, "x": 808, "y": 120, + "name": "Grass Land 6 - 7 Exit 0", "access_rule": [] } ], @@ -1090,6 +1320,7 @@ "room": 8, "pointer": 2884569, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Grass Land 6 - Complete" @@ -1103,6 +1334,7 @@ "room": 0, "pointer": 2984105, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Grass Land - Boss (Whispy Woods) Purified", @@ -1117,6 +1349,12 @@ "room": 0, "pointer": 3279855, "animal_pointers": [], + "enemies": [ + "Waddle Dee", + "Glunk", + "Broom Hatter", + "Cappy" + ], "default_exits": [ { "room": 2, @@ -1124,10 +1362,16 @@ "unkn2": 8, "x": 56, "y": 152, + "name": "Ripple Field 1 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 1 - Enemy 1 (Waddle Dee)", + "Ripple Field 1 - Enemy 2 (Glunk)", + "Ripple Field 1 - Enemy 3 (Broom Hatter)", + "Ripple Field 1 - Enemy 4 (Cappy)" + ], "music": 15 }, { @@ -1137,6 +1381,11 @@ "room": 1, "pointer": 3588688, "animal_pointers": [], + "enemies": [ + "Bronto Burt", + "Rocky", + "Poppy Bros Jr." + ], "default_exits": [ { "room": 3, @@ -1144,6 +1393,7 @@ "unkn2": 11, "x": 40, "y": 232, + "name": "Ripple Field 1 - 1 Exit 0", "access_rule": [] }, { @@ -1152,6 +1402,7 @@ "unkn2": 16, "x": 200, "y": 184, + "name": "Ripple Field 1 - 1 Exit 1", "access_rule": [] }, { @@ -1160,6 +1411,7 @@ "unkn2": 16, "x": 200, "y": 184, + "name": "Ripple Field 1 - 1 Exit 2", "access_rule": [] }, { @@ -1168,10 +1420,15 @@ "unkn2": 16, "x": 200, "y": 184, + "name": "Ripple Field 1 - 1 Exit 3", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 1 - Enemy 5 (Bronto Burt)", + "Ripple Field 1 - Enemy 6 (Rocky)", + "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)" + ], "music": 15 }, { @@ -1184,6 +1441,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 1, @@ -1191,6 +1449,7 @@ "unkn2": 9, "x": 56, "y": 168, + "name": "Ripple Field 1 - 2 Exit 0", "access_rule": [] } ], @@ -1207,6 +1466,9 @@ "room": 3, "pointer": 3558828, "animal_pointers": [], + "enemies": [ + "Bobin" + ], "default_exits": [ { "room": 4, @@ -1214,10 +1476,13 @@ "unkn2": 5, "x": 40, "y": 152, + "name": "Ripple Field 1 - 3 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 1 - Enemy 8 (Bobin)" + ], "music": 15 }, { @@ -1227,6 +1492,7 @@ "room": 4, "pointer": 2974271, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -1234,6 +1500,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Ripple Field 1 - 4 Exit 0", "access_rule": [] } ], @@ -1249,6 +1516,7 @@ "room": 5, "pointer": 3051513, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 1, @@ -1256,6 +1524,7 @@ "unkn2": 11, "x": 1192, "y": 264, + "name": "Ripple Field 1 - 5 Exit 0", "access_rule": [] } ], @@ -1269,6 +1538,7 @@ "room": 6, "pointer": 3049838, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 1, @@ -1276,6 +1546,7 @@ "unkn2": 11, "x": 1752, "y": 264, + "name": "Ripple Field 1 - 6 Exit 0", "access_rule": [] } ], @@ -1289,6 +1560,7 @@ "room": 7, "pointer": 3066407, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 1, @@ -1296,6 +1568,7 @@ "unkn2": 11, "x": 2232, "y": 264, + "name": "Ripple Field 1 - 7 Exit 0", "access_rule": [] } ], @@ -1309,6 +1582,7 @@ "room": 8, "pointer": 2889148, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Ripple Field 1 - Complete" @@ -1322,6 +1596,12 @@ "room": 0, "pointer": 3342336, "animal_pointers": [], + "enemies": [ + "Togezo", + "Coconut", + "Blipper", + "Sasuke" + ], "default_exits": [ { "room": 1, @@ -1329,10 +1609,16 @@ "unkn2": 15, "x": 56, "y": 104, + "name": "Ripple Field 2 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 2 - Enemy 1 (Togezo)", + "Ripple Field 2 - Enemy 2 (Coconut)", + "Ripple Field 2 - Enemy 3 (Blipper)", + "Ripple Field 2 - Enemy 4 (Sasuke)" + ], "music": 10 }, { @@ -1345,6 +1631,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 3, @@ -1352,6 +1639,7 @@ "unkn2": 8, "x": 72, "y": 248, + "name": "Ripple Field 2 - 1 Exit 0", "access_rule": [] } ], @@ -1368,6 +1656,9 @@ "room": 2, "pointer": 3451207, "animal_pointers": [], + "enemies": [ + "Kany" + ], "default_exits": [ { "room": 4, @@ -1375,6 +1666,7 @@ "unkn2": 5, "x": 72, "y": 152, + "name": "Ripple Field 2 - 2 Exit 0", "access_rule": [] }, { @@ -1383,6 +1675,7 @@ "unkn2": 6, "x": 56, "y": 152, + "name": "Ripple Field 2 - 2 Exit 1", "access_rule": [] }, { @@ -1391,10 +1684,13 @@ "unkn2": 17, "x": 136, "y": 264, + "name": "Ripple Field 2 - 2 Exit 2", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 2 - Enemy 5 (Kany)" + ], "music": 10 }, { @@ -1404,6 +1700,9 @@ "room": 3, "pointer": 3674327, "animal_pointers": [], + "enemies": [ + "Glunk" + ], "default_exits": [ { "room": 2, @@ -1411,12 +1710,14 @@ "unkn2": 5, "x": 40, "y": 136, + "name": "Ripple Field 2 - 3 Exit 0", "access_rule": [] } ], "locations": [ "Ripple Field 2 - 1-Up (Currents)", - "Ripple Field 2 - Maxim Tomato (Currents)" + "Ripple Field 2 - Maxim Tomato (Currents)", + "Ripple Field 2 - Enemy 6 (Glunk)" ], "music": 10 }, @@ -1427,6 +1728,7 @@ "room": 4, "pointer": 2972744, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -1434,6 +1736,7 @@ "unkn2": 9, "x": 520, "y": 88, + "name": "Ripple Field 2 - 4 Exit 0", "access_rule": [] } ], @@ -1450,6 +1753,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -1457,6 +1761,7 @@ "unkn2": 16, "x": 1048, "y": 280, + "name": "Ripple Field 2 - 5 Exit 0", "access_rule": [] } ], @@ -1473,6 +1778,7 @@ "room": 6, "pointer": 2973127, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -1480,6 +1786,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Ripple Field 2 - 6 Exit 0", "access_rule": [] } ], @@ -1495,6 +1802,7 @@ "room": 7, "pointer": 2890353, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Ripple Field 2 - Complete" @@ -1508,6 +1816,11 @@ "room": 0, "pointer": 3517254, "animal_pointers": [], + "enemies": [ + "Raft Waddle Dee", + "Kapar", + "Blipper" + ], "default_exits": [ { "room": 3, @@ -1515,10 +1828,15 @@ "unkn2": 8, "x": 40, "y": 104, + "name": "Ripple Field 3 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", + "Ripple Field 3 - Enemy 2 (Kapar)", + "Ripple Field 3 - Enemy 3 (Blipper)" + ], "music": 18 }, { @@ -1528,6 +1846,11 @@ "room": 1, "pointer": 3604480, "animal_pointers": [], + "enemies": [ + "Sparky", + "Glunk", + "Joe" + ], "default_exits": [ { "room": 7, @@ -1535,12 +1858,16 @@ "unkn2": 24, "x": 104, "y": 328, + "name": "Ripple Field 3 - 1 Exit 0", "access_rule": [] } ], "locations": [ "Ripple Field 3 - Maxim Tomato (Cove)", - "Ripple Field 3 - 1-Up (Cutter/Spark)" + "Ripple Field 3 - 1-Up (Cutter/Spark)", + "Ripple Field 3 - Enemy 4 (Sparky)", + "Ripple Field 3 - Enemy 5 (Glunk)", + "Ripple Field 3 - Enemy 6 (Joe)" ], "music": 18 }, @@ -1551,6 +1878,9 @@ "room": 2, "pointer": 3715428, "animal_pointers": [], + "enemies": [ + "Bobo" + ], "default_exits": [ { "room": 4, @@ -1558,10 +1888,13 @@ "unkn2": 9, "x": 56, "y": 152, + "name": "Ripple Field 3 - 2 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 3 - Enemy 7 (Bobo)" + ], "music": 18 }, { @@ -1574,6 +1907,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 1, @@ -1581,6 +1915,7 @@ "unkn2": 6, "x": 56, "y": 104, + "name": "Ripple Field 3 - 3 Exit 0", "access_rule": [] } ], @@ -1597,6 +1932,7 @@ "room": 4, "pointer": 2970810, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -1604,6 +1940,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Ripple Field 3 - 4 Exit 0", "access_rule": [] } ], @@ -1619,6 +1956,7 @@ "room": 5, "pointer": 2987502, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -1626,6 +1964,7 @@ "unkn2": 9, "x": 232, "y": 88, + "name": "Ripple Field 3 - 5 Exit 0", "access_rule": [] } ], @@ -1639,6 +1978,7 @@ "room": 6, "pointer": 2888666, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Ripple Field 3 - Complete" @@ -1652,6 +1992,7 @@ "room": 7, "pointer": 3161120, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 5, @@ -1659,6 +2000,7 @@ "unkn2": 5, "x": 40, "y": 152, + "name": "Ripple Field 3 - 7 Exit 0", "access_rule": [] }, { @@ -1667,6 +2009,7 @@ "unkn2": 20, "x": 56, "y": 216, + "name": "Ripple Field 3 - 7 Exit 1", "access_rule": [] } ], @@ -1680,6 +2023,13 @@ "room": 0, "pointer": 3082540, "animal_pointers": [], + "enemies": [ + "Bukiset (Stone)", + "Bukiset (Needle)", + "Bukiset (Clean)", + "Bukiset (Parasol)", + "Mony" + ], "default_exits": [ { "room": 6, @@ -1687,10 +2037,17 @@ "unkn2": 16, "x": 72, "y": 232, + "name": "Ripple Field 4 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 4 - Enemy 1 (Bukiset (Stone))", + "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", + "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", + "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", + "Ripple Field 4 - Enemy 5 (Mony)" + ], "music": 15 }, { @@ -1700,6 +2057,7 @@ "room": 1, "pointer": 2964846, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -1707,6 +2065,7 @@ "unkn2": 8, "x": 72, "y": 88, + "name": "Ripple Field 4 - 1 Exit 0", "access_rule": [] } ], @@ -1720,6 +2079,9 @@ "room": 2, "pointer": 3018503, "animal_pointers": [], + "enemies": [ + "Bukiset (Burning)" + ], "default_exits": [ { "room": 11, @@ -1727,6 +2089,7 @@ "unkn2": 5, "x": 56, "y": 88, + "name": "Ripple Field 4 - 2 Exit 0", "access_rule": [] }, { @@ -1735,10 +2098,13 @@ "unkn2": 15, "x": 56, "y": 216, + "name": "Ripple Field 4 - 2 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 4 - Enemy 6 (Bukiset (Burning))" + ], "music": 15 }, { @@ -1748,6 +2114,7 @@ "room": 3, "pointer": 2988166, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 4, @@ -1755,6 +2122,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Ripple Field 4 - 3 Exit 0", "access_rule": [] } ], @@ -1770,6 +2138,7 @@ "room": 4, "pointer": 2885533, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Ripple Field 4 - Complete" @@ -1787,6 +2156,7 @@ 230, 238 ], + "enemies": [], "default_exits": [ { "room": 6, @@ -1794,6 +2164,7 @@ "unkn2": 5, "x": 360, "y": 120, + "name": "Ripple Field 4 - 5 Exit 0", "access_rule": [] }, { @@ -1802,6 +2173,7 @@ "unkn2": 5, "x": 488, "y": 120, + "name": "Ripple Field 4 - 5 Exit 1", "access_rule": [] }, { @@ -1810,6 +2182,7 @@ "unkn2": 5, "x": 104, "y": 88, + "name": "Ripple Field 4 - 5 Exit 2", "access_rule": [] }, { @@ -1818,6 +2191,7 @@ "unkn2": 11, "x": 440, "y": 216, + "name": "Ripple Field 4 - 5 Exit 3", "access_rule": [] } ], @@ -1835,6 +2209,10 @@ "room": 6, "pointer": 3234805, "animal_pointers": [], + "enemies": [ + "Bobin", + "Blipper" + ], "default_exits": [ { "room": 5, @@ -1842,6 +2220,7 @@ "unkn2": 7, "x": 104, "y": 88, + "name": "Ripple Field 4 - 6 Exit 0", "access_rule": [] }, { @@ -1850,6 +2229,7 @@ "unkn2": 7, "x": 232, "y": 88, + "name": "Ripple Field 4 - 6 Exit 1", "access_rule": [] }, { @@ -1858,6 +2238,7 @@ "unkn2": 13, "x": 184, "y": 184, + "name": "Ripple Field 4 - 6 Exit 2", "access_rule": [] }, { @@ -1866,10 +2247,14 @@ "unkn2": 15, "x": 88, "y": 216, + "name": "Ripple Field 4 - 6 Exit 3", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 4 - Enemy 7 (Bobin)", + "Ripple Field 4 - Enemy 8 (Blipper)" + ], "music": 15 }, { @@ -1879,6 +2264,7 @@ "room": 7, "pointer": 3155468, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 1, @@ -1886,6 +2272,7 @@ "unkn2": 6, "x": 104, "y": 136, + "name": "Ripple Field 4 - 7 Exit 0", "access_rule": [] }, { @@ -1894,6 +2281,7 @@ "unkn2": 9, "x": 72, "y": 248, + "name": "Ripple Field 4 - 7 Exit 1", "access_rule": [] } ], @@ -1907,6 +2295,10 @@ "room": 8, "pointer": 3350031, "animal_pointers": [], + "enemies": [ + "Como", + "Oro" + ], "default_exits": [ { "room": 7, @@ -1914,6 +2306,7 @@ "unkn2": 22, "x": 184, "y": 440, + "name": "Ripple Field 4 - 8 Exit 0", "access_rule": [] }, { @@ -1922,6 +2315,7 @@ "unkn2": 22, "x": 296, "y": 440, + "name": "Ripple Field 4 - 8 Exit 1", "access_rule": [] }, { @@ -1930,6 +2324,7 @@ "unkn2": 72, "x": 168, "y": 152, + "name": "Ripple Field 4 - 8 Exit 2", "access_rule": [] }, { @@ -1938,10 +2333,14 @@ "unkn2": 72, "x": 120, "y": 152, + "name": "Ripple Field 4 - 8 Exit 3", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 4 - Enemy 9 (Como)", + "Ripple Field 4 - Enemy 10 (Oro)" + ], "music": 15 }, { @@ -1951,6 +2350,9 @@ "room": 9, "pointer": 3050397, "animal_pointers": [], + "enemies": [ + "Gansan" + ], "default_exits": [ { "room": 8, @@ -1958,11 +2360,13 @@ "unkn2": 9, "x": 264, "y": 1144, + "name": "Ripple Field 4 - 9 Exit 0", "access_rule": [] } ], "locations": [ - "Ripple Field 4 - Maxim Tomato (Stone)" + "Ripple Field 4 - Maxim Tomato (Stone)", + "Ripple Field 4 - Enemy 11 (Gansan)" ], "music": 15 }, @@ -1973,6 +2377,7 @@ "room": 10, "pointer": 3052069, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -1980,6 +2385,7 @@ "unkn2": 9, "x": 376, "y": 1144, + "name": "Ripple Field 4 - 10 Exit 0", "access_rule": [] } ], @@ -1995,6 +2401,11 @@ "room": 11, "pointer": 3386974, "animal_pointers": [], + "enemies": [ + "Waddle Dee", + "Kapar", + "Squishy" + ], "default_exits": [ { "room": 3, @@ -2002,10 +2413,15 @@ "unkn2": 13, "x": 72, "y": 152, + "name": "Ripple Field 4 - 11 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 4 - Enemy 12 (Waddle Dee)", + "Ripple Field 4 - Enemy 13 (Kapar)", + "Ripple Field 4 - Enemy 14 (Squishy)" + ], "music": 15 }, { @@ -2015,6 +2431,9 @@ "room": 12, "pointer": 3168339, "animal_pointers": [], + "enemies": [ + "Nidoo" + ], "default_exits": [ { "room": 8, @@ -2022,6 +2441,7 @@ "unkn2": 7, "x": 88, "y": 1224, + "name": "Ripple Field 4 - 12 Exit 0", "access_rule": [] }, { @@ -2030,10 +2450,13 @@ "unkn2": 7, "x": 88, "y": 136, + "name": "Ripple Field 4 - 12 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 4 - Enemy 15 (Nidoo)" + ], "music": 15 }, { @@ -2043,6 +2466,7 @@ "room": 13, "pointer": 2958478, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 12, @@ -2050,6 +2474,7 @@ "unkn2": 8, "x": 1192, "y": 120, + "name": "Ripple Field 4 - 13 Exit 0", "access_rule": [] } ], @@ -2065,6 +2490,7 @@ "room": 0, "pointer": 3240369, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -2072,6 +2498,7 @@ "unkn2": 43, "x": 88, "y": 344, + "name": "Ripple Field 5 - 0 Exit 0", "access_rule": [] } ], @@ -2085,6 +2512,7 @@ "room": 1, "pointer": 3547528, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -2092,6 +2520,7 @@ "unkn2": 4, "x": 184, "y": 344, + "name": "Ripple Field 5 - 1 Exit 0", "access_rule": [] } ], @@ -2105,6 +2534,10 @@ "room": 2, "pointer": 3611327, "animal_pointers": [], + "enemies": [ + "Glunk", + "Joe" + ], "default_exits": [ { "room": 4, @@ -2112,10 +2545,14 @@ "unkn2": 21, "x": 56, "y": 184, + "name": "Ripple Field 5 - 2 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 5 - Enemy 1 (Glunk)", + "Ripple Field 5 - Enemy 2 (Joe)" + ], "music": 16 }, { @@ -2125,6 +2562,11 @@ "room": 3, "pointer": 3926157, "animal_pointers": [], + "enemies": [ + "Bobin", + "Mony", + "Squishy" + ], "default_exits": [ { "room": 8, @@ -2132,6 +2574,7 @@ "unkn2": 38, "x": 152, "y": 152, + "name": "Ripple Field 5 - 3 Exit 0", "access_rule": [] }, { @@ -2140,12 +2583,16 @@ "unkn2": 38, "x": 248, "y": 1064, + "name": "Ripple Field 5 - 3 Exit 1", "access_rule": [] } ], "locations": [ "Ripple Field 5 - 1-Up (Currents)", - "Ripple Field 5 - Maxim Tomato (Currents)" + "Ripple Field 5 - Maxim Tomato (Currents)", + "Ripple Field 5 - Enemy 3 (Bobin)", + "Ripple Field 5 - Enemy 4 (Mony)", + "Ripple Field 5 - Enemy 5 (Squishy)" ], "music": 16 }, @@ -2158,6 +2605,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 5, @@ -2165,6 +2613,7 @@ "unkn2": 4, "x": 232, "y": 152, + "name": "Ripple Field 5 - 4 Exit 0", "access_rule": [] } ], @@ -2180,6 +2629,7 @@ "room": 5, "pointer": 3207333, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 4, @@ -2187,6 +2637,7 @@ "unkn2": 9, "x": 56, "y": 72, + "name": "Ripple Field 5 - 5 Exit 0", "access_rule": [] }, { @@ -2195,6 +2646,7 @@ "unkn2": 9, "x": 120, "y": 552, + "name": "Ripple Field 5 - 5 Exit 1", "access_rule": [ "Kine" ] @@ -2210,6 +2662,11 @@ "room": 6, "pointer": 3485896, "animal_pointers": [], + "enemies": [ + "Yaban", + "Broom Hatter", + "Bouncy" + ], "default_exits": [ { "room": 9, @@ -2217,10 +2674,15 @@ "unkn2": 11, "x": 56, "y": 152, + "name": "Ripple Field 5 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 5 - Enemy 6 (Yaban)", + "Ripple Field 5 - Enemy 7 (Broom Hatter)", + "Ripple Field 5 - Enemy 8 (Bouncy)" + ], "music": 16 }, { @@ -2230,6 +2692,11 @@ "room": 7, "pointer": 3752698, "animal_pointers": [], + "enemies": [ + "Sparky", + "Rocky", + "Babut" + ], "default_exits": [ { "room": 10, @@ -2237,6 +2704,7 @@ "unkn2": 31, "x": 152, "y": 152, + "name": "Ripple Field 5 - 7 Exit 0", "access_rule": [] }, { @@ -2245,11 +2713,15 @@ "unkn2": 40, "x": 88, "y": 200, + "name": "Ripple Field 5 - 7 Exit 1", "access_rule": [] } ], "locations": [ - "Ripple Field 5 - Maxim Tomato (Exit)" + "Ripple Field 5 - Maxim Tomato (Exit)", + "Ripple Field 5 - Enemy 9 (Sparky)", + "Ripple Field 5 - Enemy 10 (Rocky)", + "Ripple Field 5 - Enemy 11 (Babut)" ], "music": 16 }, @@ -2262,6 +2734,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 3, @@ -2269,6 +2742,7 @@ "unkn2": 9, "x": 88, "y": 616, + "name": "Ripple Field 5 - 8 Exit 0", "access_rule": [] } ], @@ -2284,6 +2758,7 @@ "room": 9, "pointer": 2963193, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 11, @@ -2291,6 +2766,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Ripple Field 5 - 9 Exit 0", "access_rule": [] } ], @@ -2306,6 +2782,9 @@ "room": 10, "pointer": 3042934, "animal_pointers": [], + "enemies": [ + "Galbo" + ], "default_exits": [ { "room": 7, @@ -2313,10 +2792,13 @@ "unkn2": 9, "x": 712, "y": 504, + "name": "Ripple Field 5 - 10 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 5 - Enemy 12 (Galbo)" + ], "music": 16 }, { @@ -2326,6 +2808,7 @@ "room": 11, "pointer": 2886256, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Ripple Field 5 - Complete" @@ -2339,6 +2822,9 @@ "room": 0, "pointer": 2949576, "animal_pointers": [], + "enemies": [ + "Kany" + ], "default_exits": [ { "room": 1, @@ -2346,10 +2832,13 @@ "unkn2": 7, "x": 40, "y": 152, + "name": "Ripple Field 6 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 6 - Enemy 1 (Kany)" + ], "music": 15 }, { @@ -2363,6 +2852,7 @@ 200, 208 ], + "enemies": [], "default_exits": [ { "room": 7, @@ -2370,6 +2860,7 @@ "unkn2": 9, "x": 56, "y": 264, + "name": "Ripple Field 6 - 1 Exit 0", "access_rule": [] } ], @@ -2387,6 +2878,7 @@ "room": 2, "pointer": 3637749, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -2394,6 +2886,7 @@ "unkn2": 9, "x": 104, "y": 872, + "name": "Ripple Field 6 - 2 Exit 0", "access_rule": [] }, { @@ -2402,6 +2895,7 @@ "unkn2": 22, "x": 184, "y": 88, + "name": "Ripple Field 6 - 2 Exit 1", "access_rule": [] }, { @@ -2410,6 +2904,7 @@ "unkn2": 26, "x": 88, "y": 88, + "name": "Ripple Field 6 - 2 Exit 2", "access_rule": [] }, { @@ -2418,6 +2913,7 @@ "unkn2": 26, "x": 248, "y": 88, + "name": "Ripple Field 6 - 2 Exit 3", "access_rule": [] } ], @@ -2431,6 +2927,7 @@ "room": 3, "pointer": 3092564, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -2438,6 +2935,7 @@ "unkn2": 5, "x": 744, "y": 424, + "name": "Ripple Field 6 - 3 Exit 0", "access_rule": [] }, { @@ -2446,6 +2944,7 @@ "unkn2": 5, "x": 872, "y": 424, + "name": "Ripple Field 6 - 3 Exit 1", "access_rule": [] } ], @@ -2459,6 +2958,7 @@ "room": 4, "pointer": 3133247, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -2466,6 +2966,7 @@ "unkn2": 5, "x": 824, "y": 360, + "name": "Ripple Field 6 - 4 Exit 0", "access_rule": [] } ], @@ -2479,6 +2980,7 @@ "room": 5, "pointer": 3507762, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -2486,6 +2988,7 @@ "unkn2": 4, "x": 680, "y": 72, + "name": "Ripple Field 6 - 5 Exit 0", "access_rule": [] }, { @@ -2494,6 +2997,7 @@ "unkn2": 6, "x": 440, "y": 104, + "name": "Ripple Field 6 - 5 Exit 1", "access_rule": [] }, { @@ -2502,6 +3006,7 @@ "unkn2": 10, "x": 440, "y": 168, + "name": "Ripple Field 6 - 5 Exit 2", "access_rule": [] }, { @@ -2510,6 +3015,7 @@ "unkn2": 10, "x": 104, "y": 152, + "name": "Ripple Field 6 - 5 Exit 3", "access_rule": [] }, { @@ -2518,6 +3024,7 @@ "unkn2": 12, "x": 200, "y": 200, + "name": "Ripple Field 6 - 5 Exit 4", "access_rule": [] }, { @@ -2526,6 +3033,7 @@ "unkn2": 12, "x": 680, "y": 200, + "name": "Ripple Field 6 - 5 Exit 5", "access_rule": [] }, { @@ -2534,6 +3042,7 @@ "unkn2": 16, "x": 680, "y": 264, + "name": "Ripple Field 6 - 5 Exit 6", "access_rule": [] } ], @@ -2547,6 +3056,7 @@ "room": 6, "pointer": 3211264, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 5, @@ -2554,6 +3064,7 @@ "unkn2": 10, "x": 72, "y": 168, + "name": "Ripple Field 6 - 6 Exit 0", "access_rule": [] } ], @@ -2567,6 +3078,12 @@ "room": 7, "pointer": 3586039, "animal_pointers": [], + "enemies": [ + "KeKe", + "Kapar", + "Rocky", + "Poppy Bros Jr." + ], "default_exits": [ { "room": 5, @@ -2574,10 +3091,16 @@ "unkn2": 16, "x": 72, "y": 168, + "name": "Ripple Field 6 - 7 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 6 - Enemy 2 (KeKe)", + "Ripple Field 6 - Enemy 3 (Kapar)", + "Ripple Field 6 - Enemy 4 (Rocky)", + "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)" + ], "music": 15 }, { @@ -2587,6 +3110,12 @@ "room": 8, "pointer": 3621483, "animal_pointers": [], + "enemies": [ + "Propeller", + "Coconut", + "Sasuke", + "Nruff" + ], "default_exits": [ { "room": 10, @@ -2594,6 +3123,7 @@ "unkn2": 11, "x": 56, "y": 152, + "name": "Ripple Field 6 - 8 Exit 0", "access_rule": [] }, { @@ -2602,10 +3132,16 @@ "unkn2": 54, "x": 72, "y": 152, + "name": "Ripple Field 6 - 8 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 6 - Enemy 6 (Propeller)", + "Ripple Field 6 - Enemy 7 (Coconut)", + "Ripple Field 6 - Enemy 8 (Sasuke)", + "Ripple Field 6 - Enemy 9 (Nruff)" + ], "music": 15 }, { @@ -2617,6 +3153,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 8, @@ -2624,6 +3161,7 @@ "unkn2": 9, "x": 408, "y": 872, + "name": "Ripple Field 6 - 9 Exit 0", "access_rule": [] } ], @@ -2639,6 +3177,7 @@ "room": 10, "pointer": 3069438, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 11, @@ -2646,6 +3185,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Ripple Field 6 - 10 Exit 0", "access_rule": [] } ], @@ -2661,6 +3201,7 @@ "room": 11, "pointer": 2886497, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Ripple Field 6 - Complete" @@ -2674,6 +3215,7 @@ "room": 0, "pointer": 3157370, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Ripple Field - Boss (Acro) Purified", @@ -2688,6 +3230,10 @@ "room": 0, "pointer": 3524267, "animal_pointers": [], + "enemies": [ + "Bronto Burt", + "Galbo" + ], "default_exits": [ { "room": 5, @@ -2695,10 +3241,14 @@ "unkn2": 7, "x": 72, "y": 152, + "name": "Sand Canyon 1 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 1 - Enemy 1 (Bronto Burt)", + "Sand Canyon 1 - Enemy 2 (Galbo)" + ], "music": 13 }, { @@ -2711,6 +3261,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -2718,6 +3269,7 @@ "unkn2": 5, "x": 104, "y": 408, + "name": "Sand Canyon 1 - 1 Exit 0", "access_rule": [] } ], @@ -2734,6 +3286,9 @@ "room": 2, "pointer": 3512532, "animal_pointers": [], + "enemies": [ + "Oro" + ], "default_exits": [ { "room": 3, @@ -2741,10 +3296,13 @@ "unkn2": 6, "x": 56, "y": 120, + "name": "Sand Canyon 1 - 2 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 1 - Enemy 3 (Oro)" + ], "music": 13 }, { @@ -2754,6 +3312,12 @@ "room": 3, "pointer": 3719146, "animal_pointers": [], + "enemies": [ + "Sparky", + "Propeller", + "Gansan", + "Babut" + ], "default_exits": [ { "room": 4, @@ -2761,10 +3325,16 @@ "unkn2": 73, "x": 72, "y": 280, + "name": "Sand Canyon 1 - 3 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 1 - Enemy 4 (Sparky)", + "Sand Canyon 1 - Enemy 5 (Propeller)", + "Sand Canyon 1 - Enemy 6 (Gansan)", + "Sand Canyon 1 - Enemy 7 (Babut)" + ], "music": 13 }, { @@ -2774,6 +3344,12 @@ "room": 4, "pointer": 3421212, "animal_pointers": [], + "enemies": [ + "Loud", + "Dogon", + "Bouncy", + "Pteran" + ], "default_exits": [ { "room": 7, @@ -2781,10 +3357,16 @@ "unkn2": 8, "x": 56, "y": 152, + "name": "Sand Canyon 1 - 4 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 1 - Enemy 8 (Loud)", + "Sand Canyon 1 - Enemy 9 (Dogon)", + "Sand Canyon 1 - Enemy 10 (Bouncy)", + "Sand Canyon 1 - Enemy 11 (Pteran)" + ], "music": 13 }, { @@ -2794,6 +3376,9 @@ "room": 5, "pointer": 3203325, "animal_pointers": [], + "enemies": [ + "Polof" + ], "default_exits": [ { "room": 6, @@ -2801,6 +3386,7 @@ "unkn2": 9, "x": 104, "y": 152, + "name": "Sand Canyon 1 - 5 Exit 0", "access_rule": [] }, { @@ -2809,10 +3395,13 @@ "unkn2": 9, "x": 56, "y": 344, + "name": "Sand Canyon 1 - 5 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 1 - Enemy 12 (Polof)" + ], "music": 13 }, { @@ -2822,6 +3411,7 @@ "room": 6, "pointer": 3138524, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 5, @@ -2829,6 +3419,7 @@ "unkn2": 9, "x": 536, "y": 152, + "name": "Sand Canyon 1 - 6 Exit 0", "access_rule": [] } ], @@ -2844,6 +3435,7 @@ "room": 7, "pointer": 2988822, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -2851,6 +3443,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Sand Canyon 1 - 7 Exit 0", "access_rule": [] } ], @@ -2866,6 +3459,7 @@ "room": 8, "pointer": 2885292, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Sand Canyon 1 - Complete" @@ -2879,6 +3473,11 @@ "room": 0, "pointer": 3668370, "animal_pointers": [], + "enemies": [ + "KeKe", + "Doka", + "Boten" + ], "default_exits": [ { "room": 1, @@ -2886,6 +3485,7 @@ "unkn2": 8, "x": 184, "y": 104, + "name": "Sand Canyon 2 - 0 Exit 0", "access_rule": [] }, { @@ -2894,10 +3494,15 @@ "unkn2": 11, "x": 56, "y": 152, + "name": "Sand Canyon 2 - 0 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 2 - Enemy 1 (KeKe)", + "Sand Canyon 2 - Enemy 2 (Doka)", + "Sand Canyon 2 - Enemy 3 (Boten)" + ], "music": 21 }, { @@ -2910,6 +3515,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 0, @@ -2917,6 +3523,7 @@ "unkn2": 6, "x": 2872, "y": 136, + "name": "Sand Canyon 2 - 1 Exit 0", "access_rule": [] } ], @@ -2933,6 +3540,9 @@ "room": 2, "pointer": 3531156, "animal_pointers": [], + "enemies": [ + "Propeller" + ], "default_exits": [ { "room": 9, @@ -2940,10 +3550,13 @@ "unkn2": 60, "x": 88, "y": 184, + "name": "Sand Canyon 2 - 2 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 2 - Enemy 4 (Propeller)" + ], "music": 21 }, { @@ -2953,6 +3566,12 @@ "room": 3, "pointer": 3263731, "animal_pointers": [], + "enemies": [ + "Waddle Dee", + "Sparky", + "Sasuke", + "Como" + ], "default_exits": [ { "room": 4, @@ -2960,6 +3579,7 @@ "unkn2": 5, "x": 88, "y": 184, + "name": "Sand Canyon 2 - 3 Exit 0", "access_rule": [] }, { @@ -2968,6 +3588,7 @@ "unkn2": 5, "x": 184, "y": 184, + "name": "Sand Canyon 2 - 3 Exit 1", "access_rule": [] }, { @@ -2976,6 +3597,7 @@ "unkn2": 5, "x": 248, "y": 184, + "name": "Sand Canyon 2 - 3 Exit 2", "access_rule": [] }, { @@ -2984,10 +3606,16 @@ "unkn2": 9, "x": 72, "y": 312, + "name": "Sand Canyon 2 - 3 Exit 3", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 2 - Enemy 5 (Waddle Dee)", + "Sand Canyon 2 - Enemy 6 (Sparky)", + "Sand Canyon 2 - Enemy 7 (Sasuke)", + "Sand Canyon 2 - Enemy 8 (Como)" + ], "music": 21 }, { @@ -2997,6 +3625,7 @@ "room": 4, "pointer": 3076300, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 3, @@ -3004,6 +3633,7 @@ "unkn2": 11, "x": 1016, "y": 88, + "name": "Sand Canyon 2 - 4 Exit 0", "access_rule": [] }, { @@ -3012,6 +3642,7 @@ "unkn2": 11, "x": 1112, "y": 88, + "name": "Sand Canyon 2 - 4 Exit 1", "access_rule": [] }, { @@ -3020,6 +3651,7 @@ "unkn2": 11, "x": 1176, "y": 88, + "name": "Sand Canyon 2 - 4 Exit 2", "access_rule": [] } ], @@ -3035,6 +3667,14 @@ "room": 5, "pointer": 3302133, "animal_pointers": [], + "enemies": [ + "Bukiset (Ice)", + "Bukiset (Needle)", + "Bukiset (Clean)", + "Bukiset (Parasol)", + "Bukiset (Spark)", + "Bukiset (Cutter)" + ], "default_exits": [ { "room": 6, @@ -3042,6 +3682,7 @@ "unkn2": 15, "x": 120, "y": 216, + "name": "Sand Canyon 2 - 5 Exit 0", "access_rule": [] }, { @@ -3050,6 +3691,7 @@ "unkn2": 18, "x": 152, "y": 136, + "name": "Sand Canyon 2 - 5 Exit 1", "access_rule": [] }, { @@ -3058,6 +3700,7 @@ "unkn2": 19, "x": 72, "y": 952, + "name": "Sand Canyon 2 - 5 Exit 2", "access_rule": [] }, { @@ -3066,10 +3709,18 @@ "unkn2": 23, "x": 88, "y": 216, + "name": "Sand Canyon 2 - 5 Exit 3", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", + "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", + "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", + "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", + "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", + "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))" + ], "music": 21 }, { @@ -3079,6 +3730,9 @@ "room": 6, "pointer": 3800612, "animal_pointers": [], + "enemies": [ + "Nidoo" + ], "default_exits": [ { "room": 5, @@ -3086,10 +3740,13 @@ "unkn2": 13, "x": 1144, "y": 248, + "name": "Sand Canyon 2 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 2 - Enemy 15 (Nidoo)" + ], "music": 21 }, { @@ -3099,6 +3756,7 @@ "room": 7, "pointer": 3073888, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 5, @@ -3106,6 +3764,7 @@ "unkn2": 8, "x": 1016, "y": 296, + "name": "Sand Canyon 2 - 7 Exit 0", "access_rule": [] }, { @@ -3114,6 +3773,7 @@ "unkn2": 13, "x": 904, "y": 376, + "name": "Sand Canyon 2 - 7 Exit 1", "access_rule": [] } ], @@ -3127,6 +3787,9 @@ "room": 8, "pointer": 3061270, "animal_pointers": [], + "enemies": [ + "Mariel" + ], "default_exits": [ { "room": 5, @@ -3134,10 +3797,13 @@ "unkn2": 13, "x": 1256, "y": 376, + "name": "Sand Canyon 2 - 8 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 2 - Enemy 16 (Mariel)" + ], "music": 21 }, { @@ -3147,6 +3813,12 @@ "room": 9, "pointer": 3453286, "animal_pointers": [], + "enemies": [ + "Yaban", + "Wapod", + "Squishy", + "Pteran" + ], "default_exits": [ { "room": 10, @@ -3154,11 +3826,16 @@ "unkn2": 10, "x": 56, "y": 152, + "name": "Sand Canyon 2 - 9 Exit 0", "access_rule": [] } ], "locations": [ - "Sand Canyon 2 - Maxim Tomato (Underwater)" + "Sand Canyon 2 - Maxim Tomato (Underwater)", + "Sand Canyon 2 - Enemy 17 (Yaban)", + "Sand Canyon 2 - Enemy 18 (Wapod)", + "Sand Canyon 2 - Enemy 19 (Squishy)", + "Sand Canyon 2 - Enemy 20 (Pteran)" ], "music": 21 }, @@ -3169,6 +3846,7 @@ "room": 10, "pointer": 2994821, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 11, @@ -3176,6 +3854,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Sand Canyon 2 - 10 Exit 0", "access_rule": [] } ], @@ -3191,6 +3870,7 @@ "room": 11, "pointer": 2891799, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Sand Canyon 2 - Complete" @@ -3204,6 +3884,12 @@ "room": 0, "pointer": 3544676, "animal_pointers": [], + "enemies": [ + "Sir Kibble", + "Broom Hatter", + "Rocky", + "Gabon" + ], "default_exits": [ { "room": 1, @@ -3211,6 +3897,7 @@ "unkn2": 57, "x": 104, "y": 152, + "name": "Sand Canyon 3 - 0 Exit 0", "access_rule": [] }, { @@ -3219,6 +3906,7 @@ "unkn2": 57, "x": 200, "y": 152, + "name": "Sand Canyon 3 - 0 Exit 1", "access_rule": [] }, { @@ -3227,6 +3915,7 @@ "unkn2": 57, "x": 296, "y": 152, + "name": "Sand Canyon 3 - 0 Exit 2", "access_rule": [] }, { @@ -3235,10 +3924,16 @@ "unkn2": 109, "x": 104, "y": 72, + "name": "Sand Canyon 3 - 0 Exit 3", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 3 - Enemy 1 (Sir Kibble)", + "Sand Canyon 3 - Enemy 2 (Broom Hatter)", + "Sand Canyon 3 - Enemy 3 (Rocky)", + "Sand Canyon 3 - Enemy 4 (Gabon)" + ], "music": 16 }, { @@ -3252,6 +3947,7 @@ 220, 228 ], + "enemies": [], "default_exits": [ { "room": 0, @@ -3259,6 +3955,7 @@ "unkn2": 9, "x": 88, "y": 920, + "name": "Sand Canyon 3 - 1 Exit 0", "access_rule": [] }, { @@ -3267,6 +3964,7 @@ "unkn2": 9, "x": 168, "y": 920, + "name": "Sand Canyon 3 - 1 Exit 1", "access_rule": [] }, { @@ -3275,6 +3973,7 @@ "unkn2": 9, "x": 248, "y": 920, + "name": "Sand Canyon 3 - 1 Exit 2", "access_rule": [] } ], @@ -3292,6 +3991,9 @@ "room": 2, "pointer": 3726270, "animal_pointers": [], + "enemies": [ + "Kany" + ], "default_exits": [ { "room": 3, @@ -3299,10 +4001,13 @@ "unkn2": 20, "x": 104, "y": 232, + "name": "Sand Canyon 3 - 2 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 3 - Enemy 5 (Kany)" + ], "music": 16 }, { @@ -3312,6 +4017,9 @@ "room": 3, "pointer": 3416806, "animal_pointers": [], + "enemies": [ + "Galbo" + ], "default_exits": [ { "room": 8, @@ -3319,10 +4027,13 @@ "unkn2": 14, "x": 40, "y": 152, + "name": "Sand Canyon 3 - 3 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 3 - Enemy 6 (Galbo)" + ], "music": 16 }, { @@ -3332,6 +4043,10 @@ "room": 4, "pointer": 3564419, "animal_pointers": [], + "enemies": [ + "Propeller", + "Sasuke" + ], "default_exits": [ { "room": 5, @@ -3339,10 +4054,14 @@ "unkn2": 11, "x": 56, "y": 152, + "name": "Sand Canyon 3 - 4 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 3 - Enemy 7 (Propeller)", + "Sand Canyon 3 - Enemy 8 (Sasuke)" + ], "music": 16 }, { @@ -3352,6 +4071,7 @@ "room": 5, "pointer": 2973891, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -3359,6 +4079,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Sand Canyon 3 - 5 Exit 0", "access_rule": [] } ], @@ -3374,6 +4095,12 @@ "room": 6, "pointer": 3247969, "animal_pointers": [], + "enemies": [ + "Wapod", + "Bobo", + "Babut", + "Magoo" + ], "default_exits": [ { "room": 4, @@ -3381,10 +4108,16 @@ "unkn2": 8, "x": 88, "y": 424, + "name": "Sand Canyon 3 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 3 - Enemy 9 (Wapod)", + "Sand Canyon 3 - Enemy 10 (Bobo)", + "Sand Canyon 3 - Enemy 11 (Babut)", + "Sand Canyon 3 - Enemy 12 (Magoo)" + ], "music": 16 }, { @@ -3394,6 +4127,7 @@ "room": 7, "pointer": 2887702, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Sand Canyon 3 - Complete" @@ -3407,6 +4141,7 @@ "room": 8, "pointer": 2968057, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -3414,6 +4149,7 @@ "unkn2": 9, "x": 104, "y": 120, + "name": "Sand Canyon 3 - 8 Exit 0", "access_rule": [] } ], @@ -3427,6 +4163,11 @@ "room": 0, "pointer": 3521954, "animal_pointers": [], + "enemies": [ + "Popon Ball", + "Mariel", + "Chilly" + ], "default_exits": [ { "room": 1, @@ -3434,6 +4175,7 @@ "unkn2": 8, "x": 216, "y": 88, + "name": "Sand Canyon 4 - 0 Exit 0", "access_rule": [] }, { @@ -3442,10 +4184,15 @@ "unkn2": 15, "x": 104, "y": 88, + "name": "Sand Canyon 4 - 0 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 4 - Enemy 1 (Popon Ball)", + "Sand Canyon 4 - Enemy 2 (Mariel)", + "Sand Canyon 4 - Enemy 3 (Chilly)" + ], "music": 18 }, { @@ -3459,6 +4206,7 @@ 200, 208 ], + "enemies": [], "default_exits": [ { "room": 0, @@ -3466,6 +4214,7 @@ "unkn2": 5, "x": 1544, "y": 136, + "name": "Sand Canyon 4 - 1 Exit 0", "access_rule": [] } ], @@ -3483,6 +4232,11 @@ "room": 2, "pointer": 3505360, "animal_pointers": [], + "enemies": [ + "Tick", + "Bronto Burt", + "Babut" + ], "default_exits": [ { "room": 3, @@ -3490,11 +4244,15 @@ "unkn2": 14, "x": 88, "y": 216, + "name": "Sand Canyon 4 - 2 Exit 0", "access_rule": [] } ], "locations": [ - "Sand Canyon 4 - Maxim Tomato (Pacto)" + "Sand Canyon 4 - Maxim Tomato (Pacto)", + "Sand Canyon 4 - Enemy 4 (Tick)", + "Sand Canyon 4 - Enemy 5 (Bronto Burt)", + "Sand Canyon 4 - Enemy 6 (Babut)" ], "music": 18 }, @@ -3505,6 +4263,12 @@ "room": 3, "pointer": 3412361, "animal_pointers": [], + "enemies": [ + "Bobin", + "Joe", + "Mony", + "Blipper" + ], "default_exits": [ { "room": 4, @@ -3512,6 +4276,7 @@ "unkn2": 6, "x": 776, "y": 120, + "name": "Sand Canyon 4 - 3 Exit 0", "access_rule": [] }, { @@ -3520,6 +4285,7 @@ "unkn2": 8, "x": 72, "y": 88, + "name": "Sand Canyon 4 - 3 Exit 1", "access_rule": [] }, { @@ -3528,6 +4294,7 @@ "unkn2": 14, "x": 104, "y": 216, + "name": "Sand Canyon 4 - 3 Exit 2", "access_rule": [] }, { @@ -3536,6 +4303,7 @@ "unkn2": 20, "x": 776, "y": 248, + "name": "Sand Canyon 4 - 3 Exit 3", "access_rule": [] }, { @@ -3544,10 +4312,16 @@ "unkn2": 21, "x": 408, "y": 232, + "name": "Sand Canyon 4 - 3 Exit 4", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 4 - Enemy 7 (Bobin)", + "Sand Canyon 4 - Enemy 8 (Joe)", + "Sand Canyon 4 - Enemy 9 (Mony)", + "Sand Canyon 4 - Enemy 10 (Blipper)" + ], "music": 18 }, { @@ -3557,6 +4331,7 @@ "room": 4, "pointer": 3307804, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -3564,6 +4339,7 @@ "unkn2": 6, "x": 88, "y": 104, + "name": "Sand Canyon 4 - 4 Exit 0", "access_rule": [] }, { @@ -3572,6 +4348,7 @@ "unkn2": 16, "x": 88, "y": 360, + "name": "Sand Canyon 4 - 4 Exit 1", "access_rule": [] } ], @@ -3585,6 +4362,7 @@ "room": 5, "pointer": 2955407, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -3592,6 +4370,7 @@ "unkn2": 13, "x": 88, "y": 232, + "name": "Sand Canyon 4 - 5 Exit 0", "access_rule": [] } ], @@ -3605,6 +4384,7 @@ "room": 6, "pointer": 3094851, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -3612,6 +4392,7 @@ "unkn2": 6, "x": 56, "y": 56, + "name": "Sand Canyon 4 - 6 Exit 0", "access_rule": [] }, { @@ -3620,6 +4401,7 @@ "unkn2": 14, "x": 56, "y": 104, + "name": "Sand Canyon 4 - 6 Exit 1", "access_rule": [] }, { @@ -3628,6 +4410,7 @@ "unkn2": 22, "x": 56, "y": 152, + "name": "Sand Canyon 4 - 6 Exit 2", "access_rule": [] } ], @@ -3641,6 +4424,11 @@ "room": 7, "pointer": 3483428, "animal_pointers": [], + "enemies": [ + "Togezo", + "Rocky", + "Bobo" + ], "default_exits": [ { "room": 8, @@ -3648,12 +4436,16 @@ "unkn2": 9, "x": 56, "y": 152, + "name": "Sand Canyon 4 - 7 Exit 0", "access_rule": [] } ], "locations": [ "Sand Canyon 4 - 1-Up (Clean)", - "Sand Canyon 4 - Maxim Tomato (Needle)" + "Sand Canyon 4 - Maxim Tomato (Needle)", + "Sand Canyon 4 - Enemy 11 (Togezo)", + "Sand Canyon 4 - Enemy 12 (Rocky)", + "Sand Canyon 4 - Enemy 13 (Bobo)" ], "music": 18 }, @@ -3664,6 +4456,7 @@ "room": 8, "pointer": 3002086, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 9, @@ -3671,6 +4464,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Sand Canyon 4 - 8 Exit 0", "access_rule": [] } ], @@ -3686,6 +4480,7 @@ "room": 9, "pointer": 2885774, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Sand Canyon 4 - Complete" @@ -3699,6 +4494,11 @@ "room": 0, "pointer": 3662486, "animal_pointers": [], + "enemies": [ + "Wapod", + "Dogon", + "Tick" + ], "default_exits": [ { "room": 3, @@ -3706,6 +4506,7 @@ "unkn2": 15, "x": 184, "y": 56, + "name": "Sand Canyon 5 - 0 Exit 0", "access_rule": [] }, { @@ -3714,11 +4515,15 @@ "unkn2": 16, "x": 72, "y": 120, + "name": "Sand Canyon 5 - 0 Exit 1", "access_rule": [] } ], "locations": [ - "Sand Canyon 5 - 1-Up (Falling Block)" + "Sand Canyon 5 - 1-Up (Falling Block)", + "Sand Canyon 5 - Enemy 1 (Wapod)", + "Sand Canyon 5 - Enemy 2 (Dogon)", + "Sand Canyon 5 - Enemy 3 (Tick)" ], "music": 13 }, @@ -3729,6 +4534,13 @@ "room": 1, "pointer": 3052622, "animal_pointers": [], + "enemies": [ + "Rocky", + "Bobo", + "Chilly", + "Sparky", + "Togezo" + ], "default_exits": [ { "room": 9, @@ -3736,10 +4548,17 @@ "unkn2": 9, "x": 216, "y": 1128, + "name": "Sand Canyon 5 - 1 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 5 - Enemy 4 (Rocky)", + "Sand Canyon 5 - Enemy 5 (Bobo)", + "Sand Canyon 5 - Enemy 6 (Chilly)", + "Sand Canyon 5 - Enemy 7 (Sparky)", + "Sand Canyon 5 - Enemy 8 (Togezo)" + ], "music": 13 }, { @@ -3751,6 +4570,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 0, @@ -3758,6 +4578,7 @@ "unkn2": 7, "x": 1320, "y": 264, + "name": "Sand Canyon 5 - 2 Exit 0", "access_rule": [] } ], @@ -3773,6 +4594,10 @@ "room": 3, "pointer": 3419011, "animal_pointers": [], + "enemies": [ + "Bronto Burt", + "Sasuke" + ], "default_exits": [ { "room": 4, @@ -3780,6 +4605,7 @@ "unkn2": 66, "x": 88, "y": 88, + "name": "Sand Canyon 5 - 3 Exit 0", "access_rule": [] } ], @@ -3787,7 +4613,9 @@ "Sand Canyon 5 - Maxim Tomato (Pit)", "Sand Canyon 5 - 1-Up (Ice 1)", "Sand Canyon 5 - 1-Up (Ice 2)", - "Sand Canyon 5 - 1-Up (Ice 3)" + "Sand Canyon 5 - 1-Up (Ice 3)", + "Sand Canyon 5 - Enemy 9 (Bronto Burt)", + "Sand Canyon 5 - Enemy 10 (Sasuke)" ], "music": 13 }, @@ -3798,6 +4626,11 @@ "room": 4, "pointer": 3644149, "animal_pointers": [], + "enemies": [ + "Oro", + "Galbo", + "Nidoo" + ], "default_exits": [ { "room": 5, @@ -3805,6 +4638,7 @@ "unkn2": 9, "x": 88, "y": 120, + "name": "Sand Canyon 5 - 4 Exit 0", "access_rule": [] }, { @@ -3813,10 +4647,15 @@ "unkn2": 14, "x": 200, "y": 1256, + "name": "Sand Canyon 5 - 4 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 5 - Enemy 11 (Oro)", + "Sand Canyon 5 - Enemy 12 (Galbo)", + "Sand Canyon 5 - Enemy 13 (Nidoo)" + ], "music": 13 }, { @@ -3828,6 +4667,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 4, @@ -3835,6 +4675,7 @@ "unkn2": 7, "x": 1240, "y": 152, + "name": "Sand Canyon 5 - 5 Exit 0", "access_rule": [] } ], @@ -3850,6 +4691,9 @@ "room": 6, "pointer": 3373481, "animal_pointers": [], + "enemies": [ + "Propeller" + ], "default_exits": [ { "room": 7, @@ -3857,10 +4701,13 @@ "unkn2": 5, "x": 56, "y": 152, + "name": "Sand Canyon 5 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 5 - Enemy 14 (Propeller)" + ], "music": 13 }, { @@ -3870,6 +4717,7 @@ "room": 7, "pointer": 2964028, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -3877,6 +4725,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Sand Canyon 5 - 7 Exit 0", "access_rule": [] } ], @@ -3892,6 +4741,7 @@ "room": 8, "pointer": 2890112, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Sand Canyon 5 - Complete" @@ -3905,6 +4755,11 @@ "room": 9, "pointer": 3647264, "animal_pointers": [], + "enemies": [ + "Sir Kibble", + "KeKe", + "Kabu" + ], "default_exits": [ { "room": 6, @@ -3912,6 +4767,7 @@ "unkn2": 6, "x": 72, "y": 760, + "name": "Sand Canyon 5 - 9 Exit 0", "access_rule": [ "Cutter" ] @@ -3922,10 +4778,15 @@ "unkn2": 70, "x": 120, "y": 152, + "name": "Sand Canyon 5 - 9 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 5 - Enemy 15 (Sir Kibble)", + "Sand Canyon 5 - Enemy 16 (KeKe)", + "Sand Canyon 5 - Enemy 17 (Kabu)" + ], "music": 13 }, { @@ -3935,6 +4796,12 @@ "room": 0, "pointer": 3314761, "animal_pointers": [], + "enemies": [ + "Sparky", + "Doka", + "Cappy", + "Pteran" + ], "default_exits": [ { "room": 2, @@ -3942,10 +4809,16 @@ "unkn2": 16, "x": 56, "y": 136, + "name": "Sand Canyon 6 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 6 - Enemy 1 (Sparky)", + "Sand Canyon 6 - Enemy 2 (Doka)", + "Sand Canyon 6 - Enemy 3 (Cappy)", + "Sand Canyon 6 - Enemy 4 (Pteran)" + ], "music": 14 }, { @@ -3959,6 +4832,7 @@ 200, 208 ], + "enemies": [], "default_exits": [ { "room": 22, @@ -3966,6 +4840,7 @@ "unkn2": 13, "x": 168, "y": 216, + "name": "Sand Canyon 6 - 1 Exit 0", "access_rule": [] } ], @@ -3983,6 +4858,7 @@ "room": 2, "pointer": 2978757, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 11, @@ -3990,6 +4866,7 @@ "unkn2": 6, "x": 104, "y": 104, + "name": "Sand Canyon 6 - 2 Exit 0", "access_rule": [] } ], @@ -4003,6 +4880,7 @@ "room": 3, "pointer": 3178082, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 16, @@ -4010,6 +4888,7 @@ "unkn2": 4, "x": 184, "y": 712, + "name": "Sand Canyon 6 - 3 Exit 0", "access_rule": [] }, { @@ -4018,6 +4897,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 3 Exit 1", "access_rule": [] }, { @@ -4026,6 +4906,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 3 Exit 2", "access_rule": [] }, { @@ -4034,6 +4915,7 @@ "unkn2": 16, "x": 600, "y": 104, + "name": "Sand Canyon 6 - 3 Exit 3", "access_rule": [] }, { @@ -4042,6 +4924,7 @@ "unkn2": 16, "x": 88, "y": 136, + "name": "Sand Canyon 6 - 3 Exit 4", "access_rule": [] }, { @@ -4050,6 +4933,7 @@ "unkn2": 24, "x": 552, "y": 152, + "name": "Sand Canyon 6 - 3 Exit 5", "access_rule": [] }, { @@ -4058,6 +4942,7 @@ "unkn2": 24, "x": 104, "y": 152, + "name": "Sand Canyon 6 - 3 Exit 6", "access_rule": [] }, { @@ -4066,6 +4951,7 @@ "unkn2": 28, "x": 168, "y": 88, + "name": "Sand Canyon 6 - 3 Exit 7", "access_rule": [] } ], @@ -4079,6 +4965,7 @@ "room": 4, "pointer": 3181563, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 16, @@ -4086,6 +4973,7 @@ "unkn2": 4, "x": 184, "y": 712, + "name": "Sand Canyon 6 - 4 Exit 0", "access_rule": [] }, { @@ -4094,6 +4982,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 4 Exit 1", "access_rule": [] }, { @@ -4102,6 +4991,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 4 Exit 2", "access_rule": [] }, { @@ -4110,6 +5000,7 @@ "unkn2": 16, "x": 600, "y": 104, + "name": "Sand Canyon 6 - 4 Exit 3", "access_rule": [] }, { @@ -4118,6 +5009,7 @@ "unkn2": 16, "x": 88, "y": 136, + "name": "Sand Canyon 6 - 4 Exit 4", "access_rule": [] }, { @@ -4126,6 +5018,7 @@ "unkn2": 24, "x": 552, "y": 152, + "name": "Sand Canyon 6 - 4 Exit 5", "access_rule": [] }, { @@ -4134,6 +5027,7 @@ "unkn2": 24, "x": 104, "y": 152, + "name": "Sand Canyon 6 - 4 Exit 6", "access_rule": [] }, { @@ -4142,6 +5036,7 @@ "unkn2": 28, "x": 168, "y": 88, + "name": "Sand Canyon 6 - 4 Exit 7", "access_rule": [] } ], @@ -4155,6 +5050,7 @@ "room": 5, "pointer": 3177209, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 16, @@ -4162,6 +5058,7 @@ "unkn2": 4, "x": 184, "y": 712, + "name": "Sand Canyon 6 - 5 Exit 0", "access_rule": [] }, { @@ -4170,6 +5067,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 5 Exit 1", "access_rule": [] }, { @@ -4178,6 +5076,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 5 Exit 2", "access_rule": [] }, { @@ -4186,6 +5085,7 @@ "unkn2": 16, "x": 600, "y": 104, + "name": "Sand Canyon 6 - 5 Exit 3", "access_rule": [] }, { @@ -4194,6 +5094,7 @@ "unkn2": 16, "x": 88, "y": 136, + "name": "Sand Canyon 6 - 5 Exit 4", "access_rule": [] }, { @@ -4202,6 +5103,7 @@ "unkn2": 24, "x": 552, "y": 152, + "name": "Sand Canyon 6 - 5 Exit 5", "access_rule": [] }, { @@ -4210,6 +5112,7 @@ "unkn2": 24, "x": 104, "y": 152, + "name": "Sand Canyon 6 - 5 Exit 6", "access_rule": [] }, { @@ -4218,6 +5121,7 @@ "unkn2": 28, "x": 168, "y": 88, + "name": "Sand Canyon 6 - 5 Exit 7", "access_rule": [] } ], @@ -4231,6 +5135,7 @@ "room": 6, "pointer": 3183291, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 16, @@ -4238,6 +5143,7 @@ "unkn2": 4, "x": 184, "y": 712, + "name": "Sand Canyon 6 - 6 Exit 0", "access_rule": [] }, { @@ -4246,6 +5152,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 6 Exit 1", "access_rule": [] }, { @@ -4254,6 +5161,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 6 Exit 2", "access_rule": [] }, { @@ -4262,6 +5170,7 @@ "unkn2": 16, "x": 600, "y": 104, + "name": "Sand Canyon 6 - 6 Exit 3", "access_rule": [] }, { @@ -4270,6 +5179,7 @@ "unkn2": 16, "x": 88, "y": 136, + "name": "Sand Canyon 6 - 6 Exit 4", "access_rule": [] }, { @@ -4278,6 +5188,7 @@ "unkn2": 24, "x": 552, "y": 152, + "name": "Sand Canyon 6 - 6 Exit 5", "access_rule": [] }, { @@ -4286,6 +5197,7 @@ "unkn2": 24, "x": 104, "y": 152, + "name": "Sand Canyon 6 - 6 Exit 6", "access_rule": [] }, { @@ -4294,6 +5206,7 @@ "unkn2": 28, "x": 168, "y": 88, + "name": "Sand Canyon 6 - 6 Exit 7", "access_rule": [] } ], @@ -4307,6 +5220,7 @@ "room": 7, "pointer": 3175453, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 16, @@ -4314,6 +5228,7 @@ "unkn2": 4, "x": 184, "y": 712, + "name": "Sand Canyon 6 - 7 Exit 0", "access_rule": [] }, { @@ -4322,6 +5237,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 7 Exit 1", "access_rule": [] }, { @@ -4330,6 +5246,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 7 Exit 2", "access_rule": [] }, { @@ -4338,6 +5255,7 @@ "unkn2": 16, "x": 600, "y": 104, + "name": "Sand Canyon 6 - 7 Exit 3", "access_rule": [] }, { @@ -4346,6 +5264,7 @@ "unkn2": 16, "x": 88, "y": 136, + "name": "Sand Canyon 6 - 7 Exit 4", "access_rule": [] }, { @@ -4354,6 +5273,7 @@ "unkn2": 24, "x": 552, "y": 152, + "name": "Sand Canyon 6 - 7 Exit 5", "access_rule": [] }, { @@ -4362,6 +5282,7 @@ "unkn2": 24, "x": 104, "y": 152, + "name": "Sand Canyon 6 - 7 Exit 6", "access_rule": [] }, { @@ -4370,6 +5291,7 @@ "unkn2": 28, "x": 168, "y": 88, + "name": "Sand Canyon 6 - 7 Exit 7", "access_rule": [] } ], @@ -4383,6 +5305,7 @@ "room": 8, "pointer": 3179826, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 16, @@ -4390,6 +5313,7 @@ "unkn2": 4, "x": 184, "y": 712, + "name": "Sand Canyon 6 - 8 Exit 0", "access_rule": [] }, { @@ -4398,6 +5322,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 8 Exit 1", "access_rule": [] }, { @@ -4406,6 +5331,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 8 Exit 2", "access_rule": [] }, { @@ -4414,6 +5340,7 @@ "unkn2": 16, "x": 600, "y": 104, + "name": "Sand Canyon 6 - 8 Exit 3", "access_rule": [] }, { @@ -4422,6 +5349,7 @@ "unkn2": 16, "x": 88, "y": 136, + "name": "Sand Canyon 6 - 8 Exit 4", "access_rule": [] }, { @@ -4430,6 +5358,7 @@ "unkn2": 24, "x": 552, "y": 152, + "name": "Sand Canyon 6 - 8 Exit 5", "access_rule": [] }, { @@ -4438,6 +5367,7 @@ "unkn2": 24, "x": 104, "y": 152, + "name": "Sand Canyon 6 - 8 Exit 6", "access_rule": [] }, { @@ -4446,6 +5376,7 @@ "unkn2": 28, "x": 168, "y": 88, + "name": "Sand Canyon 6 - 8 Exit 7", "access_rule": [] } ], @@ -4459,6 +5390,7 @@ "room": 9, "pointer": 3176334, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 16, @@ -4466,6 +5398,7 @@ "unkn2": 4, "x": 184, "y": 712, + "name": "Sand Canyon 6 - 9 Exit 0", "access_rule": [] }, { @@ -4474,6 +5407,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 9 Exit 1", "access_rule": [] }, { @@ -4482,6 +5416,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 9 Exit 2", "access_rule": [] }, { @@ -4490,6 +5425,7 @@ "unkn2": 16, "x": 600, "y": 104, + "name": "Sand Canyon 6 - 9 Exit 3", "access_rule": [] }, { @@ -4498,6 +5434,7 @@ "unkn2": 16, "x": 88, "y": 136, + "name": "Sand Canyon 6 - 9 Exit 4", "access_rule": [] }, { @@ -4506,6 +5443,7 @@ "unkn2": 24, "x": 552, "y": 152, + "name": "Sand Canyon 6 - 9 Exit 5", "access_rule": [] }, { @@ -4514,6 +5452,7 @@ "unkn2": 24, "x": 104, "y": 152, + "name": "Sand Canyon 6 - 9 Exit 6", "access_rule": [] }, { @@ -4522,6 +5461,7 @@ "unkn2": 28, "x": 168, "y": 88, + "name": "Sand Canyon 6 - 9 Exit 7", "access_rule": [] } ], @@ -4535,6 +5475,7 @@ "room": 10, "pointer": 3178954, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 16, @@ -4542,6 +5483,7 @@ "unkn2": 4, "x": 184, "y": 712, + "name": "Sand Canyon 6 - 10 Exit 0", "access_rule": [] }, { @@ -4550,6 +5492,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 10 Exit 1", "access_rule": [] }, { @@ -4558,6 +5501,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 10 Exit 2", "access_rule": [] }, { @@ -4566,6 +5510,7 @@ "unkn2": 16, "x": 600, "y": 104, + "name": "Sand Canyon 6 - 10 Exit 3", "access_rule": [] }, { @@ -4574,6 +5519,7 @@ "unkn2": 16, "x": 88, "y": 136, + "name": "Sand Canyon 6 - 10 Exit 4", "access_rule": [] }, { @@ -4582,6 +5528,7 @@ "unkn2": 24, "x": 552, "y": 152, + "name": "Sand Canyon 6 - 10 Exit 5", "access_rule": [] }, { @@ -4590,6 +5537,7 @@ "unkn2": 24, "x": 104, "y": 152, + "name": "Sand Canyon 6 - 10 Exit 6", "access_rule": [] }, { @@ -4598,6 +5546,7 @@ "unkn2": 28, "x": 168, "y": 88, + "name": "Sand Canyon 6 - 10 Exit 7", "access_rule": [] } ], @@ -4611,6 +5560,7 @@ "room": 11, "pointer": 2989149, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 3, @@ -4618,6 +5568,7 @@ "unkn2": 6, "x": 88, "y": 264, + "name": "Sand Canyon 6 - 11 Exit 0", "access_rule": [] } ], @@ -4631,6 +5582,7 @@ "room": 12, "pointer": 3015947, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -4638,6 +5590,7 @@ "unkn2": 8, "x": 440, "y": 264, + "name": "Sand Canyon 6 - 12 Exit 0", "access_rule": [] }, { @@ -4646,6 +5599,7 @@ "unkn2": 8, "x": 72, "y": 104, + "name": "Sand Canyon 6 - 12 Exit 1", "access_rule": [] } ], @@ -4659,6 +5613,7 @@ "room": 13, "pointer": 2976539, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 23, @@ -4666,6 +5621,7 @@ "unkn2": 8, "x": 56, "y": 152, + "name": "Sand Canyon 6 - 13 Exit 0", "access_rule": [] } ], @@ -4679,6 +5635,7 @@ "room": 14, "pointer": 3030336, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 15, @@ -4686,6 +5643,7 @@ "unkn2": 9, "x": 200, "y": 152, + "name": "Sand Canyon 6 - 14 Exit 0", "access_rule": [] }, { @@ -4694,6 +5652,7 @@ "unkn2": 9, "x": 152, "y": 392, + "name": "Sand Canyon 6 - 14 Exit 1", "access_rule": [] } ], @@ -4707,6 +5666,7 @@ "room": 15, "pointer": 2972361, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 14, @@ -4714,6 +5674,7 @@ "unkn2": 9, "x": 104, "y": 152, + "name": "Sand Canyon 6 - 15 Exit 0", "access_rule": [] } ], @@ -4727,6 +5688,7 @@ "room": 16, "pointer": 2953186, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 18, @@ -4734,6 +5696,7 @@ "unkn2": 19, "x": 248, "y": 152, + "name": "Sand Canyon 6 - 16 Exit 0", "access_rule": [] }, { @@ -4742,6 +5705,7 @@ "unkn2": 44, "x": 264, "y": 88, + "name": "Sand Canyon 6 - 16 Exit 1", "access_rule": [] } ], @@ -4755,6 +5719,7 @@ "room": 17, "pointer": 2953633, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 18, @@ -4762,6 +5727,7 @@ "unkn2": 19, "x": 248, "y": 152, + "name": "Sand Canyon 6 - 17 Exit 0", "access_rule": [] }, { @@ -4770,6 +5736,7 @@ "unkn2": 44, "x": 264, "y": 88, + "name": "Sand Canyon 6 - 17 Exit 1", "access_rule": [] } ], @@ -4783,6 +5750,7 @@ "room": 18, "pointer": 2991707, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 17, @@ -4790,6 +5758,7 @@ "unkn2": 9, "x": 184, "y": 312, + "name": "Sand Canyon 6 - 18 Exit 0", "access_rule": [] } ], @@ -4803,6 +5772,7 @@ "room": 19, "pointer": 2974651, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 10, @@ -4810,6 +5780,7 @@ "unkn2": 9, "x": 376, "y": 392, + "name": "Sand Canyon 6 - 19 Exit 0", "access_rule": [] }, { @@ -4818,6 +5789,7 @@ "unkn2": 9, "x": 88, "y": 152, + "name": "Sand Canyon 6 - 19 Exit 1", "access_rule": [] } ], @@ -4831,6 +5803,7 @@ "room": 20, "pointer": 2969638, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 19, @@ -4838,6 +5811,7 @@ "unkn2": 9, "x": 552, "y": 152, + "name": "Sand Canyon 6 - 20 Exit 0", "access_rule": [] } ], @@ -4855,6 +5829,7 @@ 200, 208 ], + "enemies": [], "default_exits": [ { "room": 22, @@ -4862,6 +5837,7 @@ "unkn2": 13, "x": 296, "y": 216, + "name": "Sand Canyon 6 - 21 Exit 0", "access_rule": [] } ], @@ -4879,6 +5855,7 @@ "room": 22, "pointer": 2950938, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 38, @@ -4886,6 +5863,7 @@ "unkn2": 8, "x": 168, "y": 376, + "name": "Sand Canyon 6 - 22 Exit 0", "access_rule": [] }, { @@ -4894,6 +5872,7 @@ "unkn2": 13, "x": 376, "y": 216, + "name": "Sand Canyon 6 - 22 Exit 1", "access_rule": [] }, { @@ -4902,6 +5881,7 @@ "unkn2": 13, "x": 168, "y": 216, + "name": "Sand Canyon 6 - 22 Exit 2", "access_rule": [] } ], @@ -4915,6 +5895,7 @@ "room": 23, "pointer": 3311993, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 43, @@ -4922,6 +5903,7 @@ "unkn2": 7, "x": 72, "y": 152, + "name": "Sand Canyon 6 - 23 Exit 0", "access_rule": [] } ], @@ -4935,6 +5917,7 @@ "room": 24, "pointer": 3079078, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 39, @@ -4942,6 +5925,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 24 Exit 0", "access_rule": [] }, { @@ -4950,6 +5934,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 24 Exit 1", "access_rule": [] }, { @@ -4958,6 +5943,7 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 24 Exit 2", "access_rule": [] } ], @@ -4971,6 +5957,7 @@ "room": 25, "pointer": 3065898, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 26, @@ -4978,6 +5965,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 25 Exit 0", "access_rule": [] }, { @@ -4986,6 +5974,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 25 Exit 1", "access_rule": [] }, { @@ -4994,6 +5983,7 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 25 Exit 2", "access_rule": [] } ], @@ -5007,6 +5997,7 @@ "room": 26, "pointer": 3063347, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 41, @@ -5014,6 +6005,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 26 Exit 0", "access_rule": [] }, { @@ -5022,6 +6014,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 26 Exit 1", "access_rule": [] }, { @@ -5030,6 +6023,7 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 26 Exit 2", "access_rule": [] } ], @@ -5043,6 +6037,7 @@ "room": 27, "pointer": 3066916, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 28, @@ -5050,6 +6045,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 27 Exit 0", "access_rule": [] }, { @@ -5058,6 +6054,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 27 Exit 1", "access_rule": [] }, { @@ -5066,6 +6063,7 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 27 Exit 2", "access_rule": [] } ], @@ -5079,6 +6077,7 @@ "room": 28, "pointer": 3067425, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 29, @@ -5086,6 +6085,7 @@ "unkn2": 8, "x": 120, "y": 344, + "name": "Sand Canyon 6 - 28 Exit 0", "access_rule": [] }, { @@ -5094,6 +6094,7 @@ "unkn2": 8, "x": 184, "y": 344, + "name": "Sand Canyon 6 - 28 Exit 1", "access_rule": [] }, { @@ -5102,6 +6103,7 @@ "unkn2": 8, "x": 248, "y": 344, + "name": "Sand Canyon 6 - 28 Exit 2", "access_rule": [] } ], @@ -5115,6 +6117,7 @@ "room": 29, "pointer": 2950032, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 30, @@ -5122,6 +6125,7 @@ "unkn2": 8, "x": 168, "y": 136, + "name": "Sand Canyon 6 - 29 Exit 0", "access_rule": [] } ], @@ -5135,6 +6139,7 @@ "room": 30, "pointer": 2986500, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 4, @@ -5142,6 +6147,7 @@ "unkn2": 44, "x": 136, "y": 152, + "name": "Sand Canyon 6 - 30 Exit 0", "access_rule": [] } ], @@ -5155,6 +6161,7 @@ "room": 31, "pointer": 3070930, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 32, @@ -5162,6 +6169,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 31 Exit 0", "access_rule": [] }, { @@ -5170,6 +6178,7 @@ "unkn2": 8, "x": 168, "y": 648, + "name": "Sand Canyon 6 - 31 Exit 1", "access_rule": [] }, { @@ -5178,6 +6187,7 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 31 Exit 2", "access_rule": [] } ], @@ -5191,6 +6201,10 @@ "room": 32, "pointer": 3054817, "animal_pointers": [], + "enemies": [ + "Bukiset (Parasol)", + "Bukiset (Cutter)" + ], "default_exits": [ { "room": 33, @@ -5198,6 +6212,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 32 Exit 0", "access_rule": [] }, { @@ -5206,6 +6221,7 @@ "unkn2": 8, "x": 168, "y": 536, + "name": "Sand Canyon 6 - 32 Exit 1", "access_rule": [] }, { @@ -5214,10 +6230,14 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 32 Exit 2", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", + "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))" + ], "music": 14 }, { @@ -5227,6 +6247,10 @@ "room": 33, "pointer": 3053173, "animal_pointers": [], + "enemies": [ + "Bukiset (Clean)", + "Bukiset (Spark)" + ], "default_exits": [ { "room": 34, @@ -5234,6 +6258,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 33 Exit 0", "access_rule": [] }, { @@ -5242,6 +6267,7 @@ "unkn2": 8, "x": 168, "y": 440, + "name": "Sand Canyon 6 - 33 Exit 1", "access_rule": [] }, { @@ -5250,10 +6276,14 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 33 Exit 2", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", + "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))" + ], "music": 14 }, { @@ -5263,6 +6293,10 @@ "room": 34, "pointer": 3053721, "animal_pointers": [], + "enemies": [ + "Bukiset (Ice)", + "Bukiset (Needle)" + ], "default_exits": [ { "room": 35, @@ -5270,6 +6304,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 34 Exit 0", "access_rule": [] }, { @@ -5278,6 +6313,7 @@ "unkn2": 8, "x": 168, "y": 344, + "name": "Sand Canyon 6 - 34 Exit 1", "access_rule": [] }, { @@ -5286,10 +6322,14 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 34 Exit 2", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", + "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))" + ], "music": 14 }, { @@ -5299,6 +6339,10 @@ "room": 35, "pointer": 3054269, "animal_pointers": [], + "enemies": [ + "Bukiset (Burning)", + "Bukiset (Stone)" + ], "default_exits": [ { "room": 37, @@ -5306,6 +6350,7 @@ "unkn2": 8, "x": 120, "y": 344, + "name": "Sand Canyon 6 - 35 Exit 0", "access_rule": [] }, { @@ -5314,6 +6359,7 @@ "unkn2": 8, "x": 168, "y": 248, + "name": "Sand Canyon 6 - 35 Exit 1", "access_rule": [] }, { @@ -5322,11 +6368,15 @@ "unkn2": 8, "x": 248, "y": 344, + "name": "Sand Canyon 6 - 35 Exit 2", "access_rule": [] } ], - "locations": [], - "music": 14 + "locations": [ + "Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", + "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))" + ], + "music": 14 }, { "name": "Sand Canyon 6 - 36", @@ -5335,6 +6385,7 @@ "room": 36, "pointer": 2986164, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -5342,6 +6393,7 @@ "unkn2": 44, "x": 392, "y": 152, + "name": "Sand Canyon 6 - 36 Exit 0", "access_rule": [] } ], @@ -5355,6 +6407,7 @@ "room": 37, "pointer": 3074377, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 36, @@ -5362,6 +6415,7 @@ "unkn2": 8, "x": 168, "y": 152, + "name": "Sand Canyon 6 - 37 Exit 0", "access_rule": [] } ], @@ -5375,6 +6429,7 @@ "room": 38, "pointer": 2971589, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 9, @@ -5382,6 +6437,7 @@ "unkn2": 5, "x": 264, "y": 440, + "name": "Sand Canyon 6 - 38 Exit 0", "access_rule": [] }, { @@ -5390,6 +6446,7 @@ "unkn2": 23, "x": 248, "y": 136, + "name": "Sand Canyon 6 - 38 Exit 1", "access_rule": [] } ], @@ -5403,6 +6460,7 @@ "room": 39, "pointer": 3063858, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 40, @@ -5410,6 +6468,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 39 Exit 0", "access_rule": [] }, { @@ -5418,6 +6477,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 39 Exit 1", "access_rule": [] }, { @@ -5426,6 +6486,7 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 39 Exit 2", "access_rule": [] } ], @@ -5439,6 +6500,7 @@ "room": 40, "pointer": 3064368, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 41, @@ -5446,6 +6508,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 40 Exit 0", "access_rule": [] }, { @@ -5454,6 +6517,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 40 Exit 1", "access_rule": [] }, { @@ -5462,6 +6526,7 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 40 Exit 2", "access_rule": [] } ], @@ -5475,6 +6540,7 @@ "room": 41, "pointer": 3064878, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 42, @@ -5482,6 +6548,7 @@ "unkn2": 8, "x": 120, "y": 328, + "name": "Sand Canyon 6 - 41 Exit 0", "access_rule": [] }, { @@ -5490,6 +6557,7 @@ "unkn2": 8, "x": 184, "y": 328, + "name": "Sand Canyon 6 - 41 Exit 1", "access_rule": [] }, { @@ -5498,6 +6566,7 @@ "unkn2": 8, "x": 248, "y": 328, + "name": "Sand Canyon 6 - 41 Exit 2", "access_rule": [] } ], @@ -5511,6 +6580,9 @@ "room": 42, "pointer": 3068939, "animal_pointers": [], + "enemies": [ + "Nidoo" + ], "default_exits": [ { "room": 29, @@ -5518,6 +6590,7 @@ "unkn2": 8, "x": 120, "y": 344, + "name": "Sand Canyon 6 - 42 Exit 0", "access_rule": [] }, { @@ -5526,10 +6599,13 @@ "unkn2": 8, "x": 248, "y": 344, + "name": "Sand Canyon 6 - 42 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 6 - Enemy 13 (Nidoo)" + ], "music": 14 }, { @@ -5539,6 +6615,7 @@ "room": 43, "pointer": 2988495, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 44, @@ -5546,6 +6623,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Sand Canyon 6 - 43 Exit 0", "access_rule": [] } ], @@ -5561,6 +6639,7 @@ "room": 44, "pointer": 2886979, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Sand Canyon 6 - Complete" @@ -5574,6 +6653,7 @@ "room": 0, "pointer": 2991389, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Sand Canyon - Boss (Pon & Con) Purified", @@ -5588,6 +6668,11 @@ "room": 0, "pointer": 3172795, "animal_pointers": [], + "enemies": [ + "Waddle Dee", + "KeKe", + "Cappy" + ], "default_exits": [ { "room": 1, @@ -5595,10 +6680,15 @@ "unkn2": 5, "x": 56, "y": 152, + "name": "Cloudy Park 1 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 1 - Enemy 1 (Waddle Dee)", + "Cloudy Park 1 - Enemy 2 (KeKe)", + "Cloudy Park 1 - Enemy 3 (Cappy)" + ], "music": 17 }, { @@ -5610,6 +6700,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -5617,6 +6708,7 @@ "unkn2": 8, "x": 88, "y": 424, + "name": "Cloudy Park 1 - 1 Exit 0", "access_rule": [] } ], @@ -5632,6 +6724,10 @@ "room": 2, "pointer": 3285882, "animal_pointers": [], + "enemies": [ + "Yaban", + "Togezo" + ], "default_exits": [ { "room": 3, @@ -5639,10 +6735,14 @@ "unkn2": 8, "x": 40, "y": 104, + "name": "Cloudy Park 1 - 2 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 1 - Enemy 4 (Yaban)", + "Cloudy Park 1 - Enemy 5 (Togezo)" + ], "music": 17 }, { @@ -5654,6 +6754,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 10, @@ -5661,6 +6762,7 @@ "unkn2": 6, "x": 56, "y": 264, + "name": "Cloudy Park 1 - 3 Exit 0", "access_rule": [] } ], @@ -5676,6 +6778,9 @@ "room": 4, "pointer": 3396729, "animal_pointers": [], + "enemies": [ + "Galbo" + ], "default_exits": [ { "room": 7, @@ -5683,10 +6788,13 @@ "unkn2": 16, "x": 56, "y": 152, + "name": "Cloudy Park 1 - 4 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 1 - Enemy 6 (Galbo)" + ], "music": 17 }, { @@ -5699,6 +6807,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 6, @@ -5706,6 +6815,7 @@ "unkn2": 5, "x": 2344, "y": 232, + "name": "Cloudy Park 1 - 5 Exit 0", "access_rule": [] } ], @@ -5722,6 +6832,10 @@ "room": 6, "pointer": 3535736, "animal_pointers": [], + "enemies": [ + "Sparky", + "Como" + ], "default_exits": [ { "room": 8, @@ -5729,10 +6843,14 @@ "unkn2": 8, "x": 72, "y": 104, + "name": "Cloudy Park 1 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 1 - Enemy 7 (Sparky)", + "Cloudy Park 1 - Enemy 8 (Como)" + ], "music": 17 }, { @@ -5744,6 +6862,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 11, @@ -5751,6 +6870,7 @@ "unkn2": 6, "x": 88, "y": 104, + "name": "Cloudy Park 1 - 7 Exit 0", "access_rule": [] } ], @@ -5766,6 +6886,9 @@ "room": 8, "pointer": 3465407, "animal_pointers": [], + "enemies": [ + "Bronto Burt" + ], "default_exits": [ { "room": 12, @@ -5773,10 +6896,13 @@ "unkn2": 6, "x": 56, "y": 152, + "name": "Cloudy Park 1 - 8 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 1 - Enemy 9 (Bronto Burt)" + ], "music": 17 }, { @@ -5788,6 +6914,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 4, @@ -5795,6 +6922,7 @@ "unkn2": 9, "x": 56, "y": 264, + "name": "Cloudy Park 1 - 9 Exit 0", "access_rule": [] } ], @@ -5810,6 +6938,10 @@ "room": 10, "pointer": 3281366, "animal_pointers": [], + "enemies": [ + "Gabon", + "Sir Kibble" + ], "default_exits": [ { "room": 9, @@ -5817,10 +6949,14 @@ "unkn2": 8, "x": 56, "y": 152, + "name": "Cloudy Park 1 - 10 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 1 - Enemy 10 (Gabon)", + "Cloudy Park 1 - Enemy 11 (Sir Kibble)" + ], "music": 17 }, { @@ -5830,6 +6966,10 @@ "room": 11, "pointer": 3519608, "animal_pointers": [], + "enemies": [ + "Mariel", + "Nruff" + ], "default_exits": [ { "room": 5, @@ -5837,12 +6977,15 @@ "unkn2": 6, "x": 104, "y": 216, + "name": "Cloudy Park 1 - 11 Exit 0", "access_rule": [] } ], "locations": [ "Cloudy Park 1 - 1-Up (Shotzo)", - "Cloudy Park 1 - Maxim Tomato (Mariel)" + "Cloudy Park 1 - Maxim Tomato (Mariel)", + "Cloudy Park 1 - Enemy 12 (Mariel)", + "Cloudy Park 1 - Enemy 13 (Nruff)" ], "music": 17 }, @@ -5853,6 +6996,7 @@ "room": 12, "pointer": 2958914, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 13, @@ -5860,6 +7004,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Cloudy Park 1 - 12 Exit 0", "access_rule": [] } ], @@ -5875,6 +7020,7 @@ "room": 13, "pointer": 2886015, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Cloudy Park 1 - Complete" @@ -5888,6 +7034,10 @@ "room": 0, "pointer": 3142443, "animal_pointers": [], + "enemies": [ + "Chilly", + "Sasuke" + ], "default_exits": [ { "room": 6, @@ -5895,10 +7045,14 @@ "unkn2": 7, "x": 56, "y": 88, + "name": "Cloudy Park 2 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 2 - Enemy 1 (Chilly)", + "Cloudy Park 2 - Enemy 2 (Sasuke)" + ], "music": 19 }, { @@ -5908,6 +7062,11 @@ "room": 1, "pointer": 3235925, "animal_pointers": [], + "enemies": [ + "Waddle Dee", + "Sparky", + "Broom Hatter" + ], "default_exits": [ { "room": 2, @@ -5915,10 +7074,15 @@ "unkn2": 5, "x": 88, "y": 88, + "name": "Cloudy Park 2 - 1 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 2 - Enemy 3 (Waddle Dee)", + "Cloudy Park 2 - Enemy 4 (Sparky)", + "Cloudy Park 2 - Enemy 5 (Broom Hatter)" + ], "music": 19 }, { @@ -5928,6 +7092,10 @@ "room": 2, "pointer": 3297758, "animal_pointers": [], + "enemies": [ + "Sir Kibble", + "Pteran" + ], "default_exits": [ { "room": 3, @@ -5935,10 +7103,14 @@ "unkn2": 8, "x": 72, "y": 136, + "name": "Cloudy Park 2 - 2 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 2 - Enemy 6 (Sir Kibble)", + "Cloudy Park 2 - Enemy 7 (Pteran)" + ], "music": 19 }, { @@ -5948,6 +7120,10 @@ "room": 3, "pointer": 3341087, "animal_pointers": [], + "enemies": [ + "Propeller", + "Dogon" + ], "default_exits": [ { "room": 4, @@ -5955,10 +7131,14 @@ "unkn2": 12, "x": 72, "y": 136, + "name": "Cloudy Park 2 - 3 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 2 - Enemy 8 (Propeller)", + "Cloudy Park 2 - Enemy 9 (Dogon)" + ], "music": 19 }, { @@ -5968,6 +7148,12 @@ "room": 4, "pointer": 3457404, "animal_pointers": [], + "enemies": [ + "Togezo", + "Oro", + "Bronto Burt", + "Rocky" + ], "default_exits": [ { "room": 5, @@ -5975,10 +7161,16 @@ "unkn2": 5, "x": 72, "y": 104, + "name": "Cloudy Park 2 - 4 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 2 - Enemy 10 (Togezo)", + "Cloudy Park 2 - Enemy 11 (Oro)", + "Cloudy Park 2 - Enemy 12 (Bronto Burt)", + "Cloudy Park 2 - Enemy 13 (Rocky)" + ], "music": 19 }, { @@ -5988,6 +7180,10 @@ "room": 5, "pointer": 3273878, "animal_pointers": [], + "enemies": [ + "Galbo", + "Kapar" + ], "default_exits": [ { "room": 7, @@ -5995,10 +7191,14 @@ "unkn2": 8, "x": 56, "y": 88, + "name": "Cloudy Park 2 - 5 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 2 - Enemy 14 (Galbo)", + "Cloudy Park 2 - Enemy 15 (Kapar)" + ], "music": 19 }, { @@ -6012,6 +7212,7 @@ 200, 208 ], + "enemies": [], "default_exits": [ { "room": 1, @@ -6019,6 +7220,7 @@ "unkn2": 5, "x": 72, "y": 152, + "name": "Cloudy Park 2 - 6 Exit 0", "access_rule": [] } ], @@ -6036,6 +7238,7 @@ "room": 7, "pointer": 2985482, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -6043,6 +7246,7 @@ "unkn2": 5, "x": 40, "y": 88, + "name": "Cloudy Park 2 - 7 Exit 0", "access_rule": [] } ], @@ -6056,6 +7260,7 @@ "room": 8, "pointer": 2990753, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 9, @@ -6063,6 +7268,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Cloudy Park 2 - 8 Exit 0", "access_rule": [] } ], @@ -6078,6 +7284,7 @@ "room": 9, "pointer": 2889630, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Cloudy Park 2 - Complete" @@ -6091,6 +7298,11 @@ "room": 0, "pointer": 3100859, "animal_pointers": [], + "enemies": [ + "Bronto Burt", + "Mopoo", + "Poppy Bros Jr." + ], "default_exits": [ { "room": 2, @@ -6098,10 +7310,15 @@ "unkn2": 8, "x": 56, "y": 136, + "name": "Cloudy Park 3 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 3 - Enemy 1 (Bronto Burt)", + "Cloudy Park 3 - Enemy 2 (Mopoo)", + "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)" + ], "music": 15 }, { @@ -6111,6 +7328,9 @@ "room": 1, "pointer": 3209719, "animal_pointers": [], + "enemies": [ + "Como" + ], "default_exits": [ { "room": 5, @@ -6118,10 +7338,13 @@ "unkn2": 14, "x": 56, "y": 152, + "name": "Cloudy Park 3 - 1 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 3 - Enemy 4 (Como)" + ], "music": 15 }, { @@ -6131,6 +7354,12 @@ "room": 2, "pointer": 3216185, "animal_pointers": [], + "enemies": [ + "Glunk", + "Bobin", + "Loud", + "Kapar" + ], "default_exits": [ { "room": 1, @@ -6138,6 +7367,7 @@ "unkn2": 6, "x": 216, "y": 1064, + "name": "Cloudy Park 3 - 2 Exit 0", "access_rule": [] }, { @@ -6146,10 +7376,16 @@ "unkn2": 14, "x": 104, "y": 152, + "name": "Cloudy Park 3 - 2 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 3 - Enemy 5 (Glunk)", + "Cloudy Park 3 - Enemy 6 (Bobin)", + "Cloudy Park 3 - Enemy 7 (Loud)", + "Cloudy Park 3 - Enemy 8 (Kapar)" + ], "music": 15 }, { @@ -6163,6 +7399,7 @@ 200, 208 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -6170,6 +7407,7 @@ "unkn2": 9, "x": 408, "y": 232, + "name": "Cloudy Park 3 - 3 Exit 0", "access_rule": [] } ], @@ -6187,6 +7425,11 @@ "room": 4, "pointer": 3229151, "animal_pointers": [], + "enemies": [ + "Galbo", + "Batamon", + "Bouncy" + ], "default_exits": [ { "room": 6, @@ -6194,6 +7437,7 @@ "unkn2": 6, "x": 56, "y": 152, + "name": "Cloudy Park 3 - 4 Exit 0", "access_rule": [] }, { @@ -6202,10 +7446,15 @@ "unkn2": 9, "x": 56, "y": 152, + "name": "Cloudy Park 3 - 4 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 3 - Enemy 9 (Galbo)", + "Cloudy Park 3 - Enemy 10 (Batamon)", + "Cloudy Park 3 - Enemy 11 (Bouncy)" + ], "music": 15 }, { @@ -6215,6 +7464,7 @@ "room": 5, "pointer": 2969244, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 4, @@ -6222,6 +7472,7 @@ "unkn2": 9, "x": 88, "y": 152, + "name": "Cloudy Park 3 - 5 Exit 0", "access_rule": [] } ], @@ -6235,6 +7486,7 @@ "room": 6, "pointer": 4128530, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -6242,6 +7494,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Cloudy Park 3 - 6 Exit 0", "access_rule": [] } ], @@ -6257,6 +7510,7 @@ "room": 7, "pointer": 2885051, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Cloudy Park 3 - Complete" @@ -6270,6 +7524,7 @@ "room": 0, "pointer": 3072905, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 1, @@ -6277,6 +7532,7 @@ "unkn2": 9, "x": 88, "y": 152, + "name": "Cloudy Park 4 - 0 Exit 0", "access_rule": [] } ], @@ -6293,6 +7549,7 @@ 208, 224 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -6300,6 +7557,7 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Cloudy Park 4 - 1 Exit 0", "access_rule": [] } ], @@ -6316,6 +7574,12 @@ "room": 2, "pointer": 3309209, "animal_pointers": [], + "enemies": [ + "Gabon", + "Como", + "Wapod", + "Cappy" + ], "default_exits": [ { "room": 3, @@ -6323,10 +7587,16 @@ "unkn2": 9, "x": 104, "y": 152, + "name": "Cloudy Park 4 - 2 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 4 - Enemy 1 (Gabon)", + "Cloudy Park 4 - Enemy 2 (Como)", + "Cloudy Park 4 - Enemy 3 (Wapod)", + "Cloudy Park 4 - Enemy 4 (Cappy)" + ], "music": 21 }, { @@ -6336,6 +7606,10 @@ "room": 3, "pointer": 3296291, "animal_pointers": [], + "enemies": [ + "Sparky", + "Togezo" + ], "default_exits": [ { "room": 5, @@ -6343,12 +7617,15 @@ "unkn2": 9, "x": 56, "y": 136, + "name": "Cloudy Park 4 - 3 Exit 0", "access_rule": [] } ], "locations": [ "Cloudy Park 4 - 1-Up (Windy)", - "Cloudy Park 4 - Maxim Tomato (Windy)" + "Cloudy Park 4 - Maxim Tomato (Windy)", + "Cloudy Park 4 - Enemy 5 (Sparky)", + "Cloudy Park 4 - Enemy 6 (Togezo)" ], "music": 21 }, @@ -6359,6 +7636,11 @@ "room": 4, "pointer": 3330996, "animal_pointers": [], + "enemies": [ + "Bronto Burt", + "KeKe", + "Bouncy" + ], "default_exits": [ { "room": 7, @@ -6366,10 +7648,15 @@ "unkn2": 15, "x": 72, "y": 152, + "name": "Cloudy Park 4 - 4 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 4 - Enemy 7 (Bronto Burt)", + "Cloudy Park 4 - Enemy 8 (KeKe)", + "Cloudy Park 4 - Enemy 9 (Bouncy)" + ], "music": 21 }, { @@ -6379,6 +7666,10 @@ "room": 5, "pointer": 3332300, "animal_pointers": [], + "enemies": [ + "Sir Kibble", + "Mariel" + ], "default_exits": [ { "room": 4, @@ -6386,10 +7677,14 @@ "unkn2": 51, "x": 2328, "y": 120, + "name": "Cloudy Park 4 - 5 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 4 - Enemy 10 (Sir Kibble)", + "Cloudy Park 4 - Enemy 11 (Mariel)" + ], "music": 21 }, { @@ -6399,6 +7694,10 @@ "room": 6, "pointer": 3253310, "animal_pointers": [], + "enemies": [ + "Kabu", + "Wappa" + ], "default_exits": [ { "room": 9, @@ -6406,10 +7705,14 @@ "unkn2": 6, "x": 72, "y": 152, + "name": "Cloudy Park 4 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 4 - Enemy 12 (Kabu)", + "Cloudy Park 4 - Enemy 13 (Wappa)" + ], "music": 21 }, { @@ -6419,6 +7722,7 @@ "room": 7, "pointer": 2967658, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -6426,6 +7730,7 @@ "unkn2": 9, "x": 152, "y": 120, + "name": "Cloudy Park 4 - 7 Exit 0", "access_rule": [] } ], @@ -6439,6 +7744,7 @@ "room": 8, "pointer": 2981644, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -6446,6 +7752,7 @@ "unkn2": 9, "x": 344, "y": 680, + "name": "Cloudy Park 4 - 8 Exit 0", "access_rule": [] } ], @@ -6459,6 +7766,7 @@ "room": 9, "pointer": 3008001, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 10, @@ -6466,6 +7774,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Cloudy Park 4 - 9 Exit 0", "access_rule": [] } ], @@ -6481,6 +7790,7 @@ "room": 10, "pointer": 2888184, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Cloudy Park 4 - Complete" @@ -6494,6 +7804,12 @@ "room": 0, "pointer": 3192630, "animal_pointers": [], + "enemies": [ + "Yaban", + "Sir Kibble", + "Cappy", + "Wappa" + ], "default_exits": [ { "room": 1, @@ -6501,10 +7817,16 @@ "unkn2": 6, "x": 168, "y": 616, + "name": "Cloudy Park 5 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 5 - Enemy 1 (Yaban)", + "Cloudy Park 5 - Enemy 2 (Sir Kibble)", + "Cloudy Park 5 - Enemy 3 (Cappy)", + "Cloudy Park 5 - Enemy 4 (Wappa)" + ], "music": 17 }, { @@ -6514,6 +7836,11 @@ "room": 1, "pointer": 3050956, "animal_pointers": [], + "enemies": [ + "Galbo", + "Bronto Burt", + "KeKe" + ], "default_exits": [ { "room": 2, @@ -6521,11 +7848,15 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Cloudy Park 5 - 1 Exit 0", "access_rule": [] } ], "locations": [ - "Cloudy Park 5 - Maxim Tomato (Pillars)" + "Cloudy Park 5 - Maxim Tomato (Pillars)", + "Cloudy Park 5 - Enemy 5 (Galbo)", + "Cloudy Park 5 - Enemy 6 (Bronto Burt)", + "Cloudy Park 5 - Enemy 7 (KeKe)" ], "music": 17 }, @@ -6539,6 +7870,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 3, @@ -6546,6 +7878,7 @@ "unkn2": 9, "x": 72, "y": 88, + "name": "Cloudy Park 5 - 2 Exit 0", "access_rule": [] } ], @@ -6562,6 +7895,10 @@ "room": 3, "pointer": 3131242, "animal_pointers": [], + "enemies": [ + "Propeller", + "Klinko" + ], "default_exits": [ { "room": 4, @@ -6569,10 +7906,14 @@ "unkn2": 5, "x": 72, "y": 120, + "name": "Cloudy Park 5 - 3 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 5 - Enemy 8 (Propeller)", + "Cloudy Park 5 - Enemy 9 (Klinko)" + ], "music": 17 }, { @@ -6582,6 +7923,9 @@ "room": 4, "pointer": 2990116, "animal_pointers": [], + "enemies": [ + "Wapod" + ], "default_exits": [ { "room": 5, @@ -6589,10 +7933,13 @@ "unkn2": 7, "x": 216, "y": 744, + "name": "Cloudy Park 5 - 4 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 5 - Enemy 10 (Wapod)" + ], "music": 17 }, { @@ -6602,6 +7949,7 @@ "room": 5, "pointer": 2975410, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -6609,6 +7957,7 @@ "unkn2": 4, "x": 104, "y": 296, + "name": "Cloudy Park 5 - 5 Exit 0", "access_rule": [] } ], @@ -6622,6 +7971,9 @@ "room": 6, "pointer": 3173683, "animal_pointers": [], + "enemies": [ + "Pteran" + ], "default_exits": [ { "room": 7, @@ -6629,10 +7981,13 @@ "unkn2": 6, "x": 56, "y": 136, + "name": "Cloudy Park 5 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 5 - Enemy 11 (Pteran)" + ], "music": 17 }, { @@ -6642,6 +7997,7 @@ "room": 7, "pointer": 2992340, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -6649,6 +8005,7 @@ "unkn2": 8, "x": 72, "y": 120, + "name": "Cloudy Park 5 - 7 Exit 0", "access_rule": [] } ], @@ -6664,6 +8021,7 @@ "room": 8, "pointer": 2891558, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Cloudy Park 5 - Complete" @@ -6677,6 +8035,7 @@ "room": 0, "pointer": 3269847, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -6684,6 +8043,7 @@ "unkn2": 9, "x": 88, "y": 152, + "name": "Cloudy Park 6 - 0 Exit 0", "access_rule": [] } ], @@ -6697,6 +8057,7 @@ "room": 1, "pointer": 3252248, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 10, @@ -6704,6 +8065,7 @@ "unkn2": 25, "x": 72, "y": 72, + "name": "Cloudy Park 6 - 1 Exit 0", "access_rule": [] } ], @@ -6717,6 +8079,9 @@ "room": 2, "pointer": 3028494, "animal_pointers": [], + "enemies": [ + "Madoo" + ], "default_exits": [ { "room": 0, @@ -6724,6 +8089,7 @@ "unkn2": 9, "x": 1032, "y": 152, + "name": "Cloudy Park 6 - 2 Exit 0", "access_rule": [] }, { @@ -6732,10 +8098,13 @@ "unkn2": 9, "x": 56, "y": 72, + "name": "Cloudy Park 6 - 2 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 6 - Enemy 1 (Madoo)" + ], "music": 11 }, { @@ -6745,6 +8114,7 @@ "room": 3, "pointer": 3131911, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 10, @@ -6752,6 +8122,7 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Cloudy Park 6 - 3 Exit 0", "access_rule": [] }, { @@ -6760,6 +8131,7 @@ "unkn2": 9, "x": 136, "y": 152, + "name": "Cloudy Park 6 - 3 Exit 1", "access_rule": [] }, { @@ -6768,6 +8140,7 @@ "unkn2": 9, "x": 200, "y": 152, + "name": "Cloudy Park 6 - 3 Exit 2", "access_rule": [] }, { @@ -6776,6 +8149,7 @@ "unkn2": 9, "x": 264, "y": 152, + "name": "Cloudy Park 6 - 3 Exit 3", "access_rule": [] }, { @@ -6784,6 +8158,7 @@ "unkn2": 9, "x": 328, "y": 152, + "name": "Cloudy Park 6 - 3 Exit 4", "access_rule": [] } ], @@ -6797,6 +8172,10 @@ "room": 4, "pointer": 3115416, "animal_pointers": [], + "enemies": [ + "Tick", + "Como" + ], "default_exits": [ { "room": 8, @@ -6804,6 +8183,7 @@ "unkn2": 4, "x": 72, "y": 488, + "name": "Cloudy Park 6 - 4 Exit 0", "access_rule": [] }, { @@ -6812,6 +8192,7 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Cloudy Park 6 - 4 Exit 1", "access_rule": [] }, { @@ -6820,6 +8201,7 @@ "unkn2": 9, "x": 200, "y": 152, + "name": "Cloudy Park 6 - 4 Exit 2", "access_rule": [] }, { @@ -6828,6 +8210,7 @@ "unkn2": 9, "x": 328, "y": 152, + "name": "Cloudy Park 6 - 4 Exit 3", "access_rule": [] }, { @@ -6836,6 +8219,7 @@ "unkn2": 9, "x": 136, "y": 152, + "name": "Cloudy Park 6 - 4 Exit 4", "access_rule": [] }, { @@ -6844,10 +8228,14 @@ "unkn2": 9, "x": 264, "y": 152, + "name": "Cloudy Park 6 - 4 Exit 5", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 6 - Enemy 2 (Tick)", + "Cloudy Park 6 - Enemy 3 (Como)" + ], "music": 11 }, { @@ -6857,6 +8245,11 @@ "room": 5, "pointer": 3245809, "animal_pointers": [], + "enemies": [ + "Waddle Dee Drawing", + "Bronto Burt Drawing", + "Bouncy Drawing" + ], "default_exits": [ { "room": 15, @@ -6864,10 +8257,15 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Cloudy Park 6 - 5 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", + "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", + "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)" + ], "music": 11 }, { @@ -6877,6 +8275,9 @@ "room": 6, "pointer": 3237044, "animal_pointers": [], + "enemies": [ + "Propeller" + ], "default_exits": [ { "room": 7, @@ -6884,10 +8285,13 @@ "unkn2": 9, "x": 72, "y": 136, + "name": "Cloudy Park 6 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 6 - Enemy 7 (Propeller)" + ], "music": 11 }, { @@ -6897,6 +8301,9 @@ "room": 7, "pointer": 3262705, "animal_pointers": [], + "enemies": [ + "Mopoo" + ], "default_exits": [ { "room": 13, @@ -6904,6 +8311,7 @@ "unkn2": 8, "x": 184, "y": 216, + "name": "Cloudy Park 6 - 7 Exit 0", "access_rule": [] }, { @@ -6912,6 +8320,7 @@ "unkn2": 8, "x": 184, "y": 216, + "name": "Cloudy Park 6 - 7 Exit 1", "access_rule": [] }, { @@ -6920,10 +8329,13 @@ "unkn2": 8, "x": 72, "y": 120, + "name": "Cloudy Park 6 - 7 Exit 2", "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 6 - Enemy 8 (Mopoo)" + ], "music": 11 }, { @@ -6933,6 +8345,13 @@ "room": 8, "pointer": 3027259, "animal_pointers": [], + "enemies": [ + "Bukiset (Burning)", + "Bukiset (Ice)", + "Bukiset (Needle)", + "Bukiset (Clean)", + "Bukiset (Cutter)" + ], "default_exits": [ { "room": 12, @@ -6940,11 +8359,17 @@ "unkn2": 4, "x": 88, "y": 152, + "name": "Cloudy Park 6 - 8 Exit 0", "access_rule": [] } ], "locations": [ - "Cloudy Park 6 - 1-Up (Cutter)" + "Cloudy Park 6 - 1-Up (Cutter)", + "Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", + "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", + "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", + "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", + "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))" ], "music": 11 }, @@ -6955,6 +8380,7 @@ "room": 9, "pointer": 3089504, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 4, @@ -6962,6 +8388,7 @@ "unkn2": 7, "x": 72, "y": 72, + "name": "Cloudy Park 6 - 9 Exit 0", "access_rule": [] } ], @@ -6979,6 +8406,7 @@ 250, 258 ], + "enemies": [], "default_exits": [ { "room": 6, @@ -6986,6 +8414,7 @@ "unkn2": 4, "x": 72, "y": 152, + "name": "Cloudy Park 6 - 10 Exit 0", "access_rule": [] }, { @@ -6994,6 +8423,7 @@ "unkn2": 9, "x": 88, "y": 152, + "name": "Cloudy Park 6 - 10 Exit 1", "access_rule": [] }, { @@ -7002,6 +8432,7 @@ "unkn2": 9, "x": 136, "y": 152, + "name": "Cloudy Park 6 - 10 Exit 2", "access_rule": [] }, { @@ -7010,6 +8441,7 @@ "unkn2": 9, "x": 200, "y": 152, + "name": "Cloudy Park 6 - 10 Exit 3", "access_rule": [] }, { @@ -7018,6 +8450,7 @@ "unkn2": 9, "x": 264, "y": 152, + "name": "Cloudy Park 6 - 10 Exit 4", "access_rule": [] }, { @@ -7026,6 +8459,7 @@ "unkn2": 9, "x": 328, "y": 152, + "name": "Cloudy Park 6 - 10 Exit 5", "access_rule": [] } ], @@ -7043,6 +8477,7 @@ "room": 11, "pointer": 3017866, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 4, @@ -7050,6 +8485,7 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Cloudy Park 6 - 11 Exit 0", "access_rule": [] }, { @@ -7058,6 +8494,7 @@ "unkn2": 9, "x": 264, "y": 152, + "name": "Cloudy Park 6 - 11 Exit 1", "access_rule": [] }, { @@ -7066,6 +8503,7 @@ "unkn2": 9, "x": 136, "y": 152, + "name": "Cloudy Park 6 - 11 Exit 2", "access_rule": [] }, { @@ -7074,6 +8512,7 @@ "unkn2": 9, "x": 328, "y": 152, + "name": "Cloudy Park 6 - 11 Exit 3", "access_rule": [] }, { @@ -7082,6 +8521,7 @@ "unkn2": 9, "x": 200, "y": 152, + "name": "Cloudy Park 6 - 11 Exit 4", "access_rule": [] } ], @@ -7095,6 +8535,7 @@ "room": 12, "pointer": 3036404, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -7102,6 +8543,7 @@ "unkn2": 9, "x": 200, "y": 72, + "name": "Cloudy Park 6 - 12 Exit 0", "access_rule": [] }, { @@ -7110,6 +8552,7 @@ "unkn2": 9, "x": 88, "y": 152, + "name": "Cloudy Park 6 - 12 Exit 1", "access_rule": [] } ], @@ -7123,6 +8566,7 @@ "room": 13, "pointer": 2965251, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -7130,6 +8574,7 @@ "unkn2": 13, "x": 216, "y": 136, + "name": "Cloudy Park 6 - 13 Exit 0", "access_rule": [] } ], @@ -7143,6 +8588,7 @@ "room": 14, "pointer": 3077236, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -7150,6 +8596,7 @@ "unkn2": 13, "x": 936, "y": 136, + "name": "Cloudy Park 6 - 14 Exit 0", "access_rule": [] } ], @@ -7163,6 +8610,7 @@ "room": 15, "pointer": 3061794, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 16, @@ -7170,6 +8618,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Cloudy Park 6 - 15 Exit 0", "access_rule": [] } ], @@ -7185,6 +8634,7 @@ "room": 16, "pointer": 2888907, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Cloudy Park 6 - Complete" @@ -7198,6 +8648,7 @@ "room": 0, "pointer": 2998682, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Cloudy Park - Boss (Ado) Purified", @@ -7212,6 +8663,11 @@ "room": 0, "pointer": 3363111, "animal_pointers": [], + "enemies": [ + "Waddle Dee", + "Klinko", + "KeKe" + ], "default_exits": [ { "room": 1, @@ -7219,10 +8675,15 @@ "unkn2": 8, "x": 312, "y": 1384, + "name": "Iceberg 1 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 1 - Enemy 1 (Waddle Dee)", + "Iceberg 1 - Enemy 2 (Klinko)", + "Iceberg 1 - Enemy 3 (KeKe)" + ], "music": 18 }, { @@ -7232,6 +8693,11 @@ "room": 1, "pointer": 3596524, "animal_pointers": [], + "enemies": [ + "Como", + "Galbo", + "Rocky" + ], "default_exits": [ { "room": 2, @@ -7239,10 +8705,15 @@ "unkn2": 8, "x": 72, "y": 344, + "name": "Iceberg 1 - 1 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 1 - Enemy 4 (Como)", + "Iceberg 1 - Enemy 5 (Galbo)", + "Iceberg 1 - Enemy 6 (Rocky)" + ], "music": 18 }, { @@ -7252,6 +8723,9 @@ "room": 2, "pointer": 3288880, "animal_pointers": [], + "enemies": [ + "Kapar" + ], "default_exits": [ { "room": 3, @@ -7259,6 +8733,7 @@ "unkn2": 9, "x": 184, "y": 152, + "name": "Iceberg 1 - 2 Exit 0", "access_rule": [] }, { @@ -7267,10 +8742,13 @@ "unkn2": 21, "x": 120, "y": 168, + "name": "Iceberg 1 - 2 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 1 - Enemy 7 (Kapar)" + ], "music": 18 }, { @@ -7283,6 +8761,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -7290,6 +8769,7 @@ "unkn2": 9, "x": 808, "y": 152, + "name": "Iceberg 1 - 3 Exit 0", "access_rule": [] } ], @@ -7306,6 +8786,11 @@ "room": 4, "pointer": 3233681, "animal_pointers": [], + "enemies": [ + "Mopoo", + "Babut", + "Wappa" + ], "default_exits": [ { "room": 6, @@ -7313,10 +8798,15 @@ "unkn2": 4, "x": 56, "y": 152, + "name": "Iceberg 1 - 4 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 1 - Enemy 8 (Mopoo)", + "Iceberg 1 - Enemy 9 (Babut)", + "Iceberg 1 - Enemy 10 (Wappa)" + ], "music": 18 }, { @@ -7326,6 +8816,11 @@ "room": 5, "pointer": 3406133, "animal_pointers": [], + "enemies": [ + "Bronto Burt", + "Chilly", + "Poppy Bros Jr." + ], "default_exits": [ { "room": 4, @@ -7333,10 +8828,15 @@ "unkn2": 9, "x": 72, "y": 744, + "name": "Iceberg 1 - 5 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 1 - Enemy 11 (Bronto Burt)", + "Iceberg 1 - Enemy 12 (Chilly)", + "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)" + ], "music": 18 }, { @@ -7346,6 +8846,7 @@ "room": 6, "pointer": 2985823, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -7353,6 +8854,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Iceberg 1 - 6 Exit 0", "access_rule": [] } ], @@ -7368,6 +8870,7 @@ "room": 7, "pointer": 2892040, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Iceberg 1 - Complete" @@ -7381,6 +8884,10 @@ "room": 0, "pointer": 3106800, "animal_pointers": [], + "enemies": [ + "Gabon", + "Nruff" + ], "default_exits": [ { "room": 1, @@ -7388,10 +8895,14 @@ "unkn2": 36, "x": 88, "y": 152, + "name": "Iceberg 2 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 2 - Enemy 1 (Gabon)", + "Iceberg 2 - Enemy 2 (Nruff)" + ], "music": 20 }, { @@ -7401,6 +8912,11 @@ "room": 1, "pointer": 3334841, "animal_pointers": [], + "enemies": [ + "Waddle Dee", + "Chilly", + "Pteran" + ], "default_exits": [ { "room": 2, @@ -7408,10 +8924,15 @@ "unkn2": 20, "x": 88, "y": 72, + "name": "Iceberg 2 - 1 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 2 - Enemy 3 (Waddle Dee)", + "Iceberg 2 - Enemy 4 (Chilly)", + "Iceberg 2 - Enemy 5 (Pteran)" + ], "music": 20 }, { @@ -7421,6 +8942,12 @@ "room": 2, "pointer": 3473408, "animal_pointers": [], + "enemies": [ + "Glunk", + "Galbo", + "Babut", + "Magoo" + ], "default_exits": [ { "room": 6, @@ -7428,6 +8955,7 @@ "unkn2": 5, "x": 88, "y": 152, + "name": "Iceberg 2 - 2 Exit 0", "access_rule": [] }, { @@ -7436,6 +8964,7 @@ "unkn2": 18, "x": 88, "y": 152, + "name": "Iceberg 2 - 2 Exit 1", "access_rule": [] }, { @@ -7444,6 +8973,7 @@ "unkn2": 26, "x": 200, "y": 184, + "name": "Iceberg 2 - 2 Exit 2", "access_rule": [] }, { @@ -7452,6 +8982,7 @@ "unkn2": 26, "x": 200, "y": 184, + "name": "Iceberg 2 - 2 Exit 3", "access_rule": [] }, { @@ -7460,10 +8991,16 @@ "unkn2": 26, "x": 200, "y": 184, + "name": "Iceberg 2 - 2 Exit 4", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 2 - Enemy 6 (Glunk)", + "Iceberg 2 - Enemy 7 (Galbo)", + "Iceberg 2 - Enemy 8 (Babut)", + "Iceberg 2 - Enemy 9 (Magoo)" + ], "music": 20 }, { @@ -7473,6 +9010,7 @@ "room": 3, "pointer": 3037006, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -7480,6 +9018,7 @@ "unkn2": 11, "x": 616, "y": 424, + "name": "Iceberg 2 - 3 Exit 0", "access_rule": [] } ], @@ -7493,6 +9032,7 @@ "room": 4, "pointer": 3035198, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -7500,6 +9040,7 @@ "unkn2": 11, "x": 904, "y": 424, + "name": "Iceberg 2 - 4 Exit 0", "access_rule": [] } ], @@ -7513,6 +9054,7 @@ "room": 5, "pointer": 3128551, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -7520,6 +9062,7 @@ "unkn2": 11, "x": 1192, "y": 424, + "name": "Iceberg 2 - 5 Exit 0", "access_rule": [] } ], @@ -7533,6 +9076,11 @@ "room": 6, "pointer": 3270857, "animal_pointers": [], + "enemies": [ + "Propeller", + "Nidoo", + "Oro" + ], "default_exits": [ { "room": 7, @@ -7540,10 +9088,15 @@ "unkn2": 9, "x": 88, "y": 152, + "name": "Iceberg 2 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 2 - Enemy 10 (Propeller)", + "Iceberg 2 - Enemy 11 (Nidoo)", + "Iceberg 2 - Enemy 12 (Oro)" + ], "music": 20 }, { @@ -7553,6 +9106,10 @@ "room": 7, "pointer": 3212501, "animal_pointers": [], + "enemies": [ + "Klinko", + "Bronto Burt" + ], "default_exits": [ { "room": 8, @@ -7560,10 +9117,14 @@ "unkn2": 8, "x": 72, "y": 152, + "name": "Iceberg 2 - 7 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 2 - Enemy 13 (Klinko)", + "Iceberg 2 - Enemy 14 (Bronto Burt)" + ], "music": 20 }, { @@ -7573,6 +9134,7 @@ "room": 8, "pointer": 2994515, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 10, @@ -7580,6 +9142,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Iceberg 2 - 8 Exit 0", "access_rule": [] } ], @@ -7598,6 +9161,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -7605,6 +9169,7 @@ "unkn2": 9, "x": 408, "y": 296, + "name": "Iceberg 2 - 9 Exit 0", "access_rule": [] } ], @@ -7621,6 +9186,7 @@ "room": 10, "pointer": 2887220, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Iceberg 2 - Complete" @@ -7634,6 +9200,12 @@ "room": 0, "pointer": 3455346, "animal_pointers": [], + "enemies": [ + "Corori", + "Bouncy", + "Chilly", + "Pteran" + ], "default_exits": [ { "room": 1, @@ -7641,6 +9213,7 @@ "unkn2": 6, "x": 200, "y": 232, + "name": "Iceberg 3 - 0 Exit 0", "access_rule": [] }, { @@ -7649,10 +9222,16 @@ "unkn2": 7, "x": 40, "y": 120, + "name": "Iceberg 3 - 0 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 3 - Enemy 1 (Corori)", + "Iceberg 3 - Enemy 2 (Bouncy)", + "Iceberg 3 - Enemy 3 (Chilly)", + "Iceberg 3 - Enemy 4 (Pteran)" + ], "music": 14 }, { @@ -7666,6 +9245,7 @@ 200, 208 ], + "enemies": [], "default_exits": [ { "room": 0, @@ -7673,6 +9253,7 @@ "unkn2": 14, "x": 1592, "y": 104, + "name": "Iceberg 3 - 1 Exit 0", "access_rule": [] } ], @@ -7690,6 +9271,11 @@ "room": 2, "pointer": 3618121, "animal_pointers": [], + "enemies": [ + "Raft Waddle Dee", + "Kapar", + "Blipper" + ], "default_exits": [ { "room": 3, @@ -7697,11 +9283,15 @@ "unkn2": 11, "x": 72, "y": 152, + "name": "Iceberg 3 - 2 Exit 0", "access_rule": [] } ], "locations": [ - "Iceberg 3 - Maxim Tomato (Ceiling)" + "Iceberg 3 - Maxim Tomato (Ceiling)", + "Iceberg 3 - Enemy 5 (Raft Waddle Dee)", + "Iceberg 3 - Enemy 6 (Kapar)", + "Iceberg 3 - Enemy 7 (Blipper)" ], "music": 14 }, @@ -7712,6 +9302,9 @@ "room": 3, "pointer": 3650368, "animal_pointers": [], + "enemies": [ + "Wapod" + ], "default_exits": [ { "room": 5, @@ -7719,6 +9312,7 @@ "unkn2": 11, "x": 40, "y": 152, + "name": "Iceberg 3 - 3 Exit 0", "access_rule": [] }, { @@ -7727,10 +9321,13 @@ "unkn2": 13, "x": 184, "y": 136, + "name": "Iceberg 3 - 3 Exit 1", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 3 - Enemy 8 (Wapod)" + ], "music": 14 }, { @@ -7743,6 +9340,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 3, @@ -7750,6 +9348,7 @@ "unkn2": 8, "x": 1032, "y": 216, + "name": "Iceberg 3 - 4 Exit 0", "access_rule": [] } ], @@ -7766,6 +9365,7 @@ "room": 5, "pointer": 3013938, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 6, @@ -7773,6 +9373,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Iceberg 3 - 5 Exit 0", "access_rule": [] } ], @@ -7786,6 +9387,10 @@ "room": 6, "pointer": 3624789, "animal_pointers": [], + "enemies": [ + "Glunk", + "Icicle" + ], "default_exits": [ { "room": 7, @@ -7793,10 +9398,14 @@ "unkn2": 7, "x": 40, "y": 152, + "name": "Iceberg 3 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 3 - Enemy 9 (Glunk)", + "Iceberg 3 - Enemy 10 (Icicle)" + ], "music": 14 }, { @@ -7806,6 +9415,7 @@ "room": 7, "pointer": 2989472, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -7813,6 +9423,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Iceberg 3 - 7 Exit 0", "access_rule": [] } ], @@ -7828,6 +9439,7 @@ "room": 8, "pointer": 2889871, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Iceberg 3 - Complete" @@ -7841,6 +9453,12 @@ "room": 0, "pointer": 3274879, "animal_pointers": [], + "enemies": [ + "Bronto Burt", + "Galbo", + "Klinko", + "Chilly" + ], "default_exits": [ { "room": 1, @@ -7848,10 +9466,16 @@ "unkn2": 8, "x": 72, "y": 104, + "name": "Iceberg 4 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 4 - Enemy 1 (Bronto Burt)", + "Iceberg 4 - Enemy 2 (Galbo)", + "Iceberg 4 - Enemy 3 (Klinko)", + "Iceberg 4 - Enemy 4 (Chilly)" + ], "music": 19 }, { @@ -7861,6 +9485,10 @@ "room": 1, "pointer": 3371780, "animal_pointers": [], + "enemies": [ + "Babut", + "Wappa" + ], "default_exits": [ { "room": 2, @@ -7868,10 +9496,14 @@ "unkn2": 36, "x": 216, "y": 88, + "name": "Iceberg 4 - 1 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 4 - Enemy 5 (Babut)", + "Iceberg 4 - Enemy 6 (Wappa)" + ], "music": 19 }, { @@ -7881,6 +9513,7 @@ "room": 2, "pointer": 3284378, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 16, @@ -7888,6 +9521,7 @@ "unkn2": 39, "x": 168, "y": 152, + "name": "Iceberg 4 - 2 Exit 0", "access_rule": [ "Burning" ] @@ -7898,6 +9532,7 @@ "unkn2": 39, "x": 88, "y": 136, + "name": "Iceberg 4 - 2 Exit 1", "access_rule": [] }, { @@ -7906,6 +9541,7 @@ "unkn2": 39, "x": 120, "y": 152, + "name": "Iceberg 4 - 2 Exit 2", "access_rule": [ "Burning" ] @@ -7921,6 +9557,7 @@ "room": 3, "pointer": 3162957, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 4, @@ -7928,6 +9565,7 @@ "unkn2": 8, "x": 216, "y": 104, + "name": "Iceberg 4 - 3 Exit 0", "access_rule": [] } ], @@ -7941,6 +9579,9 @@ "room": 4, "pointer": 3261679, "animal_pointers": [], + "enemies": [ + "Icicle" + ], "default_exits": [ { "room": 5, @@ -7948,10 +9589,13 @@ "unkn2": 42, "x": 104, "y": 840, + "name": "Iceberg 4 - 4 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 4 - Enemy 7 (Icicle)" + ], "music": 19 }, { @@ -7961,6 +9605,9 @@ "room": 5, "pointer": 3217398, "animal_pointers": [], + "enemies": [ + "Corori" + ], "default_exits": [ { "room": 6, @@ -7968,10 +9615,13 @@ "unkn2": 5, "x": 72, "y": 120, + "name": "Iceberg 4 - 5 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 4 - Enemy 8 (Corori)" + ], "music": 19 }, { @@ -7981,6 +9631,7 @@ "room": 6, "pointer": 3108265, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -7988,6 +9639,7 @@ "unkn2": 7, "x": 456, "y": 72, + "name": "Iceberg 4 - 6 Exit 0", "access_rule": [] } ], @@ -8001,6 +9653,7 @@ "room": 7, "pointer": 3346202, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 8, @@ -8008,6 +9661,7 @@ "unkn2": 6, "x": 168, "y": 104, + "name": "Iceberg 4 - 7 Exit 0", "access_rule": [] }, { @@ -8016,6 +9670,7 @@ "unkn2": 21, "x": 88, "y": 168, + "name": "Iceberg 4 - 7 Exit 1", "access_rule": [ "Burning" ] @@ -8026,6 +9681,7 @@ "unkn2": 21, "x": 280, "y": 168, + "name": "Iceberg 4 - 7 Exit 2", "access_rule": [ "Burning" ] @@ -8041,6 +9697,7 @@ "room": 8, "pointer": 3055911, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -8048,6 +9705,7 @@ "unkn2": 5, "x": 648, "y": 104, + "name": "Iceberg 4 - 8 Exit 0", "access_rule": [] } ], @@ -8061,6 +9719,7 @@ "room": 9, "pointer": 3056457, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 11, @@ -8068,6 +9727,7 @@ "unkn2": 9, "x": 136, "y": 136, + "name": "Iceberg 4 - 9 Exit 0", "access_rule": [] } ], @@ -8081,6 +9741,7 @@ "room": 10, "pointer": 3257516, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 9, @@ -8088,6 +9749,7 @@ "unkn2": 37, "x": 88, "y": 40, + "name": "Iceberg 4 - 10 Exit 0", "access_rule": [] }, { @@ -8096,6 +9758,7 @@ "unkn2": 37, "x": 200, "y": 40, + "name": "Iceberg 4 - 10 Exit 1", "access_rule": [] } ], @@ -8109,6 +9772,9 @@ "room": 11, "pointer": 3083322, "animal_pointers": [], + "enemies": [ + "Gabon" + ], "default_exits": [ { "room": 12, @@ -8116,10 +9782,13 @@ "unkn2": 8, "x": 88, "y": 120, + "name": "Iceberg 4 - 11 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 4 - Enemy 9 (Gabon)" + ], "music": 19 }, { @@ -8129,6 +9798,9 @@ "room": 12, "pointer": 3147724, "animal_pointers": [], + "enemies": [ + "Kabu" + ], "default_exits": [ { "room": 18, @@ -8136,10 +9808,13 @@ "unkn2": 7, "x": 72, "y": 456, + "name": "Iceberg 4 - 12 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 4 - Enemy 10 (Kabu)" + ], "music": 19 }, { @@ -8153,6 +9828,7 @@ 240, 248 ], + "enemies": [], "default_exits": [ { "room": 15, @@ -8160,6 +9836,7 @@ "unkn2": 4, "x": 216, "y": 120, + "name": "Iceberg 4 - 13 Exit 0", "access_rule": [] }, { @@ -8168,6 +9845,7 @@ "unkn2": 10, "x": 72, "y": 88, + "name": "Iceberg 4 - 13 Exit 1", "access_rule": [] }, { @@ -8176,6 +9854,7 @@ "unkn2": 10, "x": 312, "y": 88, + "name": "Iceberg 4 - 13 Exit 2", "access_rule": [] }, { @@ -8184,6 +9863,7 @@ "unkn2": 21, "x": 152, "y": 136, + "name": "Iceberg 4 - 13 Exit 3", "access_rule": [] }, { @@ -8192,6 +9872,7 @@ "unkn2": 21, "x": 280, "y": 136, + "name": "Iceberg 4 - 13 Exit 4", "access_rule": [] } ], @@ -8209,6 +9890,10 @@ "room": 14, "pointer": 3057002, "animal_pointers": [], + "enemies": [ + "Broom Hatter", + "Sasuke" + ], "default_exits": [ { "room": 15, @@ -8216,6 +9901,7 @@ "unkn2": 8, "x": 88, "y": 360, + "name": "Iceberg 4 - 14 Exit 0", "access_rule": [] }, { @@ -8224,6 +9910,7 @@ "unkn2": 8, "x": 440, "y": 344, + "name": "Iceberg 4 - 14 Exit 1", "access_rule": [] }, { @@ -8232,6 +9919,7 @@ "unkn2": 8, "x": 568, "y": 344, + "name": "Iceberg 4 - 14 Exit 2", "access_rule": [] }, { @@ -8240,10 +9928,14 @@ "unkn2": 8, "x": 344, "y": 360, + "name": "Iceberg 4 - 14 Exit 3", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 4 - Enemy 11 (Broom Hatter)", + "Iceberg 4 - Enemy 12 (Sasuke)" + ], "music": 19 }, { @@ -8253,6 +9945,7 @@ "room": 15, "pointer": 3116124, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 13, @@ -8260,6 +9953,7 @@ "unkn2": 6, "x": 520, "y": 72, + "name": "Iceberg 4 - 15 Exit 0", "access_rule": [] }, { @@ -8268,6 +9962,7 @@ "unkn2": 22, "x": 88, "y": 136, + "name": "Iceberg 4 - 15 Exit 1", "access_rule": [] }, { @@ -8276,6 +9971,7 @@ "unkn2": 22, "x": 344, "y": 136, + "name": "Iceberg 4 - 15 Exit 2", "access_rule": [] } ], @@ -8291,6 +9987,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -8298,6 +9995,7 @@ "unkn2": 9, "x": 152, "y": 632, + "name": "Iceberg 4 - 16 Exit 0", "access_rule": [] } ], @@ -8315,6 +10013,7 @@ "animal_pointers": [ 192 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -8322,6 +10021,7 @@ "unkn2": 9, "x": 280, "y": 632, + "name": "Iceberg 4 - 17 Exit 0", "access_rule": [] } ], @@ -8337,6 +10037,9 @@ "room": 18, "pointer": 3404593, "animal_pointers": [], + "enemies": [ + "Nruff" + ], "default_exits": [ { "room": 19, @@ -8344,10 +10047,13 @@ "unkn2": 12, "x": 72, "y": 152, + "name": "Iceberg 4 - 18 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 4 - Enemy 13 (Nruff)" + ], "music": 19 }, { @@ -8357,6 +10063,7 @@ "room": 19, "pointer": 3075826, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 20, @@ -8364,6 +10071,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Iceberg 4 - 19 Exit 0", "access_rule": [] } ], @@ -8379,6 +10087,7 @@ "room": 20, "pointer": 2887943, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Iceberg 4 - Complete" @@ -8392,6 +10101,16 @@ "room": 0, "pointer": 3316135, "animal_pointers": [], + "enemies": [ + "Bukiset (Burning)", + "Bukiset (Stone)", + "Bukiset (Ice)", + "Bukiset (Needle)", + "Bukiset (Clean)", + "Bukiset (Parasol)", + "Bukiset (Spark)", + "Bukiset (Cutter)" + ], "default_exits": [ { "room": 30, @@ -8399,10 +10118,20 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Iceberg 5 - 0 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 1 (Bukiset (Burning))", + "Iceberg 5 - Enemy 2 (Bukiset (Stone))", + "Iceberg 5 - Enemy 3 (Bukiset (Ice))", + "Iceberg 5 - Enemy 4 (Bukiset (Needle))", + "Iceberg 5 - Enemy 5 (Bukiset (Clean))", + "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", + "Iceberg 5 - Enemy 7 (Bukiset (Spark))", + "Iceberg 5 - Enemy 8 (Bukiset (Cutter))" + ], "music": 16 }, { @@ -8412,6 +10141,7 @@ "room": 1, "pointer": 3037607, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 2, @@ -8419,6 +10149,7 @@ "unkn2": 6, "x": 72, "y": 104, + "name": "Iceberg 5 - 1 Exit 0", "access_rule": [] } ], @@ -8432,6 +10163,9 @@ "room": 2, "pointer": 3103842, "animal_pointers": [], + "enemies": [ + "Glunk" + ], "default_exits": [ { "room": 25, @@ -8439,10 +10173,13 @@ "unkn2": 6, "x": 72, "y": 200, + "name": "Iceberg 5 - 2 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 9 (Glunk)" + ], "music": 16 }, { @@ -8452,6 +10189,9 @@ "room": 3, "pointer": 3135899, "animal_pointers": [], + "enemies": [ + "Wapod" + ], "default_exits": [ { "room": 4, @@ -8459,10 +10199,13 @@ "unkn2": 7, "x": 72, "y": 88, + "name": "Iceberg 5 - 3 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 10 (Wapod)" + ], "music": 16 }, { @@ -8472,6 +10215,9 @@ "room": 4, "pointer": 3180695, "animal_pointers": [], + "enemies": [ + "Tick" + ], "default_exits": [ { "room": 5, @@ -8479,10 +10225,13 @@ "unkn2": 5, "x": 56, "y": 104, + "name": "Iceberg 5 - 4 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 11 (Tick)" + ], "music": 16 }, { @@ -8492,6 +10241,9 @@ "room": 5, "pointer": 3106064, "animal_pointers": [], + "enemies": [ + "Madoo" + ], "default_exits": [ { "room": 24, @@ -8499,10 +10251,13 @@ "unkn2": 6, "x": 168, "y": 152, + "name": "Iceberg 5 - 5 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 12 (Madoo)" + ], "music": 16 }, { @@ -8512,6 +10267,7 @@ "room": 6, "pointer": 3276800, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 7, @@ -8519,6 +10275,7 @@ "unkn2": 12, "x": 72, "y": 120, + "name": "Iceberg 5 - 6 Exit 0", "access_rule": [] } ], @@ -8532,6 +10289,7 @@ "room": 7, "pointer": 3104585, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 26, @@ -8539,6 +10297,7 @@ "unkn2": 7, "x": 72, "y": 136, + "name": "Iceberg 5 - 7 Exit 0", "access_rule": [] } ], @@ -8552,6 +10311,7 @@ "room": 8, "pointer": 3195121, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 9, @@ -8559,6 +10319,7 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Iceberg 5 - 8 Exit 0", "access_rule": [] } ], @@ -8572,6 +10333,7 @@ "room": 9, "pointer": 3087198, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 28, @@ -8579,6 +10341,7 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Iceberg 5 - 9 Exit 0", "access_rule": [] } ], @@ -8594,6 +10357,7 @@ "room": 10, "pointer": 3321612, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 32, @@ -8601,6 +10365,7 @@ "unkn2": 15, "x": 72, "y": 120, + "name": "Iceberg 5 - 10 Exit 0", "access_rule": [] } ], @@ -8614,6 +10379,9 @@ "room": 11, "pointer": 3139178, "animal_pointers": [], + "enemies": [ + "Yaban" + ], "default_exits": [ { "room": 12, @@ -8621,11 +10389,13 @@ "unkn2": 7, "x": 72, "y": 120, + "name": "Iceberg 5 - 11 Exit 0", "access_rule": [] } ], "locations": [ - "Iceberg 5 - 1-Up (Floor)" + "Iceberg 5 - 1-Up (Floor)", + "Iceberg 5 - Enemy 13 (Yaban)" ], "music": 16 }, @@ -8636,6 +10406,9 @@ "room": 12, "pointer": 3118231, "animal_pointers": [], + "enemies": [ + "Propeller" + ], "default_exits": [ { "room": 13, @@ -8643,10 +10416,13 @@ "unkn2": 7, "x": 72, "y": 104, + "name": "Iceberg 5 - 12 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 14 (Propeller)" + ], "music": 16 }, { @@ -8656,6 +10432,9 @@ "room": 13, "pointer": 3021658, "animal_pointers": [], + "enemies": [ + "Mariel" + ], "default_exits": [ { "room": 27, @@ -8663,10 +10442,13 @@ "unkn2": 6, "x": 72, "y": 152, + "name": "Iceberg 5 - 13 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 15 (Mariel)" + ], "music": 16 }, { @@ -8676,6 +10458,7 @@ "room": 14, "pointer": 3025398, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 15, @@ -8683,6 +10466,7 @@ "unkn2": 9, "x": 72, "y": 216, + "name": "Iceberg 5 - 14 Exit 0", "access_rule": [] } ], @@ -8698,6 +10482,9 @@ "room": 15, "pointer": 3167445, "animal_pointers": [], + "enemies": [ + "Pteran" + ], "default_exits": [ { "room": 16, @@ -8705,10 +10492,13 @@ "unkn2": 13, "x": 72, "y": 152, + "name": "Iceberg 5 - 15 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 16 (Pteran)" + ], "music": 16 }, { @@ -8718,6 +10508,7 @@ "room": 16, "pointer": 3033990, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 33, @@ -8725,6 +10516,7 @@ "unkn2": 9, "x": 168, "y": 152, + "name": "Iceberg 5 - 16 Exit 0", "access_rule": [] } ], @@ -8738,6 +10530,7 @@ "room": 17, "pointer": 3100111, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 20, @@ -8745,6 +10538,7 @@ "unkn2": 7, "x": 72, "y": 200, + "name": "Iceberg 5 - 17 Exit 0", "access_rule": [] } ], @@ -8758,6 +10552,9 @@ "room": 18, "pointer": 3030947, "animal_pointers": [], + "enemies": [ + "Galbo" + ], "default_exits": [ { "room": 17, @@ -8765,10 +10562,13 @@ "unkn2": 7, "x": 72, "y": 120, + "name": "Iceberg 5 - 18 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 17 (Galbo)" + ], "music": 16 }, { @@ -8778,6 +10578,9 @@ "room": 19, "pointer": 3105326, "animal_pointers": [], + "enemies": [ + "KeKe" + ], "default_exits": [ { "room": 21, @@ -8785,10 +10588,13 @@ "unkn2": 4, "x": 72, "y": 152, + "name": "Iceberg 5 - 19 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 18 (KeKe)" + ], "music": 16 }, { @@ -8798,6 +10604,9 @@ "room": 20, "pointer": 3118928, "animal_pointers": [], + "enemies": [ + "Nidoo" + ], "default_exits": [ { "room": 19, @@ -8805,10 +10614,13 @@ "unkn2": 6, "x": 72, "y": 264, + "name": "Iceberg 5 - 20 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 19 (Nidoo)" + ], "music": 16 }, { @@ -8818,6 +10630,11 @@ "room": 21, "pointer": 3202517, "animal_pointers": [], + "enemies": [ + "Waddle Dee Drawing", + "Bronto Burt Drawing", + "Bouncy Drawing" + ], "default_exits": [ { "room": 22, @@ -8825,10 +10642,15 @@ "unkn2": 9, "x": 72, "y": 72, + "name": "Iceberg 5 - 21 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", + "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", + "Iceberg 5 - Enemy 22 (Bouncy Drawing)" + ], "music": 16 }, { @@ -8838,6 +10660,9 @@ "room": 22, "pointer": 3014656, "animal_pointers": [], + "enemies": [ + "Joe" + ], "default_exits": [ { "room": 23, @@ -8845,10 +10670,13 @@ "unkn2": 4, "x": 72, "y": 104, + "name": "Iceberg 5 - 22 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 23 (Joe)" + ], "music": 16 }, { @@ -8858,6 +10686,9 @@ "room": 23, "pointer": 3166550, "animal_pointers": [], + "enemies": [ + "Kapar" + ], "default_exits": [ { "room": 34, @@ -8865,10 +10696,13 @@ "unkn2": 6, "x": 72, "y": 152, + "name": "Iceberg 5 - 23 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 24 (Kapar)" + ], "music": 16 }, { @@ -8878,6 +10712,9 @@ "room": 24, "pointer": 3029110, "animal_pointers": [], + "enemies": [ + "Gansan" + ], "default_exits": [ { "room": 31, @@ -8885,10 +10722,13 @@ "unkn2": 4, "x": 72, "y": 88, + "name": "Iceberg 5 - 24 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 25 (Gansan)" + ], "music": 16 }, { @@ -8898,6 +10738,9 @@ "room": 25, "pointer": 3156420, "animal_pointers": [], + "enemies": [ + "Sasuke" + ], "default_exits": [ { "room": 3, @@ -8905,10 +10748,13 @@ "unkn2": 7, "x": 72, "y": 120, + "name": "Iceberg 5 - 25 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 26 (Sasuke)" + ], "music": 16 }, { @@ -8918,6 +10764,9 @@ "room": 26, "pointer": 3127877, "animal_pointers": [], + "enemies": [ + "Togezo" + ], "default_exits": [ { "room": 8, @@ -8925,10 +10774,13 @@ "unkn2": 8, "x": 72, "y": 152, + "name": "Iceberg 5 - 26 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 27 (Togezo)" + ], "music": 16 }, { @@ -8938,6 +10790,10 @@ "room": 27, "pointer": 3256471, "animal_pointers": [], + "enemies": [ + "Sparky", + "Bobin" + ], "default_exits": [ { "room": 14, @@ -8945,10 +10801,14 @@ "unkn2": 9, "x": 72, "y": 152, + "name": "Iceberg 5 - 27 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 28 (Sparky)", + "Iceberg 5 - Enemy 29 (Bobin)" + ], "music": 16 }, { @@ -8958,6 +10818,9 @@ "room": 28, "pointer": 3029723, "animal_pointers": [], + "enemies": [ + "Chilly" + ], "default_exits": [ { "room": 10, @@ -8965,10 +10828,13 @@ "unkn2": 9, "x": 72, "y": 248, + "name": "Iceberg 5 - 28 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 30 (Chilly)" + ], "music": 16 }, { @@ -8978,6 +10844,7 @@ "room": 29, "pointer": 3526568, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 36, @@ -8985,6 +10852,7 @@ "unkn2": 6, "x": 72, "y": 152, + "name": "Iceberg 5 - 29 Exit 0", "access_rule": [] } ], @@ -9001,6 +10869,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 1, @@ -9008,6 +10877,7 @@ "unkn2": 5, "x": 88, "y": 104, + "name": "Iceberg 5 - 30 Exit 0", "access_rule": [] } ], @@ -9027,6 +10897,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 6, @@ -9034,6 +10905,7 @@ "unkn2": 9, "x": 72, "y": 200, + "name": "Iceberg 5 - 31 Exit 0", "access_rule": [] } ], @@ -9053,6 +10925,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 11, @@ -9060,6 +10933,7 @@ "unkn2": 7, "x": 72, "y": 120, + "name": "Iceberg 5 - 32 Exit 0", "access_rule": [] } ], @@ -9079,6 +10953,7 @@ 192, 200 ], + "enemies": [], "default_exits": [ { "room": 18, @@ -9086,6 +10961,7 @@ "unkn2": 6, "x": 72, "y": 152, + "name": "Iceberg 5 - 33 Exit 0", "access_rule": [] } ], @@ -9102,6 +10978,9 @@ "room": 34, "pointer": 3185868, "animal_pointers": [], + "enemies": [ + "Peran" + ], "default_exits": [ { "room": 35, @@ -9109,10 +10988,13 @@ "unkn2": 9, "x": 200, "y": 328, + "name": "Iceberg 5 - 34 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 5 - Enemy 31 (Peran)" + ], "music": 16 }, { @@ -9122,6 +11004,7 @@ "room": 35, "pointer": 3865635, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 29, @@ -9129,6 +11012,7 @@ "unkn2": 7, "x": 168, "y": 1384, + "name": "Iceberg 5 - 35 Exit 0", "access_rule": [] } ], @@ -9142,6 +11026,7 @@ "room": 36, "pointer": 3024154, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 37, @@ -9149,6 +11034,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Iceberg 5 - 36 Exit 0", "access_rule": [] } ], @@ -9164,6 +11050,7 @@ "room": 37, "pointer": 2890594, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Iceberg 5 - Complete" @@ -9177,6 +11064,9 @@ "room": 0, "pointer": 3385305, "animal_pointers": [], + "enemies": [ + "Nruff" + ], "default_exits": [ { "room": 1, @@ -9184,6 +11074,7 @@ "unkn2": 28, "x": 136, "y": 184, + "name": "Iceberg 6 - 0 Exit 0", "access_rule": [] }, { @@ -9192,6 +11083,7 @@ "unkn2": 28, "x": 248, "y": 184, + "name": "Iceberg 6 - 0 Exit 1", "access_rule": [] }, { @@ -9200,10 +11092,13 @@ "unkn2": 28, "x": 360, "y": 184, + "name": "Iceberg 6 - 0 Exit 2", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 6 - Enemy 1 (Nruff)" + ], "music": 12 }, { @@ -9217,6 +11112,7 @@ 220, 228 ], + "enemies": [], "default_exits": [ { "room": 2, @@ -9224,6 +11120,7 @@ "unkn2": 5, "x": 152, "y": 184, + "name": "Iceberg 6 - 1 Exit 0", "access_rule": [] }, { @@ -9232,6 +11129,7 @@ "unkn2": 5, "x": 248, "y": 184, + "name": "Iceberg 6 - 1 Exit 1", "access_rule": [] }, { @@ -9240,6 +11138,7 @@ "unkn2": 5, "x": 344, "y": 184, + "name": "Iceberg 6 - 1 Exit 2", "access_rule": [] } ], @@ -9257,6 +11156,7 @@ "room": 2, "pointer": 3097113, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 5, @@ -9264,6 +11164,7 @@ "unkn2": 5, "x": 136, "y": 184, + "name": "Iceberg 6 - 2 Exit 0", "access_rule": [] }, { @@ -9272,6 +11173,7 @@ "unkn2": 5, "x": 248, "y": 184, + "name": "Iceberg 6 - 2 Exit 1", "access_rule": [] }, { @@ -9280,6 +11182,7 @@ "unkn2": 5, "x": 360, "y": 184, + "name": "Iceberg 6 - 2 Exit 2", "access_rule": [] } ], @@ -9297,6 +11200,7 @@ 220, 228 ], + "enemies": [], "default_exits": [ { "room": 6, @@ -9304,6 +11208,7 @@ "unkn2": 5, "x": 152, "y": 184, + "name": "Iceberg 6 - 3 Exit 0", "access_rule": [] }, { @@ -9312,6 +11217,7 @@ "unkn2": 5, "x": 248, "y": 184, + "name": "Iceberg 6 - 3 Exit 1", "access_rule": [] }, { @@ -9320,6 +11226,7 @@ "unkn2": 5, "x": 344, "y": 184, + "name": "Iceberg 6 - 3 Exit 2", "access_rule": [] } ], @@ -9337,6 +11244,7 @@ "room": 4, "pointer": 3210507, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 3, @@ -9344,6 +11252,7 @@ "unkn2": 5, "x": 136, "y": 184, + "name": "Iceberg 6 - 4 Exit 0", "access_rule": [] }, { @@ -9352,6 +11261,7 @@ "unkn2": 5, "x": 248, "y": 184, + "name": "Iceberg 6 - 4 Exit 1", "access_rule": [] }, { @@ -9360,6 +11270,7 @@ "unkn2": 5, "x": 360, "y": 184, + "name": "Iceberg 6 - 4 Exit 2", "access_rule": [] } ], @@ -9373,6 +11284,7 @@ "room": 5, "pointer": 3196776, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 4, @@ -9380,6 +11292,7 @@ "unkn2": 5, "x": 152, "y": 184, + "name": "Iceberg 6 - 5 Exit 0", "access_rule": [] }, { @@ -9388,6 +11301,7 @@ "unkn2": 5, "x": 248, "y": 184, + "name": "Iceberg 6 - 5 Exit 1", "access_rule": [] }, { @@ -9396,6 +11310,7 @@ "unkn2": 5, "x": 344, "y": 184, + "name": "Iceberg 6 - 5 Exit 2", "access_rule": [] } ], @@ -9412,6 +11327,9 @@ "room": 6, "pointer": 3208130, "animal_pointers": [], + "enemies": [ + "Nidoo" + ], "default_exits": [ { "room": 7, @@ -9419,10 +11337,13 @@ "unkn2": 5, "x": 136, "y": 168, + "name": "Iceberg 6 - 6 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 6 - Enemy 2 (Nidoo)" + ], "music": 12 }, { @@ -9432,6 +11353,9 @@ "room": 7, "pointer": 3124478, "animal_pointers": [], + "enemies": [ + "Sparky" + ], "default_exits": [ { "room": 8, @@ -9439,10 +11363,13 @@ "unkn2": 10, "x": 296, "y": 136, + "name": "Iceberg 6 - 7 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 6 - Enemy 3 (Sparky)" + ], "music": 12 }, { @@ -9452,6 +11379,7 @@ "room": 8, "pointer": 3110431, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 9, @@ -9459,6 +11387,7 @@ "unkn2": 5, "x": 152, "y": 168, + "name": "Iceberg 6 - 8 Exit 0", "access_rule": [] }, { @@ -9467,6 +11396,7 @@ "unkn2": 5, "x": 296, "y": 136, + "name": "Iceberg 6 - 8 Exit 1", "access_rule": [] } ], @@ -9480,6 +11410,7 @@ "room": 9, "pointer": 3139832, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 10, @@ -9487,6 +11418,7 @@ "unkn2": 10, "x": 296, "y": 136, + "name": "Iceberg 6 - 9 Exit 0", "access_rule": [] } ], @@ -9500,6 +11432,7 @@ "room": 10, "pointer": 3119624, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 11, @@ -9507,6 +11440,7 @@ "unkn2": 5, "x": 152, "y": 168, + "name": "Iceberg 6 - 10 Exit 0", "access_rule": [] } ], @@ -9520,6 +11454,7 @@ "room": 11, "pointer": 3141139, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 12, @@ -9527,6 +11462,7 @@ "unkn2": 10, "x": 296, "y": 136, + "name": "Iceberg 6 - 11 Exit 0", "access_rule": [] } ], @@ -9540,6 +11476,7 @@ "room": 12, "pointer": 3123788, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 13, @@ -9547,6 +11484,7 @@ "unkn2": 5, "x": 136, "y": 168, + "name": "Iceberg 6 - 12 Exit 0", "access_rule": [] } ], @@ -9560,6 +11498,7 @@ "room": 13, "pointer": 3143741, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 14, @@ -9567,6 +11506,7 @@ "unkn2": 10, "x": 296, "y": 136, + "name": "Iceberg 6 - 13 Exit 0", "access_rule": [] } ], @@ -9580,6 +11520,7 @@ "room": 14, "pointer": 3120319, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 15, @@ -9587,6 +11528,7 @@ "unkn2": 5, "x": 136, "y": 168, + "name": "Iceberg 6 - 14 Exit 0", "access_rule": [] } ], @@ -9600,6 +11542,9 @@ "room": 15, "pointer": 3135238, "animal_pointers": [], + "enemies": [ + "Sir Kibble" + ], "default_exits": [ { "room": 16, @@ -9607,10 +11552,13 @@ "unkn2": 10, "x": 296, "y": 136, + "name": "Iceberg 6 - 15 Exit 0", "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 6 - Enemy 4 (Sir Kibble)" + ], "music": 12 }, { @@ -9620,6 +11568,7 @@ "room": 16, "pointer": 3123096, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 17, @@ -9627,6 +11576,7 @@ "unkn2": 5, "x": 136, "y": 168, + "name": "Iceberg 6 - 16 Exit 0", "access_rule": [] } ], @@ -9640,6 +11590,7 @@ "room": 17, "pointer": 3144389, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 18, @@ -9647,6 +11598,7 @@ "unkn2": 10, "x": 296, "y": 136, + "name": "Iceberg 6 - 17 Exit 0", "access_rule": [] } ], @@ -9660,6 +11612,7 @@ "room": 18, "pointer": 3121014, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 19, @@ -9667,6 +11620,7 @@ "unkn2": 5, "x": 136, "y": 168, + "name": "Iceberg 6 - 18 Exit 0", "access_rule": [] } ], @@ -9680,6 +11634,7 @@ "room": 19, "pointer": 3017228, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 20, @@ -9687,6 +11642,7 @@ "unkn2": 10, "x": 296, "y": 136, + "name": "Iceberg 6 - 19 Exit 0", "access_rule": [] } ], @@ -9700,6 +11656,7 @@ "room": 20, "pointer": 3121709, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 21, @@ -9707,6 +11664,7 @@ "unkn2": 5, "x": 136, "y": 168, + "name": "Iceberg 6 - 20 Exit 0", "access_rule": [] } ], @@ -9720,6 +11678,7 @@ "room": 21, "pointer": 3145036, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 22, @@ -9727,6 +11686,7 @@ "unkn2": 10, "x": 296, "y": 136, + "name": "Iceberg 6 - 21 Exit 0", "access_rule": [] } ], @@ -9740,6 +11700,7 @@ "room": 22, "pointer": 3116830, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 23, @@ -9747,6 +11708,7 @@ "unkn2": 5, "x": 136, "y": 152, + "name": "Iceberg 6 - 22 Exit 0", "access_rule": [] } ], @@ -9760,6 +11722,7 @@ "room": 23, "pointer": 3045263, "animal_pointers": [], + "enemies": [], "default_exits": [ { "room": 24, @@ -9767,6 +11730,7 @@ "unkn2": 9, "x": 72, "y": 120, + "name": "Iceberg 6 - 23 Exit 0", "access_rule": [] } ], @@ -9782,6 +11746,7 @@ "room": 24, "pointer": 2889389, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Iceberg 6 - Complete" @@ -9795,6 +11760,7 @@ "room": 0, "pointer": 2980207, "animal_pointers": [], + "enemies": [], "default_exits": [], "locations": [ "Iceberg - Boss (Dedede) Purified", From e0ab02455a88dc14e9651781715d68f29e600354 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 31 Jul 2023 17:14:45 -0500 Subject: [PATCH 087/165] begin work on copy ability shuffle --- worlds/kdl3/Items.py | 13 ++++++ worlds/kdl3/Names/EnemyAbilities.py | 71 ++++++++++++++++++++++++++++- worlds/kdl3/Rules.py | 70 ++++++++++++++++++++-------- worlds/kdl3/__init__.py | 38 +++++++++------ 4 files changed, 156 insertions(+), 36 deletions(-) diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index 0a00704b830d..9a909545c5a4 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -42,6 +42,18 @@ class KDL3Item(Item): "Pitch Spawn": ItemData(None, True) } +copy_ability_access_table = { + "No Ability": ItemData(None, False), + "Burning Ability": ItemData(None, True), + "Stone Ability": ItemData(None, True), + "Ice Ability": ItemData(None, True), + "Needle Ability": ItemData(None, True), + "Clean Ability": ItemData(None, True), + "Parasol Ability": ItemData(None, True), + "Spark Ability": ItemData(None, True), + "Cutter Ability": ItemData(None, True), +} + misc_item_table = { "Heart Star": ItemData(0x770020, True, True), "1-Up": ItemData(0x770021, False), @@ -64,6 +76,7 @@ class KDL3Item(Item): item_table = { **copy_ability_table, + **copy_ability_access_table, **animal_friend_table, **animal_friend_spawn_table, **misc_item_table, diff --git a/worlds/kdl3/Names/EnemyAbilities.py b/worlds/kdl3/Names/EnemyAbilities.py index b3c7db2f9d4e..ab419f87434d 100644 --- a/worlds/kdl3/Names/EnemyAbilities.py +++ b/worlds/kdl3/Names/EnemyAbilities.py @@ -351,7 +351,7 @@ Iceberg_6_E3 = "Iceberg 6 - Enemy 3 (Sparky)" Iceberg_6_E4 = "Iceberg 6 - Enemy 4 (Sir Kibble)" -vanilla_abilities = { +enemy_mapping = { Grass_Land_1_E1: "Waddle Dee", Grass_Land_1_E2: "Sir Kibble", Grass_Land_1_E3: "Cappy", @@ -705,3 +705,72 @@ Iceberg_6_E3: "Sparky", Iceberg_6_E4: "Sir Kibble", } + +vanilla_enemies = {'Waddle Dee': 'No Ability', + 'Bronto Burt': 'No Ability', + 'Rocky': 'Stone Ability', + 'Bobo': 'Burning Ability', + 'Chilly': 'Ice Ability', + 'Poppy Bros Jr.': 'No Ability', + 'Sparky': 'Spark Ability', + 'Polof': 'No Ability', + 'Broom Hatter': 'Clean Ability', + 'Cappy': 'No Ability', + 'Bouncy': 'No Ability', + 'Nruff': 'No Ability', + 'Glunk': 'No Ability', + 'Togezo': 'Needle Ability', + 'Kabu': 'No Ability', + 'Mony': 'No Ability', + 'Blipper': 'No Ability', + 'Squishy': 'No Ability', + 'Gabon': 'No Ability', + 'Oro': 'No Ability', + 'Galbo': 'Burning Ability', + 'Sir Kibble': 'Cutter Ability', + 'Nidoo': 'No Ability', + 'Kany': 'No Ability', + 'Sasuke': 'Parasol Ability', + 'Yaban': 'No Ability', + 'Boten': 'Needle Ability', + 'Coconut': 'No Ability', + 'Doka': 'No Ability', + 'Icicle': 'No Ability', + 'Pteran': 'No Ability', + 'Loud': 'No Ability', + 'Como': 'No Ability', + 'Klinko': 'Parasol Ability', + 'Babut': 'No Ability', + 'Wappa': 'Ice Ability', + 'Mariel': 'No Ability', + 'Tick': 'Needle Ability', + 'Apolo': 'No Ability', + 'Popon Ball': 'No Ability', + 'KeKe': 'Clean Ability', + 'Magoo': 'Burning Ability', + 'Raft Waddle Dee': 'No Ability', + 'Madoo': 'No Ability', + 'Corori': 'No Ability', + 'Kapar': 'Cutter Ability', + 'Batamon': 'No Ability', + 'Peran': 'No Ability', + 'Bobin': 'Spark Ability', + 'Mopoo': 'No Ability', + 'Gansan': 'Stone Ability', + 'Bukiset (Burning)': 'Burning Ability', + 'Bukiset (Stone)': 'Stone Ability', + 'Bukiset (Ice)': 'Ice Ability', + 'Bukiset (Needle)': 'Needle Ability', + 'Bukiset (Clean)': 'Clean Ability', + 'Bukiset (Parasol)': 'Parasol Ability', + 'Bukiset (Spark)': 'Spark Ability', + 'Bukiset (Cutter)': 'Cutter Ability', + 'Waddle Dee Drawing': 'No Ability', + 'Bronto Burt Drawing': 'No Ability', + 'Bouncy Drawing': 'No Ability', + 'Kabu (Dekabu)': 'No Ability', + 'Wapod': 'No Ability', + 'Propeller': 'No Ability', + 'Dogon': 'No Ability', + 'Joe': 'No Ability' + } diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 19393ea347a2..2d34ed2db92c 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -16,9 +16,9 @@ def can_reach_level(state: "CollectionState", player: int, level: int, open_worl return True else: if open_world: - return state.has(f"{LocationName.level_names_inverse[level-1]} - Stage Completion", player, ow_boss_req) + return state.has(f"{LocationName.level_names_inverse[level - 1]} - Stage Completion", player, ow_boss_req) else: - return state.has(f"{LocationName.level_names_inverse[level-1]} 6 - Stage Completion", player) + return state.has(f"{LocationName.level_names_inverse[level - 1]} 6 - Stage Completion", player) def can_reach_rick(state: "CollectionState", player: int) -> bool: @@ -45,13 +45,44 @@ def can_reach_pitch(state: "CollectionState", player: int) -> bool: return state.has("Pitch", player) and state.has("Pitch Spawn", player) -def set_rules(world: "KDL3World") -> None: +def can_reach_burning(state: "CollectionState", player: int) -> bool: + return state.has("Burning", player) and state.has("Burning Ability", player) + + +def can_reach_stone(state: "CollectionState", player: int) -> bool: + return state.has("Stone", player) and state.has("Stone Ability", player) + + +def can_reach_ice(state: "CollectionState", player: int) -> bool: + return state.has("Ice", player) and state.has("Ice Ability", player) + + +def can_reach_needle(state: "CollectionState", player: int) -> bool: + return state.has("Needle", player) and state.has("Needle Ability", player) + + +def can_reach_clean(state: "CollectionState", player: int) -> bool: + return state.has("Clean", player) and state.has("Clean Ability", player) + +def can_reach_parasol(state: "CollectionState", player: int) -> bool: + return state.has("Parasol", player) and state.has("Parasol Ability", player) + + +def can_reach_spark(state: "CollectionState", player: int) -> bool: + return state.has("Spark", player) and state.has("Spark Ability", player) + + +def can_reach_cutter(state: "CollectionState", player: int) -> bool: + return state.has("Cutter", player) and state.has("Cutter Ability", player) + + +def set_rules(world: "KDL3World") -> None: # Level 1 add_rule(world.multiworld.get_location(LocationName.grass_land_muchi, world.player), lambda state: can_reach_chuchu(state, world.player)) add_rule(world.multiworld.get_location(LocationName.grass_land_chao, world.player), - lambda state: state.has("Stone", world.player)) + lambda state: can_reach_stone(state, world.player)) add_rule(world.multiworld.get_location(LocationName.grass_land_mine, world.player), lambda state: can_reach_kine(state, world.player)) @@ -66,7 +97,7 @@ def set_rules(world: "KDL3World") -> None: lambda state: state.has("Needle", world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_mama_pitch, world.player), lambda state: can_reach_pitch(state, world.player) and can_reach_kine(state, world.player) - and state.has("Burning", world.player) and state.has("Stone", world.player)) + and state.has("Burning", world.player) and can_reach_stone(state, world.player)) # Level 3 add_rule(world.multiworld.get_location(LocationName.sand_canyon_5, world.player), @@ -74,24 +105,24 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.sand_canyon_auntie, world.player), lambda state: state.has("Clean", world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_nyupun, world.player), - lambda state: state.has("ChuChu", world.player) and state.has("Cutter", world.player)) + lambda state: can_reach_chuchu(state, world.player) and state.has("Cutter", world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_rob, world.player), - lambda state: (state.has("Kine", world.player) and state.has("Coo", world.player)) + lambda state: (can_reach_kine(state, world.player) and can_reach_coo(state, world.player)) and state.has("Parasol", world.player) - and state.has("Stone", world.player) + and can_reach_stone(state, world.player) and (state.has("Clean", world.player) or state.has("Spark", world.player)) and (state.has("Ice", world.player) or state.has("Needle", world.player)) ) # Level 4 add_rule(world.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, world.player), - lambda state: state.has("Coo", world.player) and state.has("Clean", world.player)) + lambda state: can_reach_coo(state, world.player) and state.has("Clean", world.player)) add_rule(world.multiworld.get_location(LocationName.cloudy_park_piyokeko, world.player), lambda state: state.has("Needle", world.player)) add_rule(world.multiworld.get_location(LocationName.cloudy_park_mikarin, world.player), - lambda state: state.has("Coo", world.player)) + lambda state: can_reach_coo(state, world.player)) add_rule(world.multiworld.get_location(LocationName.cloudy_park_pick, world.player), - lambda state: state.has("Rick", world.player)) + lambda state: can_reach_rick(state, world.player)) # Level 5 add_rule(world.multiworld.get_location(LocationName.iceberg_4, world.player), @@ -101,15 +132,14 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.iceberg_samus, world.player), lambda state: state.has("Ice", world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_name, world.player), - lambda state: state.has("Coo", world.player) and state.has("Burning", world.player) - and state.has("ChuChu", world.player) and can_reach_coo(state, world.player)) + lambda state: can_reach_coo(state, world.player) and state.has("Burning", world.player) + and state.has("ChuChu", world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_shiro, world.player), lambda state: can_reach_nago(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_angel, world.player), lambda state: state.has_all([ability for ability in copy_ability_table.keys()], world.player)) # cleaner than writing out 8 ands - # Consumables if world.multiworld.consumables[world.player]: add_rule(world.multiworld.get_location(LocationName.grass_land_1_u1, world.player), @@ -125,17 +155,17 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.ripple_field_3_u1, world.player), lambda state: state.has("Cutter", world.player) or state.has("Spark", world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_4_u1, world.player), - lambda state: state.has("Stone", world.player)) + lambda state: can_reach_stone(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_4_m2, world.player), - lambda state: state.has("Stone", world.player)) + lambda state: can_reach_stone(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_5_m1, world.player), lambda state: state.has("Kine", world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_5_u1, world.player), lambda state: state.has("Kine", world.player) - and state.has("Burning", world.player) and state.has("Stone", world.player)) + and state.has("Burning", world.player) and can_reach_stone(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_5_m2, world.player), lambda state: state.has("Kine", world.player) - and state.has("Burning", world.player) and state.has("Stone", world.player)) + and state.has("Burning", world.player) and can_reach_stone(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_u1, world.player), lambda state: state.has("Clean", world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_m2, world.player), @@ -157,12 +187,12 @@ def set_rules(world: "KDL3World") -> None: range(1, 6)): set_rule(world.multiworld.get_location(boss_flag, world.player), lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[world.player][i - 1]) - and can_reach_level(state, world.player, i+1, + and can_reach_level(state, world.player, i + 1, world.multiworld.open_world[world.player], world.multiworld.ow_boss_requirement[world.player])) set_rule(world.multiworld.get_location(purification, world.player), lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[world.player][i - 1]) - and can_reach_level(state, world.player, i+1, + and can_reach_level(state, world.player, i + 1, world.multiworld.open_world[world.player], world.multiworld.ow_boss_requirement[world.player])) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index b682eafa0b5e..c85ef12a68df 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -5,9 +5,10 @@ from Fill import fill_restrictive from worlds.AutoWorld import World, WebWorld from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item, \ - trap_item_table + trap_item_table, copy_ability_access_table from .Locations import location_table, KDL3Location, level_consumables, consumable_locations from .Names.AnimalFriendSpawns import animal_friend_spawns +from .Names.EnemyAbilities import vanilla_enemies, enemy_mapping from .Regions import create_levels from .Options import kdl3_options from .Names import LocationName @@ -22,10 +23,11 @@ import base64 from Main import __version__ as APVersion from worlds.LauncherComponents import components + logger = logging.getLogger("Kirby's Dream Land 3") -#SNIComponent = next(x for x in components if x.display_name == "SNI Client") -#SNIComponent.file_identifier.suffixes.append(".apkdl3") +# SNIComponent = next(x for x in components if x.display_name == "SNI Client") +# SNIComponent.file_identifier.suffixes.append(".apkdl3") if APVersion == "0.4.2": import settings @@ -81,6 +83,7 @@ def __init__(self, world: MultiWorld, player: int): self.rom_name = None self.rom_name_available_event = threading.Event() super().__init__(world, player) + self.copy_abilities = vanilla_enemies.copy() @classmethod def stage_assert_generate(cls, multiworld: MultiWorld) -> None: @@ -120,39 +123,44 @@ def generate_early(self) -> None: def pre_fill(self) -> None: # fill animals if self.multiworld.animal_randomization[self.player] != 0: + spawns = [animal for animal in animal_friend_spawns.keys() if + animal not in ["Ripple Field 5 - Animal 2", "Iceberg 4 - Animal 1"]] self.multiworld.get_location("Iceberg 4 - Animal 1", self.player) \ .place_locked_item(self.create_item("ChuChu Spawn")) # Not having ChuChu here makes the room impossible (since only she has vertical burning) - if self.multiworld.accessibility[self.player] < 2: - self.multiworld.get_location("Ripple Field 5 - Animal 2", self.player) \ - .place_locked_item(self.create_item("Pitch Spawn")) - # Ripple Field 5 - Animal 2 needs to be Pitch to ensure accessibility on non-minimal and non-door rando + self.multiworld.get_location("Ripple Field 5 - Animal 2", self.player) \ + .place_locked_item(self.create_item("Pitch Spawn")) + # Ripple Field 5 - Animal 2 needs to be Pitch to ensure accessibility on non-door rando if self.multiworld.animal_randomization[self.player] == 1: animal_pool = [animal_friend_spawns[spawn] for spawn in animal_friend_spawns if spawn not in ["Ripple Field 5 - Animal 2", "Iceberg 4 - Animal 1"]] - if self.multiworld.accessibility[self.player] == 2: - animal_pool.append("Pitch Spawn") else: animal_base = ["Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn"] animal_pool = [self.multiworld.per_slot_randoms[self.player].choice(animal_base) - for _ in range(len(animal_friend_spawns) - - (7 if self.multiworld.accessibility[self.player] < 2 else 6))] + for _ in range(len(animal_friend_spawns) - 8)] # have to guarantee one of each animal animal_pool.extend(animal_base) self.multiworld.per_slot_randoms[self.player].shuffle( animal_pool) # TODO: change to world.random once 0.4.1 support is deprecated - locations = [self.multiworld.get_location(animal, self.player) for animal in animal_friend_spawns.keys()] + locations = [self.multiworld.get_location(spawn, self.player) for spawn in spawns] items = [self.create_item(animal) for animal in animal_pool] fill_restrictive(self.multiworld, self.multiworld.get_all_state(False), locations, items) else: animal_friends = animal_friend_spawns.copy() for animal in animal_friends: - self.multiworld.get_location(animal, self.player)\ + self.multiworld.get_location(animal, self.player) \ .place_locked_item(self.create_item(animal_friends[animal])) - # if self.multiworld.copy_ability_randomization[self.player]: - + if self.multiworld.copy_ability_randomization[self.player]: + # randomize copy abilities + valid_abilities = list(copy_ability_access_table.keys()) + for enemy in self.copy_abilities: + self.copy_abilities[enemy] = self.multiworld.per_slot_randoms[self.player]\ + .choice(valid_abilities) + for enemy in enemy_mapping: + self.multiworld.get_location(enemy, self.player) \ + .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) def create_items(self) -> None: itempool = [] From d915aa705678b4cd9da374c36fe8887abbae6622 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 2 Aug 2023 01:06:12 -0500 Subject: [PATCH 088/165] add miniboss ability rando, tests --- worlds/kdl3/Names/EnemyAbilities.py | 48 ++++++++++- worlds/kdl3/Rom.py | 61 +++++++++++-- worlds/kdl3/Room.py | 4 +- worlds/kdl3/Rules.py | 114 ++++++++++++++++--------- worlds/kdl3/__init__.py | 41 +++++++-- worlds/kdl3/data/Rooms.json | 47 +++++++--- worlds/kdl3/test/TestLocations.py | 3 + worlds/kdl3/test/TestShuffles.py | 128 ++++++++++++++++++++++++++++ 8 files changed, 379 insertions(+), 67 deletions(-) create mode 100644 worlds/kdl3/test/TestShuffles.py diff --git a/worlds/kdl3/Names/EnemyAbilities.py b/worlds/kdl3/Names/EnemyAbilities.py index ab419f87434d..4e6a8063a72e 100644 --- a/worlds/kdl3/Names/EnemyAbilities.py +++ b/worlds/kdl3/Names/EnemyAbilities.py @@ -1,3 +1,5 @@ +from typing import List, Tuple, Set + Grass_Land_1_E1 = "Grass Land 1 - Enemy 1 (Waddle Dee)" Grass_Land_1_E2 = "Grass Land 1 - Enemy 2 (Sir Kibble)" Grass_Land_1_E3 = "Grass Land 1 - Enemy 3 (Cappy)" @@ -350,6 +352,18 @@ Iceberg_6_E2 = "Iceberg 6 - Enemy 2 (Nidoo)" Iceberg_6_E3 = "Iceberg 6 - Enemy 3 (Sparky)" Iceberg_6_E4 = "Iceberg 6 - Enemy 4 (Sir Kibble)" +Grass_Land_4_M1 = "Grass Land 4 - Miniboss 1 (Boboo)" +Ripple_Field_4_M1 = "Ripple Field 4 - Miniboss 1 (Captain Stitch)" +Sand_Canyon_4_M1 = "Sand Canyon 4 - Miniboss 1 (Haboki)" +Cloudy_Park_4_M1 = "Cloudy Park 4 - Miniboss 1 (Jumper Shoot)" +Iceberg_4_M1 = "Iceberg 4 - Miniboss 1 (Yuki)" +Iceberg_6_M1 = "Iceberg 6 - Miniboss 1 (Blocky)" +Iceberg_6_M2 = "Iceberg 6 - Miniboss 2 (Jumper Shoot)" +Iceberg_6_M3 = "Iceberg 6 - Miniboss 3 (Yuki)" +Iceberg_6_M4 = "Iceberg 6 - Miniboss 4 (Haboki)" +Iceberg_6_M5 = "Iceberg 6 - Miniboss 5 (Boboo)" +Iceberg_6_M6 = "Iceberg 6 - Miniboss 6 (Captain Stitch)" + enemy_mapping = { Grass_Land_1_E1: "Waddle Dee", @@ -704,6 +718,18 @@ Iceberg_6_E2: "Nidoo", Iceberg_6_E3: "Sparky", Iceberg_6_E4: "Sir Kibble", + Grass_Land_4_M1: "Boboo", + Ripple_Field_4_M1: "Captain Stitch", + Sand_Canyon_4_M1: "Haboki", + Cloudy_Park_4_M1: "Jumper Shoot", + Iceberg_4_M1: "Yuki", + Iceberg_6_M1: "Blocky", + Iceberg_6_M2: "Jumper Shoot", + Iceberg_6_M3: "Yuki", + Iceberg_6_M4: "Haboki", + Iceberg_6_M5: "Boboo", + Iceberg_6_M6: "Captain Stitch", + } vanilla_enemies = {'Waddle Dee': 'No Ability', @@ -772,5 +798,25 @@ 'Wapod': 'No Ability', 'Propeller': 'No Ability', 'Dogon': 'No Ability', - 'Joe': 'No Ability' + 'Joe': 'No Ability', + 'Captain Stitch': 'Needle Ability', + 'Yuki': 'Ice Ability', + 'Blocky': 'Stone Ability', + 'Jumper Shoot': 'Parasol Ability', + 'Boboo': 'Burning Ability', + 'Haboki': 'Clean Ability', } + +enemy_restrictive: List[Tuple[Set, Set]] = [ + # abilities, enemies, set_all (False to set any) + ({"Burning Ability", "Stone Ability"}, {"Rocky", "Sparky", "Babut", "Squishy", }), # Ribbon Field 5 - 7 + # Sand Canyon 6 + ({"Parasol Ability", "Cutter Ability"}, {'Bukiset (Parasol)', 'Bukiset (Cutter)'}), + ({"Spark Ability", "Clean Ability"}, {'Bukiset (Spark)', 'Bukiset (Clean)'}), + ({"Ice Ability", "Needle Ability"}, {'Bukiset (Ice)', 'Bukiset (Needle)'}), + ({"Stone Ability", "Burning Ability"}, {'Bukiset (Stone)', 'Bukiset (Burning)'}), + ({"Stone Ability"}, {'Bukiset (Burning)', 'Bukiset (Stone)', 'Bukiset (Ice)', 'Bukiset (Needle)', + 'Bukiset (Clean)', 'Bukiset (Spark)', 'Bukiset (Parasol)', 'Bukiset (Cutter)'}), + ({"Parasol Ability"}, {'Bukiset (Burning)', 'Bukiset (Stone)', 'Bukiset (Ice)', 'Bukiset (Needle)', + 'Bukiset (Clean)', 'Bukiset (Spark)', 'Bukiset (Parasol)', 'Bukiset (Cutter)'}), +] diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 23f060f0b9f6..a5d7d83ea5f6 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -231,6 +231,26 @@ "Joe": 91 } +miniboss_remap = { + "Captain Stitch": 0, + "Yuki": 1, + "Blocky": 2, + "Jumper Shoot": 3, + "Boboo": 4, + "Haboki": 5 +} + +ability_remap = { + "No Ability": 0, + "Burning Ability": 1, + "Stone Ability": 2, + "Ice Ability": 3, + "Needle Ability": 4, + "Clean Ability": 5, + "Parasol Ability": 6, + "Spark Ability": 7, + "Cutter Ability": 8, +} class RomData: def __init__(self, file: str, name: typing.Optional[str] = None): @@ -344,7 +364,8 @@ def patch(self, target: str): rom.write_to_file(target) -def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, shuffled_levels, bb_boss_enabled): +def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, + shuffled_levels, bb_boss_enabled, copy_abilities): # increase BWRAM by 0x8000 rom.write_byte(0x7FD8, 0x06) @@ -1045,6 +1066,7 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0x6B, # RTL ]) + rooms = [region for region in multiworld.regions if region.player == player and isinstance(region, Room)] if multiworld.music_shuffle[player] > 0: if multiworld.music_shuffle[player] == 1: shuffled_music = music_choices.copy() @@ -1054,9 +1076,8 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, music_map[5] = multiworld.per_slot_randoms[player].choice(music_choices) # Heart Star music doesn't work on regular stages music_map[8] = multiworld.per_slot_randoms[player].choice(music_choices) - for room in [region for region in multiworld.regions if - region.player == player and isinstance(region, Room)]: - room.patch(rom) + for room in rooms: + room.music = music_map[room.music] for room in room_pointers: old_music = rom.read_byte(room + 2) rom.write_byte(room + 2, music_map[old_music]) @@ -1070,6 +1091,8 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x4A388, music_map[0x08]) rom.write_byte(0x4A38D, music_map[0x1D]) elif multiworld.music_shuffle[player] == 2: + for room in rooms: + room.music = multiworld.per_slot_randoms[player].choice(music_choices) for room in room_pointers: rom.write_byte(room + 2, multiworld.per_slot_randoms[player].choice(music_choices)) for i in range(5): @@ -1081,6 +1104,9 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x4A388, multiworld.per_slot_randoms[player].choice(music_choices)) rom.write_byte(0x4A38D, multiworld.per_slot_randoms[player].choice(music_choices)) + for room in rooms: + room.patch(rom) + if multiworld.virtual_console[player] in [1, 3]: # Flash Reduction rom.write_byte(0x9AE68, 0x10) @@ -1121,7 +1147,32 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(0x3F0000 + (level_pointers[0x770200 + i]), struct.pack("I", bb_bosses[0x770200 + i])) # copy ability shuffle - # copy ability array at 0xB3CAC + if multiworld.copy_ability_randomization[player] > 0: + for enemy in copy_abilities: + if enemy in miniboss_remap: + rom.write_bytes(0xB417E + (miniboss_remap[enemy] << 1), struct.pack("H", ability_remap[copy_abilities[enemy]])) + else: + rom.write_bytes(0xB3CAC + (enemy_remap[enemy] << 1), struct.pack("H", ability_remap[copy_abilities[enemy]])) + # following only needs done on non-door rando + # incredibly lucky this follows the same order (including 5E == star block) + rom.write_byte(0x2F77EA, 0x5E + (ability_remap[copy_abilities["Sparky"]] << 1)) + rom.write_byte(0x2F7811, 0x5E + (ability_remap[copy_abilities["Sparky"]] << 1)) + rom.write_byte(0x2F9BC4, 0x5E + (ability_remap[copy_abilities["Blocky"]] << 1)) + rom.write_byte(0x2F9BEB, 0x5E + (ability_remap[copy_abilities["Blocky"]] << 1)) + rom.write_byte(0x2FAC06, 0x5E + (ability_remap[copy_abilities["Jumper Shoot"]] << 1)) + rom.write_byte(0x2FAC2D, 0x5E + (ability_remap[copy_abilities["Jumper Shoot"]] << 1)) + rom.write_byte(0x2F9E7B, 0x5E + (ability_remap[copy_abilities["Yuki"]] << 1)) + rom.write_byte(0x2F9EA2, 0x5E + (ability_remap[copy_abilities["Yuki"]] << 1)) + rom.write_byte(0x2FA951, 0x5E + (ability_remap[copy_abilities["Sir Kibble"]] << 1)) + rom.write_byte(0x2FA978, 0x5E + (ability_remap[copy_abilities["Sir Kibble"]] << 1)) + rom.write_byte(0x2FA132, 0x5E + (ability_remap[copy_abilities["Haboki"]] << 1)) + rom.write_byte(0x2FA159, 0x5E + (ability_remap[copy_abilities["Haboki"]] << 1)) + rom.write_byte(0x2FA3E8, 0x5E + (ability_remap[copy_abilities["Boboo"]] << 1)) + rom.write_byte(0x2FA40F, 0x5E + (ability_remap[copy_abilities["Boboo"]] << 1)) + rom.write_byte(0x2F90E2, 0x5E + (ability_remap[copy_abilities["Captain Stitch"]] << 1)) + rom.write_byte(0x2F9109, 0x5E + (ability_remap[copy_abilities["Captain Stitch"]] << 1)) + + # write jumping goal rom.write_bytes(0x94F8, struct.pack("H", multiworld.jumping_target[player])) diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index 694752bd3b46..ea2ec47ec11d 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -40,10 +40,10 @@ def __init__(self, name, player, multiworld, hint, level, stage, room, pointer, def patch(self, rom: "RomData"): rom.write_byte(self.pointer + 2, self.music) - animals = [x.item for x in self.locations if "Animal" in x.name] + animals = [x.item.name for x in self.locations if "Animal" in x.name] if len(animals) > 0: for current_animal, address in zip(animals, self.animal_pointers): - rom.write_byte(address + 7, animal_map[animals[current_animal]]) + rom.write_byte(self.pointer + address + 7, animal_map[current_animal]) room_data = [ diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 2d34ed2db92c..c320728302df 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -1,6 +1,6 @@ from worlds.generic.Rules import set_rule, add_rule from .Locations import location_table, level_consumables -from .Names import LocationName, AnimalFriendSpawns +from .Names import LocationName, EnemyAbilities from .Items import copy_ability_table import typing from BaseClasses import MultiWorld @@ -9,7 +9,6 @@ from . import KDL3World from BaseClasses import CollectionState - def can_reach_level(state: "CollectionState", player: int, level: int, open_world: bool, ow_boss_req: int): if level == 1: @@ -77,6 +76,44 @@ def can_reach_cutter(state: "CollectionState", player: int) -> bool: return state.has("Cutter", player) and state.has("Cutter Ability", player) +ability_map = { + "Burning Ability": can_reach_burning, + "Stone Ability": can_reach_stone, + "Ice Ability": can_reach_ice, + "Needle Ability": can_reach_needle, + "Clean Ability": can_reach_clean, + "Parasol Ability": can_reach_parasol, + "Spark Ability": can_reach_spark, + "Cutter Ability": can_reach_cutter, +} + + +def can_assemble_rob(state: "CollectionState", player: int, copy_abilities: typing.Dict[str,str]): + # check animal requirements + if not can_reach_coo(state, player) and can_reach_kine(state, player): + return False + # now we need to get our bukisets + bukisets = {enemy: copy_abilities[enemy] for enemy in copy_abilities if "Bukiset" in enemy} + # probably some cleaner way to handle this + room1 = EnemyAbilities.enemy_restrictive[1] + room2 = EnemyAbilities.enemy_restrictive[2] + room3 = EnemyAbilities.enemy_restrictive[3] + room4 = EnemyAbilities.enemy_restrictive[4] + for abilities, bukisets in [room1, room2, room3, room4]: + iterator = iter(x for x in bukisets if copy_abilities[x] in abilities) + target_bukiset = next(iterator, None) + can_reach = False + while target_bukiset is not None: + can_reach = can_reach | ability_map[copy_abilities[target_bukiset]](state, player) + target_bukiset = next(iterator, None) + if not can_reach: + return False + # now the known needed abilities + return can_reach_parasol(state, player) and can_reach_stone(state, player) + + + + def set_rules(world: "KDL3World") -> None: # Level 1 add_rule(world.multiworld.get_location(LocationName.grass_land_muchi, world.player), @@ -90,35 +127,31 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.ripple_field_5, world.player), lambda state: can_reach_kine(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_kamuribana, world.player), - lambda state: can_reach_pitch(state, world.player) and state.has("Clean", world.player)) + lambda state: can_reach_pitch(state, world.player) and can_reach_clean(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_bakasa, world.player), - lambda state: can_reach_kine(state, world.player) and state.has("Parasol", world.player)) + lambda state: can_reach_kine(state, world.player) and can_reach_parasol(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_toad, world.player), - lambda state: state.has("Needle", world.player)) + lambda state: can_reach_needle(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_mama_pitch, world.player), lambda state: can_reach_pitch(state, world.player) and can_reach_kine(state, world.player) - and state.has("Burning", world.player) and can_reach_stone(state, world.player)) + and can_reach_burning(state, world.player) and can_reach_stone(state, world.player)) # Level 3 add_rule(world.multiworld.get_location(LocationName.sand_canyon_5, world.player), - lambda state: state.has("Cutter", world.player)) + lambda state: can_reach_cutter(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_auntie, world.player), - lambda state: state.has("Clean", world.player)) + lambda state: can_reach_clean(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_nyupun, world.player), - lambda state: can_reach_chuchu(state, world.player) and state.has("Cutter", world.player)) + lambda state: can_reach_chuchu(state, world.player) and can_reach_cutter(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_rob, world.player), - lambda state: (can_reach_kine(state, world.player) and can_reach_coo(state, world.player)) - and state.has("Parasol", world.player) - and can_reach_stone(state, world.player) - and (state.has("Clean", world.player) or state.has("Spark", world.player)) - and (state.has("Ice", world.player) or state.has("Needle", world.player)) + lambda state: can_assemble_rob(state, world.player, world.copy_abilities) ) # Level 4 add_rule(world.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, world.player), - lambda state: can_reach_coo(state, world.player) and state.has("Clean", world.player)) + lambda state: can_reach_coo(state, world.player) and can_reach_clean(state, world.player)) add_rule(world.multiworld.get_location(LocationName.cloudy_park_piyokeko, world.player), - lambda state: state.has("Needle", world.player)) + lambda state: can_reach_needle(state, world.player)) add_rule(world.multiworld.get_location(LocationName.cloudy_park_mikarin, world.player), lambda state: can_reach_coo(state, world.player)) add_rule(world.multiworld.get_location(LocationName.cloudy_park_pick, world.player), @@ -126,14 +159,15 @@ def set_rules(world: "KDL3World") -> None: # Level 5 add_rule(world.multiworld.get_location(LocationName.iceberg_4, world.player), - lambda state: state.has("Burning", world.player)) + lambda state: can_reach_burning(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_kogoesou, world.player), - lambda state: state.has("Burning", world.player)) + lambda state: can_reach_burning(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_samus, world.player), - lambda state: state.has("Ice", world.player)) + lambda state: can_reach_ice(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_name, world.player), - lambda state: can_reach_coo(state, world.player) and state.has("Burning", world.player) - and state.has("ChuChu", world.player)) + lambda state: can_reach_coo(state, world.player) and can_reach_burning(state, world.player) + and can_reach_chuchu(state, world.player)) + # ChuChu is guaranteed here, but we use this for consistency add_rule(world.multiworld.get_location(LocationName.iceberg_shiro, world.player), lambda state: can_reach_nago(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_angel, world.player), @@ -143,41 +177,45 @@ def set_rules(world: "KDL3World") -> None: # Consumables if world.multiworld.consumables[world.player]: add_rule(world.multiworld.get_location(LocationName.grass_land_1_u1, world.player), - lambda state: state.has("Parasol", world.player)) + lambda state: can_reach_parasol(state, world.player)) add_rule(world.multiworld.get_location(LocationName.grass_land_1_m1, world.player), - lambda state: state.has("Spark", world.player)) + lambda state: can_reach_spark(state, world.player)) add_rule(world.multiworld.get_location(LocationName.grass_land_2_u1, world.player), - lambda state: state.has("Needle", world.player)) + lambda state: can_reach_needle(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_2_u1, world.player), - lambda state: state.has("Kine", world.player)) + lambda state: can_reach_kine(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_2_m1, world.player), - lambda state: state.has("Kine", world.player)) + lambda state: can_reach_kine(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_3_u1, world.player), - lambda state: state.has("Cutter", world.player) or state.has("Spark", world.player)) + lambda state: can_reach_cutter(state, world.player) or can_reach_spark(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_4_u1, world.player), lambda state: can_reach_stone(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_4_m2, world.player), lambda state: can_reach_stone(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_5_m1, world.player), - lambda state: state.has("Kine", world.player)) + lambda state: can_reach_kine(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_5_u1, world.player), - lambda state: state.has("Kine", world.player) - and state.has("Burning", world.player) and can_reach_stone(state, world.player)) + lambda state: can_reach_kine(state, world.player) + and can_reach_burning(state, world.player) and can_reach_stone(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_5_m2, world.player), - lambda state: state.has("Kine", world.player) - and state.has("Burning", world.player) and can_reach_stone(state, world.player)) + lambda state: can_reach_kine(state, world.player) + and can_reach_burning(state, world.player) and can_reach_stone(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_u1, world.player), - lambda state: state.has("Clean", world.player)) + lambda state: can_reach_clean(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_m2, world.player), - lambda state: state.has("Needle", world.player)) + lambda state: can_reach_needle(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u2, world.player), - lambda state: state.has("Ice", world.player) and state.has("Rick", world.player)) + lambda state: can_reach_ice(state, world.player) and can_reach_rick(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u3, world.player), - lambda state: state.has("Ice", world.player) and state.has("Rick", world.player)) + lambda state: can_reach_ice(state, world.player) and can_reach_rick(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u4, world.player), - lambda state: state.has("Ice", world.player) and state.has("Rick", world.player)) + lambda state: can_reach_ice(state, world.player) and can_reach_rick(state, world.player)) add_rule(world.multiworld.get_location(LocationName.cloudy_park_6_u1, world.player), - lambda state: state.has("Cutter", world.player)) + lambda state: can_reach_cutter(state, world.player)) + + # copy ability access edge cases + # water locked: all mony, joe, and some blipper/glunk/squishy + # sand canyon 4 all for boss_flag, purification, i in zip(["Level 1 Boss", "Level 2 Boss", "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index c85ef12a68df..18448be11e87 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -8,7 +8,7 @@ trap_item_table, copy_ability_access_table from .Locations import location_table, KDL3Location, level_consumables, consumable_locations from .Names.AnimalFriendSpawns import animal_friend_spawns -from .Names.EnemyAbilities import vanilla_enemies, enemy_mapping +from .Names.EnemyAbilities import vanilla_enemies, enemy_mapping, enemy_restrictive from .Regions import create_levels from .Options import kdl3_options from .Names import LocationName @@ -124,24 +124,30 @@ def pre_fill(self) -> None: # fill animals if self.multiworld.animal_randomization[self.player] != 0: spawns = [animal for animal in animal_friend_spawns.keys() if - animal not in ["Ripple Field 5 - Animal 2", "Iceberg 4 - Animal 1"]] + animal not in ["Ripple Field 5 - Animal 2", "Sand Canyon 6 - Animal 1", "Iceberg 4 - Animal 1"]] self.multiworld.get_location("Iceberg 4 - Animal 1", self.player) \ .place_locked_item(self.create_item("ChuChu Spawn")) # Not having ChuChu here makes the room impossible (since only she has vertical burning) self.multiworld.get_location("Ripple Field 5 - Animal 2", self.player) \ .place_locked_item(self.create_item("Pitch Spawn")) + guaranteed_animal = self.multiworld.per_slot_randoms[self.player].choice(["Kine Spawn", "Coo Spawn"]) + self.multiworld.get_location("Sand Canyon 6 - Animal 1", self.player) \ + .place_locked_item(self.create_item(guaranteed_animal)) # Ripple Field 5 - Animal 2 needs to be Pitch to ensure accessibility on non-door rando if self.multiworld.animal_randomization[self.player] == 1: animal_pool = [animal_friend_spawns[spawn] for spawn in animal_friend_spawns - if spawn not in ["Ripple Field 5 - Animal 2", "Iceberg 4 - Animal 1"]] + if spawn not in ["Ripple Field 5 - Animal 2", "Sand Canyon 6 - Animal 1", + "Iceberg 4 - Animal 1"]] else: animal_base = ["Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn"] animal_pool = [self.multiworld.per_slot_randoms[self.player].choice(animal_base) - for _ in range(len(animal_friend_spawns) - 8)] + for _ in range(len(animal_friend_spawns) - 9)] # have to guarantee one of each animal animal_pool.extend(animal_base) - self.multiworld.per_slot_randoms[self.player].shuffle( - animal_pool) # TODO: change to world.random once 0.4.1 support is deprecated + if guaranteed_animal == "Kine Spawn": + animal_pool.append("Coo Spawn") + else: + animal_pool.append("Kine Spawn") locations = [self.multiworld.get_location(spawn, self.player) for spawn in spawns] items = [self.create_item(animal) for animal in animal_pool] fill_restrictive(self.multiworld, self.multiworld.get_all_state(False), locations, items) @@ -154,8 +160,24 @@ def pre_fill(self) -> None: if self.multiworld.copy_ability_randomization[self.player]: # randomize copy abilities valid_abilities = list(copy_ability_access_table.keys()) - for enemy in self.copy_abilities: - self.copy_abilities[enemy] = self.multiworld.per_slot_randoms[self.player]\ + enemies_to_set = list(self.copy_abilities.keys()) + # now for the edge cases + for abilities, enemies in enemy_restrictive: + available_enemies = list() + for enemy in enemies: + if enemy not in enemies_to_set: + if self.copy_abilities[enemy] in abilities: + break + else: + available_enemies.append(enemy) + else: + chosen_enemy = self.multiworld.per_slot_randoms[self.player].choice(available_enemies) + chosen_ability = self.multiworld.per_slot_randoms[self.player].choice(tuple(abilities)) + self.copy_abilities[chosen_enemy] = chosen_ability + enemies_to_set.remove(chosen_enemy) + # place remaining + for enemy in enemies_to_set: + self.copy_abilities[enemy] = self.multiworld.per_slot_randoms[self.player] \ .choice(valid_abilities) for enemy in enemy_mapping: @@ -238,7 +260,8 @@ def generate_output(self, output_directory: str): patch_rom(self.multiworld, self.player, rom, self.required_heart_stars[self.player], self.boss_requirements[self.player], self.player_levels[self.player], - self.boss_butch_bosses[self.player]) + self.boss_butch_bosses[self.player], + self.copy_abilities) rom_path = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") rom.write_to_file(rom_path) diff --git a/worlds/kdl3/data/Rooms.json b/worlds/kdl3/data/Rooms.json index 559655ff784d..a3a4e9128cfa 100644 --- a/worlds/kdl3/data/Rooms.json +++ b/worlds/kdl3/data/Rooms.json @@ -636,7 +636,8 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + ], "music": 9 }, { @@ -778,7 +779,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Grass Land 4 - Miniboss 1 (Boboo)" + ], "music": 4 }, { @@ -2069,7 +2072,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Ripple Field 4 - Miniboss 1 (Captain Stitch)" + ], "music": 4 }, { @@ -4374,7 +4379,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Sand Canyon 4 - Miniboss 1 (Haboki)" + ], "music": 4 }, { @@ -7734,7 +7741,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Cloudy Park 4 - Miniboss 1 (Jumper Shoot)" + ], "music": 4 }, { @@ -9731,7 +9740,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 4 - Miniboss 1 (Yuki)" + ], "music": 4 }, { @@ -11422,7 +11433,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 6 - Miniboss 1 (Blocky)" + ], "music": 12 }, { @@ -11466,7 +11479,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 6 - Miniboss 2 (Jumper Shoot)" + ], "music": 12 }, { @@ -11510,7 +11525,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 6 - Miniboss 3 (Yuki)" + ], "music": 12 }, { @@ -11602,7 +11619,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 6 - Miniboss 4 (Haboki)" + ], "music": 12 }, { @@ -11646,7 +11665,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 6 - Miniboss 5 (Boboo)" + ], "music": 12 }, { @@ -11690,7 +11711,9 @@ "access_rule": [] } ], - "locations": [], + "locations": [ + "Iceberg 6 - Miniboss 6 (Captain Stitch)" + ], "music": 12 }, { diff --git a/worlds/kdl3/test/TestLocations.py b/worlds/kdl3/test/TestLocations.py index fec9568f6144..08c61530b756 100644 --- a/worlds/kdl3/test/TestLocations.py +++ b/worlds/kdl3/test/TestLocations.py @@ -23,6 +23,9 @@ def testSimpleHeartStars(self): self.run_location_test(LocationName.sand_canyon_auntie, ["Clean"]) self.run_location_test(LocationName.sand_canyon_nyupun, ["ChuChu", "Cutter"]) self.run_location_test(LocationName.sand_canyon_rob, ["Stone", "Kine", "Coo", "Parasol", "Spark", "Ice"]) + self.run_location_test(LocationName.sand_canyon_rob, ["Stone", "Kine", "Coo", "Parasol", "Clean", "Ice"]), + self.run_location_test(LocationName.sand_canyon_rob, ["Stone", "Kine", "Coo", "Parasol", "Spark", "Needle"]), + self.run_location_test(LocationName.sand_canyon_rob, ["Stone", "Kine", "Coo", "Parasol", "Clean", "Needle"]), self.run_location_test(LocationName.cloudy_park_hibanamodoki, ["Coo", "Clean"]) self.run_location_test(LocationName.cloudy_park_piyokeko, ["Needle"]) self.run_location_test(LocationName.cloudy_park_mikarin, ["Coo"]) diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/TestShuffles.py new file mode 100644 index 000000000000..6c18d5b4423a --- /dev/null +++ b/worlds/kdl3/test/TestShuffles.py @@ -0,0 +1,128 @@ +from . import KDL3TestBase +from .TestGoal import TestNormalGoal + + +class TestCopyAbilityShuffle(KDL3TestBase): + options = { + "goal_speed": "normal", + "total_heart_stars": 30, + "heart_stars_required": 50, + "filler_percentage": 0, + "copy_ability_randomization": "enabled", + } + + def testGoal(self): + self.assertBeatable(False) + heart_stars = self.get_items_by_name("Heart Star") + self.collect(heart_stars[0:14]) + self.assertEqual(self.count("Heart Star"), 14) + self.assertBeatable(False) + self.collect(heart_stars[14:15]) + self.assertEqual(self.count("Heart Star"), 15) + self.assertBeatable(False) + self.collect_by_name(["Burning", "Cutter", "Kine"]) + self.assertBeatable(True) + self.remove([self.get_item_by_name("Love-Love Rod")]) + self.collect(heart_stars) + self.assertEqual(self.count("Heart Star"), 30) + self.assertBeatable(True) + + def testKine(self): + self.collect_by_name(["Cutter", "Burning", "Heart Star"]) + self.assertBeatable(False) + + def testCutter(self): + self.collect_by_name(["Kine", "Burning", "Heart Star"]) + self.assertBeatable(False) + + def testBurning(self): + self.collect_by_name(["Cutter", "Kine", "Heart Star"]) + self.assertBeatable(False) + + #def testValidAbilitiesForROB(self): + + +class TestAnimalShuffle(KDL3TestBase): + options = { + "goal_speed": "normal", + "total_heart_stars": 30, + "heart_stars_required": 50, + "filler_percentage": 0, + "animal_randomization": "full", + } + + def testGoal(self): + self.assertBeatable(False) + heart_stars = self.get_items_by_name("Heart Star") + self.collect(heart_stars[0:14]) + self.assertEqual(self.count("Heart Star"), 14) + self.assertBeatable(False) + self.collect(heart_stars[14:15]) + self.assertEqual(self.count("Heart Star"), 15) + self.assertBeatable(False) + self.collect_by_name(["Burning", "Cutter", "Kine"]) + self.assertBeatable(True) + self.remove([self.get_item_by_name("Love-Love Rod")]) + self.collect(heart_stars) + self.assertEqual(self.count("Heart Star"), 30) + self.assertBeatable(True) + + def testKine(self): + self.collect_by_name(["Cutter", "Burning", "Heart Star"]) + self.assertBeatable(False) + + def testCutter(self): + self.collect_by_name(["Kine", "Burning", "Heart Star"]) + self.assertBeatable(False) + + def testBurning(self): + self.collect_by_name(["Cutter", "Kine", "Heart Star"]) + self.assertBeatable(False) + + def testLockedAnimals(self): + self.assertTrue(self, self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") + self.assertTrue(self, self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") + self.assertTrue(self, self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) + +class testAllShuffle(KDL3TestBase): + options = { + "goal_speed": "normal", + "total_heart_stars": 30, + "heart_stars_required": 50, + "filler_percentage": 0, + "animal_randomization": "full", + "copy_ability_randomization": "enabled", + } + + def testGoal(self): + self.assertBeatable(False) + heart_stars = self.get_items_by_name("Heart Star") + self.collect(heart_stars[0:14]) + self.assertEqual(self.count("Heart Star"), 14) + self.assertBeatable(False) + self.collect(heart_stars[14:15]) + self.assertEqual(self.count("Heart Star"), 15) + self.assertBeatable(False) + self.collect_by_name(["Burning", "Cutter", "Kine"]) + self.assertBeatable(True) + self.remove([self.get_item_by_name("Love-Love Rod")]) + self.collect(heart_stars) + self.assertEqual(self.count("Heart Star"), 30) + self.assertBeatable(True) + + def testKine(self): + self.collect_by_name(["Cutter", "Burning", "Heart Star"]) + self.assertBeatable(False) + + def testCutter(self): + self.collect_by_name(["Kine", "Burning", "Heart Star"]) + self.assertBeatable(False) + + def testBurning(self): + self.collect_by_name(["Cutter", "Kine", "Heart Star"]) + self.assertBeatable(False) + + def testLockedAnimals(self): + self.assertTrue(self, self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") + self.assertTrue(self, self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") + self.assertTrue(self, self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) \ No newline at end of file From f1044c0742a7734d1cbc46d63f1f4f03cfb828c1 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 3 Aug 2023 14:43:53 -0500 Subject: [PATCH 089/165] make angel rules smarter --- worlds/kdl3/Rules.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index c320728302df..5c26a404c91a 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -92,8 +92,6 @@ def can_assemble_rob(state: "CollectionState", player: int, copy_abilities: typi # check animal requirements if not can_reach_coo(state, player) and can_reach_kine(state, player): return False - # now we need to get our bukisets - bukisets = {enemy: copy_abilities[enemy] for enemy in copy_abilities if "Bukiset" in enemy} # probably some cleaner way to handle this room1 = EnemyAbilities.enemy_restrictive[1] room2 = EnemyAbilities.enemy_restrictive[2] @@ -112,6 +110,11 @@ def can_assemble_rob(state: "CollectionState", player: int, copy_abilities: typi return can_reach_parasol(state, player) and can_reach_stone(state, player) +def can_fix_angel_wings(state: "CollectionState", player: int, copy_abilities: typing.Dict[str,str]): + can_reach = False + for enemy in {"Sparky", "Blocky", "Jumper Shoot", "Yuki", "Sir Kibble", "Kaboki", "Boboo", "Captain Stitch"}: + can_reach = can_reach | ability_map[copy_abilities[enemy]](state, player) + return can_reach def set_rules(world: "KDL3World") -> None: @@ -171,8 +174,7 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.iceberg_shiro, world.player), lambda state: can_reach_nago(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_angel, world.player), - lambda state: state.has_all([ability for ability in copy_ability_table.keys()], world.player)) - # cleaner than writing out 8 ands + lambda state: can_fix_angel_wings(state, world.player, world.copy_abilities)) # Consumables if world.multiworld.consumables[world.player]: From 75f6995d60308a45b73d583e27081fb48035a0b5 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 3 Aug 2023 21:31:38 -0500 Subject: [PATCH 090/165] fix tests, finish rob test --- worlds/kdl3/Rules.py | 7 +++--- worlds/kdl3/test/TestShuffles.py | 42 +++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 5c26a404c91a..08c8af5b8225 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -77,6 +77,7 @@ def can_reach_cutter(state: "CollectionState", player: int) -> bool: ability_map = { + "No Ability": lambda state, player: True, "Burning Ability": can_reach_burning, "Stone Ability": can_reach_stone, "Ice Ability": can_reach_ice, @@ -111,9 +112,9 @@ def can_assemble_rob(state: "CollectionState", player: int, copy_abilities: typi def can_fix_angel_wings(state: "CollectionState", player: int, copy_abilities: typing.Dict[str,str]): - can_reach = False - for enemy in {"Sparky", "Blocky", "Jumper Shoot", "Yuki", "Sir Kibble", "Kaboki", "Boboo", "Captain Stitch"}: - can_reach = can_reach | ability_map[copy_abilities[enemy]](state, player) + can_reach = True + for enemy in {"Sparky", "Blocky", "Jumper Shoot", "Yuki", "Sir Kibble", "Haboki", "Boboo", "Captain Stitch"}: + can_reach = can_reach & ability_map[copy_abilities[enemy]](state, player) return can_reach diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/TestShuffles.py index 6c18d5b4423a..6986d2cc988e 100644 --- a/worlds/kdl3/test/TestShuffles.py +++ b/worlds/kdl3/test/TestShuffles.py @@ -1,7 +1,8 @@ +from typing import List, Tuple + from . import KDL3TestBase from .TestGoal import TestNormalGoal - class TestCopyAbilityShuffle(KDL3TestBase): options = { "goal_speed": "normal", @@ -39,7 +40,41 @@ def testBurning(self): self.collect_by_name(["Cutter", "Kine", "Heart Star"]) self.assertBeatable(False) - #def testValidAbilitiesForROB(self): + def testValidAbilitiesForROB(self): + # there exists a subset of 4-7 abilities that will allow us access to ROB heart star on default settings + self.collect_by_name(["Heart Star", "Kine", "Coo"]) # we will guaranteed need Coo, Kine, and Heart Stars to reach + # first we need to identify our bukiset requirements + groups = [ + ({"Parasol Ability", "Cutter Ability"}, {'Bukiset (Parasol)', 'Bukiset (Cutter)'}), + ({"Spark Ability", "Clean Ability"}, {'Bukiset (Spark)', 'Bukiset (Clean)'}), + ({"Ice Ability", "Needle Ability"}, {'Bukiset (Ice)', 'Bukiset (Needle)'}), + ({"Stone Ability", "Burning Ability"}, {'Bukiset (Stone)', 'Bukiset (Burning)'}), + ] + copy_abilities = self.multiworld.worlds[1].copy_abilities + required_abilities: List[Tuple[str]] = [] + for abilities, bukisets in groups: + potential_abilities: List[str] = list() + for bukiset in bukisets: + if copy_abilities[bukiset] in abilities: + potential_abilities.append(copy_abilities[bukiset]) + required_abilities.append(tuple(potential_abilities)) + collected_abilities = list() + for group in required_abilities: + self.assertFalse(len(group) == 0) + collected_abilities.append(group[0]) + self.collect_by_name([ability.replace(" Ability", "") for ability in collected_abilities]) + if "Parasol" not in collected_abilities or "Stone" not in collected_abilities: + # required for non-Bukiset related portions + self.collect_by_name(["Parasol", "Stone"]) + + if "Cutter" not in collected_abilities: + # we can't actually reach 3-6 without Cutter + assert not self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B") + self.collect_by_name(["Cutter"]) + + assert self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B") + + class TestAnimalShuffle(KDL3TestBase): @@ -84,7 +119,8 @@ def testLockedAnimals(self): self.assertTrue(self, self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") self.assertTrue(self, self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) -class testAllShuffle(KDL3TestBase): + +class TestAllShuffle(KDL3TestBase): options = { "goal_speed": "normal", "total_heart_stars": 30, From 251529852e2b82370a702fa9ff3094428323b24c Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 3 Aug 2023 22:03:31 -0500 Subject: [PATCH 091/165] fix failing test, start copy ability rules --- worlds/kdl3/Rules.py | 21 ++++++++++++++++++++- worlds/kdl3/test/TestShuffles.py | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 08c8af5b8225..ff7c78c8004b 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -217,8 +217,27 @@ def set_rules(world: "KDL3World") -> None: lambda state: can_reach_cutter(state, world.player)) # copy ability access edge cases - # water locked: all mony, joe, and some blipper/glunk/squishy + # water locked: most mony, joe, and some blipper/glunk/squishy # sand canyon 4 all + add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_2_E3, world.player), + lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_3_E6, world.player), + lambda state: can_reach_kine(state, world.player)) + # Ripple Field 4 E5, E7, and E8 are strict, but doable + add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E5, world.player), + lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E7, world.player), + lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E8, world.player), + lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E1, world.player), + lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E2, world.player), + lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E3, world.player), + lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E4, world.player), + lambda state: can_reach_kine(state, world.player)) for boss_flag, purification, i in zip(["Level 1 Boss", "Level 2 Boss", "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/TestShuffles.py index 6986d2cc988e..1db51a473388 100644 --- a/worlds/kdl3/test/TestShuffles.py +++ b/worlds/kdl3/test/TestShuffles.py @@ -63,11 +63,11 @@ def testValidAbilitiesForROB(self): self.assertFalse(len(group) == 0) collected_abilities.append(group[0]) self.collect_by_name([ability.replace(" Ability", "") for ability in collected_abilities]) - if "Parasol" not in collected_abilities or "Stone" not in collected_abilities: + if "Parasol Ability" not in collected_abilities or "Stone Ability" not in collected_abilities: # required for non-Bukiset related portions self.collect_by_name(["Parasol", "Stone"]) - if "Cutter" not in collected_abilities: + if "Cutter Ability" not in collected_abilities: # we can't actually reach 3-6 without Cutter assert not self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B") self.collect_by_name(["Cutter"]) From 67ab09a954bff6643ba508bcd9a1e3f7229986e4 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 4 Aug 2023 00:19:26 -0500 Subject: [PATCH 092/165] water rules finished --- worlds/kdl3/Rules.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index ff7c78c8004b..16d011656478 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -217,13 +217,13 @@ def set_rules(world: "KDL3World") -> None: lambda state: can_reach_cutter(state, world.player)) # copy ability access edge cases - # water locked: most mony, joe, and some blipper/glunk/squishy - # sand canyon 4 all + # Kirby cannot eat enemies fully submerged in water. Vast majority of cases, the enemy can be brought to the surface + # and eaten by inhaling while falling on top of them add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_2_E3, world.player), lambda state: can_reach_kine(state, world.player)) add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_3_E6, world.player), lambda state: can_reach_kine(state, world.player)) - # Ripple Field 4 E5, E7, and E8 are strict, but doable + # Ripple Field 4 E5, E7, and E8 are doable, but too strict to leave in logic add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E5, world.player), lambda state: can_reach_kine(state, world.player)) add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E7, world.player), @@ -238,6 +238,14 @@ def set_rules(world: "KDL3World") -> None: lambda state: can_reach_kine(state, world.player)) add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E4, world.player), lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E7, world.player), + lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E8, world.player), + lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E9, world.player), + lambda state: can_reach_kine(state, world.player)) + add_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E10, world.player), + lambda state: can_reach_kine(state, world.player)) for boss_flag, purification, i in zip(["Level 1 Boss", "Level 2 Boss", "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], From 2d8d434d111e1e2f1fc6e6e0aee62375ba0c9b0d Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 4 Aug 2023 00:32:29 -0500 Subject: [PATCH 093/165] clean dead code --- worlds/kdl3/Regions.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index edb181c455f6..45c7dc55608c 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -192,22 +192,6 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo return levels -def generate_locations_from_stages(stages: typing.List[int], - consumables: bool) -> typing.Dict[str, typing.Optional[int]]: - locations = dict() - for stage in stages[:-1]: - locations[location_table[stage]] = stage - locations[location_table[stage + 0x100]] = stage + 0x100 - if consumables: - stage_idx = stage & 0xFF - if stage_idx in level_consumables: - for consumable in level_consumables[stage_idx]: - loc_id = consumable + 0x770300 - locations[location_table[loc_id]] = loc_id - - return locations - - def create_levels(world: World) -> None: menu = Region("Menu", world.player, world.multiworld) start = Entrance(world.player, "Start Game", menu) From 8913daea5572e0a3b123588d0493b02a6b08f18a Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 4 Aug 2023 02:09:39 -0500 Subject: [PATCH 094/165] fix bug where SNI Client dies if an item actually makes it to the item queue --- worlds/kdl3/Client.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 5716d312f7cc..ae2acf592fb5 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -146,15 +146,15 @@ async def pop_item(self, ctx): if len(self.item_queue) > 0: item = self.item_queue.pop() # special handling for the remaining three - item = item.item & 0x0000FF - if item == 0x21: + item_idx = item.item & 0x0000FF + if item_idx == 0x21: # 1-Up life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 1) life_bytes = pack("H", life_count[0] + 1) snes_buffered_write(ctx, KDL3_LIFE_COUNT, life_bytes) snes_buffered_write(ctx, KDL3_LIFE_VISUAL, life_bytes) snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x33])) - elif item == 0x22: + elif item_idx == 0x22: # Maxim Tomato # Check for Gooey gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) @@ -164,18 +164,18 @@ async def pop_item(self, ctx): snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, bytes([0x08])) else: snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x0A])) - elif item == 0x23: + elif item_idx == 0x23: # Invincibility Candy snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x84, 0x03])) - elif item == 0x40: + elif item_idx == 0x40: check_gooey_r = await snes_read(ctx, KDL3_GOOEY_TRAP, 2) check_gooey = struct.unpack("H", check_gooey_r) if check_gooey[0] == 0: snes_buffered_write(ctx, KDL3_GOOEY_TRAP, bytes([0x01, 0x00])) else: self.item_queue.append(item) # We can't apply this yet - elif item == 0x41: + elif item_idx == 0x41: check_slow_r = await snes_read(ctx, KDL3_SLOWNESS_TRAP, 2) check_slow = struct.unpack("H", check_slow_r) if check_slow[0] == 0: @@ -183,7 +183,7 @@ async def pop_item(self, ctx): snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0xA7])) else: self.item_queue.append(item) # We can't apply this yet - elif item == 0x42: + elif item_idx == 0x42: check_ability_r = await snes_read(ctx, KDL3_ABILITY_TRAP, 2) check_ability = struct.unpack("H", check_ability_r) if check_ability[0] == 0: From 5739ff10b2e1e45fa8c3c808c43e4fb74f3d73af Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 4 Aug 2023 21:28:56 -0500 Subject: [PATCH 095/165] hs visual bugfixes --- worlds/kdl3/Rom.py | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index a5d7d83ea5f6..0fccac6c9e8a 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -252,6 +252,7 @@ "Cutter Ability": 8, } + class RomData: def __init__(self, file: str, name: typing.Optional[str] = None): self.file = bytearray() @@ -815,6 +816,11 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, 0x0A, # ASL 0xAA, # TAX 0xBF, 0x00, 0x90, 0x40, # LDA $409000, X + 0xC9, 0xFF, 0xFF, # CMP #$FFFF + 0xD0, 0x04, # BNE $07A3A3 + 0xCA, # DEX + 0xCA, # DEX + 0x80, 0xF3, # BRA $07A396 0xA2, 0x00, 0x00, # LDX #$0000 0xC9, 0x0A, 0x00, # CMP #$000A 0x90, 0x07, # BCC $07A3A9 @@ -906,6 +912,36 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_bytes(0x3E000, [0x20, 0x03, 0x20, 0x00, 0x80, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x01, 0xA0, 0x00, ]) + # Heart Star Visual redirect + rom.write_bytes(0x1427C, [0x22, 0x80, 0xA4, 0x07, 0xEA, 0xEA, ]) + rom.write_bytes(0x3A480, [0xDA, # PHX + 0x8A, # TXA + 0x0A, # ASL + 0xAA, # TAX + 0xBD, 0x20, 0x90, # LDA $9020, X + 0x3A, # DEC + 0xAA, # TAX + 0xC9, 0x07, 0x00, # CMP #$0007 + 0x30, 0x07, # BMI $07A495 + 0xE8, # INX + 0x18, # CLC + 0xE9, 0x06, 0x00, # SBC #$0006 + 0x80, 0xF4, # BRA $07A489 + 0xBD, 0xA7, 0x53, # LDA $53A7, X + 0xFA, # PLX + 0x29, 0xFF, 0x00, # AND #$00FF + 0x6B, # RTL + ]) + + # Heart Star Cutscene redirect + rom.write_bytes(0x49F35, [0x22, 0x00, 0xA5, 0x07, ]) + rom.write_bytes(0x3A500, [0xAA, # TAX + 0xAD, 0xD3, 0x53, # LDA $53D3 + 0x3A, # DEC + 0x8D, 0xC3, 0x5A, # STA $5AC3 + 0x6B, # RTL + ]) + # base patch done, write relevant slot info # Write strict bosses patch @@ -1172,13 +1208,11 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x2F90E2, 0x5E + (ability_remap[copy_abilities["Captain Stitch"]] << 1)) rom.write_byte(0x2F9109, 0x5E + (ability_remap[copy_abilities["Captain Stitch"]] << 1)) - - # write jumping goal rom.write_bytes(0x94F8, struct.pack("H", multiworld.jumping_target[player])) rom.write_bytes(0x944E, struct.pack("H", multiworld.jumping_target[player])) - from Main import __version__ + from Utils import __version__ rom.name = bytearray(f'KDL3{__version__.replace(".", "")[0:3]}_{player}_{multiworld.seed:11}\0', 'utf8')[:21] rom.name.extend([0] * (21 - len(rom.name))) rom.write_bytes(0x3C000, rom.name) From 347e2d98070e1025239234dc5ea179d63b93b2cc Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 6 Aug 2023 23:40:08 -0500 Subject: [PATCH 096/165] general cleanup --- worlds/kdl3/Client.py | 16 +- worlds/kdl3/Regions.py | 41 ++-- worlds/kdl3/Rom.py | 20 +- worlds/kdl3/Room.py | 440 ---------------------------------------- worlds/kdl3/Rules.py | 6 +- worlds/kdl3/__init__.py | 100 +++++---- 6 files changed, 84 insertions(+), 539 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index ae2acf592fb5..e7e2850575b0 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -149,8 +149,8 @@ async def pop_item(self, ctx): item_idx = item.item & 0x0000FF if item_idx == 0x21: # 1-Up - life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 1) - life_bytes = pack("H", life_count[0] + 1) + life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 2) + life_bytes = pack("H", unpack("H", life_count)[0] + 1) snes_buffered_write(ctx, KDL3_LIFE_COUNT, life_bytes) snes_buffered_write(ctx, KDL3_LIFE_VISUAL, life_bytes) snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x33])) @@ -160,10 +160,10 @@ async def pop_item(self, ctx): gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) if gooey_hp[0] > 0x00: - snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x08])) - snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, bytes([0x08])) + snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x08, 0x00])) + snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, bytes([0x08, 0x00])) else: - snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x0A])) + snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x0A, 0x00])) elif item_idx == 0x23: # Invincibility Candy snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) @@ -228,8 +228,8 @@ async def game_watcher(self, ctx) -> None: level_data = await snes_read(ctx, KDL3_LEVEL_ADDR + (14 * i), 14) self.levels[i] = unpack("HHHHHHH", level_data) - recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 1) - recv_amount = recv_count[0] + recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 2) + recv_amount = unpack("H", recv_count)[0] if recv_amount < len(ctx.items_received): item = ctx.items_received[recv_amount] recv_amount += 1 @@ -250,7 +250,7 @@ async def game_watcher(self, ctx) -> None: elif item.item == 0x770020: # Heart Star heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 1) - snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", heart_star_count[0] + 1)) + snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", unpack("H", heart_star_count)[0] + 1)) snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x16])) else: self.item_queue.append(item) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 45c7dc55608c..d986f830b1f9 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -85,9 +85,9 @@ def generate_rooms(world: World, door_shuffle: bool, level_regions: typing.Dict[ if any(["Complete" in location.name for location in room.locations]): room.add_locations({f"{level_names[room.level]} {room.stage} - Stage Completion": None}, KDL3Location) - for level in world.player_levels[world.player]: + for level in world.player_levels: for stage in range(6): - proper_stage = world.player_levels[world.player][level][stage] + proper_stage = world.player_levels[level][stage] level_regions[level].add_exits([first_rooms[proper_stage].name], {first_rooms[proper_stage].name: (lambda state: True) if world.multiworld.open_world[world.player] or @@ -138,7 +138,7 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo or (enforce_pattern == enforce_world) ] new_stage = generate_valid_level(level, stage, stage_candidates, - world.multiworld.per_slot_randoms[world.player]) + world.random) possible_stages.remove(new_stage) levels[level][stage] = new_stage except Exception: @@ -167,17 +167,17 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo if boss_shuffle > 0: if boss_shuffle == 2: - possible_bosses = [default_levels[world.multiworld.per_slot_randoms[world.player].randint(1, 5)][6] + possible_bosses = [default_levels[world.random.randint(1, 5)][6] for _ in range(5 - len(plando_bosses))] elif boss_shuffle == 3: - boss = world.multiworld.per_slot_randoms[world.player].randint(1, 5) + boss = world.random.randint(1, 5) possible_bosses = [default_levels[boss][6] for _ in range(5 - len(plando_bosses))] else: possible_bosses = [default_levels[level][6] for level in default_levels if default_levels[level][6] not in plando_bosses] for level in levels: if levels[level][6] is None: - boss = world.multiworld.per_slot_randoms[world.player].choice(possible_bosses) + boss = world.random.choice(possible_bosses) levels[level][6] = boss possible_bosses.remove(boss) else: @@ -194,8 +194,6 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo def create_levels(world: World) -> None: menu = Region("Menu", world.player, world.multiworld) - start = Entrance(world.player, "Start Game", menu) - menu.exits.append(start) level1 = Region("Grass Land", world.player, world.multiworld) level2 = Region("Ripple Field", world.player, world.multiworld) level3 = Region("Sand Canyon", world.player, world.multiworld) @@ -209,32 +207,21 @@ def create_levels(world: World) -> None: 4: level4, 5: level5, } - start.connect(level1) level_shuffle = world.multiworld.stage_shuffle[world.player] if level_shuffle != 0: - world.player_levels[world.player] = generate_valid_levels( + world.player_levels = generate_valid_levels( world, level_shuffle == 1, level_shuffle == 2) - else: - world.player_levels[world.player] = default_levels.copy() + generate_rooms(world, False, levels) level6.add_locations({LocationName.goals[world.multiworld.goal[world.player]]: None}, KDL3Location) - tlv2 = Entrance(world.player, "To Level 2", level1) - level1.exits.append(tlv2) - tlv2.connect(level2) - tlv3 = Entrance(world.player, "To Level 3", level2) - level2.exits.append(tlv3) - tlv3.connect(level3) - tlv4 = Entrance(world.player, "To Level 4", level3) - level3.exits.append(tlv4) - tlv4.connect(level4) - tlv5 = Entrance(world.player, "To Level 5", level4) - level4.exits.append(tlv5) - tlv5.connect(level5) - tlv6 = Entrance(world.player, "To Level 6", menu) - menu.exits.append(tlv6) - tlv6.connect(level6) + menu.connect(level1, "Start Game") + level1.connect(level2, "To Level 2") + level2.connect(level3, "To Level 3") + level3.connect(level4, "To Level 4") + level4.connect(level5, "To Level 5") + menu.connect(level6, "To Level 6") # put the connection on menu, since you can reach it before level 5 on fast goal world.multiworld.regions += [menu, level1, level2, level3, level4, level5, level6] diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 0fccac6c9e8a..78f743b7c964 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -366,7 +366,7 @@ def patch(self, target: str): def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, - shuffled_levels, bb_boss_enabled, copy_abilities): + shuffled_levels, bb_boss_enabled, copy_abilities, slot_random): # increase BWRAM by 0x8000 rom.write_byte(0x7FD8, 0x06) @@ -1106,12 +1106,12 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, if multiworld.music_shuffle[player] > 0: if multiworld.music_shuffle[player] == 1: shuffled_music = music_choices.copy() - multiworld.per_slot_randoms[player].shuffle(shuffled_music) + slot_random.shuffle(shuffled_music) music_map = dict(zip(music_choices, shuffled_music)) # Avoid putting star twinkle in the pool - music_map[5] = multiworld.per_slot_randoms[player].choice(music_choices) + music_map[5] = slot_random.choice(music_choices) # Heart Star music doesn't work on regular stages - music_map[8] = multiworld.per_slot_randoms[player].choice(music_choices) + music_map[8] = slot_random.choice(music_choices) for room in rooms: room.music = music_map[room.music] for room in room_pointers: @@ -1128,17 +1128,17 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x4A38D, music_map[0x1D]) elif multiworld.music_shuffle[player] == 2: for room in rooms: - room.music = multiworld.per_slot_randoms[player].choice(music_choices) + room.music = slot_random.choice(music_choices) for room in room_pointers: - rom.write_byte(room + 2, multiworld.per_slot_randoms[player].choice(music_choices)) + rom.write_byte(room + 2, slot_random.choice(music_choices)) for i in range(5): # level themes - rom.write_byte(0x133F2 + i, multiworld.per_slot_randoms[player].choice(music_choices)) + rom.write_byte(0x133F2 + i, slot_random.choice(music_choices)) # Zero - rom.write_byte(0x9AE79, multiworld.per_slot_randoms[player].choice(music_choices)) + rom.write_byte(0x9AE79, slot_random.choice(music_choices)) # Heart Star success and fail - rom.write_byte(0x4A388, multiworld.per_slot_randoms[player].choice(music_choices)) - rom.write_byte(0x4A38D, multiworld.per_slot_randoms[player].choice(music_choices)) + rom.write_byte(0x4A388, slot_random.choice(music_choices)) + rom.write_byte(0x4A38D, slot_random.choice(music_choices)) for room in rooms: room.patch(rom) diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index ea2ec47ec11d..e38546b405fa 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -44,443 +44,3 @@ def patch(self, rom: "RomData"): if len(animals) > 0: for current_animal, address in zip(animals, self.animal_pointers): rom.write_byte(self.pointer + address + 7, animal_map[current_animal]) - - -room_data = [ - 0x346711, - 0x3365b5, - 0x2d2d0a, - 0x3513aa, - 0x2d7256, - 0x2c1c53, - - 0x3240a3, - 0x2eafe5, - 0x345ead, - 0x2d51ad, - 0x3698a6, - 0x2d4229, - 0x2c0f25, - - 0x300f8b, - 0x30e74b, - 0x30d442, - 0x2d29a8, - 0x2d7531, - 0x2dbe33, - 0x2f124c, - 0x2c1e35, - - 0x34f7b4, - 0x346f71, - 0x2e60a9, - 0x38cdda, - 0x326e14, - 0x35608f, - 0x30387f, - 0x2e5299, - 0x2d9ee2, - 0x2e70be, - 0x2c12e9, - - 0x32688d, - 0x2e850e, - 0x32c42b, - 0x2d43bb, - 0x2d5f45, - 0x2d33af, - 0x2c0c52, - 0x31ac7f, - - 0x3386e8, - 0x33ce35, - 0x338049, - 0x32b461, - 0x354403, - 0x2ef2a1, - 0x2e8098, - 0x2e203d, - 0x2c03d9, - - 0x2d88a9, - - 0x320bef, - 0x36c250, - 0x2d1a48, - 0x364dac, - 0x2d623f, - 0x2e8ff9, - 0x2e896e, - 0x2eca27, - 0x2c15bc, - - 0x330000, - 0x2f0f43, - 0x34a947, - 0x3810d7, - 0x2d5c48, - 0x2f734e, - 0x2d5dc7, - 0x2c1a71, - - 0x35ab46, - 0x370000, - 0x38b164, - 0x2edfaf, - 0x2d54ba, - 0x2d95ee, - 0x2c13da, - 0x303c20, - - 0x2f092c, - 0x2d3d6e, - 0x2e0f07, - 0x2d9886, - 0x2c079d, - 0x2e6c2d, - 0x315bf5, - 0x30260c, - 0x331e0f, - 0x2e8b9d, - 0x2e9225, - 0x33ae5e, - 0x305853, - 0x2d248e, - - 0x3171b1, - 0x362188, - 0x371abf, - 0x3be88d, - 0x2e2ecf, - 0x30f0a5, - 0x3530c8, - 0x3942fa, - 0x2e754a, - 0x2d36f9, - 0x2e6e76, - 0x2c0a70, - - 0x2d01c8, - 0x2d5640, - 0x3781f5, - 0x2f3054, - 0x2fcf3f, - 0x358632, - 0x310000, - 0x36b7f7, - 0x37426b, - 0x2d151b, - 0x2ed5fe, - 0x2c0b61, - - 0x302d7a, - - 0x35c6ab, - 0x3046d4, - 0x3598d4, - 0x38bfea, - 0x34341c, - 0x30e0fd, - 0x2fe3dc, - 0x2d9b16, - 0x2c06ac, - - 0x37f992, - 0x2d0e22, - 0x35e194, - 0x31ccf3, - 0x2ef0cc, - 0x3262f5, - 0x39fe24, - 0x2ee760, - 0x2eb616, - 0x34b166, - 0x2db285, - 0x2c2017, - - 0x361664, - 0x2d4097, - 0x38dbbe, - 0x3422e6, - 0x366383, - 0x2d60c3, - 0x318f61, - 0x2c1016, - 0x2d49f9, - - 0x35bda2, - 0x2d1c01, - 0x357cd0, - 0x341189, - 0x32791c, - 0x2d188f, - 0x2f3943, - 0x352724, - 0x2dcee6, - 0x2c088e, - - 0x37e296, - 0x2e944e, - 0x2ea788, - 0x342b83, - 0x379af5, - 0x2e7304, - 0x3379a9, - 0x2d3a3c, - 0x2c1980, - 0x37a720, - - 0x329449, - 0x2d6c91, - 0x2d73c5, - 0x307e62, - 0x308bfb, - 0x307af9, - 0x3092bb, - 0x30741d, - 0x308532, - 0x30778e, - 0x3081ca, - 0x2d9c5d, - 0x2e050b, - 0x2d6b1b, - 0x2e3d40, - 0x2d5ac9, - 0x2d0fe2, - 0x2d11a1, - 0x2da65b, - 0x2d63bb, - 0x2d5026, - 0x2d69a3, - 0x2d071a, - 0x328979, - 0x2efba6, - 0x2ec82a, - 0x2ebe33, - 0x2ecc24, - 0x2ece21, - 0x2d0390, - 0x2d9204, - 0x2edbd2, - 0x2e9ce1, - 0x2e9675, - 0x2e9899, - 0x2e9abd, - 0x2d90b4, - 0x2ee949, - 0x2d57c5, - 0x2ec032, - 0x2ec230, - 0x2ec42e, - 0x2ed40b, - 0x2d99cf, - 0x2c0d43, - - 0x2da51d, - - 0x3069bb, - 0x2ef813, - 0x32237a, - 0x2ebc2f, - 0x33d479, - 0x2e5e55, - 0x35f378, - 0x2d1360, - 0x34e0bf, - 0x2ef9dd, - 0x3211d6, - 0x35b478, - 0x2d2642, - 0x2c097f, - - 0x2ff32b, - 0x316055, - 0x3251de, - 0x32fb1f, - 0x34c17c, - 0x31f496, - 0x2d8a05, - 0x2d8e0a, - 0x2da2a1, - 0x2c179e, - - 0x2f50bb, - 0x30f9f7, - 0x311339, - 0x2db020, - 0x3145df, - 0x2d4e9c, - 0x3eff12, - 0x2c05bb, - - 0x2ee389, - 0x2eeb2f, - 0x327e99, - 0x324c23, - 0x32d3b4, - 0x32d8cc, - 0x31a43e, - 0x2d486a, - 0x2d7f0c, - 0x2de601, - 0x2c11f8, - - 0x30b736, - 0x2e8dcc, - 0x36fee2, - 0x2fc76a, - 0x2da024, - 0x2d66b2, - 0x306d33, - 0x2da8d4, - 0x2c1f26, - - 0x31e4d7, - 0x31a018, - 0x2e360e, - 0x2fca07, - 0x2f8998, - 0x3186f1, - 0x3164b4, - 0x31c8f1, - 0x2e313b, - 0x2f2460, - 0x2fcca3, - 0x2e0c8a, - 0x2e54f4, - 0x2d3f03, - 0x2ef474, - 0x2eb822, - 0x2c14cb, - - 0x2dc19a, - - 0x335127, - 0x36e0ec, - 0x322f30, - 0x2ed217, - 0x315791, - 0x33f935, - 0x2d8f5f, - 0x2c2108, - - 0x2f67f0, - 0x32e2b9, - 0x350000, - 0x2e574e, - 0x2e503e, - 0x2fbce7, - 0x31e8c9, - 0x3104d5, - 0x2db153, - 0x2ea9a4, - 0x2c0e34, - - 0x34b972, - 0x2e13f9, - 0x373549, - 0x37b340, - 0x2e5c00, - 0x2dfd32, - 0x374f55, - 0x2d9da0, - 0x2c188f, - - 0x31f87f, - 0x337304, - 0x321d9a, - 0x30434d, - 0x31c4ef, - 0x3117f6, - 0x2f6da9, - 0x330f1a, - 0x2ea127, - 0x2ea349, - 0x31b4ac, - 0x2f0c3a, - 0x3007cc, - 0x336c5d, - 0x2ea56a, - 0x2f8c5c, - 0x2ed7f1, - 0x2ee19d, - 0x33f331, - 0x2eeef2, - 0x2c1107, - - 0x3299a7, - 0x2e59a7, - 0x2f5c62, - 0x2fd99b, - 0x308897, - 0x2f6510, - 0x320000, - 0x2f5f49, - 0x30c0f1, - 0x2f1b5e, - 0x32af0c, - 0x2fe66a, - 0x2f9497, - 0x2e1b5a, - 0x2e29f6, - 0x3054d5, - 0x2e4b86, - 0x2f4dcf, - 0x2e3fa3, - 0x2f622e, - 0x2f9750, - 0x30ddd5, - 0x2e0000, - 0x305156, - 0x2e3876, - 0x3029c4, - 0x2fba45, - 0x31b097, - 0x2e3adb, - 0x35cfa8, - 0x2e1dcd, - 0x2e2c63, - 0x2e62fc, - 0x2e0286, - 0x309ccc, - 0x3afc23, - 0x2e251a, - 0x2c1b62, - - 0x33a7d9, - 0x30ca9f, - 0x2f4219, - 0x30cdd6, - 0x30fd0b, - 0x30c768, - 0x30f3c2, - 0x2facfe, - 0x2f761f, - 0x2fe8f8, - 0x2f9a08, - 0x2fee13, - 0x2faa4c, - 0x2ff83d, - 0x2f9cbf, - 0x2fd706, - 0x2fa798, - 0x2ffac5, - 0x2f9f76, - 0x2e0a0c, - 0x2fa22d, - 0x2ffd4c, - 0x2f8f1e, - 0x2e778f, - 0x2c16ad, - - 0x2d796f, - - 0x2eff36, - - 0x2d85f1, - 0x301360, - 0x2da3df, - 0x2dc2b9, - 0x2d7c3f, - 0x2c29d2 -] diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 16d011656478..8306502c7ec2 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -254,12 +254,12 @@ def set_rules(world: "KDL3World") -> None: LocationName.iceberg_dedede], range(1, 6)): set_rule(world.multiworld.get_location(boss_flag, world.player), - lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[world.player][i - 1]) + lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[i - 1]) and can_reach_level(state, world.player, i + 1, world.multiworld.open_world[world.player], world.multiworld.ow_boss_requirement[world.player])) set_rule(world.multiworld.get_location(purification, world.player), - lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[world.player][i - 1]) + lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[i - 1]) and can_reach_level(state, world.player, i + 1, world.multiworld.open_world[world.player], world.multiworld.ow_boss_requirement[world.player])) @@ -270,7 +270,7 @@ def set_rules(world: "KDL3World") -> None: lambda state, i=level: state.has(f"Level {i - 1} Boss Purified", world.player)) set_rule(world.multiworld.get_entrance("To Level 6", world.player), - lambda state: state.has("Heart Star", world.player, world.required_heart_stars[world.player])) + lambda state: state.has("Heart Star", world.player, world.required_heart_stars)) for level in range(2, 6): add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 18448be11e87..baf93b1665f4 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -9,38 +9,36 @@ from .Locations import location_table, KDL3Location, level_consumables, consumable_locations from .Names.AnimalFriendSpawns import animal_friend_spawns from .Names.EnemyAbilities import vanilla_enemies, enemy_mapping, enemy_restrictive -from .Regions import create_levels +from .Regions import create_levels, default_levels from .Options import kdl3_options from .Names import LocationName from .Rules import set_rules from .Rom import KDL3DeltaPatch, get_base_rom_path, RomData, patch_rom, KDL3JHASH, KDL3UHASH from .Client import KDL3SNIClient -from typing import Dict, TextIO +from typing import Dict, TextIO, Optional, List import os import math import threading import base64 -from Main import __version__ as APVersion +import settings from worlds.LauncherComponents import components logger = logging.getLogger("Kirby's Dream Land 3") + # SNIComponent = next(x for x in components if x.display_name == "SNI Client") # SNIComponent.file_identifier.suffixes.append(".apkdl3") -if APVersion == "0.4.2": - import settings - - class KDL3Settings(settings.Group): - class RomFile(settings.SNESRomPath): - """File name of the KDL3 JP or EN rom""" - description = "Kirby's Dream Land 3 ROM File" - copy_to = "Kirby's Dream Land 3.sfc" - md5s = [KDL3JHASH, KDL3UHASH] +class KDL3Settings(settings.Group): + class RomFile(settings.SNESRomPath): + """File name of the KDL3 JP or EN rom""" + description = "Kirby's Dream Land 3 ROM File" + copy_to = "Kirby's Dream Land 3.sfc" + md5s = [KDL3JHASH, KDL3UHASH] - rom_file: RomFile = RomFile(RomFile.copy_to) + rom_file: RomFile = RomFile(RomFile.copy_to) class KDL3WebWorld(WebWorld): @@ -70,20 +68,18 @@ class KDL3World(World): item_name_groups = item_names data_version = 0 web = KDL3WebWorld() - required_heart_stars = dict() - boss_requirements = dict() - player_levels = dict() - stage_shuffle_enabled = False - boss_butch_bosses = dict() - - if APVersion == "0.4.2": - settings: typing.ClassVar[KDL3Settings] + settings: typing.ClassVar[KDL3Settings] def __init__(self, world: MultiWorld, player: int): self.rom_name = None self.rom_name_available_event = threading.Event() super().__init__(world, player) - self.copy_abilities = vanilla_enemies.copy() + self.copy_abilities: Dict[str, str] = vanilla_enemies.copy() + self.required_heart_stars: int = 0 # we fill this during create_items + self.boss_requirements: Dict[int, int] = dict() + self.player_levels = default_levels.copy() + self.stage_shuffle_enabled = False + self.boss_butch_bosses: List[Optional[bool]] = list() @classmethod def stage_assert_generate(cls, multiworld: MultiWorld) -> None: @@ -104,14 +100,14 @@ def create_item(self, name: str, force_non_progression=False) -> KDL3Item: return KDL3Item(name, classification, item.code, self.player) def get_filler_item_name(self) -> str: - return self.multiworld.random.choices(list(filler_item_weights.keys()), - weights=list(filler_item_weights.values()))[0] + return self.random.choices(list(filler_item_weights.keys()), + weights=list(filler_item_weights.values()))[0] def get_trap_item_name(self) -> str: - return self.multiworld.random.choices(["Gooey Bag", "Slowness", "Eject Ability"], - weights=[self.multiworld.gooey_trap_weight[self.player], - self.multiworld.slow_trap_weight[self.player], - self.multiworld.ability_trap_weight[self.player]])[0] + return self.random.choices(["Gooey Bag", "Slowness", "Eject Ability"], + weights=[self.multiworld.gooey_trap_weight[self.player], + self.multiworld.slow_trap_weight[self.player], + self.multiworld.ability_trap_weight[self.player]])[0] def generate_early(self) -> None: # just check for invalid option combos here @@ -130,7 +126,7 @@ def pre_fill(self) -> None: # Not having ChuChu here makes the room impossible (since only she has vertical burning) self.multiworld.get_location("Ripple Field 5 - Animal 2", self.player) \ .place_locked_item(self.create_item("Pitch Spawn")) - guaranteed_animal = self.multiworld.per_slot_randoms[self.player].choice(["Kine Spawn", "Coo Spawn"]) + guaranteed_animal = self.random.choice(["Kine Spawn", "Coo Spawn"]) self.multiworld.get_location("Sand Canyon 6 - Animal 1", self.player) \ .place_locked_item(self.create_item(guaranteed_animal)) # Ripple Field 5 - Animal 2 needs to be Pitch to ensure accessibility on non-door rando @@ -140,7 +136,7 @@ def pre_fill(self) -> None: "Iceberg 4 - Animal 1"]] else: animal_base = ["Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn"] - animal_pool = [self.multiworld.per_slot_randoms[self.player].choice(animal_base) + animal_pool = [self.random.choice(animal_base) for _ in range(len(animal_friend_spawns) - 9)] # have to guarantee one of each animal animal_pool.extend(animal_base) @@ -171,13 +167,13 @@ def pre_fill(self) -> None: else: available_enemies.append(enemy) else: - chosen_enemy = self.multiworld.per_slot_randoms[self.player].choice(available_enemies) - chosen_ability = self.multiworld.per_slot_randoms[self.player].choice(tuple(abilities)) + chosen_enemy = self.random.choice(available_enemies) + chosen_ability = self.random.choice(tuple(abilities)) self.copy_abilities[chosen_enemy] = chosen_ability enemies_to_set.remove(chosen_enemy) # place remaining for enemy in enemies_to_set: - self.copy_abilities[enemy] = self.multiworld.per_slot_randoms[self.player] \ + self.copy_abilities[enemy] = self.random \ .choice(valid_abilities) for enemy in enemy_mapping: @@ -199,19 +195,19 @@ def create_items(self) -> None: trap_amount = math.floor(filler_amount * (self.multiworld.trap_percentage[self.player] / 100.0)) filler_amount -= trap_amount non_required_heart_stars = filler_items - filler_amount - trap_amount - self.required_heart_stars[self.player] = required_heart_stars + self.required_heart_stars = required_heart_stars # handle boss requirements here requirements = [required_heart_stars] if self.multiworld.boss_requirement_random[self.player]: for i in range(4): - requirements.append(self.multiworld.per_slot_randoms[self.player].randint( + requirements.append(self.random.randint( min(3, required_heart_stars), required_heart_stars)) - self.multiworld.per_slot_randoms[self.player].shuffle(requirements) + self.random.shuffle(requirements) else: quotient = required_heart_stars // 5 # since we set the last manually, we can afford imperfect rounding for i in range(1, 5): requirements.insert(i - 1, quotient * i) - self.boss_requirements[self.player] = requirements + self.boss_requirements = requirements itempool.extend([self.create_item("Heart Star") for _ in range(required_heart_stars)]) itempool.extend([self.create_item(self.get_filler_item_name()) for _ in range(filler_amount + (remaining_items - total_heart_stars))]) @@ -220,9 +216,9 @@ def create_items(self) -> None: itempool.extend([self.create_item("Heart Star", True) for _ in range(non_required_heart_stars)]) self.multiworld.itempool += itempool - for level in self.player_levels[self.player]: + for level in self.player_levels: for stage in range(0, 6): - self.multiworld.get_location(location_table[self.player_levels[self.player][level][stage]] + self.multiworld.get_location(location_table[self.player_levels[level][stage]] .replace("Complete", "Stage Completion"), self.player) \ .place_locked_item(KDL3Item( f"{LocationName.level_names_inverse[level]}" @@ -241,14 +237,15 @@ def generate_basic(self) -> None: .place_locked_item( KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) - self.boss_butch_bosses[self.player] = [False for _ in range(6)] + # this can technically be done at any point + self.boss_butch_bosses.extend([None for _ in range(6)]) if self.multiworld.allow_bb[self.player]: for i in range(6): if self.multiworld.allow_bb[self.player] == 1: - self.boss_butch_bosses[self.player][i] = self.multiworld.per_slot_randoms[self.player].choice( + self.boss_butch_bosses[i] = self.random.choice( [True, False]) else: - self.boss_butch_bosses[self.player][i] = True + self.boss_butch_bosses[i] = True def generate_output(self, output_directory: str): rom_path = "" @@ -257,11 +254,12 @@ def generate_output(self, output_directory: str): player = self.player rom = RomData(get_base_rom_path()) - patch_rom(self.multiworld, self.player, rom, self.required_heart_stars[self.player], - self.boss_requirements[self.player], - self.player_levels[self.player], - self.boss_butch_bosses[self.player], - self.copy_abilities) + patch_rom(self.multiworld, self.player, rom, self.required_heart_stars, + self.boss_requirements, + self.player_levels, + self.boss_butch_bosses, + self.copy_abilities, + self.random) rom_path = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") rom.write_to_file(rom_path) @@ -290,16 +288,16 @@ def write_spoiler(self, spoiler_handle: TextIO) -> None: if self.stage_shuffle_enabled: spoiler_handle.write(f"\nLevel Layout ({self.multiworld.get_player_name(self.player)}):\n") for level in LocationName.level_names: - for stage, i in zip(self.player_levels[self.player][LocationName.level_names[level]], range(1, 7)): + for stage, i in zip(self.player_levels[LocationName.level_names[level]], range(1, 7)): spoiler_handle.write(f"{level} {i}: {location_table[stage].replace(' - Complete', '')}\n") def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): if self.stage_shuffle_enabled: regions = {LocationName.level_names[level]: level for level in LocationName.level_names} level_hint_data = {} - for level in self.player_levels[self.player]: - for i in range(len(self.player_levels[self.player][level]) - 1): - stage = self.player_levels[self.player][level][i] + for level in self.player_levels: + for i in range(len(self.player_levels[level]) - 1): + stage = self.player_levels[level][i] level_hint_data[stage] = regions[level] + f" {i + 1}" if stage & 0x200 == 0: level_hint_data[stage + 0x100] = regions[level] + f" {i + 1}" From 941ccd1b26a1b960a4d6d25dbe6c7160acf91a72 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 7 Aug 2023 00:41:04 -0500 Subject: [PATCH 097/165] actually implement plus minus --- worlds/kdl3/Rom.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 78f743b7c964..824fc0f9bd6e 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -1208,6 +1208,11 @@ def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, rom.write_byte(0x2F90E2, 0x5E + (ability_remap[copy_abilities["Captain Stitch"]] << 1)) rom.write_byte(0x2F9109, 0x5E + (ability_remap[copy_abilities["Captain Stitch"]] << 1)) + if multiworld.copy_ability_randomization[player] == 2: + for enemy in enemy_remap: + # we just won't include it for minibosses + rom.write_bytes(0xB3E40 + (enemy_remap[enemy] << 1), struct.pack("h", slot_random.randint(-1, 2))) + # write jumping goal rom.write_bytes(0x94F8, struct.pack("H", multiworld.jumping_target[player])) rom.write_bytes(0x944E, struct.pack("H", multiworld.jumping_target[player])) From 077ae0c36012c14a6d4b14f2c82866ce56134136 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 7 Aug 2023 15:13:41 -0500 Subject: [PATCH 098/165] typing, gen valid rom CRC --- worlds/kdl3/Rom.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 824fc0f9bd6e..0895bd86f9d9 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -1,11 +1,14 @@ import typing from pkgutil import get_data +from random import Random import Utils -from typing import Optional +from typing import Optional, Dict, List import hashlib import os import struct + +from BaseClasses import MultiWorld from worlds.Files import APDeltaPatch from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette, gooey_target_palettes, \ get_gooey_palette @@ -279,6 +282,11 @@ def read_from_file(self, file: str): with open(file, 'rb') as stream: self.file = bytearray(stream.read()) + def write_crc(self): + crc = (sum(self.file[:0x7FDC] + self.file[0x7FE0:]) + 0x01FE) & 0xFFFF + inv = crc ^ 0xFFFF + self.write_bytes(0x7FDC, [inv & 0xFF, (inv >> 8) & 0xFF, crc & 0xFF, (crc >> 8) & 0xFF]) + def handle_level_sprites(stages, sprites, palettes): palette_by_level = list() @@ -362,11 +370,13 @@ def patch(self, target: str): 0x50, 0xC4, 0x39]) if rom.read_bytes(0x3D018, 1)[0] > 0: write_consumable_sprites(rom) + rom.write_crc() rom.write_to_file(target) -def patch_rom(multiworld, player, rom, heart_stars_required, boss_requirements, - shuffled_levels, bb_boss_enabled, copy_abilities, slot_random): +def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_required: int, + boss_requirements: Dict[int, int], shuffled_levels: Dict[int, List[int]], bb_boss_enabled: Dict[int, int], + copy_abilities: Dict[str, str], slot_random: Random): # increase BWRAM by 0x8000 rom.write_byte(0x7FD8, 0x06) From 449c046690ce1e5e2a4848aad3cd1f8fe0cc98c3 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 12 Aug 2023 02:25:14 -0500 Subject: [PATCH 099/165] differentiate between filler and progression consumables --- worlds/kdl3/Regions.py | 3 +- worlds/kdl3/Rom.py | 2 + worlds/kdl3/Room.py | 52 +- worlds/kdl3/data/APConsumable.bsdiff4 | Bin 572 -> 585 bytes worlds/kdl3/data/Rooms.json | 5734 ++++++++++++++++++++++++- 5 files changed, 5732 insertions(+), 59 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index d986f830b1f9..240a26459675 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -46,7 +46,8 @@ def generate_rooms(world: World, door_shuffle: bool, level_regions: typing.Dict[ for room_entry in room_data: room = Room(room_entry["name"], world.player, world.multiworld, None, room_entry["level"], room_entry["stage"], room_entry["room"], room_entry["pointer"], room_entry["music"], room_entry["default_exits"], - room_entry["animal_pointers"], room_entry["enemies"]) + room_entry["animal_pointers"], room_entry["enemies"], room_entry["entity_load"], + room_entry["consumables"], room_entry["consumables_pointer"]) room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else None for location in room_entry["locations"] if not any([x in location for x in ["1-Up", "Maxim"]]) or world.multiworld.consumables[world.player]}, KDL3Location) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 0895bd86f9d9..43be4c6c18dd 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -370,6 +370,8 @@ def patch(self, target: str): 0x50, 0xC4, 0x39]) if rom.read_bytes(0x3D018, 1)[0] > 0: write_consumable_sprites(rom) + rom_name = rom.read_bytes(0x3C000, 21) + rom.write_bytes(0x7FC0, rom_name) rom.write_crc() rom.write_to_file(target) diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index e38546b405fa..c0fbcf3ef19d 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -1,6 +1,6 @@ import struct import typing -from BaseClasses import CollectionState, Region +from BaseClasses import CollectionState, Region, ItemClassification from struct import unpack if typing.TYPE_CHECKING: @@ -25,9 +25,11 @@ class Room(Region): default_exits: typing.List[typing.Dict[str, typing.Union[int, typing.List[str]]]] animal_pointers: typing.List[int] enemies: typing.List[str] + entity_load: typing.List[typing.List[int]] + consumables: typing.List[typing.Dict[str, typing.Union[int, str]]] def __init__(self, name, player, multiworld, hint, level, stage, room, pointer, music, default_exits, - animal_pointers, enemies): + animal_pointers, enemies, entity_load, consumables, consumable_pointer): super().__init__(name, player, multiworld, hint) self.level = level self.stage = stage @@ -37,6 +39,9 @@ def __init__(self, name, player, multiworld, hint, level, stage, room, pointer, self.default_exits = default_exits self.animal_pointers = animal_pointers self.enemies = enemies + self.entity_load = entity_load + self.consumables = consumables + self.consumable_pointer = consumable_pointer def patch(self, rom: "RomData"): rom.write_byte(self.pointer + 2, self.music) @@ -44,3 +49,46 @@ def patch(self, rom: "RomData"): if len(animals) > 0: for current_animal, address in zip(animals, self.animal_pointers): rom.write_byte(self.pointer + address + 7, animal_map[current_animal]) + if self.multiworld.consumables[self.player]: + load_len = len(self.entity_load) + for consumable in self.consumables: + location = next(x for x in self.locations if x.name == consumable["name"]) + is_progression = location.item.classification & ItemClassification.progression + if load_len == 8: + # edge case, there is exactly 1 room with 8 entities and only 1 consumable among them + if not any(x not in self.entity_load for x in [[0, 22], [1, 22]]) \ + and any(x not in self.entity_load for x in [[2, 22], [3, 22]]): + replacement_target = self.entity_load.index( + next(x for x in self.entity_load if x in [[0, 22], [1, 22], [2, 22], [3, 22]])) + if is_progression: + vtype = 0 + else: + vtype = 2 + rom.write_byte(self.pointer + 88 + (replacement_target * 2), vtype) + self.entity_load[replacement_target] = [vtype, 22] + else: + if is_progression: + # we need to see if 1-ups are in our load list + if any(x not in self.entity_load for x in [[0, 22], [1, 22]]): + self.entity_load.append([0, 22]) + else: + if any(x not in self.entity_load for x in [[2, 22], [3, 22]]): + # edge case: if (1, 22) is in, we need to load (3, 22) instead + if (1, 22) in self.entity_load: + self.entity_load.append([3, 22]) + else: + self.entity_load.append([2, 22]) + if load_len < len(self.entity_load): + rom.write_bytes(self.pointer + 88 + (load_len * 2), bytes(self.entity_load[load_len])) + rom.write_bytes(self.pointer + 104 + (load_len * 2), bytes(struct.pack("H", self.consumable_pointer))) + if is_progression: + if [1, 22] in self.entity_load: + vtype = 1 + else: + vtype = 0 + else: + if [3, 22] in self.entity_load: + vtype = 3 + else: + vtype = 2 + rom.write_byte(self.pointer + consumable["pointer"] + 7, vtype) diff --git a/worlds/kdl3/data/APConsumable.bsdiff4 b/worlds/kdl3/data/APConsumable.bsdiff4 index 83c6b920ae983decb26a4d2d80af10d83ebc0451..e930a4e2b30ca2094f8bced437275ff9c89bec27 100644 GIT binary patch delta 525 zcmV+o0`mR51jz&uLQ_OZMn*I+F8}}l00000?2!>je|H_z)c^nufB*bnaanwJ&RX;U z6pf(>xL)$`b7GWfvIqPo#N&Ni`(LmD8M3icQ_>NMkjao~r>W|CjRuFLG|`~MWCKi1 z0~662Jw{K}GHA^sOh#yWp^2cHVlkvNUzK-4wLKm`Pp47GKh<7Nr~ z79|QrFpFpu7u>MQl$pdLA{~DP=;30P+C(_1mRZ2$^F@9fs&~^$LD5|YJ zn#sx)(f6f5Wv4D`2es1W-q%W_Y=na5#&Dz>qts@s%sn9r4+AiuWmH%kLm6tLKk&dL za{&I=!0I?IKSN3f+bq(5il0O&-LSR(SMf~J z_!f~j9*m5Qbu)=#E;3h(m<9ECMZ_ZDZ=!t>!!R0(%h6OpQ`vuuxgwk>NIQ<{>VQI8 PXf+pdML1B900000;8Nz? delta 512 zcmV+b0{{KV1iSxL)$`b7GWfvIqVKz~_BR+fT3o8L?wDY5_Ay(9=u+Molq2LjZ#T44N>8jiEF$ zZ71po%%D9?1yQDgdPW4sr=-S{OaU1&F&G*XL4cZInKWe6CZ2#p05l>IJxv7tNwqR) zX`z!fe;7s}27#kNh!{*J0UBfgJthz`PfIiK4?+n90dQinb`Gwa&Hf|+J1-ik;x&>3 z229`9M4}S0g;dE#Gebl$ibdgIp#4ck!RI*uJ*I7M8r)>)hNs0csSD;kja=d*N85>(EX zX14?-EY3pr<+?^gCloT!Gjj)}gtwuUluy<`+yQ_oa|MShu)YEGj7Ja&2DWxk^2^<= zSy!VZ$T5=s$^(%CHW7i!3F#1R)Qv^)-!J&Pk}1N3hO7|5;6hqxH5YP4I8cxP0002Z CAlnK6 diff --git a/worlds/kdl3/data/Rooms.json b/worlds/kdl3/data/Rooms.json index a3a4e9128cfa..c88c350401e3 100644 --- a/worlds/kdl3/data/Rooms.json +++ b/worlds/kdl3/data/Rooms.json @@ -6,6 +6,8 @@ "room": 0, "pointer": 3434257, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee", "Sir Kibble", @@ -31,6 +33,36 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 16 + ], + [ + 1, + 23 + ], + [ + 0, + 23 + ], + [ + 14, + 23 + ], + [ + 27, + 16 + ], + [ + 12, + 16 + ], + [ + 4, + 22 + ] + ], "locations": [ "Grass Land 1 - Enemy 1 (Waddle Dee)", "Grass Land 1 - Enemy 2 (Sir Kibble)", @@ -45,6 +77,27 @@ "room": 1, "pointer": 3368373, "animal_pointers": [], + "consumables": [ + { + "idx": 14, + "pointer": 264, + "x": 928, + "y": 160, + "etype": 22, + "vtype": 0, + "name": "Grass Land 1 - 1-Up (Parasol)" + }, + { + "idx": 15, + "pointer": 312, + "x": 1456, + "y": 176, + "etype": 22, + "vtype": 2, + "name": "Grass Land 1 - Maxim Tomato (Spark)" + } + ], + "consumables_pointer": 304, "enemies": [ "Sparky", "Bronto Burt", @@ -61,12 +114,42 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 30, + 16 + ], + [ + 12, + 16 + ], + [ + 14, + 23 + ], + [ + 8, + 16 + ], + [ + 0, + 22 + ], + [ + 2, + 22 + ] + ], "locations": [ - "Grass Land 1 - 1-Up (Parasol)", - "Grass Land 1 - Maxim Tomato (Spark)", "Grass Land 1 - Enemy 4 (Sparky)", "Grass Land 1 - Enemy 5 (Bronto Burt)", - "Grass Land 1 - Enemy 6 (Sasuke)" + "Grass Land 1 - Enemy 6 (Sasuke)", + "Grass Land 1 - 1-Up (Parasol)", + "Grass Land 1 - Maxim Tomato (Spark)" ], "music": 20 }, @@ -80,6 +163,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -92,6 +177,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Grass Land 1 - Animal 1", "Grass Land 1 - Animal 2" @@ -105,6 +191,8 @@ "room": 3, "pointer": 3478442, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Poppy Bros Jr." ], @@ -119,6 +207,36 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 19 + ], + [ + 7, + 16 + ], + [ + 0, + 23 + ], + [ + 6, + 22 + ], + [ + 14, + 23 + ], + [ + 8, + 16 + ], + [ + 1, + 23 + ] + ], "locations": [ "Grass Land 1 - Enemy 7 (Poppy Bros Jr.)" ], @@ -131,6 +249,8 @@ "room": 4, "pointer": 2978390, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -143,6 +263,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Grass Land 1 - Tulip" ], @@ -155,8 +285,16 @@ "room": 5, "pointer": 2890835, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Grass Land 1 - Complete" ], @@ -169,6 +307,8 @@ "room": 0, "pointer": 3293347, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Rocky", "KeKe", @@ -186,6 +326,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 3, + 16 + ], + [ + 7, + 16 + ], + [ + 5, + 16 + ], + [ + 4, + 22 + ], + [ + 51, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Grass Land 2 - Enemy 1 (Rocky)", "Grass Land 2 - Enemy 2 (KeKe)", @@ -204,6 +370,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -216,6 +384,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Grass Land 2 - Animal 1", "Grass Land 2 - Animal 2" @@ -229,6 +398,8 @@ "room": 2, "pointer": 3432109, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee", "Popon Ball", @@ -254,6 +425,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 13, + 16 + ], + [ + 50, + 16 + ], + [ + 4, + 22 + ], + [ + 3, + 16 + ], + [ + 0, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Grass Land 2 - Enemy 5 (Waddle Dee)", "Grass Land 2 - Enemy 6 (Popon Ball)", @@ -268,6 +465,8 @@ "room": 3, "pointer": 2970029, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -280,6 +479,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 1, + 19 + ] + ], "locations": [], "music": 11 }, @@ -290,6 +495,18 @@ "room": 4, "pointer": 3578022, "animal_pointers": [], + "consumables": [ + { + "idx": 20, + "pointer": 272, + "x": 992, + "y": 192, + "etype": 22, + "vtype": 0, + "name": "Grass Land 2 - 1-Up (Needle)" + } + ], + "consumables_pointer": 352, "enemies": [ "Tick", "Bronto Burt", @@ -306,11 +523,37 @@ "access_rule": [] } ], + "entity_load": [ + [ + 15, + 16 + ], + [ + 5, + 16 + ], + [ + 2, + 16 + ], + [ + 48, + 16 + ], + [ + 14, + 23 + ], + [ + 0, + 22 + ] + ], "locations": [ - "Grass Land 2 - 1-Up (Needle)", "Grass Land 2 - Enemy 8 (Tick)", "Grass Land 2 - Enemy 9 (Bronto Burt)", - "Grass Land 2 - Enemy 10 (Nruff)" + "Grass Land 2 - Enemy 10 (Nruff)", + "Grass Land 2 - 1-Up (Needle)" ], "music": 11 }, @@ -321,6 +564,8 @@ "room": 5, "pointer": 2966057, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -333,6 +578,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 1, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Grass Land 2 - Muchimuchi" ], @@ -345,8 +600,16 @@ "room": 6, "pointer": 2887461, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Grass Land 2 - Complete" ], @@ -359,6 +622,8 @@ "room": 0, "pointer": 3149707, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sparky", "Rocky", @@ -384,6 +649,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 3, + 16 + ], + [ + 14, + 23 + ], + [ + 15, + 16 + ], + [ + 0, + 16 + ], + [ + 8, + 16 + ] + ], "locations": [ "Grass Land 3 - Enemy 1 (Sparky)", "Grass Land 3 - Enemy 2 (Rocky)", @@ -398,6 +685,27 @@ "room": 1, "pointer": 3204939, "animal_pointers": [], + "consumables": [ + { + "idx": 10, + "pointer": 360, + "x": 208, + "y": 344, + "etype": 22, + "vtype": 0, + "name": "Grass Land 3 - 1-Up (Climb)" + }, + { + "idx": 11, + "pointer": 376, + "x": 224, + "y": 568, + "etype": 22, + "vtype": 2, + "name": "Grass Land 3 - Maxim Tomato (Climb)" + } + ], + "consumables_pointer": 128, "enemies": [], "default_exits": [ { @@ -410,6 +718,40 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 22 + ], + [ + 6, + 23 + ], + [ + 2, + 22 + ], + [ + 5, + 23 + ], + [ + 14, + 23 + ], + [ + 1, + 23 + ], + [ + 0, + 23 + ], + [ + 31, + 16 + ] + ], "locations": [ "Grass Land 3 - 1-Up (Climb)", "Grass Land 3 - Maxim Tomato (Climb)" @@ -423,6 +765,8 @@ "room": 2, "pointer": 3200066, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -435,6 +779,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 15, + 16 + ], + [ + 0, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [], "music": 19 }, @@ -445,6 +803,8 @@ "room": 3, "pointer": 2959784, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -457,6 +817,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 19 + ] + ], "locations": [], "music": 31 }, @@ -470,6 +836,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -482,6 +850,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Grass Land 3 - Animal 1", "Grass Land 3 - Animal 2" @@ -495,6 +864,8 @@ "room": 5, "pointer": 2997811, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -507,6 +878,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 19 + ] + ], "locations": [], "music": 8 }, @@ -517,6 +894,8 @@ "room": 6, "pointer": 3084876, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bouncy" ], @@ -531,6 +910,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 13, + 16 + ], + [ + 14, + 16 + ], + [ + 1, + 23 + ], + [ + 59, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Grass Land 3 - Pitcherman", "Grass Land 3 - Enemy 4 (Bouncy)" @@ -544,8 +945,16 @@ "room": 7, "pointer": 2891317, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Grass Land 3 - Complete" ], @@ -558,6 +967,8 @@ "room": 0, "pointer": 3471284, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Loud", "Babut", @@ -574,6 +985,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 3, + 16 + ], + [ + 43, + 16 + ], + [ + 14, + 23 + ], + [ + 40, + 16 + ], + [ + 61, + 16 + ], + [ + 4, + 22 + ] + ], "locations": [ "Grass Land 4 - Enemy 1 (Loud)", "Grass Land 4 - Enemy 2 (Babut)", @@ -588,6 +1025,18 @@ "room": 1, "pointer": 3436401, "animal_pointers": [], + "consumables": [ + { + "idx": 12, + "pointer": 290, + "x": 1008, + "y": 144, + "etype": 22, + "vtype": 2, + "name": "Grass Land 4 - Maxim Tomato (Zebon Right)" + } + ], + "consumables_pointer": 368, "enemies": [ "Kapar" ], @@ -611,9 +1060,35 @@ "access_rule": [] } ], - "locations": [ - "Grass Land 4 - Maxim Tomato (Zebon Right)", - "Grass Land 4 - Enemy 4 (Kapar)" + "entity_load": [ + [ + 43, + 16 + ], + [ + 10, + 23 + ], + [ + 6, + 22 + ], + [ + 14, + 23 + ], + [ + 2, + 22 + ], + [ + 67, + 16 + ] + ], + "locations": [ + "Grass Land 4 - Enemy 4 (Kapar)", + "Grass Land 4 - Maxim Tomato (Zebon Right)" ], "music": 10 }, @@ -624,6 +1099,8 @@ "room": 2, "pointer": 3039401, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -636,6 +1113,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 27 + ] + ], "locations": [ ], "music": 9 @@ -647,6 +1130,27 @@ "room": 3, "pointer": 3722714, "animal_pointers": [], + "consumables": [ + { + "idx": 23, + "pointer": 280, + "x": 856, + "y": 224, + "etype": 22, + "vtype": 2, + "name": "Grass Land 4 - Maxim Tomato (Gordo)" + }, + { + "idx": 22, + "pointer": 480, + "x": 1352, + "y": 112, + "etype": 22, + "vtype": 0, + "name": "Grass Land 4 - 1-Up (Gordo)" + } + ], + "consumables_pointer": 288, "enemies": [ "Glunk", "Oro" @@ -662,11 +1166,45 @@ "access_rule": [] } ], + "entity_load": [ + [ + 1, + 16 + ], + [ + 55, + 16 + ], + [ + 16, + 16 + ], + [ + 25, + 16 + ], + [ + 14, + 23 + ], + [ + 0, + 22 + ], + [ + 2, + 22 + ], + [ + 4, + 22 + ] + ], "locations": [ - "Grass Land 4 - Maxim Tomato (Gordo)", - "Grass Land 4 - 1-Up (Gordo)", "Grass Land 4 - Enemy 5 (Glunk)", - "Grass Land 4 - Enemy 6 (Oro)" + "Grass Land 4 - Enemy 6 (Oro)", + "Grass Land 4 - Maxim Tomato (Gordo)", + "Grass Land 4 - 1-Up (Gordo)" ], "music": 10 }, @@ -677,6 +1215,18 @@ "room": 4, "pointer": 3304980, "animal_pointers": [], + "consumables": [ + { + "idx": 32, + "pointer": 208, + "x": 488, + "y": 64, + "etype": 22, + "vtype": 2, + "name": "Grass Land 4 - Maxim Tomato (Cliff)" + } + ], + "consumables_pointer": 160, "enemies": [], "default_exits": [ { @@ -689,6 +1239,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 43, + 16 + ], + [ + 2, + 22 + ], + [ + 54, + 16 + ], + [ + 1, + 16 + ], + [ + 40, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Grass Land 4 - Maxim Tomato (Cliff)" ], @@ -701,6 +1277,8 @@ "room": 5, "pointer": 3498127, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Peran" ], @@ -724,6 +1302,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 72, + 16 + ], + [ + 43, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ], + [ + 10, + 23 + ], + [ + 3, + 16 + ] + ], "locations": [ "Grass Land 4 - Enemy 7 (Peran)" ], @@ -736,6 +1340,8 @@ "room": 6, "pointer": 3160191, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -757,6 +1363,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 3, + 19 + ], + [ + 6, + 23 + ] + ], "locations": [], "music": 10 }, @@ -767,6 +1383,8 @@ "room": 7, "pointer": 3035801, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -779,6 +1397,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 27 + ] + ], "locations": [ "Grass Land 4 - Miniboss 1 (Boboo)" ], @@ -791,6 +1415,8 @@ "room": 8, "pointer": 2989794, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -803,6 +1429,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 3, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Grass Land 4 - Chao & Goku" ], @@ -818,6 +1454,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -830,6 +1468,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Grass Land 4 - Animal 1", "Grass Land 4 - Animal 2" @@ -843,8 +1482,16 @@ "room": 10, "pointer": 2888425, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Grass Land 4 - Complete" ], @@ -857,6 +1504,8 @@ "room": 0, "pointer": 3303565, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Propeller", "Broom Hatter", @@ -873,6 +1522,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 13, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ], + [ + 6, + 23 + ], + [ + 11, + 16 + ], + [ + 89, + 16 + ] + ], "locations": [ "Grass Land 5 - Enemy 1 (Propeller)", "Grass Land 5 - Enemy 2 (Broom Hatter)", @@ -887,6 +1562,8 @@ "room": 1, "pointer": 3048718, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sir Kibble" ], @@ -919,6 +1596,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 27, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Grass Land 5 - Enemy 4 (Sir Kibble)" ], @@ -931,6 +1618,8 @@ "room": 2, "pointer": 3327019, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee", "Sasuke", @@ -947,6 +1636,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 30, + 16 + ], + [ + 15, + 16 + ], + [ + 1, + 16 + ] + ], "locations": [ "Grass Land 5 - Enemy 5 (Waddle Dee)", "Grass Land 5 - Enemy 6 (Sasuke)", @@ -964,6 +1679,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -976,6 +1693,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Grass Land 5 - Animal 1", "Grass Land 5 - Animal 2" @@ -992,6 +1710,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1004,6 +1724,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Grass Land 5 - Animal 3", "Grass Land 5 - Animal 4" @@ -1017,6 +1738,8 @@ "room": 5, "pointer": 2962351, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1029,6 +1752,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Grass Land 5 - Mine" ], @@ -1041,8 +1774,16 @@ "room": 6, "pointer": 2886738, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Grass Land 5 - Complete" ], @@ -1055,6 +1796,8 @@ "room": 7, "pointer": 3255423, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Tick" ], @@ -1069,6 +1812,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 48, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ] + ], "locations": [ "Grass Land 5 - Enemy 8 (Tick)" ], @@ -1081,6 +1838,8 @@ "room": 0, "pointer": 3376872, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Como", "Togezo", @@ -1107,6 +1866,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 12, + 16 + ], + [ + 18, + 16 + ], + [ + 2, + 16 + ], + [ + 41, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ] + ], "locations": [ "Grass Land 6 - Enemy 1 (Como)", "Grass Land 6 - Enemy 2 (Togezo)", @@ -1122,6 +1907,18 @@ "room": 1, "pointer": 3395125, "animal_pointers": [], + "consumables": [ + { + "idx": 10, + "pointer": 192, + "x": 104, + "y": 1144, + "etype": 22, + "vtype": 0, + "name": "Grass Land 6 - 1-Up (Tower)" + } + ], + "consumables_pointer": 256, "enemies": [ "Bobo", "Mariel" @@ -1137,10 +1934,40 @@ "access_rule": [] } ], + "entity_load": [ + [ + 5, + 16 + ], + [ + 5, + 19 + ], + [ + 45, + 16 + ], + [ + 0, + 22 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ], + [ + 55, + 16 + ] + ], "locations": [ - "Grass Land 6 - 1-Up (Tower)", "Grass Land 6 - Enemy 5 (Bobo)", - "Grass Land 6 - Enemy 6 (Mariel)" + "Grass Land 6 - Enemy 6 (Mariel)", + "Grass Land 6 - 1-Up (Tower)" ], "music": 20 }, @@ -1151,6 +1978,8 @@ "room": 2, "pointer": 3375177, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Yaban", "Broom Hatter" @@ -1175,6 +2004,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 11, + 16 + ], + [ + 45, + 16 + ], + [ + 41, + 16 + ], + [ + 4, + 22 + ], + [ + 32, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Grass Land 6 - Enemy 7 (Yaban)", "Grass Land 6 - Enemy 8 (Broom Hatter)" @@ -1188,6 +2043,8 @@ "room": 3, "pointer": 3322977, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Apolo", "Sasuke" @@ -1203,6 +2060,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 41, + 16 + ], + [ + 49, + 16 + ], + [ + 30, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ] + ], "locations": [ "Grass Land 6 - Enemy 9 (Apolo)", "Grass Land 6 - Enemy 10 (Sasuke)" @@ -1216,6 +2095,18 @@ "room": 4, "pointer": 3490819, "animal_pointers": [], + "consumables": [ + { + "idx": 33, + "pointer": 192, + "x": 40, + "y": 104, + "etype": 22, + "vtype": 1, + "name": "Grass Land 6 - 1-Up (Falling)" + } + ], + "consumables_pointer": 176, "enemies": [ "Rocky" ], @@ -1230,9 +2121,39 @@ "access_rule": [] } ], - "locations": [ - "Grass Land 6 - 1-Up (Falling)", - "Grass Land 6 - Enemy 11 (Rocky)" + "entity_load": [ + [ + 5, + 16 + ], + [ + 4, + 22 + ], + [ + 49, + 16 + ], + [ + 61, + 16 + ], + [ + 3, + 16 + ], + [ + 1, + 22 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 6 - Enemy 11 (Rocky)", + "Grass Land 6 - 1-Up (Falling)" ], "music": 20 }, @@ -1243,6 +2164,8 @@ "room": 5, "pointer": 3076769, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1255,6 +2178,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 5, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Grass Land 6 - Pierre" ], @@ -1270,6 +2203,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1282,6 +2217,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Grass Land 6 - Animal 1", "Grass Land 6 - Animal 2" @@ -1298,6 +2234,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1310,6 +2248,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Grass Land 6 - Animal 3", "Grass Land 6 - Animal 4" @@ -1323,8 +2262,16 @@ "room": 8, "pointer": 2884569, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Grass Land 6 - Complete" ], @@ -1337,8 +2284,16 @@ "room": 0, "pointer": 2984105, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 0, + 18 + ] + ], "locations": [ "Grass Land - Boss (Whispy Woods) Purified", "Level 1 Boss" @@ -1352,6 +2307,8 @@ "room": 0, "pointer": 3279855, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee", "Glunk", @@ -1369,6 +2326,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 16, + 16 + ], + [ + 0, + 16 + ], + [ + 12, + 16 + ], + [ + 11, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Ripple Field 1 - Enemy 1 (Waddle Dee)", "Ripple Field 1 - Enemy 2 (Glunk)", @@ -1384,6 +2363,8 @@ "room": 1, "pointer": 3588688, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bronto Burt", "Rocky", @@ -1427,6 +2408,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 11, + 16 + ], + [ + 2, + 16 + ], + [ + 3, + 16 + ], + [ + 7, + 16 + ] + ], "locations": [ "Ripple Field 1 - Enemy 5 (Bronto Burt)", "Ripple Field 1 - Enemy 6 (Rocky)", @@ -1444,6 +2443,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1456,6 +2457,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Ripple Field 1 - Animal 1", "Ripple Field 1 - Animal 2" @@ -1469,6 +2471,8 @@ "room": 3, "pointer": 3558828, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bobin" ], @@ -1483,6 +2487,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 73, + 16 + ], + [ + 6, + 22 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 0, + 16 + ], + [ + 10, + 23 + ] + ], "locations": [ "Ripple Field 1 - Enemy 8 (Bobin)" ], @@ -1495,6 +2525,8 @@ "room": 4, "pointer": 2974271, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1507,6 +2539,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 7, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Ripple Field 1 - Kamuribana" ], @@ -1519,6 +2561,8 @@ "room": 5, "pointer": 3051513, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1531,6 +2575,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 7, + 19 + ], + [ + 14, + 23 + ] + ], "locations": [], "music": 15 }, @@ -1541,6 +2595,8 @@ "room": 6, "pointer": 3049838, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1553,6 +2609,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 7, + 19 + ], + [ + 14, + 23 + ] + ], "locations": [], "music": 15 }, @@ -1563,6 +2629,8 @@ "room": 7, "pointer": 3066407, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1575,6 +2643,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 7, + 19 + ] + ], "locations": [], "music": 15 }, @@ -1585,8 +2659,16 @@ "room": 8, "pointer": 2889148, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Ripple Field 1 - Complete" ], @@ -1599,6 +2681,8 @@ "room": 0, "pointer": 3342336, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Togezo", "Coconut", @@ -1616,6 +2700,36 @@ "access_rule": [] } ], + "entity_load": [ + [ + 5, + 22 + ], + [ + 34, + 16 + ], + [ + 30, + 16 + ], + [ + 21, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 18, + 16 + ] + ], "locations": [ "Ripple Field 2 - Enemy 1 (Togezo)", "Ripple Field 2 - Enemy 2 (Coconut)", @@ -1634,6 +2748,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1646,6 +2762,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Ripple Field 2 - Animal 1", "Ripple Field 2 - Animal 2" @@ -1659,6 +2776,8 @@ "room": 2, "pointer": 3451207, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Kany" ], @@ -1691,6 +2810,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 29, + 16 + ], + [ + 47, + 16 + ], + [ + 1, + 16 + ], + [ + 46, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Ripple Field 2 - Enemy 5 (Kany)" ], @@ -1703,6 +2844,27 @@ "room": 3, "pointer": 3674327, "animal_pointers": [], + "consumables": [ + { + "idx": 11, + "pointer": 480, + "x": 1384, + "y": 200, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 2 - Maxim Tomato (Currents)" + }, + { + "idx": 10, + "pointer": 520, + "x": 1456, + "y": 200, + "etype": 22, + "vtype": 0, + "name": "Ripple Field 2 - 1-Up (Currents)" + } + ], + "consumables_pointer": 128, "enemies": [ "Glunk" ], @@ -1717,10 +2879,36 @@ "access_rule": [] } ], - "locations": [ - "Ripple Field 2 - 1-Up (Currents)", + "entity_load": [ + [ + 0, + 22 + ], + [ + 2, + 22 + ], + [ + 14, + 23 + ], + [ + 16, + 16 + ], + [ + 21, + 16 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Ripple Field 2 - Enemy 6 (Glunk)", "Ripple Field 2 - Maxim Tomato (Currents)", - "Ripple Field 2 - Enemy 6 (Glunk)" + "Ripple Field 2 - 1-Up (Currents)" ], "music": 10 }, @@ -1731,6 +2919,8 @@ "room": 4, "pointer": 2972744, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1743,6 +2933,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 8, + 19 + ] + ], "locations": [], "music": 10 }, @@ -1756,6 +2952,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1768,6 +2966,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Ripple Field 2 - Animal 3", "Ripple Field 2 - Animal 4" @@ -1781,6 +2980,8 @@ "room": 6, "pointer": 2973127, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1793,6 +2994,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 8, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Ripple Field 2 - Bakasa" ], @@ -1805,8 +3016,16 @@ "room": 7, "pointer": 2890353, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Ripple Field 2 - Complete" ], @@ -1819,6 +3038,8 @@ "room": 0, "pointer": 3517254, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Raft Waddle Dee", "Kapar", @@ -1835,6 +3056,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 21, + 16 + ], + [ + 57, + 16 + ], + [ + 62, + 16 + ], + [ + 67, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ] + ], "locations": [ "Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", "Ripple Field 3 - Enemy 2 (Kapar)", @@ -1849,6 +3096,27 @@ "room": 1, "pointer": 3604480, "animal_pointers": [], + "consumables": [ + { + "idx": 10, + "pointer": 320, + "x": 832, + "y": 152, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 3 - Maxim Tomato (Cove)" + }, + { + "idx": 13, + "pointer": 424, + "x": 1128, + "y": 384, + "etype": 22, + "vtype": 0, + "name": "Ripple Field 3 - 1-Up (Cutter/Spark)" + } + ], + "consumables_pointer": 160, "enemies": [ "Sparky", "Glunk", @@ -1865,12 +3133,42 @@ "access_rule": [] } ], + "entity_load": [ + [ + 13, + 23 + ], + [ + 14, + 23 + ], + [ + 91, + 16 + ], + [ + 16, + 16 + ], + [ + 2, + 22 + ], + [ + 8, + 16 + ], + [ + 0, + 22 + ] + ], "locations": [ - "Ripple Field 3 - Maxim Tomato (Cove)", - "Ripple Field 3 - 1-Up (Cutter/Spark)", "Ripple Field 3 - Enemy 4 (Sparky)", "Ripple Field 3 - Enemy 5 (Glunk)", - "Ripple Field 3 - Enemy 6 (Joe)" + "Ripple Field 3 - Enemy 6 (Joe)", + "Ripple Field 3 - Maxim Tomato (Cove)", + "Ripple Field 3 - 1-Up (Cutter/Spark)" ], "music": 18 }, @@ -1881,6 +3179,8 @@ "room": 2, "pointer": 3715428, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bobo" ], @@ -1895,6 +3195,40 @@ "access_rule": [] } ], + "entity_load": [ + [ + 91, + 16 + ], + [ + 16, + 16 + ], + [ + 21, + 16 + ], + [ + 4, + 22 + ], + [ + 46, + 16 + ], + [ + 47, + 16 + ], + [ + 5, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Ripple Field 3 - Enemy 7 (Bobo)" ], @@ -1910,6 +3244,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1922,6 +3258,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Ripple Field 3 - Animal 1", "Ripple Field 3 - Animal 2" @@ -1935,6 +3272,8 @@ "room": 4, "pointer": 2970810, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1947,6 +3286,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 9, + 19 + ] + ], "locations": [ "Ripple Field 3 - Elieel" ], @@ -1959,6 +3304,8 @@ "room": 5, "pointer": 2987502, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -1971,6 +3318,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 9, + 19 + ] + ], "locations": [], "music": 31 }, @@ -1981,8 +3334,16 @@ "room": 6, "pointer": 2888666, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Ripple Field 3 - Complete" ], @@ -1995,6 +3356,8 @@ "room": 7, "pointer": 3161120, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2016,6 +3379,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 57, + 16 + ] + ], "locations": [], "music": 18 }, @@ -2026,6 +3395,8 @@ "room": 0, "pointer": 3082540, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bukiset (Stone)", "Bukiset (Needle)", @@ -2044,6 +3415,36 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 79, + 16 + ], + [ + 80, + 16 + ], + [ + 81, + 16 + ], + [ + 4, + 22 + ], + [ + 20, + 16 + ], + [ + 77, + 16 + ] + ], "locations": [ "Ripple Field 4 - Enemy 1 (Bukiset (Stone))", "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", @@ -2060,6 +3461,8 @@ "room": 1, "pointer": 2964846, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2072,6 +3475,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 27 + ] + ], "locations": [ "Ripple Field 4 - Miniboss 1 (Captain Stitch)" ], @@ -2084,6 +3493,8 @@ "room": 2, "pointer": 3018503, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bukiset (Burning)" ], @@ -2107,6 +3518,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 19 + ], + [ + 76, + 16 + ] + ], "locations": [ "Ripple Field 4 - Enemy 6 (Bukiset (Burning))" ], @@ -2119,6 +3540,8 @@ "room": 3, "pointer": 2988166, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2131,6 +3554,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Ripple Field 4 - Toad & Little Toad" ], @@ -2143,8 +3576,16 @@ "room": 4, "pointer": 2885533, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Ripple Field 4 - Complete" ], @@ -2161,6 +3602,8 @@ 230, 238 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2200,6 +3643,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Ripple Field 4 - Animal 1", "Ripple Field 4 - Animal 2", @@ -2214,6 +3658,8 @@ "room": 6, "pointer": 3234805, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bobin", "Blipper" @@ -2256,6 +3702,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 73, + 16 + ], + [ + 14, + 23 + ], + [ + 21, + 16 + ], + [ + 13, + 23 + ] + ], "locations": [ "Ripple Field 4 - Enemy 7 (Bobin)", "Ripple Field 4 - Enemy 8 (Blipper)" @@ -2269,6 +3733,8 @@ "room": 7, "pointer": 3155468, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2290,6 +3756,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 1, + 16 + ], + [ + 0, + 23 + ] + ], "locations": [], "music": 15 }, @@ -2300,6 +3780,8 @@ "room": 8, "pointer": 3350031, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Como", "Oro" @@ -2342,6 +3824,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 41, + 16 + ], + [ + 68, + 16 + ], + [ + 14, + 23 + ], + [ + 25, + 16 + ], + [ + 6, + 23 + ] + ], "locations": [ "Ripple Field 4 - Enemy 9 (Como)", "Ripple Field 4 - Enemy 10 (Oro)" @@ -2355,6 +3859,18 @@ "room": 9, "pointer": 3050397, "animal_pointers": [], + "consumables": [ + { + "idx": 29, + "pointer": 200, + "x": 88, + "y": 200, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 4 - Maxim Tomato (Stone)" + } + ], + "consumables_pointer": 176, "enemies": [ "Gansan" ], @@ -2369,9 +3885,19 @@ "access_rule": [] } ], + "entity_load": [ + [ + 75, + 16 + ], + [ + 2, + 22 + ] + ], "locations": [ - "Ripple Field 4 - Maxim Tomato (Stone)", - "Ripple Field 4 - Enemy 11 (Gansan)" + "Ripple Field 4 - Enemy 11 (Gansan)", + "Ripple Field 4 - Maxim Tomato (Stone)" ], "music": 15 }, @@ -2382,6 +3908,18 @@ "room": 10, "pointer": 3052069, "animal_pointers": [], + "consumables": [ + { + "idx": 30, + "pointer": 192, + "x": 200, + "y": 200, + "etype": 22, + "vtype": 0, + "name": "Ripple Field 4 - 1-Up (Stone)" + } + ], + "consumables_pointer": 128, "enemies": [], "default_exits": [ { @@ -2394,6 +3932,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 22 + ], + [ + 75, + 16 + ] + ], "locations": [ "Ripple Field 4 - 1-Up (Stone)" ], @@ -2406,6 +3954,8 @@ "room": 11, "pointer": 3386974, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee", "Kapar", @@ -2422,6 +3972,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 22, + 16 + ], + [ + 67, + 16 + ], + [ + 14, + 23 + ], + [ + 62, + 16 + ], + [ + 0, + 16 + ] + ], "locations": [ "Ripple Field 4 - Enemy 12 (Waddle Dee)", "Ripple Field 4 - Enemy 13 (Kapar)", @@ -2436,6 +4008,8 @@ "room": 12, "pointer": 3168339, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Nidoo" ], @@ -2459,6 +4033,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 59, + 16 + ], + [ + 13, + 23 + ], + [ + 28, + 16 + ] + ], "locations": [ "Ripple Field 4 - Enemy 15 (Nidoo)" ], @@ -2471,6 +4059,18 @@ "room": 13, "pointer": 2958478, "animal_pointers": [], + "consumables": [ + { + "idx": 54, + "pointer": 264, + "x": 216, + "y": 136, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 4 - Maxim Tomato (Dark)" + } + ], + "consumables_pointer": 128, "enemies": [], "default_exits": [ { @@ -2483,6 +4083,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 2, + 22 + ], + [ + 59, + 16 + ] + ], "locations": [ "Ripple Field 4 - Maxim Tomato (Dark)" ], @@ -2495,6 +4109,8 @@ "room": 0, "pointer": 3240369, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2507,6 +4123,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ] + ], "locations": [], "music": 16 }, @@ -2517,6 +4139,8 @@ "room": 1, "pointer": 3547528, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2529,6 +4153,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 1, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [], "music": 16 }, @@ -2539,6 +4173,8 @@ "room": 2, "pointer": 3611327, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Glunk", "Joe" @@ -2554,6 +4190,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 91, + 16 + ], + [ + 16, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Ripple Field 5 - Enemy 1 (Glunk)", "Ripple Field 5 - Enemy 2 (Joe)" @@ -2567,6 +4217,27 @@ "room": 3, "pointer": 3926157, "animal_pointers": [], + "consumables": [ + { + "idx": 32, + "pointer": 1258, + "x": 1488, + "y": 192, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 5 - Maxim Tomato (Currents)" + }, + { + "idx": 31, + "pointer": 1290, + "x": 1520, + "y": 192, + "etype": 22, + "vtype": 0, + "name": "Ripple Field 5 - 1-Up (Currents)" + } + ], + "consumables_pointer": 128, "enemies": [ "Bobin", "Mony", @@ -2592,12 +4263,46 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 22 + ], + [ + 2, + 22 + ], + [ + 6, + 22 + ], + [ + 14, + 23 + ], + [ + 1, + 16 + ], + [ + 73, + 16 + ], + [ + 22, + 16 + ], + [ + 20, + 16 + ] + ], "locations": [ - "Ripple Field 5 - 1-Up (Currents)", - "Ripple Field 5 - Maxim Tomato (Currents)", "Ripple Field 5 - Enemy 3 (Bobin)", "Ripple Field 5 - Enemy 4 (Mony)", - "Ripple Field 5 - Enemy 5 (Squishy)" + "Ripple Field 5 - Enemy 5 (Squishy)", + "Ripple Field 5 - Maxim Tomato (Currents)", + "Ripple Field 5 - 1-Up (Currents)" ], "music": 16 }, @@ -2610,6 +4315,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2622,6 +4329,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Ripple Field 5 - Animal 1" ], @@ -2634,6 +4342,8 @@ "room": 5, "pointer": 3207333, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2657,6 +4367,12 @@ ] } ], + "entity_load": [ + [ + 14, + 23 + ] + ], "locations": [], "music": 16 }, @@ -2667,6 +4383,8 @@ "room": 6, "pointer": 3485896, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Yaban", "Broom Hatter", @@ -2683,6 +4401,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 6, + 22 + ], + [ + 22, + 16 + ], + [ + 14, + 23 + ], + [ + 13, + 16 + ], + [ + 11, + 16 + ], + [ + 32, + 16 + ] + ], "locations": [ "Ripple Field 5 - Enemy 6 (Yaban)", "Ripple Field 5 - Enemy 7 (Broom Hatter)", @@ -2697,6 +4441,18 @@ "room": 7, "pointer": 3752698, "animal_pointers": [], + "consumables": [ + { + "idx": 53, + "pointer": 418, + "x": 1512, + "y": 608, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 5 - Maxim Tomato (Exit)" + } + ], + "consumables_pointer": 352, "enemies": [ "Sparky", "Rocky", @@ -2722,11 +4478,37 @@ "access_rule": [] } ], + "entity_load": [ + [ + 3, + 16 + ], + [ + 43, + 16 + ], + [ + 8, + 16 + ], + [ + 22, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 22 + ] + ], "locations": [ - "Ripple Field 5 - Maxim Tomato (Exit)", "Ripple Field 5 - Enemy 9 (Sparky)", "Ripple Field 5 - Enemy 10 (Rocky)", - "Ripple Field 5 - Enemy 11 (Babut)" + "Ripple Field 5 - Enemy 11 (Babut)", + "Ripple Field 5 - Maxim Tomato (Exit)" ], "music": 16 }, @@ -2739,6 +4521,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2751,6 +4535,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Ripple Field 5 - Animal 2" ], @@ -2763,6 +4548,8 @@ "room": 9, "pointer": 2963193, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2775,6 +4562,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 11, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Ripple Field 5 - Mama Pitch" ], @@ -2787,6 +4584,8 @@ "room": 10, "pointer": 3042934, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Galbo" ], @@ -2801,6 +4600,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 26, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Ripple Field 5 - Enemy 12 (Galbo)" ], @@ -2813,8 +4622,16 @@ "room": 11, "pointer": 2886256, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Ripple Field 5 - Complete" ], @@ -2827,6 +4644,8 @@ "room": 0, "pointer": 2949576, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Kany" ], @@ -2841,6 +4660,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 29, + 16 + ], + [ + 13, + 23 + ] + ], "locations": [ "Ripple Field 6 - Enemy 1 (Kany)" ], @@ -2857,6 +4686,8 @@ 200, 208 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2869,6 +4700,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Ripple Field 6 - Animal 1", "Ripple Field 6 - Animal 2", @@ -2883,6 +4715,8 @@ "room": 2, "pointer": 3637749, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2922,6 +4756,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 52, + 16 + ], + [ + 13, + 23 + ] + ], "locations": [], "music": 15 }, @@ -2932,6 +4776,8 @@ "room": 3, "pointer": 3092564, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2953,6 +4799,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 15 }, @@ -2963,6 +4810,8 @@ "room": 4, "pointer": 3133247, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -2975,6 +4824,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 12, + 19 + ] + ], "locations": [], "music": 15 }, @@ -2985,6 +4840,8 @@ "room": 5, "pointer": 3507762, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -3051,6 +4908,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ] + ], "locations": [], "music": 15 }, @@ -3061,6 +4924,8 @@ "room": 6, "pointer": 3211264, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -3073,6 +4938,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 6, + 23 + ] + ], "locations": [], "music": 15 }, @@ -3083,6 +4954,8 @@ "room": 7, "pointer": 3586039, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "KeKe", "Kapar", @@ -3100,6 +4973,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 3, + 16 + ], + [ + 67, + 16 + ], + [ + 51, + 16 + ], + [ + 7, + 16 + ] + ], "locations": [ "Ripple Field 6 - Enemy 2 (KeKe)", "Ripple Field 6 - Enemy 3 (Kapar)", @@ -3115,6 +5010,8 @@ "room": 8, "pointer": 3621483, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Propeller", "Coconut", @@ -3141,6 +5038,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 89, + 16 + ], + [ + 15, + 16 + ], + [ + 30, + 16 + ], + [ + 34, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Ripple Field 6 - Enemy 6 (Propeller)", "Ripple Field 6 - Enemy 7 (Coconut)", @@ -3158,6 +5077,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -3170,6 +5091,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Ripple Field 6 - Animal 4" ], @@ -3182,6 +5104,8 @@ "room": 10, "pointer": 3069438, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -3194,6 +5118,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 12, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Ripple Field 6 - HB-002" ], @@ -3206,8 +5140,16 @@ "room": 11, "pointer": 2886497, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Ripple Field 6 - Complete" ], @@ -3220,8 +5162,16 @@ "room": 0, "pointer": 3157370, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 7, + 18 + ] + ], "locations": [ "Ripple Field - Boss (Acro) Purified", "Level 2 Boss" @@ -3235,6 +5185,8 @@ "room": 0, "pointer": 3524267, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bronto Burt", "Galbo" @@ -3250,6 +5202,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 19 + ], + [ + 1, + 16 + ], + [ + 26, + 16 + ], + [ + 2, + 16 + ] + ], "locations": [ "Sand Canyon 1 - Enemy 1 (Bronto Burt)", "Sand Canyon 1 - Enemy 2 (Galbo)" @@ -3266,6 +5236,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -3278,6 +5250,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Sand Canyon 1 - Animal 1", "Sand Canyon 1 - Animal 2" @@ -3291,6 +5264,8 @@ "room": 2, "pointer": 3512532, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Oro" ], @@ -3305,6 +5280,40 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 16 + ], + [ + 26, + 16 + ], + [ + 25, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ], + [ + 1, + 23 + ], + [ + 0, + 23 + ], + [ + 4, + 23 + ] + ], "locations": [ "Sand Canyon 1 - Enemy 3 (Oro)" ], @@ -3317,6 +5326,8 @@ "room": 3, "pointer": 3719146, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sparky", "Propeller", @@ -3334,6 +5345,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 89, + 16 + ], + [ + 75, + 16 + ], + [ + 43, + 16 + ], + [ + 8, + 16 + ] + ], "locations": [ "Sand Canyon 1 - Enemy 4 (Sparky)", "Sand Canyon 1 - Enemy 5 (Propeller)", @@ -3349,6 +5378,8 @@ "room": 4, "pointer": 3421212, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Loud", "Dogon", @@ -3366,6 +5397,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 90, + 16 + ], + [ + 13, + 16 + ], + [ + 40, + 16 + ], + [ + 14, + 23 + ], + [ + 39, + 16 + ] + ], "locations": [ "Sand Canyon 1 - Enemy 8 (Loud)", "Sand Canyon 1 - Enemy 9 (Dogon)", @@ -3381,6 +5434,8 @@ "room": 5, "pointer": 3203325, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Polof" ], @@ -3404,6 +5459,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 9, + 16 + ] + ], "locations": [ "Sand Canyon 1 - Enemy 12 (Polof)" ], @@ -3416,6 +5477,18 @@ "room": 6, "pointer": 3138524, "animal_pointers": [], + "consumables": [ + { + "idx": 23, + "pointer": 248, + "x": 168, + "y": 104, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 1 - 1-Up (Polof)" + } + ], + "consumables_pointer": 128, "enemies": [], "default_exits": [ { @@ -3428,6 +5501,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 0, + 22 + ] + ], "locations": [ "Sand Canyon 1 - 1-Up (Polof)" ], @@ -3440,6 +5523,8 @@ "room": 7, "pointer": 2988822, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -3452,6 +5537,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Sand Canyon 1 - Geromuzudake" ], @@ -3464,8 +5559,16 @@ "room": 8, "pointer": 2885292, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Sand Canyon 1 - Complete" ], @@ -3478,6 +5581,8 @@ "room": 0, "pointer": 3668370, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "KeKe", "Doka", @@ -3503,6 +5608,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 35, + 16 + ], + [ + 33, + 16 + ], + [ + 14, + 23 + ], + [ + 51, + 16 + ], + [ + 47, + 16 + ], + [ + 46, + 16 + ] + ], "locations": [ "Sand Canyon 2 - Enemy 1 (KeKe)", "Sand Canyon 2 - Enemy 2 (Doka)", @@ -3520,6 +5651,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -3532,6 +5665,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Sand Canyon 2 - Animal 1", "Sand Canyon 2 - Animal 2" @@ -3545,6 +5679,8 @@ "room": 2, "pointer": 3531156, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Propeller" ], @@ -3559,6 +5695,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 6, + 23 + ], + [ + 89, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Sand Canyon 2 - Enemy 4 (Propeller)" ], @@ -3571,6 +5721,8 @@ "room": 3, "pointer": 3263731, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee", "Sparky", @@ -3615,6 +5767,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 41, + 16 + ], + [ + 8, + 16 + ], + [ + 30, + 16 + ], + [ + 0, + 16 + ] + ], "locations": [ "Sand Canyon 2 - Enemy 5 (Waddle Dee)", "Sand Canyon 2 - Enemy 6 (Sparky)", @@ -3630,6 +5800,18 @@ "room": 4, "pointer": 3076300, "animal_pointers": [], + "consumables": [ + { + "idx": 19, + "pointer": 228, + "x": 168, + "y": 72, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 2 - 1-Up (Enclave)" + } + ], + "consumables_pointer": 128, "enemies": [], "default_exits": [ { @@ -3660,6 +5842,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 0, + 22 + ], + [ + 4, + 22 + ] + ], "locations": [ "Sand Canyon 2 - 1-Up (Enclave)" ], @@ -3672,6 +5868,8 @@ "room": 5, "pointer": 3302133, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bukiset (Ice)", "Bukiset (Needle)", @@ -3718,6 +5916,36 @@ "access_rule": [] } ], + "entity_load": [ + [ + 80, + 16 + ], + [ + 78, + 16 + ], + [ + 81, + 16 + ], + [ + 83, + 16 + ], + [ + 79, + 16 + ], + [ + 82, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", @@ -3735,6 +5963,8 @@ "room": 6, "pointer": 3800612, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Nidoo" ], @@ -3749,6 +5979,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 28, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Sand Canyon 2 - Enemy 15 (Nidoo)" ], @@ -3761,6 +6001,8 @@ "room": 7, "pointer": 3073888, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -3782,6 +6024,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 15, + 19 + ] + ], "locations": [], "music": 21 }, @@ -3792,6 +6040,8 @@ "room": 8, "pointer": 3061270, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Mariel" ], @@ -3806,6 +6056,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 45, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Sand Canyon 2 - Enemy 16 (Mariel)" ], @@ -3818,6 +6078,18 @@ "room": 9, "pointer": 3453286, "animal_pointers": [], + "consumables": [ + { + "idx": 51, + "pointer": 240, + "x": 1408, + "y": 216, + "etype": 22, + "vtype": 2, + "name": "Sand Canyon 2 - Maxim Tomato (Underwater)" + } + ], + "consumables_pointer": 128, "enemies": [ "Yaban", "Wapod", @@ -3835,12 +6107,38 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 22, + 16 + ], + [ + 2, + 22 + ], + [ + 39, + 16 + ], + [ + 88, + 16 + ], + [ + 32, + 16 + ] + ], "locations": [ - "Sand Canyon 2 - Maxim Tomato (Underwater)", "Sand Canyon 2 - Enemy 17 (Yaban)", "Sand Canyon 2 - Enemy 18 (Wapod)", "Sand Canyon 2 - Enemy 19 (Squishy)", - "Sand Canyon 2 - Enemy 20 (Pteran)" + "Sand Canyon 2 - Enemy 20 (Pteran)", + "Sand Canyon 2 - Maxim Tomato (Underwater)" ], "music": 21 }, @@ -3851,6 +6149,8 @@ "room": 10, "pointer": 2994821, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -3863,6 +6163,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 15, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Sand Canyon 2 - Auntie" ], @@ -3875,8 +6185,16 @@ "room": 11, "pointer": 2891799, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Sand Canyon 2 - Complete" ], @@ -3889,6 +6207,8 @@ "room": 0, "pointer": 3544676, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sir Kibble", "Broom Hatter", @@ -3933,6 +6253,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 24, + 16 + ], + [ + 3, + 16 + ], + [ + 11, + 16 + ], + [ + 27, + 16 + ] + ], "locations": [ "Sand Canyon 3 - Enemy 1 (Sir Kibble)", "Sand Canyon 3 - Enemy 2 (Broom Hatter)", @@ -3952,6 +6290,8 @@ 220, 228 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -3982,6 +6322,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Sand Canyon 3 - Animal 1", "Sand Canyon 3 - Animal 2", @@ -3996,6 +6337,8 @@ "room": 2, "pointer": 3726270, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Kany" ], @@ -4010,6 +6353,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 63, + 16 + ], + [ + 55, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 23 + ], + [ + 29, + 16 + ] + ], "locations": [ "Sand Canyon 3 - Enemy 5 (Kany)" ], @@ -4022,6 +6387,8 @@ "room": 3, "pointer": 3416806, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Galbo" ], @@ -4036,6 +6403,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 26, + 16 + ], + [ + 6, + 23 + ], + [ + 5, + 23 + ] + ], "locations": [ "Sand Canyon 3 - Enemy 6 (Galbo)" ], @@ -4048,6 +6429,8 @@ "room": 4, "pointer": 3564419, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Propeller", "Sasuke" @@ -4063,6 +6446,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 68, + 16 + ], + [ + 30, + 16 + ], + [ + 14, + 23 + ], + [ + 89, + 16 + ], + [ + 24, + 16 + ] + ], "locations": [ "Sand Canyon 3 - Enemy 7 (Propeller)", "Sand Canyon 3 - Enemy 8 (Sasuke)" @@ -4076,6 +6481,8 @@ "room": 5, "pointer": 2973891, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4088,6 +6495,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 16, + 19 + ] + ], "locations": [ "Sand Canyon 3 - Caramello" ], @@ -4100,6 +6513,8 @@ "room": 6, "pointer": 3247969, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Wapod", "Bobo", @@ -4117,6 +6532,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 53, + 16 + ], + [ + 88, + 16 + ], + [ + 46, + 16 + ], + [ + 47, + 16 + ], + [ + 5, + 16 + ], + [ + 43, + 16 + ] + ], "locations": [ "Sand Canyon 3 - Enemy 9 (Wapod)", "Sand Canyon 3 - Enemy 10 (Bobo)", @@ -4132,8 +6573,16 @@ "room": 7, "pointer": 2887702, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Sand Canyon 3 - Complete" ], @@ -4146,6 +6595,8 @@ "room": 8, "pointer": 2968057, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4158,6 +6609,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 16, + 19 + ] + ], "locations": [], "music": 31 }, @@ -4168,6 +6625,8 @@ "room": 0, "pointer": 3521954, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Popon Ball", "Mariel", @@ -4193,6 +6652,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 6, + 16 + ], + [ + 45, + 16 + ], + [ + 6, + 23 + ], + [ + 50, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Sand Canyon 4 - Enemy 1 (Popon Ball)", "Sand Canyon 4 - Enemy 2 (Mariel)", @@ -4211,6 +6692,8 @@ 200, 208 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4223,6 +6706,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Sand Canyon 4 - Animal 1", "Sand Canyon 4 - Animal 2", @@ -4237,6 +6721,18 @@ "room": 2, "pointer": 3505360, "animal_pointers": [], + "consumables": [ + { + "idx": 11, + "pointer": 328, + "x": 2024, + "y": 72, + "etype": 22, + "vtype": 2, + "name": "Sand Canyon 4 - Maxim Tomato (Pacto)" + } + ], + "consumables_pointer": 160, "enemies": [ "Tick", "Bronto Burt", @@ -4253,11 +6749,33 @@ "access_rule": [] } ], + "entity_load": [ + [ + 62, + 16 + ], + [ + 2, + 22 + ], + [ + 43, + 16 + ], + [ + 2, + 16 + ], + [ + 48, + 16 + ] + ], "locations": [ - "Sand Canyon 4 - Maxim Tomato (Pacto)", "Sand Canyon 4 - Enemy 4 (Tick)", "Sand Canyon 4 - Enemy 5 (Bronto Burt)", - "Sand Canyon 4 - Enemy 6 (Babut)" + "Sand Canyon 4 - Enemy 6 (Babut)", + "Sand Canyon 4 - Maxim Tomato (Pacto)" ], "music": 18 }, @@ -4268,6 +6786,8 @@ "room": 3, "pointer": 3412361, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bobin", "Joe", @@ -4321,6 +6841,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 73, + 16 + ], + [ + 20, + 16 + ], + [ + 91, + 16 + ], + [ + 14, + 23 + ], + [ + 21, + 16 + ] + ], "locations": [ "Sand Canyon 4 - Enemy 7 (Bobin)", "Sand Canyon 4 - Enemy 8 (Joe)", @@ -4336,6 +6878,8 @@ "room": 4, "pointer": 3307804, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4357,6 +6901,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 21, + 16 + ], + [ + 20, + 16 + ], + [ + 91, + 16 + ], + [ + 73, + 16 + ] + ], "locations": [], "music": 18 }, @@ -4367,6 +6929,8 @@ "room": 5, "pointer": 2955407, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4379,6 +6943,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 5, + 27 + ] + ], "locations": [ "Sand Canyon 4 - Miniboss 1 (Haboki)" ], @@ -4391,6 +6961,8 @@ "room": 6, "pointer": 3094851, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4421,6 +6993,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 17, + 19 + ], + [ + 4, + 23 + ], + [ + 5, + 23 + ] + ], "locations": [], "music": 18 }, @@ -4431,6 +7017,27 @@ "room": 7, "pointer": 3483428, "animal_pointers": [], + "consumables": [ + { + "idx": 25, + "pointer": 200, + "x": 344, + "y": 144, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 4 - 1-Up (Clean)" + }, + { + "idx": 26, + "pointer": 336, + "x": 1656, + "y": 144, + "etype": 22, + "vtype": 2, + "name": "Sand Canyon 4 - Maxim Tomato (Needle)" + } + ], + "consumables_pointer": 128, "enemies": [ "Togezo", "Rocky", @@ -4447,12 +7054,46 @@ "access_rule": [] } ], + "entity_load": [ + [ + 6, + 22 + ], + [ + 3, + 16 + ], + [ + 14, + 23 + ], + [ + 5, + 16 + ], + [ + 2, + 16 + ], + [ + 18, + 16 + ], + [ + 0, + 22 + ], + [ + 2, + 22 + ] + ], "locations": [ - "Sand Canyon 4 - 1-Up (Clean)", - "Sand Canyon 4 - Maxim Tomato (Needle)", "Sand Canyon 4 - Enemy 11 (Togezo)", "Sand Canyon 4 - Enemy 12 (Rocky)", - "Sand Canyon 4 - Enemy 13 (Bobo)" + "Sand Canyon 4 - Enemy 13 (Bobo)", + "Sand Canyon 4 - 1-Up (Clean)", + "Sand Canyon 4 - Maxim Tomato (Needle)" ], "music": 18 }, @@ -4463,6 +7104,8 @@ "room": 8, "pointer": 3002086, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4475,6 +7118,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 17, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Sand Canyon 4 - Donbe & Hikari" ], @@ -4487,8 +7140,16 @@ "room": 9, "pointer": 2885774, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Sand Canyon 4 - Complete" ], @@ -4501,6 +7162,18 @@ "room": 0, "pointer": 3662486, "animal_pointers": [], + "consumables": [ + { + "idx": 0, + "pointer": 450, + "x": 2256, + "y": 232, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 5 - 1-Up (Falling Block)" + } + ], + "consumables_pointer": 208, "enemies": [ "Wapod", "Dogon", @@ -4526,11 +7199,37 @@ "access_rule": [] } ], + "entity_load": [ + [ + 55, + 16 + ], + [ + 48, + 16 + ], + [ + 0, + 22 + ], + [ + 14, + 23 + ], + [ + 90, + 16 + ], + [ + 88, + 16 + ] + ], "locations": [ - "Sand Canyon 5 - 1-Up (Falling Block)", "Sand Canyon 5 - Enemy 1 (Wapod)", "Sand Canyon 5 - Enemy 2 (Dogon)", - "Sand Canyon 5 - Enemy 3 (Tick)" + "Sand Canyon 5 - Enemy 3 (Tick)", + "Sand Canyon 5 - 1-Up (Falling Block)" ], "music": 13 }, @@ -4541,6 +7240,8 @@ "room": 1, "pointer": 3052622, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Rocky", "Bobo", @@ -4559,6 +7260,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 5, + 16 + ], + [ + 6, + 16 + ], + [ + 3, + 16 + ], + [ + 8, + 16 + ], + [ + 18, + 16 + ] + ], "locations": [ "Sand Canyon 5 - Enemy 4 (Rocky)", "Sand Canyon 5 - Enemy 5 (Bobo)", @@ -4577,6 +7300,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4589,6 +7314,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Sand Canyon 5 - Animal 1" ], @@ -4601,6 +7327,45 @@ "room": 3, "pointer": 3419011, "animal_pointers": [], + "consumables": [ + { + "idx": 11, + "pointer": 192, + "x": 56, + "y": 648, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 5 - 1-Up (Ice 2)" + }, + { + "idx": 14, + "pointer": 200, + "x": 56, + "y": 664, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 5 - 1-Up (Ice 3)" + }, + { + "idx": 15, + "pointer": 208, + "x": 56, + "y": 632, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 5 - 1-Up (Ice 1)" + }, + { + "idx": 12, + "pointer": 368, + "x": 320, + "y": 264, + "etype": 22, + "vtype": 2, + "name": "Sand Canyon 5 - Maxim Tomato (Pit)" + } + ], + "consumables_pointer": 304, "enemies": [ "Bronto Burt", "Sasuke" @@ -4616,13 +7381,39 @@ "access_rule": [] } ], + "entity_load": [ + [ + 6, + 16 + ], + [ + 30, + 16 + ], + [ + 2, + 16 + ], + [ + 0, + 22 + ], + [ + 2, + 22 + ], + [ + 14, + 23 + ] + ], "locations": [ - "Sand Canyon 5 - Maxim Tomato (Pit)", - "Sand Canyon 5 - 1-Up (Ice 1)", + "Sand Canyon 5 - Enemy 9 (Bronto Burt)", + "Sand Canyon 5 - Enemy 10 (Sasuke)", "Sand Canyon 5 - 1-Up (Ice 2)", "Sand Canyon 5 - 1-Up (Ice 3)", - "Sand Canyon 5 - Enemy 9 (Bronto Burt)", - "Sand Canyon 5 - Enemy 10 (Sasuke)" + "Sand Canyon 5 - 1-Up (Ice 1)", + "Sand Canyon 5 - Maxim Tomato (Pit)" ], "music": 13 }, @@ -4633,6 +7424,8 @@ "room": 4, "pointer": 3644149, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Oro", "Galbo", @@ -4658,6 +7451,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 54, + 16 + ], + [ + 26, + 16 + ], + [ + 28, + 16 + ], + [ + 25, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Sand Canyon 5 - Enemy 11 (Oro)", "Sand Canyon 5 - Enemy 12 (Galbo)", @@ -4674,6 +7489,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4686,6 +7503,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Sand Canyon 5 - Animal 2" ], @@ -4698,6 +7516,8 @@ "room": 6, "pointer": 3373481, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Propeller" ], @@ -4712,6 +7532,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 31, + 16 + ], + [ + 89, + 16 + ], + [ + 6, + 16 + ] + ], "locations": [ "Sand Canyon 5 - Enemy 14 (Propeller)" ], @@ -4724,6 +7562,8 @@ "room": 7, "pointer": 2964028, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4736,6 +7576,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 18, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Sand Canyon 5 - Nyupun" ], @@ -4748,8 +7598,16 @@ "room": 8, "pointer": 2890112, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Sand Canyon 5 - Complete" ], @@ -4762,6 +7620,8 @@ "room": 9, "pointer": 3647264, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sir Kibble", "KeKe", @@ -4789,6 +7649,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 27, + 16 + ], + [ + 61, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ], + [ + 51, + 16 + ], + [ + 19, + 16 + ] + ], "locations": [ "Sand Canyon 5 - Enemy 15 (Sir Kibble)", "Sand Canyon 5 - Enemy 16 (KeKe)", @@ -4803,6 +7689,8 @@ "room": 0, "pointer": 3314761, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sparky", "Doka", @@ -4820,6 +7708,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 8, + 16 + ], + [ + 35, + 16 + ], + [ + 39, + 16 + ], + [ + 12, + 16 + ] + ], "locations": [ "Sand Canyon 6 - Enemy 1 (Sparky)", "Sand Canyon 6 - Enemy 2 (Doka)", @@ -4839,6 +7745,8 @@ 200, 208 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4851,6 +7759,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Sand Canyon 6 - Animal 1", "Sand Canyon 6 - Animal 2", @@ -4865,6 +7774,8 @@ "room": 2, "pointer": 2978757, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4877,6 +7788,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -4887,6 +7799,8 @@ "room": 3, "pointer": 3178082, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -4962,6 +7876,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ] + ], "locations": [], "music": 14 }, @@ -4972,6 +7892,8 @@ "room": 4, "pointer": 3181563, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5047,6 +7969,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ] + ], "locations": [], "music": 14 }, @@ -5057,6 +7985,8 @@ "room": 5, "pointer": 3177209, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5132,6 +8062,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ] + ], "locations": [], "music": 14 }, @@ -5142,6 +8078,8 @@ "room": 6, "pointer": 3183291, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5217,6 +8155,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ] + ], "locations": [], "music": 14 }, @@ -5227,6 +8171,8 @@ "room": 7, "pointer": 3175453, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5302,6 +8248,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ] + ], "locations": [], "music": 14 }, @@ -5312,6 +8264,8 @@ "room": 8, "pointer": 3179826, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5387,6 +8341,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ] + ], "locations": [], "music": 14 }, @@ -5397,6 +8357,8 @@ "room": 9, "pointer": 3176334, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5472,6 +8434,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ] + ], "locations": [], "music": 14 }, @@ -5482,6 +8450,8 @@ "room": 10, "pointer": 3178954, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5557,6 +8527,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ] + ], "locations": [], "music": 14 }, @@ -5567,6 +8543,8 @@ "room": 11, "pointer": 2989149, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5579,6 +8557,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 59, + 16 + ] + ], "locations": [], "music": 14 }, @@ -5589,6 +8573,8 @@ "room": 12, "pointer": 3015947, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5610,6 +8596,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 64, + 16 + ], + [ + 59, + 16 + ], + [ + 55, + 16 + ] + ], "locations": [], "music": 14 }, @@ -5620,6 +8620,8 @@ "room": 13, "pointer": 2976539, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5632,6 +8634,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -5642,6 +8645,8 @@ "room": 14, "pointer": 3030336, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5663,6 +8668,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -5673,6 +8679,8 @@ "room": 15, "pointer": 2972361, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5685,6 +8693,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 19, + 19 + ] + ], "locations": [], "music": 14 }, @@ -5695,6 +8709,8 @@ "room": 16, "pointer": 2953186, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5716,6 +8732,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -5726,6 +8743,8 @@ "room": 17, "pointer": 2953633, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5747,6 +8766,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -5757,6 +8777,8 @@ "room": 18, "pointer": 2991707, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5769,6 +8791,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 19, + 19 + ] + ], "locations": [], "music": 14 }, @@ -5779,6 +8807,8 @@ "room": 19, "pointer": 2974651, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5800,6 +8830,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -5810,6 +8841,8 @@ "room": 20, "pointer": 2969638, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5822,6 +8855,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 19, + 19 + ] + ], "locations": [], "music": 14 }, @@ -5836,6 +8875,8 @@ 200, 208 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5848,6 +8889,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Sand Canyon 6 - Animal 4", "Sand Canyon 6 - Animal 5", @@ -5862,6 +8904,8 @@ "room": 22, "pointer": 2950938, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5892,6 +8936,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 22 + ] + ], "locations": [], "music": 14 }, @@ -5902,6 +8952,8 @@ "room": 23, "pointer": 3311993, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5914,6 +8966,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 16 + ] + ], "locations": [], "music": 14 }, @@ -5924,6 +8982,8 @@ "room": 24, "pointer": 3079078, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5954,6 +9014,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -5964,6 +9025,8 @@ "room": 25, "pointer": 3065898, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -5994,6 +9057,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -6004,6 +9068,8 @@ "room": 26, "pointer": 3063347, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6034,6 +9100,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -6044,6 +9111,8 @@ "room": 27, "pointer": 3066916, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6074,6 +9143,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -6084,6 +9154,8 @@ "room": 28, "pointer": 3067425, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6114,6 +9186,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -6124,6 +9197,8 @@ "room": 29, "pointer": 2950032, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6136,6 +9211,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 19, + 19 + ] + ], "locations": [], "music": 14 }, @@ -6146,6 +9227,8 @@ "room": 30, "pointer": 2986500, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6158,6 +9241,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -6168,6 +9252,8 @@ "room": 31, "pointer": 3070930, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6198,6 +9284,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -6208,6 +9295,8 @@ "room": 32, "pointer": 3054817, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bukiset (Parasol)", "Bukiset (Cutter)" @@ -6241,6 +9330,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 81, + 16 + ], + [ + 83, + 16 + ] + ], "locations": [ "Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))" @@ -6254,6 +9353,8 @@ "room": 33, "pointer": 3053173, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bukiset (Clean)", "Bukiset (Spark)" @@ -6287,6 +9388,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 80, + 16 + ], + [ + 82, + 16 + ] + ], "locations": [ "Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))" @@ -6300,6 +9411,8 @@ "room": 34, "pointer": 3053721, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bukiset (Ice)", "Bukiset (Needle)" @@ -6333,6 +9446,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 79, + 16 + ], + [ + 78, + 16 + ] + ], "locations": [ "Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))" @@ -6346,6 +9469,8 @@ "room": 35, "pointer": 3054269, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bukiset (Burning)", "Bukiset (Stone)" @@ -6379,6 +9504,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 77, + 16 + ], + [ + 76, + 16 + ] + ], "locations": [ "Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))" @@ -6392,6 +9527,8 @@ "room": 36, "pointer": 2986164, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6404,6 +9541,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -6414,6 +9552,8 @@ "room": 37, "pointer": 3074377, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6426,6 +9566,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 19, + 19 + ] + ], "locations": [], "music": 14 }, @@ -6436,6 +9582,8 @@ "room": 38, "pointer": 2971589, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6457,6 +9605,40 @@ "access_rule": [] } ], + "entity_load": [ + [ + 76, + 16 + ], + [ + 77, + 16 + ], + [ + 78, + 16 + ], + [ + 79, + 16 + ], + [ + 80, + 16 + ], + [ + 81, + 16 + ], + [ + 82, + 16 + ], + [ + 83, + 16 + ] + ], "locations": [], "music": 14 }, @@ -6467,6 +9649,8 @@ "room": 39, "pointer": 3063858, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6497,6 +9681,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -6507,6 +9692,8 @@ "room": 40, "pointer": 3064368, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6537,6 +9724,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -6547,6 +9735,8 @@ "room": 41, "pointer": 3064878, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6577,6 +9767,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 14 }, @@ -6587,6 +9778,8 @@ "room": 42, "pointer": 3068939, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Nidoo" ], @@ -6610,6 +9803,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 28, + 16 + ] + ], "locations": [ "Sand Canyon 6 - Enemy 13 (Nidoo)" ], @@ -6622,6 +9821,8 @@ "room": 43, "pointer": 2988495, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6634,6 +9835,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 19, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Sand Canyon 6 - Professor Hector & R.O.B" ], @@ -6646,8 +9857,16 @@ "room": 44, "pointer": 2886979, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Sand Canyon 6 - Complete" ], @@ -6660,8 +9879,16 @@ "room": 0, "pointer": 2991389, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 6, + 18 + ] + ], "locations": [ "Sand Canyon - Boss (Pon & Con) Purified", "Level 3 Boss" @@ -6675,6 +9902,8 @@ "room": 0, "pointer": 3172795, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee", "KeKe", @@ -6691,6 +9920,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 16 + ], + [ + 12, + 16 + ], + [ + 51, + 16 + ], + [ + 1, + 23 + ], + [ + 0, + 23 + ] + ], "locations": [ "Cloudy Park 1 - Enemy 1 (Waddle Dee)", "Cloudy Park 1 - Enemy 2 (KeKe)", @@ -6707,6 +9958,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6719,6 +9972,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Cloudy Park 1 - Animal 1" ], @@ -6731,6 +9985,8 @@ "room": 2, "pointer": 3285882, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Yaban", "Togezo" @@ -6746,6 +10002,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 32, + 16 + ], + [ + 4, + 16 + ], + [ + 18, + 16 + ], + [ + 6, + 23 + ] + ], "locations": [ "Cloudy Park 1 - Enemy 4 (Yaban)", "Cloudy Park 1 - Enemy 5 (Togezo)" @@ -6761,6 +10035,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6773,6 +10049,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Cloudy Park 1 - Animal 2" ], @@ -6785,6 +10062,8 @@ "room": 4, "pointer": 3396729, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Galbo" ], @@ -6799,6 +10078,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 54, + 16 + ], + [ + 0, + 16 + ], + [ + 14, + 23 + ], + [ + 68, + 16 + ], + [ + 26, + 16 + ], + [ + 4, + 22 + ] + ], "locations": [ "Cloudy Park 1 - Enemy 6 (Galbo)" ], @@ -6814,6 +10119,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6826,6 +10133,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Cloudy Park 1 - Animal 3", "Cloudy Park 1 - Animal 4" @@ -6839,6 +10147,8 @@ "room": 6, "pointer": 3535736, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sparky", "Como" @@ -6854,6 +10164,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 54, + 16 + ], + [ + 14, + 23 + ], + [ + 0, + 16 + ], + [ + 41, + 16 + ], + [ + 8, + 16 + ] + ], "locations": [ "Cloudy Park 1 - Enemy 7 (Sparky)", "Cloudy Park 1 - Enemy 8 (Como)" @@ -6869,6 +10201,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6881,6 +10215,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Cloudy Park 1 - Animal 5" ], @@ -6893,6 +10228,8 @@ "room": 8, "pointer": 3465407, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bronto Burt" ], @@ -6907,6 +10244,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 21, + 19 + ], + [ + 2, + 16 + ], + [ + 51, + 16 + ], + [ + 1, + 23 + ], + [ + 14, + 23 + ] + ], "locations": [ "Cloudy Park 1 - Enemy 9 (Bronto Burt)" ], @@ -6921,6 +10280,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -6933,6 +10294,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Cloudy Park 1 - Animal 6" ], @@ -6945,6 +10307,8 @@ "room": 10, "pointer": 3281366, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Gabon", "Sir Kibble" @@ -6960,6 +10324,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 1, + 16 + ], + [ + 24, + 16 + ], + [ + 27, + 16 + ], + [ + 4, + 23 + ] + ], "locations": [ "Cloudy Park 1 - Enemy 10 (Gabon)", "Cloudy Park 1 - Enemy 11 (Sir Kibble)" @@ -6973,6 +10355,27 @@ "room": 11, "pointer": 3519608, "animal_pointers": [], + "consumables": [ + { + "idx": 19, + "pointer": 192, + "x": 216, + "y": 600, + "etype": 22, + "vtype": 0, + "name": "Cloudy Park 1 - 1-Up (Shotzo)" + }, + { + "idx": 18, + "pointer": 456, + "x": 856, + "y": 408, + "etype": 22, + "vtype": 2, + "name": "Cloudy Park 1 - Maxim Tomato (Mariel)" + } + ], + "consumables_pointer": 352, "enemies": [ "Mariel", "Nruff" @@ -6988,11 +10391,45 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 16 + ], + [ + 27, + 16 + ], + [ + 15, + 16 + ], + [ + 45, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 22 + ], + [ + 0, + 22 + ], + [ + 6, + 22 + ] + ], "locations": [ - "Cloudy Park 1 - 1-Up (Shotzo)", - "Cloudy Park 1 - Maxim Tomato (Mariel)", "Cloudy Park 1 - Enemy 12 (Mariel)", - "Cloudy Park 1 - Enemy 13 (Nruff)" + "Cloudy Park 1 - Enemy 13 (Nruff)", + "Cloudy Park 1 - 1-Up (Shotzo)", + "Cloudy Park 1 - Maxim Tomato (Mariel)" ], "music": 17 }, @@ -7003,6 +10440,8 @@ "room": 12, "pointer": 2958914, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7015,6 +10454,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 21, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Cloudy Park 1 - Hibanamodoki" ], @@ -7027,8 +10476,16 @@ "room": 13, "pointer": 2886015, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Cloudy Park 1 - Complete" ], @@ -7041,6 +10498,8 @@ "room": 0, "pointer": 3142443, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Chilly", "Sasuke" @@ -7056,6 +10515,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 23, + 16 + ], + [ + 7, + 16 + ], + [ + 30, + 16 + ], + [ + 6, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Cloudy Park 2 - Enemy 1 (Chilly)", "Cloudy Park 2 - Enemy 2 (Sasuke)" @@ -7069,6 +10550,8 @@ "room": 1, "pointer": 3235925, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee", "Sparky", @@ -7085,6 +10568,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 16 + ], + [ + 14, + 23 + ], + [ + 8, + 16 + ], + [ + 11, + 16 + ] + ], "locations": [ "Cloudy Park 2 - Enemy 3 (Waddle Dee)", "Cloudy Park 2 - Enemy 4 (Sparky)", @@ -7099,6 +10600,8 @@ "room": 2, "pointer": 3297758, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sir Kibble", "Pteran" @@ -7114,6 +10617,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 27, + 16 + ], + [ + 39, + 16 + ], + [ + 1, + 23 + ] + ], "locations": [ "Cloudy Park 2 - Enemy 6 (Sir Kibble)", "Cloudy Park 2 - Enemy 7 (Pteran)" @@ -7127,6 +10644,8 @@ "room": 3, "pointer": 3341087, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Propeller", "Dogon" @@ -7142,6 +10661,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 16 + ], + [ + 14, + 23 + ], + [ + 90, + 16 + ], + [ + 89, + 16 + ] + ], "locations": [ "Cloudy Park 2 - Enemy 8 (Propeller)", "Cloudy Park 2 - Enemy 9 (Dogon)" @@ -7155,6 +10692,8 @@ "room": 4, "pointer": 3457404, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Togezo", "Oro", @@ -7172,6 +10711,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 3, + 16 + ], + [ + 14, + 23 + ], + [ + 18, + 16 + ], + [ + 25, + 16 + ] + ], "locations": [ "Cloudy Park 2 - Enemy 10 (Togezo)", "Cloudy Park 2 - Enemy 11 (Oro)", @@ -7187,6 +10748,8 @@ "room": 5, "pointer": 3273878, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Galbo", "Kapar" @@ -7202,6 +10765,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 62, + 16 + ], + [ + 26, + 16 + ], + [ + 67, + 16 + ] + ], "locations": [ "Cloudy Park 2 - Enemy 14 (Galbo)", "Cloudy Park 2 - Enemy 15 (Kapar)" @@ -7219,6 +10800,8 @@ 200, 208 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7231,6 +10814,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Cloudy Park 2 - Animal 1", "Cloudy Park 2 - Animal 2", @@ -7245,6 +10829,8 @@ "room": 7, "pointer": 2985482, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7257,6 +10843,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 22, + 19 + ] + ], "locations": [], "music": 19 }, @@ -7267,6 +10859,8 @@ "room": 8, "pointer": 2990753, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7279,6 +10873,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 22, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Cloudy Park 2 - Piyo & Keko" ], @@ -7291,8 +10895,16 @@ "room": 9, "pointer": 2889630, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Cloudy Park 2 - Complete" ], @@ -7305,6 +10917,8 @@ "room": 0, "pointer": 3100859, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bronto Burt", "Mopoo", @@ -7321,6 +10935,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 74, + 16 + ], + [ + 47, + 16 + ], + [ + 7, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Cloudy Park 3 - Enemy 1 (Bronto Burt)", "Cloudy Park 3 - Enemy 2 (Mopoo)", @@ -7335,6 +10971,8 @@ "room": 1, "pointer": 3209719, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Como" ], @@ -7349,6 +10987,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ], + [ + 31, + 16 + ], + [ + 4, + 22 + ], + [ + 41, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Cloudy Park 3 - Enemy 4 (Como)" ], @@ -7361,6 +11021,8 @@ "room": 2, "pointer": 3216185, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Glunk", "Bobin", @@ -7387,6 +11049,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 67, + 16 + ], + [ + 40, + 16 + ], + [ + 73, + 16 + ], + [ + 14, + 23 + ], + [ + 16, + 16 + ] + ], "locations": [ "Cloudy Park 3 - Enemy 5 (Glunk)", "Cloudy Park 3 - Enemy 6 (Bobin)", @@ -7406,6 +11090,8 @@ 200, 208 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7418,6 +11104,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Cloudy Park 3 - Animal 1", "Cloudy Park 3 - Animal 2", @@ -7432,6 +11119,8 @@ "room": 4, "pointer": 3229151, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Galbo", "Batamon", @@ -7457,6 +11146,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 7, + 16 + ], + [ + 26, + 16 + ], + [ + 14, + 23 + ], + [ + 13, + 16 + ], + [ + 68, + 16 + ] + ], "locations": [ "Cloudy Park 3 - Enemy 9 (Galbo)", "Cloudy Park 3 - Enemy 10 (Batamon)", @@ -7471,6 +11182,8 @@ "room": 5, "pointer": 2969244, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7483,6 +11196,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 23, + 19 + ] + ], "locations": [], "music": 31 }, @@ -7493,6 +11212,8 @@ "room": 6, "pointer": 4128530, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7505,6 +11226,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 23, + 19 + ] + ], "locations": [ "Cloudy Park 3 - Mr. Ball" ], @@ -7517,8 +11244,16 @@ "room": 7, "pointer": 2885051, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Cloudy Park 3 - Complete" ], @@ -7531,6 +11266,8 @@ "room": 0, "pointer": 3072905, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7543,6 +11280,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 23 + ], + [ + 1, + 23 + ], + [ + 0, + 23 + ], + [ + 31, + 16 + ] + ], "locations": [], "music": 21 }, @@ -7556,6 +11311,8 @@ 208, 224 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7568,6 +11325,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Cloudy Park 4 - Animal 1", "Cloudy Park 4 - Animal 2" @@ -7581,6 +11339,8 @@ "room": 2, "pointer": 3309209, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Gabon", "Como", @@ -7598,6 +11358,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 88, + 16 + ], + [ + 24, + 16 + ], + [ + 12, + 16 + ], + [ + 14, + 23 + ], + [ + 41, + 16 + ], + [ + 4, + 22 + ] + ], "locations": [ "Cloudy Park 4 - Enemy 1 (Gabon)", "Cloudy Park 4 - Enemy 2 (Como)", @@ -7613,6 +11399,27 @@ "room": 3, "pointer": 3296291, "animal_pointers": [], + "consumables": [ + { + "idx": 33, + "pointer": 776, + "x": 1880, + "y": 152, + "etype": 22, + "vtype": 0, + "name": "Cloudy Park 4 - 1-Up (Windy)" + }, + { + "idx": 34, + "pointer": 912, + "x": 2160, + "y": 152, + "etype": 22, + "vtype": 2, + "name": "Cloudy Park 4 - Maxim Tomato (Windy)" + } + ], + "consumables_pointer": 304, "enemies": [ "Sparky", "Togezo" @@ -7628,11 +11435,45 @@ "access_rule": [] } ], + "entity_load": [ + [ + 18, + 16 + ], + [ + 8, + 16 + ], + [ + 31, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 4, + 16 + ], + [ + 0, + 22 + ], + [ + 2, + 22 + ] + ], "locations": [ - "Cloudy Park 4 - 1-Up (Windy)", - "Cloudy Park 4 - Maxim Tomato (Windy)", "Cloudy Park 4 - Enemy 5 (Sparky)", - "Cloudy Park 4 - Enemy 6 (Togezo)" + "Cloudy Park 4 - Enemy 6 (Togezo)", + "Cloudy Park 4 - 1-Up (Windy)", + "Cloudy Park 4 - Maxim Tomato (Windy)" ], "music": 21 }, @@ -7643,6 +11484,8 @@ "room": 4, "pointer": 3330996, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bronto Burt", "KeKe", @@ -7659,6 +11502,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 13, + 16 + ], + [ + 51, + 16 + ], + [ + 17, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 16 + ] + ], "locations": [ "Cloudy Park 4 - Enemy 7 (Bronto Burt)", "Cloudy Park 4 - Enemy 8 (KeKe)", @@ -7673,6 +11538,8 @@ "room": 5, "pointer": 3332300, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sir Kibble", "Mariel" @@ -7688,6 +11555,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 45, + 16 + ], + [ + 46, + 16 + ], + [ + 27, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Cloudy Park 4 - Enemy 10 (Sir Kibble)", "Cloudy Park 4 - Enemy 11 (Mariel)" @@ -7701,6 +11586,8 @@ "room": 6, "pointer": 3253310, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Kabu", "Wappa" @@ -7716,6 +11603,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 44, + 16 + ], + [ + 31, + 16 + ], + [ + 19, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Cloudy Park 4 - Enemy 12 (Kabu)", "Cloudy Park 4 - Enemy 13 (Wappa)" @@ -7729,6 +11634,8 @@ "room": 7, "pointer": 2967658, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7741,6 +11648,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 3, + 27 + ] + ], "locations": [ "Cloudy Park 4 - Miniboss 1 (Jumper Shoot)" ], @@ -7753,6 +11666,8 @@ "room": 8, "pointer": 2981644, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7765,6 +11680,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 24, + 19 + ] + ], "locations": [], "music": 21 }, @@ -7775,6 +11696,8 @@ "room": 9, "pointer": 3008001, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7787,6 +11710,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 24, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Cloudy Park 4 - Mikarin & Kagami Mocchi" ], @@ -7799,8 +11732,16 @@ "room": 10, "pointer": 2888184, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Cloudy Park 4 - Complete" ], @@ -7813,6 +11754,8 @@ "room": 0, "pointer": 3192630, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Yaban", "Sir Kibble", @@ -7830,6 +11773,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 32, + 16 + ], + [ + 27, + 16 + ], + [ + 44, + 16 + ], + [ + 12, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Cloudy Park 5 - Enemy 1 (Yaban)", "Cloudy Park 5 - Enemy 2 (Sir Kibble)", @@ -7845,6 +11810,18 @@ "room": 1, "pointer": 3050956, "animal_pointers": [], + "consumables": [ + { + "idx": 5, + "pointer": 264, + "x": 480, + "y": 720, + "etype": 22, + "vtype": 2, + "name": "Cloudy Park 5 - Maxim Tomato (Pillars)" + } + ], + "consumables_pointer": 288, "enemies": [ "Galbo", "Bronto Burt", @@ -7861,11 +11838,33 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 51, + 16 + ], + [ + 26, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 22 + ] + ], "locations": [ - "Cloudy Park 5 - Maxim Tomato (Pillars)", "Cloudy Park 5 - Enemy 5 (Galbo)", "Cloudy Park 5 - Enemy 6 (Bronto Burt)", - "Cloudy Park 5 - Enemy 7 (KeKe)" + "Cloudy Park 5 - Enemy 7 (KeKe)", + "Cloudy Park 5 - Maxim Tomato (Pillars)" ], "music": 17 }, @@ -7879,6 +11878,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7891,6 +11892,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Cloudy Park 5 - Animal 1", "Cloudy Park 5 - Animal 2" @@ -7904,6 +11906,8 @@ "room": 3, "pointer": 3131242, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Propeller", "Klinko" @@ -7919,6 +11923,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 89, + 16 + ], + [ + 4, + 16 + ], + [ + 42, + 16 + ], + [ + 4, + 23 + ] + ], "locations": [ "Cloudy Park 5 - Enemy 8 (Propeller)", "Cloudy Park 5 - Enemy 9 (Klinko)" @@ -7932,6 +11954,8 @@ "room": 4, "pointer": 2990116, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Wapod" ], @@ -7946,6 +11970,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 88, + 16 + ] + ], "locations": [ "Cloudy Park 5 - Enemy 10 (Wapod)" ], @@ -7958,6 +11988,8 @@ "room": 5, "pointer": 2975410, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -7970,6 +12002,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 1, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 16 + ] + ], "locations": [], "music": 17 }, @@ -7980,6 +12026,8 @@ "room": 6, "pointer": 3173683, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Pteran" ], @@ -7994,6 +12042,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 1, + 23 + ], + [ + 39, + 16 + ], + [ + 70, + 16 + ] + ], "locations": [ "Cloudy Park 5 - Enemy 11 (Pteran)" ], @@ -8006,6 +12072,8 @@ "room": 7, "pointer": 2992340, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8018,6 +12086,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 25, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Cloudy Park 5 - Pick" ], @@ -8030,8 +12108,16 @@ "room": 8, "pointer": 2891558, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Cloudy Park 5 - Complete" ], @@ -8044,6 +12130,8 @@ "room": 0, "pointer": 3269847, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8056,6 +12144,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ] + ], "locations": [], "music": 11 }, @@ -8066,6 +12160,8 @@ "room": 1, "pointer": 3252248, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8078,6 +12174,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 16 + ], + [ + 55, + 16 + ] + ], "locations": [], "music": 11 }, @@ -8088,6 +12194,8 @@ "room": 2, "pointer": 3028494, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Madoo" ], @@ -8111,6 +12219,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 58, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Cloudy Park 6 - Enemy 1 (Madoo)" ], @@ -8123,6 +12241,8 @@ "room": 3, "pointer": 3131911, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8171,6 +12291,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 58, + 16 + ] + ], "locations": [], "music": 11 }, @@ -8181,6 +12307,8 @@ "room": 4, "pointer": 3115416, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Tick", "Como" @@ -8241,6 +12369,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 55, + 16 + ], + [ + 48, + 16 + ], + [ + 41, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Cloudy Park 6 - Enemy 2 (Tick)", "Cloudy Park 6 - Enemy 3 (Como)" @@ -8254,6 +12400,8 @@ "room": 5, "pointer": 3245809, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee Drawing", "Bronto Burt Drawing", @@ -8270,6 +12418,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 84, + 16 + ], + [ + 85, + 16 + ], + [ + 86, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ] + ], "locations": [ "Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", @@ -8284,6 +12454,8 @@ "room": 6, "pointer": 3237044, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Propeller" ], @@ -8298,6 +12470,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 89, + 16 + ] + ], "locations": [ "Cloudy Park 6 - Enemy 7 (Propeller)" ], @@ -8310,6 +12488,8 @@ "room": 7, "pointer": 3262705, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Mopoo" ], @@ -8342,6 +12522,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 74, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Cloudy Park 6 - Enemy 8 (Mopoo)" ], @@ -8354,6 +12544,18 @@ "room": 8, "pointer": 3027259, "animal_pointers": [], + "consumables": [ + { + "idx": 22, + "pointer": 312, + "x": 224, + "y": 256, + "etype": 22, + "vtype": 0, + "name": "Cloudy Park 6 - 1-Up (Cutter)" + } + ], + "consumables_pointer": 304, "enemies": [ "Bukiset (Burning)", "Bukiset (Ice)", @@ -8372,13 +12574,47 @@ "access_rule": [] } ], + "entity_load": [ + [ + 78, + 16 + ], + [ + 80, + 16 + ], + [ + 76, + 16 + ], + [ + 79, + 16 + ], + [ + 83, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 0, + 22 + ] + ], "locations": [ - "Cloudy Park 6 - 1-Up (Cutter)", "Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", - "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))" + "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", + "Cloudy Park 6 - 1-Up (Cutter)" ], "music": 11 }, @@ -8389,6 +12625,8 @@ "room": 9, "pointer": 3089504, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8401,6 +12639,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 41, + 16 + ] + ], "locations": [], "music": 11 }, @@ -8415,6 +12659,8 @@ 250, 258 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8472,6 +12718,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Cloudy Park 6 - Animal 1", "Cloudy Park 6 - Animal 2", @@ -8486,6 +12733,8 @@ "room": 11, "pointer": 3017866, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8534,6 +12783,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 58, + 16 + ] + ], "locations": [], "music": 11 }, @@ -8544,6 +12799,8 @@ "room": 12, "pointer": 3036404, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8565,6 +12822,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 58, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [], "music": 11 }, @@ -8575,6 +12842,8 @@ "room": 13, "pointer": 2965251, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8587,6 +12856,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 26, + 19 + ] + ], "locations": [], "music": 11 }, @@ -8597,6 +12872,8 @@ "room": 14, "pointer": 3077236, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8609,6 +12886,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 11 }, @@ -8619,6 +12897,8 @@ "room": 15, "pointer": 3061794, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8631,6 +12911,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 26, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Cloudy Park 6 - HB-007" ], @@ -8643,8 +12933,16 @@ "room": 16, "pointer": 2888907, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Cloudy Park 6 - Complete" ], @@ -8657,8 +12955,16 @@ "room": 0, "pointer": 2998682, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 3, + 18 + ] + ], "locations": [ "Cloudy Park - Boss (Ado) Purified", "Level 4 Boss" @@ -8672,6 +12978,8 @@ "room": 0, "pointer": 3363111, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee", "Klinko", @@ -8688,6 +12996,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 42, + 16 + ], + [ + 0, + 16 + ], + [ + 51, + 16 + ] + ], "locations": [ "Iceberg 1 - Enemy 1 (Waddle Dee)", "Iceberg 1 - Enemy 2 (Klinko)", @@ -8702,6 +13024,8 @@ "room": 1, "pointer": 3596524, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Como", "Galbo", @@ -8718,6 +13042,32 @@ "access_rule": [] } ], + "entity_load": [ + [ + 3, + 16 + ], + [ + 41, + 16 + ], + [ + 26, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 6, + 23 + ] + ], "locations": [ "Iceberg 1 - Enemy 4 (Como)", "Iceberg 1 - Enemy 5 (Galbo)", @@ -8732,6 +13082,8 @@ "room": 2, "pointer": 3288880, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Kapar" ], @@ -8755,6 +13107,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 28, + 19 + ], + [ + 46, + 16 + ], + [ + 47, + 16 + ], + [ + 17, + 16 + ], + [ + 67, + 16 + ] + ], "locations": [ "Iceberg 1 - Enemy 7 (Kapar)" ], @@ -8770,6 +13144,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8782,6 +13158,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 1 - Animal 1", "Iceberg 1 - Animal 2" @@ -8795,6 +13172,8 @@ "room": 4, "pointer": 3233681, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Mopoo", "Babut", @@ -8811,6 +13190,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 44, + 16 + ], + [ + 43, + 16 + ], + [ + 74, + 16 + ] + ], "locations": [ "Iceberg 1 - Enemy 8 (Mopoo)", "Iceberg 1 - Enemy 9 (Babut)", @@ -8825,6 +13218,8 @@ "room": 5, "pointer": 3406133, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bronto Burt", "Chilly", @@ -8841,6 +13236,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 6, + 16 + ], + [ + 7, + 16 + ], + [ + 2, + 16 + ], + [ + 0, + 16 + ] + ], "locations": [ "Iceberg 1 - Enemy 11 (Bronto Burt)", "Iceberg 1 - Enemy 12 (Chilly)", @@ -8855,6 +13268,8 @@ "room": 6, "pointer": 2985823, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -8867,6 +13282,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 28, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Iceberg 1 - Kogoesou" ], @@ -8879,8 +13304,16 @@ "room": 7, "pointer": 2892040, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Iceberg 1 - Complete" ], @@ -8893,6 +13326,8 @@ "room": 0, "pointer": 3106800, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Gabon", "Nruff" @@ -8908,6 +13343,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 15, + 16 + ], + [ + 0, + 16 + ], + [ + 24, + 16 + ] + ], "locations": [ "Iceberg 2 - Enemy 1 (Gabon)", "Iceberg 2 - Enemy 2 (Nruff)" @@ -8921,6 +13370,8 @@ "room": 1, "pointer": 3334841, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee", "Chilly", @@ -8937,6 +13388,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 6, + 16 + ], + [ + 0, + 16 + ], + [ + 4, + 16 + ], + [ + 39, + 16 + ] + ], "locations": [ "Iceberg 2 - Enemy 3 (Waddle Dee)", "Iceberg 2 - Enemy 4 (Chilly)", @@ -8951,6 +13420,8 @@ "room": 2, "pointer": 3473408, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Glunk", "Galbo", @@ -9004,6 +13475,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 53, + 16 + ], + [ + 26, + 16 + ], + [ + 43, + 16 + ], + [ + 14, + 23 + ], + [ + 16, + 16 + ] + ], "locations": [ "Iceberg 2 - Enemy 6 (Glunk)", "Iceberg 2 - Enemy 7 (Galbo)", @@ -9019,6 +13512,8 @@ "room": 3, "pointer": 3037006, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9031,6 +13526,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 29, + 19 + ], + [ + 14, + 23 + ] + ], "locations": [], "music": 20 }, @@ -9041,6 +13546,8 @@ "room": 4, "pointer": 3035198, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9053,6 +13560,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 29, + 19 + ], + [ + 14, + 23 + ] + ], "locations": [], "music": 20 }, @@ -9063,6 +13580,8 @@ "room": 5, "pointer": 3128551, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9075,6 +13594,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 29, + 19 + ], + [ + 14, + 23 + ] + ], "locations": [], "music": 20 }, @@ -9085,6 +13614,8 @@ "room": 6, "pointer": 3270857, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Propeller", "Nidoo", @@ -9101,6 +13632,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 62, + 16 + ], + [ + 4, + 22 + ], + [ + 89, + 16 + ], + [ + 28, + 16 + ], + [ + 25, + 16 + ] + ], "locations": [ "Iceberg 2 - Enemy 10 (Propeller)", "Iceberg 2 - Enemy 11 (Nidoo)", @@ -9115,6 +13668,8 @@ "room": 7, "pointer": 3212501, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Klinko", "Bronto Burt" @@ -9130,6 +13685,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 42, + 16 + ], + [ + 6, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 16 + ], + [ + 4, + 23 + ] + ], "locations": [ "Iceberg 2 - Enemy 13 (Klinko)", "Iceberg 2 - Enemy 14 (Bronto Burt)" @@ -9143,6 +13720,8 @@ "room": 8, "pointer": 2994515, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9155,6 +13734,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 29, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Iceberg 2 - Samus" ], @@ -9170,6 +13759,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9182,6 +13773,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 2 - Animal 1", "Iceberg 2 - Animal 2" @@ -9195,8 +13787,16 @@ "room": 10, "pointer": 2887220, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Iceberg 2 - Complete" ], @@ -9209,6 +13809,8 @@ "room": 0, "pointer": 3455346, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Corori", "Bouncy", @@ -9235,6 +13837,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 60, + 16 + ], + [ + 6, + 16 + ], + [ + 39, + 16 + ], + [ + 13, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Iceberg 3 - Enemy 1 (Corori)", "Iceberg 3 - Enemy 2 (Bouncy)", @@ -9254,6 +13878,8 @@ 200, 208 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9266,6 +13892,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 3 - Animal 1", "Iceberg 3 - Animal 2", @@ -9280,6 +13907,18 @@ "room": 2, "pointer": 3618121, "animal_pointers": [], + "consumables": [ + { + "idx": 2, + "pointer": 352, + "x": 1776, + "y": 104, + "etype": 22, + "vtype": 2, + "name": "Iceberg 3 - Maxim Tomato (Ceiling)" + } + ], + "consumables_pointer": 128, "enemies": [ "Raft Waddle Dee", "Kapar", @@ -9296,11 +13935,37 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 22 + ], + [ + 71, + 16 + ], + [ + 57, + 16 + ], + [ + 21, + 16 + ], + [ + 67, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ - "Iceberg 3 - Maxim Tomato (Ceiling)", "Iceberg 3 - Enemy 5 (Raft Waddle Dee)", "Iceberg 3 - Enemy 6 (Kapar)", - "Iceberg 3 - Enemy 7 (Blipper)" + "Iceberg 3 - Enemy 7 (Blipper)", + "Iceberg 3 - Maxim Tomato (Ceiling)" ], "music": 14 }, @@ -9311,6 +13976,8 @@ "room": 3, "pointer": 3650368, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Wapod" ], @@ -9334,6 +14001,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 1, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 6, + 16 + ], + [ + 88, + 16 + ] + ], "locations": [ "Iceberg 3 - Enemy 8 (Wapod)" ], @@ -9349,6 +14038,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9361,6 +14052,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 3 - Animal 4", "Iceberg 3 - Animal 5" @@ -9374,6 +14066,8 @@ "room": 5, "pointer": 3013938, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9386,6 +14080,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 30, + 19 + ] + ], "locations": [], "music": 31 }, @@ -9396,6 +14096,8 @@ "room": 6, "pointer": 3624789, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Glunk", "Icicle" @@ -9411,6 +14113,28 @@ "access_rule": [] } ], + "entity_load": [ + [ + 6, + 16 + ], + [ + 16, + 16 + ], + [ + 14, + 23 + ], + [ + 36, + 16 + ], + [ + 4, + 22 + ] + ], "locations": [ "Iceberg 3 - Enemy 9 (Glunk)", "Iceberg 3 - Enemy 10 (Icicle)" @@ -9424,6 +14148,8 @@ "room": 7, "pointer": 2989472, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9436,6 +14162,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 30, + 19 + ] + ], "locations": [ "Iceberg 3 - Chef Kawasaki" ], @@ -9448,8 +14180,16 @@ "room": 8, "pointer": 2889871, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Iceberg 3 - Complete" ], @@ -9462,6 +14202,8 @@ "room": 0, "pointer": 3274879, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bronto Burt", "Galbo", @@ -9479,6 +14221,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 42, + 16 + ], + [ + 6, + 16 + ], + [ + 2, + 16 + ], + [ + 26, + 16 + ] + ], "locations": [ "Iceberg 4 - Enemy 1 (Bronto Burt)", "Iceberg 4 - Enemy 2 (Galbo)", @@ -9494,6 +14254,8 @@ "room": 1, "pointer": 3371780, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Babut", "Wappa" @@ -9509,6 +14271,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 43, + 16 + ], + [ + 4, + 22 + ], + [ + 44, + 16 + ] + ], "locations": [ "Iceberg 4 - Enemy 5 (Babut)", "Iceberg 4 - Enemy 6 (Wappa)" @@ -9522,6 +14298,8 @@ "room": 2, "pointer": 3284378, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9556,6 +14334,12 @@ ] } ], + "entity_load": [ + [ + 26, + 16 + ] + ], "locations": [], "music": 19 }, @@ -9566,6 +14350,8 @@ "room": 3, "pointer": 3162957, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9578,6 +14364,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 69, + 16 + ] + ], "locations": [], "music": 19 }, @@ -9588,6 +14380,8 @@ "room": 4, "pointer": 3261679, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Icicle" ], @@ -9602,6 +14396,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 36, + 16 + ] + ], "locations": [ "Iceberg 4 - Enemy 7 (Icicle)" ], @@ -9614,6 +14414,8 @@ "room": 5, "pointer": 3217398, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Corori" ], @@ -9628,6 +14430,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 60, + 16 + ], + [ + 44, + 16 + ], + [ + 4, + 22 + ] + ], "locations": [ "Iceberg 4 - Enemy 8 (Corori)" ], @@ -9640,6 +14456,8 @@ "room": 6, "pointer": 3108265, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9652,6 +14470,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 62, + 16 + ] + ], "locations": [], "music": 19 }, @@ -9662,6 +14486,8 @@ "room": 7, "pointer": 3346202, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9696,6 +14522,20 @@ ] } ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 4, + 23 + ] + ], "locations": [], "music": 19 }, @@ -9706,6 +14546,8 @@ "room": 8, "pointer": 3055911, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9718,6 +14560,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 26, + 16 + ] + ], "locations": [], "music": 19 }, @@ -9728,6 +14576,8 @@ "room": 9, "pointer": 3056457, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9740,6 +14590,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 1, + 27 + ] + ], "locations": [ "Iceberg 4 - Miniboss 1 (Yuki)" ], @@ -9752,6 +14608,8 @@ "room": 10, "pointer": 3257516, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9773,6 +14631,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 31, + 19 + ] + ], "locations": [], "music": 19 }, @@ -9783,6 +14647,8 @@ "room": 11, "pointer": 3083322, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Gabon" ], @@ -9797,6 +14663,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 24, + 16 + ] + ], "locations": [ "Iceberg 4 - Enemy 9 (Gabon)" ], @@ -9809,6 +14681,8 @@ "room": 12, "pointer": 3147724, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Kabu" ], @@ -9823,6 +14697,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 19, + 16 + ], + [ + 61, + 16 + ] + ], "locations": [ "Iceberg 4 - Enemy 10 (Kabu)" ], @@ -9839,6 +14723,8 @@ 240, 248 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9887,6 +14773,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 4 - Animal 1", "Iceberg 4 - Animal 2", @@ -9901,6 +14788,8 @@ "room": 14, "pointer": 3057002, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Broom Hatter", "Sasuke" @@ -9943,6 +14832,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 11, + 16 + ], + [ + 30, + 16 + ] + ], "locations": [ "Iceberg 4 - Enemy 11 (Broom Hatter)", "Iceberg 4 - Enemy 12 (Sasuke)" @@ -9956,6 +14855,8 @@ "room": 15, "pointer": 3116124, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -9986,6 +14887,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 22 + ] + ], "locations": [], "music": 19 }, @@ -9998,6 +14905,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10010,6 +14919,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 4 - Animal 4" ], @@ -10024,6 +14934,8 @@ "animal_pointers": [ 192 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10036,6 +14948,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 4 - Animal 5" ], @@ -10048,6 +14961,8 @@ "room": 18, "pointer": 3404593, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Nruff" ], @@ -10062,6 +14977,24 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 43, + 16 + ], + [ + 30, + 16 + ], + [ + 15, + 16 + ] + ], "locations": [ "Iceberg 4 - Enemy 13 (Nruff)" ], @@ -10074,6 +15007,8 @@ "room": 19, "pointer": 3075826, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10086,6 +15021,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 31, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Iceberg 4 - Name" ], @@ -10098,8 +15043,16 @@ "room": 20, "pointer": 2887943, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Iceberg 4 - Complete" ], @@ -10112,6 +15065,8 @@ "room": 0, "pointer": 3316135, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Bukiset (Burning)", "Bukiset (Stone)", @@ -10133,6 +15088,40 @@ "access_rule": [] } ], + "entity_load": [ + [ + 79, + 16 + ], + [ + 76, + 16 + ], + [ + 81, + 16 + ], + [ + 78, + 16 + ], + [ + 77, + 16 + ], + [ + 82, + 16 + ], + [ + 80, + 16 + ], + [ + 83, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 1 (Bukiset (Burning))", "Iceberg 5 - Enemy 2 (Bukiset (Stone))", @@ -10152,6 +15141,8 @@ "room": 1, "pointer": 3037607, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10164,6 +15155,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 1, + 16 + ] + ], "locations": [], "music": 16 }, @@ -10174,6 +15171,8 @@ "room": 2, "pointer": 3103842, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Glunk" ], @@ -10188,6 +15187,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 16, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 9 (Glunk)" ], @@ -10200,6 +15205,8 @@ "room": 3, "pointer": 3135899, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Wapod" ], @@ -10214,6 +15221,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 88, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Iceberg 5 - Enemy 10 (Wapod)" ], @@ -10226,6 +15243,8 @@ "room": 4, "pointer": 3180695, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Tick" ], @@ -10240,6 +15259,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 48, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Iceberg 5 - Enemy 11 (Tick)" ], @@ -10252,6 +15281,8 @@ "room": 5, "pointer": 3106064, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Madoo" ], @@ -10266,6 +15297,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 58, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ] + ], "locations": [ "Iceberg 5 - Enemy 12 (Madoo)" ], @@ -10278,6 +15323,8 @@ "room": 6, "pointer": 3276800, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10290,6 +15337,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 55, + 16 + ] + ], "locations": [], "music": 16 }, @@ -10300,6 +15353,8 @@ "room": 7, "pointer": 3104585, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10312,6 +15367,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 23, + 16 + ], + [ + 7, + 16 + ] + ], "locations": [], "music": 16 }, @@ -10322,6 +15387,8 @@ "room": 8, "pointer": 3195121, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10334,6 +15401,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 16 + ] + ], "locations": [], "music": 16 }, @@ -10344,6 +15417,18 @@ "room": 9, "pointer": 3087198, "animal_pointers": [], + "consumables": [ + { + "idx": 16, + "pointer": 200, + "x": 256, + "y": 88, + "etype": 22, + "vtype": 0, + "name": "Iceberg 5 - 1-Up (Boulder)" + } + ], + "consumables_pointer": 128, "enemies": [], "default_exits": [ { @@ -10356,6 +15441,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 22 + ], + [ + 54, + 16 + ] + ], "locations": [ "Iceberg 5 - 1-Up (Boulder)" ], @@ -10368,6 +15463,8 @@ "room": 10, "pointer": 3321612, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10380,6 +15477,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 14, + 16 + ] + ], "locations": [], "music": 16 }, @@ -10390,6 +15493,18 @@ "room": 11, "pointer": 3139178, "animal_pointers": [], + "consumables": [ + { + "idx": 17, + "pointer": 192, + "x": 152, + "y": 168, + "etype": 22, + "vtype": 0, + "name": "Iceberg 5 - 1-Up (Floor)" + } + ], + "consumables_pointer": 176, "enemies": [ "Yaban" ], @@ -10404,9 +15519,19 @@ "access_rule": [] } ], + "entity_load": [ + [ + 32, + 16 + ], + [ + 0, + 22 + ] + ], "locations": [ - "Iceberg 5 - 1-Up (Floor)", - "Iceberg 5 - Enemy 13 (Yaban)" + "Iceberg 5 - Enemy 13 (Yaban)", + "Iceberg 5 - 1-Up (Floor)" ], "music": 16 }, @@ -10417,6 +15542,8 @@ "room": 12, "pointer": 3118231, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Propeller" ], @@ -10431,6 +15558,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 89, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Iceberg 5 - Enemy 14 (Propeller)" ], @@ -10443,6 +15580,8 @@ "room": 13, "pointer": 3021658, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Mariel" ], @@ -10457,6 +15596,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 45, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 15 (Mariel)" ], @@ -10469,6 +15614,18 @@ "room": 14, "pointer": 3025398, "animal_pointers": [], + "consumables": [ + { + "idx": 24, + "pointer": 200, + "x": 208, + "y": 88, + "etype": 22, + "vtype": 0, + "name": "Iceberg 5 - 1-Up (Peloo)" + } + ], + "consumables_pointer": 176, "enemies": [], "default_exits": [ { @@ -10481,6 +15638,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 64, + 16 + ], + [ + 0, + 22 + ] + ], "locations": [ "Iceberg 5 - 1-Up (Peloo)" ], @@ -10493,6 +15660,8 @@ "room": 15, "pointer": 3167445, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Pteran" ], @@ -10507,6 +15676,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 39, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 16 (Pteran)" ], @@ -10519,6 +15694,8 @@ "room": 16, "pointer": 3033990, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10531,6 +15708,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 68, + 16 + ] + ], "locations": [], "music": 16 }, @@ -10541,6 +15724,8 @@ "room": 17, "pointer": 3100111, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10553,6 +15738,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 52, + 16 + ] + ], "locations": [], "music": 16 }, @@ -10563,6 +15754,8 @@ "room": 18, "pointer": 3030947, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Galbo" ], @@ -10577,6 +15770,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 26, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 17 (Galbo)" ], @@ -10589,6 +15788,8 @@ "room": 19, "pointer": 3105326, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "KeKe" ], @@ -10603,6 +15804,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 51, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 18 (KeKe)" ], @@ -10615,6 +15822,8 @@ "room": 20, "pointer": 3118928, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Nidoo" ], @@ -10629,6 +15838,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 28, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 19 (Nidoo)" ], @@ -10641,6 +15856,8 @@ "room": 21, "pointer": 3202517, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Waddle Dee Drawing", "Bronto Burt Drawing", @@ -10657,6 +15874,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 84, + 16 + ], + [ + 85, + 16 + ], + [ + 86, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", @@ -10671,6 +15902,8 @@ "room": 22, "pointer": 3014656, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Joe" ], @@ -10685,6 +15918,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 91, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [ "Iceberg 5 - Enemy 23 (Joe)" ], @@ -10697,6 +15940,8 @@ "room": 23, "pointer": 3166550, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Kapar" ], @@ -10711,6 +15956,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 67, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 24 (Kapar)" ], @@ -10723,6 +15974,8 @@ "room": 24, "pointer": 3029110, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Gansan" ], @@ -10737,6 +15990,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 75, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 25 (Gansan)" ], @@ -10749,6 +16008,8 @@ "room": 25, "pointer": 3156420, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sasuke" ], @@ -10763,6 +16024,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 30, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 26 (Sasuke)" ], @@ -10775,6 +16042,8 @@ "room": 26, "pointer": 3127877, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Togezo" ], @@ -10789,6 +16058,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 18, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 27 (Togezo)" ], @@ -10801,6 +16076,8 @@ "room": 27, "pointer": 3256471, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sparky", "Bobin" @@ -10816,6 +16093,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 8, + 16 + ], + [ + 73, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 28 (Sparky)", "Iceberg 5 - Enemy 29 (Bobin)" @@ -10829,6 +16116,8 @@ "room": 28, "pointer": 3029723, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Chilly" ], @@ -10843,6 +16132,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 6, + 16 + ] + ], "locations": [ "Iceberg 5 - Enemy 30 (Chilly)" ], @@ -10855,6 +16150,8 @@ "room": 29, "pointer": 3526568, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10867,6 +16164,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 10, + 23 + ], + [ + 31, + 16 + ], + [ + 14, + 23 + ] + ], "locations": [], "music": 16 }, @@ -10880,6 +16191,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10892,6 +16205,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 5 - Animal 1", "Iceberg 5 - Animal 2" @@ -10908,6 +16222,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10920,6 +16236,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 5 - Animal 3", "Iceberg 5 - Animal 4" @@ -10936,6 +16253,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10948,6 +16267,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 5 - Animal 5", "Iceberg 5 - Animal 6" @@ -10964,6 +16284,8 @@ 192, 200 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -10976,6 +16298,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 5 - Animal 7", "Iceberg 5 - Animal 8" @@ -10989,6 +16312,8 @@ "room": 34, "pointer": 3185868, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Peran" ], @@ -11003,6 +16328,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 72, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ] + ], "locations": [ "Iceberg 5 - Enemy 31 (Peran)" ], @@ -11015,6 +16354,8 @@ "room": 35, "pointer": 3865635, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11027,6 +16368,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 17, + 16 + ], + [ + 4, + 22 + ] + ], "locations": [], "music": 16 }, @@ -11037,6 +16388,8 @@ "room": 36, "pointer": 3024154, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11049,6 +16402,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 32, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Iceberg 5 - Shiro" ], @@ -11061,8 +16424,16 @@ "room": 37, "pointer": 2890594, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Iceberg 5 - Complete" ], @@ -11075,6 +16446,8 @@ "room": 0, "pointer": 3385305, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Nruff" ], @@ -11107,6 +16480,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 15, + 16 + ] + ], "locations": [ "Iceberg 6 - Enemy 1 (Nruff)" ], @@ -11123,6 +16502,8 @@ 220, 228 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11153,6 +16534,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 6 - Animal 1", "Iceberg 6 - Animal 2", @@ -11167,6 +16549,8 @@ "room": 2, "pointer": 3097113, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11197,6 +16581,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 12 }, @@ -11211,6 +16596,8 @@ 220, 228 ], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11241,6 +16628,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [ "Iceberg 6 - Animal 4", "Iceberg 6 - Animal 5", @@ -11255,6 +16643,8 @@ "room": 4, "pointer": 3210507, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11285,6 +16675,7 @@ "access_rule": [] } ], + "entity_load": [], "locations": [], "music": 12 }, @@ -11295,6 +16686,27 @@ "room": 5, "pointer": 3196776, "animal_pointers": [], + "consumables": [ + { + "idx": 0, + "pointer": 212, + "x": 136, + "y": 120, + "etype": 22, + "vtype": 2, + "name": "Iceberg 6 - Maxim Tomato (Left)" + }, + { + "idx": 1, + "pointer": 220, + "x": 248, + "y": 120, + "etype": 22, + "vtype": 0, + "name": "Iceberg 6 - 1-Up (Middle)" + } + ], + "consumables_pointer": 128, "enemies": [], "default_exits": [ { @@ -11325,6 +16737,20 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 22 + ], + [ + 0, + 22 + ], + [ + 14, + 23 + ] + ], "locations": [ "Iceberg 6 - Maxim Tomato (Left)", "Iceberg 6 - 1-Up (Middle)" @@ -11338,6 +16764,8 @@ "room": 6, "pointer": 3208130, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Nidoo" ], @@ -11352,6 +16780,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 28, + 16 + ] + ], "locations": [ "Iceberg 6 - Enemy 2 (Nidoo)" ], @@ -11364,6 +16798,8 @@ "room": 7, "pointer": 3124478, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sparky" ], @@ -11378,6 +16814,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 8, + 16 + ] + ], "locations": [ "Iceberg 6 - Enemy 3 (Sparky)" ], @@ -11390,6 +16832,8 @@ "room": 8, "pointer": 3110431, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11411,6 +16855,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 22 + ], + [ + 33, + 19 + ] + ], "locations": [], "music": 12 }, @@ -11421,6 +16875,8 @@ "room": 9, "pointer": 3139832, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11433,6 +16889,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 2, + 27 + ] + ], "locations": [ "Iceberg 6 - Miniboss 1 (Blocky)" ], @@ -11445,6 +16907,8 @@ "room": 10, "pointer": 3119624, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11457,6 +16921,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], "locations": [], "music": 12 }, @@ -11467,6 +16941,8 @@ "room": 11, "pointer": 3141139, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11479,6 +16955,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 3, + 27 + ] + ], "locations": [ "Iceberg 6 - Miniboss 2 (Jumper Shoot)" ], @@ -11491,6 +16973,8 @@ "room": 12, "pointer": 3123788, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11503,6 +16987,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], "locations": [], "music": 12 }, @@ -11513,6 +17007,8 @@ "room": 13, "pointer": 3143741, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11525,6 +17021,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 1, + 27 + ] + ], "locations": [ "Iceberg 6 - Miniboss 3 (Yuki)" ], @@ -11537,6 +17039,8 @@ "room": 14, "pointer": 3120319, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11549,6 +17053,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], "locations": [], "music": 12 }, @@ -11559,6 +17073,8 @@ "room": 15, "pointer": 3135238, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [ "Sir Kibble" ], @@ -11573,6 +17089,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 27, + 16 + ] + ], "locations": [ "Iceberg 6 - Enemy 4 (Sir Kibble)" ], @@ -11585,6 +17107,8 @@ "room": 16, "pointer": 3123096, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11597,6 +17121,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 22 + ], + [ + 33, + 19 + ] + ], "locations": [], "music": 12 }, @@ -11607,6 +17141,8 @@ "room": 17, "pointer": 3144389, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11619,6 +17155,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 5, + 27 + ] + ], "locations": [ "Iceberg 6 - Miniboss 4 (Haboki)" ], @@ -11631,6 +17173,8 @@ "room": 18, "pointer": 3121014, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11643,6 +17187,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], "locations": [], "music": 12 }, @@ -11653,6 +17207,8 @@ "room": 19, "pointer": 3017228, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11665,6 +17221,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 4, + 27 + ] + ], "locations": [ "Iceberg 6 - Miniboss 5 (Boboo)" ], @@ -11677,6 +17239,8 @@ "room": 20, "pointer": 3121709, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11689,6 +17253,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], "locations": [], "music": 12 }, @@ -11699,6 +17273,8 @@ "room": 21, "pointer": 3145036, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11711,6 +17287,12 @@ "access_rule": [] } ], + "entity_load": [ + [ + 0, + 27 + ] + ], "locations": [ "Iceberg 6 - Miniboss 6 (Captain Stitch)" ], @@ -11723,6 +17305,8 @@ "room": 22, "pointer": 3116830, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11735,6 +17319,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], "locations": [], "music": 12 }, @@ -11745,6 +17339,8 @@ "room": 23, "pointer": 3045263, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [ { @@ -11757,6 +17353,16 @@ "access_rule": [] } ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 42, + 19 + ] + ], "locations": [ "Iceberg 6 - Angel" ], @@ -11769,8 +17375,16 @@ "room": 24, "pointer": 2889389, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], "locations": [ "Iceberg 6 - Complete" ], @@ -11783,8 +17397,16 @@ "room": 0, "pointer": 2980207, "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, "enemies": [], "default_exits": [], + "entity_load": [ + [ + 8, + 18 + ] + ], "locations": [ "Iceberg - Boss (Dedede) Purified", "Level 5 Boss" From 61872974368e6dd47fbdb006539eff38e8049ab4 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 15 Aug 2023 20:09:07 -0500 Subject: [PATCH 100/165] pause icons, edge cases, fix client --- worlds/kdl3/Client.py | 2 +- worlds/kdl3/Rom.py | 73 +++++++++++++++++++++++++++++- worlds/kdl3/Room.py | 6 +-- worlds/kdl3/data/APPauseIcons.dat | Bin 0 -> 448 bytes 4 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 worlds/kdl3/data/APPauseIcons.dat diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index e7e2850575b0..3b94c418a692 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -249,7 +249,7 @@ async def game_watcher(self, ctx) -> None: snes_buffered_write(ctx, KDL3_ANIMAL_FRIENDS + (friend << 1), bytes([friend + 1])) elif item.item == 0x770020: # Heart Star - heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 1) + heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 2) snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", unpack("H", heart_star_count)[0] + 1)) snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x16])) else: diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 43be4c6c18dd..d6c4fffed788 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -954,6 +954,73 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req 0x6B, # RTL ]) + # display received items in pause menu + rom.write_bytes(0x8406, [0x50, 0xA5, 0x07]) + rom.write_bytes(0x3A550, [0x22, 0x9F, 0xD2, 0x00, # JSL $00D29F + 0xDA, # PHX + 0x5A, # PHY + 0xA9, 0x00, 0x33, # LDA #$3300 + 0x8F, 0x16, 0x21, 0x00, # STA VMADDL + 0xA9, 0x07, 0x00, # LDA #$0007 + 0x8F, 0x04, 0x43, 0x00, # STA A1B0 + 0xA9, 0x00, 0xF0, # LDA #$F000 + 0x8F, 0x02, 0x43, 0x00, # STA A1T0L + 0xA9, 0xC0, 0x01, # LDA #$01C0 + 0x8F, 0x05, 0x43, 0x00, # STA DAS0L + 0xE2, 0x20, # SEP #$20 + 0xA9, 0x01, # LDA #$01 + 0x8F, 0x00, 0x43, 0x00, # STA DMAP0 + 0xA9, 0x18, # LDA #$18 + 0x8F, 0x01, 0x43, 0x00, # STA BBAD0 + 0xA9, 0x01, # LDA #$01 + 0x8F, 0x0B, 0x42, 0x00, # MDMAEN + 0xC2, 0x20, # REP #$20 + 0xA0, 0x00, 0x00, # LDY #$0000 + 0xC8, # INY - loop head + 0xC0, 0x09, 0x00, # CPY #$0009 + 0x10, 0x1B, # BPL $07A5AC + 0x98, # TYA + 0x0A, # ASL + 0xAA, # TAX + 0xBD, 0x20, 0x80, # LDA $8020, X + 0xF0, 0xF2, # BEQ $07A58B - return to loop head + 0x98, # TYA + 0x18, # CLC + 0x69, 0xE2, 0x31, # ADC #$31E2 + 0x8F, 0x16, 0x21, 0x00, # STA VMADDL + 0xBF, 0x20, 0xE0, 0x07, # LDA $07E020, X + 0x8F, 0x18, 0x21, 0x00, # STA VMDATAL + 0x80, 0xDF, # BRA $07A58B - return to loop head + 0xA0, 0xFF, 0xFF, # LDY #$FFFF + 0xC8, # INY - loop head + 0xC0, 0x07, 0x00, # CPY #$0007 + 0x10, 0x1B, # BPL $07A5D0 + 0x98, # TYA + 0x0A, # ASL + 0xAA, # TAX + 0xBD, 0x00, 0x80, # LDA $8000, X + 0xF0, 0xF2, # BEQ $07A5AF - return to loop head + 0x98, # TYA + 0x18, # CLC + 0x69, 0x03, 0x32, # ADC #$3203 + 0x8F, 0x16, 0x21, 0x00, # STA VMADDL + 0xBF, 0x40, 0xE0, 0x07, # LDA $07E040, X + 0x8F, 0x18, 0x21, 0x00, # STA VMDATAL + 0x80, 0xDF, # BRA $07A5AF - retun to loop head + 0x7A, # PLY + 0xFA, # PLX + 0x6B, # RTL + ]) + + # data writing for prior + rom.write_bytes(0x3E020, + [0x00, 0x0C, 0x30, 0x09, 0x31, 0x09, 0x32, 0x09, 0x33, 0x09, 0x34, 0x09, 0x35, 0x09, 0x36, 0x09, + 0x37, 0x09, + ]) + rom.write_bytes(0x3E040, [0x38, 0x05, 0x39, 0x05, 0x3A, 0x01, 0x3B, 0x05, 0x3C, 0x05, 0x3D, 0x05, ]) + tiles = get_data(__name__, os.path.join("data", "APPauseIcons.dat")) + rom.write_bytes(0x3F000, tiles) + # base patch done, write relevant slot info # Write strict bosses patch @@ -1198,9 +1265,11 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req if multiworld.copy_ability_randomization[player] > 0: for enemy in copy_abilities: if enemy in miniboss_remap: - rom.write_bytes(0xB417E + (miniboss_remap[enemy] << 1), struct.pack("H", ability_remap[copy_abilities[enemy]])) + rom.write_bytes(0xB417E + (miniboss_remap[enemy] << 1), + struct.pack("H", ability_remap[copy_abilities[enemy]])) else: - rom.write_bytes(0xB3CAC + (enemy_remap[enemy] << 1), struct.pack("H", ability_remap[copy_abilities[enemy]])) + rom.write_bytes(0xB3CAC + (enemy_remap[enemy] << 1), + struct.pack("H", ability_remap[copy_abilities[enemy]])) # following only needs done on non-door rando # incredibly lucky this follows the same order (including 5E == star block) rom.write_byte(0x2F77EA, 0x5E + (ability_remap[copy_abilities["Sparky"]] << 1)) diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index c0fbcf3ef19d..e7488a43cf2a 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -56,8 +56,8 @@ def patch(self, rom: "RomData"): is_progression = location.item.classification & ItemClassification.progression if load_len == 8: # edge case, there is exactly 1 room with 8 entities and only 1 consumable among them - if not any(x not in self.entity_load for x in [[0, 22], [1, 22]]) \ - and any(x not in self.entity_load for x in [[2, 22], [3, 22]]): + if not (any(x in self.entity_load for x in [[0, 22], [1, 22]]) + and any(x in self.entity_load for x in [[2, 22], [3, 22]])): replacement_target = self.entity_load.index( next(x for x in self.entity_load if x in [[0, 22], [1, 22], [2, 22], [3, 22]])) if is_progression: @@ -74,7 +74,7 @@ def patch(self, rom: "RomData"): else: if any(x not in self.entity_load for x in [[2, 22], [3, 22]]): # edge case: if (1, 22) is in, we need to load (3, 22) instead - if (1, 22) in self.entity_load: + if [1, 22] in self.entity_load: self.entity_load.append([3, 22]) else: self.entity_load.append([2, 22]) diff --git a/worlds/kdl3/data/APPauseIcons.dat b/worlds/kdl3/data/APPauseIcons.dat new file mode 100644 index 0000000000000000000000000000000000000000..e7773a0e6718d35360e9c250119c2bc329b50379 GIT binary patch literal 448 zcmZuts|v$F5UlHGMfAhU5lV=vs0tOKBBCF0BCH5ip(>OUAw;Z*sE7!qgz4PTxZB}a z_I79XvEqXPH40chLClo@hKOe`xG{4=j%SRFFJ@vS;{25r4KnO;MjufyoNgdqoG@ks zbu;E?DBh8RlIot{pp0Zk)MMUWdrNi8PT-vF+HaK)K-H;D@5ZL0%fgsQd5x5Q!9#W=E_g4?{ EKW{sg`v3p{ literal 0 HcmV?d00001 From 94dd61e02f42be4fdb07ed91be3223dadadede94 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 19 Aug 2023 01:30:09 -0500 Subject: [PATCH 101/165] client cleanup --- worlds/kdl3/Client.py | 44 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 3b94c418a692..526f3cc75ed2 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -5,6 +5,7 @@ from NetUtils import ClientStatus, color from worlds.AutoSNIClient import SNIClient +from .Locations import boss_locations snes_logger = logging.getLogger("SNES") @@ -18,6 +19,7 @@ KDL3_ROMNAME = SRAM_1_START + 0x8100 KDL3_DEATH_LINK_ADDR = SRAM_1_START + 0x9010 KDL3_GOAL_ADDR = SRAM_1_START + 0x9012 +KDL3_CONSUMABLE_FLAG = SRAM_1_START + 0x9018 KDL3_LEVEL_ADDR = SRAM_1_START + 0x9020 KDL3_IS_DEMO = SRAM_1_START + 0x5AD5 KDL3_GAME_STATE = SRAM_1_START + 0x36D0 @@ -97,9 +99,8 @@ class KDL3SNIClient(SNIClient): game = "Kirby's Dream Land 3" - latest_world = 0x01 - latest_level = 0x01 levels = None + consumables = None item_queue = [] async def deathlink_kill_player(self, ctx) -> None: @@ -193,6 +194,9 @@ async def pop_item(self, ctx): async def game_watcher(self, ctx) -> None: from SNIClient import snes_buffered_write, snes_flush_writes, snes_read + rom = await snes_read(ctx, KDL3_ROMNAME, 0x15) + if rom != ctx.rom: + ctx.rom = None halken = await snes_read(ctx, WRAM_START, 6) if halken != b"halken": return @@ -228,6 +232,10 @@ async def game_watcher(self, ctx) -> None: level_data = await snes_read(ctx, KDL3_LEVEL_ADDR + (14 * i), 14) self.levels[i] = unpack("HHHHHHH", level_data) + if self.consumables is None: + consumables = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) + self.consumables = consumables[0] == 0x01 + recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 2) recv_amount = unpack("H", recv_count)[0] if recv_amount < len(ctx.items_received): @@ -246,7 +254,7 @@ async def game_watcher(self, ctx) -> None: elif item.item & 0x000010 > 0: friend = (item.item & 0x00000F) snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) - snes_buffered_write(ctx, KDL3_ANIMAL_FRIENDS + (friend << 1), bytes([friend + 1])) + snes_buffered_write(ctx, KDL3_ANIMAL_FRIENDS + (friend << 1), pack("H", friend + 1)) elif item.item == 0x770020: # Heart Star heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 2) @@ -268,7 +276,7 @@ async def game_watcher(self, ctx) -> None: loc_id = 0x770000 + i + 1 if stages[i] == 1 and loc_id not in ctx.checked_locations: new_checks.append(loc_id) - elif stages[i] == 0 and loc_id in ctx.checked_locations: + elif loc_id in ctx.checked_locations: snes_buffered_write(ctx, KDL3_COMPLETED_STAGES + (i * 2), struct.pack("H", 1)) # heart star status @@ -280,35 +288,23 @@ async def game_watcher(self, ctx) -> None: loc_id = 0x770100 + (6 * i) + j if heart_stars[level_ind] and loc_id not in ctx.checked_locations: new_checks.append(loc_id) - elif not heart_stars[level_ind] and loc_id in ctx.checked_locations: - # only handle collected heart stars + elif loc_id in ctx.checked_locations: snes_buffered_write(ctx, KDL3_HEART_STARS + level_ind, bytes([0x01])) await snes_flush_writes(ctx) # consumable status consumables = await snes_read(ctx, KDL3_CONSUMABLES, 1920) for consumable in consumable_addrs: # TODO: see if this can be sped up in any way - if consumables[consumable_addrs[consumable]] == 0x01: - loc_id = 0x770300 + consumable - if loc_id not in ctx.checked_locations: - new_checks.append(loc_id) + loc_id = 0x770300 + consumable + if loc_id not in ctx.checked_locations and consumables[consumable_addrs[consumable]] == 0x01: + new_checks.append(loc_id) + # boss status boss_flag_bytes = await snes_read(ctx, KDL3_BOSS_STATUS, 2) boss_flag = unpack("H", boss_flag_bytes)[0] - if boss_flag & 2 > 0 and 0x770200 not in ctx.checked_locations: - new_checks.append(0x770200) - if boss_flag & 8 > 0 and 0x770201 not in ctx.checked_locations: - new_checks.append(0x770201) - if boss_flag & 32 > 0 and 0x770202 not in ctx.checked_locations: - new_checks.append(0x770202) - if boss_flag & 128 > 0 and 0x770203 not in ctx.checked_locations: - new_checks.append(0x770203) - if boss_flag & 512 > 0 and 0x770204 not in ctx.checked_locations: - new_checks.append(0x770204) - - rom = await snes_read(ctx, KDL3_ROMNAME, 0x15) - if rom != ctx.rom: - ctx.rom = None + for bitmask, boss in zip(range(1, 11, 2), boss_locations.keys()): + if boss_flag & (1 << bitmask) > 0 and boss not in ctx.checked_locations: + new_checks.append(boss) for new_check_id in new_checks: ctx.locations_checked.add(new_check_id) From d3197b1014b7d7047dd4b8a4c37f7714657ba662 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 19 Aug 2023 02:45:06 -0500 Subject: [PATCH 102/165] cleanup, change open_world to default true --- worlds/kdl3/Options.py | 6 +++--- worlds/kdl3/__init__.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index cc027068d6e4..c89285253503 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -9,7 +9,7 @@ class Goal(Choice): """ Zero: collect the Heart Stars, and defeat Zero in the Hyper Zone. Boss Butch: collect the Heart Stars, and then complete the boss rematches in the Boss Butch mode. - MG5: collect the Heart Stars, and then complete a perfect run through the minigame gauntlet within the MG5 + MG5: collect the Heart Stars, and then complete a perfect run through the minigame gauntlet within the Super MG5 Jumping: collect the Heart Stars, and then reach a designated score within the Jumping sub-game """ display_name = "Goal" @@ -145,7 +145,7 @@ class StrictBosses(DefaultOnToggle): display_name = "Strict Bosses" -class OpenWorld(Toggle): +class OpenWorld(DefaultOnToggle): """ If enabled, all 6 stages will be unlocked upon entering a world for the first time. A certain amount of stages will need to be completed in order to unlock the bosses @@ -202,7 +202,7 @@ class FillerPercentage(Range): class TrapPercentage(Range): """ - Percentage of non-required Heart Stars to be converted to trap items (Gooey Bags, Slowness, Eject Ability). + Percentage of filler items to be converted to trap items (Gooey Bags, Slowness, Eject Ability). """ display_name = "Trap Percentage" range_start = 0 diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index baf93b1665f4..1e0491f0a485 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -237,7 +237,7 @@ def generate_basic(self) -> None: .place_locked_item( KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) - # this can technically be done at any point + # this can technically be done at any point before generate_output self.boss_butch_bosses.extend([None for _ in range(6)]) if self.multiworld.allow_bb[self.player]: for i in range(6): From d683974c77008998e6f3cd1aeea17cbc1540adee Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 19 Aug 2023 03:02:23 -0500 Subject: [PATCH 103/165] remove mutually exclusive brr and strict bosses --- worlds/kdl3/Options.py | 5 +++-- worlds/kdl3/__init__.py | 22 +++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index c89285253503..48bb161d6a71 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -165,9 +165,10 @@ class OpenWorldBossRequirement(Range): class BossRequirementRandom(Toggle): """ - If enabled, boss purification will unlock in any order, requiring a random amount of Heart Stars. + If enabled, boss purification will require a random amount of Heart Stars. Depending on options, this may have + boss purification unlock in a random order. """ - display_name = "Randomize Purification Order" + display_name = "Randomize Purification Requirement" class JumpingTarget(Range): diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 1e0491f0a485..6da8ded2facb 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -109,13 +109,6 @@ def get_trap_item_name(self) -> str: self.multiworld.slow_trap_weight[self.player], self.multiworld.ability_trap_weight[self.player]])[0] - def generate_early(self) -> None: - # just check for invalid option combos here - if self.multiworld.strict_bosses[self.player] and self.multiworld.boss_requirement_random[self.player]: - logger.warning(f"boss_requirement_random forced to false for player {self.player}" + - f" because of strict_bosses set to true") - self.multiworld.boss_requirement_random[self.player] = False - def pre_fill(self) -> None: # fill animals if self.multiworld.animal_randomization[self.player] != 0: @@ -198,13 +191,20 @@ def create_items(self) -> None: self.required_heart_stars = required_heart_stars # handle boss requirements here requirements = [required_heart_stars] + quotient = required_heart_stars // 5 # since we set the last manually, we can afford imperfect rounding if self.multiworld.boss_requirement_random[self.player]: - for i in range(4): - requirements.append(self.random.randint( - min(3, required_heart_stars), required_heart_stars)) + for i in range(1, 5): + if self.multiworld.strict_bosses[self.player]: + max_stars = quotient * i + else: + max_stars = required_heart_stars + requirements.insert(i, self.random.randint( + min(1, max_stars), max_stars)) + if self.multiworld.strict_bosses[self.player]: + requirements.sort() + else: self.random.shuffle(requirements) else: - quotient = required_heart_stars // 5 # since we set the last manually, we can afford imperfect rounding for i in range(1, 5): requirements.insert(i - 1, quotient * i) self.boss_requirements = requirements From 65c3d893235168a67e7f0e874571f71cc8e54245 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 19 Aug 2023 03:09:03 -0500 Subject: [PATCH 104/165] fix failing tests from changed default --- worlds/kdl3/test/TestGoal.py | 3 +++ worlds/kdl3/test/TestLocations.py | 1 + worlds/kdl3/test/TestShuffles.py | 6 +++--- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/test/TestGoal.py b/worlds/kdl3/test/TestGoal.py index 576eef1d881a..2bf9e01e78da 100644 --- a/worlds/kdl3/test/TestGoal.py +++ b/worlds/kdl3/test/TestGoal.py @@ -3,6 +3,7 @@ class TestFastGoal(KDL3TestBase): options = { + "open_world": False, "goal_speed": "fast", "total_heart_stars": 30, "heart_stars_required": 50, @@ -25,7 +26,9 @@ def testGoal(self): class TestNormalGoal(KDL3TestBase): + # TODO: open world tests options = { + "open_world": False, "goal_speed": "normal", "total_heart_stars": 30, "heart_stars_required": 50, diff --git a/worlds/kdl3/test/TestLocations.py b/worlds/kdl3/test/TestLocations.py index 08c61530b756..6eaaf9ced393 100644 --- a/worlds/kdl3/test/TestLocations.py +++ b/worlds/kdl3/test/TestLocations.py @@ -46,6 +46,7 @@ def run_location_test(self, location: str, itempool: typing.List[str]): class TestShiro(KDL3TestBase): options = { + "open_world": False, "plando_connections": [ [], [ diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/TestShuffles.py index 1db51a473388..1be076b093ce 100644 --- a/worlds/kdl3/test/TestShuffles.py +++ b/worlds/kdl3/test/TestShuffles.py @@ -1,10 +1,11 @@ from typing import List, Tuple from . import KDL3TestBase -from .TestGoal import TestNormalGoal + class TestCopyAbilityShuffle(KDL3TestBase): options = { + "open_world": False, "goal_speed": "normal", "total_heart_stars": 30, "heart_stars_required": 50, @@ -75,10 +76,9 @@ def testValidAbilitiesForROB(self): assert self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B") - - class TestAnimalShuffle(KDL3TestBase): options = { + "open_world": False, "goal_speed": "normal", "total_heart_stars": 30, "heart_stars_required": 50, From 82525aab49bd7423cd4ed82ea444f323e4093050 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 19 Aug 2023 03:09:26 -0500 Subject: [PATCH 105/165] forgot one --- worlds/kdl3/test/TestShuffles.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/TestShuffles.py index 1be076b093ce..1b12a59ec998 100644 --- a/worlds/kdl3/test/TestShuffles.py +++ b/worlds/kdl3/test/TestShuffles.py @@ -122,6 +122,7 @@ def testLockedAnimals(self): class TestAllShuffle(KDL3TestBase): options = { + "open_world": False, "goal_speed": "normal", "total_heart_stars": 30, "heart_stars_required": 50, From 47d8a74b66d546c99756f27f51caa0def2e768a4 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 19 Aug 2023 20:34:26 -0500 Subject: [PATCH 106/165] block client spamming when not connected --- worlds/kdl3/Client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 526f3cc75ed2..6063632af20d 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -200,6 +200,8 @@ async def game_watcher(self, ctx) -> None: halken = await snes_read(ctx, WRAM_START, 6) if halken != b"halken": return + if not ctx.server: + return # can't check debug anymore, without going and copying the value. might be important later. is_demo = await snes_read(ctx, KDL3_IS_DEMO, 1) # 1 - recording a demo, 2 - playing back recorded, 3+ is a demo if is_demo[0] > 0x00: From a0ea84a328a771602f2f10cf0a4d172e7e672ab7 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 20 Aug 2023 17:19:44 -0500 Subject: [PATCH 107/165] plando guide update --- worlds/generic/docs/plando_en.md | 41 ++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/worlds/generic/docs/plando_en.md b/worlds/generic/docs/plando_en.md index 2d40f45195ba..09da96351a56 100644 --- a/worlds/generic/docs/plando_en.md +++ b/worlds/generic/docs/plando_en.md @@ -161,8 +161,41 @@ into any locations within the game slots named BobsSlaytheSpire and BobsRogueLeg ## Boss Plando -As this is currently only supported by A Link to the Past, instead of finding an explanation here, please refer to the -relevant guide: [A Link to the Past Plando Guide](/tutorial/A%20Link%20to%20the%20Past/plando/en) +This is currently only supported by A Link to the Past and Kirby's Dream Land 3. Boss plando allows a player to place a +given boss within an arena. Boss plando takes in a list of instructions for placing bosses, separated by a semicolon `;`. +There are three types of placement: direct, full, and shuffle. +* Direct placement takes both an arena and a boss, and places the boss into that arena. + * `Eastern Palace-Trinexx` +* Full placement will take a boss, and place it into as many remaining arenas as possible. + * `King Dedede` +* Shuffle will fill any remaining arenas using a given boss shuffle option, typically to be used as the last instruction. + * `full` + +### Examples + +```yaml +A Link to the Past: + boss_shuffle: + # Basic boss shuffle, but prevent Trinexx from being outside Turtle Rock + Turtle Rock-Trinexx;basic: 1 + # Place as many Arrghus as possible, then let the rest be random + Arrghus;chaos: 1 + # Ensure that GT bottom is Kholdstare, then place Trinexx + # into as many arenas as possible, then fill the rest with Kholdstare + # Any remaining arenas will have their vanilla bosses placed + Ganons Tower Bottom-Kholdstare;Trinexx;Kholdstare: 1 + +Kirby's Dream Land 3: + boss_shuffle: + # Ensure Iceberg's boss will be King Dedede, but randomize the rest + Iceberg-King Dedede;full: 1 + # Have all bosses be Whispy Woods + Whispy Woods: 1 + # Ensure Ripple Field's boss is Pon & Con, but let the method others + # are placed be random + Ripple Field-Pon & Con;random: 1 +``` + ## Text Plando @@ -171,7 +204,7 @@ relevant guide: [A Link to the Past Plando Guide](/tutorial/A%20Link%20to%20the% ## Connections Plando -This is currently only supported by Minecraft and A Link to the Past. As the way that these games interact with their +This is currently only supported by Minecraft, A Link to the Past, Ocarina of Time, and Kirby's Dream Land 3. As the way that these games interact with their connections is different, I will only explain the basics here, while more specifics for A Link to the Past connection plando can be found in its plando guide. @@ -184,7 +217,7 @@ plando can be found in its plando guide. [A Link to the Past connections](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/alttp/EntranceShuffle.py#L3852) -[Minecraft connections](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/minecraft/Regions.py#L62) +[Minecraft connections](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/minecraft/data/regions.json#L18****) ### Examples From a707ae24ddaa413703b351947ce534ddbd9f8c40 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 20 Aug 2023 22:29:04 -0500 Subject: [PATCH 108/165] minor change on plando guide --- worlds/generic/docs/plando_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/generic/docs/plando_en.md b/worlds/generic/docs/plando_en.md index 09da96351a56..1ddcdc7cd2b3 100644 --- a/worlds/generic/docs/plando_en.md +++ b/worlds/generic/docs/plando_en.md @@ -192,7 +192,7 @@ Kirby's Dream Land 3: # Have all bosses be Whispy Woods Whispy Woods: 1 # Ensure Ripple Field's boss is Pon & Con, but let the method others - # are placed be random + # are placed with be random Ripple Field-Pon & Con;random: 1 ``` From 511dd675ef8829823dc7600c85b28ba5c7304a94 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 20 Aug 2023 22:29:51 -0500 Subject: [PATCH 109/165] increment data version --- worlds/kdl3/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 6da8ded2facb..e93dca581b83 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -66,7 +66,7 @@ class KDL3World(World): item_name_to_id = {item: item_table[item].code for item in item_table} location_name_to_id = {location_table[location]: location for location in location_table} item_name_groups = item_names - data_version = 0 + data_version = 1 web = KDL3WebWorld() settings: typing.ClassVar[KDL3Settings] From 7378511e0b95881b1c95a33b3da51c15cbba39be Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 20 Aug 2023 23:19:01 -0500 Subject: [PATCH 110/165] de-indent rooms json --- worlds/kdl3/data/Rooms.json | 17417 +--------------------------------- 1 file changed, 1 insertion(+), 17416 deletions(-) diff --git a/worlds/kdl3/data/Rooms.json b/worlds/kdl3/data/Rooms.json index c88c350401e3..df33db7e7920 100644 --- a/worlds/kdl3/data/Rooms.json +++ b/worlds/kdl3/data/Rooms.json @@ -1,17416 +1 @@ -[ - { - "name": "Grass Land 1 - 0", - "level": 1, - "stage": 1, - "room": 0, - "pointer": 3434257, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Sir Kibble", - "Cappy" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 205, - "unkn2": 8, - "x": 72, - "y": 200, - "name": "Grass Land 1 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 87, - "unkn2": 9, - "x": 104, - "y": 152, - "name": "Grass Land 1 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 16 - ], - [ - 1, - 23 - ], - [ - 0, - 23 - ], - [ - 14, - 23 - ], - [ - 27, - 16 - ], - [ - 12, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Grass Land 1 - Enemy 1 (Waddle Dee)", - "Grass Land 1 - Enemy 2 (Sir Kibble)", - "Grass Land 1 - Enemy 3 (Cappy)" - ], - "music": 20 - }, - { - "name": "Grass Land 1 - 1", - "level": 1, - "stage": 1, - "room": 1, - "pointer": 3368373, - "animal_pointers": [], - "consumables": [ - { - "idx": 14, - "pointer": 264, - "x": 928, - "y": 160, - "etype": 22, - "vtype": 0, - "name": "Grass Land 1 - 1-Up (Parasol)" - }, - { - "idx": 15, - "pointer": 312, - "x": 1456, - "y": 176, - "etype": 22, - "vtype": 2, - "name": "Grass Land 1 - Maxim Tomato (Spark)" - } - ], - "consumables_pointer": 304, - "enemies": [ - "Sparky", - "Bronto Burt", - "Sasuke" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 143, - "unkn2": 6, - "x": 56, - "y": 152, - "name": "Grass Land 1 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 30, - 16 - ], - [ - 12, - 16 - ], - [ - 14, - 23 - ], - [ - 8, - 16 - ], - [ - 0, - 22 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Grass Land 1 - Enemy 4 (Sparky)", - "Grass Land 1 - Enemy 5 (Bronto Burt)", - "Grass Land 1 - Enemy 6 (Sasuke)", - "Grass Land 1 - 1-Up (Parasol)", - "Grass Land 1 - Maxim Tomato (Spark)" - ], - "music": 20 - }, - { - "name": "Grass Land 1 - 2", - "level": 1, - "stage": 1, - "room": 2, - "pointer": 2960650, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 5, - "unkn2": 9, - "x": 1416, - "y": 152, - "name": "Grass Land 1 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 1 - Animal 1", - "Grass Land 1 - Animal 2" - ], - "music": 38 - }, - { - "name": "Grass Land 1 - 3", - "level": 1, - "stage": 1, - "room": 3, - "pointer": 3478442, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 4, - "unkn1": 179, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Grass Land 1 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 19 - ], - [ - 7, - 16 - ], - [ - 0, - 23 - ], - [ - 6, - 22 - ], - [ - 14, - 23 - ], - [ - 8, - 16 - ], - [ - 1, - 23 - ] - ], - "locations": [ - "Grass Land 1 - Enemy 7 (Poppy Bros Jr.)" - ], - "music": 20 - }, - { - "name": "Grass Land 1 - 4", - "level": 1, - "stage": 1, - "room": 4, - "pointer": 2978390, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 1 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Grass Land 1 - Tulip" - ], - "music": 8 - }, - { - "name": "Grass Land 1 - 5", - "level": 1, - "stage": 1, - "room": 5, - "pointer": 2890835, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 1 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land 2 - 0", - "level": 1, - "stage": 2, - "room": 0, - "pointer": 3293347, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Rocky", - "KeKe", - "Bobo", - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 1, - "unkn1": 112, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Grass Land 2 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 16 - ], - [ - 7, - 16 - ], - [ - 5, - 16 - ], - [ - 4, - 22 - ], - [ - 51, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 2 - Enemy 1 (Rocky)", - "Grass Land 2 - Enemy 2 (KeKe)", - "Grass Land 2 - Enemy 3 (Bobo)", - "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)" - ], - "music": 11 - }, - { - "name": "Grass Land 2 - 1", - "level": 1, - "stage": 2, - "room": 1, - "pointer": 3059685, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 20, - "unkn2": 9, - "x": 56, - "y": 136, - "name": "Grass Land 2 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 2 - Animal 1", - "Grass Land 2 - Animal 2" - ], - "music": 39 - }, - { - "name": "Grass Land 2 - 2", - "level": 1, - "stage": 2, - "room": 2, - "pointer": 3432109, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Popon Ball", - "Bouncy" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 133, - "unkn2": 11, - "x": 72, - "y": 200, - "name": "Grass Land 2 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 52, - "unkn2": 12, - "x": 56, - "y": 152, - "name": "Grass Land 2 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 13, - 16 - ], - [ - 50, - 16 - ], - [ - 4, - 22 - ], - [ - 3, - 16 - ], - [ - 0, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 2 - Enemy 5 (Waddle Dee)", - "Grass Land 2 - Enemy 6 (Popon Ball)", - "Grass Land 2 - Enemy 7 (Bouncy)" - ], - "music": 11 - }, - { - "name": "Grass Land 2 - 3", - "level": 1, - "stage": 2, - "room": 3, - "pointer": 2970029, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 2, - "unkn2": 9, - "x": 840, - "y": 168, - "name": "Grass Land 2 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 19 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Grass Land 2 - 4", - "level": 1, - "stage": 2, - "room": 4, - "pointer": 3578022, - "animal_pointers": [], - "consumables": [ - { - "idx": 20, - "pointer": 272, - "x": 992, - "y": 192, - "etype": 22, - "vtype": 0, - "name": "Grass Land 2 - 1-Up (Needle)" - } - ], - "consumables_pointer": 352, - "enemies": [ - "Tick", - "Bronto Burt", - "Nruff" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 154, - "unkn2": 12, - "x": 72, - "y": 152, - "name": "Grass Land 2 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 16 - ], - [ - 5, - 16 - ], - [ - 2, - 16 - ], - [ - 48, - 16 - ], - [ - 14, - 23 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Grass Land 2 - Enemy 8 (Tick)", - "Grass Land 2 - Enemy 9 (Bronto Burt)", - "Grass Land 2 - Enemy 10 (Nruff)", - "Grass Land 2 - 1-Up (Needle)" - ], - "music": 11 - }, - { - "name": "Grass Land 2 - 5", - "level": 1, - "stage": 2, - "room": 5, - "pointer": 2966057, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 2 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Grass Land 2 - Muchimuchi" - ], - "music": 8 - }, - { - "name": "Grass Land 2 - 6", - "level": 1, - "stage": 2, - "room": 6, - "pointer": 2887461, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 2 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land 3 - 0", - "level": 1, - "stage": 3, - "room": 0, - "pointer": 3149707, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky", - "Rocky", - "Nruff" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 107, - "unkn2": 7, - "x": 72, - "y": 840, - "name": "Grass Land 3 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 46, - "unkn2": 9, - "x": 152, - "y": 152, - "name": "Grass Land 3 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 16 - ], - [ - 14, - 23 - ], - [ - 15, - 16 - ], - [ - 0, - 16 - ], - [ - 8, - 16 - ] - ], - "locations": [ - "Grass Land 3 - Enemy 1 (Sparky)", - "Grass Land 3 - Enemy 2 (Rocky)", - "Grass Land 3 - Enemy 3 (Nruff)" - ], - "music": 19 - }, - { - "name": "Grass Land 3 - 1", - "level": 1, - "stage": 3, - "room": 1, - "pointer": 3204939, - "animal_pointers": [], - "consumables": [ - { - "idx": 10, - "pointer": 360, - "x": 208, - "y": 344, - "etype": 22, - "vtype": 0, - "name": "Grass Land 3 - 1-Up (Climb)" - }, - { - "idx": 11, - "pointer": 376, - "x": 224, - "y": 568, - "etype": 22, - "vtype": 2, - "name": "Grass Land 3 - Maxim Tomato (Climb)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 9, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Grass Land 3 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 22 - ], - [ - 6, - 23 - ], - [ - 2, - 22 - ], - [ - 5, - 23 - ], - [ - 14, - 23 - ], - [ - 1, - 23 - ], - [ - 0, - 23 - ], - [ - 31, - 16 - ] - ], - "locations": [ - "Grass Land 3 - 1-Up (Climb)", - "Grass Land 3 - Maxim Tomato (Climb)" - ], - "music": 19 - }, - { - "name": "Grass Land 3 - 2", - "level": 1, - "stage": 3, - "room": 2, - "pointer": 3200066, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 13, - "unkn2": 55, - "x": 56, - "y": 152, - "name": "Grass Land 3 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 16 - ], - [ - 0, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Grass Land 3 - 3", - "level": 1, - "stage": 3, - "room": 3, - "pointer": 2959784, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 15, - "unkn2": 9, - "x": 56, - "y": 120, - "name": "Grass Land 3 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 19 - ] - ], - "locations": [], - "music": 31 - }, - { - "name": "Grass Land 3 - 4", - "level": 1, - "stage": 3, - "room": 4, - "pointer": 2979121, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 8, - "unkn2": 9, - "x": 760, - "y": 152, - "name": "Grass Land 3 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 3 - Animal 1", - "Grass Land 3 - Animal 2" - ], - "music": 40 - }, - { - "name": "Grass Land 3 - 5", - "level": 1, - "stage": 3, - "room": 5, - "pointer": 2997811, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 15, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 3 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 19 - ] - ], - "locations": [], - "music": 8 - }, - { - "name": "Grass Land 3 - 6", - "level": 1, - "stage": 3, - "room": 6, - "pointer": 3084876, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bouncy" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 96, - "unkn2": 9, - "x": 40, - "y": 152, - "name": "Grass Land 3 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 13, - 16 - ], - [ - 14, - 16 - ], - [ - 1, - 23 - ], - [ - 59, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 3 - Pitcherman", - "Grass Land 3 - Enemy 4 (Bouncy)" - ], - "music": 19 - }, - { - "name": "Grass Land 3 - 7", - "level": 1, - "stage": 3, - "room": 7, - "pointer": 2891317, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 3 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land 4 - 0", - "level": 1, - "stage": 4, - "room": 0, - "pointer": 3471284, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Loud", - "Babut", - "Rocky" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 145, - "unkn2": 13, - "x": 72, - "y": 136, - "name": "Grass Land 4 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 16 - ], - [ - 43, - 16 - ], - [ - 14, - 23 - ], - [ - 40, - 16 - ], - [ - 61, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Grass Land 4 - Enemy 1 (Loud)", - "Grass Land 4 - Enemy 2 (Babut)", - "Grass Land 4 - Enemy 3 (Rocky)" - ], - "music": 10 - }, - { - "name": "Grass Land 4 - 1", - "level": 1, - "stage": 4, - "room": 1, - "pointer": 3436401, - "animal_pointers": [], - "consumables": [ - { - "idx": 12, - "pointer": 290, - "x": 1008, - "y": 144, - "etype": 22, - "vtype": 2, - "name": "Grass Land 4 - Maxim Tomato (Zebon Right)" - } - ], - "consumables_pointer": 368, - "enemies": [ - "Kapar" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 58, - "unkn2": 5, - "x": 184, - "y": 312, - "name": "Grass Land 4 - 1 Exit 0", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 42, - "unkn2": 18, - "x": 168, - "y": 88, - "name": "Grass Land 4 - 1 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 43, - 16 - ], - [ - 10, - 23 - ], - [ - 6, - 22 - ], - [ - 14, - 23 - ], - [ - 2, - 22 - ], - [ - 67, - 16 - ] - ], - "locations": [ - "Grass Land 4 - Enemy 4 (Kapar)", - "Grass Land 4 - Maxim Tomato (Zebon Right)" - ], - "music": 10 - }, - { - "name": "Grass Land 4 - 2", - "level": 1, - "stage": 4, - "room": 2, - "pointer": 3039401, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 4, - "x": 56, - "y": 72, - "name": "Grass Land 4 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 27 - ] - ], - "locations": [ - ], - "music": 9 - }, - { - "name": "Grass Land 4 - 3", - "level": 1, - "stage": 4, - "room": 3, - "pointer": 3722714, - "animal_pointers": [], - "consumables": [ - { - "idx": 23, - "pointer": 280, - "x": 856, - "y": 224, - "etype": 22, - "vtype": 2, - "name": "Grass Land 4 - Maxim Tomato (Gordo)" - }, - { - "idx": 22, - "pointer": 480, - "x": 1352, - "y": 112, - "etype": 22, - "vtype": 0, - "name": "Grass Land 4 - 1-Up (Gordo)" - } - ], - "consumables_pointer": 288, - "enemies": [ - "Glunk", - "Oro" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 95, - "unkn2": 5, - "x": 72, - "y": 200, - "name": "Grass Land 4 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ], - [ - 55, - 16 - ], - [ - 16, - 16 - ], - [ - 25, - 16 - ], - [ - 14, - 23 - ], - [ - 0, - 22 - ], - [ - 2, - 22 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Grass Land 4 - Enemy 5 (Glunk)", - "Grass Land 4 - Enemy 6 (Oro)", - "Grass Land 4 - Maxim Tomato (Gordo)", - "Grass Land 4 - 1-Up (Gordo)" - ], - "music": 10 - }, - { - "name": "Grass Land 4 - 4", - "level": 1, - "stage": 4, - "room": 4, - "pointer": 3304980, - "animal_pointers": [], - "consumables": [ - { - "idx": 32, - "pointer": 208, - "x": 488, - "y": 64, - "etype": 22, - "vtype": 2, - "name": "Grass Land 4 - Maxim Tomato (Cliff)" - } - ], - "consumables_pointer": 160, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 94, - "unkn2": 9, - "x": 40, - "y": 152, - "name": "Grass Land 4 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 43, - 16 - ], - [ - 2, - 22 - ], - [ - 54, - 16 - ], - [ - 1, - 16 - ], - [ - 40, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 4 - Maxim Tomato (Cliff)" - ], - "music": 10 - }, - { - "name": "Grass Land 4 - 5", - "level": 1, - "stage": 4, - "room": 5, - "pointer": 3498127, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Peran" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 61, - "unkn2": 13, - "x": 56, - "y": 72, - "name": "Grass Land 4 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 61, - "unkn2": 18, - "x": 56, - "y": 200, - "name": "Grass Land 4 - 5 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 72, - 16 - ], - [ - 43, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ], - [ - 10, - 23 - ], - [ - 3, - 16 - ] - ], - "locations": [ - "Grass Land 4 - Enemy 7 (Peran)" - ], - "music": 10 - }, - { - "name": "Grass Land 4 - 6", - "level": 1, - "stage": 4, - "room": 6, - "pointer": 3160191, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 28, - "unkn2": 4, - "x": 72, - "y": 376, - "name": "Grass Land 4 - 6 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 28, - "unkn2": 12, - "x": 72, - "y": 440, - "name": "Grass Land 4 - 6 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 19 - ], - [ - 6, - 23 - ] - ], - "locations": [], - "music": 10 - }, - { - "name": "Grass Land 4 - 7", - "level": 1, - "stage": 4, - "room": 7, - "pointer": 3035801, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 12, - "x": 56, - "y": 200, - "name": "Grass Land 4 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 27 - ] - ], - "locations": [ - "Grass Land 4 - Miniboss 1 (Boboo)" - ], - "music": 4 - }, - { - "name": "Grass Land 4 - 8", - "level": 1, - "stage": 4, - "room": 8, - "pointer": 2989794, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 4 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Grass Land 4 - Chao & Goku" - ], - "music": 8 - }, - { - "name": "Grass Land 4 - 9", - "level": 1, - "stage": 4, - "room": 9, - "pointer": 3043518, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 9, - "unkn2": 5, - "x": 696, - "y": 296, - "name": "Grass Land 4 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 4 - Animal 1", - "Grass Land 4 - Animal 2" - ], - "music": 38 - }, - { - "name": "Grass Land 4 - 10", - "level": 1, - "stage": 4, - "room": 10, - "pointer": 2888425, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 4 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land 5 - 0", - "level": 1, - "stage": 5, - "room": 0, - "pointer": 3303565, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Broom Hatter", - "Bouncy" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 120, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Grass Land 5 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 13, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ], - [ - 6, - 23 - ], - [ - 11, - 16 - ], - [ - 89, - 16 - ] - ], - "locations": [ - "Grass Land 5 - Enemy 1 (Propeller)", - "Grass Land 5 - Enemy 2 (Broom Hatter)", - "Grass Land 5 - Enemy 3 (Bouncy)" - ], - "music": 11 - }, - { - "name": "Grass Land 5 - 1", - "level": 1, - "stage": 5, - "room": 1, - "pointer": 3048718, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 18, - "unkn2": 4, - "x": 184, - "y": 152, - "name": "Grass Land 5 - 1 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 21, - "unkn2": 4, - "x": 184, - "y": 152, - "name": "Grass Land 5 - 1 Exit 1", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 36, - "unkn2": 9, - "x": 56, - "y": 88, - "name": "Grass Land 5 - 1 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 27, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 5 - Enemy 4 (Sir Kibble)" - ], - "music": 11 - }, - { - "name": "Grass Land 5 - 2", - "level": 1, - "stage": 5, - "room": 2, - "pointer": 3327019, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Sasuke", - "Nruff" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 121, - "unkn2": 6, - "x": 56, - "y": 72, - "name": "Grass Land 5 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 30, - 16 - ], - [ - 15, - 16 - ], - [ - 1, - 16 - ] - ], - "locations": [ - "Grass Land 5 - Enemy 5 (Waddle Dee)", - "Grass Land 5 - Enemy 6 (Sasuke)", - "Grass Land 5 - Enemy 7 (Nruff)" - ], - "music": 11 - }, - { - "name": "Grass Land 5 - 3", - "level": 1, - "stage": 5, - "room": 3, - "pointer": 2966459, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 10, - "unkn2": 9, - "x": 312, - "y": 72, - "name": "Grass Land 5 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 5 - Animal 1", - "Grass Land 5 - Animal 2" - ], - "music": 38 - }, - { - "name": "Grass Land 5 - 4", - "level": 1, - "stage": 5, - "room": 4, - "pointer": 2973509, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 10, - "unkn2": 9, - "x": 360, - "y": 72, - "name": "Grass Land 5 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 5 - Animal 3", - "Grass Land 5 - Animal 4" - ], - "music": 38 - }, - { - "name": "Grass Land 5 - 5", - "level": 1, - "stage": 5, - "room": 5, - "pointer": 2962351, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 5 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Grass Land 5 - Mine" - ], - "music": 8 - }, - { - "name": "Grass Land 5 - 6", - "level": 1, - "stage": 5, - "room": 6, - "pointer": 2886738, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 5 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land 5 - 7", - "level": 1, - "stage": 5, - "room": 7, - "pointer": 3255423, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Tick" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 96, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Grass Land 5 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 48, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 5 - Enemy 8 (Tick)" - ], - "music": 11 - }, - { - "name": "Grass Land 6 - 0", - "level": 1, - "stage": 6, - "room": 0, - "pointer": 3376872, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Como", - "Togezo", - "Bronto Burt", - "Cappy" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 51, - "unkn2": 9, - "x": 216, - "y": 152, - "name": "Grass Land 6 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 96, - "unkn2": 9, - "x": 216, - "y": 1144, - "name": "Grass Land 6 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 12, - 16 - ], - [ - 18, - 16 - ], - [ - 2, - 16 - ], - [ - 41, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 6 - Enemy 1 (Como)", - "Grass Land 6 - Enemy 2 (Togezo)", - "Grass Land 6 - Enemy 3 (Bronto Burt)", - "Grass Land 6 - Enemy 4 (Cappy)" - ], - "music": 20 - }, - { - "name": "Grass Land 6 - 1", - "level": 1, - "stage": 6, - "room": 1, - "pointer": 3395125, - "animal_pointers": [], - "consumables": [ - { - "idx": 10, - "pointer": 192, - "x": 104, - "y": 1144, - "etype": 22, - "vtype": 0, - "name": "Grass Land 6 - 1-Up (Tower)" - } - ], - "consumables_pointer": 256, - "enemies": [ - "Bobo", - "Mariel" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 16, - "unkn2": 5, - "x": 72, - "y": 88, - "name": "Grass Land 6 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 16 - ], - [ - 5, - 19 - ], - [ - 45, - 16 - ], - [ - 0, - 22 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ], - [ - 55, - 16 - ] - ], - "locations": [ - "Grass Land 6 - Enemy 5 (Bobo)", - "Grass Land 6 - Enemy 6 (Mariel)", - "Grass Land 6 - 1-Up (Tower)" - ], - "music": 20 - }, - { - "name": "Grass Land 6 - 2", - "level": 1, - "stage": 6, - "room": 2, - "pointer": 3375177, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Yaban", - "Broom Hatter" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 93, - "unkn2": 6, - "x": 200, - "y": 152, - "name": "Grass Land 6 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 49, - "unkn2": 7, - "x": 216, - "y": 104, - "name": "Grass Land 6 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 11, - 16 - ], - [ - 45, - 16 - ], - [ - 41, - 16 - ], - [ - 4, - 22 - ], - [ - 32, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 6 - Enemy 7 (Yaban)", - "Grass Land 6 - Enemy 8 (Broom Hatter)" - ], - "music": 20 - }, - { - "name": "Grass Land 6 - 3", - "level": 1, - "stage": 6, - "room": 3, - "pointer": 3322977, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Apolo", - "Sasuke" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 12, - "unkn2": 52, - "x": 72, - "y": 104, - "name": "Grass Land 6 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 41, - 16 - ], - [ - 49, - 16 - ], - [ - 30, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Grass Land 6 - Enemy 9 (Apolo)", - "Grass Land 6 - Enemy 10 (Sasuke)" - ], - "music": 20 - }, - { - "name": "Grass Land 6 - 4", - "level": 1, - "stage": 6, - "room": 4, - "pointer": 3490819, - "animal_pointers": [], - "consumables": [ - { - "idx": 33, - "pointer": 192, - "x": 40, - "y": 104, - "etype": 22, - "vtype": 1, - "name": "Grass Land 6 - 1-Up (Falling)" - } - ], - "consumables_pointer": 176, - "enemies": [ - "Rocky" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 145, - "unkn2": 6, - "x": 56, - "y": 152, - "name": "Grass Land 6 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 16 - ], - [ - 4, - 22 - ], - [ - 49, - 16 - ], - [ - 61, - 16 - ], - [ - 3, - 16 - ], - [ - 1, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 6 - Enemy 11 (Rocky)", - "Grass Land 6 - 1-Up (Falling)" - ], - "music": 20 - }, - { - "name": "Grass Land 6 - 5", - "level": 1, - "stage": 6, - "room": 5, - "pointer": 3076769, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 6 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Grass Land 6 - Pierre" - ], - "music": 8 - }, - { - "name": "Grass Land 6 - 6", - "level": 1, - "stage": 6, - "room": 6, - "pointer": 3047576, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 12, - "unkn2": 9, - "x": 840, - "y": 152, - "name": "Grass Land 6 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 6 - Animal 1", - "Grass Land 6 - Animal 2" - ], - "music": 39 - }, - { - "name": "Grass Land 6 - 7", - "level": 1, - "stage": 6, - "room": 7, - "pointer": 3022909, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 12, - "unkn2": 6, - "x": 808, - "y": 120, - "name": "Grass Land 6 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 6 - Animal 3", - "Grass Land 6 - Animal 4" - ], - "music": 38 - }, - { - "name": "Grass Land 6 - 8", - "level": 1, - "stage": 6, - "room": 8, - "pointer": 2884569, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 6 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land Boss - 0", - "level": 1, - "stage": 7, - "room": 0, - "pointer": 2984105, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 0, - 18 - ] - ], - "locations": [ - "Grass Land - Boss (Whispy Woods) Purified", - "Level 1 Boss" - ], - "music": 2 - }, - { - "name": "Ripple Field 1 - 0", - "level": 2, - "stage": 1, - "room": 0, - "pointer": 3279855, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Glunk", - "Broom Hatter", - "Cappy" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 102, - "unkn2": 8, - "x": 56, - "y": 152, - "name": "Ripple Field 1 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 16, - 16 - ], - [ - 0, - 16 - ], - [ - 12, - 16 - ], - [ - 11, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 1 - Enemy 1 (Waddle Dee)", - "Ripple Field 1 - Enemy 2 (Glunk)", - "Ripple Field 1 - Enemy 3 (Broom Hatter)", - "Ripple Field 1 - Enemy 4 (Cappy)" - ], - "music": 15 - }, - { - "name": "Ripple Field 1 - 1", - "level": 2, - "stage": 1, - "room": 1, - "pointer": 3588688, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "Rocky", - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 3, - "unkn1": 146, - "unkn2": 11, - "x": 40, - "y": 232, - "name": "Ripple Field 1 - 1 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 73, - "unkn2": 16, - "x": 200, - "y": 184, - "name": "Ripple Field 1 - 1 Exit 1", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 108, - "unkn2": 16, - "x": 200, - "y": 184, - "name": "Ripple Field 1 - 1 Exit 2", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 138, - "unkn2": 16, - "x": 200, - "y": 184, - "name": "Ripple Field 1 - 1 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 11, - 16 - ], - [ - 2, - 16 - ], - [ - 3, - 16 - ], - [ - 7, - 16 - ] - ], - "locations": [ - "Ripple Field 1 - Enemy 5 (Bronto Burt)", - "Ripple Field 1 - Enemy 6 (Rocky)", - "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)" - ], - "music": 15 - }, - { - "name": "Ripple Field 1 - 2", - "level": 2, - "stage": 1, - "room": 2, - "pointer": 2955848, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 18, - "unkn2": 9, - "x": 56, - "y": 168, - "name": "Ripple Field 1 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 1 - Animal 1", - "Ripple Field 1 - Animal 2" - ], - "music": 40 - }, - { - "name": "Ripple Field 1 - 3", - "level": 2, - "stage": 1, - "room": 3, - "pointer": 3558828, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bobin" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 171, - "unkn2": 5, - "x": 40, - "y": 152, - "name": "Ripple Field 1 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 73, - 16 - ], - [ - 6, - 22 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 0, - 16 - ], - [ - 10, - 23 - ] - ], - "locations": [ - "Ripple Field 1 - Enemy 8 (Bobin)" - ], - "music": 15 - }, - { - "name": "Ripple Field 1 - 4", - "level": 2, - "stage": 1, - "room": 4, - "pointer": 2974271, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 1 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 7, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Ripple Field 1 - Kamuribana" - ], - "music": 8 - }, - { - "name": "Ripple Field 1 - 5", - "level": 2, - "stage": 1, - "room": 5, - "pointer": 3051513, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 11, - "unkn2": 11, - "x": 1192, - "y": 264, - "name": "Ripple Field 1 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 7, - 19 - ], - [ - 14, - 23 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 1 - 6", - "level": 2, - "stage": 1, - "room": 6, - "pointer": 3049838, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 11, - "unkn2": 11, - "x": 1752, - "y": 264, - "name": "Ripple Field 1 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 7, - 19 - ], - [ - 14, - 23 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 1 - 7", - "level": 2, - "stage": 1, - "room": 7, - "pointer": 3066407, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 11, - "unkn2": 11, - "x": 2232, - "y": 264, - "name": "Ripple Field 1 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 7, - 19 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 1 - 8", - "level": 2, - "stage": 1, - "room": 8, - "pointer": 2889148, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 1 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field 2 - 0", - "level": 2, - "stage": 2, - "room": 0, - "pointer": 3342336, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Togezo", - "Coconut", - "Blipper", - "Sasuke" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 103, - "unkn2": 15, - "x": 56, - "y": 104, - "name": "Ripple Field 2 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 22 - ], - [ - 34, - 16 - ], - [ - 30, - 16 - ], - [ - 21, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 18, - 16 - ] - ], - "locations": [ - "Ripple Field 2 - Enemy 1 (Togezo)", - "Ripple Field 2 - Enemy 2 (Coconut)", - "Ripple Field 2 - Enemy 3 (Blipper)", - "Ripple Field 2 - Enemy 4 (Sasuke)" - ], - "music": 10 - }, - { - "name": "Ripple Field 2 - 1", - "level": 2, - "stage": 2, - "room": 1, - "pointer": 3084099, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 23, - "unkn2": 8, - "x": 72, - "y": 248, - "name": "Ripple Field 2 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 2 - Animal 1", - "Ripple Field 2 - Animal 2" - ], - "music": 39 - }, - { - "name": "Ripple Field 2 - 2", - "level": 2, - "stage": 2, - "room": 2, - "pointer": 3451207, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kany" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 31, - "unkn2": 5, - "x": 72, - "y": 152, - "name": "Ripple Field 2 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 96, - "unkn2": 6, - "x": 56, - "y": 152, - "name": "Ripple Field 2 - 2 Exit 1", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 56, - "unkn2": 17, - "x": 136, - "y": 264, - "name": "Ripple Field 2 - 2 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 16 - ], - [ - 47, - 16 - ], - [ - 1, - 16 - ], - [ - 46, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 2 - Enemy 5 (Kany)" - ], - "music": 10 - }, - { - "name": "Ripple Field 2 - 3", - "level": 2, - "stage": 2, - "room": 3, - "pointer": 3674327, - "animal_pointers": [], - "consumables": [ - { - "idx": 11, - "pointer": 480, - "x": 1384, - "y": 200, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 2 - Maxim Tomato (Currents)" - }, - { - "idx": 10, - "pointer": 520, - "x": 1456, - "y": 200, - "etype": 22, - "vtype": 0, - "name": "Ripple Field 2 - 1-Up (Currents)" - } - ], - "consumables_pointer": 128, - "enemies": [ - "Glunk" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 134, - "unkn2": 5, - "x": 40, - "y": 136, - "name": "Ripple Field 2 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 22 - ], - [ - 2, - 22 - ], - [ - 14, - 23 - ], - [ - 16, - 16 - ], - [ - 21, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Ripple Field 2 - Enemy 6 (Glunk)", - "Ripple Field 2 - Maxim Tomato (Currents)", - "Ripple Field 2 - 1-Up (Currents)" - ], - "music": 10 - }, - { - "name": "Ripple Field 2 - 4", - "level": 2, - "stage": 2, - "room": 4, - "pointer": 2972744, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 3, - "unkn2": 9, - "x": 520, - "y": 88, - "name": "Ripple Field 2 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 8, - 19 - ] - ], - "locations": [], - "music": 10 - }, - { - "name": "Ripple Field 2 - 5", - "level": 2, - "stage": 2, - "room": 5, - "pointer": 3109710, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 16, - "unkn2": 16, - "x": 1048, - "y": 280, - "name": "Ripple Field 2 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 2 - Animal 3", - "Ripple Field 2 - Animal 4" - ], - "music": 38 - }, - { - "name": "Ripple Field 2 - 6", - "level": 2, - "stage": 2, - "room": 6, - "pointer": 2973127, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 2 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 8, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Ripple Field 2 - Bakasa" - ], - "music": 8 - }, - { - "name": "Ripple Field 2 - 7", - "level": 2, - "stage": 2, - "room": 7, - "pointer": 2890353, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 2 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field 3 - 0", - "level": 2, - "stage": 3, - "room": 0, - "pointer": 3517254, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Raft Waddle Dee", - "Kapar", - "Blipper" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 105, - "unkn2": 8, - "x": 40, - "y": 104, - "name": "Ripple Field 3 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 21, - 16 - ], - [ - 57, - 16 - ], - [ - 62, - 16 - ], - [ - 67, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", - "Ripple Field 3 - Enemy 2 (Kapar)", - "Ripple Field 3 - Enemy 3 (Blipper)" - ], - "music": 18 - }, - { - "name": "Ripple Field 3 - 1", - "level": 2, - "stage": 3, - "room": 1, - "pointer": 3604480, - "animal_pointers": [], - "consumables": [ - { - "idx": 10, - "pointer": 320, - "x": 832, - "y": 152, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 3 - Maxim Tomato (Cove)" - }, - { - "idx": 13, - "pointer": 424, - "x": 1128, - "y": 384, - "etype": 22, - "vtype": 0, - "name": "Ripple Field 3 - 1-Up (Cutter/Spark)" - } - ], - "consumables_pointer": 160, - "enemies": [ - "Sparky", - "Glunk", - "Joe" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 80, - "unkn2": 24, - "x": 104, - "y": 328, - "name": "Ripple Field 3 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 13, - 23 - ], - [ - 14, - 23 - ], - [ - 91, - 16 - ], - [ - 16, - 16 - ], - [ - 2, - 22 - ], - [ - 8, - 16 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Ripple Field 3 - Enemy 4 (Sparky)", - "Ripple Field 3 - Enemy 5 (Glunk)", - "Ripple Field 3 - Enemy 6 (Joe)", - "Ripple Field 3 - Maxim Tomato (Cove)", - "Ripple Field 3 - 1-Up (Cutter/Spark)" - ], - "music": 18 - }, - { - "name": "Ripple Field 3 - 2", - "level": 2, - "stage": 3, - "room": 2, - "pointer": 3715428, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bobo" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 118, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Ripple Field 3 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 91, - 16 - ], - [ - 16, - 16 - ], - [ - 21, - 16 - ], - [ - 4, - 22 - ], - [ - 46, - 16 - ], - [ - 47, - 16 - ], - [ - 5, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 3 - Enemy 7 (Bobo)" - ], - "music": 18 - }, - { - "name": "Ripple Field 3 - 3", - "level": 2, - "stage": 3, - "room": 3, - "pointer": 3071919, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 15, - "unkn2": 6, - "x": 56, - "y": 104, - "name": "Ripple Field 3 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 3 - Animal 1", - "Ripple Field 3 - Animal 2" - ], - "music": 39 - }, - { - "name": "Ripple Field 3 - 4", - "level": 2, - "stage": 3, - "room": 4, - "pointer": 2970810, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 3 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 9, - 19 - ] - ], - "locations": [ - "Ripple Field 3 - Elieel" - ], - "music": 8 - }, - { - "name": "Ripple Field 3 - 5", - "level": 2, - "stage": 3, - "room": 5, - "pointer": 2987502, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 15, - "unkn2": 9, - "x": 232, - "y": 88, - "name": "Ripple Field 3 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 9, - 19 - ] - ], - "locations": [], - "music": 31 - }, - { - "name": "Ripple Field 3 - 6", - "level": 2, - "stage": 3, - "room": 6, - "pointer": 2888666, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 3 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field 3 - 7", - "level": 2, - "stage": 3, - "room": 7, - "pointer": 3161120, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 3, - "unkn2": 5, - "x": 40, - "y": 152, - "name": "Ripple Field 3 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 11, - "unkn2": 20, - "x": 56, - "y": 216, - "name": "Ripple Field 3 - 7 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 57, - 16 - ] - ], - "locations": [], - "music": 18 - }, - { - "name": "Ripple Field 4 - 0", - "level": 2, - "stage": 4, - "room": 0, - "pointer": 3082540, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Stone)", - "Bukiset (Needle)", - "Bukiset (Clean)", - "Bukiset (Parasol)", - "Mony" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 4, - "unkn2": 16, - "x": 72, - "y": 232, - "name": "Ripple Field 4 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 79, - 16 - ], - [ - 80, - 16 - ], - [ - 81, - 16 - ], - [ - 4, - 22 - ], - [ - 20, - 16 - ], - [ - 77, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 1 (Bukiset (Stone))", - "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", - "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", - "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", - "Ripple Field 4 - Enemy 5 (Mony)" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 1", - "level": 2, - "stage": 4, - "room": 1, - "pointer": 2964846, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 14, - "unkn2": 8, - "x": 72, - "y": 88, - "name": "Ripple Field 4 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 27 - ] - ], - "locations": [ - "Ripple Field 4 - Miniboss 1 (Captain Stitch)" - ], - "music": 4 - }, - { - "name": "Ripple Field 4 - 2", - "level": 2, - "stage": 4, - "room": 2, - "pointer": 3018503, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Burning)" - ], - "default_exits": [ - { - "room": 11, - "unkn1": 25, - "unkn2": 5, - "x": 56, - "y": 88, - "name": "Ripple Field 4 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 25, - "unkn2": 15, - "x": 56, - "y": 216, - "name": "Ripple Field 4 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 19 - ], - [ - 76, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 6 (Bukiset (Burning))" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 3", - "level": 2, - "stage": 4, - "room": 3, - "pointer": 2988166, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 4 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Ripple Field 4 - Toad & Little Toad" - ], - "music": 8 - }, - { - "name": "Ripple Field 4 - 4", - "level": 2, - "stage": 4, - "room": 4, - "pointer": 2885533, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 4 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field 4 - 5", - "level": 2, - "stage": 4, - "room": 5, - "pointer": 3042349, - "animal_pointers": [ - 222, - 230, - 238 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 5, - "unkn2": 5, - "x": 360, - "y": 120, - "name": "Ripple Field 4 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 15, - "unkn2": 5, - "x": 488, - "y": 120, - "name": "Ripple Field 4 - 5 Exit 1", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 16, - "unkn2": 5, - "x": 104, - "y": 88, - "name": "Ripple Field 4 - 5 Exit 2", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 10, - "unkn2": 11, - "x": 440, - "y": 216, - "name": "Ripple Field 4 - 5 Exit 3", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 4 - Animal 1", - "Ripple Field 4 - Animal 2", - "Ripple Field 4 - Animal 3" - ], - "music": 40 - }, - { - "name": "Ripple Field 4 - 6", - "level": 2, - "stage": 4, - "room": 6, - "pointer": 3234805, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bobin", - "Blipper" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 21, - "unkn2": 7, - "x": 104, - "y": 88, - "name": "Ripple Field 4 - 6 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 31, - "unkn2": 7, - "x": 232, - "y": 88, - "name": "Ripple Field 4 - 6 Exit 1", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 26, - "unkn2": 13, - "x": 184, - "y": 184, - "name": "Ripple Field 4 - 6 Exit 2", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 48, - "unkn2": 15, - "x": 88, - "y": 216, - "name": "Ripple Field 4 - 6 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 73, - 16 - ], - [ - 14, - 23 - ], - [ - 21, - 16 - ], - [ - 13, - 23 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 7 (Bobin)", - "Ripple Field 4 - Enemy 8 (Blipper)" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 7", - "level": 2, - "stage": 4, - "room": 7, - "pointer": 3155468, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 11, - "unkn2": 6, - "x": 104, - "y": 136, - "name": "Ripple Field 4 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 18, - "unkn2": 9, - "x": 72, - "y": 248, - "name": "Ripple Field 4 - 7 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 1, - 16 - ], - [ - 0, - 23 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 4 - 8", - "level": 2, - "stage": 4, - "room": 8, - "pointer": 3350031, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Como", - "Oro" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 24, - "unkn2": 22, - "x": 184, - "y": 440, - "name": "Ripple Field 4 - 8 Exit 0", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 34, - "unkn2": 22, - "x": 296, - "y": 440, - "name": "Ripple Field 4 - 8 Exit 1", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 16, - "unkn2": 72, - "x": 168, - "y": 152, - "name": "Ripple Field 4 - 8 Exit 2", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 23, - "unkn2": 72, - "x": 120, - "y": 152, - "name": "Ripple Field 4 - 8 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 41, - 16 - ], - [ - 68, - 16 - ], - [ - 14, - 23 - ], - [ - 25, - 16 - ], - [ - 6, - 23 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 9 (Como)", - "Ripple Field 4 - Enemy 10 (Oro)" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 9", - "level": 2, - "stage": 4, - "room": 9, - "pointer": 3050397, - "animal_pointers": [], - "consumables": [ - { - "idx": 29, - "pointer": 200, - "x": 88, - "y": 200, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 4 - Maxim Tomato (Stone)" - } - ], - "consumables_pointer": 176, - "enemies": [ - "Gansan" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 11, - "unkn2": 9, - "x": 264, - "y": 1144, - "name": "Ripple Field 4 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 75, - 16 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 11 (Gansan)", - "Ripple Field 4 - Maxim Tomato (Stone)" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 10", - "level": 2, - "stage": 4, - "room": 10, - "pointer": 3052069, - "animal_pointers": [], - "consumables": [ - { - "idx": 30, - "pointer": 192, - "x": 200, - "y": 200, - "etype": 22, - "vtype": 0, - "name": "Ripple Field 4 - 1-Up (Stone)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 6, - "unkn2": 9, - "x": 376, - "y": 1144, - "name": "Ripple Field 4 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 22 - ], - [ - 75, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - 1-Up (Stone)" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 11", - "level": 2, - "stage": 4, - "room": 11, - "pointer": 3386974, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Kapar", - "Squishy" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 146, - "unkn2": 13, - "x": 72, - "y": 152, - "name": "Ripple Field 4 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 22, - 16 - ], - [ - 67, - 16 - ], - [ - 14, - 23 - ], - [ - 62, - 16 - ], - [ - 0, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 12 (Waddle Dee)", - "Ripple Field 4 - Enemy 13 (Kapar)", - "Ripple Field 4 - Enemy 14 (Squishy)" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 12", - "level": 2, - "stage": 4, - "room": 12, - "pointer": 3168339, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nidoo" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 67, - "unkn2": 7, - "x": 88, - "y": 1224, - "name": "Ripple Field 4 - 12 Exit 0", - "access_rule": [] - }, - { - "room": 13, - "unkn1": 75, - "unkn2": 7, - "x": 88, - "y": 136, - "name": "Ripple Field 4 - 12 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 59, - 16 - ], - [ - 13, - 23 - ], - [ - 28, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 15 (Nidoo)" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 13", - "level": 2, - "stage": 4, - "room": 13, - "pointer": 2958478, - "animal_pointers": [], - "consumables": [ - { - "idx": 54, - "pointer": 264, - "x": 216, - "y": 136, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 4 - Maxim Tomato (Dark)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 12, - "unkn1": 4, - "unkn2": 8, - "x": 1192, - "y": 120, - "name": "Ripple Field 4 - 13 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 2, - 22 - ], - [ - 59, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - Maxim Tomato (Dark)" - ], - "music": 15 - }, - { - "name": "Ripple Field 5 - 0", - "level": 2, - "stage": 5, - "room": 0, - "pointer": 3240369, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 9, - "unkn2": 43, - "x": 88, - "y": 344, - "name": "Ripple Field 5 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Ripple Field 5 - 1", - "level": 2, - "stage": 5, - "room": 1, - "pointer": 3547528, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 15, - "unkn2": 4, - "x": 184, - "y": 344, - "name": "Ripple Field 5 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Ripple Field 5 - 2", - "level": 2, - "stage": 5, - "room": 2, - "pointer": 3611327, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Glunk", - "Joe" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 95, - "unkn2": 21, - "x": 56, - "y": 184, - "name": "Ripple Field 5 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 91, - 16 - ], - [ - 16, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 5 - Enemy 1 (Glunk)", - "Ripple Field 5 - Enemy 2 (Joe)" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 3", - "level": 2, - "stage": 5, - "room": 3, - "pointer": 3926157, - "animal_pointers": [], - "consumables": [ - { - "idx": 32, - "pointer": 1258, - "x": 1488, - "y": 192, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 5 - Maxim Tomato (Currents)" - }, - { - "idx": 31, - "pointer": 1290, - "x": 1520, - "y": 192, - "etype": 22, - "vtype": 0, - "name": "Ripple Field 5 - 1-Up (Currents)" - } - ], - "consumables_pointer": 128, - "enemies": [ - "Bobin", - "Mony", - "Squishy" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 4, - "unkn2": 38, - "x": 152, - "y": 152, - "name": "Ripple Field 5 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 95, - "unkn2": 38, - "x": 248, - "y": 1064, - "name": "Ripple Field 5 - 3 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 22 - ], - [ - 2, - 22 - ], - [ - 6, - 22 - ], - [ - 14, - 23 - ], - [ - 1, - 16 - ], - [ - 73, - 16 - ], - [ - 22, - 16 - ], - [ - 20, - 16 - ] - ], - "locations": [ - "Ripple Field 5 - Enemy 3 (Bobin)", - "Ripple Field 5 - Enemy 4 (Mony)", - "Ripple Field 5 - Enemy 5 (Squishy)", - "Ripple Field 5 - Maxim Tomato (Currents)", - "Ripple Field 5 - 1-Up (Currents)" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 4", - "level": 2, - "stage": 5, - "room": 4, - "pointer": 3026639, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 14, - "unkn2": 4, - "x": 232, - "y": 152, - "name": "Ripple Field 5 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 5 - Animal 1" - ], - "music": 40 - }, - { - "name": "Ripple Field 5 - 5", - "level": 2, - "stage": 5, - "room": 5, - "pointer": 3207333, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 4, - "unkn2": 9, - "x": 56, - "y": 72, - "name": "Ripple Field 5 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 24, - "unkn2": 9, - "x": 120, - "y": 552, - "name": "Ripple Field 5 - 5 Exit 1", - "access_rule": [ - "Kine" - ] - } - ], - "entity_load": [ - [ - 14, - 23 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Ripple Field 5 - 6", - "level": 2, - "stage": 5, - "room": 6, - "pointer": 3485896, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Yaban", - "Broom Hatter", - "Bouncy" - ], - "default_exits": [ - { - "room": 9, - "unkn1": 121, - "unkn2": 11, - "x": 56, - "y": 152, - "name": "Ripple Field 5 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 22 - ], - [ - 22, - 16 - ], - [ - 14, - 23 - ], - [ - 13, - 16 - ], - [ - 11, - 16 - ], - [ - 32, - 16 - ] - ], - "locations": [ - "Ripple Field 5 - Enemy 6 (Yaban)", - "Ripple Field 5 - Enemy 7 (Broom Hatter)", - "Ripple Field 5 - Enemy 8 (Bouncy)" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 7", - "level": 2, - "stage": 5, - "room": 7, - "pointer": 3752698, - "animal_pointers": [], - "consumables": [ - { - "idx": 53, - "pointer": 418, - "x": 1512, - "y": 608, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 5 - Maxim Tomato (Exit)" - } - ], - "consumables_pointer": 352, - "enemies": [ - "Sparky", - "Rocky", - "Babut" - ], - "default_exits": [ - { - "room": 10, - "unkn1": 45, - "unkn2": 31, - "x": 152, - "y": 152, - "name": "Ripple Field 5 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 94, - "unkn2": 40, - "x": 88, - "y": 200, - "name": "Ripple Field 5 - 7 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 16 - ], - [ - 43, - 16 - ], - [ - 8, - 16 - ], - [ - 22, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Ripple Field 5 - Enemy 9 (Sparky)", - "Ripple Field 5 - Enemy 10 (Rocky)", - "Ripple Field 5 - Enemy 11 (Babut)", - "Ripple Field 5 - Maxim Tomato (Exit)" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 8", - "level": 2, - "stage": 5, - "room": 8, - "pointer": 3044682, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 8, - "unkn2": 9, - "x": 88, - "y": 616, - "name": "Ripple Field 5 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 5 - Animal 2" - ], - "music": 39 - }, - { - "name": "Ripple Field 5 - 9", - "level": 2, - "stage": 5, - "room": 9, - "pointer": 2963193, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 5 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 11, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Ripple Field 5 - Mama Pitch" - ], - "music": 8 - }, - { - "name": "Ripple Field 5 - 10", - "level": 2, - "stage": 5, - "room": 10, - "pointer": 3042934, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 8, - "unkn2": 9, - "x": 712, - "y": 504, - "name": "Ripple Field 5 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 5 - Enemy 12 (Galbo)" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 11", - "level": 2, - "stage": 5, - "room": 11, - "pointer": 2886256, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 5 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field 6 - 0", - "level": 2, - "stage": 6, - "room": 0, - "pointer": 2949576, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kany" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 56, - "unkn2": 7, - "x": 40, - "y": 152, - "name": "Ripple Field 6 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 16 - ], - [ - 13, - 23 - ] - ], - "locations": [ - "Ripple Field 6 - Enemy 1 (Kany)" - ], - "music": 15 - }, - { - "name": "Ripple Field 6 - 1", - "level": 2, - "stage": 6, - "room": 1, - "pointer": 2971200, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 23, - "unkn2": 9, - "x": 56, - "y": 264, - "name": "Ripple Field 6 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 6 - Animal 1", - "Ripple Field 6 - Animal 2", - "Ripple Field 6 - Animal 3" - ], - "music": 38 - }, - { - "name": "Ripple Field 6 - 2", - "level": 2, - "stage": 6, - "room": 2, - "pointer": 3637749, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 95, - "unkn2": 9, - "x": 104, - "y": 872, - "name": "Ripple Field 6 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 50, - "unkn2": 22, - "x": 184, - "y": 88, - "name": "Ripple Field 6 - 2 Exit 1", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 45, - "unkn2": 26, - "x": 88, - "y": 88, - "name": "Ripple Field 6 - 2 Exit 2", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 55, - "unkn2": 26, - "x": 248, - "y": 88, - "name": "Ripple Field 6 - 2 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 52, - 16 - ], - [ - 13, - 23 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 6 - 3", - "level": 2, - "stage": 6, - "room": 3, - "pointer": 3092564, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 4, - "unkn2": 5, - "x": 744, - "y": 424, - "name": "Ripple Field 6 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 16, - "unkn2": 5, - "x": 872, - "y": 424, - "name": "Ripple Field 6 - 3 Exit 1", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 6 - 4", - "level": 2, - "stage": 6, - "room": 4, - "pointer": 3133247, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 10, - "unkn2": 5, - "x": 824, - "y": 360, - "name": "Ripple Field 6 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 12, - 19 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 6 - 5", - "level": 2, - "stage": 6, - "room": 5, - "pointer": 3507762, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 76, - "unkn2": 4, - "x": 680, - "y": 72, - "name": "Ripple Field 6 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 49, - "unkn2": 6, - "x": 440, - "y": 104, - "name": "Ripple Field 6 - 5 Exit 1", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 49, - "unkn2": 10, - "x": 440, - "y": 168, - "name": "Ripple Field 6 - 5 Exit 2", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 88, - "unkn2": 10, - "x": 104, - "y": 152, - "name": "Ripple Field 6 - 5 Exit 3", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 22, - "unkn2": 12, - "x": 200, - "y": 200, - "name": "Ripple Field 6 - 5 Exit 4", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 76, - "unkn2": 12, - "x": 680, - "y": 200, - "name": "Ripple Field 6 - 5 Exit 5", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 76, - "unkn2": 16, - "x": 680, - "y": 264, - "name": "Ripple Field 6 - 5 Exit 6", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 6 - 6", - "level": 2, - "stage": 6, - "room": 6, - "pointer": 3211264, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 4, - "unkn2": 10, - "x": 72, - "y": 168, - "name": "Ripple Field 6 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 23 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 6 - 7", - "level": 2, - "stage": 6, - "room": 7, - "pointer": 3586039, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "KeKe", - "Kapar", - "Rocky", - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 5, - "unkn1": 134, - "unkn2": 16, - "x": 72, - "y": 168, - "name": "Ripple Field 6 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 3, - 16 - ], - [ - 67, - 16 - ], - [ - 51, - 16 - ], - [ - 7, - 16 - ] - ], - "locations": [ - "Ripple Field 6 - Enemy 2 (KeKe)", - "Ripple Field 6 - Enemy 3 (Kapar)", - "Ripple Field 6 - Enemy 4 (Rocky)", - "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)" - ], - "music": 15 - }, - { - "name": "Ripple Field 6 - 8", - "level": 2, - "stage": 6, - "room": 8, - "pointer": 3621483, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Coconut", - "Sasuke", - "Nruff" - ], - "default_exits": [ - { - "room": 10, - "unkn1": 70, - "unkn2": 11, - "x": 56, - "y": 152, - "name": "Ripple Field 6 - 8 Exit 0", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 26, - "unkn2": 54, - "x": 72, - "y": 152, - "name": "Ripple Field 6 - 8 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 89, - 16 - ], - [ - 15, - 16 - ], - [ - 30, - 16 - ], - [ - 34, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 6 - Enemy 6 (Propeller)", - "Ripple Field 6 - Enemy 7 (Coconut)", - "Ripple Field 6 - Enemy 8 (Sasuke)", - "Ripple Field 6 - Enemy 9 (Nruff)" - ], - "music": 15 - }, - { - "name": "Ripple Field 6 - 9", - "level": 2, - "stage": 6, - "room": 9, - "pointer": 2954523, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 3, - "unkn2": 9, - "x": 408, - "y": 872, - "name": "Ripple Field 6 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 6 - Animal 4" - ], - "music": 39 - }, - { - "name": "Ripple Field 6 - 10", - "level": 2, - "stage": 6, - "room": 10, - "pointer": 3069438, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 15, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 6 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 12, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Ripple Field 6 - HB-002" - ], - "music": 8 - }, - { - "name": "Ripple Field 6 - 11", - "level": 2, - "stage": 6, - "room": 11, - "pointer": 2886497, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 6 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field Boss - 0", - "level": 2, - "stage": 7, - "room": 0, - "pointer": 3157370, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 7, - 18 - ] - ], - "locations": [ - "Ripple Field - Boss (Acro) Purified", - "Level 2 Boss" - ], - "music": 2 - }, - { - "name": "Sand Canyon 1 - 0", - "level": 3, - "stage": 1, - "room": 0, - "pointer": 3524267, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "Galbo" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 196, - "unkn2": 7, - "x": 72, - "y": 152, - "name": "Sand Canyon 1 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 19 - ], - [ - 1, - 16 - ], - [ - 26, - 16 - ], - [ - 2, - 16 - ] - ], - "locations": [ - "Sand Canyon 1 - Enemy 1 (Bronto Burt)", - "Sand Canyon 1 - Enemy 2 (Galbo)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 1", - "level": 3, - "stage": 1, - "room": 1, - "pointer": 3163860, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 34, - "unkn2": 5, - "x": 104, - "y": 408, - "name": "Sand Canyon 1 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 1 - Animal 1", - "Sand Canyon 1 - Animal 2" - ], - "music": 38 - }, - { - "name": "Sand Canyon 1 - 2", - "level": 3, - "stage": 1, - "room": 2, - "pointer": 3512532, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Oro" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 73, - "unkn2": 6, - "x": 56, - "y": 120, - "name": "Sand Canyon 1 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 16 - ], - [ - 26, - 16 - ], - [ - 25, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ], - [ - 1, - 23 - ], - [ - 0, - 23 - ], - [ - 4, - 23 - ] - ], - "locations": [ - "Sand Canyon 1 - Enemy 3 (Oro)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 3", - "level": 3, - "stage": 1, - "room": 3, - "pointer": 3719146, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky", - "Propeller", - "Gansan", - "Babut" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 25, - "unkn2": 73, - "x": 72, - "y": 280, - "name": "Sand Canyon 1 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 89, - 16 - ], - [ - 75, - 16 - ], - [ - 43, - 16 - ], - [ - 8, - 16 - ] - ], - "locations": [ - "Sand Canyon 1 - Enemy 4 (Sparky)", - "Sand Canyon 1 - Enemy 5 (Propeller)", - "Sand Canyon 1 - Enemy 6 (Gansan)", - "Sand Canyon 1 - Enemy 7 (Babut)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 4", - "level": 3, - "stage": 1, - "room": 4, - "pointer": 3421212, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Loud", - "Dogon", - "Bouncy", - "Pteran" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 196, - "unkn2": 8, - "x": 56, - "y": 152, - "name": "Sand Canyon 1 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 90, - 16 - ], - [ - 13, - 16 - ], - [ - 40, - 16 - ], - [ - 14, - 23 - ], - [ - 39, - 16 - ] - ], - "locations": [ - "Sand Canyon 1 - Enemy 8 (Loud)", - "Sand Canyon 1 - Enemy 9 (Dogon)", - "Sand Canyon 1 - Enemy 10 (Bouncy)", - "Sand Canyon 1 - Enemy 11 (Pteran)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 5", - "level": 3, - "stage": 1, - "room": 5, - "pointer": 3203325, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Polof" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 32, - "unkn2": 9, - "x": 104, - "y": 152, - "name": "Sand Canyon 1 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 46, - "unkn2": 9, - "x": 56, - "y": 344, - "name": "Sand Canyon 1 - 5 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 9, - 16 - ] - ], - "locations": [ - "Sand Canyon 1 - Enemy 12 (Polof)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 6", - "level": 3, - "stage": 1, - "room": 6, - "pointer": 3138524, - "animal_pointers": [], - "consumables": [ - { - "idx": 23, - "pointer": 248, - "x": 168, - "y": 104, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 1 - 1-Up (Polof)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 5, - "unkn2": 9, - "x": 536, - "y": 152, - "name": "Sand Canyon 1 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Sand Canyon 1 - 1-Up (Polof)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 7", - "level": 3, - "stage": 1, - "room": 7, - "pointer": 2988822, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 15, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 1 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Sand Canyon 1 - Geromuzudake" - ], - "music": 8 - }, - { - "name": "Sand Canyon 1 - 8", - "level": 3, - "stage": 1, - "room": 8, - "pointer": 2885292, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 1 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon 2 - 0", - "level": 3, - "stage": 2, - "room": 0, - "pointer": 3668370, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "KeKe", - "Doka", - "Boten" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 178, - "unkn2": 8, - "x": 184, - "y": 104, - "name": "Sand Canyon 2 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 244, - "unkn2": 11, - "x": 56, - "y": 152, - "name": "Sand Canyon 2 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 35, - 16 - ], - [ - 33, - 16 - ], - [ - 14, - 23 - ], - [ - 51, - 16 - ], - [ - 47, - 16 - ], - [ - 46, - 16 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 1 (KeKe)", - "Sand Canyon 2 - Enemy 2 (Doka)", - "Sand Canyon 2 - Enemy 3 (Boten)" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 1", - "level": 3, - "stage": 2, - "room": 1, - "pointer": 2952738, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 10, - "unkn2": 6, - "x": 2872, - "y": 136, - "name": "Sand Canyon 2 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 2 - Animal 1", - "Sand Canyon 2 - Animal 2" - ], - "music": 40 - }, - { - "name": "Sand Canyon 2 - 2", - "level": 3, - "stage": 2, - "room": 2, - "pointer": 3531156, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller" - ], - "default_exits": [ - { - "room": 9, - "unkn1": 45, - "unkn2": 60, - "x": 88, - "y": 184, - "name": "Sand Canyon 2 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 23 - ], - [ - 89, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 4 (Propeller)" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 3", - "level": 3, - "stage": 2, - "room": 3, - "pointer": 3263731, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Sparky", - "Sasuke", - "Como" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 63, - "unkn2": 5, - "x": 88, - "y": 184, - "name": "Sand Canyon 2 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 68, - "unkn2": 5, - "x": 184, - "y": 184, - "name": "Sand Canyon 2 - 3 Exit 1", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 73, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Sand Canyon 2 - 3 Exit 2", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 130, - "unkn2": 9, - "x": 72, - "y": 312, - "name": "Sand Canyon 2 - 3 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 41, - 16 - ], - [ - 8, - 16 - ], - [ - 30, - 16 - ], - [ - 0, - 16 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 5 (Waddle Dee)", - "Sand Canyon 2 - Enemy 6 (Sparky)", - "Sand Canyon 2 - Enemy 7 (Sasuke)", - "Sand Canyon 2 - Enemy 8 (Como)" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 4", - "level": 3, - "stage": 2, - "room": 4, - "pointer": 3076300, - "animal_pointers": [], - "consumables": [ - { - "idx": 19, - "pointer": 228, - "x": 168, - "y": 72, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 2 - 1-Up (Enclave)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 5, - "unkn2": 11, - "x": 1016, - "y": 88, - "name": "Sand Canyon 2 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 10, - "unkn2": 11, - "x": 1112, - "y": 88, - "name": "Sand Canyon 2 - 4 Exit 1", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 15, - "unkn2": 11, - "x": 1176, - "y": 88, - "name": "Sand Canyon 2 - 4 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 0, - 22 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Sand Canyon 2 - 1-Up (Enclave)" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 5", - "level": 3, - "stage": 2, - "room": 5, - "pointer": 3302133, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Ice)", - "Bukiset (Needle)", - "Bukiset (Clean)", - "Bukiset (Parasol)", - "Bukiset (Spark)", - "Bukiset (Cutter)" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 63, - "unkn2": 15, - "x": 120, - "y": 216, - "name": "Sand Canyon 2 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 8, - "unkn1": 71, - "unkn2": 18, - "x": 152, - "y": 136, - "name": "Sand Canyon 2 - 5 Exit 1", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 130, - "unkn2": 19, - "x": 72, - "y": 952, - "name": "Sand Canyon 2 - 5 Exit 2", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 56, - "unkn2": 23, - "x": 88, - "y": 216, - "name": "Sand Canyon 2 - 5 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 80, - 16 - ], - [ - 78, - 16 - ], - [ - 81, - 16 - ], - [ - 83, - 16 - ], - [ - 79, - 16 - ], - [ - 82, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", - "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", - "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", - "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", - "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", - "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 6", - "level": 3, - "stage": 2, - "room": 6, - "pointer": 3800612, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nidoo" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 17, - "unkn2": 13, - "x": 1144, - "y": 248, - "name": "Sand Canyon 2 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 15 (Nidoo)" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 7", - "level": 3, - "stage": 2, - "room": 7, - "pointer": 3073888, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 15, - "unkn2": 8, - "x": 1016, - "y": 296, - "name": "Sand Canyon 2 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 5, - "unkn2": 13, - "x": 904, - "y": 376, - "name": "Sand Canyon 2 - 7 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 19 - ] - ], - "locations": [], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 8", - "level": 3, - "stage": 2, - "room": 8, - "pointer": 3061270, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Mariel" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 19, - "unkn2": 13, - "x": 1256, - "y": 376, - "name": "Sand Canyon 2 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 45, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 16 (Mariel)" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 9", - "level": 3, - "stage": 2, - "room": 9, - "pointer": 3453286, - "animal_pointers": [], - "consumables": [ - { - "idx": 51, - "pointer": 240, - "x": 1408, - "y": 216, - "etype": 22, - "vtype": 2, - "name": "Sand Canyon 2 - Maxim Tomato (Underwater)" - } - ], - "consumables_pointer": 128, - "enemies": [ - "Yaban", - "Wapod", - "Squishy", - "Pteran" - ], - "default_exits": [ - { - "room": 10, - "unkn1": 246, - "unkn2": 10, - "x": 56, - "y": 152, - "name": "Sand Canyon 2 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 22, - 16 - ], - [ - 2, - 22 - ], - [ - 39, - 16 - ], - [ - 88, - 16 - ], - [ - 32, - 16 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 17 (Yaban)", - "Sand Canyon 2 - Enemy 18 (Wapod)", - "Sand Canyon 2 - Enemy 19 (Squishy)", - "Sand Canyon 2 - Enemy 20 (Pteran)", - "Sand Canyon 2 - Maxim Tomato (Underwater)" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 10", - "level": 3, - "stage": 2, - "room": 10, - "pointer": 2994821, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 2 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Sand Canyon 2 - Auntie" - ], - "music": 8 - }, - { - "name": "Sand Canyon 2 - 11", - "level": 3, - "stage": 2, - "room": 11, - "pointer": 2891799, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 2 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon 3 - 0", - "level": 3, - "stage": 3, - "room": 0, - "pointer": 3544676, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble", - "Broom Hatter", - "Rocky", - "Gabon" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 6, - "unkn2": 57, - "x": 104, - "y": 152, - "name": "Sand Canyon 3 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 11, - "unkn2": 57, - "x": 200, - "y": 152, - "name": "Sand Canyon 3 - 0 Exit 1", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 16, - "unkn2": 57, - "x": 296, - "y": 152, - "name": "Sand Canyon 3 - 0 Exit 2", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 23, - "unkn2": 109, - "x": 104, - "y": 72, - "name": "Sand Canyon 3 - 0 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 24, - 16 - ], - [ - 3, - 16 - ], - [ - 11, - 16 - ], - [ - 27, - 16 - ] - ], - "locations": [ - "Sand Canyon 3 - Enemy 1 (Sir Kibble)", - "Sand Canyon 3 - Enemy 2 (Broom Hatter)", - "Sand Canyon 3 - Enemy 3 (Rocky)", - "Sand Canyon 3 - Enemy 4 (Gabon)" - ], - "music": 16 - }, - { - "name": "Sand Canyon 3 - 1", - "level": 3, - "stage": 3, - "room": 1, - "pointer": 2965655, - "animal_pointers": [ - 212, - 220, - 228 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 5, - "unkn2": 9, - "x": 88, - "y": 920, - "name": "Sand Canyon 3 - 1 Exit 0", - "access_rule": [] - }, - { - "room": 0, - "unkn1": 11, - "unkn2": 9, - "x": 168, - "y": 920, - "name": "Sand Canyon 3 - 1 Exit 1", - "access_rule": [] - }, - { - "room": 0, - "unkn1": 17, - "unkn2": 9, - "x": 248, - "y": 920, - "name": "Sand Canyon 3 - 1 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 3 - Animal 1", - "Sand Canyon 3 - Animal 2", - "Sand Canyon 3 - Animal 3" - ], - "music": 39 - }, - { - "name": "Sand Canyon 3 - 2", - "level": 3, - "stage": 3, - "room": 2, - "pointer": 3726270, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kany" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 184, - "unkn2": 20, - "x": 104, - "y": 232, - "name": "Sand Canyon 3 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 63, - 16 - ], - [ - 55, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 23 - ], - [ - 29, - 16 - ] - ], - "locations": [ - "Sand Canyon 3 - Enemy 5 (Kany)" - ], - "music": 16 - }, - { - "name": "Sand Canyon 3 - 3", - "level": 3, - "stage": 3, - "room": 3, - "pointer": 3416806, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 130, - "unkn2": 14, - "x": 40, - "y": 152, - "name": "Sand Canyon 3 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 16 - ], - [ - 6, - 23 - ], - [ - 5, - 23 - ] - ], - "locations": [ - "Sand Canyon 3 - Enemy 6 (Galbo)" - ], - "music": 16 - }, - { - "name": "Sand Canyon 3 - 4", - "level": 3, - "stage": 3, - "room": 4, - "pointer": 3564419, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Sasuke" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 135, - "unkn2": 11, - "x": 56, - "y": 152, - "name": "Sand Canyon 3 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 68, - 16 - ], - [ - 30, - 16 - ], - [ - 14, - 23 - ], - [ - 89, - 16 - ], - [ - 24, - 16 - ] - ], - "locations": [ - "Sand Canyon 3 - Enemy 7 (Propeller)", - "Sand Canyon 3 - Enemy 8 (Sasuke)" - ], - "music": 16 - }, - { - "name": "Sand Canyon 3 - 5", - "level": 3, - "stage": 3, - "room": 5, - "pointer": 2973891, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 3 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 16, - 19 - ] - ], - "locations": [ - "Sand Canyon 3 - Caramello" - ], - "music": 8 - }, - { - "name": "Sand Canyon 3 - 6", - "level": 3, - "stage": 3, - "room": 6, - "pointer": 3247969, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Wapod", - "Bobo", - "Babut", - "Magoo" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 95, - "unkn2": 8, - "x": 88, - "y": 424, - "name": "Sand Canyon 3 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 53, - 16 - ], - [ - 88, - 16 - ], - [ - 46, - 16 - ], - [ - 47, - 16 - ], - [ - 5, - 16 - ], - [ - 43, - 16 - ] - ], - "locations": [ - "Sand Canyon 3 - Enemy 9 (Wapod)", - "Sand Canyon 3 - Enemy 10 (Bobo)", - "Sand Canyon 3 - Enemy 11 (Babut)", - "Sand Canyon 3 - Enemy 12 (Magoo)" - ], - "music": 16 - }, - { - "name": "Sand Canyon 3 - 7", - "level": 3, - "stage": 3, - "room": 7, - "pointer": 2887702, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 3 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon 3 - 8", - "level": 3, - "stage": 3, - "room": 8, - "pointer": 2968057, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 9, - "x": 104, - "y": 120, - "name": "Sand Canyon 3 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 16, - 19 - ] - ], - "locations": [], - "music": 31 - }, - { - "name": "Sand Canyon 4 - 0", - "level": 3, - "stage": 4, - "room": 0, - "pointer": 3521954, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Popon Ball", - "Mariel", - "Chilly" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 95, - "unkn2": 8, - "x": 216, - "y": 88, - "name": "Sand Canyon 4 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 199, - "unkn2": 15, - "x": 104, - "y": 88, - "name": "Sand Canyon 4 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ], - [ - 45, - 16 - ], - [ - 6, - 23 - ], - [ - 50, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 4 - Enemy 1 (Popon Ball)", - "Sand Canyon 4 - Enemy 2 (Mariel)", - "Sand Canyon 4 - Enemy 3 (Chilly)" - ], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 1", - "level": 3, - "stage": 4, - "room": 1, - "pointer": 2956289, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 12, - "unkn2": 5, - "x": 1544, - "y": 136, - "name": "Sand Canyon 4 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 4 - Animal 1", - "Sand Canyon 4 - Animal 2", - "Sand Canyon 4 - Animal 3" - ], - "music": 39 - }, - { - "name": "Sand Canyon 4 - 2", - "level": 3, - "stage": 4, - "room": 2, - "pointer": 3505360, - "animal_pointers": [], - "consumables": [ - { - "idx": 11, - "pointer": 328, - "x": 2024, - "y": 72, - "etype": 22, - "vtype": 2, - "name": "Sand Canyon 4 - Maxim Tomato (Pacto)" - } - ], - "consumables_pointer": 160, - "enemies": [ - "Tick", - "Bronto Burt", - "Babut" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 149, - "unkn2": 14, - "x": 88, - "y": 216, - "name": "Sand Canyon 4 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 62, - 16 - ], - [ - 2, - 22 - ], - [ - 43, - 16 - ], - [ - 2, - 16 - ], - [ - 48, - 16 - ] - ], - "locations": [ - "Sand Canyon 4 - Enemy 4 (Tick)", - "Sand Canyon 4 - Enemy 5 (Bronto Burt)", - "Sand Canyon 4 - Enemy 6 (Babut)", - "Sand Canyon 4 - Maxim Tomato (Pacto)" - ], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 3", - "level": 3, - "stage": 4, - "room": 3, - "pointer": 3412361, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bobin", - "Joe", - "Mony", - "Blipper" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 115, - "unkn2": 6, - "x": 776, - "y": 120, - "name": "Sand Canyon 4 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 29, - "unkn2": 8, - "x": 72, - "y": 88, - "name": "Sand Canyon 4 - 3 Exit 1", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 105, - "unkn2": 14, - "x": 104, - "y": 216, - "name": "Sand Canyon 4 - 3 Exit 2", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 115, - "unkn2": 20, - "x": 776, - "y": 248, - "name": "Sand Canyon 4 - 3 Exit 3", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 64, - "unkn2": 21, - "x": 408, - "y": 232, - "name": "Sand Canyon 4 - 3 Exit 4", - "access_rule": [] - } - ], - "entity_load": [ - [ - 73, - 16 - ], - [ - 20, - 16 - ], - [ - 91, - 16 - ], - [ - 14, - 23 - ], - [ - 21, - 16 - ] - ], - "locations": [ - "Sand Canyon 4 - Enemy 7 (Bobin)", - "Sand Canyon 4 - Enemy 8 (Joe)", - "Sand Canyon 4 - Enemy 9 (Mony)", - "Sand Canyon 4 - Enemy 10 (Blipper)" - ], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 4", - "level": 3, - "stage": 4, - "room": 4, - "pointer": 3307804, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 60, - "unkn2": 6, - "x": 88, - "y": 104, - "name": "Sand Canyon 4 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 60, - "unkn2": 16, - "x": 88, - "y": 360, - "name": "Sand Canyon 4 - 4 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 21, - 16 - ], - [ - 20, - 16 - ], - [ - 91, - 16 - ], - [ - 73, - 16 - ] - ], - "locations": [], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 5", - "level": 3, - "stage": 4, - "room": 5, - "pointer": 2955407, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 16, - "unkn2": 13, - "x": 88, - "y": 232, - "name": "Sand Canyon 4 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 27 - ] - ], - "locations": [ - "Sand Canyon 4 - Miniboss 1 (Haboki)" - ], - "music": 4 - }, - { - "name": "Sand Canyon 4 - 6", - "level": 3, - "stage": 4, - "room": 6, - "pointer": 3094851, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 24, - "unkn2": 6, - "x": 56, - "y": 56, - "name": "Sand Canyon 4 - 6 Exit 0", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 24, - "unkn2": 14, - "x": 56, - "y": 104, - "name": "Sand Canyon 4 - 6 Exit 1", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 24, - "unkn2": 22, - "x": 56, - "y": 152, - "name": "Sand Canyon 4 - 6 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 17, - 19 - ], - [ - 4, - 23 - ], - [ - 5, - 23 - ] - ], - "locations": [], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 7", - "level": 3, - "stage": 4, - "room": 7, - "pointer": 3483428, - "animal_pointers": [], - "consumables": [ - { - "idx": 25, - "pointer": 200, - "x": 344, - "y": 144, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 4 - 1-Up (Clean)" - }, - { - "idx": 26, - "pointer": 336, - "x": 1656, - "y": 144, - "etype": 22, - "vtype": 2, - "name": "Sand Canyon 4 - Maxim Tomato (Needle)" - } - ], - "consumables_pointer": 128, - "enemies": [ - "Togezo", - "Rocky", - "Bobo" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 266, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Sand Canyon 4 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 22 - ], - [ - 3, - 16 - ], - [ - 14, - 23 - ], - [ - 5, - 16 - ], - [ - 2, - 16 - ], - [ - 18, - 16 - ], - [ - 0, - 22 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Sand Canyon 4 - Enemy 11 (Togezo)", - "Sand Canyon 4 - Enemy 12 (Rocky)", - "Sand Canyon 4 - Enemy 13 (Bobo)", - "Sand Canyon 4 - 1-Up (Clean)", - "Sand Canyon 4 - Maxim Tomato (Needle)" - ], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 8", - "level": 3, - "stage": 4, - "room": 8, - "pointer": 3002086, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 4 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 17, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Sand Canyon 4 - Donbe & Hikari" - ], - "music": 8 - }, - { - "name": "Sand Canyon 4 - 9", - "level": 3, - "stage": 4, - "room": 9, - "pointer": 2885774, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 4 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon 5 - 0", - "level": 3, - "stage": 5, - "room": 0, - "pointer": 3662486, - "animal_pointers": [], - "consumables": [ - { - "idx": 0, - "pointer": 450, - "x": 2256, - "y": 232, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 5 - 1-Up (Falling Block)" - } - ], - "consumables_pointer": 208, - "enemies": [ - "Wapod", - "Dogon", - "Tick" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 151, - "unkn2": 15, - "x": 184, - "y": 56, - "name": "Sand Canyon 5 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 83, - "unkn2": 16, - "x": 72, - "y": 120, - "name": "Sand Canyon 5 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 55, - 16 - ], - [ - 48, - 16 - ], - [ - 0, - 22 - ], - [ - 14, - 23 - ], - [ - 90, - 16 - ], - [ - 88, - 16 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 1 (Wapod)", - "Sand Canyon 5 - Enemy 2 (Dogon)", - "Sand Canyon 5 - Enemy 3 (Tick)", - "Sand Canyon 5 - 1-Up (Falling Block)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 5 - 1", - "level": 3, - "stage": 5, - "room": 1, - "pointer": 3052622, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Rocky", - "Bobo", - "Chilly", - "Sparky", - "Togezo" - ], - "default_exits": [ - { - "room": 9, - "unkn1": 6, - "unkn2": 9, - "x": 216, - "y": 1128, - "name": "Sand Canyon 5 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 16 - ], - [ - 6, - 16 - ], - [ - 3, - 16 - ], - [ - 8, - 16 - ], - [ - 18, - 16 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 4 (Rocky)", - "Sand Canyon 5 - Enemy 5 (Bobo)", - "Sand Canyon 5 - Enemy 6 (Chilly)", - "Sand Canyon 5 - Enemy 7 (Sparky)", - "Sand Canyon 5 - Enemy 8 (Togezo)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 5 - 2", - "level": 3, - "stage": 5, - "room": 2, - "pointer": 3057544, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 3, - "unkn2": 7, - "x": 1320, - "y": 264, - "name": "Sand Canyon 5 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 5 - Animal 1" - ], - "music": 40 - }, - { - "name": "Sand Canyon 5 - 3", - "level": 3, - "stage": 5, - "room": 3, - "pointer": 3419011, - "animal_pointers": [], - "consumables": [ - { - "idx": 11, - "pointer": 192, - "x": 56, - "y": 648, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 5 - 1-Up (Ice 2)" - }, - { - "idx": 14, - "pointer": 200, - "x": 56, - "y": 664, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 5 - 1-Up (Ice 3)" - }, - { - "idx": 15, - "pointer": 208, - "x": 56, - "y": 632, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 5 - 1-Up (Ice 1)" - }, - { - "idx": 12, - "pointer": 368, - "x": 320, - "y": 264, - "etype": 22, - "vtype": 2, - "name": "Sand Canyon 5 - Maxim Tomato (Pit)" - } - ], - "consumables_pointer": 304, - "enemies": [ - "Bronto Burt", - "Sasuke" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 12, - "unkn2": 66, - "x": 88, - "y": 88, - "name": "Sand Canyon 5 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ], - [ - 30, - 16 - ], - [ - 2, - 16 - ], - [ - 0, - 22 - ], - [ - 2, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 9 (Bronto Burt)", - "Sand Canyon 5 - Enemy 10 (Sasuke)", - "Sand Canyon 5 - 1-Up (Ice 2)", - "Sand Canyon 5 - 1-Up (Ice 3)", - "Sand Canyon 5 - 1-Up (Ice 1)", - "Sand Canyon 5 - Maxim Tomato (Pit)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 5 - 4", - "level": 3, - "stage": 5, - "room": 4, - "pointer": 3644149, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Oro", - "Galbo", - "Nidoo" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 76, - "unkn2": 9, - "x": 88, - "y": 120, - "name": "Sand Canyon 5 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 116, - "unkn2": 14, - "x": 200, - "y": 1256, - "name": "Sand Canyon 5 - 4 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 54, - 16 - ], - [ - 26, - 16 - ], - [ - 28, - 16 - ], - [ - 25, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 11 (Oro)", - "Sand Canyon 5 - Enemy 12 (Galbo)", - "Sand Canyon 5 - Enemy 13 (Nidoo)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 5 - 5", - "level": 3, - "stage": 5, - "room": 5, - "pointer": 3044100, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 4, - "unkn2": 7, - "x": 1240, - "y": 152, - "name": "Sand Canyon 5 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 5 - Animal 2" - ], - "music": 39 - }, - { - "name": "Sand Canyon 5 - 6", - "level": 3, - "stage": 5, - "room": 6, - "pointer": 3373481, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 25, - "unkn2": 5, - "x": 56, - "y": 152, - "name": "Sand Canyon 5 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 31, - 16 - ], - [ - 89, - 16 - ], - [ - 6, - 16 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 14 (Propeller)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 5 - 7", - "level": 3, - "stage": 5, - "room": 7, - "pointer": 2964028, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 5 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 18, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Sand Canyon 5 - Nyupun" - ], - "music": 8 - }, - { - "name": "Sand Canyon 5 - 8", - "level": 3, - "stage": 5, - "room": 8, - "pointer": 2890112, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 5 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon 5 - 9", - "level": 3, - "stage": 5, - "room": 9, - "pointer": 3647264, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble", - "KeKe", - "Kabu" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 12, - "unkn2": 6, - "x": 72, - "y": 760, - "name": "Sand Canyon 5 - 9 Exit 0", - "access_rule": [ - "Cutter" - ] - }, - { - "room": 1, - "unkn1": 12, - "unkn2": 70, - "x": 120, - "y": 152, - "name": "Sand Canyon 5 - 9 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 27, - 16 - ], - [ - 61, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ], - [ - 51, - 16 - ], - [ - 19, - 16 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 15 (Sir Kibble)", - "Sand Canyon 5 - Enemy 16 (KeKe)", - "Sand Canyon 5 - Enemy 17 (Kabu)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 6 - 0", - "level": 3, - "stage": 6, - "room": 0, - "pointer": 3314761, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky", - "Doka", - "Cappy", - "Pteran" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 132, - "unkn2": 16, - "x": 56, - "y": 136, - "name": "Sand Canyon 6 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 8, - 16 - ], - [ - 35, - 16 - ], - [ - 39, - 16 - ], - [ - 12, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 1 (Sparky)", - "Sand Canyon 6 - Enemy 2 (Doka)", - "Sand Canyon 6 - Enemy 3 (Cappy)", - "Sand Canyon 6 - Enemy 4 (Pteran)" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 1", - "level": 3, - "stage": 6, - "room": 1, - "pointer": 2976913, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 22, - "unkn1": 24, - "unkn2": 13, - "x": 168, - "y": 216, - "name": "Sand Canyon 6 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 6 - Animal 1", - "Sand Canyon 6 - Animal 2", - "Sand Canyon 6 - Animal 3" - ], - "music": 39 - }, - { - "name": "Sand Canyon 6 - 2", - "level": 3, - "stage": 6, - "room": 2, - "pointer": 2978757, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 55, - "unkn2": 6, - "x": 104, - "y": 104, - "name": "Sand Canyon 6 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 3", - "level": 3, - "stage": 6, - "room": 3, - "pointer": 3178082, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 3 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 3 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 3 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 3 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 3 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 3 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 3 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 4", - "level": 3, - "stage": 6, - "room": 4, - "pointer": 3181563, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 4 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 4 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 4 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 4 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 4 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 4 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 4 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 5", - "level": 3, - "stage": 6, - "room": 5, - "pointer": 3177209, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 5 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 5 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 5 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 5 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 5 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 5 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 5 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 6", - "level": 3, - "stage": 6, - "room": 6, - "pointer": 3183291, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 6 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 6 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 6 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 6 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 6 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 6 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 6 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 6 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 7", - "level": 3, - "stage": 6, - "room": 7, - "pointer": 3175453, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 7 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 7 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 7 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 7 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 7 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 7 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 7 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 8", - "level": 3, - "stage": 6, - "room": 8, - "pointer": 3179826, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 8 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 8 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 8 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 8 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 8 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 8 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 8 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 8 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 9", - "level": 3, - "stage": 6, - "room": 9, - "pointer": 3176334, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 9 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 9 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 9 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 9 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 9 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 9 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 9 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 9 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 10", - "level": 3, - "stage": 6, - "room": 10, - "pointer": 3178954, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 10 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 10 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 10 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 10 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 10 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 10 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 10 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 10 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 11", - "level": 3, - "stage": 6, - "room": 11, - "pointer": 2989149, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 37, - "unkn2": 6, - "x": 88, - "y": 264, - "name": "Sand Canyon 6 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 59, - 16 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 12", - "level": 3, - "stage": 6, - "room": 12, - "pointer": 3015947, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 4, - "unkn2": 8, - "x": 440, - "y": 264, - "name": "Sand Canyon 6 - 12 Exit 0", - "access_rule": [] - }, - { - "room": 13, - "unkn1": 86, - "unkn2": 8, - "x": 72, - "y": 104, - "name": "Sand Canyon 6 - 12 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 64, - 16 - ], - [ - 59, - 16 - ], - [ - 55, - 16 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 13", - "level": 3, - "stage": 6, - "room": 13, - "pointer": 2976539, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 23, - "unkn1": 55, - "unkn2": 8, - "x": 56, - "y": 152, - "name": "Sand Canyon 6 - 13 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 14", - "level": 3, - "stage": 6, - "room": 14, - "pointer": 3030336, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 15, - "unkn1": 5, - "unkn2": 9, - "x": 200, - "y": 152, - "name": "Sand Canyon 6 - 14 Exit 0", - "access_rule": [] - }, - { - "room": 8, - "unkn1": 35, - "unkn2": 9, - "x": 152, - "y": 392, - "name": "Sand Canyon 6 - 14 Exit 1", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 15", - "level": 3, - "stage": 6, - "room": 15, - "pointer": 2972361, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 14, - "unkn1": 13, - "unkn2": 9, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 15 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 16", - "level": 3, - "stage": 6, - "room": 16, - "pointer": 2953186, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 18, - "unkn1": 10, - "unkn2": 19, - "x": 248, - "y": 152, - "name": "Sand Canyon 6 - 16 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 10, - "unkn2": 44, - "x": 264, - "y": 88, - "name": "Sand Canyon 6 - 16 Exit 1", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 17", - "level": 3, - "stage": 6, - "room": 17, - "pointer": 2953633, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 18, - "unkn1": 10, - "unkn2": 19, - "x": 248, - "y": 152, - "name": "Sand Canyon 6 - 17 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 10, - "unkn2": 44, - "x": 264, - "y": 88, - "name": "Sand Canyon 6 - 17 Exit 1", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 18", - "level": 3, - "stage": 6, - "room": 18, - "pointer": 2991707, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 17, - "unkn1": 14, - "unkn2": 9, - "x": 184, - "y": 312, - "name": "Sand Canyon 6 - 18 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 19", - "level": 3, - "stage": 6, - "room": 19, - "pointer": 2974651, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 5, - "unkn2": 9, - "x": 376, - "y": 392, - "name": "Sand Canyon 6 - 19 Exit 0", - "access_rule": [] - }, - { - "room": 20, - "unkn1": 35, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Sand Canyon 6 - 19 Exit 1", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 20", - "level": 3, - "stage": 6, - "room": 20, - "pointer": 2969638, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 19, - "unkn1": 4, - "unkn2": 9, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 20 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 21", - "level": 3, - "stage": 6, - "room": 21, - "pointer": 2976163, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 22, - "unkn1": 9, - "unkn2": 13, - "x": 296, - "y": 216, - "name": "Sand Canyon 6 - 21 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 6 - Animal 4", - "Sand Canyon 6 - Animal 5", - "Sand Canyon 6 - Animal 6" - ], - "music": 40 - }, - { - "name": "Sand Canyon 6 - 22", - "level": 3, - "stage": 6, - "room": 22, - "pointer": 2950938, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 38, - "unkn1": 14, - "unkn2": 8, - "x": 168, - "y": 376, - "name": "Sand Canyon 6 - 22 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 9, - "unkn2": 13, - "x": 376, - "y": 216, - "name": "Sand Canyon 6 - 22 Exit 1", - "access_rule": [] - }, - { - "room": 21, - "unkn1": 19, - "unkn2": 13, - "x": 168, - "y": 216, - "name": "Sand Canyon 6 - 22 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 22 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 23", - "level": 3, - "stage": 6, - "room": 23, - "pointer": 3311993, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 43, - "unkn1": 145, - "unkn2": 7, - "x": 72, - "y": 152, - "name": "Sand Canyon 6 - 23 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 16 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 24", - "level": 3, - "stage": 6, - "room": 24, - "pointer": 3079078, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 39, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 24 Exit 0", - "access_rule": [] - }, - { - "room": 25, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 24 Exit 1", - "access_rule": [] - }, - { - "room": 39, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 24 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 25", - "level": 3, - "stage": 6, - "room": 25, - "pointer": 3065898, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 26, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 25 Exit 0", - "access_rule": [] - }, - { - "room": 40, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 25 Exit 1", - "access_rule": [] - }, - { - "room": 40, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 25 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 26", - "level": 3, - "stage": 6, - "room": 26, - "pointer": 3063347, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 41, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 26 Exit 0", - "access_rule": [] - }, - { - "room": 41, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 26 Exit 1", - "access_rule": [] - }, - { - "room": 27, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 26 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 27", - "level": 3, - "stage": 6, - "room": 27, - "pointer": 3066916, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 28, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 27 Exit 0", - "access_rule": [] - }, - { - "room": 42, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 27 Exit 1", - "access_rule": [] - }, - { - "room": 42, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 27 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 28", - "level": 3, - "stage": 6, - "room": 28, - "pointer": 3067425, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 29, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 344, - "name": "Sand Canyon 6 - 28 Exit 0", - "access_rule": [] - }, - { - "room": 29, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 344, - "name": "Sand Canyon 6 - 28 Exit 1", - "access_rule": [] - }, - { - "room": 29, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 344, - "name": "Sand Canyon 6 - 28 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 29", - "level": 3, - "stage": 6, - "room": 29, - "pointer": 2950032, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 30, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 136, - "name": "Sand Canyon 6 - 29 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 30", - "level": 3, - "stage": 6, - "room": 30, - "pointer": 2986500, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 10, - "unkn2": 44, - "x": 136, - "y": 152, - "name": "Sand Canyon 6 - 30 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 31", - "level": 3, - "stage": 6, - "room": 31, - "pointer": 3070930, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 32, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 31 Exit 0", - "access_rule": [] - }, - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 648, - "name": "Sand Canyon 6 - 31 Exit 1", - "access_rule": [] - }, - { - "room": 32, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 31 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 32", - "level": 3, - "stage": 6, - "room": 32, - "pointer": 3054817, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Parasol)", - "Bukiset (Cutter)" - ], - "default_exits": [ - { - "room": 33, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 32 Exit 0", - "access_rule": [] - }, - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 536, - "name": "Sand Canyon 6 - 32 Exit 1", - "access_rule": [] - }, - { - "room": 33, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 32 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 81, - 16 - ], - [ - 83, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", - "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 33", - "level": 3, - "stage": 6, - "room": 33, - "pointer": 3053173, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Clean)", - "Bukiset (Spark)" - ], - "default_exits": [ - { - "room": 34, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 33 Exit 0", - "access_rule": [] - }, - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 440, - "name": "Sand Canyon 6 - 33 Exit 1", - "access_rule": [] - }, - { - "room": 34, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 33 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 80, - 16 - ], - [ - 82, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", - "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 34", - "level": 3, - "stage": 6, - "room": 34, - "pointer": 3053721, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Ice)", - "Bukiset (Needle)" - ], - "default_exits": [ - { - "room": 35, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 34 Exit 0", - "access_rule": [] - }, - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 344, - "name": "Sand Canyon 6 - 34 Exit 1", - "access_rule": [] - }, - { - "room": 35, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 34 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 79, - 16 - ], - [ - 78, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", - "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 35", - "level": 3, - "stage": 6, - "room": 35, - "pointer": 3054269, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Burning)", - "Bukiset (Stone)" - ], - "default_exits": [ - { - "room": 37, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 344, - "name": "Sand Canyon 6 - 35 Exit 0", - "access_rule": [] - }, - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 248, - "name": "Sand Canyon 6 - 35 Exit 1", - "access_rule": [] - }, - { - "room": 37, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 344, - "name": "Sand Canyon 6 - 35 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 77, - 16 - ], - [ - 76, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", - "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 36", - "level": 3, - "stage": 6, - "room": 36, - "pointer": 2986164, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 10, - "unkn2": 44, - "x": 392, - "y": 152, - "name": "Sand Canyon 6 - 36 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 37", - "level": 3, - "stage": 6, - "room": 37, - "pointer": 3074377, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 152, - "name": "Sand Canyon 6 - 37 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 38", - "level": 3, - "stage": 6, - "room": 38, - "pointer": 2971589, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 10, - "unkn2": 5, - "x": 264, - "y": 440, - "name": "Sand Canyon 6 - 38 Exit 0", - "access_rule": [] - }, - { - "room": 22, - "unkn1": 10, - "unkn2": 23, - "x": 248, - "y": 136, - "name": "Sand Canyon 6 - 38 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 76, - 16 - ], - [ - 77, - 16 - ], - [ - 78, - 16 - ], - [ - 79, - 16 - ], - [ - 80, - 16 - ], - [ - 81, - 16 - ], - [ - 82, - 16 - ], - [ - 83, - 16 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 39", - "level": 3, - "stage": 6, - "room": 39, - "pointer": 3063858, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 40, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 39 Exit 0", - "access_rule": [] - }, - { - "room": 40, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 39 Exit 1", - "access_rule": [] - }, - { - "room": 40, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 39 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 40", - "level": 3, - "stage": 6, - "room": 40, - "pointer": 3064368, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 41, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 40 Exit 0", - "access_rule": [] - }, - { - "room": 41, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 40 Exit 1", - "access_rule": [] - }, - { - "room": 41, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 40 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 41", - "level": 3, - "stage": 6, - "room": 41, - "pointer": 3064878, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 42, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 41 Exit 0", - "access_rule": [] - }, - { - "room": 42, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 41 Exit 1", - "access_rule": [] - }, - { - "room": 42, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 41 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 42", - "level": 3, - "stage": 6, - "room": 42, - "pointer": 3068939, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nidoo" - ], - "default_exits": [ - { - "room": 29, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 344, - "name": "Sand Canyon 6 - 42 Exit 0", - "access_rule": [] - }, - { - "room": 29, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 344, - "name": "Sand Canyon 6 - 42 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 13 (Nidoo)" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 43", - "level": 3, - "stage": 6, - "room": 43, - "pointer": 2988495, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 44, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 6 - 43 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Sand Canyon 6 - Professor Hector & R.O.B" - ], - "music": 8 - }, - { - "name": "Sand Canyon 6 - 44", - "level": 3, - "stage": 6, - "room": 44, - "pointer": 2886979, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 6 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon Boss - 0", - "level": 3, - "stage": 7, - "room": 0, - "pointer": 2991389, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 6, - 18 - ] - ], - "locations": [ - "Sand Canyon - Boss (Pon & Con) Purified", - "Level 3 Boss" - ], - "music": 2 - }, - { - "name": "Cloudy Park 1 - 0", - "level": 4, - "stage": 1, - "room": 0, - "pointer": 3172795, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "KeKe", - "Cappy" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 95, - "unkn2": 5, - "x": 56, - "y": 152, - "name": "Cloudy Park 1 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 16 - ], - [ - 12, - 16 - ], - [ - 51, - 16 - ], - [ - 1, - 23 - ], - [ - 0, - 23 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 1 (Waddle Dee)", - "Cloudy Park 1 - Enemy 2 (KeKe)", - "Cloudy Park 1 - Enemy 3 (Cappy)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 1", - "level": 4, - "stage": 1, - "room": 1, - "pointer": 3078163, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 14, - "unkn2": 8, - "x": 88, - "y": 424, - "name": "Cloudy Park 1 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 1 - Animal 1" - ], - "music": 39 - }, - { - "name": "Cloudy Park 1 - 2", - "level": 4, - "stage": 1, - "room": 2, - "pointer": 3285882, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Yaban", - "Togezo" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 95, - "unkn2": 8, - "x": 40, - "y": 104, - "name": "Cloudy Park 1 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 32, - 16 - ], - [ - 4, - 16 - ], - [ - 18, - 16 - ], - [ - 6, - 23 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 4 (Yaban)", - "Cloudy Park 1 - Enemy 5 (Togezo)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 3", - "level": 4, - "stage": 1, - "room": 3, - "pointer": 3062831, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 15, - "unkn2": 6, - "x": 56, - "y": 264, - "name": "Cloudy Park 1 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 1 - Animal 2" - ], - "music": 39 - }, - { - "name": "Cloudy Park 1 - 4", - "level": 4, - "stage": 1, - "room": 4, - "pointer": 3396729, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 92, - "unkn2": 16, - "x": 56, - "y": 152, - "name": "Cloudy Park 1 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 54, - 16 - ], - [ - 0, - 16 - ], - [ - 14, - 23 - ], - [ - 68, - 16 - ], - [ - 26, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 6 (Galbo)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 5", - "level": 4, - "stage": 1, - "room": 5, - "pointer": 3038805, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 6, - "unkn2": 5, - "x": 2344, - "y": 232, - "name": "Cloudy Park 1 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 1 - Animal 3", - "Cloudy Park 1 - Animal 4" - ], - "music": 39 - }, - { - "name": "Cloudy Park 1 - 6", - "level": 4, - "stage": 1, - "room": 6, - "pointer": 3535736, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky", - "Como" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 5, - "unkn2": 8, - "x": 72, - "y": 104, - "name": "Cloudy Park 1 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 54, - 16 - ], - [ - 14, - 23 - ], - [ - 0, - 16 - ], - [ - 41, - 16 - ], - [ - 8, - 16 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 7 (Sparky)", - "Cloudy Park 1 - Enemy 8 (Como)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 7", - "level": 4, - "stage": 1, - "room": 7, - "pointer": 2954080, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 14, - "unkn2": 6, - "x": 88, - "y": 104, - "name": "Cloudy Park 1 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 1 - Animal 5" - ], - "music": 39 - }, - { - "name": "Cloudy Park 1 - 8", - "level": 4, - "stage": 1, - "room": 8, - "pointer": 3465407, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt" - ], - "default_exits": [ - { - "room": 12, - "unkn1": 181, - "unkn2": 6, - "x": 56, - "y": 152, - "name": "Cloudy Park 1 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 21, - 19 - ], - [ - 2, - 16 - ], - [ - 51, - 16 - ], - [ - 1, - 23 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 9 (Bronto Burt)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 9", - "level": 4, - "stage": 1, - "room": 9, - "pointer": 3078621, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 14, - "unkn2": 9, - "x": 56, - "y": 264, - "name": "Cloudy Park 1 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 1 - Animal 6" - ], - "music": 39 - }, - { - "name": "Cloudy Park 1 - 10", - "level": 4, - "stage": 1, - "room": 10, - "pointer": 3281366, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Gabon", - "Sir Kibble" - ], - "default_exits": [ - { - "room": 9, - "unkn1": 99, - "unkn2": 8, - "x": 56, - "y": 152, - "name": "Cloudy Park 1 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ], - [ - 24, - 16 - ], - [ - 27, - 16 - ], - [ - 4, - 23 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 10 (Gabon)", - "Cloudy Park 1 - Enemy 11 (Sir Kibble)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 11", - "level": 4, - "stage": 1, - "room": 11, - "pointer": 3519608, - "animal_pointers": [], - "consumables": [ - { - "idx": 19, - "pointer": 192, - "x": 216, - "y": 600, - "etype": 22, - "vtype": 0, - "name": "Cloudy Park 1 - 1-Up (Shotzo)" - }, - { - "idx": 18, - "pointer": 456, - "x": 856, - "y": 408, - "etype": 22, - "vtype": 2, - "name": "Cloudy Park 1 - Maxim Tomato (Mariel)" - } - ], - "consumables_pointer": 352, - "enemies": [ - "Mariel", - "Nruff" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 64, - "unkn2": 6, - "x": 104, - "y": 216, - "name": "Cloudy Park 1 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 16 - ], - [ - 27, - 16 - ], - [ - 15, - 16 - ], - [ - 45, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 22 - ], - [ - 0, - 22 - ], - [ - 6, - 22 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 12 (Mariel)", - "Cloudy Park 1 - Enemy 13 (Nruff)", - "Cloudy Park 1 - 1-Up (Shotzo)", - "Cloudy Park 1 - Maxim Tomato (Mariel)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 12", - "level": 4, - "stage": 1, - "room": 12, - "pointer": 2958914, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 13, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Cloudy Park 1 - 12 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 21, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Cloudy Park 1 - Hibanamodoki" - ], - "music": 8 - }, - { - "name": "Cloudy Park 1 - 13", - "level": 4, - "stage": 1, - "room": 13, - "pointer": 2886015, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 1 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park 2 - 0", - "level": 4, - "stage": 2, - "room": 0, - "pointer": 3142443, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Chilly", - "Sasuke" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 96, - "unkn2": 7, - "x": 56, - "y": 88, - "name": "Cloudy Park 2 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 23, - 16 - ], - [ - 7, - 16 - ], - [ - 30, - 16 - ], - [ - 6, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 1 (Chilly)", - "Cloudy Park 2 - Enemy 2 (Sasuke)" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 1", - "level": 4, - "stage": 2, - "room": 1, - "pointer": 3235925, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Sparky", - "Broom Hatter" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 146, - "unkn2": 5, - "x": 88, - "y": 88, - "name": "Cloudy Park 2 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 16 - ], - [ - 14, - 23 - ], - [ - 8, - 16 - ], - [ - 11, - 16 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 3 (Waddle Dee)", - "Cloudy Park 2 - Enemy 4 (Sparky)", - "Cloudy Park 2 - Enemy 5 (Broom Hatter)" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 2", - "level": 4, - "stage": 2, - "room": 2, - "pointer": 3297758, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble", - "Pteran" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 147, - "unkn2": 8, - "x": 72, - "y": 136, - "name": "Cloudy Park 2 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 27, - 16 - ], - [ - 39, - 16 - ], - [ - 1, - 23 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 6 (Sir Kibble)", - "Cloudy Park 2 - Enemy 7 (Pteran)" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 3", - "level": 4, - "stage": 2, - "room": 3, - "pointer": 3341087, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Dogon" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 145, - "unkn2": 12, - "x": 72, - "y": 136, - "name": "Cloudy Park 2 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 16 - ], - [ - 14, - 23 - ], - [ - 90, - 16 - ], - [ - 89, - 16 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 8 (Propeller)", - "Cloudy Park 2 - Enemy 9 (Dogon)" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 4", - "level": 4, - "stage": 2, - "room": 4, - "pointer": 3457404, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Togezo", - "Oro", - "Bronto Burt", - "Rocky" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 165, - "unkn2": 5, - "x": 72, - "y": 104, - "name": "Cloudy Park 2 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 3, - 16 - ], - [ - 14, - 23 - ], - [ - 18, - 16 - ], - [ - 25, - 16 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 10 (Togezo)", - "Cloudy Park 2 - Enemy 11 (Oro)", - "Cloudy Park 2 - Enemy 12 (Bronto Burt)", - "Cloudy Park 2 - Enemy 13 (Rocky)" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 5", - "level": 4, - "stage": 2, - "room": 5, - "pointer": 3273878, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo", - "Kapar" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 96, - "unkn2": 8, - "x": 56, - "y": 88, - "name": "Cloudy Park 2 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 62, - 16 - ], - [ - 26, - 16 - ], - [ - 67, - 16 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 14 (Galbo)", - "Cloudy Park 2 - Enemy 15 (Kapar)" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 6", - "level": 4, - "stage": 2, - "room": 6, - "pointer": 2984453, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 25, - "unkn2": 5, - "x": 72, - "y": 152, - "name": "Cloudy Park 2 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 2 - Animal 1", - "Cloudy Park 2 - Animal 2", - "Cloudy Park 2 - Animal 3" - ], - "music": 38 - }, - { - "name": "Cloudy Park 2 - 7", - "level": 4, - "stage": 2, - "room": 7, - "pointer": 2985482, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 15, - "unkn2": 5, - "x": 40, - "y": 88, - "name": "Cloudy Park 2 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 22, - 19 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 8", - "level": 4, - "stage": 2, - "room": 8, - "pointer": 2990753, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Cloudy Park 2 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 22, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Cloudy Park 2 - Piyo & Keko" - ], - "music": 8 - }, - { - "name": "Cloudy Park 2 - 9", - "level": 4, - "stage": 2, - "room": 9, - "pointer": 2889630, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 2 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park 3 - 0", - "level": 4, - "stage": 3, - "room": 0, - "pointer": 3100859, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "Mopoo", - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 2, - "unkn1": 145, - "unkn2": 8, - "x": 56, - "y": 136, - "name": "Cloudy Park 3 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 74, - 16 - ], - [ - 47, - 16 - ], - [ - 7, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 3 - Enemy 1 (Bronto Burt)", - "Cloudy Park 3 - Enemy 2 (Mopoo)", - "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)" - ], - "music": 15 - }, - { - "name": "Cloudy Park 3 - 1", - "level": 4, - "stage": 3, - "room": 1, - "pointer": 3209719, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Como" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 13, - "unkn2": 14, - "x": 56, - "y": 152, - "name": "Cloudy Park 3 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ], - [ - 31, - 16 - ], - [ - 4, - 22 - ], - [ - 41, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 3 - Enemy 4 (Como)" - ], - "music": 15 - }, - { - "name": "Cloudy Park 3 - 2", - "level": 4, - "stage": 3, - "room": 2, - "pointer": 3216185, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Glunk", - "Bobin", - "Loud", - "Kapar" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 145, - "unkn2": 6, - "x": 216, - "y": 1064, - "name": "Cloudy Park 3 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 24, - "unkn2": 14, - "x": 104, - "y": 152, - "name": "Cloudy Park 3 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 67, - 16 - ], - [ - 40, - 16 - ], - [ - 73, - 16 - ], - [ - 14, - 23 - ], - [ - 16, - 16 - ] - ], - "locations": [ - "Cloudy Park 3 - Enemy 5 (Glunk)", - "Cloudy Park 3 - Enemy 6 (Bobin)", - "Cloudy Park 3 - Enemy 7 (Loud)", - "Cloudy Park 3 - Enemy 8 (Kapar)" - ], - "music": 15 - }, - { - "name": "Cloudy Park 3 - 3", - "level": 4, - "stage": 3, - "room": 3, - "pointer": 2994208, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 5, - "unkn2": 9, - "x": 408, - "y": 232, - "name": "Cloudy Park 3 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 3 - Animal 1", - "Cloudy Park 3 - Animal 2", - "Cloudy Park 3 - Animal 3" - ], - "music": 40 - }, - { - "name": "Cloudy Park 3 - 4", - "level": 4, - "stage": 3, - "room": 4, - "pointer": 3229151, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo", - "Batamon", - "Bouncy" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 156, - "unkn2": 6, - "x": 56, - "y": 152, - "name": "Cloudy Park 3 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 126, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Cloudy Park 3 - 4 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 7, - 16 - ], - [ - 26, - 16 - ], - [ - 14, - 23 - ], - [ - 13, - 16 - ], - [ - 68, - 16 - ] - ], - "locations": [ - "Cloudy Park 3 - Enemy 9 (Galbo)", - "Cloudy Park 3 - Enemy 10 (Batamon)", - "Cloudy Park 3 - Enemy 11 (Bouncy)" - ], - "music": 15 - }, - { - "name": "Cloudy Park 3 - 5", - "level": 4, - "stage": 3, - "room": 5, - "pointer": 2969244, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 14, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Cloudy Park 3 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 23, - 19 - ] - ], - "locations": [], - "music": 31 - }, - { - "name": "Cloudy Park 3 - 6", - "level": 4, - "stage": 3, - "room": 6, - "pointer": 4128530, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Cloudy Park 3 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 23, - 19 - ] - ], - "locations": [ - "Cloudy Park 3 - Mr. Ball" - ], - "music": 8 - }, - { - "name": "Cloudy Park 3 - 7", - "level": 4, - "stage": 3, - "room": 7, - "pointer": 2885051, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 3 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park 4 - 0", - "level": 4, - "stage": 4, - "room": 0, - "pointer": 3072905, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 95, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Cloudy Park 4 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 23 - ], - [ - 1, - 23 - ], - [ - 0, - 23 - ], - [ - 31, - 16 - ] - ], - "locations": [], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 1", - "level": 4, - "stage": 4, - "room": 1, - "pointer": 3074863, - "animal_pointers": [ - 208, - 224 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 21, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 4 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 4 - Animal 1", - "Cloudy Park 4 - Animal 2" - ], - "music": 38 - }, - { - "name": "Cloudy Park 4 - 2", - "level": 4, - "stage": 4, - "room": 2, - "pointer": 3309209, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Gabon", - "Como", - "Wapod", - "Cappy" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 145, - "unkn2": 9, - "x": 104, - "y": 152, - "name": "Cloudy Park 4 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 88, - 16 - ], - [ - 24, - 16 - ], - [ - 12, - 16 - ], - [ - 14, - 23 - ], - [ - 41, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Cloudy Park 4 - Enemy 1 (Gabon)", - "Cloudy Park 4 - Enemy 2 (Como)", - "Cloudy Park 4 - Enemy 3 (Wapod)", - "Cloudy Park 4 - Enemy 4 (Cappy)" - ], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 3", - "level": 4, - "stage": 4, - "room": 3, - "pointer": 3296291, - "animal_pointers": [], - "consumables": [ - { - "idx": 33, - "pointer": 776, - "x": 1880, - "y": 152, - "etype": 22, - "vtype": 0, - "name": "Cloudy Park 4 - 1-Up (Windy)" - }, - { - "idx": 34, - "pointer": 912, - "x": 2160, - "y": 152, - "etype": 22, - "vtype": 2, - "name": "Cloudy Park 4 - Maxim Tomato (Windy)" - } - ], - "consumables_pointer": 304, - "enemies": [ - "Sparky", - "Togezo" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 144, - "unkn2": 9, - "x": 56, - "y": 136, - "name": "Cloudy Park 4 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 18, - 16 - ], - [ - 8, - 16 - ], - [ - 31, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 4, - 16 - ], - [ - 0, - 22 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Cloudy Park 4 - Enemy 5 (Sparky)", - "Cloudy Park 4 - Enemy 6 (Togezo)", - "Cloudy Park 4 - 1-Up (Windy)", - "Cloudy Park 4 - Maxim Tomato (Windy)" - ], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 4", - "level": 4, - "stage": 4, - "room": 4, - "pointer": 3330996, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "KeKe", - "Bouncy" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 4, - "unkn2": 15, - "x": 72, - "y": 152, - "name": "Cloudy Park 4 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 13, - 16 - ], - [ - 51, - 16 - ], - [ - 17, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 16 - ] - ], - "locations": [ - "Cloudy Park 4 - Enemy 7 (Bronto Burt)", - "Cloudy Park 4 - Enemy 8 (KeKe)", - "Cloudy Park 4 - Enemy 9 (Bouncy)" - ], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 5", - "level": 4, - "stage": 4, - "room": 5, - "pointer": 3332300, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble", - "Mariel" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 21, - "unkn2": 51, - "x": 2328, - "y": 120, - "name": "Cloudy Park 4 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 45, - 16 - ], - [ - 46, - 16 - ], - [ - 27, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 4 - Enemy 10 (Sir Kibble)", - "Cloudy Park 4 - Enemy 11 (Mariel)" - ], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 6", - "level": 4, - "stage": 4, - "room": 6, - "pointer": 3253310, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kabu", - "Wappa" - ], - "default_exits": [ - { - "room": 9, - "unkn1": 3, - "unkn2": 6, - "x": 72, - "y": 152, - "name": "Cloudy Park 4 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 44, - 16 - ], - [ - 31, - 16 - ], - [ - 19, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 4 - Enemy 12 (Kabu)", - "Cloudy Park 4 - Enemy 13 (Wappa)" - ], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 7", - "level": 4, - "stage": 4, - "room": 7, - "pointer": 2967658, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 12, - "unkn2": 9, - "x": 152, - "y": 120, - "name": "Cloudy Park 4 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 27 - ] - ], - "locations": [ - "Cloudy Park 4 - Miniboss 1 (Jumper Shoot)" - ], - "music": 4 - }, - { - "name": "Cloudy Park 4 - 8", - "level": 4, - "stage": 4, - "room": 8, - "pointer": 2981644, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 13, - "unkn2": 9, - "x": 344, - "y": 680, - "name": "Cloudy Park 4 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 24, - 19 - ] - ], - "locations": [], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 9", - "level": 4, - "stage": 4, - "room": 9, - "pointer": 3008001, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Cloudy Park 4 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 24, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Cloudy Park 4 - Mikarin & Kagami Mocchi" - ], - "music": 8 - }, - { - "name": "Cloudy Park 4 - 10", - "level": 4, - "stage": 4, - "room": 10, - "pointer": 2888184, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 4 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park 5 - 0", - "level": 4, - "stage": 5, - "room": 0, - "pointer": 3192630, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Yaban", - "Sir Kibble", - "Cappy", - "Wappa" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 146, - "unkn2": 6, - "x": 168, - "y": 616, - "name": "Cloudy Park 5 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 32, - 16 - ], - [ - 27, - 16 - ], - [ - 44, - 16 - ], - [ - 12, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 5 - Enemy 1 (Yaban)", - "Cloudy Park 5 - Enemy 2 (Sir Kibble)", - "Cloudy Park 5 - Enemy 3 (Cappy)", - "Cloudy Park 5 - Enemy 4 (Wappa)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 1", - "level": 4, - "stage": 5, - "room": 1, - "pointer": 3050956, - "animal_pointers": [], - "consumables": [ - { - "idx": 5, - "pointer": 264, - "x": 480, - "y": 720, - "etype": 22, - "vtype": 2, - "name": "Cloudy Park 5 - Maxim Tomato (Pillars)" - } - ], - "consumables_pointer": 288, - "enemies": [ - "Galbo", - "Bronto Burt", - "KeKe" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 32, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 5 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 51, - 16 - ], - [ - 26, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Cloudy Park 5 - Enemy 5 (Galbo)", - "Cloudy Park 5 - Enemy 6 (Bronto Burt)", - "Cloudy Park 5 - Enemy 7 (KeKe)", - "Cloudy Park 5 - Maxim Tomato (Pillars)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 2", - "level": 4, - "stage": 5, - "room": 2, - "pointer": 3604194, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 17, - "unkn2": 9, - "x": 72, - "y": 88, - "name": "Cloudy Park 5 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 5 - Animal 1", - "Cloudy Park 5 - Animal 2" - ], - "music": 40 - }, - { - "name": "Cloudy Park 5 - 3", - "level": 4, - "stage": 5, - "room": 3, - "pointer": 3131242, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Klinko" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 98, - "unkn2": 5, - "x": 72, - "y": 120, - "name": "Cloudy Park 5 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 89, - 16 - ], - [ - 4, - 16 - ], - [ - 42, - 16 - ], - [ - 4, - 23 - ] - ], - "locations": [ - "Cloudy Park 5 - Enemy 8 (Propeller)", - "Cloudy Park 5 - Enemy 9 (Klinko)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 4", - "level": 4, - "stage": 5, - "room": 4, - "pointer": 2990116, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Wapod" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 23, - "unkn2": 7, - "x": 216, - "y": 744, - "name": "Cloudy Park 5 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 88, - 16 - ] - ], - "locations": [ - "Cloudy Park 5 - Enemy 10 (Wapod)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 5", - "level": 4, - "stage": 5, - "room": 5, - "pointer": 2975410, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 5, - "unkn2": 4, - "x": 104, - "y": 296, - "name": "Cloudy Park 5 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 16 - ] - ], - "locations": [], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 6", - "level": 4, - "stage": 5, - "room": 6, - "pointer": 3173683, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Pteran" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 115, - "unkn2": 6, - "x": 56, - "y": 136, - "name": "Cloudy Park 5 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 1, - 23 - ], - [ - 39, - 16 - ], - [ - 70, - 16 - ] - ], - "locations": [ - "Cloudy Park 5 - Enemy 11 (Pteran)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 7", - "level": 4, - "stage": 5, - "room": 7, - "pointer": 2992340, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 14, - "unkn2": 8, - "x": 72, - "y": 120, - "name": "Cloudy Park 5 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 25, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Cloudy Park 5 - Pick" - ], - "music": 8 - }, - { - "name": "Cloudy Park 5 - 8", - "level": 4, - "stage": 5, - "room": 8, - "pointer": 2891558, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 5 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park 6 - 0", - "level": 4, - "stage": 6, - "room": 0, - "pointer": 3269847, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 65, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Cloudy Park 6 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 1", - "level": 4, - "stage": 6, - "room": 1, - "pointer": 3252248, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 3, - "unkn2": 25, - "x": 72, - "y": 72, - "name": "Cloudy Park 6 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 16 - ], - [ - 55, - 16 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 2", - "level": 4, - "stage": 6, - "room": 2, - "pointer": 3028494, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Madoo" - ], - "default_exits": [ - { - "room": 0, - "unkn1": 4, - "unkn2": 9, - "x": 1032, - "y": 152, - "name": "Cloudy Park 6 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 13, - "unkn2": 9, - "x": 56, - "y": 72, - "name": "Cloudy Park 6 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 58, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 1 (Madoo)" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 3", - "level": 4, - "stage": 6, - "room": 3, - "pointer": 3131911, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 4, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 6 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 8, - "unkn2": 9, - "x": 136, - "y": 152, - "name": "Cloudy Park 6 - 3 Exit 1", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 12, - "unkn2": 9, - "x": 200, - "y": 152, - "name": "Cloudy Park 6 - 3 Exit 2", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 16, - "unkn2": 9, - "x": 264, - "y": 152, - "name": "Cloudy Park 6 - 3 Exit 3", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 20, - "unkn2": 9, - "x": 328, - "y": 152, - "name": "Cloudy Park 6 - 3 Exit 4", - "access_rule": [] - } - ], - "entity_load": [ - [ - 58, - 16 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 4", - "level": 4, - "stage": 6, - "room": 4, - "pointer": 3115416, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Tick", - "Como" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 20, - "unkn2": 4, - "x": 72, - "y": 488, - "name": "Cloudy Park 6 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 6 - 4 Exit 1", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 8, - "unkn2": 9, - "x": 200, - "y": 152, - "name": "Cloudy Park 6 - 4 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 12, - "unkn2": 9, - "x": 328, - "y": 152, - "name": "Cloudy Park 6 - 4 Exit 3", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 16, - "unkn2": 9, - "x": 136, - "y": 152, - "name": "Cloudy Park 6 - 4 Exit 4", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 20, - "unkn2": 9, - "x": 264, - "y": 152, - "name": "Cloudy Park 6 - 4 Exit 5", - "access_rule": [] - } - ], - "entity_load": [ - [ - 55, - 16 - ], - [ - 48, - 16 - ], - [ - 41, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 2 (Tick)", - "Cloudy Park 6 - Enemy 3 (Como)" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 5", - "level": 4, - "stage": 6, - "room": 5, - "pointer": 3245809, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee Drawing", - "Bronto Burt Drawing", - "Bouncy Drawing" - ], - "default_exits": [ - { - "room": 15, - "unkn1": 65, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 6 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 84, - 16 - ], - [ - 85, - 16 - ], - [ - 86, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", - "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", - "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 6", - "level": 4, - "stage": 6, - "room": 6, - "pointer": 3237044, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 56, - "unkn2": 9, - "x": 72, - "y": 136, - "name": "Cloudy Park 6 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 89, - 16 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 7 (Propeller)" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 7", - "level": 4, - "stage": 6, - "room": 7, - "pointer": 3262705, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Mopoo" - ], - "default_exits": [ - { - "room": 13, - "unkn1": 12, - "unkn2": 8, - "x": 184, - "y": 216, - "name": "Cloudy Park 6 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 57, - "unkn2": 8, - "x": 184, - "y": 216, - "name": "Cloudy Park 6 - 7 Exit 1", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 64, - "unkn2": 8, - "x": 72, - "y": 120, - "name": "Cloudy Park 6 - 7 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 74, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 8 (Mopoo)" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 8", - "level": 4, - "stage": 6, - "room": 8, - "pointer": 3027259, - "animal_pointers": [], - "consumables": [ - { - "idx": 22, - "pointer": 312, - "x": 224, - "y": 256, - "etype": 22, - "vtype": 0, - "name": "Cloudy Park 6 - 1-Up (Cutter)" - } - ], - "consumables_pointer": 304, - "enemies": [ - "Bukiset (Burning)", - "Bukiset (Ice)", - "Bukiset (Needle)", - "Bukiset (Clean)", - "Bukiset (Cutter)" - ], - "default_exits": [ - { - "room": 12, - "unkn1": 13, - "unkn2": 4, - "x": 88, - "y": 152, - "name": "Cloudy Park 6 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 78, - 16 - ], - [ - 80, - 16 - ], - [ - 76, - 16 - ], - [ - 79, - 16 - ], - [ - 83, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", - "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", - "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", - "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", - "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", - "Cloudy Park 6 - 1-Up (Cutter)" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 9", - "level": 4, - "stage": 6, - "room": 9, - "pointer": 3089504, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 35, - "unkn2": 7, - "x": 72, - "y": 72, - "name": "Cloudy Park 6 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 41, - 16 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 10", - "level": 4, - "stage": 6, - "room": 10, - "pointer": 3132579, - "animal_pointers": [ - 242, - 250, - 258 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 20, - "unkn2": 4, - "x": 72, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 4, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 1", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 8, - "unkn2": 9, - "x": 136, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 2", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 12, - "unkn2": 9, - "x": 200, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 3", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 16, - "unkn2": 9, - "x": 264, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 4", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 20, - "unkn2": 9, - "x": 328, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 5", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 6 - Animal 1", - "Cloudy Park 6 - Animal 2", - "Cloudy Park 6 - Animal 3" - ], - "music": 40 - }, - { - "name": "Cloudy Park 6 - 11", - "level": 4, - "stage": 6, - "room": 11, - "pointer": 3017866, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 4, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 6 - 11 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 8, - "unkn2": 9, - "x": 264, - "y": 152, - "name": "Cloudy Park 6 - 11 Exit 1", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 12, - "unkn2": 9, - "x": 136, - "y": 152, - "name": "Cloudy Park 6 - 11 Exit 2", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 16, - "unkn2": 9, - "x": 328, - "y": 152, - "name": "Cloudy Park 6 - 11 Exit 3", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 20, - "unkn2": 9, - "x": 200, - "y": 152, - "name": "Cloudy Park 6 - 11 Exit 4", - "access_rule": [] - } - ], - "entity_load": [ - [ - 58, - 16 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 12", - "level": 4, - "stage": 6, - "room": 12, - "pointer": 3036404, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 4, - "unkn2": 9, - "x": 200, - "y": 72, - "name": "Cloudy Park 6 - 12 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 13, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Cloudy Park 6 - 12 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 58, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 13", - "level": 4, - "stage": 6, - "room": 13, - "pointer": 2965251, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 10, - "unkn2": 13, - "x": 216, - "y": 136, - "name": "Cloudy Park 6 - 13 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 19 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 14", - "level": 4, - "stage": 6, - "room": 14, - "pointer": 3077236, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 10, - "unkn2": 13, - "x": 936, - "y": 136, - "name": "Cloudy Park 6 - 14 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 15", - "level": 4, - "stage": 6, - "room": 15, - "pointer": 3061794, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Cloudy Park 6 - 15 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Cloudy Park 6 - HB-007" - ], - "music": 8 - }, - { - "name": "Cloudy Park 6 - 16", - "level": 4, - "stage": 6, - "room": 16, - "pointer": 2888907, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 6 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park Boss - 0", - "level": 4, - "stage": 7, - "room": 0, - "pointer": 2998682, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 3, - 18 - ] - ], - "locations": [ - "Cloudy Park - Boss (Ado) Purified", - "Level 4 Boss" - ], - "music": 2 - }, - { - "name": "Iceberg 1 - 0", - "level": 5, - "stage": 1, - "room": 0, - "pointer": 3363111, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Klinko", - "KeKe" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 104, - "unkn2": 8, - "x": 312, - "y": 1384, - "name": "Iceberg 1 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 42, - 16 - ], - [ - 0, - 16 - ], - [ - 51, - 16 - ] - ], - "locations": [ - "Iceberg 1 - Enemy 1 (Waddle Dee)", - "Iceberg 1 - Enemy 2 (Klinko)", - "Iceberg 1 - Enemy 3 (KeKe)" - ], - "music": 18 - }, - { - "name": "Iceberg 1 - 1", - "level": 5, - "stage": 1, - "room": 1, - "pointer": 3596524, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Como", - "Galbo", - "Rocky" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 20, - "unkn2": 8, - "x": 72, - "y": 344, - "name": "Iceberg 1 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 16 - ], - [ - 41, - 16 - ], - [ - 26, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 6, - 23 - ] - ], - "locations": [ - "Iceberg 1 - Enemy 4 (Como)", - "Iceberg 1 - Enemy 5 (Galbo)", - "Iceberg 1 - Enemy 6 (Rocky)" - ], - "music": 18 - }, - { - "name": "Iceberg 1 - 2", - "level": 5, - "stage": 1, - "room": 2, - "pointer": 3288880, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kapar" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 49, - "unkn2": 9, - "x": 184, - "y": 152, - "name": "Iceberg 1 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 94, - "unkn2": 21, - "x": 120, - "y": 168, - "name": "Iceberg 1 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 19 - ], - [ - 46, - 16 - ], - [ - 47, - 16 - ], - [ - 17, - 16 - ], - [ - 67, - 16 - ] - ], - "locations": [ - "Iceberg 1 - Enemy 7 (Kapar)" - ], - "music": 18 - }, - { - "name": "Iceberg 1 - 3", - "level": 5, - "stage": 1, - "room": 3, - "pointer": 3068439, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 10, - "unkn2": 9, - "x": 808, - "y": 152, - "name": "Iceberg 1 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 1 - Animal 1", - "Iceberg 1 - Animal 2" - ], - "music": 38 - }, - { - "name": "Iceberg 1 - 4", - "level": 5, - "stage": 1, - "room": 4, - "pointer": 3233681, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Mopoo", - "Babut", - "Wappa" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 74, - "unkn2": 4, - "x": 56, - "y": 152, - "name": "Iceberg 1 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 44, - 16 - ], - [ - 43, - 16 - ], - [ - 74, - 16 - ] - ], - "locations": [ - "Iceberg 1 - Enemy 8 (Mopoo)", - "Iceberg 1 - Enemy 9 (Babut)", - "Iceberg 1 - Enemy 10 (Wappa)" - ], - "music": 18 - }, - { - "name": "Iceberg 1 - 5", - "level": 5, - "stage": 1, - "room": 5, - "pointer": 3406133, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "Chilly", - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 4, - "unkn1": 196, - "unkn2": 9, - "x": 72, - "y": 744, - "name": "Iceberg 1 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ], - [ - 7, - 16 - ], - [ - 2, - 16 - ], - [ - 0, - 16 - ] - ], - "locations": [ - "Iceberg 1 - Enemy 11 (Bronto Burt)", - "Iceberg 1 - Enemy 12 (Chilly)", - "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)" - ], - "music": 18 - }, - { - "name": "Iceberg 1 - 6", - "level": 5, - "stage": 1, - "room": 6, - "pointer": 2985823, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 1 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Iceberg 1 - Kogoesou" - ], - "music": 8 - }, - { - "name": "Iceberg 1 - 7", - "level": 5, - "stage": 1, - "room": 7, - "pointer": 2892040, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 1 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg 2 - 0", - "level": 5, - "stage": 2, - "room": 0, - "pointer": 3106800, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Gabon", - "Nruff" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 113, - "unkn2": 36, - "x": 88, - "y": 152, - "name": "Iceberg 2 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 16 - ], - [ - 0, - 16 - ], - [ - 24, - 16 - ] - ], - "locations": [ - "Iceberg 2 - Enemy 1 (Gabon)", - "Iceberg 2 - Enemy 2 (Nruff)" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 1", - "level": 5, - "stage": 2, - "room": 1, - "pointer": 3334841, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Chilly", - "Pteran" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 109, - "unkn2": 20, - "x": 88, - "y": 72, - "name": "Iceberg 2 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ], - [ - 0, - 16 - ], - [ - 4, - 16 - ], - [ - 39, - 16 - ] - ], - "locations": [ - "Iceberg 2 - Enemy 3 (Waddle Dee)", - "Iceberg 2 - Enemy 4 (Chilly)", - "Iceberg 2 - Enemy 5 (Pteran)" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 2", - "level": 5, - "stage": 2, - "room": 2, - "pointer": 3473408, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Glunk", - "Galbo", - "Babut", - "Magoo" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 102, - "unkn2": 5, - "x": 88, - "y": 152, - "name": "Iceberg 2 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 24, - "unkn2": 18, - "x": 88, - "y": 152, - "name": "Iceberg 2 - 2 Exit 1", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 37, - "unkn2": 26, - "x": 200, - "y": 184, - "name": "Iceberg 2 - 2 Exit 2", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 55, - "unkn2": 26, - "x": 200, - "y": 184, - "name": "Iceberg 2 - 2 Exit 3", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 73, - "unkn2": 26, - "x": 200, - "y": 184, - "name": "Iceberg 2 - 2 Exit 4", - "access_rule": [] - } - ], - "entity_load": [ - [ - 53, - 16 - ], - [ - 26, - 16 - ], - [ - 43, - 16 - ], - [ - 14, - 23 - ], - [ - 16, - 16 - ] - ], - "locations": [ - "Iceberg 2 - Enemy 6 (Glunk)", - "Iceberg 2 - Enemy 7 (Galbo)", - "Iceberg 2 - Enemy 8 (Babut)", - "Iceberg 2 - Enemy 9 (Magoo)" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 3", - "level": 5, - "stage": 2, - "room": 3, - "pointer": 3037006, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 11, - "unkn2": 11, - "x": 616, - "y": 424, - "name": "Iceberg 2 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 19 - ], - [ - 14, - 23 - ] - ], - "locations": [], - "music": 20 - }, - { - "name": "Iceberg 2 - 4", - "level": 5, - "stage": 2, - "room": 4, - "pointer": 3035198, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 11, - "unkn2": 11, - "x": 904, - "y": 424, - "name": "Iceberg 2 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 19 - ], - [ - 14, - 23 - ] - ], - "locations": [], - "music": 20 - }, - { - "name": "Iceberg 2 - 5", - "level": 5, - "stage": 2, - "room": 5, - "pointer": 3128551, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 11, - "unkn2": 11, - "x": 1192, - "y": 424, - "name": "Iceberg 2 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 19 - ], - [ - 14, - 23 - ] - ], - "locations": [], - "music": 20 - }, - { - "name": "Iceberg 2 - 6", - "level": 5, - "stage": 2, - "room": 6, - "pointer": 3270857, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Nidoo", - "Oro" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 65, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Iceberg 2 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 62, - 16 - ], - [ - 4, - 22 - ], - [ - 89, - 16 - ], - [ - 28, - 16 - ], - [ - 25, - 16 - ] - ], - "locations": [ - "Iceberg 2 - Enemy 10 (Propeller)", - "Iceberg 2 - Enemy 11 (Nidoo)", - "Iceberg 2 - Enemy 12 (Oro)" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 7", - "level": 5, - "stage": 2, - "room": 7, - "pointer": 3212501, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Klinko", - "Bronto Burt" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 124, - "unkn2": 8, - "x": 72, - "y": 152, - "name": "Iceberg 2 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 42, - 16 - ], - [ - 6, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 16 - ], - [ - 4, - 23 - ] - ], - "locations": [ - "Iceberg 2 - Enemy 13 (Klinko)", - "Iceberg 2 - Enemy 14 (Bronto Burt)" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 8", - "level": 5, - "stage": 2, - "room": 8, - "pointer": 2994515, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 2 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Iceberg 2 - Samus" - ], - "music": 8 - }, - { - "name": "Iceberg 2 - 9", - "level": 5, - "stage": 2, - "room": 9, - "pointer": 3058084, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 4, - "unkn2": 9, - "x": 408, - "y": 296, - "name": "Iceberg 2 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 2 - Animal 1", - "Iceberg 2 - Animal 2" - ], - "music": 39 - }, - { - "name": "Iceberg 2 - 10", - "level": 5, - "stage": 2, - "room": 10, - "pointer": 2887220, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 2 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg 3 - 0", - "level": 5, - "stage": 3, - "room": 0, - "pointer": 3455346, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Corori", - "Bouncy", - "Chilly", - "Pteran" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 98, - "unkn2": 6, - "x": 200, - "y": 232, - "name": "Iceberg 3 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 217, - "unkn2": 7, - "x": 40, - "y": 120, - "name": "Iceberg 3 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 60, - 16 - ], - [ - 6, - 16 - ], - [ - 39, - 16 - ], - [ - 13, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 3 - Enemy 1 (Corori)", - "Iceberg 3 - Enemy 2 (Bouncy)", - "Iceberg 3 - Enemy 3 (Chilly)", - "Iceberg 3 - Enemy 4 (Pteran)" - ], - "music": 14 - }, - { - "name": "Iceberg 3 - 1", - "level": 5, - "stage": 3, - "room": 1, - "pointer": 3019769, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 11, - "unkn2": 14, - "x": 1592, - "y": 104, - "name": "Iceberg 3 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 3 - Animal 1", - "Iceberg 3 - Animal 2", - "Iceberg 3 - Animal 3" - ], - "music": 38 - }, - { - "name": "Iceberg 3 - 2", - "level": 5, - "stage": 3, - "room": 2, - "pointer": 3618121, - "animal_pointers": [], - "consumables": [ - { - "idx": 2, - "pointer": 352, - "x": 1776, - "y": 104, - "etype": 22, - "vtype": 2, - "name": "Iceberg 3 - Maxim Tomato (Ceiling)" - } - ], - "consumables_pointer": 128, - "enemies": [ - "Raft Waddle Dee", - "Kapar", - "Blipper" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 196, - "unkn2": 11, - "x": 72, - "y": 152, - "name": "Iceberg 3 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 22 - ], - [ - 71, - 16 - ], - [ - 57, - 16 - ], - [ - 21, - 16 - ], - [ - 67, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 3 - Enemy 5 (Raft Waddle Dee)", - "Iceberg 3 - Enemy 6 (Kapar)", - "Iceberg 3 - Enemy 7 (Blipper)", - "Iceberg 3 - Maxim Tomato (Ceiling)" - ], - "music": 14 - }, - { - "name": "Iceberg 3 - 3", - "level": 5, - "stage": 3, - "room": 3, - "pointer": 3650368, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Wapod" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 116, - "unkn2": 11, - "x": 40, - "y": 152, - "name": "Iceberg 3 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 63, - "unkn2": 13, - "x": 184, - "y": 136, - "name": "Iceberg 3 - 3 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 6, - 16 - ], - [ - 88, - 16 - ] - ], - "locations": [ - "Iceberg 3 - Enemy 8 (Wapod)" - ], - "music": 14 - }, - { - "name": "Iceberg 3 - 4", - "level": 5, - "stage": 3, - "room": 4, - "pointer": 3038208, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 10, - "unkn2": 8, - "x": 1032, - "y": 216, - "name": "Iceberg 3 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 3 - Animal 4", - "Iceberg 3 - Animal 5" - ], - "music": 39 - }, - { - "name": "Iceberg 3 - 5", - "level": 5, - "stage": 3, - "room": 5, - "pointer": 3013938, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 15, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 3 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 30, - 19 - ] - ], - "locations": [], - "music": 31 - }, - { - "name": "Iceberg 3 - 6", - "level": 5, - "stage": 3, - "room": 6, - "pointer": 3624789, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Glunk", - "Icicle" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 211, - "unkn2": 7, - "x": 40, - "y": 152, - "name": "Iceberg 3 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ], - [ - 16, - 16 - ], - [ - 14, - 23 - ], - [ - 36, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Iceberg 3 - Enemy 9 (Glunk)", - "Iceberg 3 - Enemy 10 (Icicle)" - ], - "music": 14 - }, - { - "name": "Iceberg 3 - 7", - "level": 5, - "stage": 3, - "room": 7, - "pointer": 2989472, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 15, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 3 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 30, - 19 - ] - ], - "locations": [ - "Iceberg 3 - Chef Kawasaki" - ], - "music": 8 - }, - { - "name": "Iceberg 3 - 8", - "level": 5, - "stage": 3, - "room": 8, - "pointer": 2889871, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 3 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg 4 - 0", - "level": 5, - "stage": 4, - "room": 0, - "pointer": 3274879, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "Galbo", - "Klinko", - "Chilly" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 111, - "unkn2": 8, - "x": 72, - "y": 104, - "name": "Iceberg 4 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 42, - 16 - ], - [ - 6, - 16 - ], - [ - 2, - 16 - ], - [ - 26, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 1 (Bronto Burt)", - "Iceberg 4 - Enemy 2 (Galbo)", - "Iceberg 4 - Enemy 3 (Klinko)", - "Iceberg 4 - Enemy 4 (Chilly)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 1", - "level": 5, - "stage": 4, - "room": 1, - "pointer": 3371780, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Babut", - "Wappa" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 60, - "unkn2": 36, - "x": 216, - "y": 88, - "name": "Iceberg 4 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 43, - 16 - ], - [ - 4, - 22 - ], - [ - 44, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 5 (Babut)", - "Iceberg 4 - Enemy 6 (Wappa)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 2", - "level": 5, - "stage": 4, - "room": 2, - "pointer": 3284378, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 8, - "unkn2": 39, - "x": 168, - "y": 152, - "name": "Iceberg 4 - 2 Exit 0", - "access_rule": [ - "Burning" - ] - }, - { - "room": 3, - "unkn1": 13, - "unkn2": 39, - "x": 88, - "y": 136, - "name": "Iceberg 4 - 2 Exit 1", - "access_rule": [] - }, - { - "room": 17, - "unkn1": 18, - "unkn2": 39, - "x": 120, - "y": 152, - "name": "Iceberg 4 - 2 Exit 2", - "access_rule": [ - "Burning" - ] - } - ], - "entity_load": [ - [ - 26, - 16 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 3", - "level": 5, - "stage": 4, - "room": 3, - "pointer": 3162957, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 44, - "unkn2": 8, - "x": 216, - "y": 104, - "name": "Iceberg 4 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 69, - 16 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 4", - "level": 5, - "stage": 4, - "room": 4, - "pointer": 3261679, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Icicle" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 4, - "unkn2": 42, - "x": 104, - "y": 840, - "name": "Iceberg 4 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 36, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 7 (Icicle)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 5", - "level": 5, - "stage": 4, - "room": 5, - "pointer": 3217398, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Corori" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 19, - "unkn2": 5, - "x": 72, - "y": 120, - "name": "Iceberg 4 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 60, - 16 - ], - [ - 44, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 8 (Corori)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 6", - "level": 5, - "stage": 4, - "room": 6, - "pointer": 3108265, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 61, - "unkn2": 7, - "x": 456, - "y": 72, - "name": "Iceberg 4 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 62, - 16 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 7", - "level": 5, - "stage": 4, - "room": 7, - "pointer": 3346202, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 39, - "unkn2": 6, - "x": 168, - "y": 104, - "name": "Iceberg 4 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 13, - "unkn1": 4, - "unkn2": 21, - "x": 88, - "y": 168, - "name": "Iceberg 4 - 7 Exit 1", - "access_rule": [ - "Burning" - ] - }, - { - "room": 13, - "unkn1": 21, - "unkn2": 21, - "x": 280, - "y": 168, - "name": "Iceberg 4 - 7 Exit 2", - "access_rule": [ - "Burning" - ] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 4, - 23 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 8", - "level": 5, - "stage": 4, - "room": 8, - "pointer": 3055911, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 10, - "unkn2": 5, - "x": 648, - "y": 104, - "name": "Iceberg 4 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 16 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 9", - "level": 5, - "stage": 4, - "room": 9, - "pointer": 3056457, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 13, - "unkn2": 9, - "x": 136, - "y": 136, - "name": "Iceberg 4 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 27 - ] - ], - "locations": [ - "Iceberg 4 - Miniboss 1 (Yuki)" - ], - "music": 4 - }, - { - "name": "Iceberg 4 - 10", - "level": 5, - "stage": 4, - "room": 10, - "pointer": 3257516, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 8, - "unkn2": 37, - "x": 88, - "y": 40, - "name": "Iceberg 4 - 10 Exit 0", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 15, - "unkn2": 37, - "x": 200, - "y": 40, - "name": "Iceberg 4 - 10 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 31, - 19 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 11", - "level": 5, - "stage": 4, - "room": 11, - "pointer": 3083322, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Gabon" - ], - "default_exits": [ - { - "room": 12, - "unkn1": 46, - "unkn2": 8, - "x": 88, - "y": 120, - "name": "Iceberg 4 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 24, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 9 (Gabon)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 12", - "level": 5, - "stage": 4, - "room": 12, - "pointer": 3147724, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kabu" - ], - "default_exits": [ - { - "room": 18, - "unkn1": 64, - "unkn2": 7, - "x": 72, - "y": 456, - "name": "Iceberg 4 - 12 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 16 - ], - [ - 61, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 10 (Kabu)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 13", - "level": 5, - "stage": 4, - "room": 13, - "pointer": 3370077, - "animal_pointers": [ - 232, - 240, - 248 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 15, - "unkn1": 31, - "unkn2": 4, - "x": 216, - "y": 120, - "name": "Iceberg 4 - 13 Exit 0", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 46, - "unkn2": 10, - "x": 72, - "y": 88, - "name": "Iceberg 4 - 13 Exit 1", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 57, - "unkn2": 10, - "x": 312, - "y": 88, - "name": "Iceberg 4 - 13 Exit 2", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 28, - "unkn2": 21, - "x": 152, - "y": 136, - "name": "Iceberg 4 - 13 Exit 3", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 34, - "unkn2": 21, - "x": 280, - "y": 136, - "name": "Iceberg 4 - 13 Exit 4", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 4 - Animal 1", - "Iceberg 4 - Animal 2", - "Iceberg 4 - Animal 3" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 14", - "level": 5, - "stage": 4, - "room": 14, - "pointer": 3057002, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Broom Hatter", - "Sasuke" - ], - "default_exits": [ - { - "room": 15, - "unkn1": 4, - "unkn2": 8, - "x": 88, - "y": 360, - "name": "Iceberg 4 - 14 Exit 0", - "access_rule": [] - }, - { - "room": 13, - "unkn1": 10, - "unkn2": 8, - "x": 440, - "y": 344, - "name": "Iceberg 4 - 14 Exit 1", - "access_rule": [] - }, - { - "room": 13, - "unkn1": 16, - "unkn2": 8, - "x": 568, - "y": 344, - "name": "Iceberg 4 - 14 Exit 2", - "access_rule": [] - }, - { - "room": 15, - "unkn1": 22, - "unkn2": 8, - "x": 344, - "y": 360, - "name": "Iceberg 4 - 14 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 11, - 16 - ], - [ - 30, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 11 (Broom Hatter)", - "Iceberg 4 - Enemy 12 (Sasuke)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 15", - "level": 5, - "stage": 4, - "room": 15, - "pointer": 3116124, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 13, - "unkn1": 13, - "unkn2": 6, - "x": 520, - "y": 72, - "name": "Iceberg 4 - 15 Exit 0", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 4, - "unkn2": 22, - "x": 88, - "y": 136, - "name": "Iceberg 4 - 15 Exit 1", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 22, - "unkn2": 22, - "x": 344, - "y": 136, - "name": "Iceberg 4 - 15 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 22 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 16", - "level": 5, - "stage": 4, - "room": 16, - "pointer": 3069937, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 11, - "unkn2": 9, - "x": 152, - "y": 632, - "name": "Iceberg 4 - 16 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 4 - Animal 4" - ], - "music": 38 - }, - { - "name": "Iceberg 4 - 17", - "level": 5, - "stage": 4, - "room": 17, - "pointer": 3072413, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 6, - "unkn2": 9, - "x": 280, - "y": 632, - "name": "Iceberg 4 - 17 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 4 - Animal 5" - ], - "music": 38 - }, - { - "name": "Iceberg 4 - 18", - "level": 5, - "stage": 4, - "room": 18, - "pointer": 3404593, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nruff" - ], - "default_exits": [ - { - "room": 19, - "unkn1": 94, - "unkn2": 12, - "x": 72, - "y": 152, - "name": "Iceberg 4 - 18 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 43, - 16 - ], - [ - 30, - 16 - ], - [ - 15, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 13 (Nruff)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 19", - "level": 5, - "stage": 4, - "room": 19, - "pointer": 3075826, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 20, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 4 - 19 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 31, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Iceberg 4 - Name" - ], - "music": 8 - }, - { - "name": "Iceberg 4 - 20", - "level": 5, - "stage": 4, - "room": 20, - "pointer": 2887943, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 4 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg 5 - 0", - "level": 5, - "stage": 5, - "room": 0, - "pointer": 3316135, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Burning)", - "Bukiset (Stone)", - "Bukiset (Ice)", - "Bukiset (Needle)", - "Bukiset (Clean)", - "Bukiset (Parasol)", - "Bukiset (Spark)", - "Bukiset (Cutter)" - ], - "default_exits": [ - { - "room": 30, - "unkn1": 75, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 79, - 16 - ], - [ - 76, - 16 - ], - [ - 81, - 16 - ], - [ - 78, - 16 - ], - [ - 77, - 16 - ], - [ - 82, - 16 - ], - [ - 80, - 16 - ], - [ - 83, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 1 (Bukiset (Burning))", - "Iceberg 5 - Enemy 2 (Bukiset (Stone))", - "Iceberg 5 - Enemy 3 (Bukiset (Ice))", - "Iceberg 5 - Enemy 4 (Bukiset (Needle))", - "Iceberg 5 - Enemy 5 (Bukiset (Clean))", - "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", - "Iceberg 5 - Enemy 7 (Bukiset (Spark))", - "Iceberg 5 - Enemy 8 (Bukiset (Cutter))" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 1", - "level": 5, - "stage": 5, - "room": 1, - "pointer": 3037607, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 12, - "unkn2": 6, - "x": 72, - "y": 104, - "name": "Iceberg 5 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 2", - "level": 5, - "stage": 5, - "room": 2, - "pointer": 3103842, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Glunk" - ], - "default_exits": [ - { - "room": 25, - "unkn1": 27, - "unkn2": 6, - "x": 72, - "y": 200, - "name": "Iceberg 5 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 16, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 9 (Glunk)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 3", - "level": 5, - "stage": 5, - "room": 3, - "pointer": 3135899, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Wapod" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 20, - "unkn2": 7, - "x": 72, - "y": 88, - "name": "Iceberg 5 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 88, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 10 (Wapod)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 4", - "level": 5, - "stage": 5, - "room": 4, - "pointer": 3180695, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Tick" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 26, - "unkn2": 5, - "x": 56, - "y": 104, - "name": "Iceberg 5 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 48, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 11 (Tick)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 5", - "level": 5, - "stage": 5, - "room": 5, - "pointer": 3106064, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Madoo" - ], - "default_exits": [ - { - "room": 24, - "unkn1": 14, - "unkn2": 6, - "x": 168, - "y": 152, - "name": "Iceberg 5 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 58, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 12 (Madoo)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 6", - "level": 5, - "stage": 5, - "room": 6, - "pointer": 3276800, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 59, - "unkn2": 12, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 55, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 7", - "level": 5, - "stage": 5, - "room": 7, - "pointer": 3104585, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 26, - "unkn1": 25, - "unkn2": 7, - "x": 72, - "y": 136, - "name": "Iceberg 5 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 23, - 16 - ], - [ - 7, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 8", - "level": 5, - "stage": 5, - "room": 8, - "pointer": 3195121, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 35, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 9", - "level": 5, - "stage": 5, - "room": 9, - "pointer": 3087198, - "animal_pointers": [], - "consumables": [ - { - "idx": 16, - "pointer": 200, - "x": 256, - "y": 88, - "etype": 22, - "vtype": 0, - "name": "Iceberg 5 - 1-Up (Boulder)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 28, - "unkn1": 20, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 22 - ], - [ - 54, - 16 - ] - ], - "locations": [ - "Iceberg 5 - 1-Up (Boulder)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 10", - "level": 5, - "stage": 5, - "room": 10, - "pointer": 3321612, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 32, - "unkn1": 45, - "unkn2": 15, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 11", - "level": 5, - "stage": 5, - "room": 11, - "pointer": 3139178, - "animal_pointers": [], - "consumables": [ - { - "idx": 17, - "pointer": 192, - "x": 152, - "y": 168, - "etype": 22, - "vtype": 0, - "name": "Iceberg 5 - 1-Up (Floor)" - } - ], - "consumables_pointer": 176, - "enemies": [ - "Yaban" - ], - "default_exits": [ - { - "room": 12, - "unkn1": 17, - "unkn2": 7, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 32, - 16 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 13 (Yaban)", - "Iceberg 5 - 1-Up (Floor)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 12", - "level": 5, - "stage": 5, - "room": 12, - "pointer": 3118231, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller" - ], - "default_exits": [ - { - "room": 13, - "unkn1": 13, - "unkn2": 7, - "x": 72, - "y": 104, - "name": "Iceberg 5 - 12 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 89, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 14 (Propeller)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 13", - "level": 5, - "stage": 5, - "room": 13, - "pointer": 3021658, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Mariel" - ], - "default_exits": [ - { - "room": 27, - "unkn1": 16, - "unkn2": 6, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 13 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 45, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 15 (Mariel)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 14", - "level": 5, - "stage": 5, - "room": 14, - "pointer": 3025398, - "animal_pointers": [], - "consumables": [ - { - "idx": 24, - "pointer": 200, - "x": 208, - "y": 88, - "etype": 22, - "vtype": 0, - "name": "Iceberg 5 - 1-Up (Peloo)" - } - ], - "consumables_pointer": 176, - "enemies": [], - "default_exits": [ - { - "room": 15, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 216, - "name": "Iceberg 5 - 14 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 64, - 16 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Iceberg 5 - 1-Up (Peloo)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 15", - "level": 5, - "stage": 5, - "room": 15, - "pointer": 3167445, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Pteran" - ], - "default_exits": [ - { - "room": 16, - "unkn1": 13, - "unkn2": 13, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 15 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 39, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 16 (Pteran)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 16", - "level": 5, - "stage": 5, - "room": 16, - "pointer": 3033990, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 33, - "unkn1": 36, - "unkn2": 9, - "x": 168, - "y": 152, - "name": "Iceberg 5 - 16 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 68, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 17", - "level": 5, - "stage": 5, - "room": 17, - "pointer": 3100111, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 20, - "unkn1": 40, - "unkn2": 7, - "x": 72, - "y": 200, - "name": "Iceberg 5 - 17 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 52, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 18", - "level": 5, - "stage": 5, - "room": 18, - "pointer": 3030947, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo" - ], - "default_exits": [ - { - "room": 17, - "unkn1": 13, - "unkn2": 7, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 18 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 17 (Galbo)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 19", - "level": 5, - "stage": 5, - "room": 19, - "pointer": 3105326, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "KeKe" - ], - "default_exits": [ - { - "room": 21, - "unkn1": 13, - "unkn2": 4, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 19 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 51, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 18 (KeKe)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 20", - "level": 5, - "stage": 5, - "room": 20, - "pointer": 3118928, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nidoo" - ], - "default_exits": [ - { - "room": 19, - "unkn1": 13, - "unkn2": 6, - "x": 72, - "y": 264, - "name": "Iceberg 5 - 20 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 19 (Nidoo)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 21", - "level": 5, - "stage": 5, - "room": 21, - "pointer": 3202517, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee Drawing", - "Bronto Burt Drawing", - "Bouncy Drawing" - ], - "default_exits": [ - { - "room": 22, - "unkn1": 29, - "unkn2": 9, - "x": 72, - "y": 72, - "name": "Iceberg 5 - 21 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 84, - 16 - ], - [ - 85, - 16 - ], - [ - 86, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", - "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", - "Iceberg 5 - Enemy 22 (Bouncy Drawing)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 22", - "level": 5, - "stage": 5, - "room": 22, - "pointer": 3014656, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Joe" - ], - "default_exits": [ - { - "room": 23, - "unkn1": 13, - "unkn2": 4, - "x": 72, - "y": 104, - "name": "Iceberg 5 - 22 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 91, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 23 (Joe)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 23", - "level": 5, - "stage": 5, - "room": 23, - "pointer": 3166550, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kapar" - ], - "default_exits": [ - { - "room": 34, - "unkn1": 27, - "unkn2": 6, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 23 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 67, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 24 (Kapar)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 24", - "level": 5, - "stage": 5, - "room": 24, - "pointer": 3029110, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Gansan" - ], - "default_exits": [ - { - "room": 31, - "unkn1": 10, - "unkn2": 4, - "x": 72, - "y": 88, - "name": "Iceberg 5 - 24 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 75, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 25 (Gansan)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 25", - "level": 5, - "stage": 5, - "room": 25, - "pointer": 3156420, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sasuke" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 25, - "unkn2": 7, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 25 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 30, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 26 (Sasuke)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 26", - "level": 5, - "stage": 5, - "room": 26, - "pointer": 3127877, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Togezo" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 24, - "unkn2": 8, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 26 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 18, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 27 (Togezo)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 27", - "level": 5, - "stage": 5, - "room": 27, - "pointer": 3256471, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky", - "Bobin" - ], - "default_exits": [ - { - "room": 14, - "unkn1": 26, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 27 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 8, - 16 - ], - [ - 73, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 28 (Sparky)", - "Iceberg 5 - Enemy 29 (Bobin)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 28", - "level": 5, - "stage": 5, - "room": 28, - "pointer": 3029723, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Chilly" - ], - "default_exits": [ - { - "room": 10, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 248, - "name": "Iceberg 5 - 28 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 30 (Chilly)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 29", - "level": 5, - "stage": 5, - "room": 29, - "pointer": 3526568, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 36, - "unkn1": 10, - "unkn2": 6, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 29 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ], - [ - 31, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 30", - "level": 5, - "stage": 5, - "room": 30, - "pointer": 3022285, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 13, - "unkn2": 5, - "x": 88, - "y": 104, - "name": "Iceberg 5 - 30 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 5 - Animal 1", - "Iceberg 5 - Animal 2" - ], - "music": 40 - }, - { - "name": "Iceberg 5 - 31", - "level": 5, - "stage": 5, - "room": 31, - "pointer": 3026019, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 200, - "name": "Iceberg 5 - 31 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 5 - Animal 3", - "Iceberg 5 - Animal 4" - ], - "music": 40 - }, - { - "name": "Iceberg 5 - 32", - "level": 5, - "stage": 5, - "room": 32, - "pointer": 3039996, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 13, - "unkn2": 7, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 32 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 5 - Animal 5", - "Iceberg 5 - Animal 6" - ], - "music": 40 - }, - { - "name": "Iceberg 5 - 33", - "level": 5, - "stage": 5, - "room": 33, - "pointer": 3015302, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 18, - "unkn1": 10, - "unkn2": 6, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 33 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 5 - Animal 7", - "Iceberg 5 - Animal 8" - ], - "music": 40 - }, - { - "name": "Iceberg 5 - 34", - "level": 5, - "stage": 5, - "room": 34, - "pointer": 3185868, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Peran" - ], - "default_exits": [ - { - "room": 35, - "unkn1": 35, - "unkn2": 9, - "x": 200, - "y": 328, - "name": "Iceberg 5 - 34 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 72, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 31 (Peran)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 35", - "level": 5, - "stage": 5, - "room": 35, - "pointer": 3865635, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 29, - "unkn1": 12, - "unkn2": 7, - "x": 168, - "y": 1384, - "name": "Iceberg 5 - 35 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 17, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 36", - "level": 5, - "stage": 5, - "room": 36, - "pointer": 3024154, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 37, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 36 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 32, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Iceberg 5 - Shiro" - ], - "music": 8 - }, - { - "name": "Iceberg 5 - 37", - "level": 5, - "stage": 5, - "room": 37, - "pointer": 2890594, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 5 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg 6 - 0", - "level": 5, - "stage": 6, - "room": 0, - "pointer": 3385305, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nruff" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 6, - "unkn2": 28, - "x": 136, - "y": 184, - "name": "Iceberg 6 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 12, - "unkn2": 28, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 0 Exit 1", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 18, - "unkn2": 28, - "x": 360, - "y": 184, - "name": "Iceberg 6 - 0 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 16 - ] - ], - "locations": [ - "Iceberg 6 - Enemy 1 (Nruff)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 1", - "level": 5, - "stage": 6, - "room": 1, - "pointer": 3197599, - "animal_pointers": [ - 212, - 220, - 228 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 8, - "unkn2": 5, - "x": 152, - "y": 184, - "name": "Iceberg 6 - 1 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 15, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 1 Exit 1", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 22, - "unkn2": 5, - "x": 344, - "y": 184, - "name": "Iceberg 6 - 1 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 6 - Animal 1", - "Iceberg 6 - Animal 2", - "Iceberg 6 - Animal 3" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 2", - "level": 5, - "stage": 6, - "room": 2, - "pointer": 3097113, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 9, - "unkn2": 5, - "x": 136, - "y": 184, - "name": "Iceberg 6 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 15, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 2 Exit 1", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 21, - "unkn2": 5, - "x": 360, - "y": 184, - "name": "Iceberg 6 - 2 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 3", - "level": 5, - "stage": 6, - "room": 3, - "pointer": 3198422, - "animal_pointers": [ - 212, - 220, - 228 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 8, - "unkn2": 5, - "x": 152, - "y": 184, - "name": "Iceberg 6 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 15, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 3 Exit 1", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 22, - "unkn2": 5, - "x": 344, - "y": 184, - "name": "Iceberg 6 - 3 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 6 - Animal 4", - "Iceberg 6 - Animal 5", - "Iceberg 6 - Animal 6" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 4", - "level": 5, - "stage": 6, - "room": 4, - "pointer": 3210507, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 9, - "unkn2": 5, - "x": 136, - "y": 184, - "name": "Iceberg 6 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 15, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 4 Exit 1", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 21, - "unkn2": 5, - "x": 360, - "y": 184, - "name": "Iceberg 6 - 4 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 5", - "level": 5, - "stage": 6, - "room": 5, - "pointer": 3196776, - "animal_pointers": [], - "consumables": [ - { - "idx": 0, - "pointer": 212, - "x": 136, - "y": 120, - "etype": 22, - "vtype": 2, - "name": "Iceberg 6 - Maxim Tomato (Left)" - }, - { - "idx": 1, - "pointer": 220, - "x": 248, - "y": 120, - "etype": 22, - "vtype": 0, - "name": "Iceberg 6 - 1-Up (Middle)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 8, - "unkn2": 5, - "x": 152, - "y": 184, - "name": "Iceberg 6 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 15, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 5 Exit 1", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 22, - "unkn2": 5, - "x": 344, - "y": 184, - "name": "Iceberg 6 - 5 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 22 - ], - [ - 0, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 6 - Maxim Tomato (Left)", - "Iceberg 6 - 1-Up (Middle)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 6", - "level": 5, - "stage": 6, - "room": 6, - "pointer": 3208130, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nidoo" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 9, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 16 - ] - ], - "locations": [ - "Iceberg 6 - Enemy 2 (Nidoo)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 7", - "level": 5, - "stage": 6, - "room": 7, - "pointer": 3124478, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 17, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 8, - 16 - ] - ], - "locations": [ - "Iceberg 6 - Enemy 3 (Sparky)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 8", - "level": 5, - "stage": 6, - "room": 8, - "pointer": 3110431, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 7, - "unkn2": 5, - "x": 152, - "y": 168, - "name": "Iceberg 6 - 8 Exit 0", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 14, - "unkn2": 5, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 8 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 22 - ], - [ - 33, - 19 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 9", - "level": 5, - "stage": 6, - "room": 9, - "pointer": 3139832, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 16, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 1 (Blocky)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 10", - "level": 5, - "stage": 6, - "room": 10, - "pointer": 3119624, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 7, - "unkn2": 5, - "x": 152, - "y": 168, - "name": "Iceberg 6 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 11", - "level": 5, - "stage": 6, - "room": 11, - "pointer": 3141139, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 12, - "unkn1": 16, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 2 (Jumper Shoot)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 12", - "level": 5, - "stage": 6, - "room": 12, - "pointer": 3123788, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 13, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 12 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 13", - "level": 5, - "stage": 6, - "room": 13, - "pointer": 3143741, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 14, - "unkn1": 15, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 13 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 3 (Yuki)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 14", - "level": 5, - "stage": 6, - "room": 14, - "pointer": 3120319, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 15, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 14 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 15", - "level": 5, - "stage": 6, - "room": 15, - "pointer": 3135238, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble" - ], - "default_exits": [ - { - "room": 16, - "unkn1": 15, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 15 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 27, - 16 - ] - ], - "locations": [ - "Iceberg 6 - Enemy 4 (Sir Kibble)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 16", - "level": 5, - "stage": 6, - "room": 16, - "pointer": 3123096, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 17, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 16 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 22 - ], - [ - 33, - 19 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 17", - "level": 5, - "stage": 6, - "room": 17, - "pointer": 3144389, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 18, - "unkn1": 15, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 17 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 4 (Haboki)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 18", - "level": 5, - "stage": 6, - "room": 18, - "pointer": 3121014, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 19, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 18 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 19", - "level": 5, - "stage": 6, - "room": 19, - "pointer": 3017228, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 20, - "unkn1": 15, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 19 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 5 (Boboo)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 20", - "level": 5, - "stage": 6, - "room": 20, - "pointer": 3121709, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 21, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 20 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 21", - "level": 5, - "stage": 6, - "room": 21, - "pointer": 3145036, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 22, - "unkn1": 15, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 21 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 6 (Captain Stitch)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 22", - "level": 5, - "stage": 6, - "room": 22, - "pointer": 3116830, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 23, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 152, - "name": "Iceberg 6 - 22 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 23", - "level": 5, - "stage": 6, - "room": 23, - "pointer": 3045263, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 24, - "unkn1": 17, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 6 - 23 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Iceberg 6 - Angel" - ], - "music": 8 - }, - { - "name": "Iceberg 6 - 24", - "level": 5, - "stage": 6, - "room": 24, - "pointer": 2889389, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 6 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg Boss - 0", - "level": 5, - "stage": 7, - "room": 0, - "pointer": 2980207, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 8, - 18 - ] - ], - "locations": [ - "Iceberg - Boss (Dedede) Purified", - "Level 5 Boss" - ], - "music": 7 - } -] \ No newline at end of file +[{"name": "Grass Land 1 - 0", "level": 1, "stage": 1, "room": 0, "pointer": 3434257, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sir Kibble", "Cappy"], "default_exits": [{"room": 1, "unkn1": 205, "unkn2": 8, "x": 72, "y": 200, "name": "Grass Land 1 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 87, "unkn2": 9, "x": 104, "y": 152, "name": "Grass Land 1 - 0 Exit 1", "access_rule": []}], "entity_load": [[0, 16], [1, 23], [0, 23], [14, 23], [27, 16], [12, 16], [4, 22]], "locations": ["Grass Land 1 - Enemy 1 (Waddle Dee)", "Grass Land 1 - Enemy 2 (Sir Kibble)", "Grass Land 1 - Enemy 3 (Cappy)"], "music": 20}, {"name": "Grass Land 1 - 1", "level": 1, "stage": 1, "room": 1, "pointer": 3368373, "animal_pointers": [], "consumables": [{"idx": 14, "pointer": 264, "x": 928, "y": 160, "etype": 22, "vtype": 0, "name": "Grass Land 1 - 1-Up (Parasol)"}, {"idx": 15, "pointer": 312, "x": 1456, "y": 176, "etype": 22, "vtype": 2, "name": "Grass Land 1 - Maxim Tomato (Spark)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Bronto Burt", "Sasuke"], "default_exits": [{"room": 3, "unkn1": 143, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [30, 16], [12, 16], [14, 23], [8, 16], [0, 22], [2, 22]], "locations": ["Grass Land 1 - Enemy 4 (Sparky)", "Grass Land 1 - Enemy 5 (Bronto Burt)", "Grass Land 1 - Enemy 6 (Sasuke)", "Grass Land 1 - 1-Up (Parasol)", "Grass Land 1 - Maxim Tomato (Spark)"], "music": 20}, {"name": "Grass Land 1 - 2", "level": 1, "stage": 1, "room": 2, "pointer": 2960650, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 1416, "y": 152, "name": "Grass Land 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 1 - Animal 1", "Grass Land 1 - Animal 2"], "music": 38}, {"name": "Grass Land 1 - 3", "level": 1, "stage": 1, "room": 3, "pointer": 3478442, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 179, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [7, 16], [0, 23], [6, 22], [14, 23], [8, 16], [1, 23]], "locations": ["Grass Land 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 20}, {"name": "Grass Land 1 - 4", "level": 1, "stage": 1, "room": 4, "pointer": 2978390, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [42, 19]], "locations": ["Grass Land 1 - Tulip"], "music": 8}, {"name": "Grass Land 1 - 5", "level": 1, "stage": 1, "room": 5, "pointer": 2890835, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 1 - Complete"], "music": 5}, {"name": "Grass Land 2 - 0", "level": 1, "stage": 2, "room": 0, "pointer": 3293347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "KeKe", "Bobo", "Poppy Bros Jr."], "default_exits": [{"room": 1, "unkn1": 112, "unkn2": 9, "x": 72, "y": 152, "name": "Grass Land 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [7, 16], [5, 16], [4, 22], [51, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 1 (Rocky)", "Grass Land 2 - Enemy 2 (KeKe)", "Grass Land 2 - Enemy 3 (Bobo)", "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)"], "music": 11}, {"name": "Grass Land 2 - 1", "level": 1, "stage": 2, "room": 1, "pointer": 3059685, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 9, "x": 56, "y": 136, "name": "Grass Land 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 2 - Animal 1", "Grass Land 2 - Animal 2"], "music": 39}, {"name": "Grass Land 2 - 2", "level": 1, "stage": 2, "room": 2, "pointer": 3432109, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Popon Ball", "Bouncy"], "default_exits": [{"room": 4, "unkn1": 133, "unkn2": 11, "x": 72, "y": 200, "name": "Grass Land 2 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 52, "unkn2": 12, "x": 56, "y": 152, "name": "Grass Land 2 - 2 Exit 1", "access_rule": []}], "entity_load": [[13, 16], [50, 16], [4, 22], [3, 16], [0, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 5 (Waddle Dee)", "Grass Land 2 - Enemy 6 (Popon Ball)", "Grass Land 2 - Enemy 7 (Bouncy)"], "music": 11}, {"name": "Grass Land 2 - 3", "level": 1, "stage": 2, "room": 3, "pointer": 2970029, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 2, "unkn2": 9, "x": 840, "y": 168, "name": "Grass Land 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 19]], "locations": [], "music": 11}, {"name": "Grass Land 2 - 4", "level": 1, "stage": 2, "room": 4, "pointer": 3578022, "animal_pointers": [], "consumables": [{"idx": 20, "pointer": 272, "x": 992, "y": 192, "etype": 22, "vtype": 0, "name": "Grass Land 2 - 1-Up (Needle)"}], "consumables_pointer": 352, "enemies": ["Tick", "Bronto Burt", "Nruff"], "default_exits": [{"room": 5, "unkn1": 154, "unkn2": 12, "x": 72, "y": 152, "name": "Grass Land 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [5, 16], [2, 16], [48, 16], [14, 23], [0, 22]], "locations": ["Grass Land 2 - Enemy 8 (Tick)", "Grass Land 2 - Enemy 9 (Bronto Burt)", "Grass Land 2 - Enemy 10 (Nruff)", "Grass Land 2 - 1-Up (Needle)"], "music": 11}, {"name": "Grass Land 2 - 5", "level": 1, "stage": 2, "room": 5, "pointer": 2966057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 19], [42, 19]], "locations": ["Grass Land 2 - Muchimuchi"], "music": 8}, {"name": "Grass Land 2 - 6", "level": 1, "stage": 2, "room": 6, "pointer": 2887461, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 2 - Complete"], "music": 5}, {"name": "Grass Land 3 - 0", "level": 1, "stage": 3, "room": 0, "pointer": 3149707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Rocky", "Nruff"], "default_exits": [{"room": 1, "unkn1": 107, "unkn2": 7, "x": 72, "y": 840, "name": "Grass Land 3 - 0 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 46, "unkn2": 9, "x": 152, "y": 152, "name": "Grass Land 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [14, 23], [15, 16], [0, 16], [8, 16]], "locations": ["Grass Land 3 - Enemy 1 (Sparky)", "Grass Land 3 - Enemy 2 (Rocky)", "Grass Land 3 - Enemy 3 (Nruff)"], "music": 19}, {"name": "Grass Land 3 - 1", "level": 1, "stage": 3, "room": 1, "pointer": 3204939, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 360, "x": 208, "y": 344, "etype": 22, "vtype": 0, "name": "Grass Land 3 - 1-Up (Climb)"}, {"idx": 11, "pointer": 376, "x": 224, "y": 568, "etype": 22, "vtype": 2, "name": "Grass Land 3 - Maxim Tomato (Climb)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [6, 23], [2, 22], [5, 23], [14, 23], [1, 23], [0, 23], [31, 16]], "locations": ["Grass Land 3 - 1-Up (Climb)", "Grass Land 3 - Maxim Tomato (Climb)"], "music": 19}, {"name": "Grass Land 3 - 2", "level": 1, "stage": 3, "room": 2, "pointer": 3200066, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 55, "x": 56, "y": 152, "name": "Grass Land 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [14, 23]], "locations": [], "music": 19}, {"name": "Grass Land 3 - 3", "level": 1, "stage": 3, "room": 3, "pointer": 2959784, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 15, "unkn2": 9, "x": 56, "y": 120, "name": "Grass Land 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 31}, {"name": "Grass Land 3 - 4", "level": 1, "stage": 3, "room": 4, "pointer": 2979121, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 8, "unkn2": 9, "x": 760, "y": 152, "name": "Grass Land 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 3 - Animal 1", "Grass Land 3 - Animal 2"], "music": 40}, {"name": "Grass Land 3 - 5", "level": 1, "stage": 3, "room": 5, "pointer": 2997811, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 8}, {"name": "Grass Land 3 - 6", "level": 1, "stage": 3, "room": 6, "pointer": 3084876, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bouncy"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [14, 16], [1, 23], [59, 16], [14, 23]], "locations": ["Grass Land 3 - Pitcherman", "Grass Land 3 - Enemy 4 (Bouncy)"], "music": 19}, {"name": "Grass Land 3 - 7", "level": 1, "stage": 3, "room": 7, "pointer": 2891317, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 3 - Complete"], "music": 5}, {"name": "Grass Land 4 - 0", "level": 1, "stage": 4, "room": 0, "pointer": 3471284, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Babut", "Rocky"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 13, "x": 72, "y": 136, "name": "Grass Land 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [14, 23], [40, 16], [61, 16], [4, 22]], "locations": ["Grass Land 4 - Enemy 1 (Loud)", "Grass Land 4 - Enemy 2 (Babut)", "Grass Land 4 - Enemy 3 (Rocky)"], "music": 10}, {"name": "Grass Land 4 - 1", "level": 1, "stage": 4, "room": 1, "pointer": 3436401, "animal_pointers": [], "consumables": [{"idx": 12, "pointer": 290, "x": 1008, "y": 144, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Zebon Right)"}], "consumables_pointer": 368, "enemies": ["Kapar"], "default_exits": [{"room": 5, "unkn1": 58, "unkn2": 5, "x": 184, "y": 312, "name": "Grass Land 4 - 1 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 42, "unkn2": 18, "x": 168, "y": 88, "name": "Grass Land 4 - 1 Exit 1", "access_rule": []}], "entity_load": [[43, 16], [10, 23], [6, 22], [14, 23], [2, 22], [67, 16]], "locations": ["Grass Land 4 - Enemy 4 (Kapar)", "Grass Land 4 - Maxim Tomato (Zebon Right)"], "music": 10}, {"name": "Grass Land 4 - 2", "level": 1, "stage": 4, "room": 2, "pointer": 3039401, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 4, "x": 56, "y": 72, "name": "Grass Land 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": [], "music": 9}, {"name": "Grass Land 4 - 3", "level": 1, "stage": 4, "room": 3, "pointer": 3722714, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 280, "x": 856, "y": 224, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Gordo)"}, {"idx": 22, "pointer": 480, "x": 1352, "y": 112, "etype": 22, "vtype": 0, "name": "Grass Land 4 - 1-Up (Gordo)"}], "consumables_pointer": 288, "enemies": ["Glunk", "Oro"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 5, "x": 72, "y": 200, "name": "Grass Land 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [55, 16], [16, 16], [25, 16], [14, 23], [0, 22], [2, 22], [4, 22]], "locations": ["Grass Land 4 - Enemy 5 (Glunk)", "Grass Land 4 - Enemy 6 (Oro)", "Grass Land 4 - Maxim Tomato (Gordo)", "Grass Land 4 - 1-Up (Gordo)"], "music": 10}, {"name": "Grass Land 4 - 4", "level": 1, "stage": 4, "room": 4, "pointer": 3304980, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 208, "x": 488, "y": 64, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Cliff)"}], "consumables_pointer": 160, "enemies": [], "default_exits": [{"room": 8, "unkn1": 94, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [2, 22], [54, 16], [1, 16], [40, 16], [14, 23]], "locations": ["Grass Land 4 - Maxim Tomato (Cliff)"], "music": 10}, {"name": "Grass Land 4 - 5", "level": 1, "stage": 4, "room": 5, "pointer": 3498127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 2, "unkn1": 61, "unkn2": 13, "x": 56, "y": 72, "name": "Grass Land 4 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 61, "unkn2": 18, "x": 56, "y": 200, "name": "Grass Land 4 - 5 Exit 1", "access_rule": []}], "entity_load": [[72, 16], [43, 16], [4, 22], [14, 23], [10, 23], [3, 16]], "locations": ["Grass Land 4 - Enemy 7 (Peran)"], "music": 10}, {"name": "Grass Land 4 - 6", "level": 1, "stage": 4, "room": 6, "pointer": 3160191, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 28, "unkn2": 4, "x": 72, "y": 376, "name": "Grass Land 4 - 6 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 28, "unkn2": 12, "x": 72, "y": 440, "name": "Grass Land 4 - 6 Exit 1", "access_rule": []}], "entity_load": [[3, 19], [6, 23]], "locations": [], "music": 10}, {"name": "Grass Land 4 - 7", "level": 1, "stage": 4, "room": 7, "pointer": 3035801, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 12, "x": 56, "y": 200, "name": "Grass Land 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Grass Land 4 - Miniboss 1 (Boboo)"], "music": 4}, {"name": "Grass Land 4 - 8", "level": 1, "stage": 4, "room": 8, "pointer": 2989794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[3, 19], [42, 19]], "locations": ["Grass Land 4 - Chao & Goku"], "music": 8}, {"name": "Grass Land 4 - 9", "level": 1, "stage": 4, "room": 9, "pointer": 3043518, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 9, "unkn2": 5, "x": 696, "y": 296, "name": "Grass Land 4 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 4 - Animal 1", "Grass Land 4 - Animal 2"], "music": 38}, {"name": "Grass Land 4 - 10", "level": 1, "stage": 4, "room": 10, "pointer": 2888425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 4 - Complete"], "music": 5}, {"name": "Grass Land 5 - 0", "level": 1, "stage": 5, "room": 0, "pointer": 3303565, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 1, "unkn1": 120, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [4, 22], [14, 23], [6, 23], [11, 16], [89, 16]], "locations": ["Grass Land 5 - Enemy 1 (Propeller)", "Grass Land 5 - Enemy 2 (Broom Hatter)", "Grass Land 5 - Enemy 3 (Bouncy)"], "music": 11}, {"name": "Grass Land 5 - 1", "level": 1, "stage": 5, "room": 1, "pointer": 3048718, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 3, "unkn1": 18, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 21, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 36, "unkn2": 9, "x": 56, "y": 88, "name": "Grass Land 5 - 1 Exit 2", "access_rule": []}], "entity_load": [[27, 16], [14, 23]], "locations": ["Grass Land 5 - Enemy 4 (Sir Kibble)"], "music": 11}, {"name": "Grass Land 5 - 2", "level": 1, "stage": 5, "room": 2, "pointer": 3327019, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sasuke", "Nruff"], "default_exits": [{"room": 7, "unkn1": 121, "unkn2": 6, "x": 56, "y": 72, "name": "Grass Land 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [4, 22], [30, 16], [15, 16], [1, 16]], "locations": ["Grass Land 5 - Enemy 5 (Waddle Dee)", "Grass Land 5 - Enemy 6 (Sasuke)", "Grass Land 5 - Enemy 7 (Nruff)"], "music": 11}, {"name": "Grass Land 5 - 3", "level": 1, "stage": 5, "room": 3, "pointer": 2966459, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 312, "y": 72, "name": "Grass Land 5 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 1", "Grass Land 5 - Animal 2"], "music": 38}, {"name": "Grass Land 5 - 4", "level": 1, "stage": 5, "room": 4, "pointer": 2973509, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 360, "y": 72, "name": "Grass Land 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 3", "Grass Land 5 - Animal 4"], "music": 38}, {"name": "Grass Land 5 - 5", "level": 1, "stage": 5, "room": 5, "pointer": 2962351, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[4, 19], [42, 19]], "locations": ["Grass Land 5 - Mine"], "music": 8}, {"name": "Grass Land 5 - 6", "level": 1, "stage": 5, "room": 6, "pointer": 2886738, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 5 - Complete"], "music": 5}, {"name": "Grass Land 5 - 7", "level": 1, "stage": 5, "room": 7, "pointer": 3255423, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [4, 22], [14, 23]], "locations": ["Grass Land 5 - Enemy 8 (Tick)"], "music": 11}, {"name": "Grass Land 6 - 0", "level": 1, "stage": 6, "room": 0, "pointer": 3376872, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Togezo", "Bronto Burt", "Cappy"], "default_exits": [{"room": 6, "unkn1": 51, "unkn2": 9, "x": 216, "y": 152, "name": "Grass Land 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 96, "unkn2": 9, "x": 216, "y": 1144, "name": "Grass Land 6 - 0 Exit 1", "access_rule": []}], "entity_load": [[12, 16], [18, 16], [2, 16], [41, 16], [4, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 1 (Como)", "Grass Land 6 - Enemy 2 (Togezo)", "Grass Land 6 - Enemy 3 (Bronto Burt)", "Grass Land 6 - Enemy 4 (Cappy)"], "music": 20}, {"name": "Grass Land 6 - 1", "level": 1, "stage": 6, "room": 1, "pointer": 3395125, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 192, "x": 104, "y": 1144, "etype": 22, "vtype": 0, "name": "Grass Land 6 - 1-Up (Tower)"}], "consumables_pointer": 256, "enemies": ["Bobo", "Mariel"], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 5, "x": 72, "y": 88, "name": "Grass Land 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [5, 19], [45, 16], [0, 22], [4, 22], [14, 23], [55, 16]], "locations": ["Grass Land 6 - Enemy 5 (Bobo)", "Grass Land 6 - Enemy 6 (Mariel)", "Grass Land 6 - 1-Up (Tower)"], "music": 20}, {"name": "Grass Land 6 - 2", "level": 1, "stage": 6, "room": 2, "pointer": 3375177, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter"], "default_exits": [{"room": 3, "unkn1": 93, "unkn2": 6, "x": 200, "y": 152, "name": "Grass Land 6 - 2 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 49, "unkn2": 7, "x": 216, "y": 104, "name": "Grass Land 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[11, 16], [45, 16], [41, 16], [4, 22], [32, 16], [14, 23]], "locations": ["Grass Land 6 - Enemy 7 (Yaban)", "Grass Land 6 - Enemy 8 (Broom Hatter)"], "music": 20}, {"name": "Grass Land 6 - 3", "level": 1, "stage": 6, "room": 3, "pointer": 3322977, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Apolo", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 52, "x": 72, "y": 104, "name": "Grass Land 6 - 3 Exit 0", "access_rule": []}], "entity_load": [[41, 16], [49, 16], [30, 16], [14, 23], [4, 22]], "locations": ["Grass Land 6 - Enemy 9 (Apolo)", "Grass Land 6 - Enemy 10 (Sasuke)"], "music": 20}, {"name": "Grass Land 6 - 4", "level": 1, "stage": 6, "room": 4, "pointer": 3490819, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 192, "x": 40, "y": 104, "etype": 22, "vtype": 1, "name": "Grass Land 6 - 1-Up (Falling)"}], "consumables_pointer": 176, "enemies": ["Rocky"], "default_exits": [{"room": 5, "unkn1": 145, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [4, 22], [49, 16], [61, 16], [3, 16], [1, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 11 (Rocky)", "Grass Land 6 - 1-Up (Falling)"], "music": 20}, {"name": "Grass Land 6 - 5", "level": 1, "stage": 6, "room": 5, "pointer": 3076769, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 19], [42, 19]], "locations": ["Grass Land 6 - Pierre"], "music": 8}, {"name": "Grass Land 6 - 6", "level": 1, "stage": 6, "room": 6, "pointer": 3047576, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 9, "x": 840, "y": 152, "name": "Grass Land 6 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 1", "Grass Land 6 - Animal 2"], "music": 39}, {"name": "Grass Land 6 - 7", "level": 1, "stage": 6, "room": 7, "pointer": 3022909, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 808, "y": 120, "name": "Grass Land 6 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 3", "Grass Land 6 - Animal 4"], "music": 38}, {"name": "Grass Land 6 - 8", "level": 1, "stage": 6, "room": 8, "pointer": 2884569, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 6 - Complete"], "music": 5}, {"name": "Grass Land Boss - 0", "level": 1, "stage": 7, "room": 0, "pointer": 2984105, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[0, 18]], "locations": ["Grass Land - Boss (Whispy Woods) Purified", "Level 1 Boss"], "music": 2}, {"name": "Ripple Field 1 - 0", "level": 2, "stage": 1, "room": 0, "pointer": 3279855, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Glunk", "Broom Hatter", "Cappy"], "default_exits": [{"room": 2, "unkn1": 102, "unkn2": 8, "x": 56, "y": 152, "name": "Ripple Field 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[16, 16], [0, 16], [12, 16], [11, 16], [14, 23]], "locations": ["Ripple Field 1 - Enemy 1 (Waddle Dee)", "Ripple Field 1 - Enemy 2 (Glunk)", "Ripple Field 1 - Enemy 3 (Broom Hatter)", "Ripple Field 1 - Enemy 4 (Cappy)"], "music": 15}, {"name": "Ripple Field 1 - 1", "level": 2, "stage": 1, "room": 1, "pointer": 3588688, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 11, "x": 40, "y": 232, "name": "Ripple Field 1 - 1 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 108, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 138, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [2, 16], [3, 16], [7, 16]], "locations": ["Ripple Field 1 - Enemy 5 (Bronto Burt)", "Ripple Field 1 - Enemy 6 (Rocky)", "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 1 - 2", "level": 2, "stage": 1, "room": 2, "pointer": 2955848, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 18, "unkn2": 9, "x": 56, "y": 168, "name": "Ripple Field 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 1 - Animal 1", "Ripple Field 1 - Animal 2"], "music": 40}, {"name": "Ripple Field 1 - 3", "level": 2, "stage": 1, "room": 3, "pointer": 3558828, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin"], "default_exits": [{"room": 4, "unkn1": 171, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[73, 16], [6, 22], [14, 23], [4, 22], [0, 16], [10, 23]], "locations": ["Ripple Field 1 - Enemy 8 (Bobin)"], "music": 15}, {"name": "Ripple Field 1 - 4", "level": 2, "stage": 1, "room": 4, "pointer": 2974271, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [42, 19]], "locations": ["Ripple Field 1 - Kamuribana"], "music": 8}, {"name": "Ripple Field 1 - 5", "level": 2, "stage": 1, "room": 5, "pointer": 3051513, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 264, "name": "Ripple Field 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 6", "level": 2, "stage": 1, "room": 6, "pointer": 3049838, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1752, "y": 264, "name": "Ripple Field 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 7", "level": 2, "stage": 1, "room": 7, "pointer": 3066407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 2232, "y": 264, "name": "Ripple Field 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[7, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 8", "level": 2, "stage": 1, "room": 8, "pointer": 2889148, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 1 - Complete"], "music": 5}, {"name": "Ripple Field 2 - 0", "level": 2, "stage": 2, "room": 0, "pointer": 3342336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Coconut", "Blipper", "Sasuke"], "default_exits": [{"room": 1, "unkn1": 103, "unkn2": 15, "x": 56, "y": 104, "name": "Ripple Field 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[5, 22], [34, 16], [30, 16], [21, 16], [14, 23], [4, 22], [18, 16]], "locations": ["Ripple Field 2 - Enemy 1 (Togezo)", "Ripple Field 2 - Enemy 2 (Coconut)", "Ripple Field 2 - Enemy 3 (Blipper)", "Ripple Field 2 - Enemy 4 (Sasuke)"], "music": 10}, {"name": "Ripple Field 2 - 1", "level": 2, "stage": 2, "room": 1, "pointer": 3084099, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 23, "unkn2": 8, "x": 72, "y": 248, "name": "Ripple Field 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 1", "Ripple Field 2 - Animal 2"], "music": 39}, {"name": "Ripple Field 2 - 2", "level": 2, "stage": 2, "room": 2, "pointer": 3451207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 4, "unkn1": 31, "unkn2": 5, "x": 72, "y": 152, "name": "Ripple Field 2 - 2 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 96, "unkn2": 6, "x": 56, "y": 152, "name": "Ripple Field 2 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 56, "unkn2": 17, "x": 136, "y": 264, "name": "Ripple Field 2 - 2 Exit 2", "access_rule": []}], "entity_load": [[29, 16], [47, 16], [1, 16], [46, 16], [14, 23]], "locations": ["Ripple Field 2 - Enemy 5 (Kany)"], "music": 10}, {"name": "Ripple Field 2 - 3", "level": 2, "stage": 2, "room": 3, "pointer": 3674327, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 480, "x": 1384, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 2 - Maxim Tomato (Currents)"}, {"idx": 10, "pointer": 520, "x": 1456, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 2 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Glunk"], "default_exits": [{"room": 2, "unkn1": 134, "unkn2": 5, "x": 40, "y": 136, "name": "Ripple Field 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [14, 23], [16, 16], [21, 16], [4, 22]], "locations": ["Ripple Field 2 - Enemy 6 (Glunk)", "Ripple Field 2 - Maxim Tomato (Currents)", "Ripple Field 2 - 1-Up (Currents)"], "music": 10}, {"name": "Ripple Field 2 - 4", "level": 2, "stage": 2, "room": 4, "pointer": 2972744, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 3, "unkn2": 9, "x": 520, "y": 88, "name": "Ripple Field 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[8, 19]], "locations": [], "music": 10}, {"name": "Ripple Field 2 - 5", "level": 2, "stage": 2, "room": 5, "pointer": 3109710, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 16, "x": 1048, "y": 280, "name": "Ripple Field 2 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 3", "Ripple Field 2 - Animal 4"], "music": 38}, {"name": "Ripple Field 2 - 6", "level": 2, "stage": 2, "room": 6, "pointer": 2973127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[8, 19], [42, 19]], "locations": ["Ripple Field 2 - Bakasa"], "music": 8}, {"name": "Ripple Field 2 - 7", "level": 2, "stage": 2, "room": 7, "pointer": 2890353, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 2 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 0", "level": 2, "stage": 3, "room": 0, "pointer": 3517254, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 105, "unkn2": 8, "x": 40, "y": 104, "name": "Ripple Field 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[21, 16], [57, 16], [62, 16], [67, 16], [4, 22], [14, 23]], "locations": ["Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", "Ripple Field 3 - Enemy 2 (Kapar)", "Ripple Field 3 - Enemy 3 (Blipper)"], "music": 18}, {"name": "Ripple Field 3 - 1", "level": 2, "stage": 3, "room": 1, "pointer": 3604480, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 320, "x": 832, "y": 152, "etype": 22, "vtype": 2, "name": "Ripple Field 3 - Maxim Tomato (Cove)"}, {"idx": 13, "pointer": 424, "x": 1128, "y": 384, "etype": 22, "vtype": 0, "name": "Ripple Field 3 - 1-Up (Cutter/Spark)"}], "consumables_pointer": 160, "enemies": ["Sparky", "Glunk", "Joe"], "default_exits": [{"room": 7, "unkn1": 80, "unkn2": 24, "x": 104, "y": 328, "name": "Ripple Field 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[13, 23], [14, 23], [91, 16], [16, 16], [2, 22], [8, 16], [0, 22]], "locations": ["Ripple Field 3 - Enemy 4 (Sparky)", "Ripple Field 3 - Enemy 5 (Glunk)", "Ripple Field 3 - Enemy 6 (Joe)", "Ripple Field 3 - Maxim Tomato (Cove)", "Ripple Field 3 - 1-Up (Cutter/Spark)"], "music": 18}, {"name": "Ripple Field 3 - 2", "level": 2, "stage": 3, "room": 2, "pointer": 3715428, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobo"], "default_exits": [{"room": 4, "unkn1": 118, "unkn2": 9, "x": 56, "y": 152, "name": "Ripple Field 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [21, 16], [4, 22], [46, 16], [47, 16], [5, 16], [14, 23]], "locations": ["Ripple Field 3 - Enemy 7 (Bobo)"], "music": 18}, {"name": "Ripple Field 3 - 3", "level": 2, "stage": 3, "room": 3, "pointer": 3071919, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 15, "unkn2": 6, "x": 56, "y": 104, "name": "Ripple Field 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 3 - Animal 1", "Ripple Field 3 - Animal 2"], "music": 39}, {"name": "Ripple Field 3 - 4", "level": 2, "stage": 3, "room": 4, "pointer": 2970810, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": ["Ripple Field 3 - Elieel"], "music": 8}, {"name": "Ripple Field 3 - 5", "level": 2, "stage": 3, "room": 5, "pointer": 2987502, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 232, "y": 88, "name": "Ripple Field 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": [], "music": 31}, {"name": "Ripple Field 3 - 6", "level": 2, "stage": 3, "room": 6, "pointer": 2888666, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 3 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 7", "level": 2, "stage": 3, "room": 7, "pointer": 3161120, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 3, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 3 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 11, "unkn2": 20, "x": 56, "y": 216, "name": "Ripple Field 3 - 7 Exit 1", "access_rule": []}], "entity_load": [[57, 16]], "locations": [], "music": 18}, {"name": "Ripple Field 4 - 0", "level": 2, "stage": 4, "room": 0, "pointer": 3082540, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Stone)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Mony"], "default_exits": [{"room": 6, "unkn1": 4, "unkn2": 16, "x": 72, "y": 232, "name": "Ripple Field 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [79, 16], [80, 16], [81, 16], [4, 22], [20, 16], [77, 16]], "locations": ["Ripple Field 4 - Enemy 1 (Bukiset (Stone))", "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", "Ripple Field 4 - Enemy 5 (Mony)"], "music": 15}, {"name": "Ripple Field 4 - 1", "level": 2, "stage": 4, "room": 1, "pointer": 2964846, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 72, "y": 88, "name": "Ripple Field 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Ripple Field 4 - Miniboss 1 (Captain Stitch)"], "music": 4}, {"name": "Ripple Field 4 - 2", "level": 2, "stage": 4, "room": 2, "pointer": 3018503, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)"], "default_exits": [{"room": 11, "unkn1": 25, "unkn2": 5, "x": 56, "y": 88, "name": "Ripple Field 4 - 2 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 25, "unkn2": 15, "x": 56, "y": 216, "name": "Ripple Field 4 - 2 Exit 1", "access_rule": []}], "entity_load": [[10, 19], [76, 16]], "locations": ["Ripple Field 4 - Enemy 6 (Bukiset (Burning))"], "music": 15}, {"name": "Ripple Field 4 - 3", "level": 2, "stage": 4, "room": 3, "pointer": 2988166, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[10, 19], [42, 19]], "locations": ["Ripple Field 4 - Toad & Little Toad"], "music": 8}, {"name": "Ripple Field 4 - 4", "level": 2, "stage": 4, "room": 4, "pointer": 2885533, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 4 - Complete"], "music": 5}, {"name": "Ripple Field 4 - 5", "level": 2, "stage": 4, "room": 5, "pointer": 3042349, "animal_pointers": [222, 230, 238], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 5, "x": 360, "y": 120, "name": "Ripple Field 4 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 488, "y": 120, "name": "Ripple Field 4 - 5 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 16, "unkn2": 5, "x": 104, "y": 88, "name": "Ripple Field 4 - 5 Exit 2", "access_rule": []}, {"room": 6, "unkn1": 10, "unkn2": 11, "x": 440, "y": 216, "name": "Ripple Field 4 - 5 Exit 3", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 4 - Animal 1", "Ripple Field 4 - Animal 2", "Ripple Field 4 - Animal 3"], "music": 40}, {"name": "Ripple Field 4 - 6", "level": 2, "stage": 4, "room": 6, "pointer": 3234805, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Blipper"], "default_exits": [{"room": 5, "unkn1": 21, "unkn2": 7, "x": 104, "y": 88, "name": "Ripple Field 4 - 6 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 31, "unkn2": 7, "x": 232, "y": 88, "name": "Ripple Field 4 - 6 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 26, "unkn2": 13, "x": 184, "y": 184, "name": "Ripple Field 4 - 6 Exit 2", "access_rule": []}, {"room": 12, "unkn1": 48, "unkn2": 15, "x": 88, "y": 216, "name": "Ripple Field 4 - 6 Exit 3", "access_rule": []}], "entity_load": [[73, 16], [14, 23], [21, 16], [13, 23]], "locations": ["Ripple Field 4 - Enemy 7 (Bobin)", "Ripple Field 4 - Enemy 8 (Blipper)"], "music": 15}, {"name": "Ripple Field 4 - 7", "level": 2, "stage": 4, "room": 7, "pointer": 3155468, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 6, "x": 104, "y": 136, "name": "Ripple Field 4 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 18, "unkn2": 9, "x": 72, "y": 248, "name": "Ripple Field 4 - 7 Exit 1", "access_rule": []}], "entity_load": [[14, 23], [1, 16], [0, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 4 - 8", "level": 2, "stage": 4, "room": 8, "pointer": 3350031, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Oro"], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 22, "x": 184, "y": 440, "name": "Ripple Field 4 - 8 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 34, "unkn2": 22, "x": 296, "y": 440, "name": "Ripple Field 4 - 8 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 16, "unkn2": 72, "x": 168, "y": 152, "name": "Ripple Field 4 - 8 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 23, "unkn2": 72, "x": 120, "y": 152, "name": "Ripple Field 4 - 8 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [68, 16], [14, 23], [25, 16], [6, 23]], "locations": ["Ripple Field 4 - Enemy 9 (Como)", "Ripple Field 4 - Enemy 10 (Oro)"], "music": 15}, {"name": "Ripple Field 4 - 9", "level": 2, "stage": 4, "room": 9, "pointer": 3050397, "animal_pointers": [], "consumables": [{"idx": 29, "pointer": 200, "x": 88, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Stone)"}], "consumables_pointer": 176, "enemies": ["Gansan"], "default_exits": [{"room": 8, "unkn1": 11, "unkn2": 9, "x": 264, "y": 1144, "name": "Ripple Field 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[75, 16], [2, 22]], "locations": ["Ripple Field 4 - Enemy 11 (Gansan)", "Ripple Field 4 - Maxim Tomato (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 10", "level": 2, "stage": 4, "room": 10, "pointer": 3052069, "animal_pointers": [], "consumables": [{"idx": 30, "pointer": 192, "x": 200, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 4 - 1-Up (Stone)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 8, "unkn1": 6, "unkn2": 9, "x": 376, "y": 1144, "name": "Ripple Field 4 - 10 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [75, 16]], "locations": ["Ripple Field 4 - 1-Up (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 11", "level": 2, "stage": 4, "room": 11, "pointer": 3386974, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Kapar", "Squishy"], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 13, "x": 72, "y": 152, "name": "Ripple Field 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[22, 16], [67, 16], [14, 23], [62, 16], [0, 16]], "locations": ["Ripple Field 4 - Enemy 12 (Waddle Dee)", "Ripple Field 4 - Enemy 13 (Kapar)", "Ripple Field 4 - Enemy 14 (Squishy)"], "music": 15}, {"name": "Ripple Field 4 - 12", "level": 2, "stage": 4, "room": 12, "pointer": 3168339, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 8, "unkn1": 67, "unkn2": 7, "x": 88, "y": 1224, "name": "Ripple Field 4 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 75, "unkn2": 7, "x": 88, "y": 136, "name": "Ripple Field 4 - 12 Exit 1", "access_rule": []}], "entity_load": [[59, 16], [13, 23], [28, 16]], "locations": ["Ripple Field 4 - Enemy 15 (Nidoo)"], "music": 15}, {"name": "Ripple Field 4 - 13", "level": 2, "stage": 4, "room": 13, "pointer": 2958478, "animal_pointers": [], "consumables": [{"idx": 54, "pointer": 264, "x": 216, "y": 136, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Dark)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 12, "unkn1": 4, "unkn2": 8, "x": 1192, "y": 120, "name": "Ripple Field 4 - 13 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [2, 22], [59, 16]], "locations": ["Ripple Field 4 - Maxim Tomato (Dark)"], "music": 15}, {"name": "Ripple Field 5 - 0", "level": 2, "stage": 5, "room": 0, "pointer": 3240369, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 9, "unkn2": 43, "x": 88, "y": 344, "name": "Ripple Field 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 1", "level": 2, "stage": 5, "room": 1, "pointer": 3547528, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 4, "x": 184, "y": 344, "name": "Ripple Field 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 2", "level": 2, "stage": 5, "room": 2, "pointer": 3611327, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Joe"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 21, "x": 56, "y": 184, "name": "Ripple Field 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 1 (Glunk)", "Ripple Field 5 - Enemy 2 (Joe)"], "music": 16}, {"name": "Ripple Field 5 - 3", "level": 2, "stage": 5, "room": 3, "pointer": 3926157, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 1258, "x": 1488, "y": 192, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Currents)"}, {"idx": 31, "pointer": 1290, "x": 1520, "y": 192, "etype": 22, "vtype": 0, "name": "Ripple Field 5 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Bobin", "Mony", "Squishy"], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 38, "x": 152, "y": 152, "name": "Ripple Field 5 - 3 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 95, "unkn2": 38, "x": 248, "y": 1064, "name": "Ripple Field 5 - 3 Exit 1", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [6, 22], [14, 23], [1, 16], [73, 16], [22, 16], [20, 16]], "locations": ["Ripple Field 5 - Enemy 3 (Bobin)", "Ripple Field 5 - Enemy 4 (Mony)", "Ripple Field 5 - Enemy 5 (Squishy)", "Ripple Field 5 - Maxim Tomato (Currents)", "Ripple Field 5 - 1-Up (Currents)"], "music": 16}, {"name": "Ripple Field 5 - 4", "level": 2, "stage": 5, "room": 4, "pointer": 3026639, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 4, "x": 232, "y": 152, "name": "Ripple Field 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 1"], "music": 40}, {"name": "Ripple Field 5 - 5", "level": 2, "stage": 5, "room": 5, "pointer": 3207333, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 56, "y": 72, "name": "Ripple Field 5 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 9, "x": 120, "y": 552, "name": "Ripple Field 5 - 5 Exit 1", "access_rule": ["Kine"]}], "entity_load": [[14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 6", "level": 2, "stage": 5, "room": 6, "pointer": 3485896, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 9, "unkn1": 121, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [22, 16], [14, 23], [13, 16], [11, 16], [32, 16]], "locations": ["Ripple Field 5 - Enemy 6 (Yaban)", "Ripple Field 5 - Enemy 7 (Broom Hatter)", "Ripple Field 5 - Enemy 8 (Bouncy)"], "music": 16}, {"name": "Ripple Field 5 - 7", "level": 2, "stage": 5, "room": 7, "pointer": 3752698, "animal_pointers": [], "consumables": [{"idx": 53, "pointer": 418, "x": 1512, "y": 608, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Exit)"}], "consumables_pointer": 352, "enemies": ["Sparky", "Rocky", "Babut"], "default_exits": [{"room": 10, "unkn1": 45, "unkn2": 31, "x": 152, "y": 152, "name": "Ripple Field 5 - 7 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 94, "unkn2": 40, "x": 88, "y": 200, "name": "Ripple Field 5 - 7 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [8, 16], [22, 16], [14, 23], [2, 22]], "locations": ["Ripple Field 5 - Enemy 9 (Sparky)", "Ripple Field 5 - Enemy 10 (Rocky)", "Ripple Field 5 - Enemy 11 (Babut)", "Ripple Field 5 - Maxim Tomato (Exit)"], "music": 16}, {"name": "Ripple Field 5 - 8", "level": 2, "stage": 5, "room": 8, "pointer": 3044682, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 8, "unkn2": 9, "x": 88, "y": 616, "name": "Ripple Field 5 - 8 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 2"], "music": 39}, {"name": "Ripple Field 5 - 9", "level": 2, "stage": 5, "room": 9, "pointer": 2963193, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[11, 19], [42, 19]], "locations": ["Ripple Field 5 - Mama Pitch"], "music": 8}, {"name": "Ripple Field 5 - 10", "level": 2, "stage": 5, "room": 10, "pointer": 3042934, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 8, "unkn2": 9, "x": 712, "y": 504, "name": "Ripple Field 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 12 (Galbo)"], "music": 16}, {"name": "Ripple Field 5 - 11", "level": 2, "stage": 5, "room": 11, "pointer": 2886256, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 5 - Complete"], "music": 5}, {"name": "Ripple Field 6 - 0", "level": 2, "stage": 6, "room": 0, "pointer": 2949576, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 1, "unkn1": 56, "unkn2": 7, "x": 40, "y": 152, "name": "Ripple Field 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[29, 16], [13, 23]], "locations": ["Ripple Field 6 - Enemy 1 (Kany)"], "music": 15}, {"name": "Ripple Field 6 - 1", "level": 2, "stage": 6, "room": 1, "pointer": 2971200, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 23, "unkn2": 9, "x": 56, "y": 264, "name": "Ripple Field 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 1", "Ripple Field 6 - Animal 2", "Ripple Field 6 - Animal 3"], "music": 38}, {"name": "Ripple Field 6 - 2", "level": 2, "stage": 6, "room": 2, "pointer": 3637749, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 95, "unkn2": 9, "x": 104, "y": 872, "name": "Ripple Field 6 - 2 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 50, "unkn2": 22, "x": 184, "y": 88, "name": "Ripple Field 6 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 45, "unkn2": 26, "x": 88, "y": 88, "name": "Ripple Field 6 - 2 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 55, "unkn2": 26, "x": 248, "y": 88, "name": "Ripple Field 6 - 2 Exit 3", "access_rule": []}], "entity_load": [[52, 16], [13, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 3", "level": 2, "stage": 6, "room": 3, "pointer": 3092564, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 5, "x": 744, "y": 424, "name": "Ripple Field 6 - 3 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 16, "unkn2": 5, "x": 872, "y": 424, "name": "Ripple Field 6 - 3 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 4", "level": 2, "stage": 6, "room": 4, "pointer": 3133247, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 5, "x": 824, "y": 360, "name": "Ripple Field 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[12, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 5", "level": 2, "stage": 6, "room": 5, "pointer": 3507762, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 76, "unkn2": 4, "x": 680, "y": 72, "name": "Ripple Field 6 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 6, "x": 440, "y": 104, "name": "Ripple Field 6 - 5 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 10, "x": 440, "y": 168, "name": "Ripple Field 6 - 5 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 88, "unkn2": 10, "x": 104, "y": 152, "name": "Ripple Field 6 - 5 Exit 3", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 12, "x": 200, "y": 200, "name": "Ripple Field 6 - 5 Exit 4", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 12, "x": 680, "y": 200, "name": "Ripple Field 6 - 5 Exit 5", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 16, "x": 680, "y": 264, "name": "Ripple Field 6 - 5 Exit 6", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 6", "level": 2, "stage": 6, "room": 6, "pointer": 3211264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 10, "x": 72, "y": 168, "name": "Ripple Field 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 7", "level": 2, "stage": 6, "room": 7, "pointer": 3586039, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Kapar", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 5, "unkn1": 134, "unkn2": 16, "x": 72, "y": 168, "name": "Ripple Field 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [3, 16], [67, 16], [51, 16], [7, 16]], "locations": ["Ripple Field 6 - Enemy 2 (KeKe)", "Ripple Field 6 - Enemy 3 (Kapar)", "Ripple Field 6 - Enemy 4 (Rocky)", "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 6 - 8", "level": 2, "stage": 6, "room": 8, "pointer": 3621483, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Coconut", "Sasuke", "Nruff"], "default_exits": [{"room": 10, "unkn1": 70, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 6 - 8 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 26, "unkn2": 54, "x": 72, "y": 152, "name": "Ripple Field 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[89, 16], [15, 16], [30, 16], [34, 16], [14, 23]], "locations": ["Ripple Field 6 - Enemy 6 (Propeller)", "Ripple Field 6 - Enemy 7 (Coconut)", "Ripple Field 6 - Enemy 8 (Sasuke)", "Ripple Field 6 - Enemy 9 (Nruff)"], "music": 15}, {"name": "Ripple Field 6 - 9", "level": 2, "stage": 6, "room": 9, "pointer": 2954523, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 3, "unkn2": 9, "x": 408, "y": 872, "name": "Ripple Field 6 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 4"], "music": 39}, {"name": "Ripple Field 6 - 10", "level": 2, "stage": 6, "room": 10, "pointer": 3069438, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[12, 19], [42, 19]], "locations": ["Ripple Field 6 - HB-002"], "music": 8}, {"name": "Ripple Field 6 - 11", "level": 2, "stage": 6, "room": 11, "pointer": 2886497, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 6 - Complete"], "music": 5}, {"name": "Ripple Field Boss - 0", "level": 2, "stage": 7, "room": 0, "pointer": 3157370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[7, 18]], "locations": ["Ripple Field - Boss (Acro) Purified", "Level 2 Boss"], "music": 2}, {"name": "Sand Canyon 1 - 0", "level": 3, "stage": 1, "room": 0, "pointer": 3524267, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo"], "default_exits": [{"room": 5, "unkn1": 196, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [1, 16], [26, 16], [2, 16]], "locations": ["Sand Canyon 1 - Enemy 1 (Bronto Burt)", "Sand Canyon 1 - Enemy 2 (Galbo)"], "music": 13}, {"name": "Sand Canyon 1 - 1", "level": 3, "stage": 1, "room": 1, "pointer": 3163860, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 34, "unkn2": 5, "x": 104, "y": 408, "name": "Sand Canyon 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 1 - Animal 1", "Sand Canyon 1 - Animal 2"], "music": 38}, {"name": "Sand Canyon 1 - 2", "level": 3, "stage": 1, "room": 2, "pointer": 3512532, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro"], "default_exits": [{"room": 3, "unkn1": 73, "unkn2": 6, "x": 56, "y": 120, "name": "Sand Canyon 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [26, 16], [25, 16], [4, 22], [14, 23], [1, 23], [0, 23], [4, 23]], "locations": ["Sand Canyon 1 - Enemy 3 (Oro)"], "music": 13}, {"name": "Sand Canyon 1 - 3", "level": 3, "stage": 1, "room": 3, "pointer": 3719146, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Propeller", "Gansan", "Babut"], "default_exits": [{"room": 4, "unkn1": 25, "unkn2": 73, "x": 72, "y": 280, "name": "Sand Canyon 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [75, 16], [43, 16], [8, 16]], "locations": ["Sand Canyon 1 - Enemy 4 (Sparky)", "Sand Canyon 1 - Enemy 5 (Propeller)", "Sand Canyon 1 - Enemy 6 (Gansan)", "Sand Canyon 1 - Enemy 7 (Babut)"], "music": 13}, {"name": "Sand Canyon 1 - 4", "level": 3, "stage": 1, "room": 4, "pointer": 3421212, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Dogon", "Bouncy", "Pteran"], "default_exits": [{"room": 7, "unkn1": 196, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[90, 16], [13, 16], [40, 16], [14, 23], [39, 16]], "locations": ["Sand Canyon 1 - Enemy 8 (Loud)", "Sand Canyon 1 - Enemy 9 (Dogon)", "Sand Canyon 1 - Enemy 10 (Bouncy)", "Sand Canyon 1 - Enemy 11 (Pteran)"], "music": 13}, {"name": "Sand Canyon 1 - 5", "level": 3, "stage": 1, "room": 5, "pointer": 3203325, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Polof"], "default_exits": [{"room": 6, "unkn1": 32, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 1 - 5 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 46, "unkn2": 9, "x": 56, "y": 344, "name": "Sand Canyon 1 - 5 Exit 1", "access_rule": []}], "entity_load": [[9, 16]], "locations": ["Sand Canyon 1 - Enemy 12 (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 6", "level": 3, "stage": 1, "room": 6, "pointer": 3138524, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 248, "x": 168, "y": 104, "etype": 22, "vtype": 0, "name": "Sand Canyon 1 - 1-Up (Polof)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 5, "unkn1": 5, "unkn2": 9, "x": 536, "y": 152, "name": "Sand Canyon 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [0, 22]], "locations": ["Sand Canyon 1 - 1-Up (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 7", "level": 3, "stage": 1, "room": 7, "pointer": 2988822, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [42, 19]], "locations": ["Sand Canyon 1 - Geromuzudake"], "music": 8}, {"name": "Sand Canyon 1 - 8", "level": 3, "stage": 1, "room": 8, "pointer": 2885292, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 1 - Complete"], "music": 5}, {"name": "Sand Canyon 2 - 0", "level": 3, "stage": 2, "room": 0, "pointer": 3668370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Doka", "Boten"], "default_exits": [{"room": 1, "unkn1": 178, "unkn2": 8, "x": 184, "y": 104, "name": "Sand Canyon 2 - 0 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 244, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 2 - 0 Exit 1", "access_rule": []}], "entity_load": [[35, 16], [33, 16], [14, 23], [51, 16], [47, 16], [46, 16]], "locations": ["Sand Canyon 2 - Enemy 1 (KeKe)", "Sand Canyon 2 - Enemy 2 (Doka)", "Sand Canyon 2 - Enemy 3 (Boten)"], "music": 21}, {"name": "Sand Canyon 2 - 1", "level": 3, "stage": 2, "room": 1, "pointer": 2952738, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 10, "unkn2": 6, "x": 2872, "y": 136, "name": "Sand Canyon 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 2 - Animal 1", "Sand Canyon 2 - Animal 2"], "music": 40}, {"name": "Sand Canyon 2 - 2", "level": 3, "stage": 2, "room": 2, "pointer": 3531156, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 9, "unkn1": 45, "unkn2": 60, "x": 88, "y": 184, "name": "Sand Canyon 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[6, 23], [89, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 4 (Propeller)"], "music": 21}, {"name": "Sand Canyon 2 - 3", "level": 3, "stage": 2, "room": 3, "pointer": 3263731, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Sasuke", "Como"], "default_exits": [{"room": 4, "unkn1": 63, "unkn2": 5, "x": 88, "y": 184, "name": "Sand Canyon 2 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 68, "unkn2": 5, "x": 184, "y": 184, "name": "Sand Canyon 2 - 3 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 73, "unkn2": 5, "x": 248, "y": 184, "name": "Sand Canyon 2 - 3 Exit 2", "access_rule": []}, {"room": 5, "unkn1": 130, "unkn2": 9, "x": 72, "y": 312, "name": "Sand Canyon 2 - 3 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [8, 16], [30, 16], [0, 16]], "locations": ["Sand Canyon 2 - Enemy 5 (Waddle Dee)", "Sand Canyon 2 - Enemy 6 (Sparky)", "Sand Canyon 2 - Enemy 7 (Sasuke)", "Sand Canyon 2 - Enemy 8 (Como)"], "music": 21}, {"name": "Sand Canyon 2 - 4", "level": 3, "stage": 2, "room": 4, "pointer": 3076300, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 228, "x": 168, "y": 72, "etype": 22, "vtype": 0, "name": "Sand Canyon 2 - 1-Up (Enclave)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 5, "unkn2": 11, "x": 1016, "y": 88, "name": "Sand Canyon 2 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 10, "unkn2": 11, "x": 1112, "y": 88, "name": "Sand Canyon 2 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 11, "x": 1176, "y": 88, "name": "Sand Canyon 2 - 4 Exit 2", "access_rule": []}], "entity_load": [[14, 23], [0, 22], [4, 22]], "locations": ["Sand Canyon 2 - 1-Up (Enclave)"], "music": 21}, {"name": "Sand Canyon 2 - 5", "level": 3, "stage": 2, "room": 5, "pointer": 3302133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 6, "unkn1": 63, "unkn2": 15, "x": 120, "y": 216, "name": "Sand Canyon 2 - 5 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 71, "unkn2": 18, "x": 152, "y": 136, "name": "Sand Canyon 2 - 5 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 130, "unkn2": 19, "x": 72, "y": 952, "name": "Sand Canyon 2 - 5 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 56, "unkn2": 23, "x": 88, "y": 216, "name": "Sand Canyon 2 - 5 Exit 3", "access_rule": []}], "entity_load": [[80, 16], [78, 16], [81, 16], [83, 16], [79, 16], [82, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))"], "music": 21}, {"name": "Sand Canyon 2 - 6", "level": 3, "stage": 2, "room": 6, "pointer": 3800612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 5, "unkn1": 17, "unkn2": 13, "x": 1144, "y": 248, "name": "Sand Canyon 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 15 (Nidoo)"], "music": 21}, {"name": "Sand Canyon 2 - 7", "level": 3, "stage": 2, "room": 7, "pointer": 3073888, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 15, "unkn2": 8, "x": 1016, "y": 296, "name": "Sand Canyon 2 - 7 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 5, "unkn2": 13, "x": 904, "y": 376, "name": "Sand Canyon 2 - 7 Exit 1", "access_rule": []}], "entity_load": [[15, 19]], "locations": [], "music": 21}, {"name": "Sand Canyon 2 - 8", "level": 3, "stage": 2, "room": 8, "pointer": 3061270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 5, "unkn1": 19, "unkn2": 13, "x": 1256, "y": 376, "name": "Sand Canyon 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 16 (Mariel)"], "music": 21}, {"name": "Sand Canyon 2 - 9", "level": 3, "stage": 2, "room": 9, "pointer": 3453286, "animal_pointers": [], "consumables": [{"idx": 51, "pointer": 240, "x": 1408, "y": 216, "etype": 22, "vtype": 2, "name": "Sand Canyon 2 - Maxim Tomato (Underwater)"}], "consumables_pointer": 128, "enemies": ["Yaban", "Wapod", "Squishy", "Pteran"], "default_exits": [{"room": 10, "unkn1": 246, "unkn2": 10, "x": 56, "y": 152, "name": "Sand Canyon 2 - 9 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [22, 16], [2, 22], [39, 16], [88, 16], [32, 16]], "locations": ["Sand Canyon 2 - Enemy 17 (Yaban)", "Sand Canyon 2 - Enemy 18 (Wapod)", "Sand Canyon 2 - Enemy 19 (Squishy)", "Sand Canyon 2 - Enemy 20 (Pteran)", "Sand Canyon 2 - Maxim Tomato (Underwater)"], "music": 21}, {"name": "Sand Canyon 2 - 10", "level": 3, "stage": 2, "room": 10, "pointer": 2994821, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 2 - 10 Exit 0", "access_rule": []}], "entity_load": [[15, 19], [42, 19]], "locations": ["Sand Canyon 2 - Auntie"], "music": 8}, {"name": "Sand Canyon 2 - 11", "level": 3, "stage": 2, "room": 11, "pointer": 2891799, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 2 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 0", "level": 3, "stage": 3, "room": 0, "pointer": 3544676, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Broom Hatter", "Rocky", "Gabon"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 57, "x": 104, "y": 152, "name": "Sand Canyon 3 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 11, "unkn2": 57, "x": 200, "y": 152, "name": "Sand Canyon 3 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 16, "unkn2": 57, "x": 296, "y": 152, "name": "Sand Canyon 3 - 0 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 23, "unkn2": 109, "x": 104, "y": 72, "name": "Sand Canyon 3 - 0 Exit 3", "access_rule": []}], "entity_load": [[24, 16], [3, 16], [11, 16], [27, 16]], "locations": ["Sand Canyon 3 - Enemy 1 (Sir Kibble)", "Sand Canyon 3 - Enemy 2 (Broom Hatter)", "Sand Canyon 3 - Enemy 3 (Rocky)", "Sand Canyon 3 - Enemy 4 (Gabon)"], "music": 16}, {"name": "Sand Canyon 3 - 1", "level": 3, "stage": 3, "room": 1, "pointer": 2965655, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 88, "y": 920, "name": "Sand Canyon 3 - 1 Exit 0", "access_rule": []}, {"room": 0, "unkn1": 11, "unkn2": 9, "x": 168, "y": 920, "name": "Sand Canyon 3 - 1 Exit 1", "access_rule": []}, {"room": 0, "unkn1": 17, "unkn2": 9, "x": 248, "y": 920, "name": "Sand Canyon 3 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 3 - Animal 1", "Sand Canyon 3 - Animal 2", "Sand Canyon 3 - Animal 3"], "music": 39}, {"name": "Sand Canyon 3 - 2", "level": 3, "stage": 3, "room": 2, "pointer": 3726270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 3, "unkn1": 184, "unkn2": 20, "x": 104, "y": 232, "name": "Sand Canyon 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[63, 16], [55, 16], [14, 23], [4, 23], [29, 16]], "locations": ["Sand Canyon 3 - Enemy 5 (Kany)"], "music": 16}, {"name": "Sand Canyon 3 - 3", "level": 3, "stage": 3, "room": 3, "pointer": 3416806, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 8, "unkn1": 130, "unkn2": 14, "x": 40, "y": 152, "name": "Sand Canyon 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [6, 23], [5, 23]], "locations": ["Sand Canyon 3 - Enemy 6 (Galbo)"], "music": 16}, {"name": "Sand Canyon 3 - 4", "level": 3, "stage": 3, "room": 4, "pointer": 3564419, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Sasuke"], "default_exits": [{"room": 5, "unkn1": 135, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[68, 16], [30, 16], [14, 23], [89, 16], [24, 16]], "locations": ["Sand Canyon 3 - Enemy 7 (Propeller)", "Sand Canyon 3 - Enemy 8 (Sasuke)"], "music": 16}, {"name": "Sand Canyon 3 - 5", "level": 3, "stage": 3, "room": 5, "pointer": 2973891, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": ["Sand Canyon 3 - Caramello"], "music": 8}, {"name": "Sand Canyon 3 - 6", "level": 3, "stage": 3, "room": 6, "pointer": 3247969, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod", "Bobo", "Babut", "Magoo"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 8, "x": 88, "y": 424, "name": "Sand Canyon 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[53, 16], [88, 16], [46, 16], [47, 16], [5, 16], [43, 16]], "locations": ["Sand Canyon 3 - Enemy 9 (Wapod)", "Sand Canyon 3 - Enemy 10 (Bobo)", "Sand Canyon 3 - Enemy 11 (Babut)", "Sand Canyon 3 - Enemy 12 (Magoo)"], "music": 16}, {"name": "Sand Canyon 3 - 7", "level": 3, "stage": 3, "room": 7, "pointer": 2887702, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 3 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 8", "level": 3, "stage": 3, "room": 8, "pointer": 2968057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 104, "y": 120, "name": "Sand Canyon 3 - 8 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": [], "music": 31}, {"name": "Sand Canyon 4 - 0", "level": 3, "stage": 4, "room": 0, "pointer": 3521954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Popon Ball", "Mariel", "Chilly"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 8, "x": 216, "y": 88, "name": "Sand Canyon 4 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 199, "unkn2": 15, "x": 104, "y": 88, "name": "Sand Canyon 4 - 0 Exit 1", "access_rule": []}], "entity_load": [[6, 16], [45, 16], [6, 23], [50, 16], [14, 23]], "locations": ["Sand Canyon 4 - Enemy 1 (Popon Ball)", "Sand Canyon 4 - Enemy 2 (Mariel)", "Sand Canyon 4 - Enemy 3 (Chilly)"], "music": 18}, {"name": "Sand Canyon 4 - 1", "level": 3, "stage": 4, "room": 1, "pointer": 2956289, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 5, "x": 1544, "y": 136, "name": "Sand Canyon 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 4 - Animal 1", "Sand Canyon 4 - Animal 2", "Sand Canyon 4 - Animal 3"], "music": 39}, {"name": "Sand Canyon 4 - 2", "level": 3, "stage": 4, "room": 2, "pointer": 3505360, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 328, "x": 2024, "y": 72, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Pacto)"}], "consumables_pointer": 160, "enemies": ["Tick", "Bronto Burt", "Babut"], "default_exits": [{"room": 3, "unkn1": 149, "unkn2": 14, "x": 88, "y": 216, "name": "Sand Canyon 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [2, 22], [43, 16], [2, 16], [48, 16]], "locations": ["Sand Canyon 4 - Enemy 4 (Tick)", "Sand Canyon 4 - Enemy 5 (Bronto Burt)", "Sand Canyon 4 - Enemy 6 (Babut)", "Sand Canyon 4 - Maxim Tomato (Pacto)"], "music": 18}, {"name": "Sand Canyon 4 - 3", "level": 3, "stage": 4, "room": 3, "pointer": 3412361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Joe", "Mony", "Blipper"], "default_exits": [{"room": 4, "unkn1": 115, "unkn2": 6, "x": 776, "y": 120, "name": "Sand Canyon 4 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 29, "unkn2": 8, "x": 72, "y": 88, "name": "Sand Canyon 4 - 3 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 105, "unkn2": 14, "x": 104, "y": 216, "name": "Sand Canyon 4 - 3 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 115, "unkn2": 20, "x": 776, "y": 248, "name": "Sand Canyon 4 - 3 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 64, "unkn2": 21, "x": 408, "y": 232, "name": "Sand Canyon 4 - 3 Exit 4", "access_rule": []}], "entity_load": [[73, 16], [20, 16], [91, 16], [14, 23], [21, 16]], "locations": ["Sand Canyon 4 - Enemy 7 (Bobin)", "Sand Canyon 4 - Enemy 8 (Joe)", "Sand Canyon 4 - Enemy 9 (Mony)", "Sand Canyon 4 - Enemy 10 (Blipper)"], "music": 18}, {"name": "Sand Canyon 4 - 4", "level": 3, "stage": 4, "room": 4, "pointer": 3307804, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 60, "unkn2": 6, "x": 88, "y": 104, "name": "Sand Canyon 4 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 60, "unkn2": 16, "x": 88, "y": 360, "name": "Sand Canyon 4 - 4 Exit 1", "access_rule": []}], "entity_load": [[21, 16], [20, 16], [91, 16], [73, 16]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 5", "level": 3, "stage": 4, "room": 5, "pointer": 2955407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 16, "unkn2": 13, "x": 88, "y": 232, "name": "Sand Canyon 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Sand Canyon 4 - Miniboss 1 (Haboki)"], "music": 4}, {"name": "Sand Canyon 4 - 6", "level": 3, "stage": 4, "room": 6, "pointer": 3094851, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 6, "x": 56, "y": 56, "name": "Sand Canyon 4 - 6 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 14, "x": 56, "y": 104, "name": "Sand Canyon 4 - 6 Exit 1", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 22, "x": 56, "y": 152, "name": "Sand Canyon 4 - 6 Exit 2", "access_rule": []}], "entity_load": [[17, 19], [4, 23], [5, 23]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 7", "level": 3, "stage": 4, "room": 7, "pointer": 3483428, "animal_pointers": [], "consumables": [{"idx": 25, "pointer": 200, "x": 344, "y": 144, "etype": 22, "vtype": 0, "name": "Sand Canyon 4 - 1-Up (Clean)"}, {"idx": 26, "pointer": 336, "x": 1656, "y": 144, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Needle)"}], "consumables_pointer": 128, "enemies": ["Togezo", "Rocky", "Bobo"], "default_exits": [{"room": 8, "unkn1": 266, "unkn2": 9, "x": 56, "y": 152, "name": "Sand Canyon 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [3, 16], [14, 23], [5, 16], [2, 16], [18, 16], [0, 22], [2, 22]], "locations": ["Sand Canyon 4 - Enemy 11 (Togezo)", "Sand Canyon 4 - Enemy 12 (Rocky)", "Sand Canyon 4 - Enemy 13 (Bobo)", "Sand Canyon 4 - 1-Up (Clean)", "Sand Canyon 4 - Maxim Tomato (Needle)"], "music": 18}, {"name": "Sand Canyon 4 - 8", "level": 3, "stage": 4, "room": 8, "pointer": 3002086, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[17, 19], [42, 19]], "locations": ["Sand Canyon 4 - Donbe & Hikari"], "music": 8}, {"name": "Sand Canyon 4 - 9", "level": 3, "stage": 4, "room": 9, "pointer": 2885774, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 4 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 0", "level": 3, "stage": 5, "room": 0, "pointer": 3662486, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 450, "x": 2256, "y": 232, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Falling Block)"}], "consumables_pointer": 208, "enemies": ["Wapod", "Dogon", "Tick"], "default_exits": [{"room": 3, "unkn1": 151, "unkn2": 15, "x": 184, "y": 56, "name": "Sand Canyon 5 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 83, "unkn2": 16, "x": 72, "y": 120, "name": "Sand Canyon 5 - 0 Exit 1", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [0, 22], [14, 23], [90, 16], [88, 16]], "locations": ["Sand Canyon 5 - Enemy 1 (Wapod)", "Sand Canyon 5 - Enemy 2 (Dogon)", "Sand Canyon 5 - Enemy 3 (Tick)", "Sand Canyon 5 - 1-Up (Falling Block)"], "music": 13}, {"name": "Sand Canyon 5 - 1", "level": 3, "stage": 5, "room": 1, "pointer": 3052622, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "Bobo", "Chilly", "Sparky", "Togezo"], "default_exits": [{"room": 9, "unkn1": 6, "unkn2": 9, "x": 216, "y": 1128, "name": "Sand Canyon 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [6, 16], [3, 16], [8, 16], [18, 16]], "locations": ["Sand Canyon 5 - Enemy 4 (Rocky)", "Sand Canyon 5 - Enemy 5 (Bobo)", "Sand Canyon 5 - Enemy 6 (Chilly)", "Sand Canyon 5 - Enemy 7 (Sparky)", "Sand Canyon 5 - Enemy 8 (Togezo)"], "music": 13}, {"name": "Sand Canyon 5 - 2", "level": 3, "stage": 5, "room": 2, "pointer": 3057544, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 3, "unkn2": 7, "x": 1320, "y": 264, "name": "Sand Canyon 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 1"], "music": 40}, {"name": "Sand Canyon 5 - 3", "level": 3, "stage": 5, "room": 3, "pointer": 3419011, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 192, "x": 56, "y": 648, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 2)"}, {"idx": 14, "pointer": 200, "x": 56, "y": 664, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 3)"}, {"idx": 15, "pointer": 208, "x": 56, "y": 632, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 1)"}, {"idx": 12, "pointer": 368, "x": 320, "y": 264, "etype": 22, "vtype": 2, "name": "Sand Canyon 5 - Maxim Tomato (Pit)"}], "consumables_pointer": 304, "enemies": ["Bronto Burt", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 66, "x": 88, "y": 88, "name": "Sand Canyon 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [30, 16], [2, 16], [0, 22], [2, 22], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 9 (Bronto Burt)", "Sand Canyon 5 - Enemy 10 (Sasuke)", "Sand Canyon 5 - 1-Up (Ice 2)", "Sand Canyon 5 - 1-Up (Ice 3)", "Sand Canyon 5 - 1-Up (Ice 1)", "Sand Canyon 5 - Maxim Tomato (Pit)"], "music": 13}, {"name": "Sand Canyon 5 - 4", "level": 3, "stage": 5, "room": 4, "pointer": 3644149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro", "Galbo", "Nidoo"], "default_exits": [{"room": 5, "unkn1": 76, "unkn2": 9, "x": 88, "y": 120, "name": "Sand Canyon 5 - 4 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 116, "unkn2": 14, "x": 200, "y": 1256, "name": "Sand Canyon 5 - 4 Exit 1", "access_rule": []}], "entity_load": [[54, 16], [26, 16], [28, 16], [25, 16], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 11 (Oro)", "Sand Canyon 5 - Enemy 12 (Galbo)", "Sand Canyon 5 - Enemy 13 (Nidoo)"], "music": 13}, {"name": "Sand Canyon 5 - 5", "level": 3, "stage": 5, "room": 5, "pointer": 3044100, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 7, "x": 1240, "y": 152, "name": "Sand Canyon 5 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 2"], "music": 39}, {"name": "Sand Canyon 5 - 6", "level": 3, "stage": 5, "room": 6, "pointer": 3373481, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 25, "unkn2": 5, "x": 56, "y": 152, "name": "Sand Canyon 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [31, 16], [89, 16], [6, 16]], "locations": ["Sand Canyon 5 - Enemy 14 (Propeller)"], "music": 13}, {"name": "Sand Canyon 5 - 7", "level": 3, "stage": 5, "room": 7, "pointer": 2964028, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[18, 19], [42, 19]], "locations": ["Sand Canyon 5 - Nyupun"], "music": 8}, {"name": "Sand Canyon 5 - 8", "level": 3, "stage": 5, "room": 8, "pointer": 2890112, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 5 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 9", "level": 3, "stage": 5, "room": 9, "pointer": 3647264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "KeKe", "Kabu"], "default_exits": [{"room": 6, "unkn1": 12, "unkn2": 6, "x": 72, "y": 760, "name": "Sand Canyon 5 - 9 Exit 0", "access_rule": ["Cutter"]}, {"room": 1, "unkn1": 12, "unkn2": 70, "x": 120, "y": 152, "name": "Sand Canyon 5 - 9 Exit 1", "access_rule": []}], "entity_load": [[27, 16], [61, 16], [4, 22], [14, 23], [51, 16], [19, 16]], "locations": ["Sand Canyon 5 - Enemy 15 (Sir Kibble)", "Sand Canyon 5 - Enemy 16 (KeKe)", "Sand Canyon 5 - Enemy 17 (Kabu)"], "music": 13}, {"name": "Sand Canyon 6 - 0", "level": 3, "stage": 6, "room": 0, "pointer": 3314761, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Doka", "Cappy", "Pteran"], "default_exits": [{"room": 2, "unkn1": 132, "unkn2": 16, "x": 56, "y": 136, "name": "Sand Canyon 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [35, 16], [39, 16], [12, 16]], "locations": ["Sand Canyon 6 - Enemy 1 (Sparky)", "Sand Canyon 6 - Enemy 2 (Doka)", "Sand Canyon 6 - Enemy 3 (Cappy)", "Sand Canyon 6 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Sand Canyon 6 - 1", "level": 3, "stage": 6, "room": 1, "pointer": 2976913, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 24, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 1", "Sand Canyon 6 - Animal 2", "Sand Canyon 6 - Animal 3"], "music": 39}, {"name": "Sand Canyon 6 - 2", "level": 3, "stage": 6, "room": 2, "pointer": 2978757, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 55, "unkn2": 6, "x": 104, "y": 104, "name": "Sand Canyon 6 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 3", "level": 3, "stage": 6, "room": 3, "pointer": 3178082, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 3 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 3 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 3 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 3 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 3 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 3 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 4", "level": 3, "stage": 6, "room": 4, "pointer": 3181563, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 4 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 4 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 4 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 4 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 4 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 4 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 5", "level": 3, "stage": 6, "room": 5, "pointer": 3177209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 5 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 5 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 5 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 5 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 5 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 5 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 6", "level": 3, "stage": 6, "room": 6, "pointer": 3183291, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 6 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 6 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 6 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 6 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 6 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 6 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 7", "level": 3, "stage": 6, "room": 7, "pointer": 3175453, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 7 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 7 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 7 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 7 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 7 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 7 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 8", "level": 3, "stage": 6, "room": 8, "pointer": 3179826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 8 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 8 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 8 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 8 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 8 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 8 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 9", "level": 3, "stage": 6, "room": 9, "pointer": 3176334, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 9 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 9 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 9 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 9 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 9 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 9 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 10", "level": 3, "stage": 6, "room": 10, "pointer": 3178954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 10 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 10 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 10 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 10 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 10 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 10 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 11", "level": 3, "stage": 6, "room": 11, "pointer": 2989149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 37, "unkn2": 6, "x": 88, "y": 264, "name": "Sand Canyon 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[59, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 12", "level": 3, "stage": 6, "room": 12, "pointer": 3015947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 8, "x": 440, "y": 264, "name": "Sand Canyon 6 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 86, "unkn2": 8, "x": 72, "y": 104, "name": "Sand Canyon 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[64, 16], [59, 16], [55, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 13", "level": 3, "stage": 6, "room": 13, "pointer": 2976539, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 55, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 6 - 13 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 14", "level": 3, "stage": 6, "room": 14, "pointer": 3030336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 5, "unkn2": 9, "x": 200, "y": 152, "name": "Sand Canyon 6 - 14 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 35, "unkn2": 9, "x": 152, "y": 392, "name": "Sand Canyon 6 - 14 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 15", "level": 3, "stage": 6, "room": 15, "pointer": 2972361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 13, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 16", "level": 3, "stage": 6, "room": 16, "pointer": 2953186, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 16 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 16 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 17", "level": 3, "stage": 6, "room": 17, "pointer": 2953633, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 17 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 17 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 18", "level": 3, "stage": 6, "room": 18, "pointer": 2991707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 14, "unkn2": 9, "x": 184, "y": 312, "name": "Sand Canyon 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 19", "level": 3, "stage": 6, "room": 19, "pointer": 2974651, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 5, "unkn2": 9, "x": 376, "y": 392, "name": "Sand Canyon 6 - 19 Exit 0", "access_rule": []}, {"room": 20, "unkn1": 35, "unkn2": 9, "x": 88, "y": 152, "name": "Sand Canyon 6 - 19 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 20", "level": 3, "stage": 6, "room": 20, "pointer": 2969638, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 4, "unkn2": 9, "x": 552, "y": 152, "name": "Sand Canyon 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 21", "level": 3, "stage": 6, "room": 21, "pointer": 2976163, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 9, "unkn2": 13, "x": 296, "y": 216, "name": "Sand Canyon 6 - 21 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 4", "Sand Canyon 6 - Animal 5", "Sand Canyon 6 - Animal 6"], "music": 40}, {"name": "Sand Canyon 6 - 22", "level": 3, "stage": 6, "room": 22, "pointer": 2950938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 38, "unkn1": 14, "unkn2": 8, "x": 168, "y": 376, "name": "Sand Canyon 6 - 22 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 9, "unkn2": 13, "x": 376, "y": 216, "name": "Sand Canyon 6 - 22 Exit 1", "access_rule": []}, {"room": 21, "unkn1": 19, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 22 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 23", "level": 3, "stage": 6, "room": 23, "pointer": 3311993, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 43, "unkn1": 145, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 24", "level": 3, "stage": 6, "room": 24, "pointer": 3079078, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 39, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 24 Exit 0", "access_rule": []}, {"room": 25, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 24 Exit 1", "access_rule": []}, {"room": 39, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 24 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 25", "level": 3, "stage": 6, "room": 25, "pointer": 3065898, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 25 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 25 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 25 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 26", "level": 3, "stage": 6, "room": 26, "pointer": 3063347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 26 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 26 Exit 1", "access_rule": []}, {"room": 27, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 26 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 27", "level": 3, "stage": 6, "room": 27, "pointer": 3066916, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 28, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 27 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 27 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 27 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 28", "level": 3, "stage": 6, "room": 28, "pointer": 3067425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 28 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 11, "unkn2": 8, "x": 184, "y": 344, "name": "Sand Canyon 6 - 28 Exit 1", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 28 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 29", "level": 3, "stage": 6, "room": 29, "pointer": 2950032, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 30, "unkn1": 11, "unkn2": 8, "x": 168, "y": 136, "name": "Sand Canyon 6 - 29 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 30", "level": 3, "stage": 6, "room": 30, "pointer": 2986500, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 10, "unkn2": 44, "x": 136, "y": 152, "name": "Sand Canyon 6 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 31", "level": 3, "stage": 6, "room": 31, "pointer": 3070930, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 31 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 648, "name": "Sand Canyon 6 - 31 Exit 1", "access_rule": []}, {"room": 32, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 31 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 32", "level": 3, "stage": 6, "room": 32, "pointer": 3054817, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Parasol)", "Bukiset (Cutter)"], "default_exits": [{"room": 33, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 32 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 536, "name": "Sand Canyon 6 - 32 Exit 1", "access_rule": []}, {"room": 33, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 32 Exit 2", "access_rule": []}], "entity_load": [[81, 16], [83, 16]], "locations": ["Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))"], "music": 14}, {"name": "Sand Canyon 6 - 33", "level": 3, "stage": 6, "room": 33, "pointer": 3053173, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Clean)", "Bukiset (Spark)"], "default_exits": [{"room": 34, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 33 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 440, "name": "Sand Canyon 6 - 33 Exit 1", "access_rule": []}, {"room": 34, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 33 Exit 2", "access_rule": []}], "entity_load": [[80, 16], [82, 16]], "locations": ["Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))"], "music": 14}, {"name": "Sand Canyon 6 - 34", "level": 3, "stage": 6, "room": 34, "pointer": 3053721, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)"], "default_exits": [{"room": 35, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 34 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 344, "name": "Sand Canyon 6 - 34 Exit 1", "access_rule": []}, {"room": 35, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 34 Exit 2", "access_rule": []}], "entity_load": [[79, 16], [78, 16]], "locations": ["Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))"], "music": 14}, {"name": "Sand Canyon 6 - 35", "level": 3, "stage": 6, "room": 35, "pointer": 3054269, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)"], "default_exits": [{"room": 37, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 35 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 248, "name": "Sand Canyon 6 - 35 Exit 1", "access_rule": []}, {"room": 37, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 35 Exit 2", "access_rule": []}], "entity_load": [[77, 16], [76, 16]], "locations": ["Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))"], "music": 14}, {"name": "Sand Canyon 6 - 36", "level": 3, "stage": 6, "room": 36, "pointer": 2986164, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 10, "unkn2": 44, "x": 392, "y": 152, "name": "Sand Canyon 6 - 36 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 37", "level": 3, "stage": 6, "room": 37, "pointer": 3074377, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 152, "name": "Sand Canyon 6 - 37 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 38", "level": 3, "stage": 6, "room": 38, "pointer": 2971589, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 10, "unkn2": 5, "x": 264, "y": 440, "name": "Sand Canyon 6 - 38 Exit 0", "access_rule": []}, {"room": 22, "unkn1": 10, "unkn2": 23, "x": 248, "y": 136, "name": "Sand Canyon 6 - 38 Exit 1", "access_rule": []}], "entity_load": [[76, 16], [77, 16], [78, 16], [79, 16], [80, 16], [81, 16], [82, 16], [83, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 39", "level": 3, "stage": 6, "room": 39, "pointer": 3063858, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 40, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 39 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 39 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 39 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 40", "level": 3, "stage": 6, "room": 40, "pointer": 3064368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 40 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 40 Exit 1", "access_rule": []}, {"room": 41, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 40 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 41", "level": 3, "stage": 6, "room": 41, "pointer": 3064878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 42, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 41 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 41 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 41 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 42", "level": 3, "stage": 6, "room": 42, "pointer": 3068939, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 42 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 42 Exit 1", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Sand Canyon 6 - Enemy 13 (Nidoo)"], "music": 14}, {"name": "Sand Canyon 6 - 43", "level": 3, "stage": 6, "room": 43, "pointer": 2988495, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 44, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 6 - 43 Exit 0", "access_rule": []}], "entity_load": [[19, 19], [42, 19]], "locations": ["Sand Canyon 6 - Professor Hector & R.O.B"], "music": 8}, {"name": "Sand Canyon 6 - 44", "level": 3, "stage": 6, "room": 44, "pointer": 2886979, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 6 - Complete"], "music": 5}, {"name": "Sand Canyon Boss - 0", "level": 3, "stage": 7, "room": 0, "pointer": 2991389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[6, 18]], "locations": ["Sand Canyon - Boss (Pon & Con) Purified", "Level 3 Boss"], "music": 2}, {"name": "Cloudy Park 1 - 0", "level": 4, "stage": 1, "room": 0, "pointer": 3172795, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "KeKe", "Cappy"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 5, "x": 56, "y": 152, "name": "Cloudy Park 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [12, 16], [51, 16], [1, 23], [0, 23]], "locations": ["Cloudy Park 1 - Enemy 1 (Waddle Dee)", "Cloudy Park 1 - Enemy 2 (KeKe)", "Cloudy Park 1 - Enemy 3 (Cappy)"], "music": 17}, {"name": "Cloudy Park 1 - 1", "level": 4, "stage": 1, "room": 1, "pointer": 3078163, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 88, "y": 424, "name": "Cloudy Park 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 1"], "music": 39}, {"name": "Cloudy Park 1 - 2", "level": 4, "stage": 1, "room": 2, "pointer": 3285882, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Togezo"], "default_exits": [{"room": 3, "unkn1": 95, "unkn2": 8, "x": 40, "y": 104, "name": "Cloudy Park 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [4, 16], [18, 16], [6, 23]], "locations": ["Cloudy Park 1 - Enemy 4 (Yaban)", "Cloudy Park 1 - Enemy 5 (Togezo)"], "music": 17}, {"name": "Cloudy Park 1 - 3", "level": 4, "stage": 1, "room": 3, "pointer": 3062831, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 15, "unkn2": 6, "x": 56, "y": 264, "name": "Cloudy Park 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 2"], "music": 39}, {"name": "Cloudy Park 1 - 4", "level": 4, "stage": 1, "room": 4, "pointer": 3396729, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 92, "unkn2": 16, "x": 56, "y": 152, "name": "Cloudy Park 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [0, 16], [14, 23], [68, 16], [26, 16], [4, 22]], "locations": ["Cloudy Park 1 - Enemy 6 (Galbo)"], "music": 17}, {"name": "Cloudy Park 1 - 5", "level": 4, "stage": 1, "room": 5, "pointer": 3038805, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 6, "unkn2": 5, "x": 2344, "y": 232, "name": "Cloudy Park 1 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 3", "Cloudy Park 1 - Animal 4"], "music": 39}, {"name": "Cloudy Park 1 - 6", "level": 4, "stage": 1, "room": 6, "pointer": 3535736, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Como"], "default_exits": [{"room": 8, "unkn1": 5, "unkn2": 8, "x": 72, "y": 104, "name": "Cloudy Park 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [14, 23], [0, 16], [41, 16], [8, 16]], "locations": ["Cloudy Park 1 - Enemy 7 (Sparky)", "Cloudy Park 1 - Enemy 8 (Como)"], "music": 17}, {"name": "Cloudy Park 1 - 7", "level": 4, "stage": 1, "room": 7, "pointer": 2954080, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 6, "x": 88, "y": 104, "name": "Cloudy Park 1 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 5"], "music": 39}, {"name": "Cloudy Park 1 - 8", "level": 4, "stage": 1, "room": 8, "pointer": 3465407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt"], "default_exits": [{"room": 12, "unkn1": 181, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 1 - 8 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [2, 16], [51, 16], [1, 23], [14, 23]], "locations": ["Cloudy Park 1 - Enemy 9 (Bronto Burt)"], "music": 17}, {"name": "Cloudy Park 1 - 9", "level": 4, "stage": 1, "room": 9, "pointer": 3078621, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 56, "y": 264, "name": "Cloudy Park 1 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 6"], "music": 39}, {"name": "Cloudy Park 1 - 10", "level": 4, "stage": 1, "room": 10, "pointer": 3281366, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Sir Kibble"], "default_exits": [{"room": 9, "unkn1": 99, "unkn2": 8, "x": 56, "y": 152, "name": "Cloudy Park 1 - 10 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [24, 16], [27, 16], [4, 23]], "locations": ["Cloudy Park 1 - Enemy 10 (Gabon)", "Cloudy Park 1 - Enemy 11 (Sir Kibble)"], "music": 17}, {"name": "Cloudy Park 1 - 11", "level": 4, "stage": 1, "room": 11, "pointer": 3519608, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 192, "x": 216, "y": 600, "etype": 22, "vtype": 0, "name": "Cloudy Park 1 - 1-Up (Shotzo)"}, {"idx": 18, "pointer": 456, "x": 856, "y": 408, "etype": 22, "vtype": 2, "name": "Cloudy Park 1 - Maxim Tomato (Mariel)"}], "consumables_pointer": 352, "enemies": ["Mariel", "Nruff"], "default_exits": [{"room": 5, "unkn1": 64, "unkn2": 6, "x": 104, "y": 216, "name": "Cloudy Park 1 - 11 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [27, 16], [15, 16], [45, 16], [14, 23], [2, 22], [0, 22], [6, 22]], "locations": ["Cloudy Park 1 - Enemy 12 (Mariel)", "Cloudy Park 1 - Enemy 13 (Nruff)", "Cloudy Park 1 - 1-Up (Shotzo)", "Cloudy Park 1 - Maxim Tomato (Mariel)"], "music": 17}, {"name": "Cloudy Park 1 - 12", "level": 4, "stage": 1, "room": 12, "pointer": 2958914, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 1 - 12 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [42, 19]], "locations": ["Cloudy Park 1 - Hibanamodoki"], "music": 8}, {"name": "Cloudy Park 1 - 13", "level": 4, "stage": 1, "room": 13, "pointer": 2886015, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 1 - Complete"], "music": 5}, {"name": "Cloudy Park 2 - 0", "level": 4, "stage": 2, "room": 0, "pointer": 3142443, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly", "Sasuke"], "default_exits": [{"room": 6, "unkn1": 96, "unkn2": 7, "x": 56, "y": 88, "name": "Cloudy Park 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16], [30, 16], [6, 16], [14, 23]], "locations": ["Cloudy Park 2 - Enemy 1 (Chilly)", "Cloudy Park 2 - Enemy 2 (Sasuke)"], "music": 19}, {"name": "Cloudy Park 2 - 1", "level": 4, "stage": 2, "room": 1, "pointer": 3235925, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Broom Hatter"], "default_exits": [{"room": 2, "unkn1": 146, "unkn2": 5, "x": 88, "y": 88, "name": "Cloudy Park 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [8, 16], [11, 16]], "locations": ["Cloudy Park 2 - Enemy 3 (Waddle Dee)", "Cloudy Park 2 - Enemy 4 (Sparky)", "Cloudy Park 2 - Enemy 5 (Broom Hatter)"], "music": 19}, {"name": "Cloudy Park 2 - 2", "level": 4, "stage": 2, "room": 2, "pointer": 3297758, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Pteran"], "default_exits": [{"room": 3, "unkn1": 147, "unkn2": 8, "x": 72, "y": 136, "name": "Cloudy Park 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[27, 16], [39, 16], [1, 23]], "locations": ["Cloudy Park 2 - Enemy 6 (Sir Kibble)", "Cloudy Park 2 - Enemy 7 (Pteran)"], "music": 19}, {"name": "Cloudy Park 2 - 3", "level": 4, "stage": 2, "room": 3, "pointer": 3341087, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Dogon"], "default_exits": [{"room": 4, "unkn1": 145, "unkn2": 12, "x": 72, "y": 136, "name": "Cloudy Park 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[4, 16], [14, 23], [90, 16], [89, 16]], "locations": ["Cloudy Park 2 - Enemy 8 (Propeller)", "Cloudy Park 2 - Enemy 9 (Dogon)"], "music": 19}, {"name": "Cloudy Park 2 - 4", "level": 4, "stage": 2, "room": 4, "pointer": 3457404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Oro", "Bronto Burt", "Rocky"], "default_exits": [{"room": 5, "unkn1": 165, "unkn2": 5, "x": 72, "y": 104, "name": "Cloudy Park 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [3, 16], [14, 23], [18, 16], [25, 16]], "locations": ["Cloudy Park 2 - Enemy 10 (Togezo)", "Cloudy Park 2 - Enemy 11 (Oro)", "Cloudy Park 2 - Enemy 12 (Bronto Burt)", "Cloudy Park 2 - Enemy 13 (Rocky)"], "music": 19}, {"name": "Cloudy Park 2 - 5", "level": 4, "stage": 2, "room": 5, "pointer": 3273878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Kapar"], "default_exits": [{"room": 7, "unkn1": 96, "unkn2": 8, "x": 56, "y": 88, "name": "Cloudy Park 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [62, 16], [26, 16], [67, 16]], "locations": ["Cloudy Park 2 - Enemy 14 (Galbo)", "Cloudy Park 2 - Enemy 15 (Kapar)"], "music": 19}, {"name": "Cloudy Park 2 - 6", "level": 4, "stage": 2, "room": 6, "pointer": 2984453, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 25, "unkn2": 5, "x": 72, "y": 152, "name": "Cloudy Park 2 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 2 - Animal 1", "Cloudy Park 2 - Animal 2", "Cloudy Park 2 - Animal 3"], "music": 38}, {"name": "Cloudy Park 2 - 7", "level": 4, "stage": 2, "room": 7, "pointer": 2985482, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 5, "x": 40, "y": 88, "name": "Cloudy Park 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[22, 19]], "locations": [], "music": 19}, {"name": "Cloudy Park 2 - 8", "level": 4, "stage": 2, "room": 8, "pointer": 2990753, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[22, 19], [42, 19]], "locations": ["Cloudy Park 2 - Piyo & Keko"], "music": 8}, {"name": "Cloudy Park 2 - 9", "level": 4, "stage": 2, "room": 9, "pointer": 2889630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 2 - Complete"], "music": 5}, {"name": "Cloudy Park 3 - 0", "level": 4, "stage": 3, "room": 0, "pointer": 3100859, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Mopoo", "Poppy Bros Jr."], "default_exits": [{"room": 2, "unkn1": 145, "unkn2": 8, "x": 56, "y": 136, "name": "Cloudy Park 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [74, 16], [47, 16], [7, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 1 (Bronto Burt)", "Cloudy Park 3 - Enemy 2 (Mopoo)", "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)"], "music": 15}, {"name": "Cloudy Park 3 - 1", "level": 4, "stage": 3, "room": 1, "pointer": 3209719, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como"], "default_exits": [{"room": 5, "unkn1": 13, "unkn2": 14, "x": 56, "y": 152, "name": "Cloudy Park 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [4, 22], [41, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 4 (Como)"], "music": 15}, {"name": "Cloudy Park 3 - 2", "level": 4, "stage": 3, "room": 2, "pointer": 3216185, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Bobin", "Loud", "Kapar"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 6, "x": 216, "y": 1064, "name": "Cloudy Park 3 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 24, "unkn2": 14, "x": 104, "y": 152, "name": "Cloudy Park 3 - 2 Exit 1", "access_rule": []}], "entity_load": [[67, 16], [40, 16], [73, 16], [14, 23], [16, 16]], "locations": ["Cloudy Park 3 - Enemy 5 (Glunk)", "Cloudy Park 3 - Enemy 6 (Bobin)", "Cloudy Park 3 - Enemy 7 (Loud)", "Cloudy Park 3 - Enemy 8 (Kapar)"], "music": 15}, {"name": "Cloudy Park 3 - 3", "level": 4, "stage": 3, "room": 3, "pointer": 2994208, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 5, "unkn2": 9, "x": 408, "y": 232, "name": "Cloudy Park 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 3 - Animal 1", "Cloudy Park 3 - Animal 2", "Cloudy Park 3 - Animal 3"], "music": 40}, {"name": "Cloudy Park 3 - 4", "level": 4, "stage": 3, "room": 4, "pointer": 3229151, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Batamon", "Bouncy"], "default_exits": [{"room": 6, "unkn1": 156, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 126, "unkn2": 9, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 1", "access_rule": []}], "entity_load": [[7, 16], [26, 16], [14, 23], [13, 16], [68, 16]], "locations": ["Cloudy Park 3 - Enemy 9 (Galbo)", "Cloudy Park 3 - Enemy 10 (Batamon)", "Cloudy Park 3 - Enemy 11 (Bouncy)"], "music": 15}, {"name": "Cloudy Park 3 - 5", "level": 4, "stage": 3, "room": 5, "pointer": 2969244, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": [], "music": 31}, {"name": "Cloudy Park 3 - 6", "level": 4, "stage": 3, "room": 6, "pointer": 4128530, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": ["Cloudy Park 3 - Mr. Ball"], "music": 8}, {"name": "Cloudy Park 3 - 7", "level": 4, "stage": 3, "room": 7, "pointer": 2885051, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 3 - Complete"], "music": 5}, {"name": "Cloudy Park 4 - 0", "level": 4, "stage": 4, "room": 0, "pointer": 3072905, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[4, 23], [1, 23], [0, 23], [31, 16]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 1", "level": 4, "stage": 4, "room": 1, "pointer": 3074863, "animal_pointers": [208, 224], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 21, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 4 - Animal 1", "Cloudy Park 4 - Animal 2"], "music": 38}, {"name": "Cloudy Park 4 - 2", "level": 4, "stage": 4, "room": 2, "pointer": 3309209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Como", "Wapod", "Cappy"], "default_exits": [{"room": 3, "unkn1": 145, "unkn2": 9, "x": 104, "y": 152, "name": "Cloudy Park 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [24, 16], [12, 16], [14, 23], [41, 16], [4, 22]], "locations": ["Cloudy Park 4 - Enemy 1 (Gabon)", "Cloudy Park 4 - Enemy 2 (Como)", "Cloudy Park 4 - Enemy 3 (Wapod)", "Cloudy Park 4 - Enemy 4 (Cappy)"], "music": 21}, {"name": "Cloudy Park 4 - 3", "level": 4, "stage": 4, "room": 3, "pointer": 3296291, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 776, "x": 1880, "y": 152, "etype": 22, "vtype": 0, "name": "Cloudy Park 4 - 1-Up (Windy)"}, {"idx": 34, "pointer": 912, "x": 2160, "y": 152, "etype": 22, "vtype": 2, "name": "Cloudy Park 4 - Maxim Tomato (Windy)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Togezo"], "default_exits": [{"room": 5, "unkn1": 144, "unkn2": 9, "x": 56, "y": 136, "name": "Cloudy Park 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[18, 16], [8, 16], [31, 16], [14, 23], [4, 22], [4, 16], [0, 22], [2, 22]], "locations": ["Cloudy Park 4 - Enemy 5 (Sparky)", "Cloudy Park 4 - Enemy 6 (Togezo)", "Cloudy Park 4 - 1-Up (Windy)", "Cloudy Park 4 - Maxim Tomato (Windy)"], "music": 21}, {"name": "Cloudy Park 4 - 4", "level": 4, "stage": 4, "room": 4, "pointer": 3330996, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "KeKe", "Bouncy"], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 15, "x": 72, "y": 152, "name": "Cloudy Park 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [51, 16], [17, 16], [14, 23], [2, 16]], "locations": ["Cloudy Park 4 - Enemy 7 (Bronto Burt)", "Cloudy Park 4 - Enemy 8 (KeKe)", "Cloudy Park 4 - Enemy 9 (Bouncy)"], "music": 21}, {"name": "Cloudy Park 4 - 5", "level": 4, "stage": 4, "room": 5, "pointer": 3332300, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Mariel"], "default_exits": [{"room": 4, "unkn1": 21, "unkn2": 51, "x": 2328, "y": 120, "name": "Cloudy Park 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [46, 16], [27, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 10 (Sir Kibble)", "Cloudy Park 4 - Enemy 11 (Mariel)"], "music": 21}, {"name": "Cloudy Park 4 - 6", "level": 4, "stage": 4, "room": 6, "pointer": 3253310, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu", "Wappa"], "default_exits": [{"room": 9, "unkn1": 3, "unkn2": 6, "x": 72, "y": 152, "name": "Cloudy Park 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [31, 16], [19, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 12 (Kabu)", "Cloudy Park 4 - Enemy 13 (Wappa)"], "music": 21}, {"name": "Cloudy Park 4 - 7", "level": 4, "stage": 4, "room": 7, "pointer": 2967658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 12, "unkn2": 9, "x": 152, "y": 120, "name": "Cloudy Park 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Cloudy Park 4 - Miniboss 1 (Jumper Shoot)"], "music": 4}, {"name": "Cloudy Park 4 - 8", "level": 4, "stage": 4, "room": 8, "pointer": 2981644, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 344, "y": 680, "name": "Cloudy Park 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[24, 19]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 9", "level": 4, "stage": 4, "room": 9, "pointer": 3008001, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[24, 19], [42, 19]], "locations": ["Cloudy Park 4 - Mikarin & Kagami Mocchi"], "music": 8}, {"name": "Cloudy Park 4 - 10", "level": 4, "stage": 4, "room": 10, "pointer": 2888184, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 4 - Complete"], "music": 5}, {"name": "Cloudy Park 5 - 0", "level": 4, "stage": 5, "room": 0, "pointer": 3192630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Sir Kibble", "Cappy", "Wappa"], "default_exits": [{"room": 1, "unkn1": 146, "unkn2": 6, "x": 168, "y": 616, "name": "Cloudy Park 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [27, 16], [44, 16], [12, 16], [14, 23]], "locations": ["Cloudy Park 5 - Enemy 1 (Yaban)", "Cloudy Park 5 - Enemy 2 (Sir Kibble)", "Cloudy Park 5 - Enemy 3 (Cappy)", "Cloudy Park 5 - Enemy 4 (Wappa)"], "music": 17}, {"name": "Cloudy Park 5 - 1", "level": 4, "stage": 5, "room": 1, "pointer": 3050956, "animal_pointers": [], "consumables": [{"idx": 5, "pointer": 264, "x": 480, "y": 720, "etype": 22, "vtype": 2, "name": "Cloudy Park 5 - Maxim Tomato (Pillars)"}], "consumables_pointer": 288, "enemies": ["Galbo", "Bronto Burt", "KeKe"], "default_exits": [{"room": 2, "unkn1": 32, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [51, 16], [26, 16], [14, 23], [2, 22]], "locations": ["Cloudy Park 5 - Enemy 5 (Galbo)", "Cloudy Park 5 - Enemy 6 (Bronto Burt)", "Cloudy Park 5 - Enemy 7 (KeKe)", "Cloudy Park 5 - Maxim Tomato (Pillars)"], "music": 17}, {"name": "Cloudy Park 5 - 2", "level": 4, "stage": 5, "room": 2, "pointer": 3604194, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 17, "unkn2": 9, "x": 72, "y": 88, "name": "Cloudy Park 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 5 - Animal 1", "Cloudy Park 5 - Animal 2"], "music": 40}, {"name": "Cloudy Park 5 - 3", "level": 4, "stage": 5, "room": 3, "pointer": 3131242, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Klinko"], "default_exits": [{"room": 4, "unkn1": 98, "unkn2": 5, "x": 72, "y": 120, "name": "Cloudy Park 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [4, 16], [42, 16], [4, 23]], "locations": ["Cloudy Park 5 - Enemy 8 (Propeller)", "Cloudy Park 5 - Enemy 9 (Klinko)"], "music": 17}, {"name": "Cloudy Park 5 - 4", "level": 4, "stage": 5, "room": 4, "pointer": 2990116, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 23, "unkn2": 7, "x": 216, "y": 744, "name": "Cloudy Park 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[88, 16]], "locations": ["Cloudy Park 5 - Enemy 10 (Wapod)"], "music": 17}, {"name": "Cloudy Park 5 - 5", "level": 4, "stage": 5, "room": 5, "pointer": 2975410, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 4, "x": 104, "y": 296, "name": "Cloudy Park 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [2, 16]], "locations": [], "music": 17}, {"name": "Cloudy Park 5 - 6", "level": 4, "stage": 5, "room": 6, "pointer": 3173683, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 7, "unkn1": 115, "unkn2": 6, "x": 56, "y": 136, "name": "Cloudy Park 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [1, 23], [39, 16], [70, 16]], "locations": ["Cloudy Park 5 - Enemy 11 (Pteran)"], "music": 17}, {"name": "Cloudy Park 5 - 7", "level": 4, "stage": 5, "room": 7, "pointer": 2992340, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[25, 19], [42, 19]], "locations": ["Cloudy Park 5 - Pick"], "music": 8}, {"name": "Cloudy Park 5 - 8", "level": 4, "stage": 5, "room": 8, "pointer": 2891558, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 5 - Complete"], "music": 5}, {"name": "Cloudy Park 6 - 0", "level": 4, "stage": 6, "room": 0, "pointer": 3269847, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 1", "level": 4, "stage": 6, "room": 1, "pointer": 3252248, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 3, "unkn2": 25, "x": 72, "y": 72, "name": "Cloudy Park 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [55, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 2", "level": 4, "stage": 6, "room": 2, "pointer": 3028494, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 0, "unkn1": 4, "unkn2": 9, "x": 1032, "y": 152, "name": "Cloudy Park 6 - 2 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 13, "unkn2": 9, "x": 56, "y": 72, "name": "Cloudy Park 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 1 (Madoo)"], "music": 11}, {"name": "Cloudy Park 6 - 3", "level": 4, "stage": 6, "room": 3, "pointer": 3131911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 3 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 3 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 3 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 3 Exit 3", "access_rule": []}, {"room": 10, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 3 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 4", "level": 4, "stage": 6, "room": 4, "pointer": 3115416, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick", "Como"], "default_exits": [{"room": 8, "unkn1": 20, "unkn2": 4, "x": 72, "y": 488, "name": "Cloudy Park 6 - 4 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 4 Exit 1", "access_rule": []}, {"room": 11, "unkn1": 8, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 12, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 4 Exit 3", "access_rule": []}, {"room": 11, "unkn1": 16, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 4 Exit 4", "access_rule": []}, {"room": 11, "unkn1": 20, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 4 Exit 5", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [41, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 2 (Tick)", "Cloudy Park 6 - Enemy 3 (Como)"], "music": 11}, {"name": "Cloudy Park 6 - 5", "level": 4, "stage": 6, "room": 5, "pointer": 3245809, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 15, "unkn1": 65, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16], [14, 23], [4, 22]], "locations": ["Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)"], "music": 11}, {"name": "Cloudy Park 6 - 6", "level": 4, "stage": 6, "room": 6, "pointer": 3237044, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 56, "unkn2": 9, "x": 72, "y": 136, "name": "Cloudy Park 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[89, 16]], "locations": ["Cloudy Park 6 - Enemy 7 (Propeller)"], "music": 11}, {"name": "Cloudy Park 6 - 7", "level": 4, "stage": 6, "room": 7, "pointer": 3262705, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo"], "default_exits": [{"room": 13, "unkn1": 12, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 57, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 64, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 6 - 7 Exit 2", "access_rule": []}], "entity_load": [[74, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 8 (Mopoo)"], "music": 11}, {"name": "Cloudy Park 6 - 8", "level": 4, "stage": 6, "room": 8, "pointer": 3027259, "animal_pointers": [], "consumables": [{"idx": 22, "pointer": 312, "x": 224, "y": 256, "etype": 22, "vtype": 0, "name": "Cloudy Park 6 - 1-Up (Cutter)"}], "consumables_pointer": 304, "enemies": ["Bukiset (Burning)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Cutter)"], "default_exits": [{"room": 12, "unkn1": 13, "unkn2": 4, "x": 88, "y": 152, "name": "Cloudy Park 6 - 8 Exit 0", "access_rule": []}], "entity_load": [[78, 16], [80, 16], [76, 16], [79, 16], [83, 16], [14, 23], [4, 22], [0, 22]], "locations": ["Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", "Cloudy Park 6 - 1-Up (Cutter)"], "music": 11}, {"name": "Cloudy Park 6 - 9", "level": 4, "stage": 6, "room": 9, "pointer": 3089504, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 35, "unkn2": 7, "x": 72, "y": 72, "name": "Cloudy Park 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[41, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 10", "level": 4, "stage": 6, "room": 10, "pointer": 3132579, "animal_pointers": [242, 250, 258], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 20, "unkn2": 4, "x": 72, "y": 152, "name": "Cloudy Park 6 - 10 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 4, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 10 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 10 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 10 Exit 3", "access_rule": []}, {"room": 3, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 10 Exit 4", "access_rule": []}, {"room": 3, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 10 Exit 5", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 6 - Animal 1", "Cloudy Park 6 - Animal 2", "Cloudy Park 6 - Animal 3"], "music": 40}, {"name": "Cloudy Park 6 - 11", "level": 4, "stage": 6, "room": 11, "pointer": 3017866, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 11 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 8, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 11 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 12, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 11 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 16, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 11 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 20, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 11 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 12", "level": 4, "stage": 6, "room": 12, "pointer": 3036404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 9, "x": 200, "y": 72, "name": "Cloudy Park 6 - 12 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 13, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 13", "level": 4, "stage": 6, "room": 13, "pointer": 2965251, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 216, "y": 136, "name": "Cloudy Park 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[26, 19]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 14", "level": 4, "stage": 6, "room": 14, "pointer": 3077236, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 936, "y": 136, "name": "Cloudy Park 6 - 14 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 15", "level": 4, "stage": 6, "room": 15, "pointer": 3061794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[26, 19], [42, 19]], "locations": ["Cloudy Park 6 - HB-007"], "music": 8}, {"name": "Cloudy Park 6 - 16", "level": 4, "stage": 6, "room": 16, "pointer": 2888907, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 6 - Complete"], "music": 5}, {"name": "Cloudy Park Boss - 0", "level": 4, "stage": 7, "room": 0, "pointer": 2998682, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[3, 18]], "locations": ["Cloudy Park - Boss (Ado) Purified", "Level 4 Boss"], "music": 2}, {"name": "Iceberg 1 - 0", "level": 5, "stage": 1, "room": 0, "pointer": 3363111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Klinko", "KeKe"], "default_exits": [{"room": 1, "unkn1": 104, "unkn2": 8, "x": 312, "y": 1384, "name": "Iceberg 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [0, 16], [51, 16]], "locations": ["Iceberg 1 - Enemy 1 (Waddle Dee)", "Iceberg 1 - Enemy 2 (Klinko)", "Iceberg 1 - Enemy 3 (KeKe)"], "music": 18}, {"name": "Iceberg 1 - 1", "level": 5, "stage": 1, "room": 1, "pointer": 3596524, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Galbo", "Rocky"], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 8, "x": 72, "y": 344, "name": "Iceberg 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [41, 16], [26, 16], [14, 23], [4, 22], [6, 23]], "locations": ["Iceberg 1 - Enemy 4 (Como)", "Iceberg 1 - Enemy 5 (Galbo)", "Iceberg 1 - Enemy 6 (Rocky)"], "music": 18}, {"name": "Iceberg 1 - 2", "level": 5, "stage": 1, "room": 2, "pointer": 3288880, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 3, "unkn1": 49, "unkn2": 9, "x": 184, "y": 152, "name": "Iceberg 1 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 94, "unkn2": 21, "x": 120, "y": 168, "name": "Iceberg 1 - 2 Exit 1", "access_rule": []}], "entity_load": [[28, 19], [46, 16], [47, 16], [17, 16], [67, 16]], "locations": ["Iceberg 1 - Enemy 7 (Kapar)"], "music": 18}, {"name": "Iceberg 1 - 3", "level": 5, "stage": 1, "room": 3, "pointer": 3068439, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 9, "x": 808, "y": 152, "name": "Iceberg 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 1 - Animal 1", "Iceberg 1 - Animal 2"], "music": 38}, {"name": "Iceberg 1 - 4", "level": 5, "stage": 1, "room": 4, "pointer": 3233681, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo", "Babut", "Wappa"], "default_exits": [{"room": 6, "unkn1": 74, "unkn2": 4, "x": 56, "y": 152, "name": "Iceberg 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [43, 16], [74, 16]], "locations": ["Iceberg 1 - Enemy 8 (Mopoo)", "Iceberg 1 - Enemy 9 (Babut)", "Iceberg 1 - Enemy 10 (Wappa)"], "music": 18}, {"name": "Iceberg 1 - 5", "level": 5, "stage": 1, "room": 5, "pointer": 3406133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Chilly", "Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 196, "unkn2": 9, "x": 72, "y": 744, "name": "Iceberg 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [7, 16], [2, 16], [0, 16]], "locations": ["Iceberg 1 - Enemy 11 (Bronto Burt)", "Iceberg 1 - Enemy 12 (Chilly)", "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)"], "music": 18}, {"name": "Iceberg 1 - 6", "level": 5, "stage": 1, "room": 6, "pointer": 2985823, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 19], [42, 19]], "locations": ["Iceberg 1 - Kogoesou"], "music": 8}, {"name": "Iceberg 1 - 7", "level": 5, "stage": 1, "room": 7, "pointer": 2892040, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 1 - Complete"], "music": 5}, {"name": "Iceberg 2 - 0", "level": 5, "stage": 2, "room": 0, "pointer": 3106800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Nruff"], "default_exits": [{"room": 1, "unkn1": 113, "unkn2": 36, "x": 88, "y": 152, "name": "Iceberg 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [24, 16]], "locations": ["Iceberg 2 - Enemy 1 (Gabon)", "Iceberg 2 - Enemy 2 (Nruff)"], "music": 20}, {"name": "Iceberg 2 - 1", "level": 5, "stage": 2, "room": 1, "pointer": 3334841, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Chilly", "Pteran"], "default_exits": [{"room": 2, "unkn1": 109, "unkn2": 20, "x": 88, "y": 72, "name": "Iceberg 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [0, 16], [4, 16], [39, 16]], "locations": ["Iceberg 2 - Enemy 3 (Waddle Dee)", "Iceberg 2 - Enemy 4 (Chilly)", "Iceberg 2 - Enemy 5 (Pteran)"], "music": 20}, {"name": "Iceberg 2 - 2", "level": 5, "stage": 2, "room": 2, "pointer": 3473408, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Galbo", "Babut", "Magoo"], "default_exits": [{"room": 6, "unkn1": 102, "unkn2": 5, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 24, "unkn2": 18, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 37, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 55, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 3", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 4", "access_rule": []}], "entity_load": [[53, 16], [26, 16], [43, 16], [14, 23], [16, 16]], "locations": ["Iceberg 2 - Enemy 6 (Glunk)", "Iceberg 2 - Enemy 7 (Galbo)", "Iceberg 2 - Enemy 8 (Babut)", "Iceberg 2 - Enemy 9 (Magoo)"], "music": 20}, {"name": "Iceberg 2 - 3", "level": 5, "stage": 2, "room": 3, "pointer": 3037006, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 616, "y": 424, "name": "Iceberg 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 4", "level": 5, "stage": 2, "room": 4, "pointer": 3035198, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 904, "y": 424, "name": "Iceberg 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 5", "level": 5, "stage": 2, "room": 5, "pointer": 3128551, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 424, "name": "Iceberg 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 6", "level": 5, "stage": 2, "room": 6, "pointer": 3270857, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Nidoo", "Oro"], "default_exits": [{"room": 7, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Iceberg 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [4, 22], [89, 16], [28, 16], [25, 16]], "locations": ["Iceberg 2 - Enemy 10 (Propeller)", "Iceberg 2 - Enemy 11 (Nidoo)", "Iceberg 2 - Enemy 12 (Oro)"], "music": 20}, {"name": "Iceberg 2 - 7", "level": 5, "stage": 2, "room": 7, "pointer": 3212501, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Klinko", "Bronto Burt"], "default_exits": [{"room": 8, "unkn1": 124, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [14, 23], [2, 16], [4, 23]], "locations": ["Iceberg 2 - Enemy 13 (Klinko)", "Iceberg 2 - Enemy 14 (Bronto Burt)"], "music": 20}, {"name": "Iceberg 2 - 8", "level": 5, "stage": 2, "room": 8, "pointer": 2994515, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [42, 19]], "locations": ["Iceberg 2 - Samus"], "music": 8}, {"name": "Iceberg 2 - 9", "level": 5, "stage": 2, "room": 9, "pointer": 3058084, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 9, "x": 408, "y": 296, "name": "Iceberg 2 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 2 - Animal 1", "Iceberg 2 - Animal 2"], "music": 39}, {"name": "Iceberg 2 - 10", "level": 5, "stage": 2, "room": 10, "pointer": 2887220, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 2 - Complete"], "music": 5}, {"name": "Iceberg 3 - 0", "level": 5, "stage": 3, "room": 0, "pointer": 3455346, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori", "Bouncy", "Chilly", "Pteran"], "default_exits": [{"room": 1, "unkn1": 98, "unkn2": 6, "x": 200, "y": 232, "name": "Iceberg 3 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 217, "unkn2": 7, "x": 40, "y": 120, "name": "Iceberg 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[60, 16], [6, 16], [39, 16], [13, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 1 (Corori)", "Iceberg 3 - Enemy 2 (Bouncy)", "Iceberg 3 - Enemy 3 (Chilly)", "Iceberg 3 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Iceberg 3 - 1", "level": 5, "stage": 3, "room": 1, "pointer": 3019769, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 11, "unkn2": 14, "x": 1592, "y": 104, "name": "Iceberg 3 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 1", "Iceberg 3 - Animal 2", "Iceberg 3 - Animal 3"], "music": 38}, {"name": "Iceberg 3 - 2", "level": 5, "stage": 3, "room": 2, "pointer": 3618121, "animal_pointers": [], "consumables": [{"idx": 2, "pointer": 352, "x": 1776, "y": 104, "etype": 22, "vtype": 2, "name": "Iceberg 3 - Maxim Tomato (Ceiling)"}], "consumables_pointer": 128, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 196, "unkn2": 11, "x": 72, "y": 152, "name": "Iceberg 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[2, 22], [71, 16], [57, 16], [21, 16], [67, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 5 (Raft Waddle Dee)", "Iceberg 3 - Enemy 6 (Kapar)", "Iceberg 3 - Enemy 7 (Blipper)", "Iceberg 3 - Maxim Tomato (Ceiling)"], "music": 14}, {"name": "Iceberg 3 - 3", "level": 5, "stage": 3, "room": 3, "pointer": 3650368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 116, "unkn2": 11, "x": 40, "y": 152, "name": "Iceberg 3 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 63, "unkn2": 13, "x": 184, "y": 136, "name": "Iceberg 3 - 3 Exit 1", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [4, 22], [6, 16], [88, 16]], "locations": ["Iceberg 3 - Enemy 8 (Wapod)"], "music": 14}, {"name": "Iceberg 3 - 4", "level": 5, "stage": 3, "room": 4, "pointer": 3038208, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 10, "unkn2": 8, "x": 1032, "y": 216, "name": "Iceberg 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 4", "Iceberg 3 - Animal 5"], "music": 39}, {"name": "Iceberg 3 - 5", "level": 5, "stage": 3, "room": 5, "pointer": 3013938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": [], "music": 31}, {"name": "Iceberg 3 - 6", "level": 5, "stage": 3, "room": 6, "pointer": 3624789, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Icicle"], "default_exits": [{"room": 7, "unkn1": 211, "unkn2": 7, "x": 40, "y": 152, "name": "Iceberg 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [16, 16], [14, 23], [36, 16], [4, 22]], "locations": ["Iceberg 3 - Enemy 9 (Glunk)", "Iceberg 3 - Enemy 10 (Icicle)"], "music": 14}, {"name": "Iceberg 3 - 7", "level": 5, "stage": 3, "room": 7, "pointer": 2989472, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 7 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": ["Iceberg 3 - Chef Kawasaki"], "music": 8}, {"name": "Iceberg 3 - 8", "level": 5, "stage": 3, "room": 8, "pointer": 2889871, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 3 - Complete"], "music": 5}, {"name": "Iceberg 4 - 0", "level": 5, "stage": 4, "room": 0, "pointer": 3274879, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo", "Klinko", "Chilly"], "default_exits": [{"room": 1, "unkn1": 111, "unkn2": 8, "x": 72, "y": 104, "name": "Iceberg 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [2, 16], [26, 16]], "locations": ["Iceberg 4 - Enemy 1 (Bronto Burt)", "Iceberg 4 - Enemy 2 (Galbo)", "Iceberg 4 - Enemy 3 (Klinko)", "Iceberg 4 - Enemy 4 (Chilly)"], "music": 19}, {"name": "Iceberg 4 - 1", "level": 5, "stage": 4, "room": 1, "pointer": 3371780, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Babut", "Wappa"], "default_exits": [{"room": 2, "unkn1": 60, "unkn2": 36, "x": 216, "y": 88, "name": "Iceberg 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [4, 22], [44, 16]], "locations": ["Iceberg 4 - Enemy 5 (Babut)", "Iceberg 4 - Enemy 6 (Wappa)"], "music": 19}, {"name": "Iceberg 4 - 2", "level": 5, "stage": 4, "room": 2, "pointer": 3284378, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 8, "unkn2": 39, "x": 168, "y": 152, "name": "Iceberg 4 - 2 Exit 0", "access_rule": ["Burning"]}, {"room": 3, "unkn1": 13, "unkn2": 39, "x": 88, "y": 136, "name": "Iceberg 4 - 2 Exit 1", "access_rule": []}, {"room": 17, "unkn1": 18, "unkn2": 39, "x": 120, "y": 152, "name": "Iceberg 4 - 2 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 3", "level": 5, "stage": 4, "room": 3, "pointer": 3162957, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 44, "unkn2": 8, "x": 216, "y": 104, "name": "Iceberg 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[69, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 4", "level": 5, "stage": 4, "room": 4, "pointer": 3261679, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Icicle"], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 42, "x": 104, "y": 840, "name": "Iceberg 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[36, 16]], "locations": ["Iceberg 4 - Enemy 7 (Icicle)"], "music": 19}, {"name": "Iceberg 4 - 5", "level": 5, "stage": 4, "room": 5, "pointer": 3217398, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori"], "default_exits": [{"room": 6, "unkn1": 19, "unkn2": 5, "x": 72, "y": 120, "name": "Iceberg 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[60, 16], [44, 16], [4, 22]], "locations": ["Iceberg 4 - Enemy 8 (Corori)"], "music": 19}, {"name": "Iceberg 4 - 6", "level": 5, "stage": 4, "room": 6, "pointer": 3108265, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 61, "unkn2": 7, "x": 456, "y": 72, "name": "Iceberg 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 7", "level": 5, "stage": 4, "room": 7, "pointer": 3346202, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 39, "unkn2": 6, "x": 168, "y": 104, "name": "Iceberg 4 - 7 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 4, "unkn2": 21, "x": 88, "y": 168, "name": "Iceberg 4 - 7 Exit 1", "access_rule": ["Burning"]}, {"room": 13, "unkn1": 21, "unkn2": 21, "x": 280, "y": 168, "name": "Iceberg 4 - 7 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[14, 23], [4, 22], [4, 23]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 8", "level": 5, "stage": 4, "room": 8, "pointer": 3055911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 5, "x": 648, "y": 104, "name": "Iceberg 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 9", "level": 5, "stage": 4, "room": 9, "pointer": 3056457, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 9, "x": 136, "y": 136, "name": "Iceberg 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 4 - Miniboss 1 (Yuki)"], "music": 4}, {"name": "Iceberg 4 - 10", "level": 5, "stage": 4, "room": 10, "pointer": 3257516, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 8, "unkn2": 37, "x": 88, "y": 40, "name": "Iceberg 4 - 10 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 15, "unkn2": 37, "x": 200, "y": 40, "name": "Iceberg 4 - 10 Exit 1", "access_rule": []}], "entity_load": [[31, 19]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 11", "level": 5, "stage": 4, "room": 11, "pointer": 3083322, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon"], "default_exits": [{"room": 12, "unkn1": 46, "unkn2": 8, "x": 88, "y": 120, "name": "Iceberg 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[24, 16]], "locations": ["Iceberg 4 - Enemy 9 (Gabon)"], "music": 19}, {"name": "Iceberg 4 - 12", "level": 5, "stage": 4, "room": 12, "pointer": 3147724, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu"], "default_exits": [{"room": 18, "unkn1": 64, "unkn2": 7, "x": 72, "y": 456, "name": "Iceberg 4 - 12 Exit 0", "access_rule": []}], "entity_load": [[19, 16], [61, 16]], "locations": ["Iceberg 4 - Enemy 10 (Kabu)"], "music": 19}, {"name": "Iceberg 4 - 13", "level": 5, "stage": 4, "room": 13, "pointer": 3370077, "animal_pointers": [232, 240, 248], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 31, "unkn2": 4, "x": 216, "y": 120, "name": "Iceberg 4 - 13 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 46, "unkn2": 10, "x": 72, "y": 88, "name": "Iceberg 4 - 13 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 57, "unkn2": 10, "x": 312, "y": 88, "name": "Iceberg 4 - 13 Exit 2", "access_rule": []}, {"room": 14, "unkn1": 28, "unkn2": 21, "x": 152, "y": 136, "name": "Iceberg 4 - 13 Exit 3", "access_rule": []}, {"room": 14, "unkn1": 34, "unkn2": 21, "x": 280, "y": 136, "name": "Iceberg 4 - 13 Exit 4", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 1", "Iceberg 4 - Animal 2", "Iceberg 4 - Animal 3"], "music": 19}, {"name": "Iceberg 4 - 14", "level": 5, "stage": 4, "room": 14, "pointer": 3057002, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Broom Hatter", "Sasuke"], "default_exits": [{"room": 15, "unkn1": 4, "unkn2": 8, "x": 88, "y": 360, "name": "Iceberg 4 - 14 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 10, "unkn2": 8, "x": 440, "y": 344, "name": "Iceberg 4 - 14 Exit 1", "access_rule": []}, {"room": 13, "unkn1": 16, "unkn2": 8, "x": 568, "y": 344, "name": "Iceberg 4 - 14 Exit 2", "access_rule": []}, {"room": 15, "unkn1": 22, "unkn2": 8, "x": 344, "y": 360, "name": "Iceberg 4 - 14 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [30, 16]], "locations": ["Iceberg 4 - Enemy 11 (Broom Hatter)", "Iceberg 4 - Enemy 12 (Sasuke)"], "music": 19}, {"name": "Iceberg 4 - 15", "level": 5, "stage": 4, "room": 15, "pointer": 3116124, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 6, "x": 520, "y": 72, "name": "Iceberg 4 - 15 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 4, "unkn2": 22, "x": 88, "y": 136, "name": "Iceberg 4 - 15 Exit 1", "access_rule": []}, {"room": 14, "unkn1": 22, "unkn2": 22, "x": 344, "y": 136, "name": "Iceberg 4 - 15 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 16", "level": 5, "stage": 4, "room": 16, "pointer": 3069937, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 9, "x": 152, "y": 632, "name": "Iceberg 4 - 16 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 4"], "music": 38}, {"name": "Iceberg 4 - 17", "level": 5, "stage": 4, "room": 17, "pointer": 3072413, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 6, "unkn2": 9, "x": 280, "y": 632, "name": "Iceberg 4 - 17 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 5"], "music": 38}, {"name": "Iceberg 4 - 18", "level": 5, "stage": 4, "room": 18, "pointer": 3404593, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 19, "unkn1": 94, "unkn2": 12, "x": 72, "y": 152, "name": "Iceberg 4 - 18 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [43, 16], [30, 16], [15, 16]], "locations": ["Iceberg 4 - Enemy 13 (Nruff)"], "music": 19}, {"name": "Iceberg 4 - 19", "level": 5, "stage": 4, "room": 19, "pointer": 3075826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 4 - 19 Exit 0", "access_rule": []}], "entity_load": [[31, 19], [42, 19]], "locations": ["Iceberg 4 - Name"], "music": 8}, {"name": "Iceberg 4 - 20", "level": 5, "stage": 4, "room": 20, "pointer": 2887943, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 4 - Complete"], "music": 5}, {"name": "Iceberg 5 - 0", "level": 5, "stage": 5, "room": 0, "pointer": 3316135, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 30, "unkn1": 75, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[79, 16], [76, 16], [81, 16], [78, 16], [77, 16], [82, 16], [80, 16], [83, 16]], "locations": ["Iceberg 5 - Enemy 1 (Bukiset (Burning))", "Iceberg 5 - Enemy 2 (Bukiset (Stone))", "Iceberg 5 - Enemy 3 (Bukiset (Ice))", "Iceberg 5 - Enemy 4 (Bukiset (Needle))", "Iceberg 5 - Enemy 5 (Bukiset (Clean))", "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", "Iceberg 5 - Enemy 7 (Bukiset (Spark))", "Iceberg 5 - Enemy 8 (Bukiset (Cutter))"], "music": 16}, {"name": "Iceberg 5 - 1", "level": 5, "stage": 5, "room": 1, "pointer": 3037607, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 72, "y": 104, "name": "Iceberg 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 2", "level": 5, "stage": 5, "room": 2, "pointer": 3103842, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk"], "default_exits": [{"room": 25, "unkn1": 27, "unkn2": 6, "x": 72, "y": 200, "name": "Iceberg 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[16, 16]], "locations": ["Iceberg 5 - Enemy 9 (Glunk)"], "music": 16}, {"name": "Iceberg 5 - 3", "level": 5, "stage": 5, "room": 3, "pointer": 3135899, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 4, "unkn1": 20, "unkn2": 7, "x": 72, "y": 88, "name": "Iceberg 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 10 (Wapod)"], "music": 16}, {"name": "Iceberg 5 - 4", "level": 5, "stage": 5, "room": 4, "pointer": 3180695, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 26, "unkn2": 5, "x": 56, "y": 104, "name": "Iceberg 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 11 (Tick)"], "music": 16}, {"name": "Iceberg 5 - 5", "level": 5, "stage": 5, "room": 5, "pointer": 3106064, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 24, "unkn1": 14, "unkn2": 6, "x": 168, "y": 152, "name": "Iceberg 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[58, 16], [14, 23], [4, 22]], "locations": ["Iceberg 5 - Enemy 12 (Madoo)"], "music": 16}, {"name": "Iceberg 5 - 6", "level": 5, "stage": 5, "room": 6, "pointer": 3276800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 59, "unkn2": 12, "x": 72, "y": 120, "name": "Iceberg 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[55, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 7", "level": 5, "stage": 5, "room": 7, "pointer": 3104585, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 25, "unkn2": 7, "x": 72, "y": 136, "name": "Iceberg 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 8", "level": 5, "stage": 5, "room": 8, "pointer": 3195121, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 35, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 8 Exit 0", "access_rule": []}], "entity_load": [[4, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 9", "level": 5, "stage": 5, "room": 9, "pointer": 3087198, "animal_pointers": [], "consumables": [{"idx": 16, "pointer": 200, "x": 256, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Boulder)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 28, "unkn1": 20, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [54, 16]], "locations": ["Iceberg 5 - 1-Up (Boulder)"], "music": 16}, {"name": "Iceberg 5 - 10", "level": 5, "stage": 5, "room": 10, "pointer": 3321612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 45, "unkn2": 15, "x": 72, "y": 120, "name": "Iceberg 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 11", "level": 5, "stage": 5, "room": 11, "pointer": 3139178, "animal_pointers": [], "consumables": [{"idx": 17, "pointer": 192, "x": 152, "y": 168, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Floor)"}], "consumables_pointer": 176, "enemies": ["Yaban"], "default_exits": [{"room": 12, "unkn1": 17, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 11 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [0, 22]], "locations": ["Iceberg 5 - Enemy 13 (Yaban)", "Iceberg 5 - 1-Up (Floor)"], "music": 16}, {"name": "Iceberg 5 - 12", "level": 5, "stage": 5, "room": 12, "pointer": 3118231, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 7, "x": 72, "y": 104, "name": "Iceberg 5 - 12 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 14 (Propeller)"], "music": 16}, {"name": "Iceberg 5 - 13", "level": 5, "stage": 5, "room": 13, "pointer": 3021658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 27, "unkn1": 16, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 13 Exit 0", "access_rule": []}], "entity_load": [[45, 16]], "locations": ["Iceberg 5 - Enemy 15 (Mariel)"], "music": 16}, {"name": "Iceberg 5 - 14", "level": 5, "stage": 5, "room": 14, "pointer": 3025398, "animal_pointers": [], "consumables": [{"idx": 24, "pointer": 200, "x": 208, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Peloo)"}], "consumables_pointer": 176, "enemies": [], "default_exits": [{"room": 15, "unkn1": 13, "unkn2": 9, "x": 72, "y": 216, "name": "Iceberg 5 - 14 Exit 0", "access_rule": []}], "entity_load": [[64, 16], [0, 22]], "locations": ["Iceberg 5 - 1-Up (Peloo)"], "music": 16}, {"name": "Iceberg 5 - 15", "level": 5, "stage": 5, "room": 15, "pointer": 3167445, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 13, "x": 72, "y": 152, "name": "Iceberg 5 - 15 Exit 0", "access_rule": []}], "entity_load": [[39, 16]], "locations": ["Iceberg 5 - Enemy 16 (Pteran)"], "music": 16}, {"name": "Iceberg 5 - 16", "level": 5, "stage": 5, "room": 16, "pointer": 3033990, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 33, "unkn1": 36, "unkn2": 9, "x": 168, "y": 152, "name": "Iceberg 5 - 16 Exit 0", "access_rule": []}], "entity_load": [[68, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 17", "level": 5, "stage": 5, "room": 17, "pointer": 3100111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 40, "unkn2": 7, "x": 72, "y": 200, "name": "Iceberg 5 - 17 Exit 0", "access_rule": []}], "entity_load": [[52, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 18", "level": 5, "stage": 5, "room": 18, "pointer": 3030947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 17, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 18 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": ["Iceberg 5 - Enemy 17 (Galbo)"], "music": 16}, {"name": "Iceberg 5 - 19", "level": 5, "stage": 5, "room": 19, "pointer": 3105326, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe"], "default_exits": [{"room": 21, "unkn1": 13, "unkn2": 4, "x": 72, "y": 152, "name": "Iceberg 5 - 19 Exit 0", "access_rule": []}], "entity_load": [[51, 16]], "locations": ["Iceberg 5 - Enemy 18 (KeKe)"], "music": 16}, {"name": "Iceberg 5 - 20", "level": 5, "stage": 5, "room": 20, "pointer": 3118928, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 19, "unkn1": 13, "unkn2": 6, "x": 72, "y": 264, "name": "Iceberg 5 - 20 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 5 - Enemy 19 (Nidoo)"], "music": 16}, {"name": "Iceberg 5 - 21", "level": 5, "stage": 5, "room": 21, "pointer": 3202517, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 22, "unkn1": 29, "unkn2": 9, "x": 72, "y": 72, "name": "Iceberg 5 - 21 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16]], "locations": ["Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", "Iceberg 5 - Enemy 22 (Bouncy Drawing)"], "music": 16}, {"name": "Iceberg 5 - 22", "level": 5, "stage": 5, "room": 22, "pointer": 3014656, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Joe"], "default_exits": [{"room": 23, "unkn1": 13, "unkn2": 4, "x": 72, "y": 104, "name": "Iceberg 5 - 22 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 23 (Joe)"], "music": 16}, {"name": "Iceberg 5 - 23", "level": 5, "stage": 5, "room": 23, "pointer": 3166550, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 34, "unkn1": 27, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 23 Exit 0", "access_rule": []}], "entity_load": [[67, 16]], "locations": ["Iceberg 5 - Enemy 24 (Kapar)"], "music": 16}, {"name": "Iceberg 5 - 24", "level": 5, "stage": 5, "room": 24, "pointer": 3029110, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gansan"], "default_exits": [{"room": 31, "unkn1": 10, "unkn2": 4, "x": 72, "y": 88, "name": "Iceberg 5 - 24 Exit 0", "access_rule": []}], "entity_load": [[75, 16]], "locations": ["Iceberg 5 - Enemy 25 (Gansan)"], "music": 16}, {"name": "Iceberg 5 - 25", "level": 5, "stage": 5, "room": 25, "pointer": 3156420, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sasuke"], "default_exits": [{"room": 3, "unkn1": 25, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 25 Exit 0", "access_rule": []}], "entity_load": [[30, 16]], "locations": ["Iceberg 5 - Enemy 26 (Sasuke)"], "music": 16}, {"name": "Iceberg 5 - 26", "level": 5, "stage": 5, "room": 26, "pointer": 3127877, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo"], "default_exits": [{"room": 8, "unkn1": 24, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 5 - 26 Exit 0", "access_rule": []}], "entity_load": [[18, 16]], "locations": ["Iceberg 5 - Enemy 27 (Togezo)"], "music": 16}, {"name": "Iceberg 5 - 27", "level": 5, "stage": 5, "room": 27, "pointer": 3256471, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Bobin"], "default_exits": [{"room": 14, "unkn1": 26, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 27 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [73, 16]], "locations": ["Iceberg 5 - Enemy 28 (Sparky)", "Iceberg 5 - Enemy 29 (Bobin)"], "music": 16}, {"name": "Iceberg 5 - 28", "level": 5, "stage": 5, "room": 28, "pointer": 3029723, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly"], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 248, "name": "Iceberg 5 - 28 Exit 0", "access_rule": []}], "entity_load": [[6, 16]], "locations": ["Iceberg 5 - Enemy 30 (Chilly)"], "music": 16}, {"name": "Iceberg 5 - 29", "level": 5, "stage": 5, "room": 29, "pointer": 3526568, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 29 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [14, 23]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 30", "level": 5, "stage": 5, "room": 30, "pointer": 3022285, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 13, "unkn2": 5, "x": 88, "y": 104, "name": "Iceberg 5 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 1", "Iceberg 5 - Animal 2"], "music": 40}, {"name": "Iceberg 5 - 31", "level": 5, "stage": 5, "room": 31, "pointer": 3026019, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 72, "y": 200, "name": "Iceberg 5 - 31 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 3", "Iceberg 5 - Animal 4"], "music": 40}, {"name": "Iceberg 5 - 32", "level": 5, "stage": 5, "room": 32, "pointer": 3039996, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 32 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 5", "Iceberg 5 - Animal 6"], "music": 40}, {"name": "Iceberg 5 - 33", "level": 5, "stage": 5, "room": 33, "pointer": 3015302, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 33 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 7", "Iceberg 5 - Animal 8"], "music": 40}, {"name": "Iceberg 5 - 34", "level": 5, "stage": 5, "room": 34, "pointer": 3185868, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 35, "unkn1": 35, "unkn2": 9, "x": 200, "y": 328, "name": "Iceberg 5 - 34 Exit 0", "access_rule": []}], "entity_load": [[72, 16], [4, 22], [14, 23]], "locations": ["Iceberg 5 - Enemy 31 (Peran)"], "music": 16}, {"name": "Iceberg 5 - 35", "level": 5, "stage": 5, "room": 35, "pointer": 3865635, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 12, "unkn2": 7, "x": 168, "y": 1384, "name": "Iceberg 5 - 35 Exit 0", "access_rule": []}], "entity_load": [[17, 16], [4, 22]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 36", "level": 5, "stage": 5, "room": 36, "pointer": 3024154, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 37, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 5 - 36 Exit 0", "access_rule": []}], "entity_load": [[32, 19], [42, 19]], "locations": ["Iceberg 5 - Shiro"], "music": 8}, {"name": "Iceberg 5 - 37", "level": 5, "stage": 5, "room": 37, "pointer": 2890594, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 5 - Complete"], "music": 5}, {"name": "Iceberg 6 - 0", "level": 5, "stage": 6, "room": 0, "pointer": 3385305, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 28, "x": 136, "y": 184, "name": "Iceberg 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 12, "unkn2": 28, "x": 248, "y": 184, "name": "Iceberg 6 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 18, "unkn2": 28, "x": 360, "y": 184, "name": "Iceberg 6 - 0 Exit 2", "access_rule": []}], "entity_load": [[15, 16]], "locations": ["Iceberg 6 - Enemy 1 (Nruff)"], "music": 12}, {"name": "Iceberg 6 - 1", "level": 5, "stage": 6, "room": 1, "pointer": 3197599, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 1 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 1", "Iceberg 6 - Animal 2", "Iceberg 6 - Animal 3"], "music": 12}, {"name": "Iceberg 6 - 2", "level": 5, "stage": 6, "room": 2, "pointer": 3097113, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 2 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 3", "level": 5, "stage": 6, "room": 3, "pointer": 3198422, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 3 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 3 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 3 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 4", "Iceberg 6 - Animal 5", "Iceberg 6 - Animal 6"], "music": 12}, {"name": "Iceberg 6 - 4", "level": 5, "stage": 6, "room": 4, "pointer": 3210507, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 4 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 5", "level": 5, "stage": 6, "room": 5, "pointer": 3196776, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 212, "x": 136, "y": 120, "etype": 22, "vtype": 2, "name": "Iceberg 6 - Maxim Tomato (Left)"}, {"idx": 1, "pointer": 220, "x": 248, "y": 120, "etype": 22, "vtype": 0, "name": "Iceberg 6 - 1-Up (Middle)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 4, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 5 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 5 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 5 Exit 2", "access_rule": []}], "entity_load": [[2, 22], [0, 22], [14, 23]], "locations": ["Iceberg 6 - Maxim Tomato (Left)", "Iceberg 6 - 1-Up (Middle)"], "music": 12}, {"name": "Iceberg 6 - 6", "level": 5, "stage": 6, "room": 6, "pointer": 3208130, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 7, "unkn1": 9, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 6 - Enemy 2 (Nidoo)"], "music": 12}, {"name": "Iceberg 6 - 7", "level": 5, "stage": 6, "room": 7, "pointer": 3124478, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky"], "default_exits": [{"room": 8, "unkn1": 17, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[8, 16]], "locations": ["Iceberg 6 - Enemy 3 (Sparky)"], "music": 12}, {"name": "Iceberg 6 - 8", "level": 5, "stage": 6, "room": 8, "pointer": 3110431, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 8 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 14, "unkn2": 5, "x": 296, "y": 136, "name": "Iceberg 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 9", "level": 5, "stage": 6, "room": 9, "pointer": 3139832, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[2, 27]], "locations": ["Iceberg 6 - Miniboss 1 (Blocky)"], "music": 12}, {"name": "Iceberg 6 - 10", "level": 5, "stage": 6, "room": 10, "pointer": 3119624, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 11", "level": 5, "stage": 6, "room": 11, "pointer": 3141139, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 12, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Iceberg 6 - Miniboss 2 (Jumper Shoot)"], "music": 12}, {"name": "Iceberg 6 - 12", "level": 5, "stage": 6, "room": 12, "pointer": 3123788, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 12 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 13", "level": 5, "stage": 6, "room": 13, "pointer": 3143741, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 6 - Miniboss 3 (Yuki)"], "music": 12}, {"name": "Iceberg 6 - 14", "level": 5, "stage": 6, "room": 14, "pointer": 3120319, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 14 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 15", "level": 5, "stage": 6, "room": 15, "pointer": 3135238, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 16, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[27, 16]], "locations": ["Iceberg 6 - Enemy 4 (Sir Kibble)"], "music": 12}, {"name": "Iceberg 6 - 16", "level": 5, "stage": 6, "room": 16, "pointer": 3123096, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 16 Exit 0", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 17", "level": 5, "stage": 6, "room": 17, "pointer": 3144389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 17 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Iceberg 6 - Miniboss 4 (Haboki)"], "music": 12}, {"name": "Iceberg 6 - 18", "level": 5, "stage": 6, "room": 18, "pointer": 3121014, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 19", "level": 5, "stage": 6, "room": 19, "pointer": 3017228, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 19 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Iceberg 6 - Miniboss 5 (Boboo)"], "music": 12}, {"name": "Iceberg 6 - 20", "level": 5, "stage": 6, "room": 20, "pointer": 3121709, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 21, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 21", "level": 5, "stage": 6, "room": 21, "pointer": 3145036, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 21 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Iceberg 6 - Miniboss 6 (Captain Stitch)"], "music": 12}, {"name": "Iceberg 6 - 22", "level": 5, "stage": 6, "room": 22, "pointer": 3116830, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 7, "unkn2": 5, "x": 136, "y": 152, "name": "Iceberg 6 - 22 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 23", "level": 5, "stage": 6, "room": 23, "pointer": 3045263, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 24, "unkn1": 17, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [42, 19]], "locations": ["Iceberg 6 - Angel"], "music": 8}, {"name": "Iceberg 6 - 24", "level": 5, "stage": 6, "room": 24, "pointer": 2889389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 6 - Complete"], "music": 5}, {"name": "Iceberg Boss - 0", "level": 5, "stage": 7, "room": 0, "pointer": 2980207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[8, 18]], "locations": ["Iceberg - Boss (Dedede) Purified", "Level 5 Boss"], "music": 7}] \ No newline at end of file From dd8a26cc7d908ba1bed80a570a959c4eb27e5dcf Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 21 Aug 2023 10:35:23 -0500 Subject: [PATCH 111/165] Apply suggestions from code review Co-authored-by: Alchav <59858495+Alchav@users.noreply.github.com> --- Generate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Generate.py b/Generate.py index 76052544bcd9..fa2f53ee3ed9 100644 --- a/Generate.py +++ b/Generate.py @@ -478,7 +478,7 @@ def roll_settings(weights: dict, plando_options: PlandoOptions = PlandoOptions.b handle_option(ret, game_weights, option_key, option, plando_options) if PlandoOptions.items in plando_options: ret.plando_items = game_weights.get("plando_items", []) - if ret.game == "Minecraft" or ret.game == "Ocarina of Time" or ret.game == "Kirby's Dream Land 3": + if ret.game in ("Minecraft", "Ocarina of Time", "Kirby's Dream Land 3"): # bad hardcoded behavior to make this work for now ret.plando_connections = [] if PlandoOptions.connections in plando_options: From db3acfd4358c9e5bf34595271bac4198c8476555 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 21 Aug 2023 10:37:37 -0500 Subject: [PATCH 112/165] clean bukiset rules --- worlds/kdl3/Rules.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 8306502c7ec2..68290d5dac4b 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -93,12 +93,7 @@ def can_assemble_rob(state: "CollectionState", player: int, copy_abilities: typi # check animal requirements if not can_reach_coo(state, player) and can_reach_kine(state, player): return False - # probably some cleaner way to handle this - room1 = EnemyAbilities.enemy_restrictive[1] - room2 = EnemyAbilities.enemy_restrictive[2] - room3 = EnemyAbilities.enemy_restrictive[3] - room4 = EnemyAbilities.enemy_restrictive[4] - for abilities, bukisets in [room1, room2, room3, room4]: + for abilities, bukisets in EnemyAbilities.enemy_restrictive[1:5]: iterator = iter(x for x in bukisets if copy_abilities[x] in abilities) target_bukiset = next(iterator, None) can_reach = False From 0e1e051a72b4cf79a0c9301dd73ef71c6050c08e Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 21 Aug 2023 10:41:37 -0500 Subject: [PATCH 113/165] pep8 and clean unused imports --- worlds/kdl3/Rules.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 68290d5dac4b..1ac6ad2ff14b 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -1,14 +1,12 @@ from worlds.generic.Rules import set_rule, add_rule -from .Locations import location_table, level_consumables from .Names import LocationName, EnemyAbilities -from .Items import copy_ability_table import typing -from BaseClasses import MultiWorld if typing.TYPE_CHECKING: from . import KDL3World from BaseClasses import CollectionState + def can_reach_level(state: "CollectionState", player: int, level: int, open_world: bool, ow_boss_req: int): if level == 1: @@ -89,7 +87,7 @@ def can_reach_cutter(state: "CollectionState", player: int) -> bool: } -def can_assemble_rob(state: "CollectionState", player: int, copy_abilities: typing.Dict[str,str]): +def can_assemble_rob(state: "CollectionState", player: int, copy_abilities: typing.Dict[str, str]): # check animal requirements if not can_reach_coo(state, player) and can_reach_kine(state, player): return False @@ -106,7 +104,7 @@ def can_assemble_rob(state: "CollectionState", player: int, copy_abilities: typi return can_reach_parasol(state, player) and can_reach_stone(state, player) -def can_fix_angel_wings(state: "CollectionState", player: int, copy_abilities: typing.Dict[str,str]): +def can_fix_angel_wings(state: "CollectionState", player: int, copy_abilities: typing.Dict[str, str]): can_reach = True for enemy in {"Sparky", "Blocky", "Jumper Shoot", "Yuki", "Sir Kibble", "Haboki", "Boboo", "Captain Stitch"}: can_reach = can_reach & ability_map[copy_abilities[enemy]](state, player) From 865d89814142467b2165f44773f08b15cea5ca81 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 21 Aug 2023 18:46:20 -0500 Subject: [PATCH 114/165] initial removal of events for non-open_world --- worlds/kdl3/Regions.py | 27 ++++++++++++++------------- worlds/kdl3/Rom.py | 2 +- worlds/kdl3/Rules.py | 14 +++++++++----- worlds/kdl3/__init__.py | 20 ++++++++++---------- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 240a26459675..2c5bc4514036 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -3,15 +3,13 @@ import typing from pkgutil import get_data -from BaseClasses import Entrance, Region -from Fill import fill_restrictive +from BaseClasses import Region from worlds.AutoWorld import World -from .Locations import KDL3Location, location_table, level_consumables +from .Locations import KDL3Location, location_table from .Names import LocationName -from .Names.AnimalFriendSpawns import animal_friend_spawns from .Options import BossShuffle from .Room import Room -from ..generic.Rules import add_item_rule, add_rule +from worlds.generic.Rules import add_item_rule if typing.TYPE_CHECKING: from . import KDL3World @@ -49,7 +47,8 @@ def generate_rooms(world: World, door_shuffle: bool, level_regions: typing.Dict[ room_entry["animal_pointers"], room_entry["enemies"], room_entry["entity_load"], room_entry["consumables"], room_entry["consumables_pointer"]) room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else - None for location in room_entry["locations"] if not any([x in location for x in ["1-Up", "Maxim"]]) or + None for location in room_entry["locations"] + if not any([x in location for x in ["1-Up", "Maxim"]]) or world.multiworld.consumables[world.player]}, KDL3Location) rooms[room.name] = room for location in room.locations: @@ -83,8 +82,10 @@ def generate_rooms(world: World, door_shuffle: bool, level_regions: typing.Dict[ exits.keys(), exits ) - if any(["Complete" in location.name for location in room.locations]): - room.add_locations({f"{level_names[room.level]} {room.stage} - Stage Completion": None}, KDL3Location) + if world.multiworld.open_world[world.player]: + if any(["Complete" in location.name for location in room.locations]): + room.add_locations({f"{level_names[room.level]} {room.stage} - Stage Completion": None}, + KDL3Location) for level in world.player_levels: for stage in range(6): @@ -92,10 +93,10 @@ def generate_rooms(world: World, door_shuffle: bool, level_regions: typing.Dict[ level_regions[level].add_exits([first_rooms[proper_stage].name], {first_rooms[proper_stage].name: (lambda state: True) if world.multiworld.open_world[world.player] or - stage == 0 else lambda state, level=level, stage=stage: state.has( - f"{LocationName.level_names_inverse[level]} " - f"{f'{stage}'}" - f" - Stage Completion", world.player)}) + stage == 0 else lambda state, level=level, stage=stage: state.can_reach( + world.multiworld.get_location( + location_table[world.player_levels[level][stage-1]], world.player), + world.player)}) else: level_regions[level].add_exits([first_rooms[0x770200 + level - 1].name]) @@ -193,7 +194,7 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo return levels -def create_levels(world: World) -> None: +def create_levels(world: "KDL3World") -> None: menu = Region("Menu", world.player, world.multiworld) level1 = Region("Grass Land", world.player, world.multiworld) level2 = Region("Ripple Field", world.player, world.multiworld) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index d6c4fffed788..6ca7382eb985 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -377,7 +377,7 @@ def patch(self, target: str): def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_required: int, - boss_requirements: Dict[int, int], shuffled_levels: Dict[int, List[int]], bb_boss_enabled: Dict[int, int], + boss_requirements: Dict[int, int], shuffled_levels: Dict[int, List[int]], bb_boss_enabled: List[bool], copy_abilities: Dict[str, str], slot_random: Random): # increase BWRAM by 0x8000 rom.write_byte(0x7FD8, 0x06) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 1ac6ad2ff14b..9fd5d5f876bd 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -1,5 +1,6 @@ from worlds.generic.Rules import set_rule, add_rule from .Names import LocationName, EnemyAbilities +from .Locations import location_table import typing if typing.TYPE_CHECKING: @@ -8,14 +9,14 @@ def can_reach_level(state: "CollectionState", player: int, level: int, open_world: bool, - ow_boss_req: int): + ow_boss_req: int, player_levels: typing.Dict[int, typing.Dict[int, int]]): if level == 1: return True else: if open_world: return state.has(f"{LocationName.level_names_inverse[level - 1]} - Stage Completion", player, ow_boss_req) else: - return state.has(f"{LocationName.level_names_inverse[level - 1]} 6 - Stage Completion", player) + return state.can_reach(location_table[player_levels[level - 1][5]], "Location", player) def can_reach_rick(state: "CollectionState", player: int) -> bool: @@ -250,12 +251,14 @@ def set_rules(world: "KDL3World") -> None: lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[i - 1]) and can_reach_level(state, world.player, i + 1, world.multiworld.open_world[world.player], - world.multiworld.ow_boss_requirement[world.player])) + world.multiworld.ow_boss_requirement[world.player], + world.player_levels)) set_rule(world.multiworld.get_location(purification, world.player), lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[i - 1]) and can_reach_level(state, world.player, i + 1, world.multiworld.open_world[world.player], - world.multiworld.ow_boss_requirement[world.player])) + world.multiworld.ow_boss_requirement[world.player], + world.player_levels)) if world.multiworld.strict_bosses[world.player]: for level in range(2, 6): @@ -269,7 +272,8 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), lambda state, i=level: can_reach_level(state, world.player, i, world.multiworld.open_world[world.player], - world.multiworld.ow_boss_requirement[world.player])) + world.multiworld.ow_boss_requirement[world.player], + world.player_levels)) if world.multiworld.goal_speed[world.player] == 0: add_rule(world.multiworld.get_entrance("To Level 6", world.player), diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index e93dca581b83..7b049bfd95a5 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -139,7 +139,8 @@ def pre_fill(self) -> None: animal_pool.append("Kine Spawn") locations = [self.multiworld.get_location(spawn, self.player) for spawn in spawns] items = [self.create_item(animal) for animal in animal_pool] - fill_restrictive(self.multiworld, self.multiworld.get_all_state(False), locations, items) + allstate = self.multiworld.get_all_state(False) + fill_restrictive(self.multiworld, allstate, locations, items, True, True) else: animal_friends = animal_friend_spawns.copy() for animal in animal_friends: @@ -215,15 +216,14 @@ def create_items(self) -> None: for _ in range(trap_amount)]) itempool.extend([self.create_item("Heart Star", True) for _ in range(non_required_heart_stars)]) self.multiworld.itempool += itempool - - for level in self.player_levels: - for stage in range(0, 6): - self.multiworld.get_location(location_table[self.player_levels[level][stage]] - .replace("Complete", "Stage Completion"), self.player) \ - .place_locked_item(KDL3Item( - f"{LocationName.level_names_inverse[level]}" - f"{f' {stage + 1} ' if not self.multiworld.open_world[self.player] else ' '}- Stage Completion", - ItemClassification.progression, None, self.player)) + if self.multiworld.open_world[self.player]: + for level in self.player_levels: + for stage in range(0, 6): + self.multiworld.get_location(location_table[self.player_levels[level][stage]] + .replace("Complete", "Stage Completion"), self.player) \ + .place_locked_item(KDL3Item( + f"{LocationName.level_names_inverse[level]} - Stage Completion", + ItemClassification.progression, None, self.player)) set_rules = set_rules From 237cbf6501b5a49e8b6523a48606533ac41026f8 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 21 Aug 2023 23:42:41 -0500 Subject: [PATCH 115/165] re-order pre_fill to properly handle animal fill --- worlds/kdl3/__init__.py | 51 +++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 7b049bfd95a5..6cf7332892d2 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -110,6 +110,32 @@ def get_trap_item_name(self) -> str: self.multiworld.ability_trap_weight[self.player]])[0] def pre_fill(self) -> None: + if self.multiworld.copy_ability_randomization[self.player]: + # randomize copy abilities + valid_abilities = list(copy_ability_access_table.keys()) + enemies_to_set = list(self.copy_abilities.keys()) + # now for the edge cases + for abilities, enemies in enemy_restrictive: + available_enemies = list() + for enemy in enemies: + if enemy not in enemies_to_set: + if self.copy_abilities[enemy] in abilities: + break + else: + available_enemies.append(enemy) + else: + chosen_enemy = self.random.choice(available_enemies) + chosen_ability = self.random.choice(tuple(abilities)) + self.copy_abilities[chosen_enemy] = chosen_ability + enemies_to_set.remove(chosen_enemy) + # place remaining + for enemy in enemies_to_set: + self.copy_abilities[enemy] = self.random \ + .choice(valid_abilities) + + for enemy in enemy_mapping: + self.multiworld.get_location(enemy, self.player) \ + .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) # fill animals if self.multiworld.animal_randomization[self.player] != 0: spawns = [animal for animal in animal_friend_spawns.keys() if @@ -147,32 +173,7 @@ def pre_fill(self) -> None: self.multiworld.get_location(animal, self.player) \ .place_locked_item(self.create_item(animal_friends[animal])) - if self.multiworld.copy_ability_randomization[self.player]: - # randomize copy abilities - valid_abilities = list(copy_ability_access_table.keys()) - enemies_to_set = list(self.copy_abilities.keys()) - # now for the edge cases - for abilities, enemies in enemy_restrictive: - available_enemies = list() - for enemy in enemies: - if enemy not in enemies_to_set: - if self.copy_abilities[enemy] in abilities: - break - else: - available_enemies.append(enemy) - else: - chosen_enemy = self.random.choice(available_enemies) - chosen_ability = self.random.choice(tuple(abilities)) - self.copy_abilities[chosen_enemy] = chosen_ability - enemies_to_set.remove(chosen_enemy) - # place remaining - for enemy in enemies_to_set: - self.copy_abilities[enemy] = self.random \ - .choice(valid_abilities) - for enemy in enemy_mapping: - self.multiworld.get_location(enemy, self.player) \ - .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) def create_items(self) -> None: itempool = [] From 5be0f6af050f963cd5cf2d50d38b24ec22c62ae0 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 24 Aug 2023 15:47:02 -0500 Subject: [PATCH 116/165] clean tests --- worlds/kdl3/test/TestGoal.py | 10 ++++----- worlds/kdl3/test/TestLocations.py | 11 +++++----- worlds/kdl3/test/TestShuffles.py | 36 +++++++++++++++---------------- worlds/kdl3/test/__init__.py | 5 +++-- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/worlds/kdl3/test/TestGoal.py b/worlds/kdl3/test/TestGoal.py index 2bf9e01e78da..af5bc6bd1a1b 100644 --- a/worlds/kdl3/test/TestGoal.py +++ b/worlds/kdl3/test/TestGoal.py @@ -14,10 +14,10 @@ def testGoal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) - self.assertEqual(self.count("Heart Star"), 14) + self.assertEqual(self.count("Heart Star"), 14, str(self.multiworld.seed)) self.assertBeatable(False) self.collect(heart_stars[14:15]) - self.assertEqual(self.count("Heart Star"), 15) + self.assertEqual(self.count("Heart Star"), 15, str(self.multiworld.seed)) self.assertBeatable(True) self.remove([self.get_item_by_name("Love-Love Rod")]) self.collect_by_name("Kine") # Ensure a little more progress, but leave out cutter and burning @@ -39,16 +39,16 @@ def testGoal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) - self.assertEqual(self.count("Heart Star"), 14) + self.assertEqual(self.count("Heart Star"), 14, str(self.multiworld.seed)) self.assertBeatable(False) self.collect(heart_stars[14:15]) - self.assertEqual(self.count("Heart Star"), 15) + self.assertEqual(self.count("Heart Star"), 15, str(self.multiworld.seed)) self.assertBeatable(False) self.collect_by_name(["Burning", "Cutter", "Kine"]) self.assertBeatable(True) self.remove([self.get_item_by_name("Love-Love Rod")]) self.collect(heart_stars) - self.assertEqual(self.count("Heart Star"), 30) + self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) def testKine(self): diff --git a/worlds/kdl3/test/TestLocations.py b/worlds/kdl3/test/TestLocations.py index 6eaaf9ced393..90a7f34e6eea 100644 --- a/worlds/kdl3/test/TestLocations.py +++ b/worlds/kdl3/test/TestLocations.py @@ -38,9 +38,9 @@ def testSimpleHeartStars(self): def run_location_test(self, location: str, itempool: typing.List[str]): items = itempool.copy() while len(itempool) > 0: - assert not self.can_reach_location(location) + self.assertFalse(self.can_reach_location(location), str(self.multiworld.seed)) self.collect_by_name(itempool.pop()) - assert self.can_reach_location(location) + self.assertTrue(self.can_reach_location(location), str(self.multiworld.seed)) self.remove(self.get_items_by_name(items)) @@ -59,11 +59,10 @@ class TestShiro(KDL3TestBase): } def testShiro(self): - assert not self.can_reach_location("Iceberg 5 - Shiro") + self.assertFalse(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed)) self.collect_by_name("Nago") - assert not self.can_reach_location("Iceberg 5 - Shiro") + self.assertFalse(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed)) # despite Shiro only requiring Nago for logic, it cannot be in logic because our two accessible stages # do not actually give the player access to Nago, thus we need Kine to pass 2-5 self.collect_by_name("Kine") - assert self.can_reach_location("Iceberg 5 - Shiro") - + self.assertTrue(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed)) diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/TestShuffles.py index 1b12a59ec998..a875b9e34241 100644 --- a/worlds/kdl3/test/TestShuffles.py +++ b/worlds/kdl3/test/TestShuffles.py @@ -17,16 +17,16 @@ def testGoal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) - self.assertEqual(self.count("Heart Star"), 14) + self.assertEqual(self.count("Heart Star"), 14, str(self.multiworld.seed)) self.assertBeatable(False) self.collect(heart_stars[14:15]) - self.assertEqual(self.count("Heart Star"), 15) + self.assertEqual(self.count("Heart Star"), 15, str(self.multiworld.seed)) self.assertBeatable(False) self.collect_by_name(["Burning", "Cutter", "Kine"]) self.assertBeatable(True) self.remove([self.get_item_by_name("Love-Love Rod")]) self.collect(heart_stars) - self.assertEqual(self.count("Heart Star"), 30) + self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) def testKine(self): @@ -61,7 +61,7 @@ def testValidAbilitiesForROB(self): required_abilities.append(tuple(potential_abilities)) collected_abilities = list() for group in required_abilities: - self.assertFalse(len(group) == 0) + self.assertFalse(len(group) == 0, str(self.multiworld.seed)) collected_abilities.append(group[0]) self.collect_by_name([ability.replace(" Ability", "") for ability in collected_abilities]) if "Parasol Ability" not in collected_abilities or "Stone Ability" not in collected_abilities: @@ -70,10 +70,10 @@ def testValidAbilitiesForROB(self): if "Cutter Ability" not in collected_abilities: # we can't actually reach 3-6 without Cutter - assert not self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B") + self.assertFalse(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), str(self.multiworld.seed)) self.collect_by_name(["Cutter"]) - assert self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B") + self.assertTrue(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), str(self.multiworld.seed)) class TestAnimalShuffle(KDL3TestBase): @@ -90,16 +90,16 @@ def testGoal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) - self.assertEqual(self.count("Heart Star"), 14) + self.assertEqual(self.count("Heart Star"), 14, str(self.multiworld.seed)) self.assertBeatable(False) self.collect(heart_stars[14:15]) - self.assertEqual(self.count("Heart Star"), 15) + self.assertEqual(self.count("Heart Star"), 15, str(self.multiworld.seed)) self.assertBeatable(False) self.collect_by_name(["Burning", "Cutter", "Kine"]) self.assertBeatable(True) self.remove([self.get_item_by_name("Love-Love Rod")]) self.collect(heart_stars) - self.assertEqual(self.count("Heart Star"), 30) + self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) def testKine(self): @@ -115,9 +115,9 @@ def testBurning(self): self.assertBeatable(False) def testLockedAnimals(self): - self.assertTrue(self, self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") - self.assertTrue(self, self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") - self.assertTrue(self, self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) + self.assertTrue(self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") + self.assertTrue(self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") + self.assertTrue(self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) class TestAllShuffle(KDL3TestBase): @@ -135,16 +135,16 @@ def testGoal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) - self.assertEqual(self.count("Heart Star"), 14) + self.assertEqual(self.count("Heart Star"), 14, str(self.multiworld.seed)) self.assertBeatable(False) self.collect(heart_stars[14:15]) - self.assertEqual(self.count("Heart Star"), 15) + self.assertEqual(self.count("Heart Star"), 15, str(self.multiworld.seed)) self.assertBeatable(False) self.collect_by_name(["Burning", "Cutter", "Kine"]) self.assertBeatable(True) self.remove([self.get_item_by_name("Love-Love Rod")]) self.collect(heart_stars) - self.assertEqual(self.count("Heart Star"), 30) + self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) def testKine(self): @@ -160,6 +160,6 @@ def testBurning(self): self.assertBeatable(False) def testLockedAnimals(self): - self.assertTrue(self, self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") - self.assertTrue(self, self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") - self.assertTrue(self, self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) \ No newline at end of file + self.assertTrue(self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") + self.assertTrue(self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") + self.assertTrue(self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) diff --git a/worlds/kdl3/test/__init__.py b/worlds/kdl3/test/__init__.py index 64a2ec44f070..d962b7efa97e 100644 --- a/worlds/kdl3/test/__init__.py +++ b/worlds/kdl3/test/__init__.py @@ -4,8 +4,9 @@ from BaseClasses import MultiWorld, PlandoOptions from test.TestBase import WorldTestBase from test.general import gen_steps -from ... import AutoWorld -from ...AutoWorld import call_all +from worlds import AutoWorld +from worlds.AutoWorld import call_all + class KDL3TestBase(WorldTestBase): game = "Kirby's Dream Land 3" From d0ec94eccbffb71472a483e1098931c061ec2e7f Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 25 Aug 2023 02:43:06 -0500 Subject: [PATCH 117/165] adjust rob rule --- worlds/kdl3/Rules.py | 2 +- worlds/kdl3/__init__.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 9fd5d5f876bd..cb6aa9b07c08 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -90,7 +90,7 @@ def can_reach_cutter(state: "CollectionState", player: int) -> bool: def can_assemble_rob(state: "CollectionState", player: int, copy_abilities: typing.Dict[str, str]): # check animal requirements - if not can_reach_coo(state, player) and can_reach_kine(state, player): + if not (can_reach_coo(state, player) and can_reach_kine(state, player)): return False for abilities, bukisets in EnemyAbilities.enemy_restrictive[1:5]: iterator = iter(x for x in bukisets if copy_abilities[x] in abilities) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 6cf7332892d2..fa7d7886e98e 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -174,7 +174,6 @@ def pre_fill(self) -> None: .place_locked_item(self.create_item(animal_friends[animal])) - def create_items(self) -> None: itempool = [] itempool.extend([self.create_item(name) for name in copy_ability_table]) From 5ad43890eb18068de723ab79219736bc5cc9c934 Mon Sep 17 00:00:00 2001 From: Doug Hoskisson Date: Fri, 25 Aug 2023 19:38:01 -0700 Subject: [PATCH 118/165] some cleaning from type checking and linting --- worlds/kdl3/Locations.py | 4 +-- worlds/kdl3/Names/EnemyAbilities.py | 2 +- worlds/kdl3/Names/LocationName.py | 12 ++++----- worlds/kdl3/Names/__init__.py | 0 worlds/kdl3/Options.py | 8 +++--- worlds/kdl3/Regions.py | 11 +++----- worlds/kdl3/Rom.py | 2 +- worlds/kdl3/Room.py | 4 +-- worlds/kdl3/Rules.py | 39 ++++++++++++++++------------- 9 files changed, 41 insertions(+), 41 deletions(-) create mode 100644 worlds/kdl3/Names/__init__.py diff --git a/worlds/kdl3/Locations.py b/worlds/kdl3/Locations.py index 2fe7b965c84c..d87bf8f8c1bc 100644 --- a/worlds/kdl3/Locations.py +++ b/worlds/kdl3/Locations.py @@ -1,5 +1,5 @@ import typing -from BaseClasses import Location +from BaseClasses import Location, Region from .Names import LocationName if typing.TYPE_CHECKING: @@ -10,7 +10,7 @@ class KDL3Location(Location): game: str = "Kirby's Dream Land 3" room: typing.Optional["Room"] = None - def __init__(self, player: int, name: str, address: typing.Optional[int], parent): + def __init__(self, player: int, name: str, address: typing.Optional[int], parent: typing.Union[Region, None]): super().__init__(player, name, address, parent) self.event = not address diff --git a/worlds/kdl3/Names/EnemyAbilities.py b/worlds/kdl3/Names/EnemyAbilities.py index 4e6a8063a72e..596eda939a5d 100644 --- a/worlds/kdl3/Names/EnemyAbilities.py +++ b/worlds/kdl3/Names/EnemyAbilities.py @@ -807,7 +807,7 @@ 'Haboki': 'Clean Ability', } -enemy_restrictive: List[Tuple[Set, Set]] = [ +enemy_restrictive: List[Tuple[Set[str], Set[str]]] = [ # abilities, enemies, set_all (False to set any) ({"Burning Ability", "Stone Ability"}, {"Rocky", "Sparky", "Babut", "Squishy", }), # Ribbon Field 5 - 7 # Sand Canyon 6 diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index 006e26230cd5..3d72c9fefc4f 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -144,12 +144,12 @@ # Boss Names boss_names = { - "Whispy Woods": 0x770200, - "Acro": 0x770201, - "Pon & Con": 0x770202, - "Ado": 0x770203, - "King Dedede": 0x770204 - } + "Whispy Woods": 0x770200, + "Acro": 0x770201, + "Pon & Con": 0x770202, + "Ado": 0x770203, + "King Dedede": 0x770204 +} # Goal Mapping goals = { diff --git a/worlds/kdl3/Names/__init__.py b/worlds/kdl3/Names/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 48bb161d6a71..eb0d7de90337 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -20,7 +20,7 @@ class Goal(Choice): default = 0 @classmethod - def get_option_name(cls, value) -> str: + def get_option_name(cls, value: int) -> str: if cls.auto_display_name and value == 2: return cls.name_lookup[value].upper() else: @@ -81,9 +81,9 @@ class BossShuffle(PlandoBosses): Singularity: All (non-Zero) bosses will be replaced with a single boss Supports plando placement. """ - bosses = LocationName.boss_names.keys() + bosses = frozenset(LocationName.boss_names.keys()) - locations = LocationName.level_names.keys() + locations = frozenset(LocationName.level_names.keys()) duplicate_bosses = True @@ -355,7 +355,7 @@ class VirtualConsoleChanges(Choice): default = 1 -kdl3_options: typing.Dict[str, type(Option)] = { +kdl3_options: typing.Dict[str, typing.Type[Option[typing.Any]]] = { "death_link": DeathLink, "game_language": GameLanguage, "goal": Goal, diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 240a26459675..66153b62d953 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -3,18 +3,13 @@ import typing from pkgutil import get_data -from BaseClasses import Entrance, Region -from Fill import fill_restrictive +from BaseClasses import Region from worlds.AutoWorld import World -from .Locations import KDL3Location, location_table, level_consumables +from .Locations import KDL3Location from .Names import LocationName -from .Names.AnimalFriendSpawns import animal_friend_spawns from .Options import BossShuffle from .Room import Room -from ..generic.Rules import add_item_rule, add_rule - -if typing.TYPE_CHECKING: - from . import KDL3World +from ..generic.Rules import add_item_rule default_levels = { 1: [0x770001, 0x770002, 0x770003, 0x770004, 0x770005, 0x770006, 0x770200], diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index d6c4fffed788..f868f2394358 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -271,7 +271,7 @@ def read_bytes(self, offset: int, length: int): def write_byte(self, offset: int, value: int): self.file[offset] = value - def write_bytes(self, offset: int, values): + def write_bytes(self, offset: int, values: bytes) -> None: self.file[offset:offset + len(values)] = values def write_to_file(self, file: str): diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index e7488a43cf2a..c011535ed6a7 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -1,7 +1,6 @@ import struct import typing -from BaseClasses import CollectionState, Region, ItemClassification -from struct import unpack +from BaseClasses import Region, ItemClassification if typing.TYPE_CHECKING: from .Rom import RomData @@ -53,6 +52,7 @@ def patch(self, rom: "RomData"): load_len = len(self.entity_load) for consumable in self.consumables: location = next(x for x in self.locations if x.name == consumable["name"]) + assert location.item is_progression = location.item.classification & ItemClassification.progression if load_len == 8: # edge case, there is exactly 1 room with 8 entities and only 1 consumable among them diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 1ac6ad2ff14b..e52d147ded5f 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -74,7 +74,7 @@ def can_reach_cutter(state: "CollectionState", player: int) -> bool: return state.has("Cutter", player) and state.has("Cutter Ability", player) -ability_map = { +ability_map: dict[str, typing.Callable[[CollectionState, int], bool]] = { "No Ability": lambda state, player: True, "Burning Ability": can_reach_burning, "Stone Ability": can_reach_stone, @@ -130,8 +130,10 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.ripple_field_toad, world.player), lambda state: can_reach_needle(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_mama_pitch, world.player), - lambda state: can_reach_pitch(state, world.player) and can_reach_kine(state, world.player) - and can_reach_burning(state, world.player) and can_reach_stone(state, world.player)) + lambda state: (can_reach_pitch(state, world.player) and + can_reach_kine(state, world.player) and + can_reach_burning(state, world.player) and + can_reach_stone(state, world.player))) # Level 3 add_rule(world.multiworld.get_location(LocationName.sand_canyon_5, world.player), @@ -162,8 +164,9 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.iceberg_samus, world.player), lambda state: can_reach_ice(state, world.player)) add_rule(world.multiworld.get_location(LocationName.iceberg_name, world.player), - lambda state: can_reach_coo(state, world.player) and can_reach_burning(state, world.player) - and can_reach_chuchu(state, world.player)) + lambda state: (can_reach_coo(state, world.player) and + can_reach_burning(state, world.player) and + can_reach_chuchu(state, world.player))) # ChuChu is guaranteed here, but we use this for consistency add_rule(world.multiworld.get_location(LocationName.iceberg_shiro, world.player), lambda state: can_reach_nago(state, world.player)) @@ -191,11 +194,13 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.ripple_field_5_m1, world.player), lambda state: can_reach_kine(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ripple_field_5_u1, world.player), - lambda state: can_reach_kine(state, world.player) - and can_reach_burning(state, world.player) and can_reach_stone(state, world.player)) + lambda state: (can_reach_kine(state, world.player) and + can_reach_burning(state, world.player) and + can_reach_stone(state, world.player))) add_rule(world.multiworld.get_location(LocationName.ripple_field_5_m2, world.player), - lambda state: can_reach_kine(state, world.player) - and can_reach_burning(state, world.player) and can_reach_stone(state, world.player)) + lambda state: (can_reach_kine(state, world.player) and + can_reach_burning(state, world.player) and + can_reach_stone(state, world.player))) add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_u1, world.player), lambda state: can_reach_clean(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_m2, world.player), @@ -247,15 +252,15 @@ def set_rules(world: "KDL3World") -> None: LocationName.iceberg_dedede], range(1, 6)): set_rule(world.multiworld.get_location(boss_flag, world.player), - lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[i - 1]) - and can_reach_level(state, world.player, i + 1, - world.multiworld.open_world[world.player], - world.multiworld.ow_boss_requirement[world.player])) + lambda state, i=i: (state.has("Heart Star", world.player, world.boss_requirements[i - 1]) and + can_reach_level(state, world.player, i + 1, + world.multiworld.open_world[world.player], + world.multiworld.ow_boss_requirement[world.player]))) set_rule(world.multiworld.get_location(purification, world.player), - lambda state, i=i: state.has("Heart Star", world.player, world.boss_requirements[i - 1]) - and can_reach_level(state, world.player, i + 1, - world.multiworld.open_world[world.player], - world.multiworld.ow_boss_requirement[world.player])) + lambda state, i=i: (state.has("Heart Star", world.player, world.boss_requirements[i - 1]) and + can_reach_level(state, world.player, i + 1, + world.multiworld.open_world[world.player], + world.multiworld.ow_boss_requirement[world.player]))) if world.multiworld.strict_bosses[world.player]: for level in range(2, 6): From b81d1c3b0d3f8a0732e935d90d4a2ebfccba5137 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 21 Aug 2023 23:42:41 -0500 Subject: [PATCH 119/165] re-order pre_fill to properly handle animal fill --- worlds/kdl3/__init__.py | 51 +++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index e93dca581b83..a8725ee31448 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -110,6 +110,32 @@ def get_trap_item_name(self) -> str: self.multiworld.ability_trap_weight[self.player]])[0] def pre_fill(self) -> None: + if self.multiworld.copy_ability_randomization[self.player]: + # randomize copy abilities + valid_abilities = list(copy_ability_access_table.keys()) + enemies_to_set = list(self.copy_abilities.keys()) + # now for the edge cases + for abilities, enemies in enemy_restrictive: + available_enemies = list() + for enemy in enemies: + if enemy not in enemies_to_set: + if self.copy_abilities[enemy] in abilities: + break + else: + available_enemies.append(enemy) + else: + chosen_enemy = self.random.choice(available_enemies) + chosen_ability = self.random.choice(tuple(abilities)) + self.copy_abilities[chosen_enemy] = chosen_ability + enemies_to_set.remove(chosen_enemy) + # place remaining + for enemy in enemies_to_set: + self.copy_abilities[enemy] = self.random \ + .choice(valid_abilities) + + for enemy in enemy_mapping: + self.multiworld.get_location(enemy, self.player) \ + .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) # fill animals if self.multiworld.animal_randomization[self.player] != 0: spawns = [animal for animal in animal_friend_spawns.keys() if @@ -146,32 +172,7 @@ def pre_fill(self) -> None: self.multiworld.get_location(animal, self.player) \ .place_locked_item(self.create_item(animal_friends[animal])) - if self.multiworld.copy_ability_randomization[self.player]: - # randomize copy abilities - valid_abilities = list(copy_ability_access_table.keys()) - enemies_to_set = list(self.copy_abilities.keys()) - # now for the edge cases - for abilities, enemies in enemy_restrictive: - available_enemies = list() - for enemy in enemies: - if enemy not in enemies_to_set: - if self.copy_abilities[enemy] in abilities: - break - else: - available_enemies.append(enemy) - else: - chosen_enemy = self.random.choice(available_enemies) - chosen_ability = self.random.choice(tuple(abilities)) - self.copy_abilities[chosen_enemy] = chosen_ability - enemies_to_set.remove(chosen_enemy) - # place remaining - for enemy in enemies_to_set: - self.copy_abilities[enemy] = self.random \ - .choice(valid_abilities) - for enemy in enemy_mapping: - self.multiworld.get_location(enemy, self.player) \ - .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) def create_items(self) -> None: itempool = [] From ec67f7f94cc0b82b25cee814487ad34b399ef6ed Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 24 Aug 2023 15:47:02 -0500 Subject: [PATCH 120/165] clean tests --- worlds/kdl3/test/TestGoal.py | 10 ++++----- worlds/kdl3/test/TestLocations.py | 11 +++++----- worlds/kdl3/test/TestShuffles.py | 36 +++++++++++++++---------------- worlds/kdl3/test/__init__.py | 5 +++-- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/worlds/kdl3/test/TestGoal.py b/worlds/kdl3/test/TestGoal.py index 2bf9e01e78da..af5bc6bd1a1b 100644 --- a/worlds/kdl3/test/TestGoal.py +++ b/worlds/kdl3/test/TestGoal.py @@ -14,10 +14,10 @@ def testGoal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) - self.assertEqual(self.count("Heart Star"), 14) + self.assertEqual(self.count("Heart Star"), 14, str(self.multiworld.seed)) self.assertBeatable(False) self.collect(heart_stars[14:15]) - self.assertEqual(self.count("Heart Star"), 15) + self.assertEqual(self.count("Heart Star"), 15, str(self.multiworld.seed)) self.assertBeatable(True) self.remove([self.get_item_by_name("Love-Love Rod")]) self.collect_by_name("Kine") # Ensure a little more progress, but leave out cutter and burning @@ -39,16 +39,16 @@ def testGoal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) - self.assertEqual(self.count("Heart Star"), 14) + self.assertEqual(self.count("Heart Star"), 14, str(self.multiworld.seed)) self.assertBeatable(False) self.collect(heart_stars[14:15]) - self.assertEqual(self.count("Heart Star"), 15) + self.assertEqual(self.count("Heart Star"), 15, str(self.multiworld.seed)) self.assertBeatable(False) self.collect_by_name(["Burning", "Cutter", "Kine"]) self.assertBeatable(True) self.remove([self.get_item_by_name("Love-Love Rod")]) self.collect(heart_stars) - self.assertEqual(self.count("Heart Star"), 30) + self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) def testKine(self): diff --git a/worlds/kdl3/test/TestLocations.py b/worlds/kdl3/test/TestLocations.py index 6eaaf9ced393..90a7f34e6eea 100644 --- a/worlds/kdl3/test/TestLocations.py +++ b/worlds/kdl3/test/TestLocations.py @@ -38,9 +38,9 @@ def testSimpleHeartStars(self): def run_location_test(self, location: str, itempool: typing.List[str]): items = itempool.copy() while len(itempool) > 0: - assert not self.can_reach_location(location) + self.assertFalse(self.can_reach_location(location), str(self.multiworld.seed)) self.collect_by_name(itempool.pop()) - assert self.can_reach_location(location) + self.assertTrue(self.can_reach_location(location), str(self.multiworld.seed)) self.remove(self.get_items_by_name(items)) @@ -59,11 +59,10 @@ class TestShiro(KDL3TestBase): } def testShiro(self): - assert not self.can_reach_location("Iceberg 5 - Shiro") + self.assertFalse(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed)) self.collect_by_name("Nago") - assert not self.can_reach_location("Iceberg 5 - Shiro") + self.assertFalse(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed)) # despite Shiro only requiring Nago for logic, it cannot be in logic because our two accessible stages # do not actually give the player access to Nago, thus we need Kine to pass 2-5 self.collect_by_name("Kine") - assert self.can_reach_location("Iceberg 5 - Shiro") - + self.assertTrue(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed)) diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/TestShuffles.py index 1b12a59ec998..a875b9e34241 100644 --- a/worlds/kdl3/test/TestShuffles.py +++ b/worlds/kdl3/test/TestShuffles.py @@ -17,16 +17,16 @@ def testGoal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) - self.assertEqual(self.count("Heart Star"), 14) + self.assertEqual(self.count("Heart Star"), 14, str(self.multiworld.seed)) self.assertBeatable(False) self.collect(heart_stars[14:15]) - self.assertEqual(self.count("Heart Star"), 15) + self.assertEqual(self.count("Heart Star"), 15, str(self.multiworld.seed)) self.assertBeatable(False) self.collect_by_name(["Burning", "Cutter", "Kine"]) self.assertBeatable(True) self.remove([self.get_item_by_name("Love-Love Rod")]) self.collect(heart_stars) - self.assertEqual(self.count("Heart Star"), 30) + self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) def testKine(self): @@ -61,7 +61,7 @@ def testValidAbilitiesForROB(self): required_abilities.append(tuple(potential_abilities)) collected_abilities = list() for group in required_abilities: - self.assertFalse(len(group) == 0) + self.assertFalse(len(group) == 0, str(self.multiworld.seed)) collected_abilities.append(group[0]) self.collect_by_name([ability.replace(" Ability", "") for ability in collected_abilities]) if "Parasol Ability" not in collected_abilities or "Stone Ability" not in collected_abilities: @@ -70,10 +70,10 @@ def testValidAbilitiesForROB(self): if "Cutter Ability" not in collected_abilities: # we can't actually reach 3-6 without Cutter - assert not self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B") + self.assertFalse(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), str(self.multiworld.seed)) self.collect_by_name(["Cutter"]) - assert self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B") + self.assertTrue(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), str(self.multiworld.seed)) class TestAnimalShuffle(KDL3TestBase): @@ -90,16 +90,16 @@ def testGoal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) - self.assertEqual(self.count("Heart Star"), 14) + self.assertEqual(self.count("Heart Star"), 14, str(self.multiworld.seed)) self.assertBeatable(False) self.collect(heart_stars[14:15]) - self.assertEqual(self.count("Heart Star"), 15) + self.assertEqual(self.count("Heart Star"), 15, str(self.multiworld.seed)) self.assertBeatable(False) self.collect_by_name(["Burning", "Cutter", "Kine"]) self.assertBeatable(True) self.remove([self.get_item_by_name("Love-Love Rod")]) self.collect(heart_stars) - self.assertEqual(self.count("Heart Star"), 30) + self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) def testKine(self): @@ -115,9 +115,9 @@ def testBurning(self): self.assertBeatable(False) def testLockedAnimals(self): - self.assertTrue(self, self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") - self.assertTrue(self, self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") - self.assertTrue(self, self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) + self.assertTrue(self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") + self.assertTrue(self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") + self.assertTrue(self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) class TestAllShuffle(KDL3TestBase): @@ -135,16 +135,16 @@ def testGoal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) - self.assertEqual(self.count("Heart Star"), 14) + self.assertEqual(self.count("Heart Star"), 14, str(self.multiworld.seed)) self.assertBeatable(False) self.collect(heart_stars[14:15]) - self.assertEqual(self.count("Heart Star"), 15) + self.assertEqual(self.count("Heart Star"), 15, str(self.multiworld.seed)) self.assertBeatable(False) self.collect_by_name(["Burning", "Cutter", "Kine"]) self.assertBeatable(True) self.remove([self.get_item_by_name("Love-Love Rod")]) self.collect(heart_stars) - self.assertEqual(self.count("Heart Star"), 30) + self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) def testKine(self): @@ -160,6 +160,6 @@ def testBurning(self): self.assertBeatable(False) def testLockedAnimals(self): - self.assertTrue(self, self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") - self.assertTrue(self, self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") - self.assertTrue(self, self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) \ No newline at end of file + self.assertTrue(self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") + self.assertTrue(self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") + self.assertTrue(self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) diff --git a/worlds/kdl3/test/__init__.py b/worlds/kdl3/test/__init__.py index 64a2ec44f070..d962b7efa97e 100644 --- a/worlds/kdl3/test/__init__.py +++ b/worlds/kdl3/test/__init__.py @@ -4,8 +4,9 @@ from BaseClasses import MultiWorld, PlandoOptions from test.TestBase import WorldTestBase from test.general import gen_steps -from ... import AutoWorld -from ...AutoWorld import call_all +from worlds import AutoWorld +from worlds.AutoWorld import call_all + class KDL3TestBase(WorldTestBase): game = "Kirby's Dream Land 3" From 383d1c967ecfe938227f5cf4671334946eac632f Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 25 Aug 2023 02:43:06 -0500 Subject: [PATCH 121/165] adjust rob rule --- worlds/kdl3/Rules.py | 2 +- worlds/kdl3/__init__.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 1ac6ad2ff14b..87ff9fef93a7 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -89,7 +89,7 @@ def can_reach_cutter(state: "CollectionState", player: int) -> bool: def can_assemble_rob(state: "CollectionState", player: int, copy_abilities: typing.Dict[str, str]): # check animal requirements - if not can_reach_coo(state, player) and can_reach_kine(state, player): + if not (can_reach_coo(state, player) and can_reach_kine(state, player)): return False for abilities, bukisets in EnemyAbilities.enemy_restrictive[1:5]: iterator = iter(x for x in bukisets if copy_abilities[x] in abilities) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index a8725ee31448..57781c15991f 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -173,7 +173,6 @@ def pre_fill(self) -> None: .place_locked_item(self.create_item(animal_friends[animal])) - def create_items(self) -> None: itempool = [] itempool.extend([self.create_item(name) for name in copy_ability_table]) From 05d6cf311b8fcb18cac335a751555ea1be28bdc0 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 26 Aug 2023 15:29:54 -0500 Subject: [PATCH 122/165] clean imports --- worlds/kdl3/Regions.py | 14 ++++++-------- worlds/kdl3/Room.py | 4 ++-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 240a26459675..bc52ea8f241f 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -3,15 +3,13 @@ import typing from pkgutil import get_data -from BaseClasses import Entrance, Region -from Fill import fill_restrictive +from BaseClasses import Region from worlds.AutoWorld import World -from .Locations import KDL3Location, location_table, level_consumables +from worlds.generic.Rules import add_item_rule +from .Locations import KDL3Location from .Names import LocationName -from .Names.AnimalFriendSpawns import animal_friend_spawns from .Options import BossShuffle from .Room import Room -from ..generic.Rules import add_item_rule, add_rule if typing.TYPE_CHECKING: from . import KDL3World @@ -39,7 +37,7 @@ def generate_valid_level(level, stage, possible_stages, slot_random): return new_stage -def generate_rooms(world: World, door_shuffle: bool, level_regions: typing.Dict[int, Region]): +def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing.Dict[int, Region]): level_names = {LocationName.level_names[level]: level for level in LocationName.level_names} room_data = json.loads(get_data(__name__, os.path.join("data", "Rooms.json"))) rooms: typing.Dict[str, Room] = dict() @@ -100,7 +98,7 @@ def generate_rooms(world: World, door_shuffle: bool, level_regions: typing.Dict[ level_regions[level].add_exits([first_rooms[0x770200 + level - 1].name]) -def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bool) -> dict: +def generate_valid_levels(world: "KDL3World", enforce_world: bool, enforce_pattern: bool) -> dict: levels: typing.Dict[int, typing.List[typing.Optional[int]]] = { 1: [None for _ in range(7)], 2: [None for _ in range(7)], @@ -193,7 +191,7 @@ def generate_valid_levels(world: World, enforce_world: bool, enforce_pattern: bo return levels -def create_levels(world: World) -> None: +def create_levels(world: "KDL3World") -> None: menu = Region("Menu", world.player, world.multiworld) level1 = Region("Grass Land", world.player, world.multiworld) level2 = Region("Ripple Field", world.player, world.multiworld) diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index e7488a43cf2a..62a242797baf 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -1,7 +1,7 @@ import struct import typing -from BaseClasses import CollectionState, Region, ItemClassification -from struct import unpack + +from BaseClasses import Region, ItemClassification if typing.TYPE_CHECKING: from .Rom import RomData From aa9640c73708e2bdbe9a1a86861edd3fc0e1310b Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 26 Aug 2023 16:08:53 -0500 Subject: [PATCH 123/165] pep8 and typing cleanup --- worlds/kdl3/Regions.py | 8 +++++--- worlds/kdl3/Rom.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index bc52ea8f241f..f6bf73e55af1 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -47,7 +47,8 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing room_entry["animal_pointers"], room_entry["enemies"], room_entry["entity_load"], room_entry["consumables"], room_entry["consumables_pointer"]) room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else - None for location in room_entry["locations"] if not any([x in location for x in ["1-Up", "Maxim"]]) or + None for location in room_entry["locations"] + if not any([x in location for x in ["1-Up", "Maxim"]]) or world.multiworld.consumables[world.player]}, KDL3Location) rooms[room.name] = room for location in room.locations: @@ -89,8 +90,9 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing proper_stage = world.player_levels[level][stage] level_regions[level].add_exits([first_rooms[proper_stage].name], {first_rooms[proper_stage].name: - (lambda state: True) if world.multiworld.open_world[world.player] or - stage == 0 else lambda state, level=level, stage=stage: state.has( + (lambda state: True) if world.multiworld.open_world[world.player] or + stage == 0 else lambda state, level=level, + stage=stage: state.has( f"{LocationName.level_names_inverse[level]} " f"{f'{stage}'}" f" - Stage Completion", world.player)}) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index d6c4fffed788..6ca7382eb985 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -377,7 +377,7 @@ def patch(self, target: str): def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_required: int, - boss_requirements: Dict[int, int], shuffled_levels: Dict[int, List[int]], bb_boss_enabled: Dict[int, int], + boss_requirements: Dict[int, int], shuffled_levels: Dict[int, List[int]], bb_boss_enabled: List[bool], copy_abilities: Dict[str, str], slot_random: Random): # increase BWRAM by 0x8000 rom.write_byte(0x7FD8, 0x06) From 3d169d1eae2aa79b9f46af1b4b730c4d093eec89 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 26 Aug 2023 16:22:23 -0500 Subject: [PATCH 124/165] fix typing issues from pr --- worlds/kdl3/Regions.py | 1 - worlds/kdl3/Rom.py | 2 +- worlds/kdl3/Rules.py | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index f6bf73e55af1..fe1f24afff3e 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -4,7 +4,6 @@ from pkgutil import get_data from BaseClasses import Region -from worlds.AutoWorld import World from worlds.generic.Rules import add_item_rule from .Locations import KDL3Location from .Names import LocationName diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 5a5760aae56b..d9d6b1f802a0 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -271,7 +271,7 @@ def read_bytes(self, offset: int, length: int): def write_byte(self, offset: int, value: int): self.file[offset] = value - def write_bytes(self, offset: int, values: bytes) -> None: + def write_bytes(self, offset: int, values: typing.Sequence) -> None: self.file[offset:offset + len(values)] = values def write_to_file(self, file: str): diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 9c170e908ff7..f13a9b495757 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -74,7 +74,7 @@ def can_reach_cutter(state: "CollectionState", player: int) -> bool: return state.has("Cutter", player) and state.has("Cutter Ability", player) -ability_map: dict[str, typing.Callable[[CollectionState, int], bool]] = { +ability_map: dict[str, typing.Callable[["CollectionState", int], bool]] = { "No Ability": lambda state, player: True, "Burning Ability": can_reach_burning, "Stone Ability": can_reach_stone, From 3247d456dc995bc8d9efad46fad5f278eba512db Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 26 Aug 2023 16:26:46 -0500 Subject: [PATCH 125/165] fix usage of dict in typing --- worlds/kdl3/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index f13a9b495757..c79dbc3eadbd 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -74,7 +74,7 @@ def can_reach_cutter(state: "CollectionState", player: int) -> bool: return state.has("Cutter", player) and state.has("Cutter Ability", player) -ability_map: dict[str, typing.Callable[["CollectionState", int], bool]] = { +ability_map: typing.Dict[str, typing.Callable[["CollectionState", int], bool]] = { "No Ability": lambda state, player: True, "Burning Ability": can_reach_burning, "Stone Ability": can_reach_stone, From 9ddb73fedd6b91b00576d91c8db89e64e0a743b4 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 30 Aug 2023 12:06:02 -0500 Subject: [PATCH 126/165] fix missing import from merge commit --- worlds/kdl3/Regions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 70aa96994aae..a6b8d58e123d 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -5,7 +5,7 @@ from BaseClasses import Region from worlds.generic.Rules import add_item_rule -from .Locations import KDL3Location +from .Locations import KDL3Location, location_table from .Names import LocationName from .Options import BossShuffle from .Room import Room From a8d711a553262da99a1e8049d456bce67a58d97e Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 30 Aug 2023 17:27:11 -0500 Subject: [PATCH 127/165] fix non-deterministic generation --- worlds/kdl3/Names/EnemyAbilities.py | 20 ++++++++++---------- worlds/kdl3/__init__.py | 6 ++++-- worlds/kdl3/test/TestShuffles.py | 4 ++-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/worlds/kdl3/Names/EnemyAbilities.py b/worlds/kdl3/Names/EnemyAbilities.py index 596eda939a5d..016e3033ab25 100644 --- a/worlds/kdl3/Names/EnemyAbilities.py +++ b/worlds/kdl3/Names/EnemyAbilities.py @@ -807,16 +807,16 @@ 'Haboki': 'Clean Ability', } -enemy_restrictive: List[Tuple[Set[str], Set[str]]] = [ +enemy_restrictive: List[Tuple[List[str], List[str]]] = [ # abilities, enemies, set_all (False to set any) - ({"Burning Ability", "Stone Ability"}, {"Rocky", "Sparky", "Babut", "Squishy", }), # Ribbon Field 5 - 7 + (["Burning Ability", "Stone Ability"], ["Rocky", "Sparky", "Babut", "Squishy", ]), # Ribbon Field 5 - 7 # Sand Canyon 6 - ({"Parasol Ability", "Cutter Ability"}, {'Bukiset (Parasol)', 'Bukiset (Cutter)'}), - ({"Spark Ability", "Clean Ability"}, {'Bukiset (Spark)', 'Bukiset (Clean)'}), - ({"Ice Ability", "Needle Ability"}, {'Bukiset (Ice)', 'Bukiset (Needle)'}), - ({"Stone Ability", "Burning Ability"}, {'Bukiset (Stone)', 'Bukiset (Burning)'}), - ({"Stone Ability"}, {'Bukiset (Burning)', 'Bukiset (Stone)', 'Bukiset (Ice)', 'Bukiset (Needle)', - 'Bukiset (Clean)', 'Bukiset (Spark)', 'Bukiset (Parasol)', 'Bukiset (Cutter)'}), - ({"Parasol Ability"}, {'Bukiset (Burning)', 'Bukiset (Stone)', 'Bukiset (Ice)', 'Bukiset (Needle)', - 'Bukiset (Clean)', 'Bukiset (Spark)', 'Bukiset (Parasol)', 'Bukiset (Cutter)'}), + (["Parasol Ability", "Cutter Ability"], ['Bukiset (Parasol)', 'Bukiset (Cutter)']), + (["Spark Ability", "Clean Ability"], ['Bukiset (Spark)', 'Bukiset (Clean)']), + (["Ice Ability", "Needle Ability"], ['Bukiset (Ice)', 'Bukiset (Needle)']), + (["Stone Ability", "Burning Ability"], ['Bukiset (Stone)', 'Bukiset (Burning)']), + (["Stone Ability"], ['Bukiset (Burning)', 'Bukiset (Stone)', 'Bukiset (Ice)', 'Bukiset (Needle)', + 'Bukiset (Clean)', 'Bukiset (Spark)', 'Bukiset (Parasol)', 'Bukiset (Cutter)']), + (["Parasol Ability"], ['Bukiset (Burning)', 'Bukiset (Stone)', 'Bukiset (Ice)', 'Bukiset (Needle)', + 'Bukiset (Clean)', 'Bukiset (Spark)', 'Bukiset (Parasol)', 'Bukiset (Cutter)']), ] diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index fa7d7886e98e..a8370faa5041 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -109,7 +109,7 @@ def get_trap_item_name(self) -> str: self.multiworld.slow_trap_weight[self.player], self.multiworld.ability_trap_weight[self.player]])[0] - def pre_fill(self) -> None: + def generate_early(self) -> None: if self.multiworld.copy_ability_randomization[self.player]: # randomize copy abilities valid_abilities = list(copy_ability_access_table.keys()) @@ -125,7 +125,7 @@ def pre_fill(self) -> None: available_enemies.append(enemy) else: chosen_enemy = self.random.choice(available_enemies) - chosen_ability = self.random.choice(tuple(abilities)) + chosen_ability = self.random.choice(abilities) self.copy_abilities[chosen_enemy] = chosen_ability enemies_to_set.remove(chosen_enemy) # place remaining @@ -133,6 +133,8 @@ def pre_fill(self) -> None: self.copy_abilities[enemy] = self.random \ .choice(valid_abilities) + + def pre_fill(self) -> None: for enemy in enemy_mapping: self.multiworld.get_location(enemy, self.player) \ .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/TestShuffles.py index a875b9e34241..a8240ffbe7f8 100644 --- a/worlds/kdl3/test/TestShuffles.py +++ b/worlds/kdl3/test/TestShuffles.py @@ -1,5 +1,4 @@ from typing import List, Tuple - from . import KDL3TestBase @@ -73,7 +72,8 @@ def testValidAbilitiesForROB(self): self.assertFalse(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), str(self.multiworld.seed)) self.collect_by_name(["Cutter"]) - self.assertTrue(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), str(self.multiworld.seed)) + self.assertTrue(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), + ''.join(str(self.multiworld.seed)).join(collected_abilities)) class TestAnimalShuffle(KDL3TestBase): From b4bb3672828d95bf01c610a63026793bb8d4cf00 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 30 Aug 2023 17:27:11 -0500 Subject: [PATCH 128/165] fix non-deterministic generation --- worlds/kdl3/Names/EnemyAbilities.py | 20 ++++++++++---------- worlds/kdl3/__init__.py | 6 ++++-- worlds/kdl3/test/TestShuffles.py | 4 ++-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/worlds/kdl3/Names/EnemyAbilities.py b/worlds/kdl3/Names/EnemyAbilities.py index 596eda939a5d..016e3033ab25 100644 --- a/worlds/kdl3/Names/EnemyAbilities.py +++ b/worlds/kdl3/Names/EnemyAbilities.py @@ -807,16 +807,16 @@ 'Haboki': 'Clean Ability', } -enemy_restrictive: List[Tuple[Set[str], Set[str]]] = [ +enemy_restrictive: List[Tuple[List[str], List[str]]] = [ # abilities, enemies, set_all (False to set any) - ({"Burning Ability", "Stone Ability"}, {"Rocky", "Sparky", "Babut", "Squishy", }), # Ribbon Field 5 - 7 + (["Burning Ability", "Stone Ability"], ["Rocky", "Sparky", "Babut", "Squishy", ]), # Ribbon Field 5 - 7 # Sand Canyon 6 - ({"Parasol Ability", "Cutter Ability"}, {'Bukiset (Parasol)', 'Bukiset (Cutter)'}), - ({"Spark Ability", "Clean Ability"}, {'Bukiset (Spark)', 'Bukiset (Clean)'}), - ({"Ice Ability", "Needle Ability"}, {'Bukiset (Ice)', 'Bukiset (Needle)'}), - ({"Stone Ability", "Burning Ability"}, {'Bukiset (Stone)', 'Bukiset (Burning)'}), - ({"Stone Ability"}, {'Bukiset (Burning)', 'Bukiset (Stone)', 'Bukiset (Ice)', 'Bukiset (Needle)', - 'Bukiset (Clean)', 'Bukiset (Spark)', 'Bukiset (Parasol)', 'Bukiset (Cutter)'}), - ({"Parasol Ability"}, {'Bukiset (Burning)', 'Bukiset (Stone)', 'Bukiset (Ice)', 'Bukiset (Needle)', - 'Bukiset (Clean)', 'Bukiset (Spark)', 'Bukiset (Parasol)', 'Bukiset (Cutter)'}), + (["Parasol Ability", "Cutter Ability"], ['Bukiset (Parasol)', 'Bukiset (Cutter)']), + (["Spark Ability", "Clean Ability"], ['Bukiset (Spark)', 'Bukiset (Clean)']), + (["Ice Ability", "Needle Ability"], ['Bukiset (Ice)', 'Bukiset (Needle)']), + (["Stone Ability", "Burning Ability"], ['Bukiset (Stone)', 'Bukiset (Burning)']), + (["Stone Ability"], ['Bukiset (Burning)', 'Bukiset (Stone)', 'Bukiset (Ice)', 'Bukiset (Needle)', + 'Bukiset (Clean)', 'Bukiset (Spark)', 'Bukiset (Parasol)', 'Bukiset (Cutter)']), + (["Parasol Ability"], ['Bukiset (Burning)', 'Bukiset (Stone)', 'Bukiset (Ice)', 'Bukiset (Needle)', + 'Bukiset (Clean)', 'Bukiset (Spark)', 'Bukiset (Parasol)', 'Bukiset (Cutter)']), ] diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 57781c15991f..d96af3b5fac9 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -109,7 +109,7 @@ def get_trap_item_name(self) -> str: self.multiworld.slow_trap_weight[self.player], self.multiworld.ability_trap_weight[self.player]])[0] - def pre_fill(self) -> None: + def generate_early(self) -> None: if self.multiworld.copy_ability_randomization[self.player]: # randomize copy abilities valid_abilities = list(copy_ability_access_table.keys()) @@ -125,7 +125,7 @@ def pre_fill(self) -> None: available_enemies.append(enemy) else: chosen_enemy = self.random.choice(available_enemies) - chosen_ability = self.random.choice(tuple(abilities)) + chosen_ability = self.random.choice(abilities) self.copy_abilities[chosen_enemy] = chosen_ability enemies_to_set.remove(chosen_enemy) # place remaining @@ -133,6 +133,8 @@ def pre_fill(self) -> None: self.copy_abilities[enemy] = self.random \ .choice(valid_abilities) + + def pre_fill(self) -> None: for enemy in enemy_mapping: self.multiworld.get_location(enemy, self.player) \ .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/TestShuffles.py index a875b9e34241..a8240ffbe7f8 100644 --- a/worlds/kdl3/test/TestShuffles.py +++ b/worlds/kdl3/test/TestShuffles.py @@ -1,5 +1,4 @@ from typing import List, Tuple - from . import KDL3TestBase @@ -73,7 +72,8 @@ def testValidAbilitiesForROB(self): self.assertFalse(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), str(self.multiworld.seed)) self.collect_by_name(["Cutter"]) - self.assertTrue(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), str(self.multiworld.seed)) + self.assertTrue(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), + ''.join(str(self.multiworld.seed)).join(collected_abilities)) class TestAnimalShuffle(KDL3TestBase): From 0cbffa880faf12506159664305b6d8f1a281bdf5 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 4 Sep 2023 00:23:21 -0500 Subject: [PATCH 129/165] sending gifts --- worlds/kdl3/Client.py | 629 ++++++++++++++++++++++++++++++++++-------- worlds/kdl3/Rom.py | 1 + 2 files changed, 511 insertions(+), 119 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 6063632af20d..f046c4e8aa7c 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -1,11 +1,20 @@ import logging import struct import time +import typing +import uuid from struct import unpack, pack +import random +from MultiServer import mark_raw from NetUtils import ClientStatus, color +from Utils import async_start from worlds.AutoSNIClient import SNIClient from .Locations import boss_locations +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from SNIClient import SNIClientCommandProcessor, SNIContext snes_logger = logging.getLogger("SNES") @@ -20,6 +29,7 @@ KDL3_DEATH_LINK_ADDR = SRAM_1_START + 0x9010 KDL3_GOAL_ADDR = SRAM_1_START + 0x9012 KDL3_CONSUMABLE_FLAG = SRAM_1_START + 0x9018 +KDL3_GIFTING_FLAG = SRAM_1_START + 0x901A KDL3_LEVEL_ADDR = SRAM_1_START + 0x9020 KDL3_IS_DEMO = SRAM_1_START + 0x5AD5 KDL3_GAME_STATE = SRAM_1_START + 0x36D0 @@ -46,6 +56,7 @@ KDL3_GOOEY_TRAP = SRAM_1_START + 0x8080 KDL3_SLOWNESS_TRAP = SRAM_1_START + 0x8082 KDL3_ABILITY_TRAP = SRAM_1_START + 0x8084 +KDL3_GIFTING_SEND = SRAM_1_START + 0x8086 KDL3_COMPLETED_STAGES = SRAM_1_START + 0x8200 KDL3_CONSUMABLES = SRAM_1_START + 0xA000 @@ -96,12 +107,316 @@ 43: 1857, } +kdl3_gifting_options = { + "AcceptsAnyGift": True, + "DesiredTraits": [ + "Consumable", "Food", "Drink", "Candy", "Tomato", + "Invincible", "Life", "Heal", "Health", "Trap", + "Goo", "Gel", "Slow", "Eject" + ] +} + +kdl3_gifts = { + 1: { + "Item": { + "Name": "1-Up", + "Amount": 1, + "Value": 400000 + }, + "Traits": [ + { + "Trait": "Consumable", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Life", + "Quality": 1, + "Duration": 1 + } + ] + }, + 2: { + "Item": { + "Name": "Maxim Tomato", + "Amount": 1, + "Value": 500000 + }, + "Traits": [ + { + "Trait": "Consumable", + "Quality": 5, + "Duration": 1, + }, + { + "Trait": "Heal", + "Quality": 5, + "Duration": 1, + }, + { + "Trait": "Food", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Tomato", + "Quality": 5, + "Duration": 1, + } + ] + }, + 3: { + "Item": { + "Name": "Energy Drink", + "Amount": 1, + "Value": 100000 + }, + "Traits": [ + { + "Trait": "Consumable", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Heal", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Drink", + "Quality": 1, + "Duration": 1, + }, + ] + }, + 5: { + "Item": { + "Name": "Small Star Piece", + "Amount": 1, + "Value": 10000 + }, + "Traits": [ + { + "Trait": "Currency", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Money", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Star", + "Quality": 1, + "Duration": 1 + } + ] + }, + 6: { + "Item": { + "Name": "Medium Star Piece", + "Amount": 1, + "Value": 30000 + }, + "Traits": [ + { + "Trait": "Currency", + "Quality": 3, + "Duration": 1, + }, + { + "Trait": "Money", + "Quality": 3, + "Duration": 1, + }, + { + "Trait": "Star", + "Quality": 3, + "Duration": 1 + } + ] + }, + 7: { + "Item": { + "Name": "Large Star Piece", + "Amount": 1, + "Value": 50000 + }, + "Traits": [ + { + "Trait": "Currency", + "Quality": 5, + "Duration": 1, + }, + { + "Trait": "Money", + "Quality": 5, + "Duration": 1, + }, + { + "Trait": "Star", + "Quality": 5, + "Duration": 1 + } + ] + }, +} + +kdl3_trap_gifts = { + 0: { + "Item": { + "Name": "Gooey Bag", + "Amount": 1, + "Value": 10000 + }, + "Traits": [ + { + "Trait": "Trap", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Goo", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Gel", + "Quality": 1, + "Duration": 1 + } + ] + }, + 1: { + "Item": { + "Name": "Slowness", + "Amount": 1, + "Value": 10000 + }, + "Traits": [ + { + "Trait": "Trap", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Slow", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Slowness", + "Quality": 1, + "Duration": 1 + } + ] + }, + 2: { + "Item": { + "Name": "Eject Ability", + "Amount": 1, + "Value": 10000 + }, + "Traits": [ + { + "Trait": "Trap", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Eject", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Removal", + "Quality": 1, + "Duration": 1 + } + ] + }, + 3: { + "Item": { + "Name": "Bad Meal", + "Amount": 1, + "Value": 10000 + }, + "Traits": [ + { + "Trait": "Trap", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Damage", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Food", + "Quality": 1, + "Duration": 1 + } + ] + }, +} + + +async def update_object(ctx: "SNIContext", key: str, value: typing.Dict): + await ctx.send_msgs([ + { + "cmd": "Set", + "key": key, + "default": {}, + "want_reply": False, + "operations": [ + {"operation": "update", "value": value} + ] + } + ]) + + +async def pop_object(ctx: "SNIContext", key: str, value: str): + await ctx.send_msgs([ + { + "cmd": "Set", + "key": key, + "default": {}, + "want_reply": False, + "operations": [ + {"operation": "pop", "value": value} + ] + } + ]) + + +@mark_raw +def cmd_gift(self: "SNIClientCommandProcessor"): + """Toggles gifting for the current game.""" + if not getattr(self.ctx, "gifting", None): + self.ctx.gifting = True + else: + self.ctx.gifting = not self.ctx.gifting + self.output(f"Gifting set to {self.ctx.gifting}") + async_start(update_object(self.ctx, f"Giftboxes;{self.ctx.team}", { + f"{self.ctx.slot}": + { + "IsOpen": self.ctx.gifting, + **kdl3_gifting_options + } + })) + class KDL3SNIClient(SNIClient): game = "Kirby's Dream Land 3" levels = None consumables = None - item_queue = [] + item_queue: typing.List = [] + initialize_gifting: bool = False + giftbox_key: str = "" + motherbox_key: str = "" + client_random: random.Random = random.Random() async def deathlink_kill_player(self, ctx) -> None: from SNIClient import DeathState, snes_buffered_write, snes_flush_writes, snes_read @@ -129,12 +444,15 @@ async def validate_rom(self, ctx) -> bool: from SNIClient import snes_read rom_name = await snes_read(ctx, KDL3_ROMNAME, 0x15) if rom_name is None or rom_name == bytes([0] * 0x15) or rom_name[:4] != b"KDL3": + if "gift" in ctx.command_processor.commands: + ctx.command_processor.commands.pop("gift") return False ctx.game = self.game ctx.rom = rom_name ctx.items_handling = 0b111 # always remote items ctx.allow_collect = True + ctx.command_processor.commands["gift"] = cmd_gift death_link = await snes_read(ctx, KDL3_DEATH_LINK_ADDR, 1) if death_link: @@ -192,128 +510,201 @@ async def pop_item(self, ctx): else: self.item_queue.append(item) # We can't apply this yet + async def pop_gift(self, ctx): + if ctx.stored_data[self.giftbox_key]: + key, gift = ctx.stored_data[self.giftbox_key].popitem() + print(gift) + await pop_object(ctx, self.giftbox_key, key) + + async def pick_gift_recipient(self, ctx, gift): + if gift != 4: + gift_base = kdl3_gifts[gift] + else: + gift_base = kdl3_trap_gifts[self.client_random.randint(0, 3)] + most_applicable = -1 + most_applicable_slot = -1 + for slot, info in ctx.stored_data[self.motherbox_key].items(): + if int(slot) == ctx.slot and len(ctx.stored_data[self.motherbox_key]) > 1: + continue + desire = len(set(info["DesiredTraits"]).intersection([trait["Trait"] for trait in gift_base["Traits"]])) + if desire > most_applicable: + most_applicable = desire + most_applicable_slot = int(slot) + print(most_applicable, most_applicable_slot) + Uuid = uuid.uuid4().hex + item = { + **gift_base, + "uuid": Uuid, + "Sender": ctx.player_names[ctx.slot], + "Receiver": ctx.player_names[most_applicable_slot], + "SenderTeam": ctx.team, + "ReceiverTeam": ctx.team, # for the moment + "IsRefund": False, + "GiftValue": gift_base["Item"]["Value"] * gift_base["Item"]["Amount"] + } + print(item) + await update_object(ctx, f"Giftbox;{ctx.team};{most_applicable_slot}", { + Uuid: item, + }) + async def game_watcher(self, ctx) -> None: - from SNIClient import snes_buffered_write, snes_flush_writes, snes_read - rom = await snes_read(ctx, KDL3_ROMNAME, 0x15) - if rom != ctx.rom: - ctx.rom = None - halken = await snes_read(ctx, WRAM_START, 6) - if halken != b"halken": - return - if not ctx.server: - return - # can't check debug anymore, without going and copying the value. might be important later. - is_demo = await snes_read(ctx, KDL3_IS_DEMO, 1) # 1 - recording a demo, 2 - playing back recorded, 3+ is a demo - if is_demo[0] > 0x00: - return - current_save = await snes_read(ctx, KDL3_GAME_SAVE, 1) - goal = await snes_read(ctx, KDL3_GOAL_ADDR, 1) - boss_butch_status = await snes_read(ctx, KDL3_BOSS_BUTCH_STATUS + (current_save[0] * 2), 1) - mg5_status = await snes_read(ctx, KDL3_MG5_STATUS + (current_save[0] * 2), 1) - jumping_status = await snes_read(ctx, KDL3_JUMPING_STATUS + (current_save[0] * 2), 1) - if boss_butch_status[0] == 0xFF: - return # save file is not created, ignore - if (goal[0] == 0x00 and boss_butch_status[0] == 0x01) \ - or (goal[0] == 0x01 and boss_butch_status[0] == 0x03) \ - or (goal[0] == 0x02 and mg5_status[0] == 0x03) \ - or (goal[0] == 0x03 and jumping_status[0] == 0x03): - await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) - ctx.finished_game = True - current_bgm = await snes_read(ctx, KDL3_CURRENT_BGM, 1) - if current_bgm[0] in (0x00, 0x21, 0x22, 0x23, 0x25, 0x2A, 0x2B): - return # null, title screen, opening, save select, true and false endings - game_state = await snes_read(ctx, KDL3_GAME_STATE, 1) - current_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) - if "DeathLink" in ctx.tags and game_state[0] == 0x00 and ctx.last_death_link + 1 < time.time(): - currently_dead = current_hp[0] == 0x00 - await ctx.handle_deathlink_state(currently_dead) + try: + from SNIClient import snes_buffered_write, snes_flush_writes, snes_read + rom = await snes_read(ctx, KDL3_ROMNAME, 0x15) + if rom != ctx.rom: + ctx.rom = None + halken = await snes_read(ctx, WRAM_START, 6) + if halken != b"halken": + return + if not ctx.server: + return + enable_gifting = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x01) + if not self.initialize_gifting: + self.giftbox_key = f"Giftbox;{ctx.team};{ctx.slot}" + self.motherbox_key = f"Giftboxes;{ctx.team}" + ctx.set_notify(self.motherbox_key, self.giftbox_key) + await update_object(ctx, f"Giftboxes;{ctx.team}", {f"{ctx.slot}": + { + "IsOpen": bool(enable_gifting[0]), + **kdl3_gifting_options + }}) + ctx.gifting = bool(enable_gifting[0]) + self.initialize_gifting = True + # can't check debug anymore, without going and copying the value. might be important later. + is_demo = await snes_read(ctx, KDL3_IS_DEMO, + 1) # 1 - recording a demo, 2 - playing back recorded, 3+ is a demo + if is_demo[0] > 0x00: + return + current_save = await snes_read(ctx, KDL3_GAME_SAVE, 1) + goal = await snes_read(ctx, KDL3_GOAL_ADDR, 1) + boss_butch_status = await snes_read(ctx, KDL3_BOSS_BUTCH_STATUS + (current_save[0] * 2), 1) + mg5_status = await snes_read(ctx, KDL3_MG5_STATUS + (current_save[0] * 2), 1) + jumping_status = await snes_read(ctx, KDL3_JUMPING_STATUS + (current_save[0] * 2), 1) + if boss_butch_status[0] == 0xFF: + return # save file is not created, ignore + if (goal[0] == 0x00 and boss_butch_status[0] == 0x01) \ + or (goal[0] == 0x01 and boss_butch_status[0] == 0x03) \ + or (goal[0] == 0x02 and mg5_status[0] == 0x03) \ + or (goal[0] == 0x03 and jumping_status[0] == 0x03): + await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) + ctx.finished_game = True + current_bgm = await snes_read(ctx, KDL3_CURRENT_BGM, 1) + if current_bgm[0] in (0x00, 0x21, 0x22, 0x23, 0x25, 0x2A, 0x2B): + return # null, title screen, opening, save select, true and false endings + game_state = await snes_read(ctx, KDL3_GAME_STATE, 1) + current_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) + if "DeathLink" in ctx.tags and game_state[0] == 0x00 and ctx.last_death_link + 1 < time.time(): + currently_dead = current_hp[0] == 0x00 + await ctx.handle_deathlink_state(currently_dead) - if self.levels is None: - self.levels = dict() - for i in range(5): - level_data = await snes_read(ctx, KDL3_LEVEL_ADDR + (14 * i), 14) - self.levels[i] = unpack("HHHHHHH", level_data) - - if self.consumables is None: - consumables = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) - self.consumables = consumables[0] == 0x01 - - recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 2) - recv_amount = unpack("H", recv_count)[0] - if recv_amount < len(ctx.items_received): - item = ctx.items_received[recv_amount] - recv_amount += 1 - logging.info('Received %s from %s (%s) (%d/%d in list)' % ( - color(ctx.item_names[item.item], 'red', 'bold'), - color(ctx.player_names[item.player], 'yellow'), - ctx.location_names[item.location], recv_amount, len(ctx.items_received))) - - snes_buffered_write(ctx, KDL3_RECV_COUNT, pack("H", recv_amount)) - if item.item & 0x000070 == 0: - ability = item.item & 0x00000F - snes_buffered_write(ctx, KDL3_ABILITY_ARRAY + (ability * 2), pack("H", ability)) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) - elif item.item & 0x000010 > 0: - friend = (item.item & 0x00000F) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) - snes_buffered_write(ctx, KDL3_ANIMAL_FRIENDS + (friend << 1), pack("H", friend + 1)) - elif item.item == 0x770020: - # Heart Star - heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 2) - snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", unpack("H", heart_star_count)[0] + 1)) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x16])) + if self.levels is None: + self.levels = dict() + for i in range(5): + level_data = await snes_read(ctx, KDL3_LEVEL_ADDR + (14 * i), 14) + self.levels[i] = unpack("HHHHHHH", level_data) + + if self.consumables is None: + consumables = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) + self.consumables = consumables[0] == 0x01 + + recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 2) + recv_amount = unpack("H", recv_count)[0] + if recv_amount < len(ctx.items_received): + item = ctx.items_received[recv_amount] + recv_amount += 1 + logging.info('Received %s from %s (%s) (%d/%d in list)' % ( + color(ctx.item_names[item.item], 'red', 'bold'), + color(ctx.player_names[item.player], 'yellow'), + ctx.location_names[item.location], recv_amount, len(ctx.items_received))) + + snes_buffered_write(ctx, KDL3_RECV_COUNT, pack("H", recv_amount)) + if item.item & 0x000070 == 0: + ability = item.item & 0x00000F + snes_buffered_write(ctx, KDL3_ABILITY_ARRAY + (ability * 2), pack("H", ability)) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) + elif item.item & 0x000010 > 0: + friend = (item.item & 0x00000F) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) + snes_buffered_write(ctx, KDL3_ANIMAL_FRIENDS + (friend << 1), pack("H", friend + 1)) + elif item.item == 0x770020: + # Heart Star + heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 2) + snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", unpack("H", heart_star_count)[0] + 1)) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x16])) + else: + self.item_queue.append(item) + + # handle gifts here + if ctx.gifting: + if enable_gifting[0]: + gift = await snes_read(ctx, KDL3_GIFTING_SEND, 0x01) + if gift[0]: + # we have a gift to send + await self.pick_gift_recipient(ctx, gift[0]) + snes_buffered_write(ctx, KDL3_GIFTING_SEND, bytes([0x00])) + else: + snes_buffered_write(ctx, KDL3_GIFTING_FLAG, bytes([0x01])) else: - self.item_queue.append(item) + if enable_gifting[0]: + snes_buffered_write(ctx, KDL3_GIFTING_FLAG, bytes([0x00])) - await snes_flush_writes(ctx) + await snes_flush_writes(ctx) - new_checks = [] - # level completion status - world_unlocks = await snes_read(ctx, KDL3_WORLD_UNLOCK, 1) - if world_unlocks[0] > 0x06: - return # save is not loaded, ignore - stages_raw = await snes_read(ctx, KDL3_COMPLETED_STAGES, 60) - stages = struct.unpack("HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", stages_raw) - for i in range(30): - loc_id = 0x770000 + i + 1 - if stages[i] == 1 and loc_id not in ctx.checked_locations: - new_checks.append(loc_id) - elif loc_id in ctx.checked_locations: - snes_buffered_write(ctx, KDL3_COMPLETED_STAGES + (i * 2), struct.pack("H", 1)) - - # heart star status - heart_stars = await snes_read(ctx, KDL3_HEART_STARS, 35) - for i in range(5): - start_ind = i * 7 - for j in range(1, 7): - level_ind = start_ind + j - 1 - loc_id = 0x770100 + (6 * i) + j - if heart_stars[level_ind] and loc_id not in ctx.checked_locations: + new_checks = [] + # level completion status + world_unlocks = await snes_read(ctx, KDL3_WORLD_UNLOCK, 1) + if world_unlocks[0] > 0x06: + return # save is not loaded, ignore + stages_raw = await snes_read(ctx, KDL3_COMPLETED_STAGES, 60) + stages = struct.unpack("HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", stages_raw) + for i in range(30): + loc_id = 0x770000 + i + 1 + if stages[i] == 1 and loc_id not in ctx.checked_locations: new_checks.append(loc_id) elif loc_id in ctx.checked_locations: - snes_buffered_write(ctx, KDL3_HEART_STARS + level_ind, bytes([0x01])) - await snes_flush_writes(ctx) - # consumable status - consumables = await snes_read(ctx, KDL3_CONSUMABLES, 1920) - for consumable in consumable_addrs: - # TODO: see if this can be sped up in any way - loc_id = 0x770300 + consumable - if loc_id not in ctx.checked_locations and consumables[consumable_addrs[consumable]] == 0x01: - new_checks.append(loc_id) - - # boss status - boss_flag_bytes = await snes_read(ctx, KDL3_BOSS_STATUS, 2) - boss_flag = unpack("H", boss_flag_bytes)[0] - for bitmask, boss in zip(range(1, 11, 2), boss_locations.keys()): - if boss_flag & (1 << bitmask) > 0 and boss not in ctx.checked_locations: - new_checks.append(boss) - - for new_check_id in new_checks: - ctx.locations_checked.add(new_check_id) - location = ctx.location_names[new_check_id] - snes_logger.info( - f'New Check: {location} ({len(ctx.locations_checked)}/{len(ctx.missing_locations) + len(ctx.checked_locations)})') - await ctx.send_msgs([{"cmd": 'LocationChecks', "locations": [new_check_id]}]) - - if game_state[0] != 0xFF: - await self.pop_item(ctx) + snes_buffered_write(ctx, KDL3_COMPLETED_STAGES + (i * 2), struct.pack("H", 1)) + + # heart star status + heart_stars = await snes_read(ctx, KDL3_HEART_STARS, 35) + for i in range(5): + start_ind = i * 7 + for j in range(1, 7): + level_ind = start_ind + j - 1 + loc_id = 0x770100 + (6 * i) + j + if heart_stars[level_ind] and loc_id not in ctx.checked_locations: + new_checks.append(loc_id) + elif loc_id in ctx.checked_locations: + snes_buffered_write(ctx, KDL3_HEART_STARS + level_ind, bytes([0x01])) + await snes_flush_writes(ctx) + # consumable status + consumables = await snes_read(ctx, KDL3_CONSUMABLES, 1920) + for consumable in consumable_addrs: + # TODO: see if this can be sped up in any way + loc_id = 0x770300 + consumable + if loc_id not in ctx.checked_locations and consumables[consumable_addrs[consumable]] == 0x01: + new_checks.append(loc_id) + + # boss status + boss_flag_bytes = await snes_read(ctx, KDL3_BOSS_STATUS, 2) + boss_flag = unpack("H", boss_flag_bytes)[0] + for bitmask, boss in zip(range(1, 11, 2), boss_locations.keys()): + if boss_flag & (1 << bitmask) > 0 and boss not in ctx.checked_locations: + new_checks.append(boss) + + for new_check_id in new_checks: + ctx.locations_checked.add(new_check_id) + location = ctx.location_names[new_check_id] + snes_logger.info( + f'New Check: {location} ({len(ctx.locations_checked)}/{len(ctx.missing_locations) + len(ctx.checked_locations)})') + await ctx.send_msgs([{"cmd": 'LocationChecks', "locations": [new_check_id]}]) + + if game_state[0] != 0xFF: + await self.pop_item(ctx) + await self.pop_gift(ctx) + except Exception as ex: + # we crashed, so print log and clean up + snes_logger.error("", exc_info=ex) + if "gift" in ctx.command_processor.commands: + ctx.command_processor.commands.pop("gift") + ctx.rom = None + ctx.game = None diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index d9d6b1f802a0..1ea3bc4c6ddd 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -1246,6 +1246,7 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req rom.write_byte(0x3D014, multiworld.stage_shuffle[player]) rom.write_byte(0x3D016, multiworld.ow_boss_requirement[player]) rom.write_byte(0x3D018, multiworld.consumables[player]) + rom.write_byte(0x3D01A, multiworld.gifting[player]) for level in shuffled_levels: for i in range(len(shuffled_levels[level])): From ab0dcabc4c93db3403000e9ade82ccf47de41c19 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 4 Sep 2023 01:40:29 -0500 Subject: [PATCH 130/165] receiving gifts, writing rom, option --- worlds/kdl3/Client.py | 74 ++++++++++++++++++++++++++++++++++++++++-- worlds/kdl3/Options.py | 10 ++++++ worlds/kdl3/Rom.py | 16 +++++++++ 3 files changed, 97 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index f046c4e8aa7c..91bc99237a2f 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -112,7 +112,7 @@ "DesiredTraits": [ "Consumable", "Food", "Drink", "Candy", "Tomato", "Invincible", "Life", "Heal", "Health", "Trap", - "Goo", "Gel", "Slow", "Eject" + "Goo", "Gel", "Slow", "Slowness", "Eject", "Removal" ] } @@ -512,9 +512,77 @@ async def pop_item(self, ctx): async def pop_gift(self, ctx): if ctx.stored_data[self.giftbox_key]: + from SNIClient import snes_read, snes_buffered_write key, gift = ctx.stored_data[self.giftbox_key].popitem() - print(gift) await pop_object(ctx, self.giftbox_key, key) + # first, special cases + traits = [trait["Trait"] for trait in gift["Traits"]] + if "Candy" in traits or "Invincible" in traits: + # apply invincibility candy + snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x84, 0x03])) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x2B])) + elif "Tomato" in traits: + # apply maxim tomato + gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x2B])) + if gooey_hp[0] > 0x00: + snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x08, 0x00])) + snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, bytes([0x08, 0x00])) + else: + snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x0A, 0x00])) + elif "Life" in traits: + # Apply 1-Up + life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 2) + life_bytes = pack("H", unpack("H", life_count)[0] + 1) + snes_buffered_write(ctx, KDL3_LIFE_COUNT, life_bytes) + snes_buffered_write(ctx, KDL3_LIFE_VISUAL, life_bytes) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x33])) + elif "Trap" in traits: + # find the best trap to apply + if "Goo" in traits or "Gel" in traits: + check_gooey_r = await snes_read(ctx, KDL3_GOOEY_TRAP, 2) + check_gooey = struct.unpack("H", check_gooey_r) + if check_gooey[0] == 0: + snes_buffered_write(ctx, KDL3_GOOEY_TRAP, bytes([0x01, 0x00])) + else: + await update_object(ctx, key, {key: gift}) # We can't apply this yet + elif "Slow" in traits or "Slowness" in traits: + check_slow_r = await snes_read(ctx, KDL3_SLOWNESS_TRAP, 2) + check_slow = struct.unpack("H", check_slow_r) + if check_slow[0] == 0: + snes_buffered_write(ctx, KDL3_SLOWNESS_TRAP, bytes([0x84, 0x03])) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0xA7])) + else: + await update_object(ctx, key, {key: gift}) # We can't apply this yet + elif "Eject" in traits or "Removal" in traits: + check_ability_r = await snes_read(ctx, KDL3_ABILITY_TRAP, 2) + check_ability = struct.unpack("H", check_ability_r) + if check_ability[0] == 0: + snes_buffered_write(ctx, KDL3_ABILITY_TRAP, bytes([0x01, 0x00])) + else: + await update_object(ctx, key, {key: gift}) # We can't apply this yet + else: + # just deal damage to Kirby + kirby_hp = struct.unpack("H", await snes_read(ctx, KDL3_KIRBY_HP, 2))[0] + snes_buffered_write(ctx, KDL3_KIRBY_HP, struct.pack("H", max(kirby_hp - 2, 0))) + else: + # check if it's tasty + if any(x in traits for x in ["Consumable", "Food", "Drink", "Heal", "Health"]): + # it's tasty!, use quality to decide how much to heal + quality = max((trait["Quality"] for trait in gift["Traits"] + if trait["Trait"] in ["Consumable", "Food", "Drink", "Heal", "Health"])) + quality = min(10, quality * 2) + else: + # it's not really edible, but he'll eat it anyways + quality = self.client_random.choices(range(0, 2), {0: 75, 1: 25})[0] + kirby_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) + gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) + snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) + if gooey_hp[0] > 0x00: + snes_buffered_write(ctx, KDL3_KIRBY_HP, struct.pack("H", min(kirby_hp[0] + quality // 2, 8))) + snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, struct.pack("H", min(gooey_hp[0] + quality // 2, 8))) + else: + snes_buffered_write(ctx, KDL3_KIRBY_HP, struct.pack("H", min(kirby_hp[0] + quality, 10))) async def pick_gift_recipient(self, ctx, gift): if gift != 4: @@ -534,7 +602,7 @@ async def pick_gift_recipient(self, ctx, gift): Uuid = uuid.uuid4().hex item = { **gift_base, - "uuid": Uuid, + "ID": Uuid, "Sender": ctx.player_names[ctx.slot], "Receiver": ctx.player_names[most_applicable_slot], "SenderTeam": ctx.team, diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index eb0d7de90337..f25bca511a3a 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -355,6 +355,15 @@ class VirtualConsoleChanges(Choice): default = 1 +class Gifting(Toggle): + """ + When enabled, the goal game item will be sent to other compatible games as a gift, + and you can receive gifts from other players. This can be enabled during gameplay + using the client. + """ + display_name = "Gifting" + + kdl3_options: typing.Dict[str, typing.Type[Option[typing.Any]]] = { "death_link": DeathLink, "game_language": GameLanguage, @@ -384,4 +393,5 @@ class VirtualConsoleChanges(Choice): "gooey_flavor": GooeyFlavor, "music_shuffle": MusicShuffle, "virtual_console": VirtualConsoleChanges, + "gifting": Gifting } diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 1ea3bc4c6ddd..8aead2a7d903 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -954,6 +954,22 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req 0x6B, # RTL ]) + # Gifting check + rom.write_bytes(0x3A510, [ + 0xC9, 0x08, # CMP #$08 + 0xB0, 0xFF, # BCS $C3A513 - this intentionally crashes the game if hit + 0xDA, # PHX + 0xAE, 0x1A, 0x90, # LDX $901A + 0xF0, 0x0F, # BEQ $C3A529 + 0xFA, # PLX + 0x8D, 0x86, 0x80, # STA $8086 + 0xA9, 0x26, # LDA #$26 + 0x8D, 0x62, 0x7F, # STA $7F62 + 0x5C, 0x40, 0xBC, 0xCA, # JML $CABC40 + 0xFA, # PLX + 0x5C, 0x18, 0xBC, 0xCA, # JML $CABC40 + ]) + # display received items in pause menu rom.write_bytes(0x8406, [0x50, 0xA5, 0x07]) rom.write_bytes(0x3A550, [0x22, 0x9F, 0xD2, 0x00, # JSL $00D29F From 619887c72dd231fd86029c65c72c61bd60ba8b86 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 13 Sep 2023 02:20:44 -0500 Subject: [PATCH 131/165] fix gooey respawning too quickly --- worlds/kdl3/Rom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index d9d6b1f802a0..d0d8435911f1 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -522,8 +522,8 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req 0xAD, 0xD0, 0x36, # LDA $36D0 0xC9, 0xFF, 0xFF, # CMP #$FFFF - are we in menus? 0xF0, 0x34, # BEQ $079B4E - return if we are - 0xAD, 0xD3, 0x39, # LDA $39D3 - gooey hp - 0xD0, 0x0F, # BNE $079B2E - gooey is already spawned + 0xAD, 0x41, 0x55, # LDA $5541 - gooey status + 0x10, 0x0F, # BPL $079B2E - gooey is already spawned 0xAD, 0x80, 0x80, # LDA $8080 0xC9, 0x00, 0x00, # CMP #$0000 - did we get a gooey trap 0xF0, 0x07, # BEQ $079B2E - branch if we did not From 6a23c09fdc224dbadc41041da85a9e25068224f7 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 28 Sep 2023 14:41:33 -0500 Subject: [PATCH 132/165] slow fix --- worlds/kdl3/Regions.py | 15 +++++++------ worlds/kdl3/Rules.py | 44 +++++++++++++++++++++++-------------- worlds/kdl3/__init__.py | 6 +++-- worlds/kdl3/data/Rooms.json | 2 +- 4 files changed, 41 insertions(+), 26 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index a6b8d58e123d..02e33e527f39 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -9,6 +9,7 @@ from .Names import LocationName from .Options import BossShuffle from .Room import Room +from .Rules import can_reach_stage if typing.TYPE_CHECKING: from . import KDL3World @@ -89,13 +90,13 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing for level in world.player_levels: for stage in range(6): proper_stage = world.player_levels[level][stage] - level_regions[level].add_exits([first_rooms[proper_stage].name], - {first_rooms[proper_stage].name: - (lambda state: True) if world.multiworld.open_world[world.player] or - stage == 0 else lambda state, level=level, stage=stage: state.can_reach( - world.multiworld.get_location( - location_table[world.player_levels[level][stage-1]], world.player), - world.player)}) + if world.multiworld.open_world[world.player] or stage == 0: + level_regions[level].add_exits([first_rooms[proper_stage].name]) + else: + previous_stage = first_rooms[world.player_levels[level][stage - 1]] + world.multiworld.get_location(f"{level_names[previous_stage.level]} {previous_stage.stage}" + f" - Complete", world.player)\ + .parent_region.add_exits([first_rooms[proper_stage].name]) else: level_regions[level].add_exits([first_rooms[0x770200 + level - 1].name]) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index cc90a47ac536..ee59a7bf398a 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -8,15 +8,29 @@ from BaseClasses import CollectionState -def can_reach_level(state: "CollectionState", player: int, level: int, open_world: bool, - ow_boss_req: int, player_levels: typing.Dict[int, typing.Dict[int, int]]): - if level == 1: - return True +def can_reach_boss(state: "CollectionState", player: int, level: int, open_world: bool, + ow_boss_req: int, player_levels: typing.Dict[int, typing.Dict[int, int]]): + if open_world: + return state.has(f"{LocationName.level_names_inverse[level]} - Stage Completion", player, ow_boss_req) else: - if open_world: - return state.has(f"{LocationName.level_names_inverse[level - 1]} - Stage Completion", player, ow_boss_req) - else: - return state.can_reach(location_table[player_levels[level - 1][5]], "Location", player) + return can_reach_stage(state, player, level, player_levels[level][6], player_levels) + + +def can_reach_stage(state: "CollectionState", player: int, level: int, stage: int, + player_levels: typing.Dict[int, typing.Dict[int, int]]): + for j in range(7): + if player_levels[level][j] == stage: + return True + elif player_levels[level][j] == 0x77000B: + if not can_reach_kine(state, player): + return False + elif player_levels[level][j] == 0x770011: + if not can_reach_cutter(state, player): + return False + elif player_levels[level][j] == 0x77001C: + if not can_reach_burning(state, player): + return False + return False def can_reach_rick(state: "CollectionState", player: int) -> bool: @@ -246,21 +260,22 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E10, world.player), lambda state: can_reach_kine(state, world.player)) - for boss_flag, purification, i in zip(["Level 1 Boss", "Level 2 Boss", - "Level 3 Boss", "Level 4 Boss", "Level 5 Boss"], + for boss_flag, purification, i in zip(["Level 1 Boss - Purified", "Level 2 Boss - Purified", + "Level 3 Boss - Purified", "Level 4 Boss - Purified", + "Level 5 Boss - Purified"], [LocationName.grass_land_whispy, LocationName.ripple_field_acro, LocationName.sand_canyon_poncon, LocationName.cloudy_park_ado, LocationName.iceberg_dedede], range(1, 6)): set_rule(world.multiworld.get_location(boss_flag, world.player), lambda state, i=i: (state.has("Heart Star", world.player, world.boss_requirements[i - 1]) - and can_reach_level(state, world.player, i + 1, + and can_reach_boss(state, world.player, i, world.multiworld.open_world[world.player], world.multiworld.ow_boss_requirement[world.player], world.player_levels))) set_rule(world.multiworld.get_location(purification, world.player), lambda state, i=i: (state.has("Heart Star", world.player, world.boss_requirements[i - 1]) - and can_reach_level(state, world.player, i + 1, + and can_reach_boss(state, world.player, i, world.multiworld.open_world[world.player], world.multiworld.ow_boss_requirement[world.player], world.player_levels))) @@ -275,10 +290,7 @@ def set_rules(world: "KDL3World") -> None: for level in range(2, 6): add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), - lambda state, i=level: can_reach_level(state, world.player, i, - world.multiworld.open_world[world.player], - world.multiworld.ow_boss_requirement[world.player], - world.player_levels)) + lambda state, i=level: state.has(f"Level {i - 1} Boss Defeated", world.player)) if world.multiworld.goal_speed[world.player] == 0: add_rule(world.multiworld.get_entrance("To Level 6", world.player), diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index a8370faa5041..7593afed6a15 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -133,7 +133,6 @@ def generate_early(self) -> None: self.copy_abilities[enemy] = self.random \ .choice(valid_abilities) - def pre_fill(self) -> None: for enemy in enemy_mapping: self.multiworld.get_location(enemy, self.player) \ @@ -235,7 +234,10 @@ def generate_basic(self) -> None: goal_location = self.multiworld.get_location(LocationName.goals[goal], self.player) goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, self.player)) for level in range(1, 6): - self.multiworld.get_location(f"Level {level} Boss", self.player) \ + self.multiworld.get_location(f"Level {level} Boss - Defeated", self.player) \ + .place_locked_item( + KDL3Item(f"Level {level} Boss Defeated", ItemClassification.progression, None, self.player)) + self.multiworld.get_location(f"Level {level} Boss - Purified", self.player) \ .place_locked_item( KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) diff --git a/worlds/kdl3/data/Rooms.json b/worlds/kdl3/data/Rooms.json index df33db7e7920..f6e3cb2fc9bb 100644 --- a/worlds/kdl3/data/Rooms.json +++ b/worlds/kdl3/data/Rooms.json @@ -1 +1 @@ -[{"name": "Grass Land 1 - 0", "level": 1, "stage": 1, "room": 0, "pointer": 3434257, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sir Kibble", "Cappy"], "default_exits": [{"room": 1, "unkn1": 205, "unkn2": 8, "x": 72, "y": 200, "name": "Grass Land 1 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 87, "unkn2": 9, "x": 104, "y": 152, "name": "Grass Land 1 - 0 Exit 1", "access_rule": []}], "entity_load": [[0, 16], [1, 23], [0, 23], [14, 23], [27, 16], [12, 16], [4, 22]], "locations": ["Grass Land 1 - Enemy 1 (Waddle Dee)", "Grass Land 1 - Enemy 2 (Sir Kibble)", "Grass Land 1 - Enemy 3 (Cappy)"], "music": 20}, {"name": "Grass Land 1 - 1", "level": 1, "stage": 1, "room": 1, "pointer": 3368373, "animal_pointers": [], "consumables": [{"idx": 14, "pointer": 264, "x": 928, "y": 160, "etype": 22, "vtype": 0, "name": "Grass Land 1 - 1-Up (Parasol)"}, {"idx": 15, "pointer": 312, "x": 1456, "y": 176, "etype": 22, "vtype": 2, "name": "Grass Land 1 - Maxim Tomato (Spark)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Bronto Burt", "Sasuke"], "default_exits": [{"room": 3, "unkn1": 143, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [30, 16], [12, 16], [14, 23], [8, 16], [0, 22], [2, 22]], "locations": ["Grass Land 1 - Enemy 4 (Sparky)", "Grass Land 1 - Enemy 5 (Bronto Burt)", "Grass Land 1 - Enemy 6 (Sasuke)", "Grass Land 1 - 1-Up (Parasol)", "Grass Land 1 - Maxim Tomato (Spark)"], "music": 20}, {"name": "Grass Land 1 - 2", "level": 1, "stage": 1, "room": 2, "pointer": 2960650, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 1416, "y": 152, "name": "Grass Land 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 1 - Animal 1", "Grass Land 1 - Animal 2"], "music": 38}, {"name": "Grass Land 1 - 3", "level": 1, "stage": 1, "room": 3, "pointer": 3478442, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 179, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [7, 16], [0, 23], [6, 22], [14, 23], [8, 16], [1, 23]], "locations": ["Grass Land 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 20}, {"name": "Grass Land 1 - 4", "level": 1, "stage": 1, "room": 4, "pointer": 2978390, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [42, 19]], "locations": ["Grass Land 1 - Tulip"], "music": 8}, {"name": "Grass Land 1 - 5", "level": 1, "stage": 1, "room": 5, "pointer": 2890835, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 1 - Complete"], "music": 5}, {"name": "Grass Land 2 - 0", "level": 1, "stage": 2, "room": 0, "pointer": 3293347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "KeKe", "Bobo", "Poppy Bros Jr."], "default_exits": [{"room": 1, "unkn1": 112, "unkn2": 9, "x": 72, "y": 152, "name": "Grass Land 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [7, 16], [5, 16], [4, 22], [51, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 1 (Rocky)", "Grass Land 2 - Enemy 2 (KeKe)", "Grass Land 2 - Enemy 3 (Bobo)", "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)"], "music": 11}, {"name": "Grass Land 2 - 1", "level": 1, "stage": 2, "room": 1, "pointer": 3059685, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 9, "x": 56, "y": 136, "name": "Grass Land 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 2 - Animal 1", "Grass Land 2 - Animal 2"], "music": 39}, {"name": "Grass Land 2 - 2", "level": 1, "stage": 2, "room": 2, "pointer": 3432109, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Popon Ball", "Bouncy"], "default_exits": [{"room": 4, "unkn1": 133, "unkn2": 11, "x": 72, "y": 200, "name": "Grass Land 2 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 52, "unkn2": 12, "x": 56, "y": 152, "name": "Grass Land 2 - 2 Exit 1", "access_rule": []}], "entity_load": [[13, 16], [50, 16], [4, 22], [3, 16], [0, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 5 (Waddle Dee)", "Grass Land 2 - Enemy 6 (Popon Ball)", "Grass Land 2 - Enemy 7 (Bouncy)"], "music": 11}, {"name": "Grass Land 2 - 3", "level": 1, "stage": 2, "room": 3, "pointer": 2970029, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 2, "unkn2": 9, "x": 840, "y": 168, "name": "Grass Land 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 19]], "locations": [], "music": 11}, {"name": "Grass Land 2 - 4", "level": 1, "stage": 2, "room": 4, "pointer": 3578022, "animal_pointers": [], "consumables": [{"idx": 20, "pointer": 272, "x": 992, "y": 192, "etype": 22, "vtype": 0, "name": "Grass Land 2 - 1-Up (Needle)"}], "consumables_pointer": 352, "enemies": ["Tick", "Bronto Burt", "Nruff"], "default_exits": [{"room": 5, "unkn1": 154, "unkn2": 12, "x": 72, "y": 152, "name": "Grass Land 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [5, 16], [2, 16], [48, 16], [14, 23], [0, 22]], "locations": ["Grass Land 2 - Enemy 8 (Tick)", "Grass Land 2 - Enemy 9 (Bronto Burt)", "Grass Land 2 - Enemy 10 (Nruff)", "Grass Land 2 - 1-Up (Needle)"], "music": 11}, {"name": "Grass Land 2 - 5", "level": 1, "stage": 2, "room": 5, "pointer": 2966057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 19], [42, 19]], "locations": ["Grass Land 2 - Muchimuchi"], "music": 8}, {"name": "Grass Land 2 - 6", "level": 1, "stage": 2, "room": 6, "pointer": 2887461, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 2 - Complete"], "music": 5}, {"name": "Grass Land 3 - 0", "level": 1, "stage": 3, "room": 0, "pointer": 3149707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Rocky", "Nruff"], "default_exits": [{"room": 1, "unkn1": 107, "unkn2": 7, "x": 72, "y": 840, "name": "Grass Land 3 - 0 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 46, "unkn2": 9, "x": 152, "y": 152, "name": "Grass Land 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [14, 23], [15, 16], [0, 16], [8, 16]], "locations": ["Grass Land 3 - Enemy 1 (Sparky)", "Grass Land 3 - Enemy 2 (Rocky)", "Grass Land 3 - Enemy 3 (Nruff)"], "music": 19}, {"name": "Grass Land 3 - 1", "level": 1, "stage": 3, "room": 1, "pointer": 3204939, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 360, "x": 208, "y": 344, "etype": 22, "vtype": 0, "name": "Grass Land 3 - 1-Up (Climb)"}, {"idx": 11, "pointer": 376, "x": 224, "y": 568, "etype": 22, "vtype": 2, "name": "Grass Land 3 - Maxim Tomato (Climb)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [6, 23], [2, 22], [5, 23], [14, 23], [1, 23], [0, 23], [31, 16]], "locations": ["Grass Land 3 - 1-Up (Climb)", "Grass Land 3 - Maxim Tomato (Climb)"], "music": 19}, {"name": "Grass Land 3 - 2", "level": 1, "stage": 3, "room": 2, "pointer": 3200066, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 55, "x": 56, "y": 152, "name": "Grass Land 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [14, 23]], "locations": [], "music": 19}, {"name": "Grass Land 3 - 3", "level": 1, "stage": 3, "room": 3, "pointer": 2959784, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 15, "unkn2": 9, "x": 56, "y": 120, "name": "Grass Land 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 31}, {"name": "Grass Land 3 - 4", "level": 1, "stage": 3, "room": 4, "pointer": 2979121, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 8, "unkn2": 9, "x": 760, "y": 152, "name": "Grass Land 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 3 - Animal 1", "Grass Land 3 - Animal 2"], "music": 40}, {"name": "Grass Land 3 - 5", "level": 1, "stage": 3, "room": 5, "pointer": 2997811, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 8}, {"name": "Grass Land 3 - 6", "level": 1, "stage": 3, "room": 6, "pointer": 3084876, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bouncy"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [14, 16], [1, 23], [59, 16], [14, 23]], "locations": ["Grass Land 3 - Pitcherman", "Grass Land 3 - Enemy 4 (Bouncy)"], "music": 19}, {"name": "Grass Land 3 - 7", "level": 1, "stage": 3, "room": 7, "pointer": 2891317, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 3 - Complete"], "music": 5}, {"name": "Grass Land 4 - 0", "level": 1, "stage": 4, "room": 0, "pointer": 3471284, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Babut", "Rocky"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 13, "x": 72, "y": 136, "name": "Grass Land 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [14, 23], [40, 16], [61, 16], [4, 22]], "locations": ["Grass Land 4 - Enemy 1 (Loud)", "Grass Land 4 - Enemy 2 (Babut)", "Grass Land 4 - Enemy 3 (Rocky)"], "music": 10}, {"name": "Grass Land 4 - 1", "level": 1, "stage": 4, "room": 1, "pointer": 3436401, "animal_pointers": [], "consumables": [{"idx": 12, "pointer": 290, "x": 1008, "y": 144, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Zebon Right)"}], "consumables_pointer": 368, "enemies": ["Kapar"], "default_exits": [{"room": 5, "unkn1": 58, "unkn2": 5, "x": 184, "y": 312, "name": "Grass Land 4 - 1 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 42, "unkn2": 18, "x": 168, "y": 88, "name": "Grass Land 4 - 1 Exit 1", "access_rule": []}], "entity_load": [[43, 16], [10, 23], [6, 22], [14, 23], [2, 22], [67, 16]], "locations": ["Grass Land 4 - Enemy 4 (Kapar)", "Grass Land 4 - Maxim Tomato (Zebon Right)"], "music": 10}, {"name": "Grass Land 4 - 2", "level": 1, "stage": 4, "room": 2, "pointer": 3039401, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 4, "x": 56, "y": 72, "name": "Grass Land 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": [], "music": 9}, {"name": "Grass Land 4 - 3", "level": 1, "stage": 4, "room": 3, "pointer": 3722714, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 280, "x": 856, "y": 224, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Gordo)"}, {"idx": 22, "pointer": 480, "x": 1352, "y": 112, "etype": 22, "vtype": 0, "name": "Grass Land 4 - 1-Up (Gordo)"}], "consumables_pointer": 288, "enemies": ["Glunk", "Oro"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 5, "x": 72, "y": 200, "name": "Grass Land 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [55, 16], [16, 16], [25, 16], [14, 23], [0, 22], [2, 22], [4, 22]], "locations": ["Grass Land 4 - Enemy 5 (Glunk)", "Grass Land 4 - Enemy 6 (Oro)", "Grass Land 4 - Maxim Tomato (Gordo)", "Grass Land 4 - 1-Up (Gordo)"], "music": 10}, {"name": "Grass Land 4 - 4", "level": 1, "stage": 4, "room": 4, "pointer": 3304980, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 208, "x": 488, "y": 64, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Cliff)"}], "consumables_pointer": 160, "enemies": [], "default_exits": [{"room": 8, "unkn1": 94, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [2, 22], [54, 16], [1, 16], [40, 16], [14, 23]], "locations": ["Grass Land 4 - Maxim Tomato (Cliff)"], "music": 10}, {"name": "Grass Land 4 - 5", "level": 1, "stage": 4, "room": 5, "pointer": 3498127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 2, "unkn1": 61, "unkn2": 13, "x": 56, "y": 72, "name": "Grass Land 4 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 61, "unkn2": 18, "x": 56, "y": 200, "name": "Grass Land 4 - 5 Exit 1", "access_rule": []}], "entity_load": [[72, 16], [43, 16], [4, 22], [14, 23], [10, 23], [3, 16]], "locations": ["Grass Land 4 - Enemy 7 (Peran)"], "music": 10}, {"name": "Grass Land 4 - 6", "level": 1, "stage": 4, "room": 6, "pointer": 3160191, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 28, "unkn2": 4, "x": 72, "y": 376, "name": "Grass Land 4 - 6 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 28, "unkn2": 12, "x": 72, "y": 440, "name": "Grass Land 4 - 6 Exit 1", "access_rule": []}], "entity_load": [[3, 19], [6, 23]], "locations": [], "music": 10}, {"name": "Grass Land 4 - 7", "level": 1, "stage": 4, "room": 7, "pointer": 3035801, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 12, "x": 56, "y": 200, "name": "Grass Land 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Grass Land 4 - Miniboss 1 (Boboo)"], "music": 4}, {"name": "Grass Land 4 - 8", "level": 1, "stage": 4, "room": 8, "pointer": 2989794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[3, 19], [42, 19]], "locations": ["Grass Land 4 - Chao & Goku"], "music": 8}, {"name": "Grass Land 4 - 9", "level": 1, "stage": 4, "room": 9, "pointer": 3043518, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 9, "unkn2": 5, "x": 696, "y": 296, "name": "Grass Land 4 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 4 - Animal 1", "Grass Land 4 - Animal 2"], "music": 38}, {"name": "Grass Land 4 - 10", "level": 1, "stage": 4, "room": 10, "pointer": 2888425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 4 - Complete"], "music": 5}, {"name": "Grass Land 5 - 0", "level": 1, "stage": 5, "room": 0, "pointer": 3303565, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 1, "unkn1": 120, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [4, 22], [14, 23], [6, 23], [11, 16], [89, 16]], "locations": ["Grass Land 5 - Enemy 1 (Propeller)", "Grass Land 5 - Enemy 2 (Broom Hatter)", "Grass Land 5 - Enemy 3 (Bouncy)"], "music": 11}, {"name": "Grass Land 5 - 1", "level": 1, "stage": 5, "room": 1, "pointer": 3048718, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 3, "unkn1": 18, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 21, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 36, "unkn2": 9, "x": 56, "y": 88, "name": "Grass Land 5 - 1 Exit 2", "access_rule": []}], "entity_load": [[27, 16], [14, 23]], "locations": ["Grass Land 5 - Enemy 4 (Sir Kibble)"], "music": 11}, {"name": "Grass Land 5 - 2", "level": 1, "stage": 5, "room": 2, "pointer": 3327019, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sasuke", "Nruff"], "default_exits": [{"room": 7, "unkn1": 121, "unkn2": 6, "x": 56, "y": 72, "name": "Grass Land 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [4, 22], [30, 16], [15, 16], [1, 16]], "locations": ["Grass Land 5 - Enemy 5 (Waddle Dee)", "Grass Land 5 - Enemy 6 (Sasuke)", "Grass Land 5 - Enemy 7 (Nruff)"], "music": 11}, {"name": "Grass Land 5 - 3", "level": 1, "stage": 5, "room": 3, "pointer": 2966459, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 312, "y": 72, "name": "Grass Land 5 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 1", "Grass Land 5 - Animal 2"], "music": 38}, {"name": "Grass Land 5 - 4", "level": 1, "stage": 5, "room": 4, "pointer": 2973509, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 360, "y": 72, "name": "Grass Land 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 3", "Grass Land 5 - Animal 4"], "music": 38}, {"name": "Grass Land 5 - 5", "level": 1, "stage": 5, "room": 5, "pointer": 2962351, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[4, 19], [42, 19]], "locations": ["Grass Land 5 - Mine"], "music": 8}, {"name": "Grass Land 5 - 6", "level": 1, "stage": 5, "room": 6, "pointer": 2886738, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 5 - Complete"], "music": 5}, {"name": "Grass Land 5 - 7", "level": 1, "stage": 5, "room": 7, "pointer": 3255423, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [4, 22], [14, 23]], "locations": ["Grass Land 5 - Enemy 8 (Tick)"], "music": 11}, {"name": "Grass Land 6 - 0", "level": 1, "stage": 6, "room": 0, "pointer": 3376872, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Togezo", "Bronto Burt", "Cappy"], "default_exits": [{"room": 6, "unkn1": 51, "unkn2": 9, "x": 216, "y": 152, "name": "Grass Land 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 96, "unkn2": 9, "x": 216, "y": 1144, "name": "Grass Land 6 - 0 Exit 1", "access_rule": []}], "entity_load": [[12, 16], [18, 16], [2, 16], [41, 16], [4, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 1 (Como)", "Grass Land 6 - Enemy 2 (Togezo)", "Grass Land 6 - Enemy 3 (Bronto Burt)", "Grass Land 6 - Enemy 4 (Cappy)"], "music": 20}, {"name": "Grass Land 6 - 1", "level": 1, "stage": 6, "room": 1, "pointer": 3395125, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 192, "x": 104, "y": 1144, "etype": 22, "vtype": 0, "name": "Grass Land 6 - 1-Up (Tower)"}], "consumables_pointer": 256, "enemies": ["Bobo", "Mariel"], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 5, "x": 72, "y": 88, "name": "Grass Land 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [5, 19], [45, 16], [0, 22], [4, 22], [14, 23], [55, 16]], "locations": ["Grass Land 6 - Enemy 5 (Bobo)", "Grass Land 6 - Enemy 6 (Mariel)", "Grass Land 6 - 1-Up (Tower)"], "music": 20}, {"name": "Grass Land 6 - 2", "level": 1, "stage": 6, "room": 2, "pointer": 3375177, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter"], "default_exits": [{"room": 3, "unkn1": 93, "unkn2": 6, "x": 200, "y": 152, "name": "Grass Land 6 - 2 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 49, "unkn2": 7, "x": 216, "y": 104, "name": "Grass Land 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[11, 16], [45, 16], [41, 16], [4, 22], [32, 16], [14, 23]], "locations": ["Grass Land 6 - Enemy 7 (Yaban)", "Grass Land 6 - Enemy 8 (Broom Hatter)"], "music": 20}, {"name": "Grass Land 6 - 3", "level": 1, "stage": 6, "room": 3, "pointer": 3322977, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Apolo", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 52, "x": 72, "y": 104, "name": "Grass Land 6 - 3 Exit 0", "access_rule": []}], "entity_load": [[41, 16], [49, 16], [30, 16], [14, 23], [4, 22]], "locations": ["Grass Land 6 - Enemy 9 (Apolo)", "Grass Land 6 - Enemy 10 (Sasuke)"], "music": 20}, {"name": "Grass Land 6 - 4", "level": 1, "stage": 6, "room": 4, "pointer": 3490819, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 192, "x": 40, "y": 104, "etype": 22, "vtype": 1, "name": "Grass Land 6 - 1-Up (Falling)"}], "consumables_pointer": 176, "enemies": ["Rocky"], "default_exits": [{"room": 5, "unkn1": 145, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [4, 22], [49, 16], [61, 16], [3, 16], [1, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 11 (Rocky)", "Grass Land 6 - 1-Up (Falling)"], "music": 20}, {"name": "Grass Land 6 - 5", "level": 1, "stage": 6, "room": 5, "pointer": 3076769, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 19], [42, 19]], "locations": ["Grass Land 6 - Pierre"], "music": 8}, {"name": "Grass Land 6 - 6", "level": 1, "stage": 6, "room": 6, "pointer": 3047576, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 9, "x": 840, "y": 152, "name": "Grass Land 6 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 1", "Grass Land 6 - Animal 2"], "music": 39}, {"name": "Grass Land 6 - 7", "level": 1, "stage": 6, "room": 7, "pointer": 3022909, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 808, "y": 120, "name": "Grass Land 6 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 3", "Grass Land 6 - Animal 4"], "music": 38}, {"name": "Grass Land 6 - 8", "level": 1, "stage": 6, "room": 8, "pointer": 2884569, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 6 - Complete"], "music": 5}, {"name": "Grass Land Boss - 0", "level": 1, "stage": 7, "room": 0, "pointer": 2984105, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[0, 18]], "locations": ["Grass Land - Boss (Whispy Woods) Purified", "Level 1 Boss"], "music": 2}, {"name": "Ripple Field 1 - 0", "level": 2, "stage": 1, "room": 0, "pointer": 3279855, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Glunk", "Broom Hatter", "Cappy"], "default_exits": [{"room": 2, "unkn1": 102, "unkn2": 8, "x": 56, "y": 152, "name": "Ripple Field 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[16, 16], [0, 16], [12, 16], [11, 16], [14, 23]], "locations": ["Ripple Field 1 - Enemy 1 (Waddle Dee)", "Ripple Field 1 - Enemy 2 (Glunk)", "Ripple Field 1 - Enemy 3 (Broom Hatter)", "Ripple Field 1 - Enemy 4 (Cappy)"], "music": 15}, {"name": "Ripple Field 1 - 1", "level": 2, "stage": 1, "room": 1, "pointer": 3588688, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 11, "x": 40, "y": 232, "name": "Ripple Field 1 - 1 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 108, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 138, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [2, 16], [3, 16], [7, 16]], "locations": ["Ripple Field 1 - Enemy 5 (Bronto Burt)", "Ripple Field 1 - Enemy 6 (Rocky)", "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 1 - 2", "level": 2, "stage": 1, "room": 2, "pointer": 2955848, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 18, "unkn2": 9, "x": 56, "y": 168, "name": "Ripple Field 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 1 - Animal 1", "Ripple Field 1 - Animal 2"], "music": 40}, {"name": "Ripple Field 1 - 3", "level": 2, "stage": 1, "room": 3, "pointer": 3558828, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin"], "default_exits": [{"room": 4, "unkn1": 171, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[73, 16], [6, 22], [14, 23], [4, 22], [0, 16], [10, 23]], "locations": ["Ripple Field 1 - Enemy 8 (Bobin)"], "music": 15}, {"name": "Ripple Field 1 - 4", "level": 2, "stage": 1, "room": 4, "pointer": 2974271, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [42, 19]], "locations": ["Ripple Field 1 - Kamuribana"], "music": 8}, {"name": "Ripple Field 1 - 5", "level": 2, "stage": 1, "room": 5, "pointer": 3051513, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 264, "name": "Ripple Field 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 6", "level": 2, "stage": 1, "room": 6, "pointer": 3049838, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1752, "y": 264, "name": "Ripple Field 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 7", "level": 2, "stage": 1, "room": 7, "pointer": 3066407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 2232, "y": 264, "name": "Ripple Field 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[7, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 8", "level": 2, "stage": 1, "room": 8, "pointer": 2889148, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 1 - Complete"], "music": 5}, {"name": "Ripple Field 2 - 0", "level": 2, "stage": 2, "room": 0, "pointer": 3342336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Coconut", "Blipper", "Sasuke"], "default_exits": [{"room": 1, "unkn1": 103, "unkn2": 15, "x": 56, "y": 104, "name": "Ripple Field 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[5, 22], [34, 16], [30, 16], [21, 16], [14, 23], [4, 22], [18, 16]], "locations": ["Ripple Field 2 - Enemy 1 (Togezo)", "Ripple Field 2 - Enemy 2 (Coconut)", "Ripple Field 2 - Enemy 3 (Blipper)", "Ripple Field 2 - Enemy 4 (Sasuke)"], "music": 10}, {"name": "Ripple Field 2 - 1", "level": 2, "stage": 2, "room": 1, "pointer": 3084099, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 23, "unkn2": 8, "x": 72, "y": 248, "name": "Ripple Field 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 1", "Ripple Field 2 - Animal 2"], "music": 39}, {"name": "Ripple Field 2 - 2", "level": 2, "stage": 2, "room": 2, "pointer": 3451207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 4, "unkn1": 31, "unkn2": 5, "x": 72, "y": 152, "name": "Ripple Field 2 - 2 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 96, "unkn2": 6, "x": 56, "y": 152, "name": "Ripple Field 2 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 56, "unkn2": 17, "x": 136, "y": 264, "name": "Ripple Field 2 - 2 Exit 2", "access_rule": []}], "entity_load": [[29, 16], [47, 16], [1, 16], [46, 16], [14, 23]], "locations": ["Ripple Field 2 - Enemy 5 (Kany)"], "music": 10}, {"name": "Ripple Field 2 - 3", "level": 2, "stage": 2, "room": 3, "pointer": 3674327, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 480, "x": 1384, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 2 - Maxim Tomato (Currents)"}, {"idx": 10, "pointer": 520, "x": 1456, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 2 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Glunk"], "default_exits": [{"room": 2, "unkn1": 134, "unkn2": 5, "x": 40, "y": 136, "name": "Ripple Field 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [14, 23], [16, 16], [21, 16], [4, 22]], "locations": ["Ripple Field 2 - Enemy 6 (Glunk)", "Ripple Field 2 - Maxim Tomato (Currents)", "Ripple Field 2 - 1-Up (Currents)"], "music": 10}, {"name": "Ripple Field 2 - 4", "level": 2, "stage": 2, "room": 4, "pointer": 2972744, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 3, "unkn2": 9, "x": 520, "y": 88, "name": "Ripple Field 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[8, 19]], "locations": [], "music": 10}, {"name": "Ripple Field 2 - 5", "level": 2, "stage": 2, "room": 5, "pointer": 3109710, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 16, "x": 1048, "y": 280, "name": "Ripple Field 2 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 3", "Ripple Field 2 - Animal 4"], "music": 38}, {"name": "Ripple Field 2 - 6", "level": 2, "stage": 2, "room": 6, "pointer": 2973127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[8, 19], [42, 19]], "locations": ["Ripple Field 2 - Bakasa"], "music": 8}, {"name": "Ripple Field 2 - 7", "level": 2, "stage": 2, "room": 7, "pointer": 2890353, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 2 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 0", "level": 2, "stage": 3, "room": 0, "pointer": 3517254, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 105, "unkn2": 8, "x": 40, "y": 104, "name": "Ripple Field 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[21, 16], [57, 16], [62, 16], [67, 16], [4, 22], [14, 23]], "locations": ["Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", "Ripple Field 3 - Enemy 2 (Kapar)", "Ripple Field 3 - Enemy 3 (Blipper)"], "music": 18}, {"name": "Ripple Field 3 - 1", "level": 2, "stage": 3, "room": 1, "pointer": 3604480, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 320, "x": 832, "y": 152, "etype": 22, "vtype": 2, "name": "Ripple Field 3 - Maxim Tomato (Cove)"}, {"idx": 13, "pointer": 424, "x": 1128, "y": 384, "etype": 22, "vtype": 0, "name": "Ripple Field 3 - 1-Up (Cutter/Spark)"}], "consumables_pointer": 160, "enemies": ["Sparky", "Glunk", "Joe"], "default_exits": [{"room": 7, "unkn1": 80, "unkn2": 24, "x": 104, "y": 328, "name": "Ripple Field 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[13, 23], [14, 23], [91, 16], [16, 16], [2, 22], [8, 16], [0, 22]], "locations": ["Ripple Field 3 - Enemy 4 (Sparky)", "Ripple Field 3 - Enemy 5 (Glunk)", "Ripple Field 3 - Enemy 6 (Joe)", "Ripple Field 3 - Maxim Tomato (Cove)", "Ripple Field 3 - 1-Up (Cutter/Spark)"], "music": 18}, {"name": "Ripple Field 3 - 2", "level": 2, "stage": 3, "room": 2, "pointer": 3715428, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobo"], "default_exits": [{"room": 4, "unkn1": 118, "unkn2": 9, "x": 56, "y": 152, "name": "Ripple Field 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [21, 16], [4, 22], [46, 16], [47, 16], [5, 16], [14, 23]], "locations": ["Ripple Field 3 - Enemy 7 (Bobo)"], "music": 18}, {"name": "Ripple Field 3 - 3", "level": 2, "stage": 3, "room": 3, "pointer": 3071919, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 15, "unkn2": 6, "x": 56, "y": 104, "name": "Ripple Field 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 3 - Animal 1", "Ripple Field 3 - Animal 2"], "music": 39}, {"name": "Ripple Field 3 - 4", "level": 2, "stage": 3, "room": 4, "pointer": 2970810, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": ["Ripple Field 3 - Elieel"], "music": 8}, {"name": "Ripple Field 3 - 5", "level": 2, "stage": 3, "room": 5, "pointer": 2987502, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 232, "y": 88, "name": "Ripple Field 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": [], "music": 31}, {"name": "Ripple Field 3 - 6", "level": 2, "stage": 3, "room": 6, "pointer": 2888666, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 3 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 7", "level": 2, "stage": 3, "room": 7, "pointer": 3161120, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 3, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 3 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 11, "unkn2": 20, "x": 56, "y": 216, "name": "Ripple Field 3 - 7 Exit 1", "access_rule": []}], "entity_load": [[57, 16]], "locations": [], "music": 18}, {"name": "Ripple Field 4 - 0", "level": 2, "stage": 4, "room": 0, "pointer": 3082540, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Stone)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Mony"], "default_exits": [{"room": 6, "unkn1": 4, "unkn2": 16, "x": 72, "y": 232, "name": "Ripple Field 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [79, 16], [80, 16], [81, 16], [4, 22], [20, 16], [77, 16]], "locations": ["Ripple Field 4 - Enemy 1 (Bukiset (Stone))", "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", "Ripple Field 4 - Enemy 5 (Mony)"], "music": 15}, {"name": "Ripple Field 4 - 1", "level": 2, "stage": 4, "room": 1, "pointer": 2964846, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 72, "y": 88, "name": "Ripple Field 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Ripple Field 4 - Miniboss 1 (Captain Stitch)"], "music": 4}, {"name": "Ripple Field 4 - 2", "level": 2, "stage": 4, "room": 2, "pointer": 3018503, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)"], "default_exits": [{"room": 11, "unkn1": 25, "unkn2": 5, "x": 56, "y": 88, "name": "Ripple Field 4 - 2 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 25, "unkn2": 15, "x": 56, "y": 216, "name": "Ripple Field 4 - 2 Exit 1", "access_rule": []}], "entity_load": [[10, 19], [76, 16]], "locations": ["Ripple Field 4 - Enemy 6 (Bukiset (Burning))"], "music": 15}, {"name": "Ripple Field 4 - 3", "level": 2, "stage": 4, "room": 3, "pointer": 2988166, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[10, 19], [42, 19]], "locations": ["Ripple Field 4 - Toad & Little Toad"], "music": 8}, {"name": "Ripple Field 4 - 4", "level": 2, "stage": 4, "room": 4, "pointer": 2885533, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 4 - Complete"], "music": 5}, {"name": "Ripple Field 4 - 5", "level": 2, "stage": 4, "room": 5, "pointer": 3042349, "animal_pointers": [222, 230, 238], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 5, "x": 360, "y": 120, "name": "Ripple Field 4 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 488, "y": 120, "name": "Ripple Field 4 - 5 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 16, "unkn2": 5, "x": 104, "y": 88, "name": "Ripple Field 4 - 5 Exit 2", "access_rule": []}, {"room": 6, "unkn1": 10, "unkn2": 11, "x": 440, "y": 216, "name": "Ripple Field 4 - 5 Exit 3", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 4 - Animal 1", "Ripple Field 4 - Animal 2", "Ripple Field 4 - Animal 3"], "music": 40}, {"name": "Ripple Field 4 - 6", "level": 2, "stage": 4, "room": 6, "pointer": 3234805, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Blipper"], "default_exits": [{"room": 5, "unkn1": 21, "unkn2": 7, "x": 104, "y": 88, "name": "Ripple Field 4 - 6 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 31, "unkn2": 7, "x": 232, "y": 88, "name": "Ripple Field 4 - 6 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 26, "unkn2": 13, "x": 184, "y": 184, "name": "Ripple Field 4 - 6 Exit 2", "access_rule": []}, {"room": 12, "unkn1": 48, "unkn2": 15, "x": 88, "y": 216, "name": "Ripple Field 4 - 6 Exit 3", "access_rule": []}], "entity_load": [[73, 16], [14, 23], [21, 16], [13, 23]], "locations": ["Ripple Field 4 - Enemy 7 (Bobin)", "Ripple Field 4 - Enemy 8 (Blipper)"], "music": 15}, {"name": "Ripple Field 4 - 7", "level": 2, "stage": 4, "room": 7, "pointer": 3155468, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 6, "x": 104, "y": 136, "name": "Ripple Field 4 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 18, "unkn2": 9, "x": 72, "y": 248, "name": "Ripple Field 4 - 7 Exit 1", "access_rule": []}], "entity_load": [[14, 23], [1, 16], [0, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 4 - 8", "level": 2, "stage": 4, "room": 8, "pointer": 3350031, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Oro"], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 22, "x": 184, "y": 440, "name": "Ripple Field 4 - 8 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 34, "unkn2": 22, "x": 296, "y": 440, "name": "Ripple Field 4 - 8 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 16, "unkn2": 72, "x": 168, "y": 152, "name": "Ripple Field 4 - 8 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 23, "unkn2": 72, "x": 120, "y": 152, "name": "Ripple Field 4 - 8 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [68, 16], [14, 23], [25, 16], [6, 23]], "locations": ["Ripple Field 4 - Enemy 9 (Como)", "Ripple Field 4 - Enemy 10 (Oro)"], "music": 15}, {"name": "Ripple Field 4 - 9", "level": 2, "stage": 4, "room": 9, "pointer": 3050397, "animal_pointers": [], "consumables": [{"idx": 29, "pointer": 200, "x": 88, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Stone)"}], "consumables_pointer": 176, "enemies": ["Gansan"], "default_exits": [{"room": 8, "unkn1": 11, "unkn2": 9, "x": 264, "y": 1144, "name": "Ripple Field 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[75, 16], [2, 22]], "locations": ["Ripple Field 4 - Enemy 11 (Gansan)", "Ripple Field 4 - Maxim Tomato (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 10", "level": 2, "stage": 4, "room": 10, "pointer": 3052069, "animal_pointers": [], "consumables": [{"idx": 30, "pointer": 192, "x": 200, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 4 - 1-Up (Stone)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 8, "unkn1": 6, "unkn2": 9, "x": 376, "y": 1144, "name": "Ripple Field 4 - 10 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [75, 16]], "locations": ["Ripple Field 4 - 1-Up (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 11", "level": 2, "stage": 4, "room": 11, "pointer": 3386974, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Kapar", "Squishy"], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 13, "x": 72, "y": 152, "name": "Ripple Field 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[22, 16], [67, 16], [14, 23], [62, 16], [0, 16]], "locations": ["Ripple Field 4 - Enemy 12 (Waddle Dee)", "Ripple Field 4 - Enemy 13 (Kapar)", "Ripple Field 4 - Enemy 14 (Squishy)"], "music": 15}, {"name": "Ripple Field 4 - 12", "level": 2, "stage": 4, "room": 12, "pointer": 3168339, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 8, "unkn1": 67, "unkn2": 7, "x": 88, "y": 1224, "name": "Ripple Field 4 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 75, "unkn2": 7, "x": 88, "y": 136, "name": "Ripple Field 4 - 12 Exit 1", "access_rule": []}], "entity_load": [[59, 16], [13, 23], [28, 16]], "locations": ["Ripple Field 4 - Enemy 15 (Nidoo)"], "music": 15}, {"name": "Ripple Field 4 - 13", "level": 2, "stage": 4, "room": 13, "pointer": 2958478, "animal_pointers": [], "consumables": [{"idx": 54, "pointer": 264, "x": 216, "y": 136, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Dark)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 12, "unkn1": 4, "unkn2": 8, "x": 1192, "y": 120, "name": "Ripple Field 4 - 13 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [2, 22], [59, 16]], "locations": ["Ripple Field 4 - Maxim Tomato (Dark)"], "music": 15}, {"name": "Ripple Field 5 - 0", "level": 2, "stage": 5, "room": 0, "pointer": 3240369, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 9, "unkn2": 43, "x": 88, "y": 344, "name": "Ripple Field 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 1", "level": 2, "stage": 5, "room": 1, "pointer": 3547528, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 4, "x": 184, "y": 344, "name": "Ripple Field 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 2", "level": 2, "stage": 5, "room": 2, "pointer": 3611327, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Joe"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 21, "x": 56, "y": 184, "name": "Ripple Field 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 1 (Glunk)", "Ripple Field 5 - Enemy 2 (Joe)"], "music": 16}, {"name": "Ripple Field 5 - 3", "level": 2, "stage": 5, "room": 3, "pointer": 3926157, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 1258, "x": 1488, "y": 192, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Currents)"}, {"idx": 31, "pointer": 1290, "x": 1520, "y": 192, "etype": 22, "vtype": 0, "name": "Ripple Field 5 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Bobin", "Mony", "Squishy"], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 38, "x": 152, "y": 152, "name": "Ripple Field 5 - 3 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 95, "unkn2": 38, "x": 248, "y": 1064, "name": "Ripple Field 5 - 3 Exit 1", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [6, 22], [14, 23], [1, 16], [73, 16], [22, 16], [20, 16]], "locations": ["Ripple Field 5 - Enemy 3 (Bobin)", "Ripple Field 5 - Enemy 4 (Mony)", "Ripple Field 5 - Enemy 5 (Squishy)", "Ripple Field 5 - Maxim Tomato (Currents)", "Ripple Field 5 - 1-Up (Currents)"], "music": 16}, {"name": "Ripple Field 5 - 4", "level": 2, "stage": 5, "room": 4, "pointer": 3026639, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 4, "x": 232, "y": 152, "name": "Ripple Field 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 1"], "music": 40}, {"name": "Ripple Field 5 - 5", "level": 2, "stage": 5, "room": 5, "pointer": 3207333, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 56, "y": 72, "name": "Ripple Field 5 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 9, "x": 120, "y": 552, "name": "Ripple Field 5 - 5 Exit 1", "access_rule": ["Kine"]}], "entity_load": [[14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 6", "level": 2, "stage": 5, "room": 6, "pointer": 3485896, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 9, "unkn1": 121, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [22, 16], [14, 23], [13, 16], [11, 16], [32, 16]], "locations": ["Ripple Field 5 - Enemy 6 (Yaban)", "Ripple Field 5 - Enemy 7 (Broom Hatter)", "Ripple Field 5 - Enemy 8 (Bouncy)"], "music": 16}, {"name": "Ripple Field 5 - 7", "level": 2, "stage": 5, "room": 7, "pointer": 3752698, "animal_pointers": [], "consumables": [{"idx": 53, "pointer": 418, "x": 1512, "y": 608, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Exit)"}], "consumables_pointer": 352, "enemies": ["Sparky", "Rocky", "Babut"], "default_exits": [{"room": 10, "unkn1": 45, "unkn2": 31, "x": 152, "y": 152, "name": "Ripple Field 5 - 7 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 94, "unkn2": 40, "x": 88, "y": 200, "name": "Ripple Field 5 - 7 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [8, 16], [22, 16], [14, 23], [2, 22]], "locations": ["Ripple Field 5 - Enemy 9 (Sparky)", "Ripple Field 5 - Enemy 10 (Rocky)", "Ripple Field 5 - Enemy 11 (Babut)", "Ripple Field 5 - Maxim Tomato (Exit)"], "music": 16}, {"name": "Ripple Field 5 - 8", "level": 2, "stage": 5, "room": 8, "pointer": 3044682, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 8, "unkn2": 9, "x": 88, "y": 616, "name": "Ripple Field 5 - 8 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 2"], "music": 39}, {"name": "Ripple Field 5 - 9", "level": 2, "stage": 5, "room": 9, "pointer": 2963193, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[11, 19], [42, 19]], "locations": ["Ripple Field 5 - Mama Pitch"], "music": 8}, {"name": "Ripple Field 5 - 10", "level": 2, "stage": 5, "room": 10, "pointer": 3042934, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 8, "unkn2": 9, "x": 712, "y": 504, "name": "Ripple Field 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 12 (Galbo)"], "music": 16}, {"name": "Ripple Field 5 - 11", "level": 2, "stage": 5, "room": 11, "pointer": 2886256, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 5 - Complete"], "music": 5}, {"name": "Ripple Field 6 - 0", "level": 2, "stage": 6, "room": 0, "pointer": 2949576, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 1, "unkn1": 56, "unkn2": 7, "x": 40, "y": 152, "name": "Ripple Field 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[29, 16], [13, 23]], "locations": ["Ripple Field 6 - Enemy 1 (Kany)"], "music": 15}, {"name": "Ripple Field 6 - 1", "level": 2, "stage": 6, "room": 1, "pointer": 2971200, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 23, "unkn2": 9, "x": 56, "y": 264, "name": "Ripple Field 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 1", "Ripple Field 6 - Animal 2", "Ripple Field 6 - Animal 3"], "music": 38}, {"name": "Ripple Field 6 - 2", "level": 2, "stage": 6, "room": 2, "pointer": 3637749, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 95, "unkn2": 9, "x": 104, "y": 872, "name": "Ripple Field 6 - 2 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 50, "unkn2": 22, "x": 184, "y": 88, "name": "Ripple Field 6 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 45, "unkn2": 26, "x": 88, "y": 88, "name": "Ripple Field 6 - 2 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 55, "unkn2": 26, "x": 248, "y": 88, "name": "Ripple Field 6 - 2 Exit 3", "access_rule": []}], "entity_load": [[52, 16], [13, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 3", "level": 2, "stage": 6, "room": 3, "pointer": 3092564, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 5, "x": 744, "y": 424, "name": "Ripple Field 6 - 3 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 16, "unkn2": 5, "x": 872, "y": 424, "name": "Ripple Field 6 - 3 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 4", "level": 2, "stage": 6, "room": 4, "pointer": 3133247, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 5, "x": 824, "y": 360, "name": "Ripple Field 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[12, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 5", "level": 2, "stage": 6, "room": 5, "pointer": 3507762, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 76, "unkn2": 4, "x": 680, "y": 72, "name": "Ripple Field 6 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 6, "x": 440, "y": 104, "name": "Ripple Field 6 - 5 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 10, "x": 440, "y": 168, "name": "Ripple Field 6 - 5 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 88, "unkn2": 10, "x": 104, "y": 152, "name": "Ripple Field 6 - 5 Exit 3", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 12, "x": 200, "y": 200, "name": "Ripple Field 6 - 5 Exit 4", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 12, "x": 680, "y": 200, "name": "Ripple Field 6 - 5 Exit 5", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 16, "x": 680, "y": 264, "name": "Ripple Field 6 - 5 Exit 6", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 6", "level": 2, "stage": 6, "room": 6, "pointer": 3211264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 10, "x": 72, "y": 168, "name": "Ripple Field 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 7", "level": 2, "stage": 6, "room": 7, "pointer": 3586039, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Kapar", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 5, "unkn1": 134, "unkn2": 16, "x": 72, "y": 168, "name": "Ripple Field 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [3, 16], [67, 16], [51, 16], [7, 16]], "locations": ["Ripple Field 6 - Enemy 2 (KeKe)", "Ripple Field 6 - Enemy 3 (Kapar)", "Ripple Field 6 - Enemy 4 (Rocky)", "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 6 - 8", "level": 2, "stage": 6, "room": 8, "pointer": 3621483, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Coconut", "Sasuke", "Nruff"], "default_exits": [{"room": 10, "unkn1": 70, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 6 - 8 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 26, "unkn2": 54, "x": 72, "y": 152, "name": "Ripple Field 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[89, 16], [15, 16], [30, 16], [34, 16], [14, 23]], "locations": ["Ripple Field 6 - Enemy 6 (Propeller)", "Ripple Field 6 - Enemy 7 (Coconut)", "Ripple Field 6 - Enemy 8 (Sasuke)", "Ripple Field 6 - Enemy 9 (Nruff)"], "music": 15}, {"name": "Ripple Field 6 - 9", "level": 2, "stage": 6, "room": 9, "pointer": 2954523, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 3, "unkn2": 9, "x": 408, "y": 872, "name": "Ripple Field 6 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 4"], "music": 39}, {"name": "Ripple Field 6 - 10", "level": 2, "stage": 6, "room": 10, "pointer": 3069438, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[12, 19], [42, 19]], "locations": ["Ripple Field 6 - HB-002"], "music": 8}, {"name": "Ripple Field 6 - 11", "level": 2, "stage": 6, "room": 11, "pointer": 2886497, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 6 - Complete"], "music": 5}, {"name": "Ripple Field Boss - 0", "level": 2, "stage": 7, "room": 0, "pointer": 3157370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[7, 18]], "locations": ["Ripple Field - Boss (Acro) Purified", "Level 2 Boss"], "music": 2}, {"name": "Sand Canyon 1 - 0", "level": 3, "stage": 1, "room": 0, "pointer": 3524267, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo"], "default_exits": [{"room": 5, "unkn1": 196, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [1, 16], [26, 16], [2, 16]], "locations": ["Sand Canyon 1 - Enemy 1 (Bronto Burt)", "Sand Canyon 1 - Enemy 2 (Galbo)"], "music": 13}, {"name": "Sand Canyon 1 - 1", "level": 3, "stage": 1, "room": 1, "pointer": 3163860, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 34, "unkn2": 5, "x": 104, "y": 408, "name": "Sand Canyon 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 1 - Animal 1", "Sand Canyon 1 - Animal 2"], "music": 38}, {"name": "Sand Canyon 1 - 2", "level": 3, "stage": 1, "room": 2, "pointer": 3512532, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro"], "default_exits": [{"room": 3, "unkn1": 73, "unkn2": 6, "x": 56, "y": 120, "name": "Sand Canyon 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [26, 16], [25, 16], [4, 22], [14, 23], [1, 23], [0, 23], [4, 23]], "locations": ["Sand Canyon 1 - Enemy 3 (Oro)"], "music": 13}, {"name": "Sand Canyon 1 - 3", "level": 3, "stage": 1, "room": 3, "pointer": 3719146, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Propeller", "Gansan", "Babut"], "default_exits": [{"room": 4, "unkn1": 25, "unkn2": 73, "x": 72, "y": 280, "name": "Sand Canyon 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [75, 16], [43, 16], [8, 16]], "locations": ["Sand Canyon 1 - Enemy 4 (Sparky)", "Sand Canyon 1 - Enemy 5 (Propeller)", "Sand Canyon 1 - Enemy 6 (Gansan)", "Sand Canyon 1 - Enemy 7 (Babut)"], "music": 13}, {"name": "Sand Canyon 1 - 4", "level": 3, "stage": 1, "room": 4, "pointer": 3421212, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Dogon", "Bouncy", "Pteran"], "default_exits": [{"room": 7, "unkn1": 196, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[90, 16], [13, 16], [40, 16], [14, 23], [39, 16]], "locations": ["Sand Canyon 1 - Enemy 8 (Loud)", "Sand Canyon 1 - Enemy 9 (Dogon)", "Sand Canyon 1 - Enemy 10 (Bouncy)", "Sand Canyon 1 - Enemy 11 (Pteran)"], "music": 13}, {"name": "Sand Canyon 1 - 5", "level": 3, "stage": 1, "room": 5, "pointer": 3203325, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Polof"], "default_exits": [{"room": 6, "unkn1": 32, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 1 - 5 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 46, "unkn2": 9, "x": 56, "y": 344, "name": "Sand Canyon 1 - 5 Exit 1", "access_rule": []}], "entity_load": [[9, 16]], "locations": ["Sand Canyon 1 - Enemy 12 (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 6", "level": 3, "stage": 1, "room": 6, "pointer": 3138524, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 248, "x": 168, "y": 104, "etype": 22, "vtype": 0, "name": "Sand Canyon 1 - 1-Up (Polof)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 5, "unkn1": 5, "unkn2": 9, "x": 536, "y": 152, "name": "Sand Canyon 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [0, 22]], "locations": ["Sand Canyon 1 - 1-Up (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 7", "level": 3, "stage": 1, "room": 7, "pointer": 2988822, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [42, 19]], "locations": ["Sand Canyon 1 - Geromuzudake"], "music": 8}, {"name": "Sand Canyon 1 - 8", "level": 3, "stage": 1, "room": 8, "pointer": 2885292, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 1 - Complete"], "music": 5}, {"name": "Sand Canyon 2 - 0", "level": 3, "stage": 2, "room": 0, "pointer": 3668370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Doka", "Boten"], "default_exits": [{"room": 1, "unkn1": 178, "unkn2": 8, "x": 184, "y": 104, "name": "Sand Canyon 2 - 0 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 244, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 2 - 0 Exit 1", "access_rule": []}], "entity_load": [[35, 16], [33, 16], [14, 23], [51, 16], [47, 16], [46, 16]], "locations": ["Sand Canyon 2 - Enemy 1 (KeKe)", "Sand Canyon 2 - Enemy 2 (Doka)", "Sand Canyon 2 - Enemy 3 (Boten)"], "music": 21}, {"name": "Sand Canyon 2 - 1", "level": 3, "stage": 2, "room": 1, "pointer": 2952738, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 10, "unkn2": 6, "x": 2872, "y": 136, "name": "Sand Canyon 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 2 - Animal 1", "Sand Canyon 2 - Animal 2"], "music": 40}, {"name": "Sand Canyon 2 - 2", "level": 3, "stage": 2, "room": 2, "pointer": 3531156, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 9, "unkn1": 45, "unkn2": 60, "x": 88, "y": 184, "name": "Sand Canyon 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[6, 23], [89, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 4 (Propeller)"], "music": 21}, {"name": "Sand Canyon 2 - 3", "level": 3, "stage": 2, "room": 3, "pointer": 3263731, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Sasuke", "Como"], "default_exits": [{"room": 4, "unkn1": 63, "unkn2": 5, "x": 88, "y": 184, "name": "Sand Canyon 2 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 68, "unkn2": 5, "x": 184, "y": 184, "name": "Sand Canyon 2 - 3 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 73, "unkn2": 5, "x": 248, "y": 184, "name": "Sand Canyon 2 - 3 Exit 2", "access_rule": []}, {"room": 5, "unkn1": 130, "unkn2": 9, "x": 72, "y": 312, "name": "Sand Canyon 2 - 3 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [8, 16], [30, 16], [0, 16]], "locations": ["Sand Canyon 2 - Enemy 5 (Waddle Dee)", "Sand Canyon 2 - Enemy 6 (Sparky)", "Sand Canyon 2 - Enemy 7 (Sasuke)", "Sand Canyon 2 - Enemy 8 (Como)"], "music": 21}, {"name": "Sand Canyon 2 - 4", "level": 3, "stage": 2, "room": 4, "pointer": 3076300, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 228, "x": 168, "y": 72, "etype": 22, "vtype": 0, "name": "Sand Canyon 2 - 1-Up (Enclave)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 5, "unkn2": 11, "x": 1016, "y": 88, "name": "Sand Canyon 2 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 10, "unkn2": 11, "x": 1112, "y": 88, "name": "Sand Canyon 2 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 11, "x": 1176, "y": 88, "name": "Sand Canyon 2 - 4 Exit 2", "access_rule": []}], "entity_load": [[14, 23], [0, 22], [4, 22]], "locations": ["Sand Canyon 2 - 1-Up (Enclave)"], "music": 21}, {"name": "Sand Canyon 2 - 5", "level": 3, "stage": 2, "room": 5, "pointer": 3302133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 6, "unkn1": 63, "unkn2": 15, "x": 120, "y": 216, "name": "Sand Canyon 2 - 5 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 71, "unkn2": 18, "x": 152, "y": 136, "name": "Sand Canyon 2 - 5 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 130, "unkn2": 19, "x": 72, "y": 952, "name": "Sand Canyon 2 - 5 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 56, "unkn2": 23, "x": 88, "y": 216, "name": "Sand Canyon 2 - 5 Exit 3", "access_rule": []}], "entity_load": [[80, 16], [78, 16], [81, 16], [83, 16], [79, 16], [82, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))"], "music": 21}, {"name": "Sand Canyon 2 - 6", "level": 3, "stage": 2, "room": 6, "pointer": 3800612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 5, "unkn1": 17, "unkn2": 13, "x": 1144, "y": 248, "name": "Sand Canyon 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 15 (Nidoo)"], "music": 21}, {"name": "Sand Canyon 2 - 7", "level": 3, "stage": 2, "room": 7, "pointer": 3073888, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 15, "unkn2": 8, "x": 1016, "y": 296, "name": "Sand Canyon 2 - 7 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 5, "unkn2": 13, "x": 904, "y": 376, "name": "Sand Canyon 2 - 7 Exit 1", "access_rule": []}], "entity_load": [[15, 19]], "locations": [], "music": 21}, {"name": "Sand Canyon 2 - 8", "level": 3, "stage": 2, "room": 8, "pointer": 3061270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 5, "unkn1": 19, "unkn2": 13, "x": 1256, "y": 376, "name": "Sand Canyon 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 16 (Mariel)"], "music": 21}, {"name": "Sand Canyon 2 - 9", "level": 3, "stage": 2, "room": 9, "pointer": 3453286, "animal_pointers": [], "consumables": [{"idx": 51, "pointer": 240, "x": 1408, "y": 216, "etype": 22, "vtype": 2, "name": "Sand Canyon 2 - Maxim Tomato (Underwater)"}], "consumables_pointer": 128, "enemies": ["Yaban", "Wapod", "Squishy", "Pteran"], "default_exits": [{"room": 10, "unkn1": 246, "unkn2": 10, "x": 56, "y": 152, "name": "Sand Canyon 2 - 9 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [22, 16], [2, 22], [39, 16], [88, 16], [32, 16]], "locations": ["Sand Canyon 2 - Enemy 17 (Yaban)", "Sand Canyon 2 - Enemy 18 (Wapod)", "Sand Canyon 2 - Enemy 19 (Squishy)", "Sand Canyon 2 - Enemy 20 (Pteran)", "Sand Canyon 2 - Maxim Tomato (Underwater)"], "music": 21}, {"name": "Sand Canyon 2 - 10", "level": 3, "stage": 2, "room": 10, "pointer": 2994821, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 2 - 10 Exit 0", "access_rule": []}], "entity_load": [[15, 19], [42, 19]], "locations": ["Sand Canyon 2 - Auntie"], "music": 8}, {"name": "Sand Canyon 2 - 11", "level": 3, "stage": 2, "room": 11, "pointer": 2891799, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 2 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 0", "level": 3, "stage": 3, "room": 0, "pointer": 3544676, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Broom Hatter", "Rocky", "Gabon"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 57, "x": 104, "y": 152, "name": "Sand Canyon 3 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 11, "unkn2": 57, "x": 200, "y": 152, "name": "Sand Canyon 3 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 16, "unkn2": 57, "x": 296, "y": 152, "name": "Sand Canyon 3 - 0 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 23, "unkn2": 109, "x": 104, "y": 72, "name": "Sand Canyon 3 - 0 Exit 3", "access_rule": []}], "entity_load": [[24, 16], [3, 16], [11, 16], [27, 16]], "locations": ["Sand Canyon 3 - Enemy 1 (Sir Kibble)", "Sand Canyon 3 - Enemy 2 (Broom Hatter)", "Sand Canyon 3 - Enemy 3 (Rocky)", "Sand Canyon 3 - Enemy 4 (Gabon)"], "music": 16}, {"name": "Sand Canyon 3 - 1", "level": 3, "stage": 3, "room": 1, "pointer": 2965655, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 88, "y": 920, "name": "Sand Canyon 3 - 1 Exit 0", "access_rule": []}, {"room": 0, "unkn1": 11, "unkn2": 9, "x": 168, "y": 920, "name": "Sand Canyon 3 - 1 Exit 1", "access_rule": []}, {"room": 0, "unkn1": 17, "unkn2": 9, "x": 248, "y": 920, "name": "Sand Canyon 3 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 3 - Animal 1", "Sand Canyon 3 - Animal 2", "Sand Canyon 3 - Animal 3"], "music": 39}, {"name": "Sand Canyon 3 - 2", "level": 3, "stage": 3, "room": 2, "pointer": 3726270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 3, "unkn1": 184, "unkn2": 20, "x": 104, "y": 232, "name": "Sand Canyon 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[63, 16], [55, 16], [14, 23], [4, 23], [29, 16]], "locations": ["Sand Canyon 3 - Enemy 5 (Kany)"], "music": 16}, {"name": "Sand Canyon 3 - 3", "level": 3, "stage": 3, "room": 3, "pointer": 3416806, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 8, "unkn1": 130, "unkn2": 14, "x": 40, "y": 152, "name": "Sand Canyon 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [6, 23], [5, 23]], "locations": ["Sand Canyon 3 - Enemy 6 (Galbo)"], "music": 16}, {"name": "Sand Canyon 3 - 4", "level": 3, "stage": 3, "room": 4, "pointer": 3564419, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Sasuke"], "default_exits": [{"room": 5, "unkn1": 135, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[68, 16], [30, 16], [14, 23], [89, 16], [24, 16]], "locations": ["Sand Canyon 3 - Enemy 7 (Propeller)", "Sand Canyon 3 - Enemy 8 (Sasuke)"], "music": 16}, {"name": "Sand Canyon 3 - 5", "level": 3, "stage": 3, "room": 5, "pointer": 2973891, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": ["Sand Canyon 3 - Caramello"], "music": 8}, {"name": "Sand Canyon 3 - 6", "level": 3, "stage": 3, "room": 6, "pointer": 3247969, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod", "Bobo", "Babut", "Magoo"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 8, "x": 88, "y": 424, "name": "Sand Canyon 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[53, 16], [88, 16], [46, 16], [47, 16], [5, 16], [43, 16]], "locations": ["Sand Canyon 3 - Enemy 9 (Wapod)", "Sand Canyon 3 - Enemy 10 (Bobo)", "Sand Canyon 3 - Enemy 11 (Babut)", "Sand Canyon 3 - Enemy 12 (Magoo)"], "music": 16}, {"name": "Sand Canyon 3 - 7", "level": 3, "stage": 3, "room": 7, "pointer": 2887702, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 3 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 8", "level": 3, "stage": 3, "room": 8, "pointer": 2968057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 104, "y": 120, "name": "Sand Canyon 3 - 8 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": [], "music": 31}, {"name": "Sand Canyon 4 - 0", "level": 3, "stage": 4, "room": 0, "pointer": 3521954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Popon Ball", "Mariel", "Chilly"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 8, "x": 216, "y": 88, "name": "Sand Canyon 4 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 199, "unkn2": 15, "x": 104, "y": 88, "name": "Sand Canyon 4 - 0 Exit 1", "access_rule": []}], "entity_load": [[6, 16], [45, 16], [6, 23], [50, 16], [14, 23]], "locations": ["Sand Canyon 4 - Enemy 1 (Popon Ball)", "Sand Canyon 4 - Enemy 2 (Mariel)", "Sand Canyon 4 - Enemy 3 (Chilly)"], "music": 18}, {"name": "Sand Canyon 4 - 1", "level": 3, "stage": 4, "room": 1, "pointer": 2956289, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 5, "x": 1544, "y": 136, "name": "Sand Canyon 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 4 - Animal 1", "Sand Canyon 4 - Animal 2", "Sand Canyon 4 - Animal 3"], "music": 39}, {"name": "Sand Canyon 4 - 2", "level": 3, "stage": 4, "room": 2, "pointer": 3505360, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 328, "x": 2024, "y": 72, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Pacto)"}], "consumables_pointer": 160, "enemies": ["Tick", "Bronto Burt", "Babut"], "default_exits": [{"room": 3, "unkn1": 149, "unkn2": 14, "x": 88, "y": 216, "name": "Sand Canyon 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [2, 22], [43, 16], [2, 16], [48, 16]], "locations": ["Sand Canyon 4 - Enemy 4 (Tick)", "Sand Canyon 4 - Enemy 5 (Bronto Burt)", "Sand Canyon 4 - Enemy 6 (Babut)", "Sand Canyon 4 - Maxim Tomato (Pacto)"], "music": 18}, {"name": "Sand Canyon 4 - 3", "level": 3, "stage": 4, "room": 3, "pointer": 3412361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Joe", "Mony", "Blipper"], "default_exits": [{"room": 4, "unkn1": 115, "unkn2": 6, "x": 776, "y": 120, "name": "Sand Canyon 4 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 29, "unkn2": 8, "x": 72, "y": 88, "name": "Sand Canyon 4 - 3 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 105, "unkn2": 14, "x": 104, "y": 216, "name": "Sand Canyon 4 - 3 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 115, "unkn2": 20, "x": 776, "y": 248, "name": "Sand Canyon 4 - 3 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 64, "unkn2": 21, "x": 408, "y": 232, "name": "Sand Canyon 4 - 3 Exit 4", "access_rule": []}], "entity_load": [[73, 16], [20, 16], [91, 16], [14, 23], [21, 16]], "locations": ["Sand Canyon 4 - Enemy 7 (Bobin)", "Sand Canyon 4 - Enemy 8 (Joe)", "Sand Canyon 4 - Enemy 9 (Mony)", "Sand Canyon 4 - Enemy 10 (Blipper)"], "music": 18}, {"name": "Sand Canyon 4 - 4", "level": 3, "stage": 4, "room": 4, "pointer": 3307804, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 60, "unkn2": 6, "x": 88, "y": 104, "name": "Sand Canyon 4 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 60, "unkn2": 16, "x": 88, "y": 360, "name": "Sand Canyon 4 - 4 Exit 1", "access_rule": []}], "entity_load": [[21, 16], [20, 16], [91, 16], [73, 16]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 5", "level": 3, "stage": 4, "room": 5, "pointer": 2955407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 16, "unkn2": 13, "x": 88, "y": 232, "name": "Sand Canyon 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Sand Canyon 4 - Miniboss 1 (Haboki)"], "music": 4}, {"name": "Sand Canyon 4 - 6", "level": 3, "stage": 4, "room": 6, "pointer": 3094851, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 6, "x": 56, "y": 56, "name": "Sand Canyon 4 - 6 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 14, "x": 56, "y": 104, "name": "Sand Canyon 4 - 6 Exit 1", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 22, "x": 56, "y": 152, "name": "Sand Canyon 4 - 6 Exit 2", "access_rule": []}], "entity_load": [[17, 19], [4, 23], [5, 23]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 7", "level": 3, "stage": 4, "room": 7, "pointer": 3483428, "animal_pointers": [], "consumables": [{"idx": 25, "pointer": 200, "x": 344, "y": 144, "etype": 22, "vtype": 0, "name": "Sand Canyon 4 - 1-Up (Clean)"}, {"idx": 26, "pointer": 336, "x": 1656, "y": 144, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Needle)"}], "consumables_pointer": 128, "enemies": ["Togezo", "Rocky", "Bobo"], "default_exits": [{"room": 8, "unkn1": 266, "unkn2": 9, "x": 56, "y": 152, "name": "Sand Canyon 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [3, 16], [14, 23], [5, 16], [2, 16], [18, 16], [0, 22], [2, 22]], "locations": ["Sand Canyon 4 - Enemy 11 (Togezo)", "Sand Canyon 4 - Enemy 12 (Rocky)", "Sand Canyon 4 - Enemy 13 (Bobo)", "Sand Canyon 4 - 1-Up (Clean)", "Sand Canyon 4 - Maxim Tomato (Needle)"], "music": 18}, {"name": "Sand Canyon 4 - 8", "level": 3, "stage": 4, "room": 8, "pointer": 3002086, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[17, 19], [42, 19]], "locations": ["Sand Canyon 4 - Donbe & Hikari"], "music": 8}, {"name": "Sand Canyon 4 - 9", "level": 3, "stage": 4, "room": 9, "pointer": 2885774, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 4 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 0", "level": 3, "stage": 5, "room": 0, "pointer": 3662486, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 450, "x": 2256, "y": 232, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Falling Block)"}], "consumables_pointer": 208, "enemies": ["Wapod", "Dogon", "Tick"], "default_exits": [{"room": 3, "unkn1": 151, "unkn2": 15, "x": 184, "y": 56, "name": "Sand Canyon 5 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 83, "unkn2": 16, "x": 72, "y": 120, "name": "Sand Canyon 5 - 0 Exit 1", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [0, 22], [14, 23], [90, 16], [88, 16]], "locations": ["Sand Canyon 5 - Enemy 1 (Wapod)", "Sand Canyon 5 - Enemy 2 (Dogon)", "Sand Canyon 5 - Enemy 3 (Tick)", "Sand Canyon 5 - 1-Up (Falling Block)"], "music": 13}, {"name": "Sand Canyon 5 - 1", "level": 3, "stage": 5, "room": 1, "pointer": 3052622, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "Bobo", "Chilly", "Sparky", "Togezo"], "default_exits": [{"room": 9, "unkn1": 6, "unkn2": 9, "x": 216, "y": 1128, "name": "Sand Canyon 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [6, 16], [3, 16], [8, 16], [18, 16]], "locations": ["Sand Canyon 5 - Enemy 4 (Rocky)", "Sand Canyon 5 - Enemy 5 (Bobo)", "Sand Canyon 5 - Enemy 6 (Chilly)", "Sand Canyon 5 - Enemy 7 (Sparky)", "Sand Canyon 5 - Enemy 8 (Togezo)"], "music": 13}, {"name": "Sand Canyon 5 - 2", "level": 3, "stage": 5, "room": 2, "pointer": 3057544, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 3, "unkn2": 7, "x": 1320, "y": 264, "name": "Sand Canyon 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 1"], "music": 40}, {"name": "Sand Canyon 5 - 3", "level": 3, "stage": 5, "room": 3, "pointer": 3419011, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 192, "x": 56, "y": 648, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 2)"}, {"idx": 14, "pointer": 200, "x": 56, "y": 664, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 3)"}, {"idx": 15, "pointer": 208, "x": 56, "y": 632, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 1)"}, {"idx": 12, "pointer": 368, "x": 320, "y": 264, "etype": 22, "vtype": 2, "name": "Sand Canyon 5 - Maxim Tomato (Pit)"}], "consumables_pointer": 304, "enemies": ["Bronto Burt", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 66, "x": 88, "y": 88, "name": "Sand Canyon 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [30, 16], [2, 16], [0, 22], [2, 22], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 9 (Bronto Burt)", "Sand Canyon 5 - Enemy 10 (Sasuke)", "Sand Canyon 5 - 1-Up (Ice 2)", "Sand Canyon 5 - 1-Up (Ice 3)", "Sand Canyon 5 - 1-Up (Ice 1)", "Sand Canyon 5 - Maxim Tomato (Pit)"], "music": 13}, {"name": "Sand Canyon 5 - 4", "level": 3, "stage": 5, "room": 4, "pointer": 3644149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro", "Galbo", "Nidoo"], "default_exits": [{"room": 5, "unkn1": 76, "unkn2": 9, "x": 88, "y": 120, "name": "Sand Canyon 5 - 4 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 116, "unkn2": 14, "x": 200, "y": 1256, "name": "Sand Canyon 5 - 4 Exit 1", "access_rule": []}], "entity_load": [[54, 16], [26, 16], [28, 16], [25, 16], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 11 (Oro)", "Sand Canyon 5 - Enemy 12 (Galbo)", "Sand Canyon 5 - Enemy 13 (Nidoo)"], "music": 13}, {"name": "Sand Canyon 5 - 5", "level": 3, "stage": 5, "room": 5, "pointer": 3044100, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 7, "x": 1240, "y": 152, "name": "Sand Canyon 5 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 2"], "music": 39}, {"name": "Sand Canyon 5 - 6", "level": 3, "stage": 5, "room": 6, "pointer": 3373481, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 25, "unkn2": 5, "x": 56, "y": 152, "name": "Sand Canyon 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [31, 16], [89, 16], [6, 16]], "locations": ["Sand Canyon 5 - Enemy 14 (Propeller)"], "music": 13}, {"name": "Sand Canyon 5 - 7", "level": 3, "stage": 5, "room": 7, "pointer": 2964028, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[18, 19], [42, 19]], "locations": ["Sand Canyon 5 - Nyupun"], "music": 8}, {"name": "Sand Canyon 5 - 8", "level": 3, "stage": 5, "room": 8, "pointer": 2890112, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 5 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 9", "level": 3, "stage": 5, "room": 9, "pointer": 3647264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "KeKe", "Kabu"], "default_exits": [{"room": 6, "unkn1": 12, "unkn2": 6, "x": 72, "y": 760, "name": "Sand Canyon 5 - 9 Exit 0", "access_rule": ["Cutter"]}, {"room": 1, "unkn1": 12, "unkn2": 70, "x": 120, "y": 152, "name": "Sand Canyon 5 - 9 Exit 1", "access_rule": []}], "entity_load": [[27, 16], [61, 16], [4, 22], [14, 23], [51, 16], [19, 16]], "locations": ["Sand Canyon 5 - Enemy 15 (Sir Kibble)", "Sand Canyon 5 - Enemy 16 (KeKe)", "Sand Canyon 5 - Enemy 17 (Kabu)"], "music": 13}, {"name": "Sand Canyon 6 - 0", "level": 3, "stage": 6, "room": 0, "pointer": 3314761, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Doka", "Cappy", "Pteran"], "default_exits": [{"room": 2, "unkn1": 132, "unkn2": 16, "x": 56, "y": 136, "name": "Sand Canyon 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [35, 16], [39, 16], [12, 16]], "locations": ["Sand Canyon 6 - Enemy 1 (Sparky)", "Sand Canyon 6 - Enemy 2 (Doka)", "Sand Canyon 6 - Enemy 3 (Cappy)", "Sand Canyon 6 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Sand Canyon 6 - 1", "level": 3, "stage": 6, "room": 1, "pointer": 2976913, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 24, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 1", "Sand Canyon 6 - Animal 2", "Sand Canyon 6 - Animal 3"], "music": 39}, {"name": "Sand Canyon 6 - 2", "level": 3, "stage": 6, "room": 2, "pointer": 2978757, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 55, "unkn2": 6, "x": 104, "y": 104, "name": "Sand Canyon 6 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 3", "level": 3, "stage": 6, "room": 3, "pointer": 3178082, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 3 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 3 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 3 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 3 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 3 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 3 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 4", "level": 3, "stage": 6, "room": 4, "pointer": 3181563, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 4 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 4 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 4 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 4 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 4 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 4 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 5", "level": 3, "stage": 6, "room": 5, "pointer": 3177209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 5 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 5 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 5 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 5 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 5 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 5 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 6", "level": 3, "stage": 6, "room": 6, "pointer": 3183291, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 6 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 6 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 6 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 6 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 6 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 6 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 7", "level": 3, "stage": 6, "room": 7, "pointer": 3175453, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 7 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 7 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 7 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 7 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 7 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 7 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 8", "level": 3, "stage": 6, "room": 8, "pointer": 3179826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 8 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 8 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 8 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 8 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 8 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 8 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 9", "level": 3, "stage": 6, "room": 9, "pointer": 3176334, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 9 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 9 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 9 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 9 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 9 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 9 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 10", "level": 3, "stage": 6, "room": 10, "pointer": 3178954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 10 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 10 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 10 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 10 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 10 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 10 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 11", "level": 3, "stage": 6, "room": 11, "pointer": 2989149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 37, "unkn2": 6, "x": 88, "y": 264, "name": "Sand Canyon 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[59, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 12", "level": 3, "stage": 6, "room": 12, "pointer": 3015947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 8, "x": 440, "y": 264, "name": "Sand Canyon 6 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 86, "unkn2": 8, "x": 72, "y": 104, "name": "Sand Canyon 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[64, 16], [59, 16], [55, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 13", "level": 3, "stage": 6, "room": 13, "pointer": 2976539, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 55, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 6 - 13 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 14", "level": 3, "stage": 6, "room": 14, "pointer": 3030336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 5, "unkn2": 9, "x": 200, "y": 152, "name": "Sand Canyon 6 - 14 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 35, "unkn2": 9, "x": 152, "y": 392, "name": "Sand Canyon 6 - 14 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 15", "level": 3, "stage": 6, "room": 15, "pointer": 2972361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 13, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 16", "level": 3, "stage": 6, "room": 16, "pointer": 2953186, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 16 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 16 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 17", "level": 3, "stage": 6, "room": 17, "pointer": 2953633, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 17 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 17 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 18", "level": 3, "stage": 6, "room": 18, "pointer": 2991707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 14, "unkn2": 9, "x": 184, "y": 312, "name": "Sand Canyon 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 19", "level": 3, "stage": 6, "room": 19, "pointer": 2974651, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 5, "unkn2": 9, "x": 376, "y": 392, "name": "Sand Canyon 6 - 19 Exit 0", "access_rule": []}, {"room": 20, "unkn1": 35, "unkn2": 9, "x": 88, "y": 152, "name": "Sand Canyon 6 - 19 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 20", "level": 3, "stage": 6, "room": 20, "pointer": 2969638, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 4, "unkn2": 9, "x": 552, "y": 152, "name": "Sand Canyon 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 21", "level": 3, "stage": 6, "room": 21, "pointer": 2976163, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 9, "unkn2": 13, "x": 296, "y": 216, "name": "Sand Canyon 6 - 21 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 4", "Sand Canyon 6 - Animal 5", "Sand Canyon 6 - Animal 6"], "music": 40}, {"name": "Sand Canyon 6 - 22", "level": 3, "stage": 6, "room": 22, "pointer": 2950938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 38, "unkn1": 14, "unkn2": 8, "x": 168, "y": 376, "name": "Sand Canyon 6 - 22 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 9, "unkn2": 13, "x": 376, "y": 216, "name": "Sand Canyon 6 - 22 Exit 1", "access_rule": []}, {"room": 21, "unkn1": 19, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 22 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 23", "level": 3, "stage": 6, "room": 23, "pointer": 3311993, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 43, "unkn1": 145, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 24", "level": 3, "stage": 6, "room": 24, "pointer": 3079078, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 39, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 24 Exit 0", "access_rule": []}, {"room": 25, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 24 Exit 1", "access_rule": []}, {"room": 39, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 24 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 25", "level": 3, "stage": 6, "room": 25, "pointer": 3065898, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 25 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 25 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 25 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 26", "level": 3, "stage": 6, "room": 26, "pointer": 3063347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 26 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 26 Exit 1", "access_rule": []}, {"room": 27, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 26 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 27", "level": 3, "stage": 6, "room": 27, "pointer": 3066916, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 28, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 27 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 27 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 27 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 28", "level": 3, "stage": 6, "room": 28, "pointer": 3067425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 28 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 11, "unkn2": 8, "x": 184, "y": 344, "name": "Sand Canyon 6 - 28 Exit 1", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 28 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 29", "level": 3, "stage": 6, "room": 29, "pointer": 2950032, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 30, "unkn1": 11, "unkn2": 8, "x": 168, "y": 136, "name": "Sand Canyon 6 - 29 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 30", "level": 3, "stage": 6, "room": 30, "pointer": 2986500, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 10, "unkn2": 44, "x": 136, "y": 152, "name": "Sand Canyon 6 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 31", "level": 3, "stage": 6, "room": 31, "pointer": 3070930, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 31 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 648, "name": "Sand Canyon 6 - 31 Exit 1", "access_rule": []}, {"room": 32, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 31 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 32", "level": 3, "stage": 6, "room": 32, "pointer": 3054817, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Parasol)", "Bukiset (Cutter)"], "default_exits": [{"room": 33, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 32 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 536, "name": "Sand Canyon 6 - 32 Exit 1", "access_rule": []}, {"room": 33, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 32 Exit 2", "access_rule": []}], "entity_load": [[81, 16], [83, 16]], "locations": ["Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))"], "music": 14}, {"name": "Sand Canyon 6 - 33", "level": 3, "stage": 6, "room": 33, "pointer": 3053173, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Clean)", "Bukiset (Spark)"], "default_exits": [{"room": 34, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 33 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 440, "name": "Sand Canyon 6 - 33 Exit 1", "access_rule": []}, {"room": 34, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 33 Exit 2", "access_rule": []}], "entity_load": [[80, 16], [82, 16]], "locations": ["Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))"], "music": 14}, {"name": "Sand Canyon 6 - 34", "level": 3, "stage": 6, "room": 34, "pointer": 3053721, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)"], "default_exits": [{"room": 35, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 34 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 344, "name": "Sand Canyon 6 - 34 Exit 1", "access_rule": []}, {"room": 35, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 34 Exit 2", "access_rule": []}], "entity_load": [[79, 16], [78, 16]], "locations": ["Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))"], "music": 14}, {"name": "Sand Canyon 6 - 35", "level": 3, "stage": 6, "room": 35, "pointer": 3054269, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)"], "default_exits": [{"room": 37, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 35 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 248, "name": "Sand Canyon 6 - 35 Exit 1", "access_rule": []}, {"room": 37, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 35 Exit 2", "access_rule": []}], "entity_load": [[77, 16], [76, 16]], "locations": ["Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))"], "music": 14}, {"name": "Sand Canyon 6 - 36", "level": 3, "stage": 6, "room": 36, "pointer": 2986164, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 10, "unkn2": 44, "x": 392, "y": 152, "name": "Sand Canyon 6 - 36 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 37", "level": 3, "stage": 6, "room": 37, "pointer": 3074377, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 152, "name": "Sand Canyon 6 - 37 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 38", "level": 3, "stage": 6, "room": 38, "pointer": 2971589, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 10, "unkn2": 5, "x": 264, "y": 440, "name": "Sand Canyon 6 - 38 Exit 0", "access_rule": []}, {"room": 22, "unkn1": 10, "unkn2": 23, "x": 248, "y": 136, "name": "Sand Canyon 6 - 38 Exit 1", "access_rule": []}], "entity_load": [[76, 16], [77, 16], [78, 16], [79, 16], [80, 16], [81, 16], [82, 16], [83, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 39", "level": 3, "stage": 6, "room": 39, "pointer": 3063858, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 40, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 39 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 39 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 39 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 40", "level": 3, "stage": 6, "room": 40, "pointer": 3064368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 40 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 40 Exit 1", "access_rule": []}, {"room": 41, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 40 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 41", "level": 3, "stage": 6, "room": 41, "pointer": 3064878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 42, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 41 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 41 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 41 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 42", "level": 3, "stage": 6, "room": 42, "pointer": 3068939, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 42 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 42 Exit 1", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Sand Canyon 6 - Enemy 13 (Nidoo)"], "music": 14}, {"name": "Sand Canyon 6 - 43", "level": 3, "stage": 6, "room": 43, "pointer": 2988495, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 44, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 6 - 43 Exit 0", "access_rule": []}], "entity_load": [[19, 19], [42, 19]], "locations": ["Sand Canyon 6 - Professor Hector & R.O.B"], "music": 8}, {"name": "Sand Canyon 6 - 44", "level": 3, "stage": 6, "room": 44, "pointer": 2886979, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 6 - Complete"], "music": 5}, {"name": "Sand Canyon Boss - 0", "level": 3, "stage": 7, "room": 0, "pointer": 2991389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[6, 18]], "locations": ["Sand Canyon - Boss (Pon & Con) Purified", "Level 3 Boss"], "music": 2}, {"name": "Cloudy Park 1 - 0", "level": 4, "stage": 1, "room": 0, "pointer": 3172795, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "KeKe", "Cappy"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 5, "x": 56, "y": 152, "name": "Cloudy Park 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [12, 16], [51, 16], [1, 23], [0, 23]], "locations": ["Cloudy Park 1 - Enemy 1 (Waddle Dee)", "Cloudy Park 1 - Enemy 2 (KeKe)", "Cloudy Park 1 - Enemy 3 (Cappy)"], "music": 17}, {"name": "Cloudy Park 1 - 1", "level": 4, "stage": 1, "room": 1, "pointer": 3078163, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 88, "y": 424, "name": "Cloudy Park 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 1"], "music": 39}, {"name": "Cloudy Park 1 - 2", "level": 4, "stage": 1, "room": 2, "pointer": 3285882, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Togezo"], "default_exits": [{"room": 3, "unkn1": 95, "unkn2": 8, "x": 40, "y": 104, "name": "Cloudy Park 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [4, 16], [18, 16], [6, 23]], "locations": ["Cloudy Park 1 - Enemy 4 (Yaban)", "Cloudy Park 1 - Enemy 5 (Togezo)"], "music": 17}, {"name": "Cloudy Park 1 - 3", "level": 4, "stage": 1, "room": 3, "pointer": 3062831, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 15, "unkn2": 6, "x": 56, "y": 264, "name": "Cloudy Park 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 2"], "music": 39}, {"name": "Cloudy Park 1 - 4", "level": 4, "stage": 1, "room": 4, "pointer": 3396729, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 92, "unkn2": 16, "x": 56, "y": 152, "name": "Cloudy Park 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [0, 16], [14, 23], [68, 16], [26, 16], [4, 22]], "locations": ["Cloudy Park 1 - Enemy 6 (Galbo)"], "music": 17}, {"name": "Cloudy Park 1 - 5", "level": 4, "stage": 1, "room": 5, "pointer": 3038805, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 6, "unkn2": 5, "x": 2344, "y": 232, "name": "Cloudy Park 1 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 3", "Cloudy Park 1 - Animal 4"], "music": 39}, {"name": "Cloudy Park 1 - 6", "level": 4, "stage": 1, "room": 6, "pointer": 3535736, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Como"], "default_exits": [{"room": 8, "unkn1": 5, "unkn2": 8, "x": 72, "y": 104, "name": "Cloudy Park 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [14, 23], [0, 16], [41, 16], [8, 16]], "locations": ["Cloudy Park 1 - Enemy 7 (Sparky)", "Cloudy Park 1 - Enemy 8 (Como)"], "music": 17}, {"name": "Cloudy Park 1 - 7", "level": 4, "stage": 1, "room": 7, "pointer": 2954080, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 6, "x": 88, "y": 104, "name": "Cloudy Park 1 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 5"], "music": 39}, {"name": "Cloudy Park 1 - 8", "level": 4, "stage": 1, "room": 8, "pointer": 3465407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt"], "default_exits": [{"room": 12, "unkn1": 181, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 1 - 8 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [2, 16], [51, 16], [1, 23], [14, 23]], "locations": ["Cloudy Park 1 - Enemy 9 (Bronto Burt)"], "music": 17}, {"name": "Cloudy Park 1 - 9", "level": 4, "stage": 1, "room": 9, "pointer": 3078621, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 56, "y": 264, "name": "Cloudy Park 1 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 6"], "music": 39}, {"name": "Cloudy Park 1 - 10", "level": 4, "stage": 1, "room": 10, "pointer": 3281366, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Sir Kibble"], "default_exits": [{"room": 9, "unkn1": 99, "unkn2": 8, "x": 56, "y": 152, "name": "Cloudy Park 1 - 10 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [24, 16], [27, 16], [4, 23]], "locations": ["Cloudy Park 1 - Enemy 10 (Gabon)", "Cloudy Park 1 - Enemy 11 (Sir Kibble)"], "music": 17}, {"name": "Cloudy Park 1 - 11", "level": 4, "stage": 1, "room": 11, "pointer": 3519608, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 192, "x": 216, "y": 600, "etype": 22, "vtype": 0, "name": "Cloudy Park 1 - 1-Up (Shotzo)"}, {"idx": 18, "pointer": 456, "x": 856, "y": 408, "etype": 22, "vtype": 2, "name": "Cloudy Park 1 - Maxim Tomato (Mariel)"}], "consumables_pointer": 352, "enemies": ["Mariel", "Nruff"], "default_exits": [{"room": 5, "unkn1": 64, "unkn2": 6, "x": 104, "y": 216, "name": "Cloudy Park 1 - 11 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [27, 16], [15, 16], [45, 16], [14, 23], [2, 22], [0, 22], [6, 22]], "locations": ["Cloudy Park 1 - Enemy 12 (Mariel)", "Cloudy Park 1 - Enemy 13 (Nruff)", "Cloudy Park 1 - 1-Up (Shotzo)", "Cloudy Park 1 - Maxim Tomato (Mariel)"], "music": 17}, {"name": "Cloudy Park 1 - 12", "level": 4, "stage": 1, "room": 12, "pointer": 2958914, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 1 - 12 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [42, 19]], "locations": ["Cloudy Park 1 - Hibanamodoki"], "music": 8}, {"name": "Cloudy Park 1 - 13", "level": 4, "stage": 1, "room": 13, "pointer": 2886015, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 1 - Complete"], "music": 5}, {"name": "Cloudy Park 2 - 0", "level": 4, "stage": 2, "room": 0, "pointer": 3142443, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly", "Sasuke"], "default_exits": [{"room": 6, "unkn1": 96, "unkn2": 7, "x": 56, "y": 88, "name": "Cloudy Park 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16], [30, 16], [6, 16], [14, 23]], "locations": ["Cloudy Park 2 - Enemy 1 (Chilly)", "Cloudy Park 2 - Enemy 2 (Sasuke)"], "music": 19}, {"name": "Cloudy Park 2 - 1", "level": 4, "stage": 2, "room": 1, "pointer": 3235925, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Broom Hatter"], "default_exits": [{"room": 2, "unkn1": 146, "unkn2": 5, "x": 88, "y": 88, "name": "Cloudy Park 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [8, 16], [11, 16]], "locations": ["Cloudy Park 2 - Enemy 3 (Waddle Dee)", "Cloudy Park 2 - Enemy 4 (Sparky)", "Cloudy Park 2 - Enemy 5 (Broom Hatter)"], "music": 19}, {"name": "Cloudy Park 2 - 2", "level": 4, "stage": 2, "room": 2, "pointer": 3297758, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Pteran"], "default_exits": [{"room": 3, "unkn1": 147, "unkn2": 8, "x": 72, "y": 136, "name": "Cloudy Park 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[27, 16], [39, 16], [1, 23]], "locations": ["Cloudy Park 2 - Enemy 6 (Sir Kibble)", "Cloudy Park 2 - Enemy 7 (Pteran)"], "music": 19}, {"name": "Cloudy Park 2 - 3", "level": 4, "stage": 2, "room": 3, "pointer": 3341087, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Dogon"], "default_exits": [{"room": 4, "unkn1": 145, "unkn2": 12, "x": 72, "y": 136, "name": "Cloudy Park 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[4, 16], [14, 23], [90, 16], [89, 16]], "locations": ["Cloudy Park 2 - Enemy 8 (Propeller)", "Cloudy Park 2 - Enemy 9 (Dogon)"], "music": 19}, {"name": "Cloudy Park 2 - 4", "level": 4, "stage": 2, "room": 4, "pointer": 3457404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Oro", "Bronto Burt", "Rocky"], "default_exits": [{"room": 5, "unkn1": 165, "unkn2": 5, "x": 72, "y": 104, "name": "Cloudy Park 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [3, 16], [14, 23], [18, 16], [25, 16]], "locations": ["Cloudy Park 2 - Enemy 10 (Togezo)", "Cloudy Park 2 - Enemy 11 (Oro)", "Cloudy Park 2 - Enemy 12 (Bronto Burt)", "Cloudy Park 2 - Enemy 13 (Rocky)"], "music": 19}, {"name": "Cloudy Park 2 - 5", "level": 4, "stage": 2, "room": 5, "pointer": 3273878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Kapar"], "default_exits": [{"room": 7, "unkn1": 96, "unkn2": 8, "x": 56, "y": 88, "name": "Cloudy Park 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [62, 16], [26, 16], [67, 16]], "locations": ["Cloudy Park 2 - Enemy 14 (Galbo)", "Cloudy Park 2 - Enemy 15 (Kapar)"], "music": 19}, {"name": "Cloudy Park 2 - 6", "level": 4, "stage": 2, "room": 6, "pointer": 2984453, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 25, "unkn2": 5, "x": 72, "y": 152, "name": "Cloudy Park 2 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 2 - Animal 1", "Cloudy Park 2 - Animal 2", "Cloudy Park 2 - Animal 3"], "music": 38}, {"name": "Cloudy Park 2 - 7", "level": 4, "stage": 2, "room": 7, "pointer": 2985482, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 5, "x": 40, "y": 88, "name": "Cloudy Park 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[22, 19]], "locations": [], "music": 19}, {"name": "Cloudy Park 2 - 8", "level": 4, "stage": 2, "room": 8, "pointer": 2990753, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[22, 19], [42, 19]], "locations": ["Cloudy Park 2 - Piyo & Keko"], "music": 8}, {"name": "Cloudy Park 2 - 9", "level": 4, "stage": 2, "room": 9, "pointer": 2889630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 2 - Complete"], "music": 5}, {"name": "Cloudy Park 3 - 0", "level": 4, "stage": 3, "room": 0, "pointer": 3100859, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Mopoo", "Poppy Bros Jr."], "default_exits": [{"room": 2, "unkn1": 145, "unkn2": 8, "x": 56, "y": 136, "name": "Cloudy Park 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [74, 16], [47, 16], [7, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 1 (Bronto Burt)", "Cloudy Park 3 - Enemy 2 (Mopoo)", "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)"], "music": 15}, {"name": "Cloudy Park 3 - 1", "level": 4, "stage": 3, "room": 1, "pointer": 3209719, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como"], "default_exits": [{"room": 5, "unkn1": 13, "unkn2": 14, "x": 56, "y": 152, "name": "Cloudy Park 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [4, 22], [41, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 4 (Como)"], "music": 15}, {"name": "Cloudy Park 3 - 2", "level": 4, "stage": 3, "room": 2, "pointer": 3216185, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Bobin", "Loud", "Kapar"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 6, "x": 216, "y": 1064, "name": "Cloudy Park 3 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 24, "unkn2": 14, "x": 104, "y": 152, "name": "Cloudy Park 3 - 2 Exit 1", "access_rule": []}], "entity_load": [[67, 16], [40, 16], [73, 16], [14, 23], [16, 16]], "locations": ["Cloudy Park 3 - Enemy 5 (Glunk)", "Cloudy Park 3 - Enemy 6 (Bobin)", "Cloudy Park 3 - Enemy 7 (Loud)", "Cloudy Park 3 - Enemy 8 (Kapar)"], "music": 15}, {"name": "Cloudy Park 3 - 3", "level": 4, "stage": 3, "room": 3, "pointer": 2994208, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 5, "unkn2": 9, "x": 408, "y": 232, "name": "Cloudy Park 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 3 - Animal 1", "Cloudy Park 3 - Animal 2", "Cloudy Park 3 - Animal 3"], "music": 40}, {"name": "Cloudy Park 3 - 4", "level": 4, "stage": 3, "room": 4, "pointer": 3229151, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Batamon", "Bouncy"], "default_exits": [{"room": 6, "unkn1": 156, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 126, "unkn2": 9, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 1", "access_rule": []}], "entity_load": [[7, 16], [26, 16], [14, 23], [13, 16], [68, 16]], "locations": ["Cloudy Park 3 - Enemy 9 (Galbo)", "Cloudy Park 3 - Enemy 10 (Batamon)", "Cloudy Park 3 - Enemy 11 (Bouncy)"], "music": 15}, {"name": "Cloudy Park 3 - 5", "level": 4, "stage": 3, "room": 5, "pointer": 2969244, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": [], "music": 31}, {"name": "Cloudy Park 3 - 6", "level": 4, "stage": 3, "room": 6, "pointer": 4128530, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": ["Cloudy Park 3 - Mr. Ball"], "music": 8}, {"name": "Cloudy Park 3 - 7", "level": 4, "stage": 3, "room": 7, "pointer": 2885051, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 3 - Complete"], "music": 5}, {"name": "Cloudy Park 4 - 0", "level": 4, "stage": 4, "room": 0, "pointer": 3072905, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[4, 23], [1, 23], [0, 23], [31, 16]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 1", "level": 4, "stage": 4, "room": 1, "pointer": 3074863, "animal_pointers": [208, 224], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 21, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 4 - Animal 1", "Cloudy Park 4 - Animal 2"], "music": 38}, {"name": "Cloudy Park 4 - 2", "level": 4, "stage": 4, "room": 2, "pointer": 3309209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Como", "Wapod", "Cappy"], "default_exits": [{"room": 3, "unkn1": 145, "unkn2": 9, "x": 104, "y": 152, "name": "Cloudy Park 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [24, 16], [12, 16], [14, 23], [41, 16], [4, 22]], "locations": ["Cloudy Park 4 - Enemy 1 (Gabon)", "Cloudy Park 4 - Enemy 2 (Como)", "Cloudy Park 4 - Enemy 3 (Wapod)", "Cloudy Park 4 - Enemy 4 (Cappy)"], "music": 21}, {"name": "Cloudy Park 4 - 3", "level": 4, "stage": 4, "room": 3, "pointer": 3296291, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 776, "x": 1880, "y": 152, "etype": 22, "vtype": 0, "name": "Cloudy Park 4 - 1-Up (Windy)"}, {"idx": 34, "pointer": 912, "x": 2160, "y": 152, "etype": 22, "vtype": 2, "name": "Cloudy Park 4 - Maxim Tomato (Windy)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Togezo"], "default_exits": [{"room": 5, "unkn1": 144, "unkn2": 9, "x": 56, "y": 136, "name": "Cloudy Park 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[18, 16], [8, 16], [31, 16], [14, 23], [4, 22], [4, 16], [0, 22], [2, 22]], "locations": ["Cloudy Park 4 - Enemy 5 (Sparky)", "Cloudy Park 4 - Enemy 6 (Togezo)", "Cloudy Park 4 - 1-Up (Windy)", "Cloudy Park 4 - Maxim Tomato (Windy)"], "music": 21}, {"name": "Cloudy Park 4 - 4", "level": 4, "stage": 4, "room": 4, "pointer": 3330996, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "KeKe", "Bouncy"], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 15, "x": 72, "y": 152, "name": "Cloudy Park 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [51, 16], [17, 16], [14, 23], [2, 16]], "locations": ["Cloudy Park 4 - Enemy 7 (Bronto Burt)", "Cloudy Park 4 - Enemy 8 (KeKe)", "Cloudy Park 4 - Enemy 9 (Bouncy)"], "music": 21}, {"name": "Cloudy Park 4 - 5", "level": 4, "stage": 4, "room": 5, "pointer": 3332300, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Mariel"], "default_exits": [{"room": 4, "unkn1": 21, "unkn2": 51, "x": 2328, "y": 120, "name": "Cloudy Park 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [46, 16], [27, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 10 (Sir Kibble)", "Cloudy Park 4 - Enemy 11 (Mariel)"], "music": 21}, {"name": "Cloudy Park 4 - 6", "level": 4, "stage": 4, "room": 6, "pointer": 3253310, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu", "Wappa"], "default_exits": [{"room": 9, "unkn1": 3, "unkn2": 6, "x": 72, "y": 152, "name": "Cloudy Park 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [31, 16], [19, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 12 (Kabu)", "Cloudy Park 4 - Enemy 13 (Wappa)"], "music": 21}, {"name": "Cloudy Park 4 - 7", "level": 4, "stage": 4, "room": 7, "pointer": 2967658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 12, "unkn2": 9, "x": 152, "y": 120, "name": "Cloudy Park 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Cloudy Park 4 - Miniboss 1 (Jumper Shoot)"], "music": 4}, {"name": "Cloudy Park 4 - 8", "level": 4, "stage": 4, "room": 8, "pointer": 2981644, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 344, "y": 680, "name": "Cloudy Park 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[24, 19]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 9", "level": 4, "stage": 4, "room": 9, "pointer": 3008001, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[24, 19], [42, 19]], "locations": ["Cloudy Park 4 - Mikarin & Kagami Mocchi"], "music": 8}, {"name": "Cloudy Park 4 - 10", "level": 4, "stage": 4, "room": 10, "pointer": 2888184, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 4 - Complete"], "music": 5}, {"name": "Cloudy Park 5 - 0", "level": 4, "stage": 5, "room": 0, "pointer": 3192630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Sir Kibble", "Cappy", "Wappa"], "default_exits": [{"room": 1, "unkn1": 146, "unkn2": 6, "x": 168, "y": 616, "name": "Cloudy Park 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [27, 16], [44, 16], [12, 16], [14, 23]], "locations": ["Cloudy Park 5 - Enemy 1 (Yaban)", "Cloudy Park 5 - Enemy 2 (Sir Kibble)", "Cloudy Park 5 - Enemy 3 (Cappy)", "Cloudy Park 5 - Enemy 4 (Wappa)"], "music": 17}, {"name": "Cloudy Park 5 - 1", "level": 4, "stage": 5, "room": 1, "pointer": 3050956, "animal_pointers": [], "consumables": [{"idx": 5, "pointer": 264, "x": 480, "y": 720, "etype": 22, "vtype": 2, "name": "Cloudy Park 5 - Maxim Tomato (Pillars)"}], "consumables_pointer": 288, "enemies": ["Galbo", "Bronto Burt", "KeKe"], "default_exits": [{"room": 2, "unkn1": 32, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [51, 16], [26, 16], [14, 23], [2, 22]], "locations": ["Cloudy Park 5 - Enemy 5 (Galbo)", "Cloudy Park 5 - Enemy 6 (Bronto Burt)", "Cloudy Park 5 - Enemy 7 (KeKe)", "Cloudy Park 5 - Maxim Tomato (Pillars)"], "music": 17}, {"name": "Cloudy Park 5 - 2", "level": 4, "stage": 5, "room": 2, "pointer": 3604194, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 17, "unkn2": 9, "x": 72, "y": 88, "name": "Cloudy Park 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 5 - Animal 1", "Cloudy Park 5 - Animal 2"], "music": 40}, {"name": "Cloudy Park 5 - 3", "level": 4, "stage": 5, "room": 3, "pointer": 3131242, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Klinko"], "default_exits": [{"room": 4, "unkn1": 98, "unkn2": 5, "x": 72, "y": 120, "name": "Cloudy Park 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [4, 16], [42, 16], [4, 23]], "locations": ["Cloudy Park 5 - Enemy 8 (Propeller)", "Cloudy Park 5 - Enemy 9 (Klinko)"], "music": 17}, {"name": "Cloudy Park 5 - 4", "level": 4, "stage": 5, "room": 4, "pointer": 2990116, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 23, "unkn2": 7, "x": 216, "y": 744, "name": "Cloudy Park 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[88, 16]], "locations": ["Cloudy Park 5 - Enemy 10 (Wapod)"], "music": 17}, {"name": "Cloudy Park 5 - 5", "level": 4, "stage": 5, "room": 5, "pointer": 2975410, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 4, "x": 104, "y": 296, "name": "Cloudy Park 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [2, 16]], "locations": [], "music": 17}, {"name": "Cloudy Park 5 - 6", "level": 4, "stage": 5, "room": 6, "pointer": 3173683, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 7, "unkn1": 115, "unkn2": 6, "x": 56, "y": 136, "name": "Cloudy Park 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [1, 23], [39, 16], [70, 16]], "locations": ["Cloudy Park 5 - Enemy 11 (Pteran)"], "music": 17}, {"name": "Cloudy Park 5 - 7", "level": 4, "stage": 5, "room": 7, "pointer": 2992340, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[25, 19], [42, 19]], "locations": ["Cloudy Park 5 - Pick"], "music": 8}, {"name": "Cloudy Park 5 - 8", "level": 4, "stage": 5, "room": 8, "pointer": 2891558, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 5 - Complete"], "music": 5}, {"name": "Cloudy Park 6 - 0", "level": 4, "stage": 6, "room": 0, "pointer": 3269847, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 1", "level": 4, "stage": 6, "room": 1, "pointer": 3252248, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 3, "unkn2": 25, "x": 72, "y": 72, "name": "Cloudy Park 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [55, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 2", "level": 4, "stage": 6, "room": 2, "pointer": 3028494, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 0, "unkn1": 4, "unkn2": 9, "x": 1032, "y": 152, "name": "Cloudy Park 6 - 2 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 13, "unkn2": 9, "x": 56, "y": 72, "name": "Cloudy Park 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 1 (Madoo)"], "music": 11}, {"name": "Cloudy Park 6 - 3", "level": 4, "stage": 6, "room": 3, "pointer": 3131911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 3 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 3 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 3 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 3 Exit 3", "access_rule": []}, {"room": 10, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 3 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 4", "level": 4, "stage": 6, "room": 4, "pointer": 3115416, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick", "Como"], "default_exits": [{"room": 8, "unkn1": 20, "unkn2": 4, "x": 72, "y": 488, "name": "Cloudy Park 6 - 4 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 4 Exit 1", "access_rule": []}, {"room": 11, "unkn1": 8, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 12, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 4 Exit 3", "access_rule": []}, {"room": 11, "unkn1": 16, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 4 Exit 4", "access_rule": []}, {"room": 11, "unkn1": 20, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 4 Exit 5", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [41, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 2 (Tick)", "Cloudy Park 6 - Enemy 3 (Como)"], "music": 11}, {"name": "Cloudy Park 6 - 5", "level": 4, "stage": 6, "room": 5, "pointer": 3245809, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 15, "unkn1": 65, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16], [14, 23], [4, 22]], "locations": ["Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)"], "music": 11}, {"name": "Cloudy Park 6 - 6", "level": 4, "stage": 6, "room": 6, "pointer": 3237044, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 56, "unkn2": 9, "x": 72, "y": 136, "name": "Cloudy Park 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[89, 16]], "locations": ["Cloudy Park 6 - Enemy 7 (Propeller)"], "music": 11}, {"name": "Cloudy Park 6 - 7", "level": 4, "stage": 6, "room": 7, "pointer": 3262705, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo"], "default_exits": [{"room": 13, "unkn1": 12, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 57, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 64, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 6 - 7 Exit 2", "access_rule": []}], "entity_load": [[74, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 8 (Mopoo)"], "music": 11}, {"name": "Cloudy Park 6 - 8", "level": 4, "stage": 6, "room": 8, "pointer": 3027259, "animal_pointers": [], "consumables": [{"idx": 22, "pointer": 312, "x": 224, "y": 256, "etype": 22, "vtype": 0, "name": "Cloudy Park 6 - 1-Up (Cutter)"}], "consumables_pointer": 304, "enemies": ["Bukiset (Burning)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Cutter)"], "default_exits": [{"room": 12, "unkn1": 13, "unkn2": 4, "x": 88, "y": 152, "name": "Cloudy Park 6 - 8 Exit 0", "access_rule": []}], "entity_load": [[78, 16], [80, 16], [76, 16], [79, 16], [83, 16], [14, 23], [4, 22], [0, 22]], "locations": ["Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", "Cloudy Park 6 - 1-Up (Cutter)"], "music": 11}, {"name": "Cloudy Park 6 - 9", "level": 4, "stage": 6, "room": 9, "pointer": 3089504, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 35, "unkn2": 7, "x": 72, "y": 72, "name": "Cloudy Park 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[41, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 10", "level": 4, "stage": 6, "room": 10, "pointer": 3132579, "animal_pointers": [242, 250, 258], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 20, "unkn2": 4, "x": 72, "y": 152, "name": "Cloudy Park 6 - 10 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 4, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 10 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 10 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 10 Exit 3", "access_rule": []}, {"room": 3, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 10 Exit 4", "access_rule": []}, {"room": 3, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 10 Exit 5", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 6 - Animal 1", "Cloudy Park 6 - Animal 2", "Cloudy Park 6 - Animal 3"], "music": 40}, {"name": "Cloudy Park 6 - 11", "level": 4, "stage": 6, "room": 11, "pointer": 3017866, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 11 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 8, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 11 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 12, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 11 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 16, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 11 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 20, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 11 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 12", "level": 4, "stage": 6, "room": 12, "pointer": 3036404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 9, "x": 200, "y": 72, "name": "Cloudy Park 6 - 12 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 13, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 13", "level": 4, "stage": 6, "room": 13, "pointer": 2965251, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 216, "y": 136, "name": "Cloudy Park 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[26, 19]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 14", "level": 4, "stage": 6, "room": 14, "pointer": 3077236, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 936, "y": 136, "name": "Cloudy Park 6 - 14 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 15", "level": 4, "stage": 6, "room": 15, "pointer": 3061794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[26, 19], [42, 19]], "locations": ["Cloudy Park 6 - HB-007"], "music": 8}, {"name": "Cloudy Park 6 - 16", "level": 4, "stage": 6, "room": 16, "pointer": 2888907, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 6 - Complete"], "music": 5}, {"name": "Cloudy Park Boss - 0", "level": 4, "stage": 7, "room": 0, "pointer": 2998682, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[3, 18]], "locations": ["Cloudy Park - Boss (Ado) Purified", "Level 4 Boss"], "music": 2}, {"name": "Iceberg 1 - 0", "level": 5, "stage": 1, "room": 0, "pointer": 3363111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Klinko", "KeKe"], "default_exits": [{"room": 1, "unkn1": 104, "unkn2": 8, "x": 312, "y": 1384, "name": "Iceberg 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [0, 16], [51, 16]], "locations": ["Iceberg 1 - Enemy 1 (Waddle Dee)", "Iceberg 1 - Enemy 2 (Klinko)", "Iceberg 1 - Enemy 3 (KeKe)"], "music": 18}, {"name": "Iceberg 1 - 1", "level": 5, "stage": 1, "room": 1, "pointer": 3596524, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Galbo", "Rocky"], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 8, "x": 72, "y": 344, "name": "Iceberg 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [41, 16], [26, 16], [14, 23], [4, 22], [6, 23]], "locations": ["Iceberg 1 - Enemy 4 (Como)", "Iceberg 1 - Enemy 5 (Galbo)", "Iceberg 1 - Enemy 6 (Rocky)"], "music": 18}, {"name": "Iceberg 1 - 2", "level": 5, "stage": 1, "room": 2, "pointer": 3288880, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 3, "unkn1": 49, "unkn2": 9, "x": 184, "y": 152, "name": "Iceberg 1 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 94, "unkn2": 21, "x": 120, "y": 168, "name": "Iceberg 1 - 2 Exit 1", "access_rule": []}], "entity_load": [[28, 19], [46, 16], [47, 16], [17, 16], [67, 16]], "locations": ["Iceberg 1 - Enemy 7 (Kapar)"], "music": 18}, {"name": "Iceberg 1 - 3", "level": 5, "stage": 1, "room": 3, "pointer": 3068439, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 9, "x": 808, "y": 152, "name": "Iceberg 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 1 - Animal 1", "Iceberg 1 - Animal 2"], "music": 38}, {"name": "Iceberg 1 - 4", "level": 5, "stage": 1, "room": 4, "pointer": 3233681, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo", "Babut", "Wappa"], "default_exits": [{"room": 6, "unkn1": 74, "unkn2": 4, "x": 56, "y": 152, "name": "Iceberg 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [43, 16], [74, 16]], "locations": ["Iceberg 1 - Enemy 8 (Mopoo)", "Iceberg 1 - Enemy 9 (Babut)", "Iceberg 1 - Enemy 10 (Wappa)"], "music": 18}, {"name": "Iceberg 1 - 5", "level": 5, "stage": 1, "room": 5, "pointer": 3406133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Chilly", "Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 196, "unkn2": 9, "x": 72, "y": 744, "name": "Iceberg 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [7, 16], [2, 16], [0, 16]], "locations": ["Iceberg 1 - Enemy 11 (Bronto Burt)", "Iceberg 1 - Enemy 12 (Chilly)", "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)"], "music": 18}, {"name": "Iceberg 1 - 6", "level": 5, "stage": 1, "room": 6, "pointer": 2985823, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 19], [42, 19]], "locations": ["Iceberg 1 - Kogoesou"], "music": 8}, {"name": "Iceberg 1 - 7", "level": 5, "stage": 1, "room": 7, "pointer": 2892040, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 1 - Complete"], "music": 5}, {"name": "Iceberg 2 - 0", "level": 5, "stage": 2, "room": 0, "pointer": 3106800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Nruff"], "default_exits": [{"room": 1, "unkn1": 113, "unkn2": 36, "x": 88, "y": 152, "name": "Iceberg 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [24, 16]], "locations": ["Iceberg 2 - Enemy 1 (Gabon)", "Iceberg 2 - Enemy 2 (Nruff)"], "music": 20}, {"name": "Iceberg 2 - 1", "level": 5, "stage": 2, "room": 1, "pointer": 3334841, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Chilly", "Pteran"], "default_exits": [{"room": 2, "unkn1": 109, "unkn2": 20, "x": 88, "y": 72, "name": "Iceberg 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [0, 16], [4, 16], [39, 16]], "locations": ["Iceberg 2 - Enemy 3 (Waddle Dee)", "Iceberg 2 - Enemy 4 (Chilly)", "Iceberg 2 - Enemy 5 (Pteran)"], "music": 20}, {"name": "Iceberg 2 - 2", "level": 5, "stage": 2, "room": 2, "pointer": 3473408, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Galbo", "Babut", "Magoo"], "default_exits": [{"room": 6, "unkn1": 102, "unkn2": 5, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 24, "unkn2": 18, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 37, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 55, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 3", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 4", "access_rule": []}], "entity_load": [[53, 16], [26, 16], [43, 16], [14, 23], [16, 16]], "locations": ["Iceberg 2 - Enemy 6 (Glunk)", "Iceberg 2 - Enemy 7 (Galbo)", "Iceberg 2 - Enemy 8 (Babut)", "Iceberg 2 - Enemy 9 (Magoo)"], "music": 20}, {"name": "Iceberg 2 - 3", "level": 5, "stage": 2, "room": 3, "pointer": 3037006, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 616, "y": 424, "name": "Iceberg 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 4", "level": 5, "stage": 2, "room": 4, "pointer": 3035198, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 904, "y": 424, "name": "Iceberg 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 5", "level": 5, "stage": 2, "room": 5, "pointer": 3128551, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 424, "name": "Iceberg 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 6", "level": 5, "stage": 2, "room": 6, "pointer": 3270857, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Nidoo", "Oro"], "default_exits": [{"room": 7, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Iceberg 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [4, 22], [89, 16], [28, 16], [25, 16]], "locations": ["Iceberg 2 - Enemy 10 (Propeller)", "Iceberg 2 - Enemy 11 (Nidoo)", "Iceberg 2 - Enemy 12 (Oro)"], "music": 20}, {"name": "Iceberg 2 - 7", "level": 5, "stage": 2, "room": 7, "pointer": 3212501, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Klinko", "Bronto Burt"], "default_exits": [{"room": 8, "unkn1": 124, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [14, 23], [2, 16], [4, 23]], "locations": ["Iceberg 2 - Enemy 13 (Klinko)", "Iceberg 2 - Enemy 14 (Bronto Burt)"], "music": 20}, {"name": "Iceberg 2 - 8", "level": 5, "stage": 2, "room": 8, "pointer": 2994515, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [42, 19]], "locations": ["Iceberg 2 - Samus"], "music": 8}, {"name": "Iceberg 2 - 9", "level": 5, "stage": 2, "room": 9, "pointer": 3058084, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 9, "x": 408, "y": 296, "name": "Iceberg 2 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 2 - Animal 1", "Iceberg 2 - Animal 2"], "music": 39}, {"name": "Iceberg 2 - 10", "level": 5, "stage": 2, "room": 10, "pointer": 2887220, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 2 - Complete"], "music": 5}, {"name": "Iceberg 3 - 0", "level": 5, "stage": 3, "room": 0, "pointer": 3455346, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori", "Bouncy", "Chilly", "Pteran"], "default_exits": [{"room": 1, "unkn1": 98, "unkn2": 6, "x": 200, "y": 232, "name": "Iceberg 3 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 217, "unkn2": 7, "x": 40, "y": 120, "name": "Iceberg 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[60, 16], [6, 16], [39, 16], [13, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 1 (Corori)", "Iceberg 3 - Enemy 2 (Bouncy)", "Iceberg 3 - Enemy 3 (Chilly)", "Iceberg 3 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Iceberg 3 - 1", "level": 5, "stage": 3, "room": 1, "pointer": 3019769, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 11, "unkn2": 14, "x": 1592, "y": 104, "name": "Iceberg 3 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 1", "Iceberg 3 - Animal 2", "Iceberg 3 - Animal 3"], "music": 38}, {"name": "Iceberg 3 - 2", "level": 5, "stage": 3, "room": 2, "pointer": 3618121, "animal_pointers": [], "consumables": [{"idx": 2, "pointer": 352, "x": 1776, "y": 104, "etype": 22, "vtype": 2, "name": "Iceberg 3 - Maxim Tomato (Ceiling)"}], "consumables_pointer": 128, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 196, "unkn2": 11, "x": 72, "y": 152, "name": "Iceberg 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[2, 22], [71, 16], [57, 16], [21, 16], [67, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 5 (Raft Waddle Dee)", "Iceberg 3 - Enemy 6 (Kapar)", "Iceberg 3 - Enemy 7 (Blipper)", "Iceberg 3 - Maxim Tomato (Ceiling)"], "music": 14}, {"name": "Iceberg 3 - 3", "level": 5, "stage": 3, "room": 3, "pointer": 3650368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 116, "unkn2": 11, "x": 40, "y": 152, "name": "Iceberg 3 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 63, "unkn2": 13, "x": 184, "y": 136, "name": "Iceberg 3 - 3 Exit 1", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [4, 22], [6, 16], [88, 16]], "locations": ["Iceberg 3 - Enemy 8 (Wapod)"], "music": 14}, {"name": "Iceberg 3 - 4", "level": 5, "stage": 3, "room": 4, "pointer": 3038208, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 10, "unkn2": 8, "x": 1032, "y": 216, "name": "Iceberg 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 4", "Iceberg 3 - Animal 5"], "music": 39}, {"name": "Iceberg 3 - 5", "level": 5, "stage": 3, "room": 5, "pointer": 3013938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": [], "music": 31}, {"name": "Iceberg 3 - 6", "level": 5, "stage": 3, "room": 6, "pointer": 3624789, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Icicle"], "default_exits": [{"room": 7, "unkn1": 211, "unkn2": 7, "x": 40, "y": 152, "name": "Iceberg 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [16, 16], [14, 23], [36, 16], [4, 22]], "locations": ["Iceberg 3 - Enemy 9 (Glunk)", "Iceberg 3 - Enemy 10 (Icicle)"], "music": 14}, {"name": "Iceberg 3 - 7", "level": 5, "stage": 3, "room": 7, "pointer": 2989472, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 7 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": ["Iceberg 3 - Chef Kawasaki"], "music": 8}, {"name": "Iceberg 3 - 8", "level": 5, "stage": 3, "room": 8, "pointer": 2889871, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 3 - Complete"], "music": 5}, {"name": "Iceberg 4 - 0", "level": 5, "stage": 4, "room": 0, "pointer": 3274879, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo", "Klinko", "Chilly"], "default_exits": [{"room": 1, "unkn1": 111, "unkn2": 8, "x": 72, "y": 104, "name": "Iceberg 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [2, 16], [26, 16]], "locations": ["Iceberg 4 - Enemy 1 (Bronto Burt)", "Iceberg 4 - Enemy 2 (Galbo)", "Iceberg 4 - Enemy 3 (Klinko)", "Iceberg 4 - Enemy 4 (Chilly)"], "music": 19}, {"name": "Iceberg 4 - 1", "level": 5, "stage": 4, "room": 1, "pointer": 3371780, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Babut", "Wappa"], "default_exits": [{"room": 2, "unkn1": 60, "unkn2": 36, "x": 216, "y": 88, "name": "Iceberg 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [4, 22], [44, 16]], "locations": ["Iceberg 4 - Enemy 5 (Babut)", "Iceberg 4 - Enemy 6 (Wappa)"], "music": 19}, {"name": "Iceberg 4 - 2", "level": 5, "stage": 4, "room": 2, "pointer": 3284378, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 8, "unkn2": 39, "x": 168, "y": 152, "name": "Iceberg 4 - 2 Exit 0", "access_rule": ["Burning"]}, {"room": 3, "unkn1": 13, "unkn2": 39, "x": 88, "y": 136, "name": "Iceberg 4 - 2 Exit 1", "access_rule": []}, {"room": 17, "unkn1": 18, "unkn2": 39, "x": 120, "y": 152, "name": "Iceberg 4 - 2 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 3", "level": 5, "stage": 4, "room": 3, "pointer": 3162957, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 44, "unkn2": 8, "x": 216, "y": 104, "name": "Iceberg 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[69, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 4", "level": 5, "stage": 4, "room": 4, "pointer": 3261679, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Icicle"], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 42, "x": 104, "y": 840, "name": "Iceberg 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[36, 16]], "locations": ["Iceberg 4 - Enemy 7 (Icicle)"], "music": 19}, {"name": "Iceberg 4 - 5", "level": 5, "stage": 4, "room": 5, "pointer": 3217398, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori"], "default_exits": [{"room": 6, "unkn1": 19, "unkn2": 5, "x": 72, "y": 120, "name": "Iceberg 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[60, 16], [44, 16], [4, 22]], "locations": ["Iceberg 4 - Enemy 8 (Corori)"], "music": 19}, {"name": "Iceberg 4 - 6", "level": 5, "stage": 4, "room": 6, "pointer": 3108265, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 61, "unkn2": 7, "x": 456, "y": 72, "name": "Iceberg 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 7", "level": 5, "stage": 4, "room": 7, "pointer": 3346202, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 39, "unkn2": 6, "x": 168, "y": 104, "name": "Iceberg 4 - 7 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 4, "unkn2": 21, "x": 88, "y": 168, "name": "Iceberg 4 - 7 Exit 1", "access_rule": ["Burning"]}, {"room": 13, "unkn1": 21, "unkn2": 21, "x": 280, "y": 168, "name": "Iceberg 4 - 7 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[14, 23], [4, 22], [4, 23]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 8", "level": 5, "stage": 4, "room": 8, "pointer": 3055911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 5, "x": 648, "y": 104, "name": "Iceberg 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 9", "level": 5, "stage": 4, "room": 9, "pointer": 3056457, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 9, "x": 136, "y": 136, "name": "Iceberg 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 4 - Miniboss 1 (Yuki)"], "music": 4}, {"name": "Iceberg 4 - 10", "level": 5, "stage": 4, "room": 10, "pointer": 3257516, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 8, "unkn2": 37, "x": 88, "y": 40, "name": "Iceberg 4 - 10 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 15, "unkn2": 37, "x": 200, "y": 40, "name": "Iceberg 4 - 10 Exit 1", "access_rule": []}], "entity_load": [[31, 19]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 11", "level": 5, "stage": 4, "room": 11, "pointer": 3083322, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon"], "default_exits": [{"room": 12, "unkn1": 46, "unkn2": 8, "x": 88, "y": 120, "name": "Iceberg 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[24, 16]], "locations": ["Iceberg 4 - Enemy 9 (Gabon)"], "music": 19}, {"name": "Iceberg 4 - 12", "level": 5, "stage": 4, "room": 12, "pointer": 3147724, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu"], "default_exits": [{"room": 18, "unkn1": 64, "unkn2": 7, "x": 72, "y": 456, "name": "Iceberg 4 - 12 Exit 0", "access_rule": []}], "entity_load": [[19, 16], [61, 16]], "locations": ["Iceberg 4 - Enemy 10 (Kabu)"], "music": 19}, {"name": "Iceberg 4 - 13", "level": 5, "stage": 4, "room": 13, "pointer": 3370077, "animal_pointers": [232, 240, 248], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 31, "unkn2": 4, "x": 216, "y": 120, "name": "Iceberg 4 - 13 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 46, "unkn2": 10, "x": 72, "y": 88, "name": "Iceberg 4 - 13 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 57, "unkn2": 10, "x": 312, "y": 88, "name": "Iceberg 4 - 13 Exit 2", "access_rule": []}, {"room": 14, "unkn1": 28, "unkn2": 21, "x": 152, "y": 136, "name": "Iceberg 4 - 13 Exit 3", "access_rule": []}, {"room": 14, "unkn1": 34, "unkn2": 21, "x": 280, "y": 136, "name": "Iceberg 4 - 13 Exit 4", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 1", "Iceberg 4 - Animal 2", "Iceberg 4 - Animal 3"], "music": 19}, {"name": "Iceberg 4 - 14", "level": 5, "stage": 4, "room": 14, "pointer": 3057002, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Broom Hatter", "Sasuke"], "default_exits": [{"room": 15, "unkn1": 4, "unkn2": 8, "x": 88, "y": 360, "name": "Iceberg 4 - 14 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 10, "unkn2": 8, "x": 440, "y": 344, "name": "Iceberg 4 - 14 Exit 1", "access_rule": []}, {"room": 13, "unkn1": 16, "unkn2": 8, "x": 568, "y": 344, "name": "Iceberg 4 - 14 Exit 2", "access_rule": []}, {"room": 15, "unkn1": 22, "unkn2": 8, "x": 344, "y": 360, "name": "Iceberg 4 - 14 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [30, 16]], "locations": ["Iceberg 4 - Enemy 11 (Broom Hatter)", "Iceberg 4 - Enemy 12 (Sasuke)"], "music": 19}, {"name": "Iceberg 4 - 15", "level": 5, "stage": 4, "room": 15, "pointer": 3116124, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 6, "x": 520, "y": 72, "name": "Iceberg 4 - 15 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 4, "unkn2": 22, "x": 88, "y": 136, "name": "Iceberg 4 - 15 Exit 1", "access_rule": []}, {"room": 14, "unkn1": 22, "unkn2": 22, "x": 344, "y": 136, "name": "Iceberg 4 - 15 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 16", "level": 5, "stage": 4, "room": 16, "pointer": 3069937, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 9, "x": 152, "y": 632, "name": "Iceberg 4 - 16 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 4"], "music": 38}, {"name": "Iceberg 4 - 17", "level": 5, "stage": 4, "room": 17, "pointer": 3072413, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 6, "unkn2": 9, "x": 280, "y": 632, "name": "Iceberg 4 - 17 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 5"], "music": 38}, {"name": "Iceberg 4 - 18", "level": 5, "stage": 4, "room": 18, "pointer": 3404593, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 19, "unkn1": 94, "unkn2": 12, "x": 72, "y": 152, "name": "Iceberg 4 - 18 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [43, 16], [30, 16], [15, 16]], "locations": ["Iceberg 4 - Enemy 13 (Nruff)"], "music": 19}, {"name": "Iceberg 4 - 19", "level": 5, "stage": 4, "room": 19, "pointer": 3075826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 4 - 19 Exit 0", "access_rule": []}], "entity_load": [[31, 19], [42, 19]], "locations": ["Iceberg 4 - Name"], "music": 8}, {"name": "Iceberg 4 - 20", "level": 5, "stage": 4, "room": 20, "pointer": 2887943, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 4 - Complete"], "music": 5}, {"name": "Iceberg 5 - 0", "level": 5, "stage": 5, "room": 0, "pointer": 3316135, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 30, "unkn1": 75, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[79, 16], [76, 16], [81, 16], [78, 16], [77, 16], [82, 16], [80, 16], [83, 16]], "locations": ["Iceberg 5 - Enemy 1 (Bukiset (Burning))", "Iceberg 5 - Enemy 2 (Bukiset (Stone))", "Iceberg 5 - Enemy 3 (Bukiset (Ice))", "Iceberg 5 - Enemy 4 (Bukiset (Needle))", "Iceberg 5 - Enemy 5 (Bukiset (Clean))", "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", "Iceberg 5 - Enemy 7 (Bukiset (Spark))", "Iceberg 5 - Enemy 8 (Bukiset (Cutter))"], "music": 16}, {"name": "Iceberg 5 - 1", "level": 5, "stage": 5, "room": 1, "pointer": 3037607, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 72, "y": 104, "name": "Iceberg 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 2", "level": 5, "stage": 5, "room": 2, "pointer": 3103842, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk"], "default_exits": [{"room": 25, "unkn1": 27, "unkn2": 6, "x": 72, "y": 200, "name": "Iceberg 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[16, 16]], "locations": ["Iceberg 5 - Enemy 9 (Glunk)"], "music": 16}, {"name": "Iceberg 5 - 3", "level": 5, "stage": 5, "room": 3, "pointer": 3135899, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 4, "unkn1": 20, "unkn2": 7, "x": 72, "y": 88, "name": "Iceberg 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 10 (Wapod)"], "music": 16}, {"name": "Iceberg 5 - 4", "level": 5, "stage": 5, "room": 4, "pointer": 3180695, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 26, "unkn2": 5, "x": 56, "y": 104, "name": "Iceberg 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 11 (Tick)"], "music": 16}, {"name": "Iceberg 5 - 5", "level": 5, "stage": 5, "room": 5, "pointer": 3106064, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 24, "unkn1": 14, "unkn2": 6, "x": 168, "y": 152, "name": "Iceberg 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[58, 16], [14, 23], [4, 22]], "locations": ["Iceberg 5 - Enemy 12 (Madoo)"], "music": 16}, {"name": "Iceberg 5 - 6", "level": 5, "stage": 5, "room": 6, "pointer": 3276800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 59, "unkn2": 12, "x": 72, "y": 120, "name": "Iceberg 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[55, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 7", "level": 5, "stage": 5, "room": 7, "pointer": 3104585, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 25, "unkn2": 7, "x": 72, "y": 136, "name": "Iceberg 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 8", "level": 5, "stage": 5, "room": 8, "pointer": 3195121, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 35, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 8 Exit 0", "access_rule": []}], "entity_load": [[4, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 9", "level": 5, "stage": 5, "room": 9, "pointer": 3087198, "animal_pointers": [], "consumables": [{"idx": 16, "pointer": 200, "x": 256, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Boulder)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 28, "unkn1": 20, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [54, 16]], "locations": ["Iceberg 5 - 1-Up (Boulder)"], "music": 16}, {"name": "Iceberg 5 - 10", "level": 5, "stage": 5, "room": 10, "pointer": 3321612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 45, "unkn2": 15, "x": 72, "y": 120, "name": "Iceberg 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 11", "level": 5, "stage": 5, "room": 11, "pointer": 3139178, "animal_pointers": [], "consumables": [{"idx": 17, "pointer": 192, "x": 152, "y": 168, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Floor)"}], "consumables_pointer": 176, "enemies": ["Yaban"], "default_exits": [{"room": 12, "unkn1": 17, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 11 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [0, 22]], "locations": ["Iceberg 5 - Enemy 13 (Yaban)", "Iceberg 5 - 1-Up (Floor)"], "music": 16}, {"name": "Iceberg 5 - 12", "level": 5, "stage": 5, "room": 12, "pointer": 3118231, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 7, "x": 72, "y": 104, "name": "Iceberg 5 - 12 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 14 (Propeller)"], "music": 16}, {"name": "Iceberg 5 - 13", "level": 5, "stage": 5, "room": 13, "pointer": 3021658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 27, "unkn1": 16, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 13 Exit 0", "access_rule": []}], "entity_load": [[45, 16]], "locations": ["Iceberg 5 - Enemy 15 (Mariel)"], "music": 16}, {"name": "Iceberg 5 - 14", "level": 5, "stage": 5, "room": 14, "pointer": 3025398, "animal_pointers": [], "consumables": [{"idx": 24, "pointer": 200, "x": 208, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Peloo)"}], "consumables_pointer": 176, "enemies": [], "default_exits": [{"room": 15, "unkn1": 13, "unkn2": 9, "x": 72, "y": 216, "name": "Iceberg 5 - 14 Exit 0", "access_rule": []}], "entity_load": [[64, 16], [0, 22]], "locations": ["Iceberg 5 - 1-Up (Peloo)"], "music": 16}, {"name": "Iceberg 5 - 15", "level": 5, "stage": 5, "room": 15, "pointer": 3167445, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 13, "x": 72, "y": 152, "name": "Iceberg 5 - 15 Exit 0", "access_rule": []}], "entity_load": [[39, 16]], "locations": ["Iceberg 5 - Enemy 16 (Pteran)"], "music": 16}, {"name": "Iceberg 5 - 16", "level": 5, "stage": 5, "room": 16, "pointer": 3033990, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 33, "unkn1": 36, "unkn2": 9, "x": 168, "y": 152, "name": "Iceberg 5 - 16 Exit 0", "access_rule": []}], "entity_load": [[68, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 17", "level": 5, "stage": 5, "room": 17, "pointer": 3100111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 40, "unkn2": 7, "x": 72, "y": 200, "name": "Iceberg 5 - 17 Exit 0", "access_rule": []}], "entity_load": [[52, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 18", "level": 5, "stage": 5, "room": 18, "pointer": 3030947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 17, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 18 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": ["Iceberg 5 - Enemy 17 (Galbo)"], "music": 16}, {"name": "Iceberg 5 - 19", "level": 5, "stage": 5, "room": 19, "pointer": 3105326, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe"], "default_exits": [{"room": 21, "unkn1": 13, "unkn2": 4, "x": 72, "y": 152, "name": "Iceberg 5 - 19 Exit 0", "access_rule": []}], "entity_load": [[51, 16]], "locations": ["Iceberg 5 - Enemy 18 (KeKe)"], "music": 16}, {"name": "Iceberg 5 - 20", "level": 5, "stage": 5, "room": 20, "pointer": 3118928, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 19, "unkn1": 13, "unkn2": 6, "x": 72, "y": 264, "name": "Iceberg 5 - 20 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 5 - Enemy 19 (Nidoo)"], "music": 16}, {"name": "Iceberg 5 - 21", "level": 5, "stage": 5, "room": 21, "pointer": 3202517, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 22, "unkn1": 29, "unkn2": 9, "x": 72, "y": 72, "name": "Iceberg 5 - 21 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16]], "locations": ["Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", "Iceberg 5 - Enemy 22 (Bouncy Drawing)"], "music": 16}, {"name": "Iceberg 5 - 22", "level": 5, "stage": 5, "room": 22, "pointer": 3014656, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Joe"], "default_exits": [{"room": 23, "unkn1": 13, "unkn2": 4, "x": 72, "y": 104, "name": "Iceberg 5 - 22 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 23 (Joe)"], "music": 16}, {"name": "Iceberg 5 - 23", "level": 5, "stage": 5, "room": 23, "pointer": 3166550, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 34, "unkn1": 27, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 23 Exit 0", "access_rule": []}], "entity_load": [[67, 16]], "locations": ["Iceberg 5 - Enemy 24 (Kapar)"], "music": 16}, {"name": "Iceberg 5 - 24", "level": 5, "stage": 5, "room": 24, "pointer": 3029110, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gansan"], "default_exits": [{"room": 31, "unkn1": 10, "unkn2": 4, "x": 72, "y": 88, "name": "Iceberg 5 - 24 Exit 0", "access_rule": []}], "entity_load": [[75, 16]], "locations": ["Iceberg 5 - Enemy 25 (Gansan)"], "music": 16}, {"name": "Iceberg 5 - 25", "level": 5, "stage": 5, "room": 25, "pointer": 3156420, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sasuke"], "default_exits": [{"room": 3, "unkn1": 25, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 25 Exit 0", "access_rule": []}], "entity_load": [[30, 16]], "locations": ["Iceberg 5 - Enemy 26 (Sasuke)"], "music": 16}, {"name": "Iceberg 5 - 26", "level": 5, "stage": 5, "room": 26, "pointer": 3127877, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo"], "default_exits": [{"room": 8, "unkn1": 24, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 5 - 26 Exit 0", "access_rule": []}], "entity_load": [[18, 16]], "locations": ["Iceberg 5 - Enemy 27 (Togezo)"], "music": 16}, {"name": "Iceberg 5 - 27", "level": 5, "stage": 5, "room": 27, "pointer": 3256471, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Bobin"], "default_exits": [{"room": 14, "unkn1": 26, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 27 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [73, 16]], "locations": ["Iceberg 5 - Enemy 28 (Sparky)", "Iceberg 5 - Enemy 29 (Bobin)"], "music": 16}, {"name": "Iceberg 5 - 28", "level": 5, "stage": 5, "room": 28, "pointer": 3029723, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly"], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 248, "name": "Iceberg 5 - 28 Exit 0", "access_rule": []}], "entity_load": [[6, 16]], "locations": ["Iceberg 5 - Enemy 30 (Chilly)"], "music": 16}, {"name": "Iceberg 5 - 29", "level": 5, "stage": 5, "room": 29, "pointer": 3526568, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 29 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [14, 23]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 30", "level": 5, "stage": 5, "room": 30, "pointer": 3022285, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 13, "unkn2": 5, "x": 88, "y": 104, "name": "Iceberg 5 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 1", "Iceberg 5 - Animal 2"], "music": 40}, {"name": "Iceberg 5 - 31", "level": 5, "stage": 5, "room": 31, "pointer": 3026019, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 72, "y": 200, "name": "Iceberg 5 - 31 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 3", "Iceberg 5 - Animal 4"], "music": 40}, {"name": "Iceberg 5 - 32", "level": 5, "stage": 5, "room": 32, "pointer": 3039996, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 32 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 5", "Iceberg 5 - Animal 6"], "music": 40}, {"name": "Iceberg 5 - 33", "level": 5, "stage": 5, "room": 33, "pointer": 3015302, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 33 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 7", "Iceberg 5 - Animal 8"], "music": 40}, {"name": "Iceberg 5 - 34", "level": 5, "stage": 5, "room": 34, "pointer": 3185868, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 35, "unkn1": 35, "unkn2": 9, "x": 200, "y": 328, "name": "Iceberg 5 - 34 Exit 0", "access_rule": []}], "entity_load": [[72, 16], [4, 22], [14, 23]], "locations": ["Iceberg 5 - Enemy 31 (Peran)"], "music": 16}, {"name": "Iceberg 5 - 35", "level": 5, "stage": 5, "room": 35, "pointer": 3865635, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 12, "unkn2": 7, "x": 168, "y": 1384, "name": "Iceberg 5 - 35 Exit 0", "access_rule": []}], "entity_load": [[17, 16], [4, 22]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 36", "level": 5, "stage": 5, "room": 36, "pointer": 3024154, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 37, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 5 - 36 Exit 0", "access_rule": []}], "entity_load": [[32, 19], [42, 19]], "locations": ["Iceberg 5 - Shiro"], "music": 8}, {"name": "Iceberg 5 - 37", "level": 5, "stage": 5, "room": 37, "pointer": 2890594, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 5 - Complete"], "music": 5}, {"name": "Iceberg 6 - 0", "level": 5, "stage": 6, "room": 0, "pointer": 3385305, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 28, "x": 136, "y": 184, "name": "Iceberg 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 12, "unkn2": 28, "x": 248, "y": 184, "name": "Iceberg 6 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 18, "unkn2": 28, "x": 360, "y": 184, "name": "Iceberg 6 - 0 Exit 2", "access_rule": []}], "entity_load": [[15, 16]], "locations": ["Iceberg 6 - Enemy 1 (Nruff)"], "music": 12}, {"name": "Iceberg 6 - 1", "level": 5, "stage": 6, "room": 1, "pointer": 3197599, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 1 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 1", "Iceberg 6 - Animal 2", "Iceberg 6 - Animal 3"], "music": 12}, {"name": "Iceberg 6 - 2", "level": 5, "stage": 6, "room": 2, "pointer": 3097113, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 2 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 3", "level": 5, "stage": 6, "room": 3, "pointer": 3198422, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 3 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 3 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 3 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 4", "Iceberg 6 - Animal 5", "Iceberg 6 - Animal 6"], "music": 12}, {"name": "Iceberg 6 - 4", "level": 5, "stage": 6, "room": 4, "pointer": 3210507, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 4 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 5", "level": 5, "stage": 6, "room": 5, "pointer": 3196776, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 212, "x": 136, "y": 120, "etype": 22, "vtype": 2, "name": "Iceberg 6 - Maxim Tomato (Left)"}, {"idx": 1, "pointer": 220, "x": 248, "y": 120, "etype": 22, "vtype": 0, "name": "Iceberg 6 - 1-Up (Middle)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 4, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 5 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 5 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 5 Exit 2", "access_rule": []}], "entity_load": [[2, 22], [0, 22], [14, 23]], "locations": ["Iceberg 6 - Maxim Tomato (Left)", "Iceberg 6 - 1-Up (Middle)"], "music": 12}, {"name": "Iceberg 6 - 6", "level": 5, "stage": 6, "room": 6, "pointer": 3208130, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 7, "unkn1": 9, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 6 - Enemy 2 (Nidoo)"], "music": 12}, {"name": "Iceberg 6 - 7", "level": 5, "stage": 6, "room": 7, "pointer": 3124478, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky"], "default_exits": [{"room": 8, "unkn1": 17, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[8, 16]], "locations": ["Iceberg 6 - Enemy 3 (Sparky)"], "music": 12}, {"name": "Iceberg 6 - 8", "level": 5, "stage": 6, "room": 8, "pointer": 3110431, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 8 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 14, "unkn2": 5, "x": 296, "y": 136, "name": "Iceberg 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 9", "level": 5, "stage": 6, "room": 9, "pointer": 3139832, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[2, 27]], "locations": ["Iceberg 6 - Miniboss 1 (Blocky)"], "music": 12}, {"name": "Iceberg 6 - 10", "level": 5, "stage": 6, "room": 10, "pointer": 3119624, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 11", "level": 5, "stage": 6, "room": 11, "pointer": 3141139, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 12, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Iceberg 6 - Miniboss 2 (Jumper Shoot)"], "music": 12}, {"name": "Iceberg 6 - 12", "level": 5, "stage": 6, "room": 12, "pointer": 3123788, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 12 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 13", "level": 5, "stage": 6, "room": 13, "pointer": 3143741, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 6 - Miniboss 3 (Yuki)"], "music": 12}, {"name": "Iceberg 6 - 14", "level": 5, "stage": 6, "room": 14, "pointer": 3120319, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 14 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 15", "level": 5, "stage": 6, "room": 15, "pointer": 3135238, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 16, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[27, 16]], "locations": ["Iceberg 6 - Enemy 4 (Sir Kibble)"], "music": 12}, {"name": "Iceberg 6 - 16", "level": 5, "stage": 6, "room": 16, "pointer": 3123096, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 16 Exit 0", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 17", "level": 5, "stage": 6, "room": 17, "pointer": 3144389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 17 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Iceberg 6 - Miniboss 4 (Haboki)"], "music": 12}, {"name": "Iceberg 6 - 18", "level": 5, "stage": 6, "room": 18, "pointer": 3121014, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 19", "level": 5, "stage": 6, "room": 19, "pointer": 3017228, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 19 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Iceberg 6 - Miniboss 5 (Boboo)"], "music": 12}, {"name": "Iceberg 6 - 20", "level": 5, "stage": 6, "room": 20, "pointer": 3121709, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 21, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 21", "level": 5, "stage": 6, "room": 21, "pointer": 3145036, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 21 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Iceberg 6 - Miniboss 6 (Captain Stitch)"], "music": 12}, {"name": "Iceberg 6 - 22", "level": 5, "stage": 6, "room": 22, "pointer": 3116830, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 7, "unkn2": 5, "x": 136, "y": 152, "name": "Iceberg 6 - 22 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 23", "level": 5, "stage": 6, "room": 23, "pointer": 3045263, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 24, "unkn1": 17, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [42, 19]], "locations": ["Iceberg 6 - Angel"], "music": 8}, {"name": "Iceberg 6 - 24", "level": 5, "stage": 6, "room": 24, "pointer": 2889389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 6 - Complete"], "music": 5}, {"name": "Iceberg Boss - 0", "level": 5, "stage": 7, "room": 0, "pointer": 2980207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[8, 18]], "locations": ["Iceberg - Boss (Dedede) Purified", "Level 5 Boss"], "music": 7}] \ No newline at end of file +[{"name": "Grass Land 1 - 0", "level": 1, "stage": 1, "room": 0, "pointer": 3434257, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sir Kibble", "Cappy"], "default_exits": [{"room": 1, "unkn1": 205, "unkn2": 8, "x": 72, "y": 200, "name": "Grass Land 1 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 87, "unkn2": 9, "x": 104, "y": 152, "name": "Grass Land 1 - 0 Exit 1", "access_rule": []}], "entity_load": [[0, 16], [1, 23], [0, 23], [14, 23], [27, 16], [12, 16], [4, 22]], "locations": ["Grass Land 1 - Enemy 1 (Waddle Dee)", "Grass Land 1 - Enemy 2 (Sir Kibble)", "Grass Land 1 - Enemy 3 (Cappy)"], "music": 20}, {"name": "Grass Land 1 - 1", "level": 1, "stage": 1, "room": 1, "pointer": 3368373, "animal_pointers": [], "consumables": [{"idx": 14, "pointer": 264, "x": 928, "y": 160, "etype": 22, "vtype": 0, "name": "Grass Land 1 - 1-Up (Parasol)"}, {"idx": 15, "pointer": 312, "x": 1456, "y": 176, "etype": 22, "vtype": 2, "name": "Grass Land 1 - Maxim Tomato (Spark)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Bronto Burt", "Sasuke"], "default_exits": [{"room": 3, "unkn1": 143, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [30, 16], [12, 16], [14, 23], [8, 16], [0, 22], [2, 22]], "locations": ["Grass Land 1 - Enemy 4 (Sparky)", "Grass Land 1 - Enemy 5 (Bronto Burt)", "Grass Land 1 - Enemy 6 (Sasuke)", "Grass Land 1 - 1-Up (Parasol)", "Grass Land 1 - Maxim Tomato (Spark)"], "music": 20}, {"name": "Grass Land 1 - 2", "level": 1, "stage": 1, "room": 2, "pointer": 2960650, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 1416, "y": 152, "name": "Grass Land 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 1 - Animal 1", "Grass Land 1 - Animal 2"], "music": 38}, {"name": "Grass Land 1 - 3", "level": 1, "stage": 1, "room": 3, "pointer": 3478442, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 179, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [7, 16], [0, 23], [6, 22], [14, 23], [8, 16], [1, 23]], "locations": ["Grass Land 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 20}, {"name": "Grass Land 1 - 4", "level": 1, "stage": 1, "room": 4, "pointer": 2978390, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [42, 19]], "locations": ["Grass Land 1 - Tulip"], "music": 8}, {"name": "Grass Land 1 - 5", "level": 1, "stage": 1, "room": 5, "pointer": 2890835, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 1 - Complete"], "music": 5}, {"name": "Grass Land 2 - 0", "level": 1, "stage": 2, "room": 0, "pointer": 3293347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "KeKe", "Bobo", "Poppy Bros Jr."], "default_exits": [{"room": 1, "unkn1": 112, "unkn2": 9, "x": 72, "y": 152, "name": "Grass Land 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [7, 16], [5, 16], [4, 22], [51, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 1 (Rocky)", "Grass Land 2 - Enemy 2 (KeKe)", "Grass Land 2 - Enemy 3 (Bobo)", "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)"], "music": 11}, {"name": "Grass Land 2 - 1", "level": 1, "stage": 2, "room": 1, "pointer": 3059685, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 9, "x": 56, "y": 136, "name": "Grass Land 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 2 - Animal 1", "Grass Land 2 - Animal 2"], "music": 39}, {"name": "Grass Land 2 - 2", "level": 1, "stage": 2, "room": 2, "pointer": 3432109, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Popon Ball", "Bouncy"], "default_exits": [{"room": 4, "unkn1": 133, "unkn2": 11, "x": 72, "y": 200, "name": "Grass Land 2 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 52, "unkn2": 12, "x": 56, "y": 152, "name": "Grass Land 2 - 2 Exit 1", "access_rule": []}], "entity_load": [[13, 16], [50, 16], [4, 22], [3, 16], [0, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 5 (Waddle Dee)", "Grass Land 2 - Enemy 6 (Popon Ball)", "Grass Land 2 - Enemy 7 (Bouncy)"], "music": 11}, {"name": "Grass Land 2 - 3", "level": 1, "stage": 2, "room": 3, "pointer": 2970029, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 2, "unkn2": 9, "x": 840, "y": 168, "name": "Grass Land 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 19]], "locations": [], "music": 11}, {"name": "Grass Land 2 - 4", "level": 1, "stage": 2, "room": 4, "pointer": 3578022, "animal_pointers": [], "consumables": [{"idx": 20, "pointer": 272, "x": 992, "y": 192, "etype": 22, "vtype": 0, "name": "Grass Land 2 - 1-Up (Needle)"}], "consumables_pointer": 352, "enemies": ["Tick", "Bronto Burt", "Nruff"], "default_exits": [{"room": 5, "unkn1": 154, "unkn2": 12, "x": 72, "y": 152, "name": "Grass Land 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [5, 16], [2, 16], [48, 16], [14, 23], [0, 22]], "locations": ["Grass Land 2 - Enemy 8 (Tick)", "Grass Land 2 - Enemy 9 (Bronto Burt)", "Grass Land 2 - Enemy 10 (Nruff)", "Grass Land 2 - 1-Up (Needle)"], "music": 11}, {"name": "Grass Land 2 - 5", "level": 1, "stage": 2, "room": 5, "pointer": 2966057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 19], [42, 19]], "locations": ["Grass Land 2 - Muchimuchi"], "music": 8}, {"name": "Grass Land 2 - 6", "level": 1, "stage": 2, "room": 6, "pointer": 2887461, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 2 - Complete"], "music": 5}, {"name": "Grass Land 3 - 0", "level": 1, "stage": 3, "room": 0, "pointer": 3149707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Rocky", "Nruff"], "default_exits": [{"room": 1, "unkn1": 107, "unkn2": 7, "x": 72, "y": 840, "name": "Grass Land 3 - 0 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 46, "unkn2": 9, "x": 152, "y": 152, "name": "Grass Land 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [14, 23], [15, 16], [0, 16], [8, 16]], "locations": ["Grass Land 3 - Enemy 1 (Sparky)", "Grass Land 3 - Enemy 2 (Rocky)", "Grass Land 3 - Enemy 3 (Nruff)"], "music": 19}, {"name": "Grass Land 3 - 1", "level": 1, "stage": 3, "room": 1, "pointer": 3204939, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 360, "x": 208, "y": 344, "etype": 22, "vtype": 0, "name": "Grass Land 3 - 1-Up (Climb)"}, {"idx": 11, "pointer": 376, "x": 224, "y": 568, "etype": 22, "vtype": 2, "name": "Grass Land 3 - Maxim Tomato (Climb)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [6, 23], [2, 22], [5, 23], [14, 23], [1, 23], [0, 23], [31, 16]], "locations": ["Grass Land 3 - 1-Up (Climb)", "Grass Land 3 - Maxim Tomato (Climb)"], "music": 19}, {"name": "Grass Land 3 - 2", "level": 1, "stage": 3, "room": 2, "pointer": 3200066, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 55, "x": 56, "y": 152, "name": "Grass Land 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [14, 23]], "locations": [], "music": 19}, {"name": "Grass Land 3 - 3", "level": 1, "stage": 3, "room": 3, "pointer": 2959784, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 15, "unkn2": 9, "x": 56, "y": 120, "name": "Grass Land 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 31}, {"name": "Grass Land 3 - 4", "level": 1, "stage": 3, "room": 4, "pointer": 2979121, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 8, "unkn2": 9, "x": 760, "y": 152, "name": "Grass Land 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 3 - Animal 1", "Grass Land 3 - Animal 2"], "music": 40}, {"name": "Grass Land 3 - 5", "level": 1, "stage": 3, "room": 5, "pointer": 2997811, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 8}, {"name": "Grass Land 3 - 6", "level": 1, "stage": 3, "room": 6, "pointer": 3084876, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bouncy"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [14, 16], [1, 23], [59, 16], [14, 23]], "locations": ["Grass Land 3 - Pitcherman", "Grass Land 3 - Enemy 4 (Bouncy)"], "music": 19}, {"name": "Grass Land 3 - 7", "level": 1, "stage": 3, "room": 7, "pointer": 2891317, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 3 - Complete"], "music": 5}, {"name": "Grass Land 4 - 0", "level": 1, "stage": 4, "room": 0, "pointer": 3471284, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Babut", "Rocky"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 13, "x": 72, "y": 136, "name": "Grass Land 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [14, 23], [40, 16], [61, 16], [4, 22]], "locations": ["Grass Land 4 - Enemy 1 (Loud)", "Grass Land 4 - Enemy 2 (Babut)", "Grass Land 4 - Enemy 3 (Rocky)"], "music": 10}, {"name": "Grass Land 4 - 1", "level": 1, "stage": 4, "room": 1, "pointer": 3436401, "animal_pointers": [], "consumables": [{"idx": 12, "pointer": 290, "x": 1008, "y": 144, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Zebon Right)"}], "consumables_pointer": 368, "enemies": ["Kapar"], "default_exits": [{"room": 5, "unkn1": 58, "unkn2": 5, "x": 184, "y": 312, "name": "Grass Land 4 - 1 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 42, "unkn2": 18, "x": 168, "y": 88, "name": "Grass Land 4 - 1 Exit 1", "access_rule": []}], "entity_load": [[43, 16], [10, 23], [6, 22], [14, 23], [2, 22], [67, 16]], "locations": ["Grass Land 4 - Enemy 4 (Kapar)", "Grass Land 4 - Maxim Tomato (Zebon Right)"], "music": 10}, {"name": "Grass Land 4 - 2", "level": 1, "stage": 4, "room": 2, "pointer": 3039401, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 4, "x": 56, "y": 72, "name": "Grass Land 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": [], "music": 9}, {"name": "Grass Land 4 - 3", "level": 1, "stage": 4, "room": 3, "pointer": 3722714, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 280, "x": 856, "y": 224, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Gordo)"}, {"idx": 22, "pointer": 480, "x": 1352, "y": 112, "etype": 22, "vtype": 0, "name": "Grass Land 4 - 1-Up (Gordo)"}], "consumables_pointer": 288, "enemies": ["Glunk", "Oro"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 5, "x": 72, "y": 200, "name": "Grass Land 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [55, 16], [16, 16], [25, 16], [14, 23], [0, 22], [2, 22], [4, 22]], "locations": ["Grass Land 4 - Enemy 5 (Glunk)", "Grass Land 4 - Enemy 6 (Oro)", "Grass Land 4 - Maxim Tomato (Gordo)", "Grass Land 4 - 1-Up (Gordo)"], "music": 10}, {"name": "Grass Land 4 - 4", "level": 1, "stage": 4, "room": 4, "pointer": 3304980, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 208, "x": 488, "y": 64, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Cliff)"}], "consumables_pointer": 160, "enemies": [], "default_exits": [{"room": 8, "unkn1": 94, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [2, 22], [54, 16], [1, 16], [40, 16], [14, 23]], "locations": ["Grass Land 4 - Maxim Tomato (Cliff)"], "music": 10}, {"name": "Grass Land 4 - 5", "level": 1, "stage": 4, "room": 5, "pointer": 3498127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 2, "unkn1": 61, "unkn2": 13, "x": 56, "y": 72, "name": "Grass Land 4 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 61, "unkn2": 18, "x": 56, "y": 200, "name": "Grass Land 4 - 5 Exit 1", "access_rule": []}], "entity_load": [[72, 16], [43, 16], [4, 22], [14, 23], [10, 23], [3, 16]], "locations": ["Grass Land 4 - Enemy 7 (Peran)"], "music": 10}, {"name": "Grass Land 4 - 6", "level": 1, "stage": 4, "room": 6, "pointer": 3160191, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 28, "unkn2": 4, "x": 72, "y": 376, "name": "Grass Land 4 - 6 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 28, "unkn2": 12, "x": 72, "y": 440, "name": "Grass Land 4 - 6 Exit 1", "access_rule": []}], "entity_load": [[3, 19], [6, 23]], "locations": [], "music": 10}, {"name": "Grass Land 4 - 7", "level": 1, "stage": 4, "room": 7, "pointer": 3035801, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 12, "x": 56, "y": 200, "name": "Grass Land 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Grass Land 4 - Miniboss 1 (Boboo)"], "music": 4}, {"name": "Grass Land 4 - 8", "level": 1, "stage": 4, "room": 8, "pointer": 2989794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[3, 19], [42, 19]], "locations": ["Grass Land 4 - Chao & Goku"], "music": 8}, {"name": "Grass Land 4 - 9", "level": 1, "stage": 4, "room": 9, "pointer": 3043518, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 9, "unkn2": 5, "x": 696, "y": 296, "name": "Grass Land 4 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 4 - Animal 1", "Grass Land 4 - Animal 2"], "music": 38}, {"name": "Grass Land 4 - 10", "level": 1, "stage": 4, "room": 10, "pointer": 2888425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 4 - Complete"], "music": 5}, {"name": "Grass Land 5 - 0", "level": 1, "stage": 5, "room": 0, "pointer": 3303565, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 1, "unkn1": 120, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [4, 22], [14, 23], [6, 23], [11, 16], [89, 16]], "locations": ["Grass Land 5 - Enemy 1 (Propeller)", "Grass Land 5 - Enemy 2 (Broom Hatter)", "Grass Land 5 - Enemy 3 (Bouncy)"], "music": 11}, {"name": "Grass Land 5 - 1", "level": 1, "stage": 5, "room": 1, "pointer": 3048718, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 3, "unkn1": 18, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 21, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 36, "unkn2": 9, "x": 56, "y": 88, "name": "Grass Land 5 - 1 Exit 2", "access_rule": []}], "entity_load": [[27, 16], [14, 23]], "locations": ["Grass Land 5 - Enemy 4 (Sir Kibble)"], "music": 11}, {"name": "Grass Land 5 - 2", "level": 1, "stage": 5, "room": 2, "pointer": 3327019, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sasuke", "Nruff"], "default_exits": [{"room": 7, "unkn1": 121, "unkn2": 6, "x": 56, "y": 72, "name": "Grass Land 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [4, 22], [30, 16], [15, 16], [1, 16]], "locations": ["Grass Land 5 - Enemy 5 (Waddle Dee)", "Grass Land 5 - Enemy 6 (Sasuke)", "Grass Land 5 - Enemy 7 (Nruff)"], "music": 11}, {"name": "Grass Land 5 - 3", "level": 1, "stage": 5, "room": 3, "pointer": 2966459, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 312, "y": 72, "name": "Grass Land 5 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 1", "Grass Land 5 - Animal 2"], "music": 38}, {"name": "Grass Land 5 - 4", "level": 1, "stage": 5, "room": 4, "pointer": 2973509, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 360, "y": 72, "name": "Grass Land 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 3", "Grass Land 5 - Animal 4"], "music": 38}, {"name": "Grass Land 5 - 5", "level": 1, "stage": 5, "room": 5, "pointer": 2962351, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[4, 19], [42, 19]], "locations": ["Grass Land 5 - Mine"], "music": 8}, {"name": "Grass Land 5 - 6", "level": 1, "stage": 5, "room": 6, "pointer": 2886738, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 5 - Complete"], "music": 5}, {"name": "Grass Land 5 - 7", "level": 1, "stage": 5, "room": 7, "pointer": 3255423, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [4, 22], [14, 23]], "locations": ["Grass Land 5 - Enemy 8 (Tick)"], "music": 11}, {"name": "Grass Land 6 - 0", "level": 1, "stage": 6, "room": 0, "pointer": 3376872, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Togezo", "Bronto Burt", "Cappy"], "default_exits": [{"room": 6, "unkn1": 51, "unkn2": 9, "x": 216, "y": 152, "name": "Grass Land 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 96, "unkn2": 9, "x": 216, "y": 1144, "name": "Grass Land 6 - 0 Exit 1", "access_rule": []}], "entity_load": [[12, 16], [18, 16], [2, 16], [41, 16], [4, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 1 (Como)", "Grass Land 6 - Enemy 2 (Togezo)", "Grass Land 6 - Enemy 3 (Bronto Burt)", "Grass Land 6 - Enemy 4 (Cappy)"], "music": 20}, {"name": "Grass Land 6 - 1", "level": 1, "stage": 6, "room": 1, "pointer": 3395125, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 192, "x": 104, "y": 1144, "etype": 22, "vtype": 0, "name": "Grass Land 6 - 1-Up (Tower)"}], "consumables_pointer": 256, "enemies": ["Bobo", "Mariel"], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 5, "x": 72, "y": 88, "name": "Grass Land 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [5, 19], [45, 16], [0, 22], [4, 22], [14, 23], [55, 16]], "locations": ["Grass Land 6 - Enemy 5 (Bobo)", "Grass Land 6 - Enemy 6 (Mariel)", "Grass Land 6 - 1-Up (Tower)"], "music": 20}, {"name": "Grass Land 6 - 2", "level": 1, "stage": 6, "room": 2, "pointer": 3375177, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter"], "default_exits": [{"room": 3, "unkn1": 93, "unkn2": 6, "x": 200, "y": 152, "name": "Grass Land 6 - 2 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 49, "unkn2": 7, "x": 216, "y": 104, "name": "Grass Land 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[11, 16], [45, 16], [41, 16], [4, 22], [32, 16], [14, 23]], "locations": ["Grass Land 6 - Enemy 7 (Yaban)", "Grass Land 6 - Enemy 8 (Broom Hatter)"], "music": 20}, {"name": "Grass Land 6 - 3", "level": 1, "stage": 6, "room": 3, "pointer": 3322977, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Apolo", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 52, "x": 72, "y": 104, "name": "Grass Land 6 - 3 Exit 0", "access_rule": []}], "entity_load": [[41, 16], [49, 16], [30, 16], [14, 23], [4, 22]], "locations": ["Grass Land 6 - Enemy 9 (Apolo)", "Grass Land 6 - Enemy 10 (Sasuke)"], "music": 20}, {"name": "Grass Land 6 - 4", "level": 1, "stage": 6, "room": 4, "pointer": 3490819, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 192, "x": 40, "y": 104, "etype": 22, "vtype": 1, "name": "Grass Land 6 - 1-Up (Falling)"}], "consumables_pointer": 176, "enemies": ["Rocky"], "default_exits": [{"room": 5, "unkn1": 145, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [4, 22], [49, 16], [61, 16], [3, 16], [1, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 11 (Rocky)", "Grass Land 6 - 1-Up (Falling)"], "music": 20}, {"name": "Grass Land 6 - 5", "level": 1, "stage": 6, "room": 5, "pointer": 3076769, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 19], [42, 19]], "locations": ["Grass Land 6 - Pierre"], "music": 8}, {"name": "Grass Land 6 - 6", "level": 1, "stage": 6, "room": 6, "pointer": 3047576, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 9, "x": 840, "y": 152, "name": "Grass Land 6 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 1", "Grass Land 6 - Animal 2"], "music": 39}, {"name": "Grass Land 6 - 7", "level": 1, "stage": 6, "room": 7, "pointer": 3022909, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 808, "y": 120, "name": "Grass Land 6 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 3", "Grass Land 6 - Animal 4"], "music": 38}, {"name": "Grass Land 6 - 8", "level": 1, "stage": 6, "room": 8, "pointer": 2884569, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 6 - Complete"], "music": 5}, {"name": "Grass Land Boss - 0", "level": 1, "stage": 7, "room": 0, "pointer": 2984105, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[0, 18]], "locations": ["Grass Land - Boss (Whispy Woods) Purified", "Level 1 Boss - Defeated", "Level 1 Boss - Purified"], "music": 2}, {"name": "Ripple Field 1 - 0", "level": 2, "stage": 1, "room": 0, "pointer": 3279855, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Glunk", "Broom Hatter", "Cappy"], "default_exits": [{"room": 2, "unkn1": 102, "unkn2": 8, "x": 56, "y": 152, "name": "Ripple Field 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[16, 16], [0, 16], [12, 16], [11, 16], [14, 23]], "locations": ["Ripple Field 1 - Enemy 1 (Waddle Dee)", "Ripple Field 1 - Enemy 2 (Glunk)", "Ripple Field 1 - Enemy 3 (Broom Hatter)", "Ripple Field 1 - Enemy 4 (Cappy)"], "music": 15}, {"name": "Ripple Field 1 - 1", "level": 2, "stage": 1, "room": 1, "pointer": 3588688, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 11, "x": 40, "y": 232, "name": "Ripple Field 1 - 1 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 108, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 138, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [2, 16], [3, 16], [7, 16]], "locations": ["Ripple Field 1 - Enemy 5 (Bronto Burt)", "Ripple Field 1 - Enemy 6 (Rocky)", "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 1 - 2", "level": 2, "stage": 1, "room": 2, "pointer": 2955848, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 18, "unkn2": 9, "x": 56, "y": 168, "name": "Ripple Field 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 1 - Animal 1", "Ripple Field 1 - Animal 2"], "music": 40}, {"name": "Ripple Field 1 - 3", "level": 2, "stage": 1, "room": 3, "pointer": 3558828, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin"], "default_exits": [{"room": 4, "unkn1": 171, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[73, 16], [6, 22], [14, 23], [4, 22], [0, 16], [10, 23]], "locations": ["Ripple Field 1 - Enemy 8 (Bobin)"], "music": 15}, {"name": "Ripple Field 1 - 4", "level": 2, "stage": 1, "room": 4, "pointer": 2974271, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [42, 19]], "locations": ["Ripple Field 1 - Kamuribana"], "music": 8}, {"name": "Ripple Field 1 - 5", "level": 2, "stage": 1, "room": 5, "pointer": 3051513, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 264, "name": "Ripple Field 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 6", "level": 2, "stage": 1, "room": 6, "pointer": 3049838, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1752, "y": 264, "name": "Ripple Field 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 7", "level": 2, "stage": 1, "room": 7, "pointer": 3066407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 2232, "y": 264, "name": "Ripple Field 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[7, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 8", "level": 2, "stage": 1, "room": 8, "pointer": 2889148, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 1 - Complete"], "music": 5}, {"name": "Ripple Field 2 - 0", "level": 2, "stage": 2, "room": 0, "pointer": 3342336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Coconut", "Blipper", "Sasuke"], "default_exits": [{"room": 1, "unkn1": 103, "unkn2": 15, "x": 56, "y": 104, "name": "Ripple Field 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[5, 22], [34, 16], [30, 16], [21, 16], [14, 23], [4, 22], [18, 16]], "locations": ["Ripple Field 2 - Enemy 1 (Togezo)", "Ripple Field 2 - Enemy 2 (Coconut)", "Ripple Field 2 - Enemy 3 (Blipper)", "Ripple Field 2 - Enemy 4 (Sasuke)"], "music": 10}, {"name": "Ripple Field 2 - 1", "level": 2, "stage": 2, "room": 1, "pointer": 3084099, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 23, "unkn2": 8, "x": 72, "y": 248, "name": "Ripple Field 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 1", "Ripple Field 2 - Animal 2"], "music": 39}, {"name": "Ripple Field 2 - 2", "level": 2, "stage": 2, "room": 2, "pointer": 3451207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 4, "unkn1": 31, "unkn2": 5, "x": 72, "y": 152, "name": "Ripple Field 2 - 2 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 96, "unkn2": 6, "x": 56, "y": 152, "name": "Ripple Field 2 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 56, "unkn2": 17, "x": 136, "y": 264, "name": "Ripple Field 2 - 2 Exit 2", "access_rule": []}], "entity_load": [[29, 16], [47, 16], [1, 16], [46, 16], [14, 23]], "locations": ["Ripple Field 2 - Enemy 5 (Kany)"], "music": 10}, {"name": "Ripple Field 2 - 3", "level": 2, "stage": 2, "room": 3, "pointer": 3674327, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 480, "x": 1384, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 2 - Maxim Tomato (Currents)"}, {"idx": 10, "pointer": 520, "x": 1456, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 2 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Glunk"], "default_exits": [{"room": 2, "unkn1": 134, "unkn2": 5, "x": 40, "y": 136, "name": "Ripple Field 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [14, 23], [16, 16], [21, 16], [4, 22]], "locations": ["Ripple Field 2 - Enemy 6 (Glunk)", "Ripple Field 2 - Maxim Tomato (Currents)", "Ripple Field 2 - 1-Up (Currents)"], "music": 10}, {"name": "Ripple Field 2 - 4", "level": 2, "stage": 2, "room": 4, "pointer": 2972744, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 3, "unkn2": 9, "x": 520, "y": 88, "name": "Ripple Field 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[8, 19]], "locations": [], "music": 10}, {"name": "Ripple Field 2 - 5", "level": 2, "stage": 2, "room": 5, "pointer": 3109710, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 16, "x": 1048, "y": 280, "name": "Ripple Field 2 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 3", "Ripple Field 2 - Animal 4"], "music": 38}, {"name": "Ripple Field 2 - 6", "level": 2, "stage": 2, "room": 6, "pointer": 2973127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[8, 19], [42, 19]], "locations": ["Ripple Field 2 - Bakasa"], "music": 8}, {"name": "Ripple Field 2 - 7", "level": 2, "stage": 2, "room": 7, "pointer": 2890353, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 2 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 0", "level": 2, "stage": 3, "room": 0, "pointer": 3517254, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 105, "unkn2": 8, "x": 40, "y": 104, "name": "Ripple Field 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[21, 16], [57, 16], [62, 16], [67, 16], [4, 22], [14, 23]], "locations": ["Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", "Ripple Field 3 - Enemy 2 (Kapar)", "Ripple Field 3 - Enemy 3 (Blipper)"], "music": 18}, {"name": "Ripple Field 3 - 1", "level": 2, "stage": 3, "room": 1, "pointer": 3604480, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 320, "x": 832, "y": 152, "etype": 22, "vtype": 2, "name": "Ripple Field 3 - Maxim Tomato (Cove)"}, {"idx": 13, "pointer": 424, "x": 1128, "y": 384, "etype": 22, "vtype": 0, "name": "Ripple Field 3 - 1-Up (Cutter/Spark)"}], "consumables_pointer": 160, "enemies": ["Sparky", "Glunk", "Joe"], "default_exits": [{"room": 7, "unkn1": 80, "unkn2": 24, "x": 104, "y": 328, "name": "Ripple Field 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[13, 23], [14, 23], [91, 16], [16, 16], [2, 22], [8, 16], [0, 22]], "locations": ["Ripple Field 3 - Enemy 4 (Sparky)", "Ripple Field 3 - Enemy 5 (Glunk)", "Ripple Field 3 - Enemy 6 (Joe)", "Ripple Field 3 - Maxim Tomato (Cove)", "Ripple Field 3 - 1-Up (Cutter/Spark)"], "music": 18}, {"name": "Ripple Field 3 - 2", "level": 2, "stage": 3, "room": 2, "pointer": 3715428, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobo"], "default_exits": [{"room": 4, "unkn1": 118, "unkn2": 9, "x": 56, "y": 152, "name": "Ripple Field 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [21, 16], [4, 22], [46, 16], [47, 16], [5, 16], [14, 23]], "locations": ["Ripple Field 3 - Enemy 7 (Bobo)"], "music": 18}, {"name": "Ripple Field 3 - 3", "level": 2, "stage": 3, "room": 3, "pointer": 3071919, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 15, "unkn2": 6, "x": 56, "y": 104, "name": "Ripple Field 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 3 - Animal 1", "Ripple Field 3 - Animal 2"], "music": 39}, {"name": "Ripple Field 3 - 4", "level": 2, "stage": 3, "room": 4, "pointer": 2970810, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": ["Ripple Field 3 - Elieel"], "music": 8}, {"name": "Ripple Field 3 - 5", "level": 2, "stage": 3, "room": 5, "pointer": 2987502, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 232, "y": 88, "name": "Ripple Field 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": [], "music": 31}, {"name": "Ripple Field 3 - 6", "level": 2, "stage": 3, "room": 6, "pointer": 2888666, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 3 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 7", "level": 2, "stage": 3, "room": 7, "pointer": 3161120, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 3, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 3 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 11, "unkn2": 20, "x": 56, "y": 216, "name": "Ripple Field 3 - 7 Exit 1", "access_rule": []}], "entity_load": [[57, 16]], "locations": [], "music": 18}, {"name": "Ripple Field 4 - 0", "level": 2, "stage": 4, "room": 0, "pointer": 3082540, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Stone)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Mony"], "default_exits": [{"room": 6, "unkn1": 4, "unkn2": 16, "x": 72, "y": 232, "name": "Ripple Field 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [79, 16], [80, 16], [81, 16], [4, 22], [20, 16], [77, 16]], "locations": ["Ripple Field 4 - Enemy 1 (Bukiset (Stone))", "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", "Ripple Field 4 - Enemy 5 (Mony)"], "music": 15}, {"name": "Ripple Field 4 - 1", "level": 2, "stage": 4, "room": 1, "pointer": 2964846, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 72, "y": 88, "name": "Ripple Field 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Ripple Field 4 - Miniboss 1 (Captain Stitch)"], "music": 4}, {"name": "Ripple Field 4 - 2", "level": 2, "stage": 4, "room": 2, "pointer": 3018503, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)"], "default_exits": [{"room": 11, "unkn1": 25, "unkn2": 5, "x": 56, "y": 88, "name": "Ripple Field 4 - 2 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 25, "unkn2": 15, "x": 56, "y": 216, "name": "Ripple Field 4 - 2 Exit 1", "access_rule": []}], "entity_load": [[10, 19], [76, 16]], "locations": ["Ripple Field 4 - Enemy 6 (Bukiset (Burning))"], "music": 15}, {"name": "Ripple Field 4 - 3", "level": 2, "stage": 4, "room": 3, "pointer": 2988166, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[10, 19], [42, 19]], "locations": ["Ripple Field 4 - Toad & Little Toad"], "music": 8}, {"name": "Ripple Field 4 - 4", "level": 2, "stage": 4, "room": 4, "pointer": 2885533, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 4 - Complete"], "music": 5}, {"name": "Ripple Field 4 - 5", "level": 2, "stage": 4, "room": 5, "pointer": 3042349, "animal_pointers": [222, 230, 238], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 5, "x": 360, "y": 120, "name": "Ripple Field 4 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 488, "y": 120, "name": "Ripple Field 4 - 5 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 16, "unkn2": 5, "x": 104, "y": 88, "name": "Ripple Field 4 - 5 Exit 2", "access_rule": []}, {"room": 6, "unkn1": 10, "unkn2": 11, "x": 440, "y": 216, "name": "Ripple Field 4 - 5 Exit 3", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 4 - Animal 1", "Ripple Field 4 - Animal 2", "Ripple Field 4 - Animal 3"], "music": 40}, {"name": "Ripple Field 4 - 6", "level": 2, "stage": 4, "room": 6, "pointer": 3234805, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Blipper"], "default_exits": [{"room": 5, "unkn1": 21, "unkn2": 7, "x": 104, "y": 88, "name": "Ripple Field 4 - 6 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 31, "unkn2": 7, "x": 232, "y": 88, "name": "Ripple Field 4 - 6 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 26, "unkn2": 13, "x": 184, "y": 184, "name": "Ripple Field 4 - 6 Exit 2", "access_rule": []}, {"room": 12, "unkn1": 48, "unkn2": 15, "x": 88, "y": 216, "name": "Ripple Field 4 - 6 Exit 3", "access_rule": []}], "entity_load": [[73, 16], [14, 23], [21, 16], [13, 23]], "locations": ["Ripple Field 4 - Enemy 7 (Bobin)", "Ripple Field 4 - Enemy 8 (Blipper)"], "music": 15}, {"name": "Ripple Field 4 - 7", "level": 2, "stage": 4, "room": 7, "pointer": 3155468, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 6, "x": 104, "y": 136, "name": "Ripple Field 4 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 18, "unkn2": 9, "x": 72, "y": 248, "name": "Ripple Field 4 - 7 Exit 1", "access_rule": []}], "entity_load": [[14, 23], [1, 16], [0, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 4 - 8", "level": 2, "stage": 4, "room": 8, "pointer": 3350031, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Oro"], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 22, "x": 184, "y": 440, "name": "Ripple Field 4 - 8 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 34, "unkn2": 22, "x": 296, "y": 440, "name": "Ripple Field 4 - 8 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 16, "unkn2": 72, "x": 168, "y": 152, "name": "Ripple Field 4 - 8 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 23, "unkn2": 72, "x": 120, "y": 152, "name": "Ripple Field 4 - 8 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [68, 16], [14, 23], [25, 16], [6, 23]], "locations": ["Ripple Field 4 - Enemy 9 (Como)", "Ripple Field 4 - Enemy 10 (Oro)"], "music": 15}, {"name": "Ripple Field 4 - 9", "level": 2, "stage": 4, "room": 9, "pointer": 3050397, "animal_pointers": [], "consumables": [{"idx": 29, "pointer": 200, "x": 88, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Stone)"}], "consumables_pointer": 176, "enemies": ["Gansan"], "default_exits": [{"room": 8, "unkn1": 11, "unkn2": 9, "x": 264, "y": 1144, "name": "Ripple Field 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[75, 16], [2, 22]], "locations": ["Ripple Field 4 - Enemy 11 (Gansan)", "Ripple Field 4 - Maxim Tomato (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 10", "level": 2, "stage": 4, "room": 10, "pointer": 3052069, "animal_pointers": [], "consumables": [{"idx": 30, "pointer": 192, "x": 200, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 4 - 1-Up (Stone)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 8, "unkn1": 6, "unkn2": 9, "x": 376, "y": 1144, "name": "Ripple Field 4 - 10 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [75, 16]], "locations": ["Ripple Field 4 - 1-Up (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 11", "level": 2, "stage": 4, "room": 11, "pointer": 3386974, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Kapar", "Squishy"], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 13, "x": 72, "y": 152, "name": "Ripple Field 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[22, 16], [67, 16], [14, 23], [62, 16], [0, 16]], "locations": ["Ripple Field 4 - Enemy 12 (Waddle Dee)", "Ripple Field 4 - Enemy 13 (Kapar)", "Ripple Field 4 - Enemy 14 (Squishy)"], "music": 15}, {"name": "Ripple Field 4 - 12", "level": 2, "stage": 4, "room": 12, "pointer": 3168339, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 8, "unkn1": 67, "unkn2": 7, "x": 88, "y": 1224, "name": "Ripple Field 4 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 75, "unkn2": 7, "x": 88, "y": 136, "name": "Ripple Field 4 - 12 Exit 1", "access_rule": []}], "entity_load": [[59, 16], [13, 23], [28, 16]], "locations": ["Ripple Field 4 - Enemy 15 (Nidoo)"], "music": 15}, {"name": "Ripple Field 4 - 13", "level": 2, "stage": 4, "room": 13, "pointer": 2958478, "animal_pointers": [], "consumables": [{"idx": 54, "pointer": 264, "x": 216, "y": 136, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Dark)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 12, "unkn1": 4, "unkn2": 8, "x": 1192, "y": 120, "name": "Ripple Field 4 - 13 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [2, 22], [59, 16]], "locations": ["Ripple Field 4 - Maxim Tomato (Dark)"], "music": 15}, {"name": "Ripple Field 5 - 0", "level": 2, "stage": 5, "room": 0, "pointer": 3240369, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 9, "unkn2": 43, "x": 88, "y": 344, "name": "Ripple Field 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 1", "level": 2, "stage": 5, "room": 1, "pointer": 3547528, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 4, "x": 184, "y": 344, "name": "Ripple Field 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 2", "level": 2, "stage": 5, "room": 2, "pointer": 3611327, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Joe"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 21, "x": 56, "y": 184, "name": "Ripple Field 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 1 (Glunk)", "Ripple Field 5 - Enemy 2 (Joe)"], "music": 16}, {"name": "Ripple Field 5 - 3", "level": 2, "stage": 5, "room": 3, "pointer": 3926157, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 1258, "x": 1488, "y": 192, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Currents)"}, {"idx": 31, "pointer": 1290, "x": 1520, "y": 192, "etype": 22, "vtype": 0, "name": "Ripple Field 5 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Bobin", "Mony", "Squishy"], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 38, "x": 152, "y": 152, "name": "Ripple Field 5 - 3 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 95, "unkn2": 38, "x": 248, "y": 1064, "name": "Ripple Field 5 - 3 Exit 1", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [6, 22], [14, 23], [1, 16], [73, 16], [22, 16], [20, 16]], "locations": ["Ripple Field 5 - Enemy 3 (Bobin)", "Ripple Field 5 - Enemy 4 (Mony)", "Ripple Field 5 - Enemy 5 (Squishy)", "Ripple Field 5 - Maxim Tomato (Currents)", "Ripple Field 5 - 1-Up (Currents)"], "music": 16}, {"name": "Ripple Field 5 - 4", "level": 2, "stage": 5, "room": 4, "pointer": 3026639, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 4, "x": 232, "y": 152, "name": "Ripple Field 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 1"], "music": 40}, {"name": "Ripple Field 5 - 5", "level": 2, "stage": 5, "room": 5, "pointer": 3207333, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 56, "y": 72, "name": "Ripple Field 5 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 9, "x": 120, "y": 552, "name": "Ripple Field 5 - 5 Exit 1", "access_rule": ["Kine"]}], "entity_load": [[14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 6", "level": 2, "stage": 5, "room": 6, "pointer": 3485896, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 9, "unkn1": 121, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [22, 16], [14, 23], [13, 16], [11, 16], [32, 16]], "locations": ["Ripple Field 5 - Enemy 6 (Yaban)", "Ripple Field 5 - Enemy 7 (Broom Hatter)", "Ripple Field 5 - Enemy 8 (Bouncy)"], "music": 16}, {"name": "Ripple Field 5 - 7", "level": 2, "stage": 5, "room": 7, "pointer": 3752698, "animal_pointers": [], "consumables": [{"idx": 53, "pointer": 418, "x": 1512, "y": 608, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Exit)"}], "consumables_pointer": 352, "enemies": ["Sparky", "Rocky", "Babut"], "default_exits": [{"room": 10, "unkn1": 45, "unkn2": 31, "x": 152, "y": 152, "name": "Ripple Field 5 - 7 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 94, "unkn2": 40, "x": 88, "y": 200, "name": "Ripple Field 5 - 7 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [8, 16], [22, 16], [14, 23], [2, 22]], "locations": ["Ripple Field 5 - Enemy 9 (Sparky)", "Ripple Field 5 - Enemy 10 (Rocky)", "Ripple Field 5 - Enemy 11 (Babut)", "Ripple Field 5 - Maxim Tomato (Exit)"], "music": 16}, {"name": "Ripple Field 5 - 8", "level": 2, "stage": 5, "room": 8, "pointer": 3044682, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 8, "unkn2": 9, "x": 88, "y": 616, "name": "Ripple Field 5 - 8 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 2"], "music": 39}, {"name": "Ripple Field 5 - 9", "level": 2, "stage": 5, "room": 9, "pointer": 2963193, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[11, 19], [42, 19]], "locations": ["Ripple Field 5 - Mama Pitch"], "music": 8}, {"name": "Ripple Field 5 - 10", "level": 2, "stage": 5, "room": 10, "pointer": 3042934, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 8, "unkn2": 9, "x": 712, "y": 504, "name": "Ripple Field 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 12 (Galbo)"], "music": 16}, {"name": "Ripple Field 5 - 11", "level": 2, "stage": 5, "room": 11, "pointer": 2886256, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 5 - Complete"], "music": 5}, {"name": "Ripple Field 6 - 0", "level": 2, "stage": 6, "room": 0, "pointer": 2949576, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 1, "unkn1": 56, "unkn2": 7, "x": 40, "y": 152, "name": "Ripple Field 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[29, 16], [13, 23]], "locations": ["Ripple Field 6 - Enemy 1 (Kany)"], "music": 15}, {"name": "Ripple Field 6 - 1", "level": 2, "stage": 6, "room": 1, "pointer": 2971200, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 23, "unkn2": 9, "x": 56, "y": 264, "name": "Ripple Field 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 1", "Ripple Field 6 - Animal 2", "Ripple Field 6 - Animal 3"], "music": 38}, {"name": "Ripple Field 6 - 2", "level": 2, "stage": 6, "room": 2, "pointer": 3637749, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 95, "unkn2": 9, "x": 104, "y": 872, "name": "Ripple Field 6 - 2 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 50, "unkn2": 22, "x": 184, "y": 88, "name": "Ripple Field 6 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 45, "unkn2": 26, "x": 88, "y": 88, "name": "Ripple Field 6 - 2 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 55, "unkn2": 26, "x": 248, "y": 88, "name": "Ripple Field 6 - 2 Exit 3", "access_rule": []}], "entity_load": [[52, 16], [13, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 3", "level": 2, "stage": 6, "room": 3, "pointer": 3092564, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 5, "x": 744, "y": 424, "name": "Ripple Field 6 - 3 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 16, "unkn2": 5, "x": 872, "y": 424, "name": "Ripple Field 6 - 3 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 4", "level": 2, "stage": 6, "room": 4, "pointer": 3133247, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 5, "x": 824, "y": 360, "name": "Ripple Field 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[12, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 5", "level": 2, "stage": 6, "room": 5, "pointer": 3507762, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 76, "unkn2": 4, "x": 680, "y": 72, "name": "Ripple Field 6 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 6, "x": 440, "y": 104, "name": "Ripple Field 6 - 5 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 10, "x": 440, "y": 168, "name": "Ripple Field 6 - 5 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 88, "unkn2": 10, "x": 104, "y": 152, "name": "Ripple Field 6 - 5 Exit 3", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 12, "x": 200, "y": 200, "name": "Ripple Field 6 - 5 Exit 4", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 12, "x": 680, "y": 200, "name": "Ripple Field 6 - 5 Exit 5", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 16, "x": 680, "y": 264, "name": "Ripple Field 6 - 5 Exit 6", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 6", "level": 2, "stage": 6, "room": 6, "pointer": 3211264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 10, "x": 72, "y": 168, "name": "Ripple Field 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 7", "level": 2, "stage": 6, "room": 7, "pointer": 3586039, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Kapar", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 5, "unkn1": 134, "unkn2": 16, "x": 72, "y": 168, "name": "Ripple Field 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [3, 16], [67, 16], [51, 16], [7, 16]], "locations": ["Ripple Field 6 - Enemy 2 (KeKe)", "Ripple Field 6 - Enemy 3 (Kapar)", "Ripple Field 6 - Enemy 4 (Rocky)", "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 6 - 8", "level": 2, "stage": 6, "room": 8, "pointer": 3621483, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Coconut", "Sasuke", "Nruff"], "default_exits": [{"room": 10, "unkn1": 70, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 6 - 8 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 26, "unkn2": 54, "x": 72, "y": 152, "name": "Ripple Field 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[89, 16], [15, 16], [30, 16], [34, 16], [14, 23]], "locations": ["Ripple Field 6 - Enemy 6 (Propeller)", "Ripple Field 6 - Enemy 7 (Coconut)", "Ripple Field 6 - Enemy 8 (Sasuke)", "Ripple Field 6 - Enemy 9 (Nruff)"], "music": 15}, {"name": "Ripple Field 6 - 9", "level": 2, "stage": 6, "room": 9, "pointer": 2954523, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 3, "unkn2": 9, "x": 408, "y": 872, "name": "Ripple Field 6 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 4"], "music": 39}, {"name": "Ripple Field 6 - 10", "level": 2, "stage": 6, "room": 10, "pointer": 3069438, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[12, 19], [42, 19]], "locations": ["Ripple Field 6 - HB-002"], "music": 8}, {"name": "Ripple Field 6 - 11", "level": 2, "stage": 6, "room": 11, "pointer": 2886497, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 6 - Complete"], "music": 5}, {"name": "Ripple Field Boss - 0", "level": 2, "stage": 7, "room": 0, "pointer": 3157370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[7, 18]], "locations": ["Ripple Field - Boss (Acro) Purified", "Level 2 Boss - Defeated", "Level 2 Boss - Purified"], "music": 2}, {"name": "Sand Canyon 1 - 0", "level": 3, "stage": 1, "room": 0, "pointer": 3524267, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo"], "default_exits": [{"room": 5, "unkn1": 196, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [1, 16], [26, 16], [2, 16]], "locations": ["Sand Canyon 1 - Enemy 1 (Bronto Burt)", "Sand Canyon 1 - Enemy 2 (Galbo)"], "music": 13}, {"name": "Sand Canyon 1 - 1", "level": 3, "stage": 1, "room": 1, "pointer": 3163860, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 34, "unkn2": 5, "x": 104, "y": 408, "name": "Sand Canyon 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 1 - Animal 1", "Sand Canyon 1 - Animal 2"], "music": 38}, {"name": "Sand Canyon 1 - 2", "level": 3, "stage": 1, "room": 2, "pointer": 3512532, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro"], "default_exits": [{"room": 3, "unkn1": 73, "unkn2": 6, "x": 56, "y": 120, "name": "Sand Canyon 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [26, 16], [25, 16], [4, 22], [14, 23], [1, 23], [0, 23], [4, 23]], "locations": ["Sand Canyon 1 - Enemy 3 (Oro)"], "music": 13}, {"name": "Sand Canyon 1 - 3", "level": 3, "stage": 1, "room": 3, "pointer": 3719146, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Propeller", "Gansan", "Babut"], "default_exits": [{"room": 4, "unkn1": 25, "unkn2": 73, "x": 72, "y": 280, "name": "Sand Canyon 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [75, 16], [43, 16], [8, 16]], "locations": ["Sand Canyon 1 - Enemy 4 (Sparky)", "Sand Canyon 1 - Enemy 5 (Propeller)", "Sand Canyon 1 - Enemy 6 (Gansan)", "Sand Canyon 1 - Enemy 7 (Babut)"], "music": 13}, {"name": "Sand Canyon 1 - 4", "level": 3, "stage": 1, "room": 4, "pointer": 3421212, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Dogon", "Bouncy", "Pteran"], "default_exits": [{"room": 7, "unkn1": 196, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[90, 16], [13, 16], [40, 16], [14, 23], [39, 16]], "locations": ["Sand Canyon 1 - Enemy 8 (Loud)", "Sand Canyon 1 - Enemy 9 (Dogon)", "Sand Canyon 1 - Enemy 10 (Bouncy)", "Sand Canyon 1 - Enemy 11 (Pteran)"], "music": 13}, {"name": "Sand Canyon 1 - 5", "level": 3, "stage": 1, "room": 5, "pointer": 3203325, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Polof"], "default_exits": [{"room": 6, "unkn1": 32, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 1 - 5 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 46, "unkn2": 9, "x": 56, "y": 344, "name": "Sand Canyon 1 - 5 Exit 1", "access_rule": []}], "entity_load": [[9, 16]], "locations": ["Sand Canyon 1 - Enemy 12 (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 6", "level": 3, "stage": 1, "room": 6, "pointer": 3138524, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 248, "x": 168, "y": 104, "etype": 22, "vtype": 0, "name": "Sand Canyon 1 - 1-Up (Polof)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 5, "unkn1": 5, "unkn2": 9, "x": 536, "y": 152, "name": "Sand Canyon 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [0, 22]], "locations": ["Sand Canyon 1 - 1-Up (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 7", "level": 3, "stage": 1, "room": 7, "pointer": 2988822, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [42, 19]], "locations": ["Sand Canyon 1 - Geromuzudake"], "music": 8}, {"name": "Sand Canyon 1 - 8", "level": 3, "stage": 1, "room": 8, "pointer": 2885292, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 1 - Complete"], "music": 5}, {"name": "Sand Canyon 2 - 0", "level": 3, "stage": 2, "room": 0, "pointer": 3668370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Doka", "Boten"], "default_exits": [{"room": 1, "unkn1": 178, "unkn2": 8, "x": 184, "y": 104, "name": "Sand Canyon 2 - 0 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 244, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 2 - 0 Exit 1", "access_rule": []}], "entity_load": [[35, 16], [33, 16], [14, 23], [51, 16], [47, 16], [46, 16]], "locations": ["Sand Canyon 2 - Enemy 1 (KeKe)", "Sand Canyon 2 - Enemy 2 (Doka)", "Sand Canyon 2 - Enemy 3 (Boten)"], "music": 21}, {"name": "Sand Canyon 2 - 1", "level": 3, "stage": 2, "room": 1, "pointer": 2952738, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 10, "unkn2": 6, "x": 2872, "y": 136, "name": "Sand Canyon 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 2 - Animal 1", "Sand Canyon 2 - Animal 2"], "music": 40}, {"name": "Sand Canyon 2 - 2", "level": 3, "stage": 2, "room": 2, "pointer": 3531156, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 9, "unkn1": 45, "unkn2": 60, "x": 88, "y": 184, "name": "Sand Canyon 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[6, 23], [89, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 4 (Propeller)"], "music": 21}, {"name": "Sand Canyon 2 - 3", "level": 3, "stage": 2, "room": 3, "pointer": 3263731, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Sasuke", "Como"], "default_exits": [{"room": 4, "unkn1": 63, "unkn2": 5, "x": 88, "y": 184, "name": "Sand Canyon 2 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 68, "unkn2": 5, "x": 184, "y": 184, "name": "Sand Canyon 2 - 3 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 73, "unkn2": 5, "x": 248, "y": 184, "name": "Sand Canyon 2 - 3 Exit 2", "access_rule": []}, {"room": 5, "unkn1": 130, "unkn2": 9, "x": 72, "y": 312, "name": "Sand Canyon 2 - 3 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [8, 16], [30, 16], [0, 16]], "locations": ["Sand Canyon 2 - Enemy 5 (Waddle Dee)", "Sand Canyon 2 - Enemy 6 (Sparky)", "Sand Canyon 2 - Enemy 7 (Sasuke)", "Sand Canyon 2 - Enemy 8 (Como)"], "music": 21}, {"name": "Sand Canyon 2 - 4", "level": 3, "stage": 2, "room": 4, "pointer": 3076300, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 228, "x": 168, "y": 72, "etype": 22, "vtype": 0, "name": "Sand Canyon 2 - 1-Up (Enclave)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 5, "unkn2": 11, "x": 1016, "y": 88, "name": "Sand Canyon 2 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 10, "unkn2": 11, "x": 1112, "y": 88, "name": "Sand Canyon 2 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 11, "x": 1176, "y": 88, "name": "Sand Canyon 2 - 4 Exit 2", "access_rule": []}], "entity_load": [[14, 23], [0, 22], [4, 22]], "locations": ["Sand Canyon 2 - 1-Up (Enclave)"], "music": 21}, {"name": "Sand Canyon 2 - 5", "level": 3, "stage": 2, "room": 5, "pointer": 3302133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 6, "unkn1": 63, "unkn2": 15, "x": 120, "y": 216, "name": "Sand Canyon 2 - 5 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 71, "unkn2": 18, "x": 152, "y": 136, "name": "Sand Canyon 2 - 5 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 130, "unkn2": 19, "x": 72, "y": 952, "name": "Sand Canyon 2 - 5 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 56, "unkn2": 23, "x": 88, "y": 216, "name": "Sand Canyon 2 - 5 Exit 3", "access_rule": []}], "entity_load": [[80, 16], [78, 16], [81, 16], [83, 16], [79, 16], [82, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))"], "music": 21}, {"name": "Sand Canyon 2 - 6", "level": 3, "stage": 2, "room": 6, "pointer": 3800612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 5, "unkn1": 17, "unkn2": 13, "x": 1144, "y": 248, "name": "Sand Canyon 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 15 (Nidoo)"], "music": 21}, {"name": "Sand Canyon 2 - 7", "level": 3, "stage": 2, "room": 7, "pointer": 3073888, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 15, "unkn2": 8, "x": 1016, "y": 296, "name": "Sand Canyon 2 - 7 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 5, "unkn2": 13, "x": 904, "y": 376, "name": "Sand Canyon 2 - 7 Exit 1", "access_rule": []}], "entity_load": [[15, 19]], "locations": [], "music": 21}, {"name": "Sand Canyon 2 - 8", "level": 3, "stage": 2, "room": 8, "pointer": 3061270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 5, "unkn1": 19, "unkn2": 13, "x": 1256, "y": 376, "name": "Sand Canyon 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 16 (Mariel)"], "music": 21}, {"name": "Sand Canyon 2 - 9", "level": 3, "stage": 2, "room": 9, "pointer": 3453286, "animal_pointers": [], "consumables": [{"idx": 51, "pointer": 240, "x": 1408, "y": 216, "etype": 22, "vtype": 2, "name": "Sand Canyon 2 - Maxim Tomato (Underwater)"}], "consumables_pointer": 128, "enemies": ["Yaban", "Wapod", "Squishy", "Pteran"], "default_exits": [{"room": 10, "unkn1": 246, "unkn2": 10, "x": 56, "y": 152, "name": "Sand Canyon 2 - 9 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [22, 16], [2, 22], [39, 16], [88, 16], [32, 16]], "locations": ["Sand Canyon 2 - Enemy 17 (Yaban)", "Sand Canyon 2 - Enemy 18 (Wapod)", "Sand Canyon 2 - Enemy 19 (Squishy)", "Sand Canyon 2 - Enemy 20 (Pteran)", "Sand Canyon 2 - Maxim Tomato (Underwater)"], "music": 21}, {"name": "Sand Canyon 2 - 10", "level": 3, "stage": 2, "room": 10, "pointer": 2994821, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 2 - 10 Exit 0", "access_rule": []}], "entity_load": [[15, 19], [42, 19]], "locations": ["Sand Canyon 2 - Auntie"], "music": 8}, {"name": "Sand Canyon 2 - 11", "level": 3, "stage": 2, "room": 11, "pointer": 2891799, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 2 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 0", "level": 3, "stage": 3, "room": 0, "pointer": 3544676, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Broom Hatter", "Rocky", "Gabon"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 57, "x": 104, "y": 152, "name": "Sand Canyon 3 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 11, "unkn2": 57, "x": 200, "y": 152, "name": "Sand Canyon 3 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 16, "unkn2": 57, "x": 296, "y": 152, "name": "Sand Canyon 3 - 0 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 23, "unkn2": 109, "x": 104, "y": 72, "name": "Sand Canyon 3 - 0 Exit 3", "access_rule": []}], "entity_load": [[24, 16], [3, 16], [11, 16], [27, 16]], "locations": ["Sand Canyon 3 - Enemy 1 (Sir Kibble)", "Sand Canyon 3 - Enemy 2 (Broom Hatter)", "Sand Canyon 3 - Enemy 3 (Rocky)", "Sand Canyon 3 - Enemy 4 (Gabon)"], "music": 16}, {"name": "Sand Canyon 3 - 1", "level": 3, "stage": 3, "room": 1, "pointer": 2965655, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 88, "y": 920, "name": "Sand Canyon 3 - 1 Exit 0", "access_rule": []}, {"room": 0, "unkn1": 11, "unkn2": 9, "x": 168, "y": 920, "name": "Sand Canyon 3 - 1 Exit 1", "access_rule": []}, {"room": 0, "unkn1": 17, "unkn2": 9, "x": 248, "y": 920, "name": "Sand Canyon 3 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 3 - Animal 1", "Sand Canyon 3 - Animal 2", "Sand Canyon 3 - Animal 3"], "music": 39}, {"name": "Sand Canyon 3 - 2", "level": 3, "stage": 3, "room": 2, "pointer": 3726270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 3, "unkn1": 184, "unkn2": 20, "x": 104, "y": 232, "name": "Sand Canyon 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[63, 16], [55, 16], [14, 23], [4, 23], [29, 16]], "locations": ["Sand Canyon 3 - Enemy 5 (Kany)"], "music": 16}, {"name": "Sand Canyon 3 - 3", "level": 3, "stage": 3, "room": 3, "pointer": 3416806, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 8, "unkn1": 130, "unkn2": 14, "x": 40, "y": 152, "name": "Sand Canyon 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [6, 23], [5, 23]], "locations": ["Sand Canyon 3 - Enemy 6 (Galbo)"], "music": 16}, {"name": "Sand Canyon 3 - 4", "level": 3, "stage": 3, "room": 4, "pointer": 3564419, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Sasuke"], "default_exits": [{"room": 5, "unkn1": 135, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[68, 16], [30, 16], [14, 23], [89, 16], [24, 16]], "locations": ["Sand Canyon 3 - Enemy 7 (Propeller)", "Sand Canyon 3 - Enemy 8 (Sasuke)"], "music": 16}, {"name": "Sand Canyon 3 - 5", "level": 3, "stage": 3, "room": 5, "pointer": 2973891, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": ["Sand Canyon 3 - Caramello"], "music": 8}, {"name": "Sand Canyon 3 - 6", "level": 3, "stage": 3, "room": 6, "pointer": 3247969, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod", "Bobo", "Babut", "Magoo"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 8, "x": 88, "y": 424, "name": "Sand Canyon 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[53, 16], [88, 16], [46, 16], [47, 16], [5, 16], [43, 16]], "locations": ["Sand Canyon 3 - Enemy 9 (Wapod)", "Sand Canyon 3 - Enemy 10 (Bobo)", "Sand Canyon 3 - Enemy 11 (Babut)", "Sand Canyon 3 - Enemy 12 (Magoo)"], "music": 16}, {"name": "Sand Canyon 3 - 7", "level": 3, "stage": 3, "room": 7, "pointer": 2887702, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 3 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 8", "level": 3, "stage": 3, "room": 8, "pointer": 2968057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 104, "y": 120, "name": "Sand Canyon 3 - 8 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": [], "music": 31}, {"name": "Sand Canyon 4 - 0", "level": 3, "stage": 4, "room": 0, "pointer": 3521954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Popon Ball", "Mariel", "Chilly"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 8, "x": 216, "y": 88, "name": "Sand Canyon 4 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 199, "unkn2": 15, "x": 104, "y": 88, "name": "Sand Canyon 4 - 0 Exit 1", "access_rule": []}], "entity_load": [[6, 16], [45, 16], [6, 23], [50, 16], [14, 23]], "locations": ["Sand Canyon 4 - Enemy 1 (Popon Ball)", "Sand Canyon 4 - Enemy 2 (Mariel)", "Sand Canyon 4 - Enemy 3 (Chilly)"], "music": 18}, {"name": "Sand Canyon 4 - 1", "level": 3, "stage": 4, "room": 1, "pointer": 2956289, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 5, "x": 1544, "y": 136, "name": "Sand Canyon 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 4 - Animal 1", "Sand Canyon 4 - Animal 2", "Sand Canyon 4 - Animal 3"], "music": 39}, {"name": "Sand Canyon 4 - 2", "level": 3, "stage": 4, "room": 2, "pointer": 3505360, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 328, "x": 2024, "y": 72, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Pacto)"}], "consumables_pointer": 160, "enemies": ["Tick", "Bronto Burt", "Babut"], "default_exits": [{"room": 3, "unkn1": 149, "unkn2": 14, "x": 88, "y": 216, "name": "Sand Canyon 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [2, 22], [43, 16], [2, 16], [48, 16]], "locations": ["Sand Canyon 4 - Enemy 4 (Tick)", "Sand Canyon 4 - Enemy 5 (Bronto Burt)", "Sand Canyon 4 - Enemy 6 (Babut)", "Sand Canyon 4 - Maxim Tomato (Pacto)"], "music": 18}, {"name": "Sand Canyon 4 - 3", "level": 3, "stage": 4, "room": 3, "pointer": 3412361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Joe", "Mony", "Blipper"], "default_exits": [{"room": 4, "unkn1": 115, "unkn2": 6, "x": 776, "y": 120, "name": "Sand Canyon 4 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 29, "unkn2": 8, "x": 72, "y": 88, "name": "Sand Canyon 4 - 3 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 105, "unkn2": 14, "x": 104, "y": 216, "name": "Sand Canyon 4 - 3 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 115, "unkn2": 20, "x": 776, "y": 248, "name": "Sand Canyon 4 - 3 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 64, "unkn2": 21, "x": 408, "y": 232, "name": "Sand Canyon 4 - 3 Exit 4", "access_rule": []}], "entity_load": [[73, 16], [20, 16], [91, 16], [14, 23], [21, 16]], "locations": ["Sand Canyon 4 - Enemy 7 (Bobin)", "Sand Canyon 4 - Enemy 8 (Joe)", "Sand Canyon 4 - Enemy 9 (Mony)", "Sand Canyon 4 - Enemy 10 (Blipper)"], "music": 18}, {"name": "Sand Canyon 4 - 4", "level": 3, "stage": 4, "room": 4, "pointer": 3307804, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 60, "unkn2": 6, "x": 88, "y": 104, "name": "Sand Canyon 4 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 60, "unkn2": 16, "x": 88, "y": 360, "name": "Sand Canyon 4 - 4 Exit 1", "access_rule": []}], "entity_load": [[21, 16], [20, 16], [91, 16], [73, 16]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 5", "level": 3, "stage": 4, "room": 5, "pointer": 2955407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 16, "unkn2": 13, "x": 88, "y": 232, "name": "Sand Canyon 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Sand Canyon 4 - Miniboss 1 (Haboki)"], "music": 4}, {"name": "Sand Canyon 4 - 6", "level": 3, "stage": 4, "room": 6, "pointer": 3094851, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 6, "x": 56, "y": 56, "name": "Sand Canyon 4 - 6 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 14, "x": 56, "y": 104, "name": "Sand Canyon 4 - 6 Exit 1", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 22, "x": 56, "y": 152, "name": "Sand Canyon 4 - 6 Exit 2", "access_rule": []}], "entity_load": [[17, 19], [4, 23], [5, 23]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 7", "level": 3, "stage": 4, "room": 7, "pointer": 3483428, "animal_pointers": [], "consumables": [{"idx": 25, "pointer": 200, "x": 344, "y": 144, "etype": 22, "vtype": 0, "name": "Sand Canyon 4 - 1-Up (Clean)"}, {"idx": 26, "pointer": 336, "x": 1656, "y": 144, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Needle)"}], "consumables_pointer": 128, "enemies": ["Togezo", "Rocky", "Bobo"], "default_exits": [{"room": 8, "unkn1": 266, "unkn2": 9, "x": 56, "y": 152, "name": "Sand Canyon 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [3, 16], [14, 23], [5, 16], [2, 16], [18, 16], [0, 22], [2, 22]], "locations": ["Sand Canyon 4 - Enemy 11 (Togezo)", "Sand Canyon 4 - Enemy 12 (Rocky)", "Sand Canyon 4 - Enemy 13 (Bobo)", "Sand Canyon 4 - 1-Up (Clean)", "Sand Canyon 4 - Maxim Tomato (Needle)"], "music": 18}, {"name": "Sand Canyon 4 - 8", "level": 3, "stage": 4, "room": 8, "pointer": 3002086, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[17, 19], [42, 19]], "locations": ["Sand Canyon 4 - Donbe & Hikari"], "music": 8}, {"name": "Sand Canyon 4 - 9", "level": 3, "stage": 4, "room": 9, "pointer": 2885774, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 4 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 0", "level": 3, "stage": 5, "room": 0, "pointer": 3662486, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 450, "x": 2256, "y": 232, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Falling Block)"}], "consumables_pointer": 208, "enemies": ["Wapod", "Dogon", "Tick"], "default_exits": [{"room": 3, "unkn1": 151, "unkn2": 15, "x": 184, "y": 56, "name": "Sand Canyon 5 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 83, "unkn2": 16, "x": 72, "y": 120, "name": "Sand Canyon 5 - 0 Exit 1", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [0, 22], [14, 23], [90, 16], [88, 16]], "locations": ["Sand Canyon 5 - Enemy 1 (Wapod)", "Sand Canyon 5 - Enemy 2 (Dogon)", "Sand Canyon 5 - Enemy 3 (Tick)", "Sand Canyon 5 - 1-Up (Falling Block)"], "music": 13}, {"name": "Sand Canyon 5 - 1", "level": 3, "stage": 5, "room": 1, "pointer": 3052622, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "Bobo", "Chilly", "Sparky", "Togezo"], "default_exits": [{"room": 9, "unkn1": 6, "unkn2": 9, "x": 216, "y": 1128, "name": "Sand Canyon 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [6, 16], [3, 16], [8, 16], [18, 16]], "locations": ["Sand Canyon 5 - Enemy 4 (Rocky)", "Sand Canyon 5 - Enemy 5 (Bobo)", "Sand Canyon 5 - Enemy 6 (Chilly)", "Sand Canyon 5 - Enemy 7 (Sparky)", "Sand Canyon 5 - Enemy 8 (Togezo)"], "music": 13}, {"name": "Sand Canyon 5 - 2", "level": 3, "stage": 5, "room": 2, "pointer": 3057544, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 3, "unkn2": 7, "x": 1320, "y": 264, "name": "Sand Canyon 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 1"], "music": 40}, {"name": "Sand Canyon 5 - 3", "level": 3, "stage": 5, "room": 3, "pointer": 3419011, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 192, "x": 56, "y": 648, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 2)"}, {"idx": 14, "pointer": 200, "x": 56, "y": 664, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 3)"}, {"idx": 15, "pointer": 208, "x": 56, "y": 632, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 1)"}, {"idx": 12, "pointer": 368, "x": 320, "y": 264, "etype": 22, "vtype": 2, "name": "Sand Canyon 5 - Maxim Tomato (Pit)"}], "consumables_pointer": 304, "enemies": ["Bronto Burt", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 66, "x": 88, "y": 88, "name": "Sand Canyon 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [30, 16], [2, 16], [0, 22], [2, 22], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 9 (Bronto Burt)", "Sand Canyon 5 - Enemy 10 (Sasuke)", "Sand Canyon 5 - 1-Up (Ice 2)", "Sand Canyon 5 - 1-Up (Ice 3)", "Sand Canyon 5 - 1-Up (Ice 1)", "Sand Canyon 5 - Maxim Tomato (Pit)"], "music": 13}, {"name": "Sand Canyon 5 - 4", "level": 3, "stage": 5, "room": 4, "pointer": 3644149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro", "Galbo", "Nidoo"], "default_exits": [{"room": 5, "unkn1": 76, "unkn2": 9, "x": 88, "y": 120, "name": "Sand Canyon 5 - 4 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 116, "unkn2": 14, "x": 200, "y": 1256, "name": "Sand Canyon 5 - 4 Exit 1", "access_rule": []}], "entity_load": [[54, 16], [26, 16], [28, 16], [25, 16], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 11 (Oro)", "Sand Canyon 5 - Enemy 12 (Galbo)", "Sand Canyon 5 - Enemy 13 (Nidoo)"], "music": 13}, {"name": "Sand Canyon 5 - 5", "level": 3, "stage": 5, "room": 5, "pointer": 3044100, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 7, "x": 1240, "y": 152, "name": "Sand Canyon 5 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 2"], "music": 39}, {"name": "Sand Canyon 5 - 6", "level": 3, "stage": 5, "room": 6, "pointer": 3373481, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 25, "unkn2": 5, "x": 56, "y": 152, "name": "Sand Canyon 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [31, 16], [89, 16], [6, 16]], "locations": ["Sand Canyon 5 - Enemy 14 (Propeller)"], "music": 13}, {"name": "Sand Canyon 5 - 7", "level": 3, "stage": 5, "room": 7, "pointer": 2964028, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[18, 19], [42, 19]], "locations": ["Sand Canyon 5 - Nyupun"], "music": 8}, {"name": "Sand Canyon 5 - 8", "level": 3, "stage": 5, "room": 8, "pointer": 2890112, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 5 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 9", "level": 3, "stage": 5, "room": 9, "pointer": 3647264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "KeKe", "Kabu"], "default_exits": [{"room": 6, "unkn1": 12, "unkn2": 6, "x": 72, "y": 760, "name": "Sand Canyon 5 - 9 Exit 0", "access_rule": ["Cutter"]}, {"room": 1, "unkn1": 12, "unkn2": 70, "x": 120, "y": 152, "name": "Sand Canyon 5 - 9 Exit 1", "access_rule": []}], "entity_load": [[27, 16], [61, 16], [4, 22], [14, 23], [51, 16], [19, 16]], "locations": ["Sand Canyon 5 - Enemy 15 (Sir Kibble)", "Sand Canyon 5 - Enemy 16 (KeKe)", "Sand Canyon 5 - Enemy 17 (Kabu)"], "music": 13}, {"name": "Sand Canyon 6 - 0", "level": 3, "stage": 6, "room": 0, "pointer": 3314761, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Doka", "Cappy", "Pteran"], "default_exits": [{"room": 2, "unkn1": 132, "unkn2": 16, "x": 56, "y": 136, "name": "Sand Canyon 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [35, 16], [39, 16], [12, 16]], "locations": ["Sand Canyon 6 - Enemy 1 (Sparky)", "Sand Canyon 6 - Enemy 2 (Doka)", "Sand Canyon 6 - Enemy 3 (Cappy)", "Sand Canyon 6 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Sand Canyon 6 - 1", "level": 3, "stage": 6, "room": 1, "pointer": 2976913, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 24, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 1", "Sand Canyon 6 - Animal 2", "Sand Canyon 6 - Animal 3"], "music": 39}, {"name": "Sand Canyon 6 - 2", "level": 3, "stage": 6, "room": 2, "pointer": 2978757, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 55, "unkn2": 6, "x": 104, "y": 104, "name": "Sand Canyon 6 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 3", "level": 3, "stage": 6, "room": 3, "pointer": 3178082, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 3 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 3 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 3 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 3 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 3 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 3 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 4", "level": 3, "stage": 6, "room": 4, "pointer": 3181563, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 4 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 4 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 4 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 4 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 4 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 4 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 5", "level": 3, "stage": 6, "room": 5, "pointer": 3177209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 5 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 5 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 5 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 5 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 5 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 5 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 6", "level": 3, "stage": 6, "room": 6, "pointer": 3183291, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 6 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 6 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 6 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 6 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 6 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 6 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 7", "level": 3, "stage": 6, "room": 7, "pointer": 3175453, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 7 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 7 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 7 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 7 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 7 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 7 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 8", "level": 3, "stage": 6, "room": 8, "pointer": 3179826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 8 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 8 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 8 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 8 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 8 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 8 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 9", "level": 3, "stage": 6, "room": 9, "pointer": 3176334, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 9 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 9 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 9 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 9 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 9 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 9 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 10", "level": 3, "stage": 6, "room": 10, "pointer": 3178954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 10 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 10 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 10 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 10 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 10 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 10 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 11", "level": 3, "stage": 6, "room": 11, "pointer": 2989149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 37, "unkn2": 6, "x": 88, "y": 264, "name": "Sand Canyon 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[59, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 12", "level": 3, "stage": 6, "room": 12, "pointer": 3015947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 8, "x": 440, "y": 264, "name": "Sand Canyon 6 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 86, "unkn2": 8, "x": 72, "y": 104, "name": "Sand Canyon 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[64, 16], [59, 16], [55, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 13", "level": 3, "stage": 6, "room": 13, "pointer": 2976539, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 55, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 6 - 13 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 14", "level": 3, "stage": 6, "room": 14, "pointer": 3030336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 5, "unkn2": 9, "x": 200, "y": 152, "name": "Sand Canyon 6 - 14 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 35, "unkn2": 9, "x": 152, "y": 392, "name": "Sand Canyon 6 - 14 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 15", "level": 3, "stage": 6, "room": 15, "pointer": 2972361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 13, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 16", "level": 3, "stage": 6, "room": 16, "pointer": 2953186, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 16 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 16 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 17", "level": 3, "stage": 6, "room": 17, "pointer": 2953633, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 17 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 17 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 18", "level": 3, "stage": 6, "room": 18, "pointer": 2991707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 14, "unkn2": 9, "x": 184, "y": 312, "name": "Sand Canyon 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 19", "level": 3, "stage": 6, "room": 19, "pointer": 2974651, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 5, "unkn2": 9, "x": 376, "y": 392, "name": "Sand Canyon 6 - 19 Exit 0", "access_rule": []}, {"room": 20, "unkn1": 35, "unkn2": 9, "x": 88, "y": 152, "name": "Sand Canyon 6 - 19 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 20", "level": 3, "stage": 6, "room": 20, "pointer": 2969638, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 4, "unkn2": 9, "x": 552, "y": 152, "name": "Sand Canyon 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 21", "level": 3, "stage": 6, "room": 21, "pointer": 2976163, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 9, "unkn2": 13, "x": 296, "y": 216, "name": "Sand Canyon 6 - 21 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 4", "Sand Canyon 6 - Animal 5", "Sand Canyon 6 - Animal 6"], "music": 40}, {"name": "Sand Canyon 6 - 22", "level": 3, "stage": 6, "room": 22, "pointer": 2950938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 38, "unkn1": 14, "unkn2": 8, "x": 168, "y": 376, "name": "Sand Canyon 6 - 22 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 9, "unkn2": 13, "x": 376, "y": 216, "name": "Sand Canyon 6 - 22 Exit 1", "access_rule": []}, {"room": 21, "unkn1": 19, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 22 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 23", "level": 3, "stage": 6, "room": 23, "pointer": 3311993, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 43, "unkn1": 145, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 24", "level": 3, "stage": 6, "room": 24, "pointer": 3079078, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 39, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 24 Exit 0", "access_rule": []}, {"room": 25, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 24 Exit 1", "access_rule": []}, {"room": 39, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 24 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 25", "level": 3, "stage": 6, "room": 25, "pointer": 3065898, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 25 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 25 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 25 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 26", "level": 3, "stage": 6, "room": 26, "pointer": 3063347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 26 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 26 Exit 1", "access_rule": []}, {"room": 27, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 26 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 27", "level": 3, "stage": 6, "room": 27, "pointer": 3066916, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 28, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 27 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 27 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 27 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 28", "level": 3, "stage": 6, "room": 28, "pointer": 3067425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 28 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 11, "unkn2": 8, "x": 184, "y": 344, "name": "Sand Canyon 6 - 28 Exit 1", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 28 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 29", "level": 3, "stage": 6, "room": 29, "pointer": 2950032, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 30, "unkn1": 11, "unkn2": 8, "x": 168, "y": 136, "name": "Sand Canyon 6 - 29 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 30", "level": 3, "stage": 6, "room": 30, "pointer": 2986500, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 10, "unkn2": 44, "x": 136, "y": 152, "name": "Sand Canyon 6 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 31", "level": 3, "stage": 6, "room": 31, "pointer": 3070930, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 31 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 648, "name": "Sand Canyon 6 - 31 Exit 1", "access_rule": []}, {"room": 32, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 31 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 32", "level": 3, "stage": 6, "room": 32, "pointer": 3054817, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Parasol)", "Bukiset (Cutter)"], "default_exits": [{"room": 33, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 32 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 536, "name": "Sand Canyon 6 - 32 Exit 1", "access_rule": []}, {"room": 33, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 32 Exit 2", "access_rule": []}], "entity_load": [[81, 16], [83, 16]], "locations": ["Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))"], "music": 14}, {"name": "Sand Canyon 6 - 33", "level": 3, "stage": 6, "room": 33, "pointer": 3053173, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Clean)", "Bukiset (Spark)"], "default_exits": [{"room": 34, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 33 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 440, "name": "Sand Canyon 6 - 33 Exit 1", "access_rule": []}, {"room": 34, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 33 Exit 2", "access_rule": []}], "entity_load": [[80, 16], [82, 16]], "locations": ["Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))"], "music": 14}, {"name": "Sand Canyon 6 - 34", "level": 3, "stage": 6, "room": 34, "pointer": 3053721, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)"], "default_exits": [{"room": 35, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 34 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 344, "name": "Sand Canyon 6 - 34 Exit 1", "access_rule": []}, {"room": 35, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 34 Exit 2", "access_rule": []}], "entity_load": [[79, 16], [78, 16]], "locations": ["Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))"], "music": 14}, {"name": "Sand Canyon 6 - 35", "level": 3, "stage": 6, "room": 35, "pointer": 3054269, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)"], "default_exits": [{"room": 37, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 35 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 248, "name": "Sand Canyon 6 - 35 Exit 1", "access_rule": []}, {"room": 37, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 35 Exit 2", "access_rule": []}], "entity_load": [[77, 16], [76, 16]], "locations": ["Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))"], "music": 14}, {"name": "Sand Canyon 6 - 36", "level": 3, "stage": 6, "room": 36, "pointer": 2986164, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 10, "unkn2": 44, "x": 392, "y": 152, "name": "Sand Canyon 6 - 36 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 37", "level": 3, "stage": 6, "room": 37, "pointer": 3074377, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 152, "name": "Sand Canyon 6 - 37 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 38", "level": 3, "stage": 6, "room": 38, "pointer": 2971589, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 10, "unkn2": 5, "x": 264, "y": 440, "name": "Sand Canyon 6 - 38 Exit 0", "access_rule": []}, {"room": 22, "unkn1": 10, "unkn2": 23, "x": 248, "y": 136, "name": "Sand Canyon 6 - 38 Exit 1", "access_rule": []}], "entity_load": [[76, 16], [77, 16], [78, 16], [79, 16], [80, 16], [81, 16], [82, 16], [83, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 39", "level": 3, "stage": 6, "room": 39, "pointer": 3063858, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 40, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 39 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 39 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 39 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 40", "level": 3, "stage": 6, "room": 40, "pointer": 3064368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 40 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 40 Exit 1", "access_rule": []}, {"room": 41, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 40 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 41", "level": 3, "stage": 6, "room": 41, "pointer": 3064878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 42, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 41 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 41 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 41 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 42", "level": 3, "stage": 6, "room": 42, "pointer": 3068939, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 42 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 42 Exit 1", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Sand Canyon 6 - Enemy 13 (Nidoo)"], "music": 14}, {"name": "Sand Canyon 6 - 43", "level": 3, "stage": 6, "room": 43, "pointer": 2988495, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 44, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 6 - 43 Exit 0", "access_rule": []}], "entity_load": [[19, 19], [42, 19]], "locations": ["Sand Canyon 6 - Professor Hector & R.O.B"], "music": 8}, {"name": "Sand Canyon 6 - 44", "level": 3, "stage": 6, "room": 44, "pointer": 2886979, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 6 - Complete"], "music": 5}, {"name": "Sand Canyon Boss - 0", "level": 3, "stage": 7, "room": 0, "pointer": 2991389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[6, 18]], "locations": ["Sand Canyon - Boss (Pon & Con) Purified", "Level 3 Boss - Defeated", "Level 3 Boss - Purified"], "music": 2}, {"name": "Cloudy Park 1 - 0", "level": 4, "stage": 1, "room": 0, "pointer": 3172795, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "KeKe", "Cappy"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 5, "x": 56, "y": 152, "name": "Cloudy Park 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [12, 16], [51, 16], [1, 23], [0, 23]], "locations": ["Cloudy Park 1 - Enemy 1 (Waddle Dee)", "Cloudy Park 1 - Enemy 2 (KeKe)", "Cloudy Park 1 - Enemy 3 (Cappy)"], "music": 17}, {"name": "Cloudy Park 1 - 1", "level": 4, "stage": 1, "room": 1, "pointer": 3078163, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 88, "y": 424, "name": "Cloudy Park 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 1"], "music": 39}, {"name": "Cloudy Park 1 - 2", "level": 4, "stage": 1, "room": 2, "pointer": 3285882, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Togezo"], "default_exits": [{"room": 3, "unkn1": 95, "unkn2": 8, "x": 40, "y": 104, "name": "Cloudy Park 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [4, 16], [18, 16], [6, 23]], "locations": ["Cloudy Park 1 - Enemy 4 (Yaban)", "Cloudy Park 1 - Enemy 5 (Togezo)"], "music": 17}, {"name": "Cloudy Park 1 - 3", "level": 4, "stage": 1, "room": 3, "pointer": 3062831, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 15, "unkn2": 6, "x": 56, "y": 264, "name": "Cloudy Park 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 2"], "music": 39}, {"name": "Cloudy Park 1 - 4", "level": 4, "stage": 1, "room": 4, "pointer": 3396729, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 92, "unkn2": 16, "x": 56, "y": 152, "name": "Cloudy Park 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [0, 16], [14, 23], [68, 16], [26, 16], [4, 22]], "locations": ["Cloudy Park 1 - Enemy 6 (Galbo)"], "music": 17}, {"name": "Cloudy Park 1 - 5", "level": 4, "stage": 1, "room": 5, "pointer": 3038805, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 6, "unkn2": 5, "x": 2344, "y": 232, "name": "Cloudy Park 1 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 3", "Cloudy Park 1 - Animal 4"], "music": 39}, {"name": "Cloudy Park 1 - 6", "level": 4, "stage": 1, "room": 6, "pointer": 3535736, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Como"], "default_exits": [{"room": 8, "unkn1": 5, "unkn2": 8, "x": 72, "y": 104, "name": "Cloudy Park 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [14, 23], [0, 16], [41, 16], [8, 16]], "locations": ["Cloudy Park 1 - Enemy 7 (Sparky)", "Cloudy Park 1 - Enemy 8 (Como)"], "music": 17}, {"name": "Cloudy Park 1 - 7", "level": 4, "stage": 1, "room": 7, "pointer": 2954080, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 6, "x": 88, "y": 104, "name": "Cloudy Park 1 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 5"], "music": 39}, {"name": "Cloudy Park 1 - 8", "level": 4, "stage": 1, "room": 8, "pointer": 3465407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt"], "default_exits": [{"room": 12, "unkn1": 181, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 1 - 8 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [2, 16], [51, 16], [1, 23], [14, 23]], "locations": ["Cloudy Park 1 - Enemy 9 (Bronto Burt)"], "music": 17}, {"name": "Cloudy Park 1 - 9", "level": 4, "stage": 1, "room": 9, "pointer": 3078621, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 56, "y": 264, "name": "Cloudy Park 1 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 6"], "music": 39}, {"name": "Cloudy Park 1 - 10", "level": 4, "stage": 1, "room": 10, "pointer": 3281366, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Sir Kibble"], "default_exits": [{"room": 9, "unkn1": 99, "unkn2": 8, "x": 56, "y": 152, "name": "Cloudy Park 1 - 10 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [24, 16], [27, 16], [4, 23]], "locations": ["Cloudy Park 1 - Enemy 10 (Gabon)", "Cloudy Park 1 - Enemy 11 (Sir Kibble)"], "music": 17}, {"name": "Cloudy Park 1 - 11", "level": 4, "stage": 1, "room": 11, "pointer": 3519608, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 192, "x": 216, "y": 600, "etype": 22, "vtype": 0, "name": "Cloudy Park 1 - 1-Up (Shotzo)"}, {"idx": 18, "pointer": 456, "x": 856, "y": 408, "etype": 22, "vtype": 2, "name": "Cloudy Park 1 - Maxim Tomato (Mariel)"}], "consumables_pointer": 352, "enemies": ["Mariel", "Nruff"], "default_exits": [{"room": 5, "unkn1": 64, "unkn2": 6, "x": 104, "y": 216, "name": "Cloudy Park 1 - 11 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [27, 16], [15, 16], [45, 16], [14, 23], [2, 22], [0, 22], [6, 22]], "locations": ["Cloudy Park 1 - Enemy 12 (Mariel)", "Cloudy Park 1 - Enemy 13 (Nruff)", "Cloudy Park 1 - 1-Up (Shotzo)", "Cloudy Park 1 - Maxim Tomato (Mariel)"], "music": 17}, {"name": "Cloudy Park 1 - 12", "level": 4, "stage": 1, "room": 12, "pointer": 2958914, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 1 - 12 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [42, 19]], "locations": ["Cloudy Park 1 - Hibanamodoki"], "music": 8}, {"name": "Cloudy Park 1 - 13", "level": 4, "stage": 1, "room": 13, "pointer": 2886015, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 1 - Complete"], "music": 5}, {"name": "Cloudy Park 2 - 0", "level": 4, "stage": 2, "room": 0, "pointer": 3142443, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly", "Sasuke"], "default_exits": [{"room": 6, "unkn1": 96, "unkn2": 7, "x": 56, "y": 88, "name": "Cloudy Park 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16], [30, 16], [6, 16], [14, 23]], "locations": ["Cloudy Park 2 - Enemy 1 (Chilly)", "Cloudy Park 2 - Enemy 2 (Sasuke)"], "music": 19}, {"name": "Cloudy Park 2 - 1", "level": 4, "stage": 2, "room": 1, "pointer": 3235925, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Broom Hatter"], "default_exits": [{"room": 2, "unkn1": 146, "unkn2": 5, "x": 88, "y": 88, "name": "Cloudy Park 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [8, 16], [11, 16]], "locations": ["Cloudy Park 2 - Enemy 3 (Waddle Dee)", "Cloudy Park 2 - Enemy 4 (Sparky)", "Cloudy Park 2 - Enemy 5 (Broom Hatter)"], "music": 19}, {"name": "Cloudy Park 2 - 2", "level": 4, "stage": 2, "room": 2, "pointer": 3297758, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Pteran"], "default_exits": [{"room": 3, "unkn1": 147, "unkn2": 8, "x": 72, "y": 136, "name": "Cloudy Park 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[27, 16], [39, 16], [1, 23]], "locations": ["Cloudy Park 2 - Enemy 6 (Sir Kibble)", "Cloudy Park 2 - Enemy 7 (Pteran)"], "music": 19}, {"name": "Cloudy Park 2 - 3", "level": 4, "stage": 2, "room": 3, "pointer": 3341087, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Dogon"], "default_exits": [{"room": 4, "unkn1": 145, "unkn2": 12, "x": 72, "y": 136, "name": "Cloudy Park 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[4, 16], [14, 23], [90, 16], [89, 16]], "locations": ["Cloudy Park 2 - Enemy 8 (Propeller)", "Cloudy Park 2 - Enemy 9 (Dogon)"], "music": 19}, {"name": "Cloudy Park 2 - 4", "level": 4, "stage": 2, "room": 4, "pointer": 3457404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Oro", "Bronto Burt", "Rocky"], "default_exits": [{"room": 5, "unkn1": 165, "unkn2": 5, "x": 72, "y": 104, "name": "Cloudy Park 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [3, 16], [14, 23], [18, 16], [25, 16]], "locations": ["Cloudy Park 2 - Enemy 10 (Togezo)", "Cloudy Park 2 - Enemy 11 (Oro)", "Cloudy Park 2 - Enemy 12 (Bronto Burt)", "Cloudy Park 2 - Enemy 13 (Rocky)"], "music": 19}, {"name": "Cloudy Park 2 - 5", "level": 4, "stage": 2, "room": 5, "pointer": 3273878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Kapar"], "default_exits": [{"room": 7, "unkn1": 96, "unkn2": 8, "x": 56, "y": 88, "name": "Cloudy Park 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [62, 16], [26, 16], [67, 16]], "locations": ["Cloudy Park 2 - Enemy 14 (Galbo)", "Cloudy Park 2 - Enemy 15 (Kapar)"], "music": 19}, {"name": "Cloudy Park 2 - 6", "level": 4, "stage": 2, "room": 6, "pointer": 2984453, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 25, "unkn2": 5, "x": 72, "y": 152, "name": "Cloudy Park 2 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 2 - Animal 1", "Cloudy Park 2 - Animal 2", "Cloudy Park 2 - Animal 3"], "music": 38}, {"name": "Cloudy Park 2 - 7", "level": 4, "stage": 2, "room": 7, "pointer": 2985482, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 5, "x": 40, "y": 88, "name": "Cloudy Park 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[22, 19]], "locations": [], "music": 19}, {"name": "Cloudy Park 2 - 8", "level": 4, "stage": 2, "room": 8, "pointer": 2990753, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[22, 19], [42, 19]], "locations": ["Cloudy Park 2 - Piyo & Keko"], "music": 8}, {"name": "Cloudy Park 2 - 9", "level": 4, "stage": 2, "room": 9, "pointer": 2889630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 2 - Complete"], "music": 5}, {"name": "Cloudy Park 3 - 0", "level": 4, "stage": 3, "room": 0, "pointer": 3100859, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Mopoo", "Poppy Bros Jr."], "default_exits": [{"room": 2, "unkn1": 145, "unkn2": 8, "x": 56, "y": 136, "name": "Cloudy Park 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [74, 16], [47, 16], [7, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 1 (Bronto Burt)", "Cloudy Park 3 - Enemy 2 (Mopoo)", "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)"], "music": 15}, {"name": "Cloudy Park 3 - 1", "level": 4, "stage": 3, "room": 1, "pointer": 3209719, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como"], "default_exits": [{"room": 5, "unkn1": 13, "unkn2": 14, "x": 56, "y": 152, "name": "Cloudy Park 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [4, 22], [41, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 4 (Como)"], "music": 15}, {"name": "Cloudy Park 3 - 2", "level": 4, "stage": 3, "room": 2, "pointer": 3216185, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Bobin", "Loud", "Kapar"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 6, "x": 216, "y": 1064, "name": "Cloudy Park 3 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 24, "unkn2": 14, "x": 104, "y": 152, "name": "Cloudy Park 3 - 2 Exit 1", "access_rule": []}], "entity_load": [[67, 16], [40, 16], [73, 16], [14, 23], [16, 16]], "locations": ["Cloudy Park 3 - Enemy 5 (Glunk)", "Cloudy Park 3 - Enemy 6 (Bobin)", "Cloudy Park 3 - Enemy 7 (Loud)", "Cloudy Park 3 - Enemy 8 (Kapar)"], "music": 15}, {"name": "Cloudy Park 3 - 3", "level": 4, "stage": 3, "room": 3, "pointer": 2994208, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 5, "unkn2": 9, "x": 408, "y": 232, "name": "Cloudy Park 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 3 - Animal 1", "Cloudy Park 3 - Animal 2", "Cloudy Park 3 - Animal 3"], "music": 40}, {"name": "Cloudy Park 3 - 4", "level": 4, "stage": 3, "room": 4, "pointer": 3229151, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Batamon", "Bouncy"], "default_exits": [{"room": 6, "unkn1": 156, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 126, "unkn2": 9, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 1", "access_rule": []}], "entity_load": [[7, 16], [26, 16], [14, 23], [13, 16], [68, 16]], "locations": ["Cloudy Park 3 - Enemy 9 (Galbo)", "Cloudy Park 3 - Enemy 10 (Batamon)", "Cloudy Park 3 - Enemy 11 (Bouncy)"], "music": 15}, {"name": "Cloudy Park 3 - 5", "level": 4, "stage": 3, "room": 5, "pointer": 2969244, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": [], "music": 31}, {"name": "Cloudy Park 3 - 6", "level": 4, "stage": 3, "room": 6, "pointer": 4128530, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": ["Cloudy Park 3 - Mr. Ball"], "music": 8}, {"name": "Cloudy Park 3 - 7", "level": 4, "stage": 3, "room": 7, "pointer": 2885051, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 3 - Complete"], "music": 5}, {"name": "Cloudy Park 4 - 0", "level": 4, "stage": 4, "room": 0, "pointer": 3072905, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[4, 23], [1, 23], [0, 23], [31, 16]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 1", "level": 4, "stage": 4, "room": 1, "pointer": 3074863, "animal_pointers": [208, 224], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 21, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 4 - Animal 1", "Cloudy Park 4 - Animal 2"], "music": 38}, {"name": "Cloudy Park 4 - 2", "level": 4, "stage": 4, "room": 2, "pointer": 3309209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Como", "Wapod", "Cappy"], "default_exits": [{"room": 3, "unkn1": 145, "unkn2": 9, "x": 104, "y": 152, "name": "Cloudy Park 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [24, 16], [12, 16], [14, 23], [41, 16], [4, 22]], "locations": ["Cloudy Park 4 - Enemy 1 (Gabon)", "Cloudy Park 4 - Enemy 2 (Como)", "Cloudy Park 4 - Enemy 3 (Wapod)", "Cloudy Park 4 - Enemy 4 (Cappy)"], "music": 21}, {"name": "Cloudy Park 4 - 3", "level": 4, "stage": 4, "room": 3, "pointer": 3296291, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 776, "x": 1880, "y": 152, "etype": 22, "vtype": 0, "name": "Cloudy Park 4 - 1-Up (Windy)"}, {"idx": 34, "pointer": 912, "x": 2160, "y": 152, "etype": 22, "vtype": 2, "name": "Cloudy Park 4 - Maxim Tomato (Windy)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Togezo"], "default_exits": [{"room": 5, "unkn1": 144, "unkn2": 9, "x": 56, "y": 136, "name": "Cloudy Park 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[18, 16], [8, 16], [31, 16], [14, 23], [4, 22], [4, 16], [0, 22], [2, 22]], "locations": ["Cloudy Park 4 - Enemy 5 (Sparky)", "Cloudy Park 4 - Enemy 6 (Togezo)", "Cloudy Park 4 - 1-Up (Windy)", "Cloudy Park 4 - Maxim Tomato (Windy)"], "music": 21}, {"name": "Cloudy Park 4 - 4", "level": 4, "stage": 4, "room": 4, "pointer": 3330996, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "KeKe", "Bouncy"], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 15, "x": 72, "y": 152, "name": "Cloudy Park 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [51, 16], [17, 16], [14, 23], [2, 16]], "locations": ["Cloudy Park 4 - Enemy 7 (Bronto Burt)", "Cloudy Park 4 - Enemy 8 (KeKe)", "Cloudy Park 4 - Enemy 9 (Bouncy)"], "music": 21}, {"name": "Cloudy Park 4 - 5", "level": 4, "stage": 4, "room": 5, "pointer": 3332300, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Mariel"], "default_exits": [{"room": 4, "unkn1": 21, "unkn2": 51, "x": 2328, "y": 120, "name": "Cloudy Park 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [46, 16], [27, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 10 (Sir Kibble)", "Cloudy Park 4 - Enemy 11 (Mariel)"], "music": 21}, {"name": "Cloudy Park 4 - 6", "level": 4, "stage": 4, "room": 6, "pointer": 3253310, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu", "Wappa"], "default_exits": [{"room": 9, "unkn1": 3, "unkn2": 6, "x": 72, "y": 152, "name": "Cloudy Park 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [31, 16], [19, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 12 (Kabu)", "Cloudy Park 4 - Enemy 13 (Wappa)"], "music": 21}, {"name": "Cloudy Park 4 - 7", "level": 4, "stage": 4, "room": 7, "pointer": 2967658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 12, "unkn2": 9, "x": 152, "y": 120, "name": "Cloudy Park 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Cloudy Park 4 - Miniboss 1 (Jumper Shoot)"], "music": 4}, {"name": "Cloudy Park 4 - 8", "level": 4, "stage": 4, "room": 8, "pointer": 2981644, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 344, "y": 680, "name": "Cloudy Park 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[24, 19]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 9", "level": 4, "stage": 4, "room": 9, "pointer": 3008001, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[24, 19], [42, 19]], "locations": ["Cloudy Park 4 - Mikarin & Kagami Mocchi"], "music": 8}, {"name": "Cloudy Park 4 - 10", "level": 4, "stage": 4, "room": 10, "pointer": 2888184, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 4 - Complete"], "music": 5}, {"name": "Cloudy Park 5 - 0", "level": 4, "stage": 5, "room": 0, "pointer": 3192630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Sir Kibble", "Cappy", "Wappa"], "default_exits": [{"room": 1, "unkn1": 146, "unkn2": 6, "x": 168, "y": 616, "name": "Cloudy Park 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [27, 16], [44, 16], [12, 16], [14, 23]], "locations": ["Cloudy Park 5 - Enemy 1 (Yaban)", "Cloudy Park 5 - Enemy 2 (Sir Kibble)", "Cloudy Park 5 - Enemy 3 (Cappy)", "Cloudy Park 5 - Enemy 4 (Wappa)"], "music": 17}, {"name": "Cloudy Park 5 - 1", "level": 4, "stage": 5, "room": 1, "pointer": 3050956, "animal_pointers": [], "consumables": [{"idx": 5, "pointer": 264, "x": 480, "y": 720, "etype": 22, "vtype": 2, "name": "Cloudy Park 5 - Maxim Tomato (Pillars)"}], "consumables_pointer": 288, "enemies": ["Galbo", "Bronto Burt", "KeKe"], "default_exits": [{"room": 2, "unkn1": 32, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [51, 16], [26, 16], [14, 23], [2, 22]], "locations": ["Cloudy Park 5 - Enemy 5 (Galbo)", "Cloudy Park 5 - Enemy 6 (Bronto Burt)", "Cloudy Park 5 - Enemy 7 (KeKe)", "Cloudy Park 5 - Maxim Tomato (Pillars)"], "music": 17}, {"name": "Cloudy Park 5 - 2", "level": 4, "stage": 5, "room": 2, "pointer": 3604194, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 17, "unkn2": 9, "x": 72, "y": 88, "name": "Cloudy Park 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 5 - Animal 1", "Cloudy Park 5 - Animal 2"], "music": 40}, {"name": "Cloudy Park 5 - 3", "level": 4, "stage": 5, "room": 3, "pointer": 3131242, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Klinko"], "default_exits": [{"room": 4, "unkn1": 98, "unkn2": 5, "x": 72, "y": 120, "name": "Cloudy Park 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [4, 16], [42, 16], [4, 23]], "locations": ["Cloudy Park 5 - Enemy 8 (Propeller)", "Cloudy Park 5 - Enemy 9 (Klinko)"], "music": 17}, {"name": "Cloudy Park 5 - 4", "level": 4, "stage": 5, "room": 4, "pointer": 2990116, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 23, "unkn2": 7, "x": 216, "y": 744, "name": "Cloudy Park 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[88, 16]], "locations": ["Cloudy Park 5 - Enemy 10 (Wapod)"], "music": 17}, {"name": "Cloudy Park 5 - 5", "level": 4, "stage": 5, "room": 5, "pointer": 2975410, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 4, "x": 104, "y": 296, "name": "Cloudy Park 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [2, 16]], "locations": [], "music": 17}, {"name": "Cloudy Park 5 - 6", "level": 4, "stage": 5, "room": 6, "pointer": 3173683, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 7, "unkn1": 115, "unkn2": 6, "x": 56, "y": 136, "name": "Cloudy Park 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [1, 23], [39, 16], [70, 16]], "locations": ["Cloudy Park 5 - Enemy 11 (Pteran)"], "music": 17}, {"name": "Cloudy Park 5 - 7", "level": 4, "stage": 5, "room": 7, "pointer": 2992340, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[25, 19], [42, 19]], "locations": ["Cloudy Park 5 - Pick"], "music": 8}, {"name": "Cloudy Park 5 - 8", "level": 4, "stage": 5, "room": 8, "pointer": 2891558, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 5 - Complete"], "music": 5}, {"name": "Cloudy Park 6 - 0", "level": 4, "stage": 6, "room": 0, "pointer": 3269847, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 1", "level": 4, "stage": 6, "room": 1, "pointer": 3252248, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 3, "unkn2": 25, "x": 72, "y": 72, "name": "Cloudy Park 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [55, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 2", "level": 4, "stage": 6, "room": 2, "pointer": 3028494, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 0, "unkn1": 4, "unkn2": 9, "x": 1032, "y": 152, "name": "Cloudy Park 6 - 2 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 13, "unkn2": 9, "x": 56, "y": 72, "name": "Cloudy Park 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 1 (Madoo)"], "music": 11}, {"name": "Cloudy Park 6 - 3", "level": 4, "stage": 6, "room": 3, "pointer": 3131911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 3 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 3 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 3 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 3 Exit 3", "access_rule": []}, {"room": 10, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 3 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 4", "level": 4, "stage": 6, "room": 4, "pointer": 3115416, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick", "Como"], "default_exits": [{"room": 8, "unkn1": 20, "unkn2": 4, "x": 72, "y": 488, "name": "Cloudy Park 6 - 4 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 4 Exit 1", "access_rule": []}, {"room": 11, "unkn1": 8, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 12, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 4 Exit 3", "access_rule": []}, {"room": 11, "unkn1": 16, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 4 Exit 4", "access_rule": []}, {"room": 11, "unkn1": 20, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 4 Exit 5", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [41, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 2 (Tick)", "Cloudy Park 6 - Enemy 3 (Como)"], "music": 11}, {"name": "Cloudy Park 6 - 5", "level": 4, "stage": 6, "room": 5, "pointer": 3245809, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 15, "unkn1": 65, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16], [14, 23], [4, 22]], "locations": ["Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)"], "music": 11}, {"name": "Cloudy Park 6 - 6", "level": 4, "stage": 6, "room": 6, "pointer": 3237044, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 56, "unkn2": 9, "x": 72, "y": 136, "name": "Cloudy Park 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[89, 16]], "locations": ["Cloudy Park 6 - Enemy 7 (Propeller)"], "music": 11}, {"name": "Cloudy Park 6 - 7", "level": 4, "stage": 6, "room": 7, "pointer": 3262705, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo"], "default_exits": [{"room": 13, "unkn1": 12, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 57, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 64, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 6 - 7 Exit 2", "access_rule": []}], "entity_load": [[74, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 8 (Mopoo)"], "music": 11}, {"name": "Cloudy Park 6 - 8", "level": 4, "stage": 6, "room": 8, "pointer": 3027259, "animal_pointers": [], "consumables": [{"idx": 22, "pointer": 312, "x": 224, "y": 256, "etype": 22, "vtype": 0, "name": "Cloudy Park 6 - 1-Up (Cutter)"}], "consumables_pointer": 304, "enemies": ["Bukiset (Burning)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Cutter)"], "default_exits": [{"room": 12, "unkn1": 13, "unkn2": 4, "x": 88, "y": 152, "name": "Cloudy Park 6 - 8 Exit 0", "access_rule": []}], "entity_load": [[78, 16], [80, 16], [76, 16], [79, 16], [83, 16], [14, 23], [4, 22], [0, 22]], "locations": ["Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", "Cloudy Park 6 - 1-Up (Cutter)"], "music": 11}, {"name": "Cloudy Park 6 - 9", "level": 4, "stage": 6, "room": 9, "pointer": 3089504, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 35, "unkn2": 7, "x": 72, "y": 72, "name": "Cloudy Park 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[41, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 10", "level": 4, "stage": 6, "room": 10, "pointer": 3132579, "animal_pointers": [242, 250, 258], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 20, "unkn2": 4, "x": 72, "y": 152, "name": "Cloudy Park 6 - 10 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 4, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 10 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 10 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 10 Exit 3", "access_rule": []}, {"room": 3, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 10 Exit 4", "access_rule": []}, {"room": 3, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 10 Exit 5", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 6 - Animal 1", "Cloudy Park 6 - Animal 2", "Cloudy Park 6 - Animal 3"], "music": 40}, {"name": "Cloudy Park 6 - 11", "level": 4, "stage": 6, "room": 11, "pointer": 3017866, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 11 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 8, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 11 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 12, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 11 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 16, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 11 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 20, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 11 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 12", "level": 4, "stage": 6, "room": 12, "pointer": 3036404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 9, "x": 200, "y": 72, "name": "Cloudy Park 6 - 12 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 13, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 13", "level": 4, "stage": 6, "room": 13, "pointer": 2965251, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 216, "y": 136, "name": "Cloudy Park 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[26, 19]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 14", "level": 4, "stage": 6, "room": 14, "pointer": 3077236, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 936, "y": 136, "name": "Cloudy Park 6 - 14 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 15", "level": 4, "stage": 6, "room": 15, "pointer": 3061794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[26, 19], [42, 19]], "locations": ["Cloudy Park 6 - HB-007"], "music": 8}, {"name": "Cloudy Park 6 - 16", "level": 4, "stage": 6, "room": 16, "pointer": 2888907, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 6 - Complete"], "music": 5}, {"name": "Cloudy Park Boss - 0", "level": 4, "stage": 7, "room": 0, "pointer": 2998682, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[3, 18]], "locations": ["Cloudy Park - Boss (Ado) Purified", "Level 4 Boss - Defeated", "Level 4 Boss - Purified"], "music": 2}, {"name": "Iceberg 1 - 0", "level": 5, "stage": 1, "room": 0, "pointer": 3363111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Klinko", "KeKe"], "default_exits": [{"room": 1, "unkn1": 104, "unkn2": 8, "x": 312, "y": 1384, "name": "Iceberg 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [0, 16], [51, 16]], "locations": ["Iceberg 1 - Enemy 1 (Waddle Dee)", "Iceberg 1 - Enemy 2 (Klinko)", "Iceberg 1 - Enemy 3 (KeKe)"], "music": 18}, {"name": "Iceberg 1 - 1", "level": 5, "stage": 1, "room": 1, "pointer": 3596524, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Galbo", "Rocky"], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 8, "x": 72, "y": 344, "name": "Iceberg 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [41, 16], [26, 16], [14, 23], [4, 22], [6, 23]], "locations": ["Iceberg 1 - Enemy 4 (Como)", "Iceberg 1 - Enemy 5 (Galbo)", "Iceberg 1 - Enemy 6 (Rocky)"], "music": 18}, {"name": "Iceberg 1 - 2", "level": 5, "stage": 1, "room": 2, "pointer": 3288880, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 3, "unkn1": 49, "unkn2": 9, "x": 184, "y": 152, "name": "Iceberg 1 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 94, "unkn2": 21, "x": 120, "y": 168, "name": "Iceberg 1 - 2 Exit 1", "access_rule": []}], "entity_load": [[28, 19], [46, 16], [47, 16], [17, 16], [67, 16]], "locations": ["Iceberg 1 - Enemy 7 (Kapar)"], "music": 18}, {"name": "Iceberg 1 - 3", "level": 5, "stage": 1, "room": 3, "pointer": 3068439, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 9, "x": 808, "y": 152, "name": "Iceberg 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 1 - Animal 1", "Iceberg 1 - Animal 2"], "music": 38}, {"name": "Iceberg 1 - 4", "level": 5, "stage": 1, "room": 4, "pointer": 3233681, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo", "Babut", "Wappa"], "default_exits": [{"room": 6, "unkn1": 74, "unkn2": 4, "x": 56, "y": 152, "name": "Iceberg 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [43, 16], [74, 16]], "locations": ["Iceberg 1 - Enemy 8 (Mopoo)", "Iceberg 1 - Enemy 9 (Babut)", "Iceberg 1 - Enemy 10 (Wappa)"], "music": 18}, {"name": "Iceberg 1 - 5", "level": 5, "stage": 1, "room": 5, "pointer": 3406133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Chilly", "Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 196, "unkn2": 9, "x": 72, "y": 744, "name": "Iceberg 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [7, 16], [2, 16], [0, 16]], "locations": ["Iceberg 1 - Enemy 11 (Bronto Burt)", "Iceberg 1 - Enemy 12 (Chilly)", "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)"], "music": 18}, {"name": "Iceberg 1 - 6", "level": 5, "stage": 1, "room": 6, "pointer": 2985823, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 19], [42, 19]], "locations": ["Iceberg 1 - Kogoesou"], "music": 8}, {"name": "Iceberg 1 - 7", "level": 5, "stage": 1, "room": 7, "pointer": 2892040, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 1 - Complete"], "music": 5}, {"name": "Iceberg 2 - 0", "level": 5, "stage": 2, "room": 0, "pointer": 3106800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Nruff"], "default_exits": [{"room": 1, "unkn1": 113, "unkn2": 36, "x": 88, "y": 152, "name": "Iceberg 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [24, 16]], "locations": ["Iceberg 2 - Enemy 1 (Gabon)", "Iceberg 2 - Enemy 2 (Nruff)"], "music": 20}, {"name": "Iceberg 2 - 1", "level": 5, "stage": 2, "room": 1, "pointer": 3334841, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Chilly", "Pteran"], "default_exits": [{"room": 2, "unkn1": 109, "unkn2": 20, "x": 88, "y": 72, "name": "Iceberg 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [0, 16], [4, 16], [39, 16]], "locations": ["Iceberg 2 - Enemy 3 (Waddle Dee)", "Iceberg 2 - Enemy 4 (Chilly)", "Iceberg 2 - Enemy 5 (Pteran)"], "music": 20}, {"name": "Iceberg 2 - 2", "level": 5, "stage": 2, "room": 2, "pointer": 3473408, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Galbo", "Babut", "Magoo"], "default_exits": [{"room": 6, "unkn1": 102, "unkn2": 5, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 24, "unkn2": 18, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 37, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 55, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 3", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 4", "access_rule": []}], "entity_load": [[53, 16], [26, 16], [43, 16], [14, 23], [16, 16]], "locations": ["Iceberg 2 - Enemy 6 (Glunk)", "Iceberg 2 - Enemy 7 (Galbo)", "Iceberg 2 - Enemy 8 (Babut)", "Iceberg 2 - Enemy 9 (Magoo)"], "music": 20}, {"name": "Iceberg 2 - 3", "level": 5, "stage": 2, "room": 3, "pointer": 3037006, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 616, "y": 424, "name": "Iceberg 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 4", "level": 5, "stage": 2, "room": 4, "pointer": 3035198, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 904, "y": 424, "name": "Iceberg 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 5", "level": 5, "stage": 2, "room": 5, "pointer": 3128551, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 424, "name": "Iceberg 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 6", "level": 5, "stage": 2, "room": 6, "pointer": 3270857, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Nidoo", "Oro"], "default_exits": [{"room": 7, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Iceberg 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [4, 22], [89, 16], [28, 16], [25, 16]], "locations": ["Iceberg 2 - Enemy 10 (Propeller)", "Iceberg 2 - Enemy 11 (Nidoo)", "Iceberg 2 - Enemy 12 (Oro)"], "music": 20}, {"name": "Iceberg 2 - 7", "level": 5, "stage": 2, "room": 7, "pointer": 3212501, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Klinko", "Bronto Burt"], "default_exits": [{"room": 8, "unkn1": 124, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [14, 23], [2, 16], [4, 23]], "locations": ["Iceberg 2 - Enemy 13 (Klinko)", "Iceberg 2 - Enemy 14 (Bronto Burt)"], "music": 20}, {"name": "Iceberg 2 - 8", "level": 5, "stage": 2, "room": 8, "pointer": 2994515, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [42, 19]], "locations": ["Iceberg 2 - Samus"], "music": 8}, {"name": "Iceberg 2 - 9", "level": 5, "stage": 2, "room": 9, "pointer": 3058084, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 9, "x": 408, "y": 296, "name": "Iceberg 2 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 2 - Animal 1", "Iceberg 2 - Animal 2"], "music": 39}, {"name": "Iceberg 2 - 10", "level": 5, "stage": 2, "room": 10, "pointer": 2887220, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 2 - Complete"], "music": 5}, {"name": "Iceberg 3 - 0", "level": 5, "stage": 3, "room": 0, "pointer": 3455346, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori", "Bouncy", "Chilly", "Pteran"], "default_exits": [{"room": 1, "unkn1": 98, "unkn2": 6, "x": 200, "y": 232, "name": "Iceberg 3 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 217, "unkn2": 7, "x": 40, "y": 120, "name": "Iceberg 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[60, 16], [6, 16], [39, 16], [13, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 1 (Corori)", "Iceberg 3 - Enemy 2 (Bouncy)", "Iceberg 3 - Enemy 3 (Chilly)", "Iceberg 3 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Iceberg 3 - 1", "level": 5, "stage": 3, "room": 1, "pointer": 3019769, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 11, "unkn2": 14, "x": 1592, "y": 104, "name": "Iceberg 3 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 1", "Iceberg 3 - Animal 2", "Iceberg 3 - Animal 3"], "music": 38}, {"name": "Iceberg 3 - 2", "level": 5, "stage": 3, "room": 2, "pointer": 3618121, "animal_pointers": [], "consumables": [{"idx": 2, "pointer": 352, "x": 1776, "y": 104, "etype": 22, "vtype": 2, "name": "Iceberg 3 - Maxim Tomato (Ceiling)"}], "consumables_pointer": 128, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 196, "unkn2": 11, "x": 72, "y": 152, "name": "Iceberg 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[2, 22], [71, 16], [57, 16], [21, 16], [67, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 5 (Raft Waddle Dee)", "Iceberg 3 - Enemy 6 (Kapar)", "Iceberg 3 - Enemy 7 (Blipper)", "Iceberg 3 - Maxim Tomato (Ceiling)"], "music": 14}, {"name": "Iceberg 3 - 3", "level": 5, "stage": 3, "room": 3, "pointer": 3650368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 116, "unkn2": 11, "x": 40, "y": 152, "name": "Iceberg 3 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 63, "unkn2": 13, "x": 184, "y": 136, "name": "Iceberg 3 - 3 Exit 1", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [4, 22], [6, 16], [88, 16]], "locations": ["Iceberg 3 - Enemy 8 (Wapod)"], "music": 14}, {"name": "Iceberg 3 - 4", "level": 5, "stage": 3, "room": 4, "pointer": 3038208, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 10, "unkn2": 8, "x": 1032, "y": 216, "name": "Iceberg 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 4", "Iceberg 3 - Animal 5"], "music": 39}, {"name": "Iceberg 3 - 5", "level": 5, "stage": 3, "room": 5, "pointer": 3013938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": [], "music": 31}, {"name": "Iceberg 3 - 6", "level": 5, "stage": 3, "room": 6, "pointer": 3624789, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Icicle"], "default_exits": [{"room": 7, "unkn1": 211, "unkn2": 7, "x": 40, "y": 152, "name": "Iceberg 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [16, 16], [14, 23], [36, 16], [4, 22]], "locations": ["Iceberg 3 - Enemy 9 (Glunk)", "Iceberg 3 - Enemy 10 (Icicle)"], "music": 14}, {"name": "Iceberg 3 - 7", "level": 5, "stage": 3, "room": 7, "pointer": 2989472, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 7 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": ["Iceberg 3 - Chef Kawasaki"], "music": 8}, {"name": "Iceberg 3 - 8", "level": 5, "stage": 3, "room": 8, "pointer": 2889871, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 3 - Complete"], "music": 5}, {"name": "Iceberg 4 - 0", "level": 5, "stage": 4, "room": 0, "pointer": 3274879, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo", "Klinko", "Chilly"], "default_exits": [{"room": 1, "unkn1": 111, "unkn2": 8, "x": 72, "y": 104, "name": "Iceberg 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [2, 16], [26, 16]], "locations": ["Iceberg 4 - Enemy 1 (Bronto Burt)", "Iceberg 4 - Enemy 2 (Galbo)", "Iceberg 4 - Enemy 3 (Klinko)", "Iceberg 4 - Enemy 4 (Chilly)"], "music": 19}, {"name": "Iceberg 4 - 1", "level": 5, "stage": 4, "room": 1, "pointer": 3371780, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Babut", "Wappa"], "default_exits": [{"room": 2, "unkn1": 60, "unkn2": 36, "x": 216, "y": 88, "name": "Iceberg 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [4, 22], [44, 16]], "locations": ["Iceberg 4 - Enemy 5 (Babut)", "Iceberg 4 - Enemy 6 (Wappa)"], "music": 19}, {"name": "Iceberg 4 - 2", "level": 5, "stage": 4, "room": 2, "pointer": 3284378, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 8, "unkn2": 39, "x": 168, "y": 152, "name": "Iceberg 4 - 2 Exit 0", "access_rule": ["Burning"]}, {"room": 3, "unkn1": 13, "unkn2": 39, "x": 88, "y": 136, "name": "Iceberg 4 - 2 Exit 1", "access_rule": []}, {"room": 17, "unkn1": 18, "unkn2": 39, "x": 120, "y": 152, "name": "Iceberg 4 - 2 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 3", "level": 5, "stage": 4, "room": 3, "pointer": 3162957, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 44, "unkn2": 8, "x": 216, "y": 104, "name": "Iceberg 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[69, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 4", "level": 5, "stage": 4, "room": 4, "pointer": 3261679, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Icicle"], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 42, "x": 104, "y": 840, "name": "Iceberg 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[36, 16]], "locations": ["Iceberg 4 - Enemy 7 (Icicle)"], "music": 19}, {"name": "Iceberg 4 - 5", "level": 5, "stage": 4, "room": 5, "pointer": 3217398, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori"], "default_exits": [{"room": 6, "unkn1": 19, "unkn2": 5, "x": 72, "y": 120, "name": "Iceberg 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[60, 16], [44, 16], [4, 22]], "locations": ["Iceberg 4 - Enemy 8 (Corori)"], "music": 19}, {"name": "Iceberg 4 - 6", "level": 5, "stage": 4, "room": 6, "pointer": 3108265, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 61, "unkn2": 7, "x": 456, "y": 72, "name": "Iceberg 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 7", "level": 5, "stage": 4, "room": 7, "pointer": 3346202, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 39, "unkn2": 6, "x": 168, "y": 104, "name": "Iceberg 4 - 7 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 4, "unkn2": 21, "x": 88, "y": 168, "name": "Iceberg 4 - 7 Exit 1", "access_rule": ["Burning"]}, {"room": 13, "unkn1": 21, "unkn2": 21, "x": 280, "y": 168, "name": "Iceberg 4 - 7 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[14, 23], [4, 22], [4, 23]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 8", "level": 5, "stage": 4, "room": 8, "pointer": 3055911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 5, "x": 648, "y": 104, "name": "Iceberg 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 9", "level": 5, "stage": 4, "room": 9, "pointer": 3056457, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 9, "x": 136, "y": 136, "name": "Iceberg 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 4 - Miniboss 1 (Yuki)"], "music": 4}, {"name": "Iceberg 4 - 10", "level": 5, "stage": 4, "room": 10, "pointer": 3257516, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 8, "unkn2": 37, "x": 88, "y": 40, "name": "Iceberg 4 - 10 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 15, "unkn2": 37, "x": 200, "y": 40, "name": "Iceberg 4 - 10 Exit 1", "access_rule": []}], "entity_load": [[31, 19]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 11", "level": 5, "stage": 4, "room": 11, "pointer": 3083322, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon"], "default_exits": [{"room": 12, "unkn1": 46, "unkn2": 8, "x": 88, "y": 120, "name": "Iceberg 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[24, 16]], "locations": ["Iceberg 4 - Enemy 9 (Gabon)"], "music": 19}, {"name": "Iceberg 4 - 12", "level": 5, "stage": 4, "room": 12, "pointer": 3147724, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu"], "default_exits": [{"room": 18, "unkn1": 64, "unkn2": 7, "x": 72, "y": 456, "name": "Iceberg 4 - 12 Exit 0", "access_rule": []}], "entity_load": [[19, 16], [61, 16]], "locations": ["Iceberg 4 - Enemy 10 (Kabu)"], "music": 19}, {"name": "Iceberg 4 - 13", "level": 5, "stage": 4, "room": 13, "pointer": 3370077, "animal_pointers": [232, 240, 248], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 31, "unkn2": 4, "x": 216, "y": 120, "name": "Iceberg 4 - 13 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 46, "unkn2": 10, "x": 72, "y": 88, "name": "Iceberg 4 - 13 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 57, "unkn2": 10, "x": 312, "y": 88, "name": "Iceberg 4 - 13 Exit 2", "access_rule": []}, {"room": 14, "unkn1": 28, "unkn2": 21, "x": 152, "y": 136, "name": "Iceberg 4 - 13 Exit 3", "access_rule": []}, {"room": 14, "unkn1": 34, "unkn2": 21, "x": 280, "y": 136, "name": "Iceberg 4 - 13 Exit 4", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 1", "Iceberg 4 - Animal 2", "Iceberg 4 - Animal 3"], "music": 19}, {"name": "Iceberg 4 - 14", "level": 5, "stage": 4, "room": 14, "pointer": 3057002, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Broom Hatter", "Sasuke"], "default_exits": [{"room": 15, "unkn1": 4, "unkn2": 8, "x": 88, "y": 360, "name": "Iceberg 4 - 14 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 10, "unkn2": 8, "x": 440, "y": 344, "name": "Iceberg 4 - 14 Exit 1", "access_rule": []}, {"room": 13, "unkn1": 16, "unkn2": 8, "x": 568, "y": 344, "name": "Iceberg 4 - 14 Exit 2", "access_rule": []}, {"room": 15, "unkn1": 22, "unkn2": 8, "x": 344, "y": 360, "name": "Iceberg 4 - 14 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [30, 16]], "locations": ["Iceberg 4 - Enemy 11 (Broom Hatter)", "Iceberg 4 - Enemy 12 (Sasuke)"], "music": 19}, {"name": "Iceberg 4 - 15", "level": 5, "stage": 4, "room": 15, "pointer": 3116124, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 6, "x": 520, "y": 72, "name": "Iceberg 4 - 15 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 4, "unkn2": 22, "x": 88, "y": 136, "name": "Iceberg 4 - 15 Exit 1", "access_rule": []}, {"room": 14, "unkn1": 22, "unkn2": 22, "x": 344, "y": 136, "name": "Iceberg 4 - 15 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 16", "level": 5, "stage": 4, "room": 16, "pointer": 3069937, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 9, "x": 152, "y": 632, "name": "Iceberg 4 - 16 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 4"], "music": 38}, {"name": "Iceberg 4 - 17", "level": 5, "stage": 4, "room": 17, "pointer": 3072413, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 6, "unkn2": 9, "x": 280, "y": 632, "name": "Iceberg 4 - 17 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 5"], "music": 38}, {"name": "Iceberg 4 - 18", "level": 5, "stage": 4, "room": 18, "pointer": 3404593, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 19, "unkn1": 94, "unkn2": 12, "x": 72, "y": 152, "name": "Iceberg 4 - 18 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [43, 16], [30, 16], [15, 16]], "locations": ["Iceberg 4 - Enemy 13 (Nruff)"], "music": 19}, {"name": "Iceberg 4 - 19", "level": 5, "stage": 4, "room": 19, "pointer": 3075826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 4 - 19 Exit 0", "access_rule": []}], "entity_load": [[31, 19], [42, 19]], "locations": ["Iceberg 4 - Name"], "music": 8}, {"name": "Iceberg 4 - 20", "level": 5, "stage": 4, "room": 20, "pointer": 2887943, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 4 - Complete"], "music": 5}, {"name": "Iceberg 5 - 0", "level": 5, "stage": 5, "room": 0, "pointer": 3316135, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 30, "unkn1": 75, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[79, 16], [76, 16], [81, 16], [78, 16], [77, 16], [82, 16], [80, 16], [83, 16]], "locations": ["Iceberg 5 - Enemy 1 (Bukiset (Burning))", "Iceberg 5 - Enemy 2 (Bukiset (Stone))", "Iceberg 5 - Enemy 3 (Bukiset (Ice))", "Iceberg 5 - Enemy 4 (Bukiset (Needle))", "Iceberg 5 - Enemy 5 (Bukiset (Clean))", "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", "Iceberg 5 - Enemy 7 (Bukiset (Spark))", "Iceberg 5 - Enemy 8 (Bukiset (Cutter))"], "music": 16}, {"name": "Iceberg 5 - 1", "level": 5, "stage": 5, "room": 1, "pointer": 3037607, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 72, "y": 104, "name": "Iceberg 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 2", "level": 5, "stage": 5, "room": 2, "pointer": 3103842, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk"], "default_exits": [{"room": 25, "unkn1": 27, "unkn2": 6, "x": 72, "y": 200, "name": "Iceberg 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[16, 16]], "locations": ["Iceberg 5 - Enemy 9 (Glunk)"], "music": 16}, {"name": "Iceberg 5 - 3", "level": 5, "stage": 5, "room": 3, "pointer": 3135899, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 4, "unkn1": 20, "unkn2": 7, "x": 72, "y": 88, "name": "Iceberg 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 10 (Wapod)"], "music": 16}, {"name": "Iceberg 5 - 4", "level": 5, "stage": 5, "room": 4, "pointer": 3180695, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 26, "unkn2": 5, "x": 56, "y": 104, "name": "Iceberg 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 11 (Tick)"], "music": 16}, {"name": "Iceberg 5 - 5", "level": 5, "stage": 5, "room": 5, "pointer": 3106064, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 24, "unkn1": 14, "unkn2": 6, "x": 168, "y": 152, "name": "Iceberg 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[58, 16], [14, 23], [4, 22]], "locations": ["Iceberg 5 - Enemy 12 (Madoo)"], "music": 16}, {"name": "Iceberg 5 - 6", "level": 5, "stage": 5, "room": 6, "pointer": 3276800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 59, "unkn2": 12, "x": 72, "y": 120, "name": "Iceberg 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[55, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 7", "level": 5, "stage": 5, "room": 7, "pointer": 3104585, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 25, "unkn2": 7, "x": 72, "y": 136, "name": "Iceberg 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 8", "level": 5, "stage": 5, "room": 8, "pointer": 3195121, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 35, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 8 Exit 0", "access_rule": []}], "entity_load": [[4, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 9", "level": 5, "stage": 5, "room": 9, "pointer": 3087198, "animal_pointers": [], "consumables": [{"idx": 16, "pointer": 200, "x": 256, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Boulder)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 28, "unkn1": 20, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [54, 16]], "locations": ["Iceberg 5 - 1-Up (Boulder)"], "music": 16}, {"name": "Iceberg 5 - 10", "level": 5, "stage": 5, "room": 10, "pointer": 3321612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 45, "unkn2": 15, "x": 72, "y": 120, "name": "Iceberg 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 11", "level": 5, "stage": 5, "room": 11, "pointer": 3139178, "animal_pointers": [], "consumables": [{"idx": 17, "pointer": 192, "x": 152, "y": 168, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Floor)"}], "consumables_pointer": 176, "enemies": ["Yaban"], "default_exits": [{"room": 12, "unkn1": 17, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 11 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [0, 22]], "locations": ["Iceberg 5 - Enemy 13 (Yaban)", "Iceberg 5 - 1-Up (Floor)"], "music": 16}, {"name": "Iceberg 5 - 12", "level": 5, "stage": 5, "room": 12, "pointer": 3118231, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 7, "x": 72, "y": 104, "name": "Iceberg 5 - 12 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 14 (Propeller)"], "music": 16}, {"name": "Iceberg 5 - 13", "level": 5, "stage": 5, "room": 13, "pointer": 3021658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 27, "unkn1": 16, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 13 Exit 0", "access_rule": []}], "entity_load": [[45, 16]], "locations": ["Iceberg 5 - Enemy 15 (Mariel)"], "music": 16}, {"name": "Iceberg 5 - 14", "level": 5, "stage": 5, "room": 14, "pointer": 3025398, "animal_pointers": [], "consumables": [{"idx": 24, "pointer": 200, "x": 208, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Peloo)"}], "consumables_pointer": 176, "enemies": [], "default_exits": [{"room": 15, "unkn1": 13, "unkn2": 9, "x": 72, "y": 216, "name": "Iceberg 5 - 14 Exit 0", "access_rule": []}], "entity_load": [[64, 16], [0, 22]], "locations": ["Iceberg 5 - 1-Up (Peloo)"], "music": 16}, {"name": "Iceberg 5 - 15", "level": 5, "stage": 5, "room": 15, "pointer": 3167445, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 13, "x": 72, "y": 152, "name": "Iceberg 5 - 15 Exit 0", "access_rule": []}], "entity_load": [[39, 16]], "locations": ["Iceberg 5 - Enemy 16 (Pteran)"], "music": 16}, {"name": "Iceberg 5 - 16", "level": 5, "stage": 5, "room": 16, "pointer": 3033990, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 33, "unkn1": 36, "unkn2": 9, "x": 168, "y": 152, "name": "Iceberg 5 - 16 Exit 0", "access_rule": []}], "entity_load": [[68, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 17", "level": 5, "stage": 5, "room": 17, "pointer": 3100111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 40, "unkn2": 7, "x": 72, "y": 200, "name": "Iceberg 5 - 17 Exit 0", "access_rule": []}], "entity_load": [[52, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 18", "level": 5, "stage": 5, "room": 18, "pointer": 3030947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 17, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 18 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": ["Iceberg 5 - Enemy 17 (Galbo)"], "music": 16}, {"name": "Iceberg 5 - 19", "level": 5, "stage": 5, "room": 19, "pointer": 3105326, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe"], "default_exits": [{"room": 21, "unkn1": 13, "unkn2": 4, "x": 72, "y": 152, "name": "Iceberg 5 - 19 Exit 0", "access_rule": []}], "entity_load": [[51, 16]], "locations": ["Iceberg 5 - Enemy 18 (KeKe)"], "music": 16}, {"name": "Iceberg 5 - 20", "level": 5, "stage": 5, "room": 20, "pointer": 3118928, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 19, "unkn1": 13, "unkn2": 6, "x": 72, "y": 264, "name": "Iceberg 5 - 20 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 5 - Enemy 19 (Nidoo)"], "music": 16}, {"name": "Iceberg 5 - 21", "level": 5, "stage": 5, "room": 21, "pointer": 3202517, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 22, "unkn1": 29, "unkn2": 9, "x": 72, "y": 72, "name": "Iceberg 5 - 21 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16]], "locations": ["Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", "Iceberg 5 - Enemy 22 (Bouncy Drawing)"], "music": 16}, {"name": "Iceberg 5 - 22", "level": 5, "stage": 5, "room": 22, "pointer": 3014656, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Joe"], "default_exits": [{"room": 23, "unkn1": 13, "unkn2": 4, "x": 72, "y": 104, "name": "Iceberg 5 - 22 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 23 (Joe)"], "music": 16}, {"name": "Iceberg 5 - 23", "level": 5, "stage": 5, "room": 23, "pointer": 3166550, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 34, "unkn1": 27, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 23 Exit 0", "access_rule": []}], "entity_load": [[67, 16]], "locations": ["Iceberg 5 - Enemy 24 (Kapar)"], "music": 16}, {"name": "Iceberg 5 - 24", "level": 5, "stage": 5, "room": 24, "pointer": 3029110, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gansan"], "default_exits": [{"room": 31, "unkn1": 10, "unkn2": 4, "x": 72, "y": 88, "name": "Iceberg 5 - 24 Exit 0", "access_rule": []}], "entity_load": [[75, 16]], "locations": ["Iceberg 5 - Enemy 25 (Gansan)"], "music": 16}, {"name": "Iceberg 5 - 25", "level": 5, "stage": 5, "room": 25, "pointer": 3156420, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sasuke"], "default_exits": [{"room": 3, "unkn1": 25, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 25 Exit 0", "access_rule": []}], "entity_load": [[30, 16]], "locations": ["Iceberg 5 - Enemy 26 (Sasuke)"], "music": 16}, {"name": "Iceberg 5 - 26", "level": 5, "stage": 5, "room": 26, "pointer": 3127877, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo"], "default_exits": [{"room": 8, "unkn1": 24, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 5 - 26 Exit 0", "access_rule": []}], "entity_load": [[18, 16]], "locations": ["Iceberg 5 - Enemy 27 (Togezo)"], "music": 16}, {"name": "Iceberg 5 - 27", "level": 5, "stage": 5, "room": 27, "pointer": 3256471, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Bobin"], "default_exits": [{"room": 14, "unkn1": 26, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 27 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [73, 16]], "locations": ["Iceberg 5 - Enemy 28 (Sparky)", "Iceberg 5 - Enemy 29 (Bobin)"], "music": 16}, {"name": "Iceberg 5 - 28", "level": 5, "stage": 5, "room": 28, "pointer": 3029723, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly"], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 248, "name": "Iceberg 5 - 28 Exit 0", "access_rule": []}], "entity_load": [[6, 16]], "locations": ["Iceberg 5 - Enemy 30 (Chilly)"], "music": 16}, {"name": "Iceberg 5 - 29", "level": 5, "stage": 5, "room": 29, "pointer": 3526568, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 29 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [14, 23]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 30", "level": 5, "stage": 5, "room": 30, "pointer": 3022285, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 13, "unkn2": 5, "x": 88, "y": 104, "name": "Iceberg 5 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 1", "Iceberg 5 - Animal 2"], "music": 40}, {"name": "Iceberg 5 - 31", "level": 5, "stage": 5, "room": 31, "pointer": 3026019, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 72, "y": 200, "name": "Iceberg 5 - 31 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 3", "Iceberg 5 - Animal 4"], "music": 40}, {"name": "Iceberg 5 - 32", "level": 5, "stage": 5, "room": 32, "pointer": 3039996, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 32 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 5", "Iceberg 5 - Animal 6"], "music": 40}, {"name": "Iceberg 5 - 33", "level": 5, "stage": 5, "room": 33, "pointer": 3015302, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 33 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 7", "Iceberg 5 - Animal 8"], "music": 40}, {"name": "Iceberg 5 - 34", "level": 5, "stage": 5, "room": 34, "pointer": 3185868, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 35, "unkn1": 35, "unkn2": 9, "x": 200, "y": 328, "name": "Iceberg 5 - 34 Exit 0", "access_rule": []}], "entity_load": [[72, 16], [4, 22], [14, 23]], "locations": ["Iceberg 5 - Enemy 31 (Peran)"], "music": 16}, {"name": "Iceberg 5 - 35", "level": 5, "stage": 5, "room": 35, "pointer": 3865635, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 12, "unkn2": 7, "x": 168, "y": 1384, "name": "Iceberg 5 - 35 Exit 0", "access_rule": []}], "entity_load": [[17, 16], [4, 22]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 36", "level": 5, "stage": 5, "room": 36, "pointer": 3024154, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 37, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 5 - 36 Exit 0", "access_rule": []}], "entity_load": [[32, 19], [42, 19]], "locations": ["Iceberg 5 - Shiro"], "music": 8}, {"name": "Iceberg 5 - 37", "level": 5, "stage": 5, "room": 37, "pointer": 2890594, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 5 - Complete"], "music": 5}, {"name": "Iceberg 6 - 0", "level": 5, "stage": 6, "room": 0, "pointer": 3385305, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 28, "x": 136, "y": 184, "name": "Iceberg 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 12, "unkn2": 28, "x": 248, "y": 184, "name": "Iceberg 6 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 18, "unkn2": 28, "x": 360, "y": 184, "name": "Iceberg 6 - 0 Exit 2", "access_rule": []}], "entity_load": [[15, 16]], "locations": ["Iceberg 6 - Enemy 1 (Nruff)"], "music": 12}, {"name": "Iceberg 6 - 1", "level": 5, "stage": 6, "room": 1, "pointer": 3197599, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 1 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 1", "Iceberg 6 - Animal 2", "Iceberg 6 - Animal 3"], "music": 12}, {"name": "Iceberg 6 - 2", "level": 5, "stage": 6, "room": 2, "pointer": 3097113, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 2 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 3", "level": 5, "stage": 6, "room": 3, "pointer": 3198422, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 3 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 3 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 3 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 4", "Iceberg 6 - Animal 5", "Iceberg 6 - Animal 6"], "music": 12}, {"name": "Iceberg 6 - 4", "level": 5, "stage": 6, "room": 4, "pointer": 3210507, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 4 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 5", "level": 5, "stage": 6, "room": 5, "pointer": 3196776, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 212, "x": 136, "y": 120, "etype": 22, "vtype": 2, "name": "Iceberg 6 - Maxim Tomato (Left)"}, {"idx": 1, "pointer": 220, "x": 248, "y": 120, "etype": 22, "vtype": 0, "name": "Iceberg 6 - 1-Up (Middle)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 4, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 5 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 5 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 5 Exit 2", "access_rule": []}], "entity_load": [[2, 22], [0, 22], [14, 23]], "locations": ["Iceberg 6 - Maxim Tomato (Left)", "Iceberg 6 - 1-Up (Middle)"], "music": 12}, {"name": "Iceberg 6 - 6", "level": 5, "stage": 6, "room": 6, "pointer": 3208130, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 7, "unkn1": 9, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 6 - Enemy 2 (Nidoo)"], "music": 12}, {"name": "Iceberg 6 - 7", "level": 5, "stage": 6, "room": 7, "pointer": 3124478, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky"], "default_exits": [{"room": 8, "unkn1": 17, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[8, 16]], "locations": ["Iceberg 6 - Enemy 3 (Sparky)"], "music": 12}, {"name": "Iceberg 6 - 8", "level": 5, "stage": 6, "room": 8, "pointer": 3110431, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 8 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 14, "unkn2": 5, "x": 296, "y": 136, "name": "Iceberg 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 9", "level": 5, "stage": 6, "room": 9, "pointer": 3139832, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[2, 27]], "locations": ["Iceberg 6 - Miniboss 1 (Blocky)"], "music": 12}, {"name": "Iceberg 6 - 10", "level": 5, "stage": 6, "room": 10, "pointer": 3119624, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 11", "level": 5, "stage": 6, "room": 11, "pointer": 3141139, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 12, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Iceberg 6 - Miniboss 2 (Jumper Shoot)"], "music": 12}, {"name": "Iceberg 6 - 12", "level": 5, "stage": 6, "room": 12, "pointer": 3123788, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 12 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 13", "level": 5, "stage": 6, "room": 13, "pointer": 3143741, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 6 - Miniboss 3 (Yuki)"], "music": 12}, {"name": "Iceberg 6 - 14", "level": 5, "stage": 6, "room": 14, "pointer": 3120319, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 14 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 15", "level": 5, "stage": 6, "room": 15, "pointer": 3135238, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 16, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[27, 16]], "locations": ["Iceberg 6 - Enemy 4 (Sir Kibble)"], "music": 12}, {"name": "Iceberg 6 - 16", "level": 5, "stage": 6, "room": 16, "pointer": 3123096, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 16 Exit 0", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 17", "level": 5, "stage": 6, "room": 17, "pointer": 3144389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 17 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Iceberg 6 - Miniboss 4 (Haboki)"], "music": 12}, {"name": "Iceberg 6 - 18", "level": 5, "stage": 6, "room": 18, "pointer": 3121014, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 19", "level": 5, "stage": 6, "room": 19, "pointer": 3017228, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 19 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Iceberg 6 - Miniboss 5 (Boboo)"], "music": 12}, {"name": "Iceberg 6 - 20", "level": 5, "stage": 6, "room": 20, "pointer": 3121709, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 21, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 21", "level": 5, "stage": 6, "room": 21, "pointer": 3145036, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 21 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Iceberg 6 - Miniboss 6 (Captain Stitch)"], "music": 12}, {"name": "Iceberg 6 - 22", "level": 5, "stage": 6, "room": 22, "pointer": 3116830, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 7, "unkn2": 5, "x": 136, "y": 152, "name": "Iceberg 6 - 22 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 23", "level": 5, "stage": 6, "room": 23, "pointer": 3045263, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 24, "unkn1": 17, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [42, 19]], "locations": ["Iceberg 6 - Angel"], "music": 8}, {"name": "Iceberg 6 - 24", "level": 5, "stage": 6, "room": 24, "pointer": 2889389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 6 - Complete"], "music": 5}, {"name": "Iceberg Boss - 0", "level": 5, "stage": 7, "room": 0, "pointer": 2980207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[8, 18]], "locations": ["Iceberg - Boss (Dedede) Purified", "Level 5 Boss - Defeated", "Level 5 Boss - Purified"], "music": 7}] \ No newline at end of file From 1e85dc40f374ae1af27738ce864a92e4516715d1 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 10 Oct 2023 16:34:36 -0500 Subject: [PATCH 133/165] remove the slow --- worlds/kdl3/Regions.py | 7 +++---- worlds/kdl3/Rules.py | 19 +------------------ 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 02e33e527f39..3fb87144c35e 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -5,11 +5,10 @@ from BaseClasses import Region from worlds.generic.Rules import add_item_rule -from .Locations import KDL3Location, location_table +from .Locations import KDL3Location from .Names import LocationName from .Options import BossShuffle from .Room import Room -from .Rules import can_reach_stage if typing.TYPE_CHECKING: from . import KDL3World @@ -47,7 +46,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing room_entry["animal_pointers"], room_entry["enemies"], room_entry["entity_load"], room_entry["consumables"], room_entry["consumables_pointer"]) room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else - None for location in room_entry["locations"] + None for location in room_entry["locations"] if not any([x in location for x in ["1-Up", "Maxim"]]) or world.multiworld.consumables[world.player]}, KDL3Location) rooms[room.name] = room @@ -95,7 +94,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing else: previous_stage = first_rooms[world.player_levels[level][stage - 1]] world.multiworld.get_location(f"{level_names[previous_stage.level]} {previous_stage.stage}" - f" - Complete", world.player)\ + f" - Complete", world.player) \ .parent_region.add_exits([first_rooms[proper_stage].name]) else: level_regions[level].add_exits([first_rooms[0x770200 + level - 1].name]) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index ee59a7bf398a..17895adb9e57 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -13,24 +13,7 @@ def can_reach_boss(state: "CollectionState", player: int, level: int, open_world if open_world: return state.has(f"{LocationName.level_names_inverse[level]} - Stage Completion", player, ow_boss_req) else: - return can_reach_stage(state, player, level, player_levels[level][6], player_levels) - - -def can_reach_stage(state: "CollectionState", player: int, level: int, stage: int, - player_levels: typing.Dict[int, typing.Dict[int, int]]): - for j in range(7): - if player_levels[level][j] == stage: - return True - elif player_levels[level][j] == 0x77000B: - if not can_reach_kine(state, player): - return False - elif player_levels[level][j] == 0x770011: - if not can_reach_cutter(state, player): - return False - elif player_levels[level][j] == 0x77001C: - if not can_reach_burning(state, player): - return False - return False + return state.can_reach(location_table[player_levels[level][5]], "Location", player) def can_reach_rick(state: "CollectionState", player: int) -> bool: From d1595b77d26adb64f416a6f3675f15f6fdc91703 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 12 Oct 2023 14:37:23 -0500 Subject: [PATCH 134/165] begin move to world options --- worlds/kdl3/Aesthetics.py | 12 ++++---- worlds/kdl3/Options.py | 64 ++++++++++++++++++++------------------- worlds/kdl3/Regions.py | 14 ++++----- worlds/kdl3/Rom.py | 55 +++++++++++++++++---------------- worlds/kdl3/Room.py | 2 +- worlds/kdl3/Rules.py | 16 +++++----- worlds/kdl3/__init__.py | 51 ++++++++++++++++--------------- 7 files changed, 110 insertions(+), 104 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index 476b0122cd48..ee33aa071f8d 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -398,22 +398,22 @@ } -def get_kirby_palette(multiworld, player): - palette = multiworld.kirby_flavor_preset[player].value +def get_kirby_palette(world, player): + palette = world.options.kirby_flavor_preset.value if palette in kirby_flavor_presets: return kirby_flavor_presets[palette] elif palette == KirbyFlavorPreset.option_custom: - return multiworld.kirby_flavor[player].value + return world.options.kirby_flavor.value else: return None -def get_gooey_palette(multiworld, player): - palette = multiworld.gooey_flavor_preset[player].value +def get_gooey_palette(world, player): + palette = world.options.gooey_flavor_preset.value if palette in gooey_flavor_presets: return gooey_flavor_presets[palette] elif palette == GooeyFlavorPreset.option_custom: - return multiworld.gooey_flavor[player].value + return world.options.gooey_flavor.value else: return None diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index eb0d7de90337..7eeb5f313d81 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -1,6 +1,8 @@ import random +from dataclasses import dataclass -from Options import Option, DeathLink, Choice, Toggle, OptionDict, Range, PlandoBosses, DefaultOnToggle +from Options import Option, DeathLink, Choice, Toggle, OptionDict, Range, PlandoBosses, DefaultOnToggle, \ + PerGameCommonOptions import typing from .Names import LocationName @@ -355,33 +357,33 @@ class VirtualConsoleChanges(Choice): default = 1 -kdl3_options: typing.Dict[str, typing.Type[Option[typing.Any]]] = { - "death_link": DeathLink, - "game_language": GameLanguage, - "goal": Goal, - "goal_speed": GoalSpeed, - "total_heart_stars": TotalHeartStars, - "heart_stars_required": HeartStarsRequired, - "filler_percentage": FillerPercentage, - "trap_percentage": TrapPercentage, - "gooey_trap_weight": GooeyTrapPercentage, - "slow_trap_weight": SlowTrapPercentage, - "ability_trap_weight": AbilityTrapPercentage, - "jumping_target": JumpingTarget, - "stage_shuffle": LevelShuffle, - "boss_shuffle": BossShuffle, - "allow_bb": BossShuffleAllowBB, - "animal_randomization": AnimalRandomization, - "copy_ability_randomization": CopyAbilityRandomization, - "strict_bosses": StrictBosses, - "open_world": OpenWorld, - "ow_boss_requirement": OpenWorldBossRequirement, - "boss_requirement_random": BossRequirementRandom, - "consumables": ConsumableChecks, - "kirby_flavor_preset": KirbyFlavorPreset, - "kirby_flavor": KirbyFlavor, - "gooey_flavor_preset": GooeyFlavorPreset, - "gooey_flavor": GooeyFlavor, - "music_shuffle": MusicShuffle, - "virtual_console": VirtualConsoleChanges, -} +@dataclass +class KDL3Options(PerGameCommonOptions): + death_link: DeathLink + game_language: GameLanguage + goal: Goal + goal_speed: GoalSpeed + total_heart_stars: TotalHeartStars + heart_stars_required: HeartStarsRequired + filler_percentage: FillerPercentage + trap_percentage: TrapPercentage + gooey_trap_weight: GooeyTrapPercentage + slow_trap_weight: SlowTrapPercentage + ability_trap_weight: AbilityTrapPercentage + jumping_target: JumpingTarget + stage_shuffle: LevelShuffle + boss_shuffle: BossShuffle + allow_bb: BossShuffleAllowBB + animal_randomization: AnimalRandomization + copy_ability_randomization: CopyAbilityRandomization + strict_bosses: StrictBosses + open_world: OpenWorld + ow_boss_requirement: OpenWorldBossRequirement + boss_requirement_random: BossRequirementRandom + consumables: ConsumableChecks + kirby_flavor_preset: KirbyFlavorPreset + kirby_flavor: KirbyFlavor + gooey_flavor_preset: GooeyFlavorPreset + gooey_flavor: GooeyFlavor + music_shuffle: MusicShuffle + virtual_console: VirtualConsoleChanges diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 3fb87144c35e..682b43a78dde 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -48,7 +48,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else None for location in room_entry["locations"] if not any([x in location for x in ["1-Up", "Maxim"]]) or - world.multiworld.consumables[world.player]}, KDL3Location) + world.options.consumables}, KDL3Location) rooms[room.name] = room for location in room.locations: if "Animal" in location.name: @@ -81,7 +81,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing exits.keys(), exits ) - if world.multiworld.open_world[world.player]: + if world.options.open_world: if any(["Complete" in location.name for location in room.locations]): room.add_locations({f"{level_names[room.level]} {room.stage} - Stage Completion": None}, KDL3Location) @@ -89,7 +89,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing for level in world.player_levels: for stage in range(6): proper_stage = world.player_levels[level][stage] - if world.multiworld.open_world[world.player] or stage == 0: + if world.options.open_world or stage == 0: level_regions[level].add_exits([first_rooms[proper_stage].name]) else: previous_stage = first_rooms[world.player_levels[level][stage - 1]] @@ -126,7 +126,7 @@ def generate_valid_levels(world: "KDL3World", enforce_world: bool, enforce_patte except Exception: raise Exception( f"Invalid connection: {connection.entrance} =>" - f" {connection.exit} for player {world.player} ({world.multiworld.player_name[world.player]})") + f" {connection.exit} for player {world.player} ({world.player_name})") for level in range(1, 6): for stage in range(6): @@ -146,7 +146,7 @@ def generate_valid_levels(world: "KDL3World", enforce_world: bool, enforce_patte raise Exception(f"Failed to find valid stage for {level}-{stage}. Remaining Stages:{possible_stages}") # now handle bosses - boss_shuffle: typing.Union[int, str] = world.multiworld.boss_shuffle[world.player].value + boss_shuffle: typing.Union[int, str] = world.options.boss_shuffle.value plando_bosses = [] if isinstance(boss_shuffle, str): # boss plando @@ -208,7 +208,7 @@ def create_levels(world: "KDL3World") -> None: 4: level4, 5: level5, } - level_shuffle = world.multiworld.stage_shuffle[world.player] + level_shuffle = world.options.stage_shuffle.value if level_shuffle != 0: world.player_levels = generate_valid_levels( world, @@ -217,7 +217,7 @@ def create_levels(world: "KDL3World") -> None: generate_rooms(world, False, levels) - level6.add_locations({LocationName.goals[world.multiworld.goal[world.player]]: None}, KDL3Location) + level6.add_locations({LocationName.goals[world.options.goal]: None}, KDL3Location) menu.connect(level1, "Start Game") level1.connect(level2, "To Level 2") diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index d0d8435911f1..df6c87ab41c5 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -3,7 +3,7 @@ from random import Random import Utils -from typing import Optional, Dict, List +from typing import Optional, Dict, List, TYPE_CHECKING import hashlib import os import struct @@ -17,6 +17,9 @@ from .Room import Room +if TYPE_CHECKING: + from . import KDL3World + KDL3UHASH = "201e7658f6194458a3869dde36bf8ec2" KDL3JHASH = "b2f2d004ea640c3db66df958fce122b2" @@ -376,7 +379,7 @@ def patch(self, target: str): rom.write_to_file(target) -def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_required: int, +def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomData, heart_stars_required: int, boss_requirements: Dict[int, int], shuffled_levels: Dict[int, List[int]], bb_boss_enabled: List[bool], copy_abilities: Dict[str, str], slot_random: Random): # increase BWRAM by 0x8000 @@ -1024,7 +1027,7 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req # base patch done, write relevant slot info # Write strict bosses patch - if multiworld.strict_bosses[player]: + if world.options.strict_bosses: rom.write_bytes(0x3A000, [0xDA, # PHX 0xAD, 0xCB, 0x53, # LDA $53CB - unlocked level 0xC9, 0x05, 0x00, # CMP #$0005 - have we unlocked level 5? @@ -1048,7 +1051,7 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req rom.write_bytes(0x143D9, [0x22, 0x00, 0xA0, 0x07, 0xEA, 0xEA, ]) # Write open world patch - if multiworld.open_world[player]: + if world.options.open_world: rom.write_bytes(0x14238, [0xA9, 0x06, 0x00, # LDA #$0006 0x22, 0x80, 0x9A, 0x07, # JSL $079A80 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # set starting stages to 6 @@ -1128,7 +1131,7 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req rom.write_bytes(0x143F0, [0x22, 0x00, 0xA1, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # Write checks for consumable-sanity - if multiworld.consumables[player]: + if world.options.consumables: # Redirect Consumable Effect and write index rom.write_bytes(0x3001E, [0x22, 0x80, 0x9E, 0x07, 0x4A, 0xC9, 0x05, 0x00, 0xB0, 0xFE, 0x0A, 0xAA, 0x7C, 0x2D, 0x00, 0x37, 0x00, 0x37, 0x00, 0x7E, 0x00, 0x94, 0x00, 0x37, 0x00, 0xA9, 0x26, 0x00, @@ -1182,8 +1185,8 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req ]) rooms = [region for region in multiworld.regions if region.player == player and isinstance(region, Room)] - if multiworld.music_shuffle[player] > 0: - if multiworld.music_shuffle[player] == 1: + if world.options.music_shuffle > 0: + if world.options.music_shuffle == 1: shuffled_music = music_choices.copy() slot_random.shuffle(shuffled_music) music_map = dict(zip(music_choices, shuffled_music)) @@ -1205,7 +1208,7 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req # Heart Star success and fail rom.write_byte(0x4A388, music_map[0x08]) rom.write_byte(0x4A38D, music_map[0x1D]) - elif multiworld.music_shuffle[player] == 2: + elif world.options.music_shuffle == 2: for room in rooms: room.music = slot_random.choice(music_choices) for room in room_pointers: @@ -1222,7 +1225,7 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req for room in rooms: room.patch(rom) - if multiworld.virtual_console[player] in [1, 3]: + if world.options.virtual_console in [1, 3]: # Flash Reduction rom.write_byte(0x9AE68, 0x10) rom.write_bytes(0x9AE8E, [0x08, 0x00, 0x22, 0x5D, 0xF7, 0x00, 0xA2, 0x08, ]) @@ -1231,7 +1234,7 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req rom.write_bytes(0x9AED2, [0xA9, 0x1F]) rom.write_byte(0x9AEE1, 0x08) - if multiworld.virtual_console[player] in [2, 3]: + if world.options.virtual_console in [2, 3]: # Hyper Zone BB colors rom.write_bytes(0x2C5E16, [0xEE, 0x1B, 0x18, 0x5B, 0xD3, 0x4A, 0xF4, 0x3B, ]) rom.write_bytes(0x2C8217, [0xFF, 0x1E, ]) @@ -1239,13 +1242,13 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req # boss requirements rom.write_bytes(0x3D000, struct.pack("HHHHH", boss_requirements[0], boss_requirements[1], boss_requirements[2], boss_requirements[3], boss_requirements[4])) - rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if multiworld.goal_speed[player] == 1 else 0xFFFF)) - rom.write_byte(0x3D00C, multiworld.goal_speed[player]) - rom.write_byte(0x3D010, multiworld.death_link[player]) - rom.write_byte(0x3D012, multiworld.goal[player]) - rom.write_byte(0x3D014, multiworld.stage_shuffle[player]) - rom.write_byte(0x3D016, multiworld.ow_boss_requirement[player]) - rom.write_byte(0x3D018, multiworld.consumables[player]) + rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if world.options.goal_speed == 1 else 0xFFFF)) + rom.write_byte(0x3D00C, world.options.goal_speed.value) + rom.write_byte(0x3D010, world.options.death_link.value) + rom.write_byte(0x3D012, world.options.goal.value) + rom.write_byte(0x3D014, world.options.stage_shuffle.value) + rom.write_byte(0x3D016, world.options.ow_boss_requirement.value) + rom.write_byte(0x3D018, world.options.consumables.value) for level in shuffled_levels: for i in range(len(shuffled_levels[level])): @@ -1262,7 +1265,7 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req rom.write_bytes(0x3F0000 + (level_pointers[0x770200 + i]), struct.pack("I", bb_bosses[0x770200 + i])) # copy ability shuffle - if multiworld.copy_ability_randomization[player] > 0: + if world.options.copy_ability_randomization.value > 0: for enemy in copy_abilities: if enemy in miniboss_remap: rom.write_bytes(0xB417E + (miniboss_remap[enemy] << 1), @@ -1289,32 +1292,32 @@ def patch_rom(multiworld: MultiWorld, player: int, rom: RomData, heart_stars_req rom.write_byte(0x2F90E2, 0x5E + (ability_remap[copy_abilities["Captain Stitch"]] << 1)) rom.write_byte(0x2F9109, 0x5E + (ability_remap[copy_abilities["Captain Stitch"]] << 1)) - if multiworld.copy_ability_randomization[player] == 2: + if world.options.copy_ability_randomization == 2: for enemy in enemy_remap: # we just won't include it for minibosses rom.write_bytes(0xB3E40 + (enemy_remap[enemy] << 1), struct.pack("h", slot_random.randint(-1, 2))) # write jumping goal - rom.write_bytes(0x94F8, struct.pack("H", multiworld.jumping_target[player])) - rom.write_bytes(0x944E, struct.pack("H", multiworld.jumping_target[player])) + rom.write_bytes(0x94F8, struct.pack("H", world.options.jumping_target)) + rom.write_bytes(0x944E, struct.pack("H", world.options.jumping_target)) from Utils import __version__ rom.name = bytearray(f'KDL3{__version__.replace(".", "")[0:3]}_{player}_{multiworld.seed:11}\0', 'utf8')[:21] rom.name.extend([0] * (21 - len(rom.name))) rom.write_bytes(0x3C000, rom.name) - rom.write_byte(0x3C020, multiworld.game_language[player].value) + rom.write_byte(0x3C020, world.options.game_language.value) # handle palette - if multiworld.kirby_flavor_preset[player] != 0: + if world.options.kirby_flavor_preset.value != 0: for addr in kirby_target_palettes: target = kirby_target_palettes[addr] - palette = get_kirby_palette(multiworld, player) + palette = get_kirby_palette(world, player) rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1], target[2])) - if multiworld.gooey_flavor_preset[player] != 0: + if world.options.gooey_flavor_preset.value != 0: for addr in gooey_target_palettes: target = gooey_target_palettes[addr] - palette = get_gooey_palette(multiworld, player) + palette = get_gooey_palette(world, player) rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1], target[2])) diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index c011535ed6a7..b77e3945c3b1 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -48,7 +48,7 @@ def patch(self, rom: "RomData"): if len(animals) > 0: for current_animal, address in zip(animals, self.animal_pointers): rom.write_byte(self.pointer + address + 7, animal_map[current_animal]) - if self.multiworld.consumables[self.player]: + if self.multiworld.worlds[self.player].options.consumables.value: load_len = len(self.entity_load) for consumable in self.consumables: location = next(x for x in self.locations if x.name == consumable["name"]) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 17895adb9e57..6cf5e67bfe42 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -8,7 +8,7 @@ from BaseClasses import CollectionState -def can_reach_boss(state: "CollectionState", player: int, level: int, open_world: bool, +def can_reach_boss(state: "CollectionState", player: int, level: int, open_world: int, ow_boss_req: int, player_levels: typing.Dict[int, typing.Dict[int, int]]): if open_world: return state.has(f"{LocationName.level_names_inverse[level]} - Stage Completion", player, ow_boss_req) @@ -172,7 +172,7 @@ def set_rules(world: "KDL3World") -> None: lambda state: can_fix_angel_wings(state, world.player, world.copy_abilities)) # Consumables - if world.multiworld.consumables[world.player]: + if world.options.consumables: add_rule(world.multiworld.get_location(LocationName.grass_land_1_u1, world.player), lambda state: can_reach_parasol(state, world.player)) add_rule(world.multiworld.get_location(LocationName.grass_land_1_m1, world.player), @@ -253,17 +253,17 @@ def set_rules(world: "KDL3World") -> None: set_rule(world.multiworld.get_location(boss_flag, world.player), lambda state, i=i: (state.has("Heart Star", world.player, world.boss_requirements[i - 1]) and can_reach_boss(state, world.player, i, - world.multiworld.open_world[world.player], - world.multiworld.ow_boss_requirement[world.player], + world.options.open_world.value, + world.options.ow_boss_requirement.value, world.player_levels))) set_rule(world.multiworld.get_location(purification, world.player), lambda state, i=i: (state.has("Heart Star", world.player, world.boss_requirements[i - 1]) and can_reach_boss(state, world.player, i, - world.multiworld.open_world[world.player], - world.multiworld.ow_boss_requirement[world.player], + world.options.open_world.value, + world.options.ow_boss_requirement.value, world.player_levels))) - if world.multiworld.strict_bosses[world.player]: + if world.options.strict_bosses: for level in range(2, 6): add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), lambda state, i=level: state.has(f"Level {i - 1} Boss Purified", world.player)) @@ -275,7 +275,7 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), lambda state, i=level: state.has(f"Level {i - 1} Boss Defeated", world.player)) - if world.multiworld.goal_speed[world.player] == 0: + if world.options.goal_speed == 0: add_rule(world.multiworld.get_entrance("To Level 6", world.player), lambda state: state.has_all(["Level 1 Boss Purified", "Level 2 Boss Purified", "Level 3 Boss Purified", "Level 4 Boss Purified", "Level 5 Boss Purified"], world.player)) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 7593afed6a15..5d4eec0b9fa3 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -3,6 +3,7 @@ from BaseClasses import Tutorial, ItemClassification, MultiWorld from Fill import fill_restrictive +from Options import PerGameCommonOptions from worlds.AutoWorld import World, WebWorld from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item, \ trap_item_table, copy_ability_access_table @@ -10,7 +11,7 @@ from .Names.AnimalFriendSpawns import animal_friend_spawns from .Names.EnemyAbilities import vanilla_enemies, enemy_mapping, enemy_restrictive from .Regions import create_levels, default_levels -from .Options import kdl3_options +from .Options import KDL3Options from .Names import LocationName from .Rules import set_rules from .Rom import KDL3DeltaPatch, get_base_rom_path, RomData, patch_rom, KDL3JHASH, KDL3UHASH @@ -62,7 +63,8 @@ class KDL3World(World): """ game = "Kirby's Dream Land 3" - option_definitions = kdl3_options + options_dataclass: typing.ClassVar[typing.Type[PerGameCommonOptions]] = KDL3Options + options: KDL3Options item_name_to_id = {item: item_table[item].code for item in item_table} location_name_to_id = {location_table[location]: location for location in location_table} item_name_groups = item_names @@ -105,12 +107,12 @@ def get_filler_item_name(self) -> str: def get_trap_item_name(self) -> str: return self.random.choices(["Gooey Bag", "Slowness", "Eject Ability"], - weights=[self.multiworld.gooey_trap_weight[self.player], - self.multiworld.slow_trap_weight[self.player], - self.multiworld.ability_trap_weight[self.player]])[0] + weights=[self.options.gooey_trap_weight.value, + self.options.slow_trap_weight.value, + self.options.ability_trap_weight.value])[0] def generate_early(self) -> None: - if self.multiworld.copy_ability_randomization[self.player]: + if self.options.copy_ability_randomization: # randomize copy abilities valid_abilities = list(copy_ability_access_table.keys()) enemies_to_set = list(self.copy_abilities.keys()) @@ -138,7 +140,7 @@ def pre_fill(self) -> None: self.multiworld.get_location(enemy, self.player) \ .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) # fill animals - if self.multiworld.animal_randomization[self.player] != 0: + if self.options.animal_randomization != 0: spawns = [animal for animal in animal_friend_spawns.keys() if animal not in ["Ripple Field 5 - Animal 2", "Sand Canyon 6 - Animal 1", "Iceberg 4 - Animal 1"]] self.multiworld.get_location("Iceberg 4 - Animal 1", self.player) \ @@ -150,7 +152,7 @@ def pre_fill(self) -> None: self.multiworld.get_location("Sand Canyon 6 - Animal 1", self.player) \ .place_locked_item(self.create_item(guaranteed_animal)) # Ripple Field 5 - Animal 2 needs to be Pitch to ensure accessibility on non-door rando - if self.multiworld.animal_randomization[self.player] == 1: + if self.options.animal_randomization == 1: animal_pool = [animal_friend_spawns[spawn] for spawn in animal_friend_spawns if spawn not in ["Ripple Field 5 - Animal 2", "Sand Canyon 6 - Animal 1", "Iceberg 4 - Animal 1"]] @@ -174,35 +176,34 @@ def pre_fill(self) -> None: self.multiworld.get_location(animal, self.player) \ .place_locked_item(self.create_item(animal_friends[animal])) - def create_items(self) -> None: itempool = [] itempool.extend([self.create_item(name) for name in copy_ability_table]) itempool.extend([self.create_item(name) for name in animal_friend_table]) - required_percentage = self.multiworld.heart_stars_required[self.player] / 100.0 - remaining_items = (len(location_table) if self.multiworld.consumables[self.player] + required_percentage = self.options.heart_stars_required / 100.0 + remaining_items = (len(location_table) if self.options.consumables else len(location_table) - len(consumable_locations)) - len(itempool) - total_heart_stars = self.multiworld.total_heart_stars[self.player] + total_heart_stars = self.options.total_heart_stars required_heart_stars = max(math.floor(total_heart_stars * required_percentage), 5) # ensure at least 1 heart star required filler_items = total_heart_stars - required_heart_stars - filler_amount = math.floor(filler_items * (self.multiworld.filler_percentage[self.player] / 100.0)) - trap_amount = math.floor(filler_amount * (self.multiworld.trap_percentage[self.player] / 100.0)) + filler_amount = math.floor(filler_items * (self.options.filler_percentage / 100.0)) + trap_amount = math.floor(filler_amount * (self.options.trap_percentage / 100.0)) filler_amount -= trap_amount non_required_heart_stars = filler_items - filler_amount - trap_amount self.required_heart_stars = required_heart_stars # handle boss requirements here requirements = [required_heart_stars] quotient = required_heart_stars // 5 # since we set the last manually, we can afford imperfect rounding - if self.multiworld.boss_requirement_random[self.player]: + if self.options.boss_requirement_random: for i in range(1, 5): - if self.multiworld.strict_bosses[self.player]: + if self.options.strict_bosses: max_stars = quotient * i else: max_stars = required_heart_stars requirements.insert(i, self.random.randint( min(1, max_stars), max_stars)) - if self.multiworld.strict_bosses[self.player]: + if self.options.strict_bosses: requirements.sort() else: self.random.shuffle(requirements) @@ -217,7 +218,7 @@ def create_items(self) -> None: for _ in range(trap_amount)]) itempool.extend([self.create_item("Heart Star", True) for _ in range(non_required_heart_stars)]) self.multiworld.itempool += itempool - if self.multiworld.open_world[self.player]: + if self.options.open_world: for level in self.player_levels: for stage in range(0, 6): self.multiworld.get_location(location_table[self.player_levels[level][stage]] @@ -229,8 +230,8 @@ def create_items(self) -> None: set_rules = set_rules def generate_basic(self) -> None: - self.stage_shuffle_enabled = self.multiworld.stage_shuffle[self.player] > 0 - goal = self.multiworld.goal[self.player] + self.stage_shuffle_enabled = self.options.stage_shuffle > 0 + goal = self.options.goal goal_location = self.multiworld.get_location(LocationName.goals[goal], self.player) goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, self.player)) for level in range(1, 6): @@ -240,12 +241,12 @@ def generate_basic(self) -> None: self.multiworld.get_location(f"Level {level} Boss - Purified", self.player) \ .place_locked_item( KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) - self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) + self.options.completion_condition = lambda state: state.has("Love-Love Rod", self.player) # this can technically be done at any point before generate_output self.boss_butch_bosses.extend([None for _ in range(6)]) - if self.multiworld.allow_bb[self.player]: + if self.options.allow_bb: for i in range(6): - if self.multiworld.allow_bb[self.player] == 1: + if self.options.allow_bb == 1: self.boss_butch_bosses[i] = self.random.choice( [True, False]) else: @@ -258,7 +259,7 @@ def generate_output(self, output_directory: str): player = self.player rom = RomData(get_base_rom_path()) - patch_rom(self.multiworld, self.player, rom, self.required_heart_stars, + patch_rom(self, self.multiworld, self.player, rom, self.required_heart_stars, self.boss_requirements, self.player_levels, self.boss_butch_bosses, @@ -305,7 +306,7 @@ def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): level_hint_data[stage] = regions[level] + f" {i + 1}" if stage & 0x200 == 0: level_hint_data[stage + 0x100] = regions[level] + f" {i + 1}" - if self.multiworld.consumables[self.player] and stage & 0xFF in level_consumables: + if self.options.consumables and stage & 0xFF in level_consumables: for consumable in level_consumables[stage & 0xFF]: level_hint_data[consumable + 0x770300] = regions[level] + f" {i + 1}" for i in range(5): From 60b699b94a6ac57f8b433d0dc9f97f10eb31d4f7 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Fri, 13 Oct 2023 00:15:16 -0500 Subject: [PATCH 135/165] fix test failures --- worlds/kdl3/__init__.py | 2 +- worlds/kdl3/test/__init__.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 5d4eec0b9fa3..29b6d9cda8f2 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -241,7 +241,7 @@ def generate_basic(self) -> None: self.multiworld.get_location(f"Level {level} Boss - Purified", self.player) \ .place_locked_item( KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) - self.options.completion_condition = lambda state: state.has("Love-Love Rod", self.player) + self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) # this can technically be done at any point before generate_output self.boss_butch_bosses.extend([None for _ in range(6)]) if self.options.allow_bb: diff --git a/worlds/kdl3/test/__init__.py b/worlds/kdl3/test/__init__.py index d962b7efa97e..11a17e63b7fa 100644 --- a/worlds/kdl3/test/__init__.py +++ b/worlds/kdl3/test/__init__.py @@ -1,7 +1,7 @@ import typing from argparse import Namespace -from BaseClasses import MultiWorld, PlandoOptions +from BaseClasses import MultiWorld, PlandoOptions, CollectionState from test.TestBase import WorldTestBase from test.general import gen_steps from worlds import AutoWorld @@ -24,13 +24,13 @@ def world_setup(self, seed: typing.Optional[int] = None) -> None: self.multiworld.game[1] = self.game self.multiworld.player_name = {1: "Tester"} self.multiworld.set_seed(seed) + self.multiworld.state = CollectionState(self.multiworld) args = Namespace() - for name, option in AutoWorld.AutoWorldRegister.world_types[self.game].option_definitions.items(): + for name, option in AutoWorld.AutoWorldRegister.world_types[self.game].options_dataclass.type_hints.items(): setattr(args, name, { 1: option.from_any(self.options.get(name, getattr(option, "default"))) }) self.multiworld.set_options(args) - self.multiworld.set_default_common_options() self.multiworld.plando_options = PlandoOptions.connections self.multiworld.plando_connections = self.options["plando_connections"] if "plando_connections" in self.options.keys() else [] for step in gen_steps: From 2d721a2f47a56defdc4f2fff4aaeda966d648e6f Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 25 Oct 2023 01:16:57 -0500 Subject: [PATCH 136/165] rename room --- worlds/kdl3/Regions.py | 8 ++++---- worlds/kdl3/Rom.py | 4 ++-- worlds/kdl3/Room.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 682b43a78dde..663ac4a42db7 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -8,7 +8,7 @@ from .Locations import KDL3Location from .Names import LocationName from .Options import BossShuffle -from .Room import Room +from .Room import KDL3Room if typing.TYPE_CHECKING: from . import KDL3World @@ -39,9 +39,9 @@ def generate_valid_level(level, stage, possible_stages, slot_random): def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing.Dict[int, Region]): level_names = {LocationName.level_names[level]: level for level in LocationName.level_names} room_data = json.loads(get_data(__name__, os.path.join("data", "Rooms.json"))) - rooms: typing.Dict[str, Room] = dict() + rooms: typing.Dict[str, KDL3Room] = dict() for room_entry in room_data: - room = Room(room_entry["name"], world.player, world.multiworld, None, room_entry["level"], room_entry["stage"], + room = KDL3Room(room_entry["name"], world.player, world.multiworld, None, room_entry["level"], room_entry["stage"], room_entry["room"], room_entry["pointer"], room_entry["music"], room_entry["default_exits"], room_entry["animal_pointers"], room_entry["enemies"], room_entry["entity_load"], room_entry["consumables"], room_entry["consumables_pointer"]) @@ -56,7 +56,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing "Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn" }) world.multiworld.regions.extend([rooms[room] for room in rooms]) - first_rooms: typing.Dict[int, Room] = dict() + first_rooms: typing.Dict[int, KDL3Room] = dict() if door_shuffle: # first, we need to generate the notable edge cases # 5-6 is the first, being the most restrictive diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index df6c87ab41c5..a7f9f4009635 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -15,7 +15,7 @@ from .Compression import hal_decompress import bsdiff4 -from .Room import Room +from .Room import KDL3Room if TYPE_CHECKING: from . import KDL3World @@ -1184,7 +1184,7 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD 0x6B, # RTL ]) - rooms = [region for region in multiworld.regions if region.player == player and isinstance(region, Room)] + rooms = [region for region in multiworld.get_regions(player) if isinstance(region, KDL3Room)] if world.options.music_shuffle > 0: if world.options.music_shuffle == 1: shuffled_music = music_choices.copy() diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index b77e3945c3b1..ade496d813e3 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -15,7 +15,7 @@ } -class Room(Region): +class KDL3Room(Region): pointer: int = 0 level: int = 0 stage: int = 0 From d4ca90011f34e47ea55f106fbcfd309bbe47456b Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 5 Nov 2023 13:57:38 -0600 Subject: [PATCH 137/165] fix hs visual misreporting --- worlds/kdl3/Rom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index a7f9f4009635..2ef35c621a5a 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -936,10 +936,10 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD 0xBD, 0x20, 0x90, # LDA $9020, X 0x3A, # DEC 0xAA, # TAX - 0xC9, 0x07, 0x00, # CMP #$0007 + 0xC9, 0x06, 0x00, # CMP #$0006 0x30, 0x07, # BMI $07A495 0xE8, # INX - 0x18, # CLC + 0x38, # SEC 0xE9, 0x06, 0x00, # SBC #$0006 0x80, 0xF4, # BRA $07A489 0xBD, 0xA7, 0x53, # LDA $53A7, X From 46a9cbcfe434bffdf6db36a20fa9b542897c3737 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 9 Nov 2023 00:53:52 -0600 Subject: [PATCH 138/165] general world cleanup --- worlds/kdl3/Aesthetics.py | 9 ++++++--- worlds/kdl3/Locations.py | 4 ++-- worlds/kdl3/Options.py | 34 ++++++++++++++++++++++++++++++---- worlds/kdl3/Regions.py | 14 ++++++++------ worlds/kdl3/Rom.py | 13 ++++++------- worlds/kdl3/Room.py | 2 +- worlds/kdl3/__init__.py | 11 ++++------- 7 files changed, 57 insertions(+), 30 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index ee33aa071f8d..2c6720637bed 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -398,7 +398,7 @@ } -def get_kirby_palette(world, player): +def get_kirby_palette(world): palette = world.options.kirby_flavor_preset.value if palette in kirby_flavor_presets: return kirby_flavor_presets[palette] @@ -408,7 +408,7 @@ def get_kirby_palette(world, player): return None -def get_gooey_palette(world, player): +def get_gooey_palette(world): palette = world.options.gooey_flavor_preset.value if palette in gooey_flavor_presets: return gooey_flavor_presets[palette] @@ -429,7 +429,10 @@ def rgb888_to_bgr555(red, green, blue) -> bytes: def get_palette_bytes(palette, target, offset, factor): output_data = bytearray() for color in target: - colint = int(palette[color], 16) + hexcol = palette[color] + if hexcol.startswith("#"): + hexcol = hexcol.replace("#", "") + colint = int(hexcol, 16) col = ((colint & 0xFF0000) >> 16, (colint & 0xFF00) >> 8, colint & 0xFF) col = tuple(int(int(factor*x) + offset) for x in col) byte_data = rgb888_to_bgr555(col[0], col[1], col[2]) diff --git a/worlds/kdl3/Locations.py b/worlds/kdl3/Locations.py index d87bf8f8c1bc..9edf13ac4912 100644 --- a/worlds/kdl3/Locations.py +++ b/worlds/kdl3/Locations.py @@ -3,12 +3,12 @@ from .Names import LocationName if typing.TYPE_CHECKING: - from .Room import Room + from .Room import KDL3Room class KDL3Location(Location): game: str = "Kirby's Dream Land 3" - room: typing.Optional["Room"] = None + room: typing.Optional["KDL3Room"] = None def __init__(self, player: int, name: str, address: typing.Optional[int], parent: typing.Union[Region, None]): super().__init__(player, name, address, parent) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 7eeb5f313d81..b7424aa51b26 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -131,8 +131,8 @@ class AnimalRandomization(Choice): class CopyAbilityRandomization(Choice): """ Disabled: enemies give regular copy abilities and health. - Enabled: all enemies (except minibosses) will have the copy ability received from them randomized. - Enabled Plus Minus: enemies can additionally give you anywhere from +3 health to -3 health when eaten. + Enabled: all enemies will have the copy ability received from them randomized. + Enabled Plus Minus: enemies (except minibosses) can additionally give you anywhere from +2 health to -1 health when eaten. """ display_name = "Copy Ability Randomization" option_disabled = 0 @@ -286,7 +286,23 @@ class KirbyFlavor(OptionDict): A custom color for Kirby. To use a custom color, set the preset to Custom and then define a dict of keys from "1" to "15", with their values being an HTML hex color. """ - default = {} + default = { + "1": "B01810", + "2": "F0E0E8", + "3": "C8A0A8", + "4": "A87070", + "5": "E02018", + "6": "F0A0B8", + "7": "D07880", + "8": "A85048", + "9": "E8D0D0", + "10": "E85048", + "11": "D0C0C0", + "12": "B08888", + "13": "E87880", + "14": "F8F8F8", + "15": "B03830", + } class GooeyFlavorPreset(Choice): @@ -326,7 +342,17 @@ class GooeyFlavor(OptionDict): A custom color for Gooey. To use a custom color, set the preset to Custom and then define a dict of keys from "1" to "15", with their values being an HTML hex color. """ - default = {} + default = { + "1": "000808", + "2": "102838", + "3": "183048", + "4": "183878", + "5": "1838A0", + "6": "B01810", + "7": "E85048", + "8": "D0C0C0", + "9": "F8F8F8", + } class MusicShuffle(Choice): diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 663ac4a42db7..0d6f389c80b7 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -41,12 +41,12 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing room_data = json.loads(get_data(__name__, os.path.join("data", "Rooms.json"))) rooms: typing.Dict[str, KDL3Room] = dict() for room_entry in room_data: - room = KDL3Room(room_entry["name"], world.player, world.multiworld, None, room_entry["level"], room_entry["stage"], - room_entry["room"], room_entry["pointer"], room_entry["music"], room_entry["default_exits"], - room_entry["animal_pointers"], room_entry["enemies"], room_entry["entity_load"], - room_entry["consumables"], room_entry["consumables_pointer"]) + room = KDL3Room(room_entry["name"], world.player, world.multiworld, None, room_entry["level"], + room_entry["stage"], room_entry["room"], room_entry["pointer"], room_entry["music"], + room_entry["default_exits"], room_entry["animal_pointers"], room_entry["enemies"], + room_entry["entity_load"], room_entry["consumables"], room_entry["consumables_pointer"]) room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else - None for location in room_entry["locations"] + None for location in room_entry["locations"] if not any([x in location for x in ["1-Up", "Maxim"]]) or world.options.consumables}, KDL3Location) rooms[room.name] = room @@ -55,7 +55,9 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing add_item_rule(location, lambda item: item.name in { "Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn" }) - world.multiworld.regions.extend([rooms[room] for room in rooms]) + world.rooms = [rooms[room] for room in rooms] + world.multiworld.regions.extend(world.rooms) + first_rooms: typing.Dict[int, KDL3Room] = dict() if door_shuffle: # first, we need to generate the notable edge cases diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 2ef35c621a5a..92516eeeb3dd 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -8,6 +8,7 @@ import os import struct +import settings from BaseClasses import MultiWorld from worlds.Files import APDeltaPatch from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette, gooey_target_palettes, \ @@ -15,8 +16,6 @@ from .Compression import hal_decompress import bsdiff4 -from .Room import KDL3Room - if TYPE_CHECKING: from . import KDL3World @@ -1009,7 +1008,7 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD 0x8F, 0x16, 0x21, 0x00, # STA VMADDL 0xBF, 0x40, 0xE0, 0x07, # LDA $07E040, X 0x8F, 0x18, 0x21, 0x00, # STA VMDATAL - 0x80, 0xDF, # BRA $07A5AF - retun to loop head + 0x80, 0xDF, # BRA $07A5AF - return to loop head 0x7A, # PLY 0xFA, # PLX 0x6B, # RTL @@ -1184,7 +1183,7 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD 0x6B, # RTL ]) - rooms = [region for region in multiworld.get_regions(player) if isinstance(region, KDL3Room)] + rooms = world.rooms if world.options.music_shuffle > 0: if world.options.music_shuffle == 1: shuffled_music = music_choices.copy() @@ -1311,13 +1310,13 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD if world.options.kirby_flavor_preset.value != 0: for addr in kirby_target_palettes: target = kirby_target_palettes[addr] - palette = get_kirby_palette(world, player) + palette = get_kirby_palette(world) rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1], target[2])) if world.options.gooey_flavor_preset.value != 0: for addr in gooey_target_palettes: target = gooey_target_palettes[addr] - palette = get_gooey_palette(world, player) + palette = get_gooey_palette(world) rom.write_bytes(addr, get_palette_bytes(palette, target[0], target[1], target[2])) @@ -1337,7 +1336,7 @@ def get_base_rom_bytes() -> bytes: def get_base_rom_path(file_name: str = "") -> str: - options: Utils.OptionsType = Utils.get_options() + options: settings.Settings = settings.get_settings() if not file_name: file_name = options["kdl3_options"]["rom_file"] if not os.path.exists(file_name): diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index ade496d813e3..43ffe675d3a8 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -48,7 +48,7 @@ def patch(self, rom: "RomData"): if len(animals) > 0: for current_animal, address in zip(animals, self.animal_pointers): rom.write_byte(self.pointer + address + 7, animal_map[current_animal]) - if self.multiworld.worlds[self.player].options.consumables.value: + if self.multiworld.worlds[self.player].options.consumables: load_len = len(self.entity_load) for consumable in self.consumables: location = next(x for x in self.locations if x.name == consumable["name"]) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 29b6d9cda8f2..bff3d238eca6 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -13,6 +13,7 @@ from .Regions import create_levels, default_levels from .Options import KDL3Options from .Names import LocationName +from .Room import KDL3Room from .Rules import set_rules from .Rom import KDL3DeltaPatch, get_base_rom_path, RomData, patch_rom, KDL3JHASH, KDL3UHASH from .Client import KDL3SNIClient @@ -23,15 +24,10 @@ import threading import base64 import settings -from worlds.LauncherComponents import components logger = logging.getLogger("Kirby's Dream Land 3") -# SNIComponent = next(x for x in components if x.display_name == "SNI Client") -# SNIComponent.file_identifier.suffixes.append(".apkdl3") - - class KDL3Settings(settings.Group): class RomFile(settings.SNESRomPath): """File name of the KDL3 JP or EN rom""" @@ -72,16 +68,17 @@ class KDL3World(World): web = KDL3WebWorld() settings: typing.ClassVar[KDL3Settings] - def __init__(self, world: MultiWorld, player: int): + def __init__(self, multiworld: MultiWorld, player: int): self.rom_name = None self.rom_name_available_event = threading.Event() - super().__init__(world, player) + super().__init__(multiworld, player) self.copy_abilities: Dict[str, str] = vanilla_enemies.copy() self.required_heart_stars: int = 0 # we fill this during create_items self.boss_requirements: Dict[int, int] = dict() self.player_levels = default_levels.copy() self.stage_shuffle_enabled = False self.boss_butch_bosses: List[Optional[bool]] = list() + self.rooms: Optional[List[KDL3Room]] = None @classmethod def stage_assert_generate(cls, multiworld: MultiWorld) -> None: From b1cba1cf4fa106e2baf41c1b23d39d798622fe8b Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 9 Nov 2023 01:13:08 -0600 Subject: [PATCH 139/165] Update CODEOWNERS --- docs/CODEOWNERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 0afc565280f1..b53484e20c14 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -58,6 +58,9 @@ # Hylics 2 /worlds/hylics2/ @TRPG0 +# Kirby's Dream Land 3 +/worlds/kdl3/ @Silvris + # Kingdom Hearts 2 /worlds/kh2/ @JaredWeakStrike From bc425f6a67b3206dbf465b61ef33864148907203 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 26 Nov 2023 17:40:57 -0600 Subject: [PATCH 140/165] Add presets and deathlink messages --- worlds/kdl3/Client.py | 35 ++++++++++++++++++-------- worlds/kdl3/Presets.py | 56 +++++++++++++++++++++++++++++++++++++++++ worlds/kdl3/__init__.py | 2 ++ 3 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 worlds/kdl3/Presets.py diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 6063632af20d..aa9a41c9a8a8 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -2,6 +2,7 @@ import struct import time from struct import unpack, pack +from collections import defaultdict from NetUtils import ClientStatus, color from worlds.AutoSNIClient import SNIClient @@ -31,6 +32,7 @@ KDL3_HEART_STARS = SRAM_1_START + 0x53A7 KDL3_WORLD_UNLOCK = SRAM_1_START + 0x53CB KDL3_LEVEL_UNLOCK = SRAM_1_START + 0x53CD +KDL3_CURRENT_WORLD = SRAM_1_START + 0x53CF KDL3_CURRENT_LEVEL = SRAM_1_START + 0x53D3 KDL3_BOSS_STATUS = SRAM_1_START + 0x53D5 KDL3_INVINCIBILITY_TIMER = SRAM_1_START + 0x54B1 @@ -96,6 +98,15 @@ 43: 1857, } +deathlink_messages = defaultdict(lambda: " was defeated.", { + 0x0200: " was bonked by apples from Whispy Woods.", + 0x0201: " was out-maneuvered by Acro.", + 0x0202: " was out-numbered by Pon & Con.", + 0x0203: " was defeated by Ado's powerful paintings.", + 0x0204: " was clobbered by King Dedede.", + 0x0205: " lost their battle against Dark Matter." +}) + class KDL3SNIClient(SNIClient): game = "Kirby's Dream Land 3" @@ -203,6 +214,15 @@ async def game_watcher(self, ctx) -> None: if not ctx.server: return # can't check debug anymore, without going and copying the value. might be important later. + if self.levels is None: + self.levels = dict() + for i in range(5): + level_data = await snes_read(ctx, KDL3_LEVEL_ADDR + (14 * i), 14) + self.levels[i] = unpack("HHHHHHH", level_data) + + if self.consumables is None: + consumables = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) + self.consumables = consumables[0] == 0x01 is_demo = await snes_read(ctx, KDL3_IS_DEMO, 1) # 1 - recording a demo, 2 - playing back recorded, 3+ is a demo if is_demo[0] > 0x00: return @@ -224,19 +244,12 @@ async def game_watcher(self, ctx) -> None: return # null, title screen, opening, save select, true and false endings game_state = await snes_read(ctx, KDL3_GAME_STATE, 1) current_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) + current_world = struct.unpack("H", await snes_read(ctx, KDL3_CURRENT_WORLD, 2))[0] + current_level = struct.unpack("H", await snes_read(ctx, KDL3_CURRENT_LEVEL, 2))[0] if "DeathLink" in ctx.tags and game_state[0] == 0x00 and ctx.last_death_link + 1 < time.time(): currently_dead = current_hp[0] == 0x00 - await ctx.handle_deathlink_state(currently_dead) - - if self.levels is None: - self.levels = dict() - for i in range(5): - level_data = await snes_read(ctx, KDL3_LEVEL_ADDR + (14 * i), 14) - self.levels[i] = unpack("HHHHHHH", level_data) - - if self.consumables is None: - consumables = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) - self.consumables = consumables[0] == 0x01 + message = deathlink_messages[self.levels[current_world][current_level-1]] + await ctx.handle_deathlink_state(currently_dead, f"{ctx.player_names[ctx.slot]}{message}") recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 2) recv_amount = unpack("H", recv_count)[0] diff --git a/worlds/kdl3/Presets.py b/worlds/kdl3/Presets.py new file mode 100644 index 000000000000..9ed5e241a5f8 --- /dev/null +++ b/worlds/kdl3/Presets.py @@ -0,0 +1,56 @@ +from typing import Dict, Any + +all_random = { + "progression_balancing": "random", + "accessibility": "random", + "death_link": "random", + "game_language": "random", + "goal": "random", + "goal_speed": "random", + "total_heart_stars": "random", + "heart_stars_required": "random", + "filler_percentage": "random", + "trap_percentage": "random", + "gooey_trap_weight": "random", + "slow_trap_weight": "random", + "ability_trap_weight": "random", + "jumping_target": "random", + "stage_shuffle": "random", + "boss_shuffle": "random", + "allow_bb": "random", + "animal_randomization": "random", + "copy_ability_randomization": "random", + "strict_bosses": "random", + "open_world": "random", + "ow_boss_requirement": "random", + "boss_requirement_random": "random", + "consumables": "random", + "kirby_flavor_preset": "random", + "gooey_flavor_preset": "random", + "music_shuffle": "random", +} + +beginner = { + "goal": "zero", + "goal_speed": "normal", + "total_heart_stars": 50, + "heart_stars_required": 30, + "filler_percentage": 25, + "trap_percentage": 0, + "gooey_trap_weight": "random", + "slow_trap_weight": "random", + "ability_trap_weight": "random", + "jumping_target": 5, + "stage_shuffle": "pattern", + "boss_shuffle": "shuffled", + "allow_bb": "random", + "strict_bosses": True, + "open_world": True, + "ow_boss_requirement": 3, +} + + +kdl3_options_presets: Dict[str, Dict[str, Any]] = { + "All Random": all_random, + "Beginner": beginner +} diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index bff3d238eca6..2dd1f77f9e9f 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -12,6 +12,7 @@ from .Names.EnemyAbilities import vanilla_enemies, enemy_mapping, enemy_restrictive from .Regions import create_levels, default_levels from .Options import KDL3Options +from .Presets import kdl3_options_presets from .Names import LocationName from .Room import KDL3Room from .Rules import set_rules @@ -51,6 +52,7 @@ class KDL3WebWorld(WebWorld): ["Silvris"] ) ] + options_presets = kdl3_options_presets class KDL3World(World): From 2861ea1bb48940f0c0c4ecace2d4114d67404bac Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 17 Dec 2023 14:47:48 -0600 Subject: [PATCH 141/165] fix fxpak, add snes9x-nwa --- worlds/kdl3/Client.py | 9 ++++++--- worlds/kdl3/Rom.py | 19 +++++++++++++++++++ worlds/kdl3/docs/setup_en.md | 1 + 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index aa9a41c9a8a8..ce71f6f5afb6 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -12,11 +12,11 @@ # FXPAK Pro protocol memory mapping used by SNI ROM_START = 0x000000 -WRAM_START = 0xF50000 -WRAM_SIZE = 0x20000 SRAM_1_START = 0xE00000 # KDL3 +KDL3_HALKEN = SRAM_1_START + 0x80F0 +KDL3_NINTEN = SRAM_1_START + 0x8FF0 KDL3_ROMNAME = SRAM_1_START + 0x8100 KDL3_DEATH_LINK_ADDR = SRAM_1_START + 0x9010 KDL3_GOAL_ADDR = SRAM_1_START + 0x9012 @@ -208,9 +208,12 @@ async def game_watcher(self, ctx) -> None: rom = await snes_read(ctx, KDL3_ROMNAME, 0x15) if rom != ctx.rom: ctx.rom = None - halken = await snes_read(ctx, WRAM_START, 6) + halken = await snes_read(ctx, KDL3_HALKEN, 6) if halken != b"halken": return + ninten = await snes_read(ctx, KDL3_NINTEN, 6) + if ninten != b"ninten": + return if not ctx.server: return # can't check debug anymore, without going and copying the value. might be important later. diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 92516eeeb3dd..29ec999d1d09 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -417,6 +417,25 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD 0x6B, # RTL ]) + rom.write_bytes(0x23FC, [0x22, 0x30, 0xA0, 0x07, # JSL $07A030 + 0xEA, ]) # NOP + + # write halken/ninten validation into bwram + rom.write_bytes(0x3A030, [0xA2, 0x05, 0x00, # LDX #$0005 + 0xBF, 0x05, 0xA4, 0x00, # LDA $A405, X - loop head (halken) + 0x9F, 0xF0, 0x80, 0x40, # STA $4080F0, X + 0xCA, # DEX + 0x10, 0xF5, # BPL loop head - branch if more letters to copy + 0xA2, 0x05, 0x00, # LDX #$0005 + 0xBF, 0x0B, 0xA4, 0x00, # LDA $A40B, X - loop head (ninten) + 0x9F, 0xF0, 0x8F, 0x40, # STA $408FF0, X + 0xCA, # DEX + 0x10, 0xF5, # BPL loop head - branch if more letters to copy + 0xC2, 0x20, # REP #$20 + 0xA9, 0x01, 0x00, # LDA #$0001 + 0x6B, # RTL + ]) + # Copy Ability rom.write_bytes(0x399A0, [0xB9, 0xF3, 0x54, # LDA $54F3 0x48, # PHA diff --git a/worlds/kdl3/docs/setup_en.md b/worlds/kdl3/docs/setup_en.md index ca1dee4351d7..dfd4c335f5e8 100644 --- a/worlds/kdl3/docs/setup_en.md +++ b/worlds/kdl3/docs/setup_en.md @@ -5,6 +5,7 @@ - [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases). Make sure to check the box for `SNI Client - Kirby's Dream Land 3 Patch Setup` - Hardware or software capable of loading and playing SNES ROM files - An emulator capable of connecting to SNI with ROM access. Any one of the following will work: + - snes9x-emunwa from: [snes9x-emunwa Releases Page](https://github.com/Skarsnik/snes9x-emunwa/releases) - snes9x-rr from: [snes9x-rr Releases Page](https://github.com/gocha/snes9x-rr/releases) - BizHawk from: [BizHawk Website](http://tasvideos.org/BizHawk.html) - bsnes-plus-nwa from: [bsnes-plus GitHub](https://github.com/black-sliver/bsnes-plus) From 5ad46d64ac49d9890e7d992bcda2d49a7ada197b Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 16 Jan 2024 03:28:26 -0600 Subject: [PATCH 142/165] star implementation, needs logic --- worlds/kdl3/Client.py | 804 +- worlds/kdl3/Items.py | 3 + worlds/kdl3/Locations.py | 772 ++ worlds/kdl3/Names/LocationName.py | 768 ++ worlds/kdl3/Options.py | 9 + worlds/kdl3/Regions.py | 5 +- worlds/kdl3/Rom.py | 56 + worlds/kdl3/data/Rooms.json | 18203 +++++++++++++++++++++++++++- 8 files changed, 20610 insertions(+), 10 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index ce71f6f5afb6..90d4c922e6e9 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -21,6 +21,7 @@ KDL3_DEATH_LINK_ADDR = SRAM_1_START + 0x9010 KDL3_GOAL_ADDR = SRAM_1_START + 0x9012 KDL3_CONSUMABLE_FLAG = SRAM_1_START + 0x9018 +KDL3_STARS_FLAG = SRAM_1_START + 0x901A KDL3_LEVEL_ADDR = SRAM_1_START + 0x9020 KDL3_IS_DEMO = SRAM_1_START + 0x5AD5 KDL3_GAME_STATE = SRAM_1_START + 0x36D0 @@ -28,6 +29,7 @@ KDL3_LIFE_COUNT = SRAM_1_START + 0x39CF KDL3_KIRBY_HP = SRAM_1_START + 0x39D1 KDL3_BOSS_HP = SRAM_1_START + 0x39D5 +KDL3_STAR_COUNT = SRAM_1_START + 0x39D7 KDL3_LIFE_VISUAL = SRAM_1_START + 0x39E3 KDL3_HEART_STARS = SRAM_1_START + 0x53A7 KDL3_WORLD_UNLOCK = SRAM_1_START + 0x53CB @@ -50,6 +52,7 @@ KDL3_ABILITY_TRAP = SRAM_1_START + 0x8084 KDL3_COMPLETED_STAGES = SRAM_1_START + 0x8200 KDL3_CONSUMABLES = SRAM_1_START + 0xA000 +KDL3_STARS = SRAM_1_START + 0xB000 consumable_addrs = { 0: 14, @@ -98,6 +101,776 @@ 43: 1857, } +star_addrs = { + 0x770401: 0, + 0x770402: 1, + 0x770403: 2, + 0x770404: 3, + 0x770405: 4, + 0x770406: 5, + 0x770407: 7, + 0x770408: 8, + 0x770409: 9, + 0x77040a: 10, + 0x77040b: 11, + 0x77040c: 12, + 0x77040d: 13, + 0x77040e: 16, + 0x77040f: 17, + 0x770410: 19, + 0x770411: 20, + 0x770412: 21, + 0x770413: 22, + 0x770414: 23, + 0x770415: 24, + 0x770416: 25, + 0x770417: 26, + 0x770418: 65, + 0x770419: 66, + 0x77041a: 67, + 0x77041b: 68, + 0x77041c: 69, + 0x77041d: 70, + 0x77041e: 71, + 0x77041f: 72, + 0x770420: 73, + 0x770421: 74, + 0x770422: 76, + 0x770423: 77, + 0x770424: 78, + 0x770425: 79, + 0x770426: 80, + 0x770427: 81, + 0x770428: 82, + 0x770429: 83, + 0x77042a: 85, + 0x77042b: 86, + 0x77042c: 87, + 0x77042d: 128, + 0x77042e: 129, + 0x77042f: 130, + 0x770430: 131, + 0x770431: 132, + 0x770432: 133, + 0x770433: 134, + 0x770434: 135, + 0x770435: 136, + 0x770436: 137, + 0x770437: 140, + 0x770438: 141, + 0x770439: 142, + 0x77043a: 143, + 0x77043b: 144, + 0x77043c: 145, + 0x77043d: 146, + 0x77043e: 147, + 0x77043f: 148, + 0x770440: 149, + 0x770441: 150, + 0x770442: 151, + 0x770443: 152, + 0x770444: 153, + 0x770445: 154, + 0x770446: 155, + 0x770447: 156, + 0x770448: 157, + 0x770449: 158, + 0x77044a: 159, + 0x77044b: 160, + 0x77044c: 192, + 0x77044d: 193, + 0x77044e: 194, + 0x77044f: 195, + 0x770450: 197, + 0x770451: 198, + 0x770452: 199, + 0x770453: 200, + 0x770454: 201, + 0x770455: 203, + 0x770456: 205, + 0x770457: 206, + 0x770458: 207, + 0x770459: 208, + 0x77045a: 209, + 0x77045b: 210, + 0x77045c: 211, + 0x77045d: 212, + 0x77045e: 213, + 0x77045f: 216, + 0x770460: 217, + 0x770461: 218, + 0x770462: 219, + 0x770463: 220, + 0x770464: 221, + 0x770465: 222, + 0x770466: 225, + 0x770467: 227, + 0x770468: 228, + 0x770469: 229, + 0x77046a: 230, + 0x77046b: 231, + 0x77046c: 232, + 0x77046d: 233, + 0x77046e: 234, + 0x77046f: 235, + 0x770470: 236, + 0x770471: 257, + 0x770472: 258, + 0x770473: 259, + 0x770474: 260, + 0x770475: 261, + 0x770476: 262, + 0x770477: 263, + 0x770478: 264, + 0x770479: 265, + 0x77047a: 266, + 0x77047b: 267, + 0x77047c: 268, + 0x77047d: 270, + 0x77047e: 271, + 0x77047f: 272, + 0x770480: 273, + 0x770481: 275, + 0x770482: 276, + 0x770483: 277, + 0x770484: 278, + 0x770485: 279, + 0x770486: 280, + 0x770487: 281, + 0x770488: 282, + 0x770489: 283, + 0x77048a: 284, + 0x77048b: 285, + 0x77048c: 286, + 0x77048d: 287, + 0x77048e: 321, + 0x77048f: 322, + 0x770490: 323, + 0x770491: 324, + 0x770492: 325, + 0x770493: 326, + 0x770494: 327, + 0x770495: 328, + 0x770496: 329, + 0x770497: 332, + 0x770498: 334, + 0x770499: 335, + 0x77049a: 336, + 0x77049b: 337, + 0x77049c: 340, + 0x77049d: 341, + 0x77049e: 342, + 0x77049f: 343, + 0x7704a0: 345, + 0x7704a1: 346, + 0x7704a2: 347, + 0x7704a3: 348, + 0x7704a4: 349, + 0x7704a5: 350, + 0x7704a6: 351, + 0x7704a7: 354, + 0x7704a8: 355, + 0x7704a9: 356, + 0x7704aa: 357, + 0x7704ab: 384, + 0x7704ac: 385, + 0x7704ad: 386, + 0x7704ae: 387, + 0x7704af: 388, + 0x7704b0: 389, + 0x7704b1: 391, + 0x7704b2: 392, + 0x7704b3: 393, + 0x7704b4: 394, + 0x7704b5: 396, + 0x7704b6: 397, + 0x7704b7: 398, + 0x7704b8: 399, + 0x7704b9: 400, + 0x7704ba: 401, + 0x7704bb: 402, + 0x7704bc: 403, + 0x7704bd: 404, + 0x7704be: 449, + 0x7704bf: 450, + 0x7704c0: 451, + 0x7704c1: 453, + 0x7704c2: 454, + 0x7704c3: 455, + 0x7704c4: 456, + 0x7704c5: 457, + 0x7704c6: 460, + 0x7704c7: 461, + 0x7704c8: 462, + 0x7704c9: 463, + 0x7704ca: 464, + 0x7704cb: 465, + 0x7704cc: 466, + 0x7704cd: 467, + 0x7704ce: 468, + 0x7704cf: 513, + 0x7704d0: 514, + 0x7704d1: 515, + 0x7704d2: 516, + 0x7704d3: 517, + 0x7704d4: 518, + 0x7704d5: 519, + 0x7704d6: 520, + 0x7704d7: 521, + 0x7704d8: 523, + 0x7704d9: 524, + 0x7704da: 527, + 0x7704db: 528, + 0x7704dc: 529, + 0x7704dd: 531, + 0x7704de: 532, + 0x7704df: 533, + 0x7704e0: 534, + 0x7704e1: 535, + 0x7704e2: 536, + 0x7704e3: 537, + 0x7704e4: 576, + 0x7704e5: 577, + 0x7704e6: 578, + 0x7704e7: 579, + 0x7704e8: 580, + 0x7704e9: 582, + 0x7704ea: 583, + 0x7704eb: 584, + 0x7704ec: 585, + 0x7704ed: 586, + 0x7704ee: 587, + 0x7704ef: 588, + 0x7704f0: 589, + 0x7704f1: 590, + 0x7704f2: 591, + 0x7704f3: 592, + 0x7704f4: 593, + 0x7704f5: 594, + 0x7704f6: 595, + 0x7704f7: 596, + 0x7704f8: 597, + 0x7704f9: 598, + 0x7704fa: 599, + 0x7704fb: 600, + 0x7704fc: 601, + 0x7704fd: 602, + 0x7704fe: 603, + 0x7704ff: 604, + 0x770500: 607, + 0x770501: 608, + 0x770502: 609, + 0x770503: 610, + 0x770504: 611, + 0x770505: 612, + 0x770506: 613, + 0x770507: 614, + 0x770508: 615, + 0x770509: 616, + 0x77050a: 617, + 0x77050b: 618, + 0x77050c: 619, + 0x77050d: 620, + 0x77050e: 621, + 0x77050f: 622, + 0x770510: 623, + 0x770511: 624, + 0x770512: 625, + 0x770513: 626, + 0x770514: 627, + 0x770515: 628, + 0x770516: 629, + 0x770517: 640, + 0x770518: 641, + 0x770519: 642, + 0x77051a: 643, + 0x77051b: 644, + 0x77051c: 645, + 0x77051d: 646, + 0x77051e: 647, + 0x77051f: 648, + 0x770520: 649, + 0x770521: 650, + 0x770522: 651, + 0x770523: 652, + 0x770524: 653, + 0x770525: 654, + 0x770526: 655, + 0x770527: 656, + 0x770528: 657, + 0x770529: 658, + 0x77052a: 659, + 0x77052b: 660, + 0x77052c: 661, + 0x77052d: 662, + 0x77052e: 663, + 0x77052f: 664, + 0x770530: 665, + 0x770531: 666, + 0x770532: 667, + 0x770533: 668, + 0x770534: 669, + 0x770535: 670, + 0x770536: 674, + 0x770537: 675, + 0x770538: 676, + 0x770539: 677, + 0x77053a: 678, + 0x77053b: 679, + 0x77053c: 680, + 0x77053d: 681, + 0x77053e: 682, + 0x77053f: 683, + 0x770540: 684, + 0x770541: 686, + 0x770542: 687, + 0x770543: 688, + 0x770544: 689, + 0x770545: 690, + 0x770546: 691, + 0x770547: 692, + 0x770548: 694, + 0x770549: 695, + 0x77054a: 704, + 0x77054b: 705, + 0x77054c: 706, + 0x77054d: 707, + 0x77054e: 708, + 0x77054f: 709, + 0x770550: 710, + 0x770551: 711, + 0x770552: 712, + 0x770553: 713, + 0x770554: 714, + 0x770555: 715, + 0x770556: 716, + 0x770557: 717, + 0x770558: 718, + 0x770559: 719, + 0x77055a: 720, + 0x77055b: 721, + 0x77055c: 722, + 0x77055d: 723, + 0x77055e: 724, + 0x77055f: 725, + 0x770560: 726, + 0x770561: 769, + 0x770562: 770, + 0x770563: 771, + 0x770564: 772, + 0x770565: 773, + 0x770566: 774, + 0x770567: 775, + 0x770568: 776, + 0x770569: 777, + 0x77056a: 778, + 0x77056b: 779, + 0x77056c: 780, + 0x77056d: 781, + 0x77056e: 782, + 0x77056f: 783, + 0x770570: 784, + 0x770571: 785, + 0x770572: 786, + 0x770573: 787, + 0x770574: 788, + 0x770575: 789, + 0x770576: 790, + 0x770577: 832, + 0x770578: 833, + 0x770579: 834, + 0x77057a: 835, + 0x77057b: 836, + 0x77057c: 837, + 0x77057d: 838, + 0x77057e: 839, + 0x77057f: 840, + 0x770580: 841, + 0x770581: 842, + 0x770582: 843, + 0x770583: 844, + 0x770584: 845, + 0x770585: 846, + 0x770586: 847, + 0x770587: 848, + 0x770588: 849, + 0x770589: 850, + 0x77058a: 854, + 0x77058b: 855, + 0x77058c: 856, + 0x77058d: 857, + 0x77058e: 858, + 0x77058f: 859, + 0x770590: 860, + 0x770591: 861, + 0x770592: 862, + 0x770593: 863, + 0x770594: 864, + 0x770595: 865, + 0x770596: 866, + 0x770597: 867, + 0x770598: 868, + 0x770599: 869, + 0x77059a: 870, + 0x77059b: 871, + 0x77059c: 872, + 0x77059d: 873, + 0x77059e: 874, + 0x77059f: 875, + 0x7705a0: 876, + 0x7705a1: 877, + 0x7705a2: 878, + 0x7705a3: 879, + 0x7705a4: 880, + 0x7705a5: 881, + 0x7705a6: 882, + 0x7705a7: 896, + 0x7705a8: 897, + 0x7705a9: 898, + 0x7705aa: 899, + 0x7705ab: 900, + 0x7705ac: 901, + 0x7705ad: 902, + 0x7705ae: 903, + 0x7705af: 904, + 0x7705b0: 905, + 0x7705b1: 960, + 0x7705b2: 961, + 0x7705b3: 962, + 0x7705b4: 963, + 0x7705b5: 964, + 0x7705b6: 965, + 0x7705b7: 966, + 0x7705b8: 967, + 0x7705b9: 968, + 0x7705ba: 969, + 0x7705bb: 970, + 0x7705bc: 972, + 0x7705bd: 973, + 0x7705be: 974, + 0x7705bf: 975, + 0x7705c0: 977, + 0x7705c1: 978, + 0x7705c2: 979, + 0x7705c3: 980, + 0x7705c4: 981, + 0x7705c5: 982, + 0x7705c6: 983, + 0x7705c7: 984, + 0x7705c8: 1025, + 0x7705c9: 1026, + 0x7705ca: 1027, + 0x7705cb: 1028, + 0x7705cc: 1029, + 0x7705cd: 1030, + 0x7705ce: 1031, + 0x7705cf: 1032, + 0x7705d0: 1033, + 0x7705d1: 1034, + 0x7705d2: 1037, + 0x7705d3: 1040, + 0x7705d4: 1041, + 0x7705d5: 1042, + 0x7705d6: 1043, + 0x7705d7: 1044, + 0x7705d8: 1045, + 0x7705d9: 1046, + 0x7705da: 1049, + 0x7705db: 1050, + 0x7705dc: 1051, + 0x7705dd: 1052, + 0x7705de: 1053, + 0x7705df: 1054, + 0x7705e0: 1055, + 0x7705e1: 1056, + 0x7705e2: 1057, + 0x7705e3: 1058, + 0x7705e4: 1059, + 0x7705e5: 1060, + 0x7705e6: 1061, + 0x7705e7: 1062, + 0x7705e8: 1063, + 0x7705e9: 1064, + 0x7705ea: 1065, + 0x7705eb: 1066, + 0x7705ec: 1067, + 0x7705ed: 1068, + 0x7705ee: 1069, + 0x7705ef: 1070, + 0x7705f0: 1152, + 0x7705f1: 1154, + 0x7705f2: 1155, + 0x7705f3: 1156, + 0x7705f4: 1157, + 0x7705f5: 1158, + 0x7705f6: 1159, + 0x7705f7: 1160, + 0x7705f8: 1161, + 0x7705f9: 1162, + 0x7705fa: 1163, + 0x7705fb: 1164, + 0x7705fc: 1165, + 0x7705fd: 1166, + 0x7705fe: 1167, + 0x7705ff: 1168, + 0x770600: 1169, + 0x770601: 1173, + 0x770602: 1174, + 0x770603: 1175, + 0x770604: 1176, + 0x770605: 1177, + 0x770606: 1178, + 0x770607: 1216, + 0x770608: 1217, + 0x770609: 1218, + 0x77060a: 1219, + 0x77060b: 1220, + 0x77060c: 1221, + 0x77060d: 1222, + 0x77060e: 1223, + 0x77060f: 1224, + 0x770610: 1225, + 0x770611: 1226, + 0x770612: 1227, + 0x770613: 1228, + 0x770614: 1229, + 0x770615: 1230, + 0x770616: 1231, + 0x770617: 1232, + 0x770618: 1233, + 0x770619: 1234, + 0x77061a: 1235, + 0x77061b: 1236, + 0x77061c: 1237, + 0x77061d: 1238, + 0x77061e: 1239, + 0x77061f: 1240, + 0x770620: 1241, + 0x770621: 1242, + 0x770622: 1243, + 0x770623: 1244, + 0x770624: 1245, + 0x770625: 1246, + 0x770626: 1247, + 0x770627: 1248, + 0x770628: 1249, + 0x770629: 1250, + 0x77062a: 1251, + 0x77062b: 1252, + 0x77062c: 1253, + 0x77062d: 1254, + 0x77062e: 1255, + 0x77062f: 1256, + 0x770630: 1257, + 0x770631: 1258, + 0x770632: 1259, + 0x770633: 1260, + 0x770634: 1261, + 0x770635: 1262, + 0x770636: 1263, + 0x770637: 1264, + 0x770638: 1265, + 0x770639: 1266, + 0x77063a: 1267, + 0x77063b: 1268, + 0x77063c: 1269, + 0x77063d: 1280, + 0x77063e: 1281, + 0x77063f: 1282, + 0x770640: 1283, + 0x770641: 1284, + 0x770642: 1285, + 0x770643: 1286, + 0x770644: 1289, + 0x770645: 1290, + 0x770646: 1291, + 0x770647: 1292, + 0x770648: 1293, + 0x770649: 1294, + 0x77064a: 1295, + 0x77064b: 1296, + 0x77064c: 1297, + 0x77064d: 1298, + 0x77064e: 1299, + 0x77064f: 1300, + 0x770650: 1301, + 0x770651: 1302, + 0x770652: 1303, + 0x770653: 1344, + 0x770654: 1345, + 0x770655: 1346, + 0x770656: 1347, + 0x770657: 1348, + 0x770658: 1349, + 0x770659: 1350, + 0x77065a: 1351, + 0x77065b: 1352, + 0x77065c: 1354, + 0x77065d: 1355, + 0x77065e: 1356, + 0x77065f: 1357, + 0x770660: 1358, + 0x770661: 1359, + 0x770662: 1360, + 0x770663: 1361, + 0x770664: 1362, + 0x770665: 1363, + 0x770666: 1365, + 0x770667: 1366, + 0x770668: 1367, + 0x770669: 1368, + 0x77066a: 1369, + 0x77066b: 1370, + 0x77066c: 1371, + 0x77066d: 1372, + 0x77066e: 1374, + 0x77066f: 1375, + 0x770670: 1376, + 0x770671: 1379, + 0x770672: 1380, + 0x770673: 1381, + 0x770674: 1382, + 0x770675: 1383, + 0x770676: 1384, + 0x770677: 1385, + 0x770678: 1386, + 0x770679: 1387, + 0x77067a: 1388, + 0x77067b: 1389, + 0x77067c: 1390, + 0x77067d: 1391, + 0x77067e: 1392, + 0x77067f: 1393, + 0x770680: 1394, + 0x770681: 1395, + 0x770682: 1396, + 0x770683: 1397, + 0x770684: 1398, + 0x770685: 1408, + 0x770686: 1409, + 0x770687: 1410, + 0x770688: 1411, + 0x770689: 1412, + 0x77068a: 1414, + 0x77068b: 1472, + 0x77068c: 1473, + 0x77068d: 1474, + 0x77068e: 1475, + 0x77068f: 1476, + 0x770690: 1477, + 0x770691: 1478, + 0x770692: 1479, + 0x770693: 1480, + 0x770694: 1481, + 0x770695: 1482, + 0x770696: 1483, + 0x770697: 1484, + 0x770698: 1486, + 0x770699: 1487, + 0x77069a: 1488, + 0x77069b: 1489, + 0x77069c: 1490, + 0x77069d: 1491, + 0x77069e: 1495, + 0x77069f: 1496, + 0x7706a0: 1497, + 0x7706a1: 1498, + 0x7706a2: 1499, + 0x7706a3: 1500, + 0x7706a4: 1501, + 0x7706a5: 1502, + 0x7706a6: 1503, + 0x7706a7: 1504, + 0x7706a8: 1505, + 0x7706a9: 1506, + 0x7706aa: 1507, + 0x7706ab: 1508, + 0x7706ac: 1536, + 0x7706ad: 1537, + 0x7706ae: 1538, + 0x7706af: 1539, + 0x7706b0: 1540, + 0x7706b1: 1541, + 0x7706b2: 1600, + 0x7706b3: 1601, + 0x7706b4: 1602, + 0x7706b5: 1603, + 0x7706b6: 1604, + 0x7706b7: 1605, + 0x7706b8: 1606, + 0x7706b9: 1607, + 0x7706ba: 1612, + 0x7706bb: 1613, + 0x7706bc: 1614, + 0x7706bd: 1615, + 0x7706be: 1616, + 0x7706bf: 1617, + 0x7706c0: 1618, + 0x7706c1: 1619, + 0x7706c2: 1620, + 0x7706c3: 1621, + 0x7706c4: 1622, + 0x7706c5: 1664, + 0x7706c6: 1665, + 0x7706c7: 1667, + 0x7706c8: 1668, + 0x7706c9: 1670, + 0x7706ca: 1671, + 0x7706cb: 1672, + 0x7706cc: 1673, + 0x7706cd: 1674, + 0x7706ce: 1675, + 0x7706cf: 1676, + 0x7706d0: 1677, + 0x7706d1: 1678, + 0x7706d2: 1679, + 0x7706d3: 1680, + 0x7706d4: 1681, + 0x7706d5: 1682, + 0x7706d6: 1683, + 0x7706d7: 1684, + 0x7706d8: 1685, + 0x7706d9: 1686, + 0x7706da: 1730, + 0x7706db: 1732, + 0x7706dc: 1734, + 0x7706dd: 1792, + 0x7706de: 1793, + 0x7706df: 1794, + 0x7706e0: 1795, + 0x7706e1: 1796, + 0x7706e2: 1797, + 0x7706e3: 1798, + 0x7706e4: 1799, + 0x7706e5: 1800, + 0x7706e6: 1801, + 0x7706e7: 1802, + 0x7706e8: 1803, + 0x7706e9: 1804, + 0x7706ea: 1805, + 0x7706eb: 1810, + 0x7706ec: 1811, + 0x7706ed: 1812, + 0x7706ee: 1813, + 0x7706ef: 1814, + 0x7706f0: 1815, + 0x7706f1: 1817, + 0x7706f2: 1818, + 0x7706f3: 1819, + 0x7706f4: 1820, + 0x7706f5: 1821, + 0x7706f6: 1822, + 0x7706f7: 1823, + 0x7706f8: 1824, + 0x7706f9: 1825, + 0x7706fa: 1826, + 0x7706fb: 1827, + 0x7706fc: 1828, + 0x7706fd: 1831, + 0x7706fe: 1832, + 0x7706ff: 1858, +} + deathlink_messages = defaultdict(lambda: " was defeated.", { 0x0200: " was bonked by apples from Whispy Woods.", 0x0201: " was out-maneuvered by Acro.", @@ -112,6 +885,7 @@ class KDL3SNIClient(SNIClient): game = "Kirby's Dream Land 3" levels = None consumables = None + stars = None item_queue = [] async def deathlink_kill_player(self, ctx) -> None: @@ -157,7 +931,7 @@ async def pop_item(self, ctx): from SNIClient import snes_buffered_write, snes_read if len(self.item_queue) > 0: item = self.item_queue.pop() - # special handling for the remaining three + # special handling for the remaining items item_idx = item.item & 0x0000FF if item_idx == 0x21: # 1-Up @@ -180,6 +954,13 @@ async def pop_item(self, ctx): # Invincibility Candy snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x84, 0x03])) + elif item_idx in [0x24, 0x25, 0x26]: + # Little/Medium/Big Star + amount = 2 * (item_idx - 0x24) + 1 + current_count = struct.unpack("H", await snes_read(ctx, KDL3_STAR_COUNT, 2))[0] + if not 0x8000 & current_count: # check that we just collected one in the current frame + # 0x8000 flags the game to check for changes in this value + snes_buffered_write(ctx, KDL3_STAR_COUNT, struct.pack("H", (current_count + amount) | 0x8000)) elif item_idx == 0x40: check_gooey_r = await snes_read(ctx, KDL3_GOOEY_TRAP, 2) check_gooey = struct.unpack("H", check_gooey_r) @@ -226,6 +1007,9 @@ async def game_watcher(self, ctx) -> None: if self.consumables is None: consumables = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) self.consumables = consumables[0] == 0x01 + if self.stars is None: + stars = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) + self.stars = stars[0] == 0x01 is_demo = await snes_read(ctx, KDL3_IS_DEMO, 1) # 1 - recording a demo, 2 - playing back recorded, 3+ is a demo if is_demo[0] > 0x00: return @@ -310,12 +1094,18 @@ async def game_watcher(self, ctx) -> None: snes_buffered_write(ctx, KDL3_HEART_STARS + level_ind, bytes([0x01])) await snes_flush_writes(ctx) # consumable status - consumables = await snes_read(ctx, KDL3_CONSUMABLES, 1920) - for consumable in consumable_addrs: - # TODO: see if this can be sped up in any way - loc_id = 0x770300 + consumable - if loc_id not in ctx.checked_locations and consumables[consumable_addrs[consumable]] == 0x01: - new_checks.append(loc_id) + if self.consumables: + consumables = await snes_read(ctx, KDL3_CONSUMABLES, 1920) + for consumable in consumable_addrs: + # TODO: see if this can be sped up in any way + loc_id = 0x770300 + consumable + if loc_id not in ctx.checked_locations and consumables[consumable_addrs[consumable]] == 0x01: + new_checks.append(loc_id) + if self.stars: + stars = await snes_read(ctx, KDL3_STARS, 1920) + for star in star_addrs: + if star not in ctx.checked_locations and stars[star_addrs[star]] == 0x01: + new_checks.append(star) # boss status boss_flag_bytes = await snes_read(ctx, KDL3_BOSS_STATUS, 2) diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index 9a909545c5a4..cfd44ccedf42 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -59,6 +59,9 @@ class KDL3Item(Item): "1-Up": ItemData(0x770021, False), "Maxim Tomato": ItemData(0x770022, False), "Invincible Candy": ItemData(0x770023, False), + "Little Star": ItemData(0x770024, False), + "Medium Star": ItemData(0x770025, False), + "Big Star": ItemData(0x770026, False), } trap_item_table = { diff --git a/worlds/kdl3/Locations.py b/worlds/kdl3/Locations.py index 9edf13ac4912..ec0a636b3ec2 100644 --- a/worlds/kdl3/Locations.py +++ b/worlds/kdl3/Locations.py @@ -159,9 +159,781 @@ def __init__(self, player: int, name: str, address: typing.Optional[int], parent 30: [42, 43], } +star_locations = { + 0x770401: LocationName.grass_land_1_s1, + 0x770402: LocationName.grass_land_1_s2, + 0x770403: LocationName.grass_land_1_s3, + 0x770404: LocationName.grass_land_1_s4, + 0x770405: LocationName.grass_land_1_s5, + 0x770406: LocationName.grass_land_1_s6, + 0x770407: LocationName.grass_land_1_s7, + 0x770408: LocationName.grass_land_1_s8, + 0x770409: LocationName.grass_land_1_s9, + 0x77040a: LocationName.grass_land_1_s10, + 0x77040b: LocationName.grass_land_1_s11, + 0x77040c: LocationName.grass_land_1_s12, + 0x77040d: LocationName.grass_land_1_s13, + 0x77040e: LocationName.grass_land_1_s14, + 0x77040f: LocationName.grass_land_1_s15, + 0x770410: LocationName.grass_land_1_s16, + 0x770411: LocationName.grass_land_1_s17, + 0x770412: LocationName.grass_land_1_s18, + 0x770413: LocationName.grass_land_1_s19, + 0x770414: LocationName.grass_land_1_s20, + 0x770415: LocationName.grass_land_1_s21, + 0x770416: LocationName.grass_land_1_s22, + 0x770417: LocationName.grass_land_1_s23, + 0x770418: LocationName.grass_land_2_s1, + 0x770419: LocationName.grass_land_2_s2, + 0x77041a: LocationName.grass_land_2_s3, + 0x77041b: LocationName.grass_land_2_s4, + 0x77041c: LocationName.grass_land_2_s5, + 0x77041d: LocationName.grass_land_2_s6, + 0x77041e: LocationName.grass_land_2_s7, + 0x77041f: LocationName.grass_land_2_s8, + 0x770420: LocationName.grass_land_2_s9, + 0x770421: LocationName.grass_land_2_s10, + 0x770422: LocationName.grass_land_2_s11, + 0x770423: LocationName.grass_land_2_s12, + 0x770424: LocationName.grass_land_2_s13, + 0x770425: LocationName.grass_land_2_s14, + 0x770426: LocationName.grass_land_2_s15, + 0x770427: LocationName.grass_land_2_s16, + 0x770428: LocationName.grass_land_2_s17, + 0x770429: LocationName.grass_land_2_s18, + 0x77042a: LocationName.grass_land_2_s19, + 0x77042b: LocationName.grass_land_2_s20, + 0x77042c: LocationName.grass_land_2_s21, + 0x77042d: LocationName.grass_land_3_s1, + 0x77042e: LocationName.grass_land_3_s2, + 0x77042f: LocationName.grass_land_3_s3, + 0x770430: LocationName.grass_land_3_s4, + 0x770431: LocationName.grass_land_3_s5, + 0x770432: LocationName.grass_land_3_s6, + 0x770433: LocationName.grass_land_3_s7, + 0x770434: LocationName.grass_land_3_s8, + 0x770435: LocationName.grass_land_3_s9, + 0x770436: LocationName.grass_land_3_s10, + 0x770437: LocationName.grass_land_3_s11, + 0x770438: LocationName.grass_land_3_s12, + 0x770439: LocationName.grass_land_3_s13, + 0x77043a: LocationName.grass_land_3_s14, + 0x77043b: LocationName.grass_land_3_s15, + 0x77043c: LocationName.grass_land_3_s16, + 0x77043d: LocationName.grass_land_3_s17, + 0x77043e: LocationName.grass_land_3_s18, + 0x77043f: LocationName.grass_land_3_s19, + 0x770440: LocationName.grass_land_3_s20, + 0x770441: LocationName.grass_land_3_s21, + 0x770442: LocationName.grass_land_3_s22, + 0x770443: LocationName.grass_land_3_s23, + 0x770444: LocationName.grass_land_3_s24, + 0x770445: LocationName.grass_land_3_s25, + 0x770446: LocationName.grass_land_3_s26, + 0x770447: LocationName.grass_land_3_s27, + 0x770448: LocationName.grass_land_3_s28, + 0x770449: LocationName.grass_land_3_s29, + 0x77044a: LocationName.grass_land_3_s30, + 0x77044b: LocationName.grass_land_3_s31, + 0x77044c: LocationName.grass_land_4_s1, + 0x77044d: LocationName.grass_land_4_s2, + 0x77044e: LocationName.grass_land_4_s3, + 0x77044f: LocationName.grass_land_4_s4, + 0x770450: LocationName.grass_land_4_s5, + 0x770451: LocationName.grass_land_4_s6, + 0x770452: LocationName.grass_land_4_s7, + 0x770453: LocationName.grass_land_4_s8, + 0x770454: LocationName.grass_land_4_s9, + 0x770455: LocationName.grass_land_4_s10, + 0x770456: LocationName.grass_land_4_s11, + 0x770457: LocationName.grass_land_4_s12, + 0x770458: LocationName.grass_land_4_s13, + 0x770459: LocationName.grass_land_4_s14, + 0x77045a: LocationName.grass_land_4_s15, + 0x77045b: LocationName.grass_land_4_s16, + 0x77045c: LocationName.grass_land_4_s17, + 0x77045d: LocationName.grass_land_4_s18, + 0x77045e: LocationName.grass_land_4_s19, + 0x77045f: LocationName.grass_land_4_s20, + 0x770460: LocationName.grass_land_4_s21, + 0x770461: LocationName.grass_land_4_s22, + 0x770462: LocationName.grass_land_4_s23, + 0x770463: LocationName.grass_land_4_s24, + 0x770464: LocationName.grass_land_4_s25, + 0x770465: LocationName.grass_land_4_s26, + 0x770466: LocationName.grass_land_4_s27, + 0x770467: LocationName.grass_land_4_s28, + 0x770468: LocationName.grass_land_4_s29, + 0x770469: LocationName.grass_land_4_s30, + 0x77046a: LocationName.grass_land_4_s31, + 0x77046b: LocationName.grass_land_4_s32, + 0x77046c: LocationName.grass_land_4_s33, + 0x77046d: LocationName.grass_land_4_s34, + 0x77046e: LocationName.grass_land_4_s35, + 0x77046f: LocationName.grass_land_4_s36, + 0x770470: LocationName.grass_land_4_s37, + 0x770471: LocationName.grass_land_5_s1, + 0x770472: LocationName.grass_land_5_s2, + 0x770473: LocationName.grass_land_5_s3, + 0x770474: LocationName.grass_land_5_s4, + 0x770475: LocationName.grass_land_5_s5, + 0x770476: LocationName.grass_land_5_s6, + 0x770477: LocationName.grass_land_5_s7, + 0x770478: LocationName.grass_land_5_s8, + 0x770479: LocationName.grass_land_5_s9, + 0x77047a: LocationName.grass_land_5_s10, + 0x77047b: LocationName.grass_land_5_s11, + 0x77047c: LocationName.grass_land_5_s12, + 0x77047d: LocationName.grass_land_5_s13, + 0x77047e: LocationName.grass_land_5_s14, + 0x77047f: LocationName.grass_land_5_s15, + 0x770480: LocationName.grass_land_5_s16, + 0x770481: LocationName.grass_land_5_s17, + 0x770482: LocationName.grass_land_5_s18, + 0x770483: LocationName.grass_land_5_s19, + 0x770484: LocationName.grass_land_5_s20, + 0x770485: LocationName.grass_land_5_s21, + 0x770486: LocationName.grass_land_5_s22, + 0x770487: LocationName.grass_land_5_s23, + 0x770488: LocationName.grass_land_5_s24, + 0x770489: LocationName.grass_land_5_s25, + 0x77048a: LocationName.grass_land_5_s26, + 0x77048b: LocationName.grass_land_5_s27, + 0x77048c: LocationName.grass_land_5_s28, + 0x77048d: LocationName.grass_land_5_s29, + 0x77048e: LocationName.grass_land_6_s1, + 0x77048f: LocationName.grass_land_6_s2, + 0x770490: LocationName.grass_land_6_s3, + 0x770491: LocationName.grass_land_6_s4, + 0x770492: LocationName.grass_land_6_s5, + 0x770493: LocationName.grass_land_6_s6, + 0x770494: LocationName.grass_land_6_s7, + 0x770495: LocationName.grass_land_6_s8, + 0x770496: LocationName.grass_land_6_s9, + 0x770497: LocationName.grass_land_6_s10, + 0x770498: LocationName.grass_land_6_s11, + 0x770499: LocationName.grass_land_6_s12, + 0x77049a: LocationName.grass_land_6_s13, + 0x77049b: LocationName.grass_land_6_s14, + 0x77049c: LocationName.grass_land_6_s15, + 0x77049d: LocationName.grass_land_6_s16, + 0x77049e: LocationName.grass_land_6_s17, + 0x77049f: LocationName.grass_land_6_s18, + 0x7704a0: LocationName.grass_land_6_s19, + 0x7704a1: LocationName.grass_land_6_s20, + 0x7704a2: LocationName.grass_land_6_s21, + 0x7704a3: LocationName.grass_land_6_s22, + 0x7704a4: LocationName.grass_land_6_s23, + 0x7704a5: LocationName.grass_land_6_s24, + 0x7704a6: LocationName.grass_land_6_s25, + 0x7704a7: LocationName.grass_land_6_s26, + 0x7704a8: LocationName.grass_land_6_s27, + 0x7704a9: LocationName.grass_land_6_s28, + 0x7704aa: LocationName.grass_land_6_s29, + 0x7704ab: LocationName.ripple_field_1_s1, + 0x7704ac: LocationName.ripple_field_1_s2, + 0x7704ad: LocationName.ripple_field_1_s3, + 0x7704ae: LocationName.ripple_field_1_s4, + 0x7704af: LocationName.ripple_field_1_s5, + 0x7704b0: LocationName.ripple_field_1_s6, + 0x7704b1: LocationName.ripple_field_1_s7, + 0x7704b2: LocationName.ripple_field_1_s8, + 0x7704b3: LocationName.ripple_field_1_s9, + 0x7704b4: LocationName.ripple_field_1_s10, + 0x7704b5: LocationName.ripple_field_1_s11, + 0x7704b6: LocationName.ripple_field_1_s12, + 0x7704b7: LocationName.ripple_field_1_s13, + 0x7704b8: LocationName.ripple_field_1_s14, + 0x7704b9: LocationName.ripple_field_1_s15, + 0x7704ba: LocationName.ripple_field_1_s16, + 0x7704bb: LocationName.ripple_field_1_s17, + 0x7704bc: LocationName.ripple_field_1_s18, + 0x7704bd: LocationName.ripple_field_1_s19, + 0x7704be: LocationName.ripple_field_2_s1, + 0x7704bf: LocationName.ripple_field_2_s2, + 0x7704c0: LocationName.ripple_field_2_s3, + 0x7704c1: LocationName.ripple_field_2_s4, + 0x7704c2: LocationName.ripple_field_2_s5, + 0x7704c3: LocationName.ripple_field_2_s6, + 0x7704c4: LocationName.ripple_field_2_s7, + 0x7704c5: LocationName.ripple_field_2_s8, + 0x7704c6: LocationName.ripple_field_2_s9, + 0x7704c7: LocationName.ripple_field_2_s10, + 0x7704c8: LocationName.ripple_field_2_s11, + 0x7704c9: LocationName.ripple_field_2_s12, + 0x7704ca: LocationName.ripple_field_2_s13, + 0x7704cb: LocationName.ripple_field_2_s14, + 0x7704cc: LocationName.ripple_field_2_s15, + 0x7704cd: LocationName.ripple_field_2_s16, + 0x7704ce: LocationName.ripple_field_2_s17, + 0x7704cf: LocationName.ripple_field_3_s1, + 0x7704d0: LocationName.ripple_field_3_s2, + 0x7704d1: LocationName.ripple_field_3_s3, + 0x7704d2: LocationName.ripple_field_3_s4, + 0x7704d3: LocationName.ripple_field_3_s5, + 0x7704d4: LocationName.ripple_field_3_s6, + 0x7704d5: LocationName.ripple_field_3_s7, + 0x7704d6: LocationName.ripple_field_3_s8, + 0x7704d7: LocationName.ripple_field_3_s9, + 0x7704d8: LocationName.ripple_field_3_s10, + 0x7704d9: LocationName.ripple_field_3_s11, + 0x7704da: LocationName.ripple_field_3_s12, + 0x7704db: LocationName.ripple_field_3_s13, + 0x7704dc: LocationName.ripple_field_3_s14, + 0x7704dd: LocationName.ripple_field_3_s15, + 0x7704de: LocationName.ripple_field_3_s16, + 0x7704df: LocationName.ripple_field_3_s17, + 0x7704e0: LocationName.ripple_field_3_s18, + 0x7704e1: LocationName.ripple_field_3_s19, + 0x7704e2: LocationName.ripple_field_3_s20, + 0x7704e3: LocationName.ripple_field_3_s21, + 0x7704e4: LocationName.ripple_field_4_s1, + 0x7704e5: LocationName.ripple_field_4_s2, + 0x7704e6: LocationName.ripple_field_4_s3, + 0x7704e7: LocationName.ripple_field_4_s4, + 0x7704e8: LocationName.ripple_field_4_s5, + 0x7704e9: LocationName.ripple_field_4_s6, + 0x7704ea: LocationName.ripple_field_4_s7, + 0x7704eb: LocationName.ripple_field_4_s8, + 0x7704ec: LocationName.ripple_field_4_s9, + 0x7704ed: LocationName.ripple_field_4_s10, + 0x7704ee: LocationName.ripple_field_4_s11, + 0x7704ef: LocationName.ripple_field_4_s12, + 0x7704f0: LocationName.ripple_field_4_s13, + 0x7704f1: LocationName.ripple_field_4_s14, + 0x7704f2: LocationName.ripple_field_4_s15, + 0x7704f3: LocationName.ripple_field_4_s16, + 0x7704f4: LocationName.ripple_field_4_s17, + 0x7704f5: LocationName.ripple_field_4_s18, + 0x7704f6: LocationName.ripple_field_4_s19, + 0x7704f7: LocationName.ripple_field_4_s20, + 0x7704f8: LocationName.ripple_field_4_s21, + 0x7704f9: LocationName.ripple_field_4_s22, + 0x7704fa: LocationName.ripple_field_4_s23, + 0x7704fb: LocationName.ripple_field_4_s24, + 0x7704fc: LocationName.ripple_field_4_s25, + 0x7704fd: LocationName.ripple_field_4_s26, + 0x7704fe: LocationName.ripple_field_4_s27, + 0x7704ff: LocationName.ripple_field_4_s28, + 0x770500: LocationName.ripple_field_4_s29, + 0x770501: LocationName.ripple_field_4_s30, + 0x770502: LocationName.ripple_field_4_s31, + 0x770503: LocationName.ripple_field_4_s32, + 0x770504: LocationName.ripple_field_4_s33, + 0x770505: LocationName.ripple_field_4_s34, + 0x770506: LocationName.ripple_field_4_s35, + 0x770507: LocationName.ripple_field_4_s36, + 0x770508: LocationName.ripple_field_4_s37, + 0x770509: LocationName.ripple_field_4_s38, + 0x77050a: LocationName.ripple_field_4_s39, + 0x77050b: LocationName.ripple_field_4_s40, + 0x77050c: LocationName.ripple_field_4_s41, + 0x77050d: LocationName.ripple_field_4_s42, + 0x77050e: LocationName.ripple_field_4_s43, + 0x77050f: LocationName.ripple_field_4_s44, + 0x770510: LocationName.ripple_field_4_s45, + 0x770511: LocationName.ripple_field_4_s46, + 0x770512: LocationName.ripple_field_4_s47, + 0x770513: LocationName.ripple_field_4_s48, + 0x770514: LocationName.ripple_field_4_s49, + 0x770515: LocationName.ripple_field_4_s50, + 0x770516: LocationName.ripple_field_4_s51, + 0x770517: LocationName.ripple_field_5_s1, + 0x770518: LocationName.ripple_field_5_s2, + 0x770519: LocationName.ripple_field_5_s3, + 0x77051a: LocationName.ripple_field_5_s4, + 0x77051b: LocationName.ripple_field_5_s5, + 0x77051c: LocationName.ripple_field_5_s6, + 0x77051d: LocationName.ripple_field_5_s7, + 0x77051e: LocationName.ripple_field_5_s8, + 0x77051f: LocationName.ripple_field_5_s9, + 0x770520: LocationName.ripple_field_5_s10, + 0x770521: LocationName.ripple_field_5_s11, + 0x770522: LocationName.ripple_field_5_s12, + 0x770523: LocationName.ripple_field_5_s13, + 0x770524: LocationName.ripple_field_5_s14, + 0x770525: LocationName.ripple_field_5_s15, + 0x770526: LocationName.ripple_field_5_s16, + 0x770527: LocationName.ripple_field_5_s17, + 0x770528: LocationName.ripple_field_5_s18, + 0x770529: LocationName.ripple_field_5_s19, + 0x77052a: LocationName.ripple_field_5_s20, + 0x77052b: LocationName.ripple_field_5_s21, + 0x77052c: LocationName.ripple_field_5_s22, + 0x77052d: LocationName.ripple_field_5_s23, + 0x77052e: LocationName.ripple_field_5_s24, + 0x77052f: LocationName.ripple_field_5_s25, + 0x770530: LocationName.ripple_field_5_s26, + 0x770531: LocationName.ripple_field_5_s27, + 0x770532: LocationName.ripple_field_5_s28, + 0x770533: LocationName.ripple_field_5_s29, + 0x770534: LocationName.ripple_field_5_s30, + 0x770535: LocationName.ripple_field_5_s31, + 0x770536: LocationName.ripple_field_5_s32, + 0x770537: LocationName.ripple_field_5_s33, + 0x770538: LocationName.ripple_field_5_s34, + 0x770539: LocationName.ripple_field_5_s35, + 0x77053a: LocationName.ripple_field_5_s36, + 0x77053b: LocationName.ripple_field_5_s37, + 0x77053c: LocationName.ripple_field_5_s38, + 0x77053d: LocationName.ripple_field_5_s39, + 0x77053e: LocationName.ripple_field_5_s40, + 0x77053f: LocationName.ripple_field_5_s41, + 0x770540: LocationName.ripple_field_5_s42, + 0x770541: LocationName.ripple_field_5_s43, + 0x770542: LocationName.ripple_field_5_s44, + 0x770543: LocationName.ripple_field_5_s45, + 0x770544: LocationName.ripple_field_5_s46, + 0x770545: LocationName.ripple_field_5_s47, + 0x770546: LocationName.ripple_field_5_s48, + 0x770547: LocationName.ripple_field_5_s49, + 0x770548: LocationName.ripple_field_5_s50, + 0x770549: LocationName.ripple_field_5_s51, + 0x77054a: LocationName.ripple_field_6_s1, + 0x77054b: LocationName.ripple_field_6_s2, + 0x77054c: LocationName.ripple_field_6_s3, + 0x77054d: LocationName.ripple_field_6_s4, + 0x77054e: LocationName.ripple_field_6_s5, + 0x77054f: LocationName.ripple_field_6_s6, + 0x770550: LocationName.ripple_field_6_s7, + 0x770551: LocationName.ripple_field_6_s8, + 0x770552: LocationName.ripple_field_6_s9, + 0x770553: LocationName.ripple_field_6_s10, + 0x770554: LocationName.ripple_field_6_s11, + 0x770555: LocationName.ripple_field_6_s12, + 0x770556: LocationName.ripple_field_6_s13, + 0x770557: LocationName.ripple_field_6_s14, + 0x770558: LocationName.ripple_field_6_s15, + 0x770559: LocationName.ripple_field_6_s16, + 0x77055a: LocationName.ripple_field_6_s17, + 0x77055b: LocationName.ripple_field_6_s18, + 0x77055c: LocationName.ripple_field_6_s19, + 0x77055d: LocationName.ripple_field_6_s20, + 0x77055e: LocationName.ripple_field_6_s21, + 0x77055f: LocationName.ripple_field_6_s22, + 0x770560: LocationName.ripple_field_6_s23, + 0x770561: LocationName.sand_canyon_1_s1, + 0x770562: LocationName.sand_canyon_1_s2, + 0x770563: LocationName.sand_canyon_1_s3, + 0x770564: LocationName.sand_canyon_1_s4, + 0x770565: LocationName.sand_canyon_1_s5, + 0x770566: LocationName.sand_canyon_1_s6, + 0x770567: LocationName.sand_canyon_1_s7, + 0x770568: LocationName.sand_canyon_1_s8, + 0x770569: LocationName.sand_canyon_1_s9, + 0x77056a: LocationName.sand_canyon_1_s10, + 0x77056b: LocationName.sand_canyon_1_s11, + 0x77056c: LocationName.sand_canyon_1_s12, + 0x77056d: LocationName.sand_canyon_1_s13, + 0x77056e: LocationName.sand_canyon_1_s14, + 0x77056f: LocationName.sand_canyon_1_s15, + 0x770570: LocationName.sand_canyon_1_s16, + 0x770571: LocationName.sand_canyon_1_s17, + 0x770572: LocationName.sand_canyon_1_s18, + 0x770573: LocationName.sand_canyon_1_s19, + 0x770574: LocationName.sand_canyon_1_s20, + 0x770575: LocationName.sand_canyon_1_s21, + 0x770576: LocationName.sand_canyon_1_s22, + 0x770577: LocationName.sand_canyon_2_s1, + 0x770578: LocationName.sand_canyon_2_s2, + 0x770579: LocationName.sand_canyon_2_s3, + 0x77057a: LocationName.sand_canyon_2_s4, + 0x77057b: LocationName.sand_canyon_2_s5, + 0x77057c: LocationName.sand_canyon_2_s6, + 0x77057d: LocationName.sand_canyon_2_s7, + 0x77057e: LocationName.sand_canyon_2_s8, + 0x77057f: LocationName.sand_canyon_2_s9, + 0x770580: LocationName.sand_canyon_2_s10, + 0x770581: LocationName.sand_canyon_2_s11, + 0x770582: LocationName.sand_canyon_2_s12, + 0x770583: LocationName.sand_canyon_2_s13, + 0x770584: LocationName.sand_canyon_2_s14, + 0x770585: LocationName.sand_canyon_2_s15, + 0x770586: LocationName.sand_canyon_2_s16, + 0x770587: LocationName.sand_canyon_2_s17, + 0x770588: LocationName.sand_canyon_2_s18, + 0x770589: LocationName.sand_canyon_2_s19, + 0x77058a: LocationName.sand_canyon_2_s20, + 0x77058b: LocationName.sand_canyon_2_s21, + 0x77058c: LocationName.sand_canyon_2_s22, + 0x77058d: LocationName.sand_canyon_2_s23, + 0x77058e: LocationName.sand_canyon_2_s24, + 0x77058f: LocationName.sand_canyon_2_s25, + 0x770590: LocationName.sand_canyon_2_s26, + 0x770591: LocationName.sand_canyon_2_s27, + 0x770592: LocationName.sand_canyon_2_s28, + 0x770593: LocationName.sand_canyon_2_s29, + 0x770594: LocationName.sand_canyon_2_s30, + 0x770595: LocationName.sand_canyon_2_s31, + 0x770596: LocationName.sand_canyon_2_s32, + 0x770597: LocationName.sand_canyon_2_s33, + 0x770598: LocationName.sand_canyon_2_s34, + 0x770599: LocationName.sand_canyon_2_s35, + 0x77059a: LocationName.sand_canyon_2_s36, + 0x77059b: LocationName.sand_canyon_2_s37, + 0x77059c: LocationName.sand_canyon_2_s38, + 0x77059d: LocationName.sand_canyon_2_s39, + 0x77059e: LocationName.sand_canyon_2_s40, + 0x77059f: LocationName.sand_canyon_2_s41, + 0x7705a0: LocationName.sand_canyon_2_s42, + 0x7705a1: LocationName.sand_canyon_2_s43, + 0x7705a2: LocationName.sand_canyon_2_s44, + 0x7705a3: LocationName.sand_canyon_2_s45, + 0x7705a4: LocationName.sand_canyon_2_s46, + 0x7705a5: LocationName.sand_canyon_2_s47, + 0x7705a6: LocationName.sand_canyon_2_s48, + 0x7705a7: LocationName.sand_canyon_3_s1, + 0x7705a8: LocationName.sand_canyon_3_s2, + 0x7705a9: LocationName.sand_canyon_3_s3, + 0x7705aa: LocationName.sand_canyon_3_s4, + 0x7705ab: LocationName.sand_canyon_3_s5, + 0x7705ac: LocationName.sand_canyon_3_s6, + 0x7705ad: LocationName.sand_canyon_3_s7, + 0x7705ae: LocationName.sand_canyon_3_s8, + 0x7705af: LocationName.sand_canyon_3_s9, + 0x7705b0: LocationName.sand_canyon_3_s10, + 0x7705b1: LocationName.sand_canyon_4_s1, + 0x7705b2: LocationName.sand_canyon_4_s2, + 0x7705b3: LocationName.sand_canyon_4_s3, + 0x7705b4: LocationName.sand_canyon_4_s4, + 0x7705b5: LocationName.sand_canyon_4_s5, + 0x7705b6: LocationName.sand_canyon_4_s6, + 0x7705b7: LocationName.sand_canyon_4_s7, + 0x7705b8: LocationName.sand_canyon_4_s8, + 0x7705b9: LocationName.sand_canyon_4_s9, + 0x7705ba: LocationName.sand_canyon_4_s10, + 0x7705bb: LocationName.sand_canyon_4_s11, + 0x7705bc: LocationName.sand_canyon_4_s12, + 0x7705bd: LocationName.sand_canyon_4_s13, + 0x7705be: LocationName.sand_canyon_4_s14, + 0x7705bf: LocationName.sand_canyon_4_s15, + 0x7705c0: LocationName.sand_canyon_4_s16, + 0x7705c1: LocationName.sand_canyon_4_s17, + 0x7705c2: LocationName.sand_canyon_4_s18, + 0x7705c3: LocationName.sand_canyon_4_s19, + 0x7705c4: LocationName.sand_canyon_4_s20, + 0x7705c5: LocationName.sand_canyon_4_s21, + 0x7705c6: LocationName.sand_canyon_4_s22, + 0x7705c7: LocationName.sand_canyon_4_s23, + 0x7705c8: LocationName.sand_canyon_5_s1, + 0x7705c9: LocationName.sand_canyon_5_s2, + 0x7705ca: LocationName.sand_canyon_5_s3, + 0x7705cb: LocationName.sand_canyon_5_s4, + 0x7705cc: LocationName.sand_canyon_5_s5, + 0x7705cd: LocationName.sand_canyon_5_s6, + 0x7705ce: LocationName.sand_canyon_5_s7, + 0x7705cf: LocationName.sand_canyon_5_s8, + 0x7705d0: LocationName.sand_canyon_5_s9, + 0x7705d1: LocationName.sand_canyon_5_s10, + 0x7705d2: LocationName.sand_canyon_5_s11, + 0x7705d3: LocationName.sand_canyon_5_s12, + 0x7705d4: LocationName.sand_canyon_5_s13, + 0x7705d5: LocationName.sand_canyon_5_s14, + 0x7705d6: LocationName.sand_canyon_5_s15, + 0x7705d7: LocationName.sand_canyon_5_s16, + 0x7705d8: LocationName.sand_canyon_5_s17, + 0x7705d9: LocationName.sand_canyon_5_s18, + 0x7705da: LocationName.sand_canyon_5_s19, + 0x7705db: LocationName.sand_canyon_5_s20, + 0x7705dc: LocationName.sand_canyon_5_s21, + 0x7705dd: LocationName.sand_canyon_5_s22, + 0x7705de: LocationName.sand_canyon_5_s23, + 0x7705df: LocationName.sand_canyon_5_s24, + 0x7705e0: LocationName.sand_canyon_5_s25, + 0x7705e1: LocationName.sand_canyon_5_s26, + 0x7705e2: LocationName.sand_canyon_5_s27, + 0x7705e3: LocationName.sand_canyon_5_s28, + 0x7705e4: LocationName.sand_canyon_5_s29, + 0x7705e5: LocationName.sand_canyon_5_s30, + 0x7705e6: LocationName.sand_canyon_5_s31, + 0x7705e7: LocationName.sand_canyon_5_s32, + 0x7705e8: LocationName.sand_canyon_5_s33, + 0x7705e9: LocationName.sand_canyon_5_s34, + 0x7705ea: LocationName.sand_canyon_5_s35, + 0x7705eb: LocationName.sand_canyon_5_s36, + 0x7705ec: LocationName.sand_canyon_5_s37, + 0x7705ed: LocationName.sand_canyon_5_s38, + 0x7705ee: LocationName.sand_canyon_5_s39, + 0x7705ef: LocationName.sand_canyon_5_s40, + 0x7705f0: LocationName.cloudy_park_1_s1, + 0x7705f1: LocationName.cloudy_park_1_s2, + 0x7705f2: LocationName.cloudy_park_1_s3, + 0x7705f3: LocationName.cloudy_park_1_s4, + 0x7705f4: LocationName.cloudy_park_1_s5, + 0x7705f5: LocationName.cloudy_park_1_s6, + 0x7705f6: LocationName.cloudy_park_1_s7, + 0x7705f7: LocationName.cloudy_park_1_s8, + 0x7705f8: LocationName.cloudy_park_1_s9, + 0x7705f9: LocationName.cloudy_park_1_s10, + 0x7705fa: LocationName.cloudy_park_1_s11, + 0x7705fb: LocationName.cloudy_park_1_s12, + 0x7705fc: LocationName.cloudy_park_1_s13, + 0x7705fd: LocationName.cloudy_park_1_s14, + 0x7705fe: LocationName.cloudy_park_1_s15, + 0x7705ff: LocationName.cloudy_park_1_s16, + 0x770600: LocationName.cloudy_park_1_s17, + 0x770601: LocationName.cloudy_park_1_s18, + 0x770602: LocationName.cloudy_park_1_s19, + 0x770603: LocationName.cloudy_park_1_s20, + 0x770604: LocationName.cloudy_park_1_s21, + 0x770605: LocationName.cloudy_park_1_s22, + 0x770606: LocationName.cloudy_park_1_s23, + 0x770607: LocationName.cloudy_park_2_s1, + 0x770608: LocationName.cloudy_park_2_s2, + 0x770609: LocationName.cloudy_park_2_s3, + 0x77060a: LocationName.cloudy_park_2_s4, + 0x77060b: LocationName.cloudy_park_2_s5, + 0x77060c: LocationName.cloudy_park_2_s6, + 0x77060d: LocationName.cloudy_park_2_s7, + 0x77060e: LocationName.cloudy_park_2_s8, + 0x77060f: LocationName.cloudy_park_2_s9, + 0x770610: LocationName.cloudy_park_2_s10, + 0x770611: LocationName.cloudy_park_2_s11, + 0x770612: LocationName.cloudy_park_2_s12, + 0x770613: LocationName.cloudy_park_2_s13, + 0x770614: LocationName.cloudy_park_2_s14, + 0x770615: LocationName.cloudy_park_2_s15, + 0x770616: LocationName.cloudy_park_2_s16, + 0x770617: LocationName.cloudy_park_2_s17, + 0x770618: LocationName.cloudy_park_2_s18, + 0x770619: LocationName.cloudy_park_2_s19, + 0x77061a: LocationName.cloudy_park_2_s20, + 0x77061b: LocationName.cloudy_park_2_s21, + 0x77061c: LocationName.cloudy_park_2_s22, + 0x77061d: LocationName.cloudy_park_2_s23, + 0x77061e: LocationName.cloudy_park_2_s24, + 0x77061f: LocationName.cloudy_park_2_s25, + 0x770620: LocationName.cloudy_park_2_s26, + 0x770621: LocationName.cloudy_park_2_s27, + 0x770622: LocationName.cloudy_park_2_s28, + 0x770623: LocationName.cloudy_park_2_s29, + 0x770624: LocationName.cloudy_park_2_s30, + 0x770625: LocationName.cloudy_park_2_s31, + 0x770626: LocationName.cloudy_park_2_s32, + 0x770627: LocationName.cloudy_park_2_s33, + 0x770628: LocationName.cloudy_park_2_s34, + 0x770629: LocationName.cloudy_park_2_s35, + 0x77062a: LocationName.cloudy_park_2_s36, + 0x77062b: LocationName.cloudy_park_2_s37, + 0x77062c: LocationName.cloudy_park_2_s38, + 0x77062d: LocationName.cloudy_park_2_s39, + 0x77062e: LocationName.cloudy_park_2_s40, + 0x77062f: LocationName.cloudy_park_2_s41, + 0x770630: LocationName.cloudy_park_2_s42, + 0x770631: LocationName.cloudy_park_2_s43, + 0x770632: LocationName.cloudy_park_2_s44, + 0x770633: LocationName.cloudy_park_2_s45, + 0x770634: LocationName.cloudy_park_2_s46, + 0x770635: LocationName.cloudy_park_2_s47, + 0x770636: LocationName.cloudy_park_2_s48, + 0x770637: LocationName.cloudy_park_2_s49, + 0x770638: LocationName.cloudy_park_2_s50, + 0x770639: LocationName.cloudy_park_2_s51, + 0x77063a: LocationName.cloudy_park_2_s52, + 0x77063b: LocationName.cloudy_park_2_s53, + 0x77063c: LocationName.cloudy_park_2_s54, + 0x77063d: LocationName.cloudy_park_3_s1, + 0x77063e: LocationName.cloudy_park_3_s2, + 0x77063f: LocationName.cloudy_park_3_s3, + 0x770640: LocationName.cloudy_park_3_s4, + 0x770641: LocationName.cloudy_park_3_s5, + 0x770642: LocationName.cloudy_park_3_s6, + 0x770643: LocationName.cloudy_park_3_s7, + 0x770644: LocationName.cloudy_park_3_s8, + 0x770645: LocationName.cloudy_park_3_s9, + 0x770646: LocationName.cloudy_park_3_s10, + 0x770647: LocationName.cloudy_park_3_s11, + 0x770648: LocationName.cloudy_park_3_s12, + 0x770649: LocationName.cloudy_park_3_s13, + 0x77064a: LocationName.cloudy_park_3_s14, + 0x77064b: LocationName.cloudy_park_3_s15, + 0x77064c: LocationName.cloudy_park_3_s16, + 0x77064d: LocationName.cloudy_park_3_s17, + 0x77064e: LocationName.cloudy_park_3_s18, + 0x77064f: LocationName.cloudy_park_3_s19, + 0x770650: LocationName.cloudy_park_3_s20, + 0x770651: LocationName.cloudy_park_3_s21, + 0x770652: LocationName.cloudy_park_3_s22, + 0x770653: LocationName.cloudy_park_4_s1, + 0x770654: LocationName.cloudy_park_4_s2, + 0x770655: LocationName.cloudy_park_4_s3, + 0x770656: LocationName.cloudy_park_4_s4, + 0x770657: LocationName.cloudy_park_4_s5, + 0x770658: LocationName.cloudy_park_4_s6, + 0x770659: LocationName.cloudy_park_4_s7, + 0x77065a: LocationName.cloudy_park_4_s8, + 0x77065b: LocationName.cloudy_park_4_s9, + 0x77065c: LocationName.cloudy_park_4_s10, + 0x77065d: LocationName.cloudy_park_4_s11, + 0x77065e: LocationName.cloudy_park_4_s12, + 0x77065f: LocationName.cloudy_park_4_s13, + 0x770660: LocationName.cloudy_park_4_s14, + 0x770661: LocationName.cloudy_park_4_s15, + 0x770662: LocationName.cloudy_park_4_s16, + 0x770663: LocationName.cloudy_park_4_s17, + 0x770664: LocationName.cloudy_park_4_s18, + 0x770665: LocationName.cloudy_park_4_s19, + 0x770666: LocationName.cloudy_park_4_s20, + 0x770667: LocationName.cloudy_park_4_s21, + 0x770668: LocationName.cloudy_park_4_s22, + 0x770669: LocationName.cloudy_park_4_s23, + 0x77066a: LocationName.cloudy_park_4_s24, + 0x77066b: LocationName.cloudy_park_4_s25, + 0x77066c: LocationName.cloudy_park_4_s26, + 0x77066d: LocationName.cloudy_park_4_s27, + 0x77066e: LocationName.cloudy_park_4_s28, + 0x77066f: LocationName.cloudy_park_4_s29, + 0x770670: LocationName.cloudy_park_4_s30, + 0x770671: LocationName.cloudy_park_4_s31, + 0x770672: LocationName.cloudy_park_4_s32, + 0x770673: LocationName.cloudy_park_4_s33, + 0x770674: LocationName.cloudy_park_4_s34, + 0x770675: LocationName.cloudy_park_4_s35, + 0x770676: LocationName.cloudy_park_4_s36, + 0x770677: LocationName.cloudy_park_4_s37, + 0x770678: LocationName.cloudy_park_4_s38, + 0x770679: LocationName.cloudy_park_4_s39, + 0x77067a: LocationName.cloudy_park_4_s40, + 0x77067b: LocationName.cloudy_park_4_s41, + 0x77067c: LocationName.cloudy_park_4_s42, + 0x77067d: LocationName.cloudy_park_4_s43, + 0x77067e: LocationName.cloudy_park_4_s44, + 0x77067f: LocationName.cloudy_park_4_s45, + 0x770680: LocationName.cloudy_park_4_s46, + 0x770681: LocationName.cloudy_park_4_s47, + 0x770682: LocationName.cloudy_park_4_s48, + 0x770683: LocationName.cloudy_park_4_s49, + 0x770684: LocationName.cloudy_park_4_s50, + 0x770685: LocationName.cloudy_park_5_s1, + 0x770686: LocationName.cloudy_park_5_s2, + 0x770687: LocationName.cloudy_park_5_s3, + 0x770688: LocationName.cloudy_park_5_s4, + 0x770689: LocationName.cloudy_park_5_s5, + 0x77068a: LocationName.cloudy_park_5_s6, + 0x77068b: LocationName.cloudy_park_6_s1, + 0x77068c: LocationName.cloudy_park_6_s2, + 0x77068d: LocationName.cloudy_park_6_s3, + 0x77068e: LocationName.cloudy_park_6_s4, + 0x77068f: LocationName.cloudy_park_6_s5, + 0x770690: LocationName.cloudy_park_6_s6, + 0x770691: LocationName.cloudy_park_6_s7, + 0x770692: LocationName.cloudy_park_6_s8, + 0x770693: LocationName.cloudy_park_6_s9, + 0x770694: LocationName.cloudy_park_6_s10, + 0x770695: LocationName.cloudy_park_6_s11, + 0x770696: LocationName.cloudy_park_6_s12, + 0x770697: LocationName.cloudy_park_6_s13, + 0x770698: LocationName.cloudy_park_6_s14, + 0x770699: LocationName.cloudy_park_6_s15, + 0x77069a: LocationName.cloudy_park_6_s16, + 0x77069b: LocationName.cloudy_park_6_s17, + 0x77069c: LocationName.cloudy_park_6_s18, + 0x77069d: LocationName.cloudy_park_6_s19, + 0x77069e: LocationName.cloudy_park_6_s20, + 0x77069f: LocationName.cloudy_park_6_s21, + 0x7706a0: LocationName.cloudy_park_6_s22, + 0x7706a1: LocationName.cloudy_park_6_s23, + 0x7706a2: LocationName.cloudy_park_6_s24, + 0x7706a3: LocationName.cloudy_park_6_s25, + 0x7706a4: LocationName.cloudy_park_6_s26, + 0x7706a5: LocationName.cloudy_park_6_s27, + 0x7706a6: LocationName.cloudy_park_6_s28, + 0x7706a7: LocationName.cloudy_park_6_s29, + 0x7706a8: LocationName.cloudy_park_6_s30, + 0x7706a9: LocationName.cloudy_park_6_s31, + 0x7706aa: LocationName.cloudy_park_6_s32, + 0x7706ab: LocationName.cloudy_park_6_s33, + 0x7706ac: LocationName.iceberg_1_s1, + 0x7706ad: LocationName.iceberg_1_s2, + 0x7706ae: LocationName.iceberg_1_s3, + 0x7706af: LocationName.iceberg_1_s4, + 0x7706b0: LocationName.iceberg_1_s5, + 0x7706b1: LocationName.iceberg_1_s6, + 0x7706b2: LocationName.iceberg_2_s1, + 0x7706b3: LocationName.iceberg_2_s2, + 0x7706b4: LocationName.iceberg_2_s3, + 0x7706b5: LocationName.iceberg_2_s4, + 0x7706b6: LocationName.iceberg_2_s5, + 0x7706b7: LocationName.iceberg_2_s6, + 0x7706b8: LocationName.iceberg_2_s7, + 0x7706b9: LocationName.iceberg_2_s8, + 0x7706ba: LocationName.iceberg_2_s9, + 0x7706bb: LocationName.iceberg_2_s10, + 0x7706bc: LocationName.iceberg_2_s11, + 0x7706bd: LocationName.iceberg_2_s12, + 0x7706be: LocationName.iceberg_2_s13, + 0x7706bf: LocationName.iceberg_2_s14, + 0x7706c0: LocationName.iceberg_2_s15, + 0x7706c1: LocationName.iceberg_2_s16, + 0x7706c2: LocationName.iceberg_2_s17, + 0x7706c3: LocationName.iceberg_2_s18, + 0x7706c4: LocationName.iceberg_2_s19, + 0x7706c5: LocationName.iceberg_3_s1, + 0x7706c6: LocationName.iceberg_3_s2, + 0x7706c7: LocationName.iceberg_3_s3, + 0x7706c8: LocationName.iceberg_3_s4, + 0x7706c9: LocationName.iceberg_3_s5, + 0x7706ca: LocationName.iceberg_3_s6, + 0x7706cb: LocationName.iceberg_3_s7, + 0x7706cc: LocationName.iceberg_3_s8, + 0x7706cd: LocationName.iceberg_3_s9, + 0x7706ce: LocationName.iceberg_3_s10, + 0x7706cf: LocationName.iceberg_3_s11, + 0x7706d0: LocationName.iceberg_3_s12, + 0x7706d1: LocationName.iceberg_3_s13, + 0x7706d2: LocationName.iceberg_3_s14, + 0x7706d3: LocationName.iceberg_3_s15, + 0x7706d4: LocationName.iceberg_3_s16, + 0x7706d5: LocationName.iceberg_3_s17, + 0x7706d6: LocationName.iceberg_3_s18, + 0x7706d7: LocationName.iceberg_3_s19, + 0x7706d8: LocationName.iceberg_3_s20, + 0x7706d9: LocationName.iceberg_3_s21, + 0x7706da: LocationName.iceberg_4_s1, + 0x7706db: LocationName.iceberg_4_s2, + 0x7706dc: LocationName.iceberg_4_s3, + 0x7706dd: LocationName.iceberg_5_s1, + 0x7706de: LocationName.iceberg_5_s2, + 0x7706df: LocationName.iceberg_5_s3, + 0x7706e0: LocationName.iceberg_5_s4, + 0x7706e1: LocationName.iceberg_5_s5, + 0x7706e2: LocationName.iceberg_5_s6, + 0x7706e3: LocationName.iceberg_5_s7, + 0x7706e4: LocationName.iceberg_5_s8, + 0x7706e5: LocationName.iceberg_5_s9, + 0x7706e6: LocationName.iceberg_5_s10, + 0x7706e7: LocationName.iceberg_5_s11, + 0x7706e8: LocationName.iceberg_5_s12, + 0x7706e9: LocationName.iceberg_5_s13, + 0x7706ea: LocationName.iceberg_5_s14, + 0x7706eb: LocationName.iceberg_5_s15, + 0x7706ec: LocationName.iceberg_5_s16, + 0x7706ed: LocationName.iceberg_5_s17, + 0x7706ee: LocationName.iceberg_5_s18, + 0x7706ef: LocationName.iceberg_5_s19, + 0x7706f0: LocationName.iceberg_5_s20, + 0x7706f1: LocationName.iceberg_5_s21, + 0x7706f2: LocationName.iceberg_5_s22, + 0x7706f3: LocationName.iceberg_5_s23, + 0x7706f4: LocationName.iceberg_5_s24, + 0x7706f5: LocationName.iceberg_5_s25, + 0x7706f6: LocationName.iceberg_5_s26, + 0x7706f7: LocationName.iceberg_5_s27, + 0x7706f8: LocationName.iceberg_5_s28, + 0x7706f9: LocationName.iceberg_5_s29, + 0x7706fa: LocationName.iceberg_5_s30, + 0x7706fb: LocationName.iceberg_5_s31, + 0x7706fc: LocationName.iceberg_5_s32, + 0x7706fd: LocationName.iceberg_5_s33, + 0x7706fe: LocationName.iceberg_5_s34, + 0x7706ff: LocationName.iceberg_6_s1, + +} + location_table = { **stage_locations, **heart_star_locations, **boss_locations, **consumable_locations, + **star_locations } diff --git a/worlds/kdl3/Names/LocationName.py b/worlds/kdl3/Names/LocationName.py index 3d72c9fefc4f..59a0a1d690f9 100644 --- a/worlds/kdl3/Names/LocationName.py +++ b/worlds/kdl3/Names/LocationName.py @@ -158,3 +158,771 @@ 2: mg5_p, 3: jumping_clear } + +grass_land_1_s1 = "Grass Land 1 - Star 1" +grass_land_1_s2 = "Grass Land 1 - Star 2" +grass_land_1_s3 = "Grass Land 1 - Star 3" +grass_land_1_s4 = "Grass Land 1 - Star 4" +grass_land_1_s5 = "Grass Land 1 - Star 5" +grass_land_1_s6 = "Grass Land 1 - Star 6" +grass_land_1_s7 = "Grass Land 1 - Star 7" +grass_land_1_s8 = "Grass Land 1 - Star 8" +grass_land_1_s9 = "Grass Land 1 - Star 9" +grass_land_1_s10 = "Grass Land 1 - Star 10" +grass_land_1_s11 = "Grass Land 1 - Star 11" +grass_land_1_s12 = "Grass Land 1 - Star 12" +grass_land_1_s13 = "Grass Land 1 - Star 13" +grass_land_1_s14 = "Grass Land 1 - Star 14" +grass_land_1_s15 = "Grass Land 1 - Star 15" +grass_land_1_s16 = "Grass Land 1 - Star 16" +grass_land_1_s17 = "Grass Land 1 - Star 17" +grass_land_1_s18 = "Grass Land 1 - Star 18" +grass_land_1_s19 = "Grass Land 1 - Star 19" +grass_land_1_s20 = "Grass Land 1 - Star 20" +grass_land_1_s21 = "Grass Land 1 - Star 21" +grass_land_1_s22 = "Grass Land 1 - Star 22" +grass_land_1_s23 = "Grass Land 1 - Star 23" +grass_land_2_s1 = "Grass Land 2 - Star 1" +grass_land_2_s2 = "Grass Land 2 - Star 2" +grass_land_2_s3 = "Grass Land 2 - Star 3" +grass_land_2_s4 = "Grass Land 2 - Star 4" +grass_land_2_s5 = "Grass Land 2 - Star 5" +grass_land_2_s6 = "Grass Land 2 - Star 6" +grass_land_2_s7 = "Grass Land 2 - Star 7" +grass_land_2_s8 = "Grass Land 2 - Star 8" +grass_land_2_s9 = "Grass Land 2 - Star 9" +grass_land_2_s10 = "Grass Land 2 - Star 10" +grass_land_2_s11 = "Grass Land 2 - Star 11" +grass_land_2_s12 = "Grass Land 2 - Star 12" +grass_land_2_s13 = "Grass Land 2 - Star 13" +grass_land_2_s14 = "Grass Land 2 - Star 14" +grass_land_2_s15 = "Grass Land 2 - Star 15" +grass_land_2_s16 = "Grass Land 2 - Star 16" +grass_land_2_s17 = "Grass Land 2 - Star 17" +grass_land_2_s18 = "Grass Land 2 - Star 18" +grass_land_2_s19 = "Grass Land 2 - Star 19" +grass_land_2_s20 = "Grass Land 2 - Star 20" +grass_land_2_s21 = "Grass Land 2 - Star 21" +grass_land_3_s1 = "Grass Land 3 - Star 1" +grass_land_3_s2 = "Grass Land 3 - Star 2" +grass_land_3_s3 = "Grass Land 3 - Star 3" +grass_land_3_s4 = "Grass Land 3 - Star 4" +grass_land_3_s5 = "Grass Land 3 - Star 5" +grass_land_3_s6 = "Grass Land 3 - Star 6" +grass_land_3_s7 = "Grass Land 3 - Star 7" +grass_land_3_s8 = "Grass Land 3 - Star 8" +grass_land_3_s9 = "Grass Land 3 - Star 9" +grass_land_3_s10 = "Grass Land 3 - Star 10" +grass_land_3_s11 = "Grass Land 3 - Star 11" +grass_land_3_s12 = "Grass Land 3 - Star 12" +grass_land_3_s13 = "Grass Land 3 - Star 13" +grass_land_3_s14 = "Grass Land 3 - Star 14" +grass_land_3_s15 = "Grass Land 3 - Star 15" +grass_land_3_s16 = "Grass Land 3 - Star 16" +grass_land_3_s17 = "Grass Land 3 - Star 17" +grass_land_3_s18 = "Grass Land 3 - Star 18" +grass_land_3_s19 = "Grass Land 3 - Star 19" +grass_land_3_s20 = "Grass Land 3 - Star 20" +grass_land_3_s21 = "Grass Land 3 - Star 21" +grass_land_3_s22 = "Grass Land 3 - Star 22" +grass_land_3_s23 = "Grass Land 3 - Star 23" +grass_land_3_s24 = "Grass Land 3 - Star 24" +grass_land_3_s25 = "Grass Land 3 - Star 25" +grass_land_3_s26 = "Grass Land 3 - Star 26" +grass_land_3_s27 = "Grass Land 3 - Star 27" +grass_land_3_s28 = "Grass Land 3 - Star 28" +grass_land_3_s29 = "Grass Land 3 - Star 29" +grass_land_3_s30 = "Grass Land 3 - Star 30" +grass_land_3_s31 = "Grass Land 3 - Star 31" +grass_land_4_s1 = "Grass Land 4 - Star 1" +grass_land_4_s2 = "Grass Land 4 - Star 2" +grass_land_4_s3 = "Grass Land 4 - Star 3" +grass_land_4_s4 = "Grass Land 4 - Star 4" +grass_land_4_s5 = "Grass Land 4 - Star 5" +grass_land_4_s6 = "Grass Land 4 - Star 6" +grass_land_4_s7 = "Grass Land 4 - Star 7" +grass_land_4_s8 = "Grass Land 4 - Star 8" +grass_land_4_s9 = "Grass Land 4 - Star 9" +grass_land_4_s10 = "Grass Land 4 - Star 10" +grass_land_4_s11 = "Grass Land 4 - Star 11" +grass_land_4_s12 = "Grass Land 4 - Star 12" +grass_land_4_s13 = "Grass Land 4 - Star 13" +grass_land_4_s14 = "Grass Land 4 - Star 14" +grass_land_4_s15 = "Grass Land 4 - Star 15" +grass_land_4_s16 = "Grass Land 4 - Star 16" +grass_land_4_s17 = "Grass Land 4 - Star 17" +grass_land_4_s18 = "Grass Land 4 - Star 18" +grass_land_4_s19 = "Grass Land 4 - Star 19" +grass_land_4_s20 = "Grass Land 4 - Star 20" +grass_land_4_s21 = "Grass Land 4 - Star 21" +grass_land_4_s22 = "Grass Land 4 - Star 22" +grass_land_4_s23 = "Grass Land 4 - Star 23" +grass_land_4_s24 = "Grass Land 4 - Star 24" +grass_land_4_s25 = "Grass Land 4 - Star 25" +grass_land_4_s26 = "Grass Land 4 - Star 26" +grass_land_4_s27 = "Grass Land 4 - Star 27" +grass_land_4_s28 = "Grass Land 4 - Star 28" +grass_land_4_s29 = "Grass Land 4 - Star 29" +grass_land_4_s30 = "Grass Land 4 - Star 30" +grass_land_4_s31 = "Grass Land 4 - Star 31" +grass_land_4_s32 = "Grass Land 4 - Star 32" +grass_land_4_s33 = "Grass Land 4 - Star 33" +grass_land_4_s34 = "Grass Land 4 - Star 34" +grass_land_4_s35 = "Grass Land 4 - Star 35" +grass_land_4_s36 = "Grass Land 4 - Star 36" +grass_land_4_s37 = "Grass Land 4 - Star 37" +grass_land_5_s1 = "Grass Land 5 - Star 1" +grass_land_5_s2 = "Grass Land 5 - Star 2" +grass_land_5_s3 = "Grass Land 5 - Star 3" +grass_land_5_s4 = "Grass Land 5 - Star 4" +grass_land_5_s5 = "Grass Land 5 - Star 5" +grass_land_5_s6 = "Grass Land 5 - Star 6" +grass_land_5_s7 = "Grass Land 5 - Star 7" +grass_land_5_s8 = "Grass Land 5 - Star 8" +grass_land_5_s9 = "Grass Land 5 - Star 9" +grass_land_5_s10 = "Grass Land 5 - Star 10" +grass_land_5_s11 = "Grass Land 5 - Star 11" +grass_land_5_s12 = "Grass Land 5 - Star 12" +grass_land_5_s13 = "Grass Land 5 - Star 13" +grass_land_5_s14 = "Grass Land 5 - Star 14" +grass_land_5_s15 = "Grass Land 5 - Star 15" +grass_land_5_s16 = "Grass Land 5 - Star 16" +grass_land_5_s17 = "Grass Land 5 - Star 17" +grass_land_5_s18 = "Grass Land 5 - Star 18" +grass_land_5_s19 = "Grass Land 5 - Star 19" +grass_land_5_s20 = "Grass Land 5 - Star 20" +grass_land_5_s21 = "Grass Land 5 - Star 21" +grass_land_5_s22 = "Grass Land 5 - Star 22" +grass_land_5_s23 = "Grass Land 5 - Star 23" +grass_land_5_s24 = "Grass Land 5 - Star 24" +grass_land_5_s25 = "Grass Land 5 - Star 25" +grass_land_5_s26 = "Grass Land 5 - Star 26" +grass_land_5_s27 = "Grass Land 5 - Star 27" +grass_land_5_s28 = "Grass Land 5 - Star 28" +grass_land_5_s29 = "Grass Land 5 - Star 29" +grass_land_6_s1 = "Grass Land 6 - Star 1" +grass_land_6_s2 = "Grass Land 6 - Star 2" +grass_land_6_s3 = "Grass Land 6 - Star 3" +grass_land_6_s4 = "Grass Land 6 - Star 4" +grass_land_6_s5 = "Grass Land 6 - Star 5" +grass_land_6_s6 = "Grass Land 6 - Star 6" +grass_land_6_s7 = "Grass Land 6 - Star 7" +grass_land_6_s8 = "Grass Land 6 - Star 8" +grass_land_6_s9 = "Grass Land 6 - Star 9" +grass_land_6_s10 = "Grass Land 6 - Star 10" +grass_land_6_s11 = "Grass Land 6 - Star 11" +grass_land_6_s12 = "Grass Land 6 - Star 12" +grass_land_6_s13 = "Grass Land 6 - Star 13" +grass_land_6_s14 = "Grass Land 6 - Star 14" +grass_land_6_s15 = "Grass Land 6 - Star 15" +grass_land_6_s16 = "Grass Land 6 - Star 16" +grass_land_6_s17 = "Grass Land 6 - Star 17" +grass_land_6_s18 = "Grass Land 6 - Star 18" +grass_land_6_s19 = "Grass Land 6 - Star 19" +grass_land_6_s20 = "Grass Land 6 - Star 20" +grass_land_6_s21 = "Grass Land 6 - Star 21" +grass_land_6_s22 = "Grass Land 6 - Star 22" +grass_land_6_s23 = "Grass Land 6 - Star 23" +grass_land_6_s24 = "Grass Land 6 - Star 24" +grass_land_6_s25 = "Grass Land 6 - Star 25" +grass_land_6_s26 = "Grass Land 6 - Star 26" +grass_land_6_s27 = "Grass Land 6 - Star 27" +grass_land_6_s28 = "Grass Land 6 - Star 28" +grass_land_6_s29 = "Grass Land 6 - Star 29" +ripple_field_1_s1 = "Ripple Field 1 - Star 1" +ripple_field_1_s2 = "Ripple Field 1 - Star 2" +ripple_field_1_s3 = "Ripple Field 1 - Star 3" +ripple_field_1_s4 = "Ripple Field 1 - Star 4" +ripple_field_1_s5 = "Ripple Field 1 - Star 5" +ripple_field_1_s6 = "Ripple Field 1 - Star 6" +ripple_field_1_s7 = "Ripple Field 1 - Star 7" +ripple_field_1_s8 = "Ripple Field 1 - Star 8" +ripple_field_1_s9 = "Ripple Field 1 - Star 9" +ripple_field_1_s10 = "Ripple Field 1 - Star 10" +ripple_field_1_s11 = "Ripple Field 1 - Star 11" +ripple_field_1_s12 = "Ripple Field 1 - Star 12" +ripple_field_1_s13 = "Ripple Field 1 - Star 13" +ripple_field_1_s14 = "Ripple Field 1 - Star 14" +ripple_field_1_s15 = "Ripple Field 1 - Star 15" +ripple_field_1_s16 = "Ripple Field 1 - Star 16" +ripple_field_1_s17 = "Ripple Field 1 - Star 17" +ripple_field_1_s18 = "Ripple Field 1 - Star 18" +ripple_field_1_s19 = "Ripple Field 1 - Star 19" +ripple_field_2_s1 = "Ripple Field 2 - Star 1" +ripple_field_2_s2 = "Ripple Field 2 - Star 2" +ripple_field_2_s3 = "Ripple Field 2 - Star 3" +ripple_field_2_s4 = "Ripple Field 2 - Star 4" +ripple_field_2_s5 = "Ripple Field 2 - Star 5" +ripple_field_2_s6 = "Ripple Field 2 - Star 6" +ripple_field_2_s7 = "Ripple Field 2 - Star 7" +ripple_field_2_s8 = "Ripple Field 2 - Star 8" +ripple_field_2_s9 = "Ripple Field 2 - Star 9" +ripple_field_2_s10 = "Ripple Field 2 - Star 10" +ripple_field_2_s11 = "Ripple Field 2 - Star 11" +ripple_field_2_s12 = "Ripple Field 2 - Star 12" +ripple_field_2_s13 = "Ripple Field 2 - Star 13" +ripple_field_2_s14 = "Ripple Field 2 - Star 14" +ripple_field_2_s15 = "Ripple Field 2 - Star 15" +ripple_field_2_s16 = "Ripple Field 2 - Star 16" +ripple_field_2_s17 = "Ripple Field 2 - Star 17" +ripple_field_3_s1 = "Ripple Field 3 - Star 1" +ripple_field_3_s2 = "Ripple Field 3 - Star 2" +ripple_field_3_s3 = "Ripple Field 3 - Star 3" +ripple_field_3_s4 = "Ripple Field 3 - Star 4" +ripple_field_3_s5 = "Ripple Field 3 - Star 5" +ripple_field_3_s6 = "Ripple Field 3 - Star 6" +ripple_field_3_s7 = "Ripple Field 3 - Star 7" +ripple_field_3_s8 = "Ripple Field 3 - Star 8" +ripple_field_3_s9 = "Ripple Field 3 - Star 9" +ripple_field_3_s10 = "Ripple Field 3 - Star 10" +ripple_field_3_s11 = "Ripple Field 3 - Star 11" +ripple_field_3_s12 = "Ripple Field 3 - Star 12" +ripple_field_3_s13 = "Ripple Field 3 - Star 13" +ripple_field_3_s14 = "Ripple Field 3 - Star 14" +ripple_field_3_s15 = "Ripple Field 3 - Star 15" +ripple_field_3_s16 = "Ripple Field 3 - Star 16" +ripple_field_3_s17 = "Ripple Field 3 - Star 17" +ripple_field_3_s18 = "Ripple Field 3 - Star 18" +ripple_field_3_s19 = "Ripple Field 3 - Star 19" +ripple_field_3_s20 = "Ripple Field 3 - Star 20" +ripple_field_3_s21 = "Ripple Field 3 - Star 21" +ripple_field_4_s1 = "Ripple Field 4 - Star 1" +ripple_field_4_s2 = "Ripple Field 4 - Star 2" +ripple_field_4_s3 = "Ripple Field 4 - Star 3" +ripple_field_4_s4 = "Ripple Field 4 - Star 4" +ripple_field_4_s5 = "Ripple Field 4 - Star 5" +ripple_field_4_s6 = "Ripple Field 4 - Star 6" +ripple_field_4_s7 = "Ripple Field 4 - Star 7" +ripple_field_4_s8 = "Ripple Field 4 - Star 8" +ripple_field_4_s9 = "Ripple Field 4 - Star 9" +ripple_field_4_s10 = "Ripple Field 4 - Star 10" +ripple_field_4_s11 = "Ripple Field 4 - Star 11" +ripple_field_4_s12 = "Ripple Field 4 - Star 12" +ripple_field_4_s13 = "Ripple Field 4 - Star 13" +ripple_field_4_s14 = "Ripple Field 4 - Star 14" +ripple_field_4_s15 = "Ripple Field 4 - Star 15" +ripple_field_4_s16 = "Ripple Field 4 - Star 16" +ripple_field_4_s17 = "Ripple Field 4 - Star 17" +ripple_field_4_s18 = "Ripple Field 4 - Star 18" +ripple_field_4_s19 = "Ripple Field 4 - Star 19" +ripple_field_4_s20 = "Ripple Field 4 - Star 20" +ripple_field_4_s21 = "Ripple Field 4 - Star 21" +ripple_field_4_s22 = "Ripple Field 4 - Star 22" +ripple_field_4_s23 = "Ripple Field 4 - Star 23" +ripple_field_4_s24 = "Ripple Field 4 - Star 24" +ripple_field_4_s25 = "Ripple Field 4 - Star 25" +ripple_field_4_s26 = "Ripple Field 4 - Star 26" +ripple_field_4_s27 = "Ripple Field 4 - Star 27" +ripple_field_4_s28 = "Ripple Field 4 - Star 28" +ripple_field_4_s29 = "Ripple Field 4 - Star 29" +ripple_field_4_s30 = "Ripple Field 4 - Star 30" +ripple_field_4_s31 = "Ripple Field 4 - Star 31" +ripple_field_4_s32 = "Ripple Field 4 - Star 32" +ripple_field_4_s33 = "Ripple Field 4 - Star 33" +ripple_field_4_s34 = "Ripple Field 4 - Star 34" +ripple_field_4_s35 = "Ripple Field 4 - Star 35" +ripple_field_4_s36 = "Ripple Field 4 - Star 36" +ripple_field_4_s37 = "Ripple Field 4 - Star 37" +ripple_field_4_s38 = "Ripple Field 4 - Star 38" +ripple_field_4_s39 = "Ripple Field 4 - Star 39" +ripple_field_4_s40 = "Ripple Field 4 - Star 40" +ripple_field_4_s41 = "Ripple Field 4 - Star 41" +ripple_field_4_s42 = "Ripple Field 4 - Star 42" +ripple_field_4_s43 = "Ripple Field 4 - Star 43" +ripple_field_4_s44 = "Ripple Field 4 - Star 44" +ripple_field_4_s45 = "Ripple Field 4 - Star 45" +ripple_field_4_s46 = "Ripple Field 4 - Star 46" +ripple_field_4_s47 = "Ripple Field 4 - Star 47" +ripple_field_4_s48 = "Ripple Field 4 - Star 48" +ripple_field_4_s49 = "Ripple Field 4 - Star 49" +ripple_field_4_s50 = "Ripple Field 4 - Star 50" +ripple_field_4_s51 = "Ripple Field 4 - Star 51" +ripple_field_5_s1 = "Ripple Field 5 - Star 1" +ripple_field_5_s2 = "Ripple Field 5 - Star 2" +ripple_field_5_s3 = "Ripple Field 5 - Star 3" +ripple_field_5_s4 = "Ripple Field 5 - Star 4" +ripple_field_5_s5 = "Ripple Field 5 - Star 5" +ripple_field_5_s6 = "Ripple Field 5 - Star 6" +ripple_field_5_s7 = "Ripple Field 5 - Star 7" +ripple_field_5_s8 = "Ripple Field 5 - Star 8" +ripple_field_5_s9 = "Ripple Field 5 - Star 9" +ripple_field_5_s10 = "Ripple Field 5 - Star 10" +ripple_field_5_s11 = "Ripple Field 5 - Star 11" +ripple_field_5_s12 = "Ripple Field 5 - Star 12" +ripple_field_5_s13 = "Ripple Field 5 - Star 13" +ripple_field_5_s14 = "Ripple Field 5 - Star 14" +ripple_field_5_s15 = "Ripple Field 5 - Star 15" +ripple_field_5_s16 = "Ripple Field 5 - Star 16" +ripple_field_5_s17 = "Ripple Field 5 - Star 17" +ripple_field_5_s18 = "Ripple Field 5 - Star 18" +ripple_field_5_s19 = "Ripple Field 5 - Star 19" +ripple_field_5_s20 = "Ripple Field 5 - Star 20" +ripple_field_5_s21 = "Ripple Field 5 - Star 21" +ripple_field_5_s22 = "Ripple Field 5 - Star 22" +ripple_field_5_s23 = "Ripple Field 5 - Star 23" +ripple_field_5_s24 = "Ripple Field 5 - Star 24" +ripple_field_5_s25 = "Ripple Field 5 - Star 25" +ripple_field_5_s26 = "Ripple Field 5 - Star 26" +ripple_field_5_s27 = "Ripple Field 5 - Star 27" +ripple_field_5_s28 = "Ripple Field 5 - Star 28" +ripple_field_5_s29 = "Ripple Field 5 - Star 29" +ripple_field_5_s30 = "Ripple Field 5 - Star 30" +ripple_field_5_s31 = "Ripple Field 5 - Star 31" +ripple_field_5_s32 = "Ripple Field 5 - Star 32" +ripple_field_5_s33 = "Ripple Field 5 - Star 33" +ripple_field_5_s34 = "Ripple Field 5 - Star 34" +ripple_field_5_s35 = "Ripple Field 5 - Star 35" +ripple_field_5_s36 = "Ripple Field 5 - Star 36" +ripple_field_5_s37 = "Ripple Field 5 - Star 37" +ripple_field_5_s38 = "Ripple Field 5 - Star 38" +ripple_field_5_s39 = "Ripple Field 5 - Star 39" +ripple_field_5_s40 = "Ripple Field 5 - Star 40" +ripple_field_5_s41 = "Ripple Field 5 - Star 41" +ripple_field_5_s42 = "Ripple Field 5 - Star 42" +ripple_field_5_s43 = "Ripple Field 5 - Star 43" +ripple_field_5_s44 = "Ripple Field 5 - Star 44" +ripple_field_5_s45 = "Ripple Field 5 - Star 45" +ripple_field_5_s46 = "Ripple Field 5 - Star 46" +ripple_field_5_s47 = "Ripple Field 5 - Star 47" +ripple_field_5_s48 = "Ripple Field 5 - Star 48" +ripple_field_5_s49 = "Ripple Field 5 - Star 49" +ripple_field_5_s50 = "Ripple Field 5 - Star 50" +ripple_field_5_s51 = "Ripple Field 5 - Star 51" +ripple_field_6_s1 = "Ripple Field 6 - Star 1" +ripple_field_6_s2 = "Ripple Field 6 - Star 2" +ripple_field_6_s3 = "Ripple Field 6 - Star 3" +ripple_field_6_s4 = "Ripple Field 6 - Star 4" +ripple_field_6_s5 = "Ripple Field 6 - Star 5" +ripple_field_6_s6 = "Ripple Field 6 - Star 6" +ripple_field_6_s7 = "Ripple Field 6 - Star 7" +ripple_field_6_s8 = "Ripple Field 6 - Star 8" +ripple_field_6_s9 = "Ripple Field 6 - Star 9" +ripple_field_6_s10 = "Ripple Field 6 - Star 10" +ripple_field_6_s11 = "Ripple Field 6 - Star 11" +ripple_field_6_s12 = "Ripple Field 6 - Star 12" +ripple_field_6_s13 = "Ripple Field 6 - Star 13" +ripple_field_6_s14 = "Ripple Field 6 - Star 14" +ripple_field_6_s15 = "Ripple Field 6 - Star 15" +ripple_field_6_s16 = "Ripple Field 6 - Star 16" +ripple_field_6_s17 = "Ripple Field 6 - Star 17" +ripple_field_6_s18 = "Ripple Field 6 - Star 18" +ripple_field_6_s19 = "Ripple Field 6 - Star 19" +ripple_field_6_s20 = "Ripple Field 6 - Star 20" +ripple_field_6_s21 = "Ripple Field 6 - Star 21" +ripple_field_6_s22 = "Ripple Field 6 - Star 22" +ripple_field_6_s23 = "Ripple Field 6 - Star 23" +sand_canyon_1_s1 = "Sand Canyon 1 - Star 1" +sand_canyon_1_s2 = "Sand Canyon 1 - Star 2" +sand_canyon_1_s3 = "Sand Canyon 1 - Star 3" +sand_canyon_1_s4 = "Sand Canyon 1 - Star 4" +sand_canyon_1_s5 = "Sand Canyon 1 - Star 5" +sand_canyon_1_s6 = "Sand Canyon 1 - Star 6" +sand_canyon_1_s7 = "Sand Canyon 1 - Star 7" +sand_canyon_1_s8 = "Sand Canyon 1 - Star 8" +sand_canyon_1_s9 = "Sand Canyon 1 - Star 9" +sand_canyon_1_s10 = "Sand Canyon 1 - Star 10" +sand_canyon_1_s11 = "Sand Canyon 1 - Star 11" +sand_canyon_1_s12 = "Sand Canyon 1 - Star 12" +sand_canyon_1_s13 = "Sand Canyon 1 - Star 13" +sand_canyon_1_s14 = "Sand Canyon 1 - Star 14" +sand_canyon_1_s15 = "Sand Canyon 1 - Star 15" +sand_canyon_1_s16 = "Sand Canyon 1 - Star 16" +sand_canyon_1_s17 = "Sand Canyon 1 - Star 17" +sand_canyon_1_s18 = "Sand Canyon 1 - Star 18" +sand_canyon_1_s19 = "Sand Canyon 1 - Star 19" +sand_canyon_1_s20 = "Sand Canyon 1 - Star 20" +sand_canyon_1_s21 = "Sand Canyon 1 - Star 21" +sand_canyon_1_s22 = "Sand Canyon 1 - Star 22" +sand_canyon_2_s1 = "Sand Canyon 2 - Star 1" +sand_canyon_2_s2 = "Sand Canyon 2 - Star 2" +sand_canyon_2_s3 = "Sand Canyon 2 - Star 3" +sand_canyon_2_s4 = "Sand Canyon 2 - Star 4" +sand_canyon_2_s5 = "Sand Canyon 2 - Star 5" +sand_canyon_2_s6 = "Sand Canyon 2 - Star 6" +sand_canyon_2_s7 = "Sand Canyon 2 - Star 7" +sand_canyon_2_s8 = "Sand Canyon 2 - Star 8" +sand_canyon_2_s9 = "Sand Canyon 2 - Star 9" +sand_canyon_2_s10 = "Sand Canyon 2 - Star 10" +sand_canyon_2_s11 = "Sand Canyon 2 - Star 11" +sand_canyon_2_s12 = "Sand Canyon 2 - Star 12" +sand_canyon_2_s13 = "Sand Canyon 2 - Star 13" +sand_canyon_2_s14 = "Sand Canyon 2 - Star 14" +sand_canyon_2_s15 = "Sand Canyon 2 - Star 15" +sand_canyon_2_s16 = "Sand Canyon 2 - Star 16" +sand_canyon_2_s17 = "Sand Canyon 2 - Star 17" +sand_canyon_2_s18 = "Sand Canyon 2 - Star 18" +sand_canyon_2_s19 = "Sand Canyon 2 - Star 19" +sand_canyon_2_s20 = "Sand Canyon 2 - Star 20" +sand_canyon_2_s21 = "Sand Canyon 2 - Star 21" +sand_canyon_2_s22 = "Sand Canyon 2 - Star 22" +sand_canyon_2_s23 = "Sand Canyon 2 - Star 23" +sand_canyon_2_s24 = "Sand Canyon 2 - Star 24" +sand_canyon_2_s25 = "Sand Canyon 2 - Star 25" +sand_canyon_2_s26 = "Sand Canyon 2 - Star 26" +sand_canyon_2_s27 = "Sand Canyon 2 - Star 27" +sand_canyon_2_s28 = "Sand Canyon 2 - Star 28" +sand_canyon_2_s29 = "Sand Canyon 2 - Star 29" +sand_canyon_2_s30 = "Sand Canyon 2 - Star 30" +sand_canyon_2_s31 = "Sand Canyon 2 - Star 31" +sand_canyon_2_s32 = "Sand Canyon 2 - Star 32" +sand_canyon_2_s33 = "Sand Canyon 2 - Star 33" +sand_canyon_2_s34 = "Sand Canyon 2 - Star 34" +sand_canyon_2_s35 = "Sand Canyon 2 - Star 35" +sand_canyon_2_s36 = "Sand Canyon 2 - Star 36" +sand_canyon_2_s37 = "Sand Canyon 2 - Star 37" +sand_canyon_2_s38 = "Sand Canyon 2 - Star 38" +sand_canyon_2_s39 = "Sand Canyon 2 - Star 39" +sand_canyon_2_s40 = "Sand Canyon 2 - Star 40" +sand_canyon_2_s41 = "Sand Canyon 2 - Star 41" +sand_canyon_2_s42 = "Sand Canyon 2 - Star 42" +sand_canyon_2_s43 = "Sand Canyon 2 - Star 43" +sand_canyon_2_s44 = "Sand Canyon 2 - Star 44" +sand_canyon_2_s45 = "Sand Canyon 2 - Star 45" +sand_canyon_2_s46 = "Sand Canyon 2 - Star 46" +sand_canyon_2_s47 = "Sand Canyon 2 - Star 47" +sand_canyon_2_s48 = "Sand Canyon 2 - Star 48" +sand_canyon_3_s1 = "Sand Canyon 3 - Star 1" +sand_canyon_3_s2 = "Sand Canyon 3 - Star 2" +sand_canyon_3_s3 = "Sand Canyon 3 - Star 3" +sand_canyon_3_s4 = "Sand Canyon 3 - Star 4" +sand_canyon_3_s5 = "Sand Canyon 3 - Star 5" +sand_canyon_3_s6 = "Sand Canyon 3 - Star 6" +sand_canyon_3_s7 = "Sand Canyon 3 - Star 7" +sand_canyon_3_s8 = "Sand Canyon 3 - Star 8" +sand_canyon_3_s9 = "Sand Canyon 3 - Star 9" +sand_canyon_3_s10 = "Sand Canyon 3 - Star 10" +sand_canyon_4_s1 = "Sand Canyon 4 - Star 1" +sand_canyon_4_s2 = "Sand Canyon 4 - Star 2" +sand_canyon_4_s3 = "Sand Canyon 4 - Star 3" +sand_canyon_4_s4 = "Sand Canyon 4 - Star 4" +sand_canyon_4_s5 = "Sand Canyon 4 - Star 5" +sand_canyon_4_s6 = "Sand Canyon 4 - Star 6" +sand_canyon_4_s7 = "Sand Canyon 4 - Star 7" +sand_canyon_4_s8 = "Sand Canyon 4 - Star 8" +sand_canyon_4_s9 = "Sand Canyon 4 - Star 9" +sand_canyon_4_s10 = "Sand Canyon 4 - Star 10" +sand_canyon_4_s11 = "Sand Canyon 4 - Star 11" +sand_canyon_4_s12 = "Sand Canyon 4 - Star 12" +sand_canyon_4_s13 = "Sand Canyon 4 - Star 13" +sand_canyon_4_s14 = "Sand Canyon 4 - Star 14" +sand_canyon_4_s15 = "Sand Canyon 4 - Star 15" +sand_canyon_4_s16 = "Sand Canyon 4 - Star 16" +sand_canyon_4_s17 = "Sand Canyon 4 - Star 17" +sand_canyon_4_s18 = "Sand Canyon 4 - Star 18" +sand_canyon_4_s19 = "Sand Canyon 4 - Star 19" +sand_canyon_4_s20 = "Sand Canyon 4 - Star 20" +sand_canyon_4_s21 = "Sand Canyon 4 - Star 21" +sand_canyon_4_s22 = "Sand Canyon 4 - Star 22" +sand_canyon_4_s23 = "Sand Canyon 4 - Star 23" +sand_canyon_5_s1 = "Sand Canyon 5 - Star 1" +sand_canyon_5_s2 = "Sand Canyon 5 - Star 2" +sand_canyon_5_s3 = "Sand Canyon 5 - Star 3" +sand_canyon_5_s4 = "Sand Canyon 5 - Star 4" +sand_canyon_5_s5 = "Sand Canyon 5 - Star 5" +sand_canyon_5_s6 = "Sand Canyon 5 - Star 6" +sand_canyon_5_s7 = "Sand Canyon 5 - Star 7" +sand_canyon_5_s8 = "Sand Canyon 5 - Star 8" +sand_canyon_5_s9 = "Sand Canyon 5 - Star 9" +sand_canyon_5_s10 = "Sand Canyon 5 - Star 10" +sand_canyon_5_s11 = "Sand Canyon 5 - Star 11" +sand_canyon_5_s12 = "Sand Canyon 5 - Star 12" +sand_canyon_5_s13 = "Sand Canyon 5 - Star 13" +sand_canyon_5_s14 = "Sand Canyon 5 - Star 14" +sand_canyon_5_s15 = "Sand Canyon 5 - Star 15" +sand_canyon_5_s16 = "Sand Canyon 5 - Star 16" +sand_canyon_5_s17 = "Sand Canyon 5 - Star 17" +sand_canyon_5_s18 = "Sand Canyon 5 - Star 18" +sand_canyon_5_s19 = "Sand Canyon 5 - Star 19" +sand_canyon_5_s20 = "Sand Canyon 5 - Star 20" +sand_canyon_5_s21 = "Sand Canyon 5 - Star 21" +sand_canyon_5_s22 = "Sand Canyon 5 - Star 22" +sand_canyon_5_s23 = "Sand Canyon 5 - Star 23" +sand_canyon_5_s24 = "Sand Canyon 5 - Star 24" +sand_canyon_5_s25 = "Sand Canyon 5 - Star 25" +sand_canyon_5_s26 = "Sand Canyon 5 - Star 26" +sand_canyon_5_s27 = "Sand Canyon 5 - Star 27" +sand_canyon_5_s28 = "Sand Canyon 5 - Star 28" +sand_canyon_5_s29 = "Sand Canyon 5 - Star 29" +sand_canyon_5_s30 = "Sand Canyon 5 - Star 30" +sand_canyon_5_s31 = "Sand Canyon 5 - Star 31" +sand_canyon_5_s32 = "Sand Canyon 5 - Star 32" +sand_canyon_5_s33 = "Sand Canyon 5 - Star 33" +sand_canyon_5_s34 = "Sand Canyon 5 - Star 34" +sand_canyon_5_s35 = "Sand Canyon 5 - Star 35" +sand_canyon_5_s36 = "Sand Canyon 5 - Star 36" +sand_canyon_5_s37 = "Sand Canyon 5 - Star 37" +sand_canyon_5_s38 = "Sand Canyon 5 - Star 38" +sand_canyon_5_s39 = "Sand Canyon 5 - Star 39" +sand_canyon_5_s40 = "Sand Canyon 5 - Star 40" +cloudy_park_1_s1 = "Cloudy Park 1 - Star 1" +cloudy_park_1_s2 = "Cloudy Park 1 - Star 2" +cloudy_park_1_s3 = "Cloudy Park 1 - Star 3" +cloudy_park_1_s4 = "Cloudy Park 1 - Star 4" +cloudy_park_1_s5 = "Cloudy Park 1 - Star 5" +cloudy_park_1_s6 = "Cloudy Park 1 - Star 6" +cloudy_park_1_s7 = "Cloudy Park 1 - Star 7" +cloudy_park_1_s8 = "Cloudy Park 1 - Star 8" +cloudy_park_1_s9 = "Cloudy Park 1 - Star 9" +cloudy_park_1_s10 = "Cloudy Park 1 - Star 10" +cloudy_park_1_s11 = "Cloudy Park 1 - Star 11" +cloudy_park_1_s12 = "Cloudy Park 1 - Star 12" +cloudy_park_1_s13 = "Cloudy Park 1 - Star 13" +cloudy_park_1_s14 = "Cloudy Park 1 - Star 14" +cloudy_park_1_s15 = "Cloudy Park 1 - Star 15" +cloudy_park_1_s16 = "Cloudy Park 1 - Star 16" +cloudy_park_1_s17 = "Cloudy Park 1 - Star 17" +cloudy_park_1_s18 = "Cloudy Park 1 - Star 18" +cloudy_park_1_s19 = "Cloudy Park 1 - Star 19" +cloudy_park_1_s20 = "Cloudy Park 1 - Star 20" +cloudy_park_1_s21 = "Cloudy Park 1 - Star 21" +cloudy_park_1_s22 = "Cloudy Park 1 - Star 22" +cloudy_park_1_s23 = "Cloudy Park 1 - Star 23" +cloudy_park_2_s1 = "Cloudy Park 2 - Star 1" +cloudy_park_2_s2 = "Cloudy Park 2 - Star 2" +cloudy_park_2_s3 = "Cloudy Park 2 - Star 3" +cloudy_park_2_s4 = "Cloudy Park 2 - Star 4" +cloudy_park_2_s5 = "Cloudy Park 2 - Star 5" +cloudy_park_2_s6 = "Cloudy Park 2 - Star 6" +cloudy_park_2_s7 = "Cloudy Park 2 - Star 7" +cloudy_park_2_s8 = "Cloudy Park 2 - Star 8" +cloudy_park_2_s9 = "Cloudy Park 2 - Star 9" +cloudy_park_2_s10 = "Cloudy Park 2 - Star 10" +cloudy_park_2_s11 = "Cloudy Park 2 - Star 11" +cloudy_park_2_s12 = "Cloudy Park 2 - Star 12" +cloudy_park_2_s13 = "Cloudy Park 2 - Star 13" +cloudy_park_2_s14 = "Cloudy Park 2 - Star 14" +cloudy_park_2_s15 = "Cloudy Park 2 - Star 15" +cloudy_park_2_s16 = "Cloudy Park 2 - Star 16" +cloudy_park_2_s17 = "Cloudy Park 2 - Star 17" +cloudy_park_2_s18 = "Cloudy Park 2 - Star 18" +cloudy_park_2_s19 = "Cloudy Park 2 - Star 19" +cloudy_park_2_s20 = "Cloudy Park 2 - Star 20" +cloudy_park_2_s21 = "Cloudy Park 2 - Star 21" +cloudy_park_2_s22 = "Cloudy Park 2 - Star 22" +cloudy_park_2_s23 = "Cloudy Park 2 - Star 23" +cloudy_park_2_s24 = "Cloudy Park 2 - Star 24" +cloudy_park_2_s25 = "Cloudy Park 2 - Star 25" +cloudy_park_2_s26 = "Cloudy Park 2 - Star 26" +cloudy_park_2_s27 = "Cloudy Park 2 - Star 27" +cloudy_park_2_s28 = "Cloudy Park 2 - Star 28" +cloudy_park_2_s29 = "Cloudy Park 2 - Star 29" +cloudy_park_2_s30 = "Cloudy Park 2 - Star 30" +cloudy_park_2_s31 = "Cloudy Park 2 - Star 31" +cloudy_park_2_s32 = "Cloudy Park 2 - Star 32" +cloudy_park_2_s33 = "Cloudy Park 2 - Star 33" +cloudy_park_2_s34 = "Cloudy Park 2 - Star 34" +cloudy_park_2_s35 = "Cloudy Park 2 - Star 35" +cloudy_park_2_s36 = "Cloudy Park 2 - Star 36" +cloudy_park_2_s37 = "Cloudy Park 2 - Star 37" +cloudy_park_2_s38 = "Cloudy Park 2 - Star 38" +cloudy_park_2_s39 = "Cloudy Park 2 - Star 39" +cloudy_park_2_s40 = "Cloudy Park 2 - Star 40" +cloudy_park_2_s41 = "Cloudy Park 2 - Star 41" +cloudy_park_2_s42 = "Cloudy Park 2 - Star 42" +cloudy_park_2_s43 = "Cloudy Park 2 - Star 43" +cloudy_park_2_s44 = "Cloudy Park 2 - Star 44" +cloudy_park_2_s45 = "Cloudy Park 2 - Star 45" +cloudy_park_2_s46 = "Cloudy Park 2 - Star 46" +cloudy_park_2_s47 = "Cloudy Park 2 - Star 47" +cloudy_park_2_s48 = "Cloudy Park 2 - Star 48" +cloudy_park_2_s49 = "Cloudy Park 2 - Star 49" +cloudy_park_2_s50 = "Cloudy Park 2 - Star 50" +cloudy_park_2_s51 = "Cloudy Park 2 - Star 51" +cloudy_park_2_s52 = "Cloudy Park 2 - Star 52" +cloudy_park_2_s53 = "Cloudy Park 2 - Star 53" +cloudy_park_2_s54 = "Cloudy Park 2 - Star 54" +cloudy_park_3_s1 = "Cloudy Park 3 - Star 1" +cloudy_park_3_s2 = "Cloudy Park 3 - Star 2" +cloudy_park_3_s3 = "Cloudy Park 3 - Star 3" +cloudy_park_3_s4 = "Cloudy Park 3 - Star 4" +cloudy_park_3_s5 = "Cloudy Park 3 - Star 5" +cloudy_park_3_s6 = "Cloudy Park 3 - Star 6" +cloudy_park_3_s7 = "Cloudy Park 3 - Star 7" +cloudy_park_3_s8 = "Cloudy Park 3 - Star 8" +cloudy_park_3_s9 = "Cloudy Park 3 - Star 9" +cloudy_park_3_s10 = "Cloudy Park 3 - Star 10" +cloudy_park_3_s11 = "Cloudy Park 3 - Star 11" +cloudy_park_3_s12 = "Cloudy Park 3 - Star 12" +cloudy_park_3_s13 = "Cloudy Park 3 - Star 13" +cloudy_park_3_s14 = "Cloudy Park 3 - Star 14" +cloudy_park_3_s15 = "Cloudy Park 3 - Star 15" +cloudy_park_3_s16 = "Cloudy Park 3 - Star 16" +cloudy_park_3_s17 = "Cloudy Park 3 - Star 17" +cloudy_park_3_s18 = "Cloudy Park 3 - Star 18" +cloudy_park_3_s19 = "Cloudy Park 3 - Star 19" +cloudy_park_3_s20 = "Cloudy Park 3 - Star 20" +cloudy_park_3_s21 = "Cloudy Park 3 - Star 21" +cloudy_park_3_s22 = "Cloudy Park 3 - Star 22" +cloudy_park_4_s1 = "Cloudy Park 4 - Star 1" +cloudy_park_4_s2 = "Cloudy Park 4 - Star 2" +cloudy_park_4_s3 = "Cloudy Park 4 - Star 3" +cloudy_park_4_s4 = "Cloudy Park 4 - Star 4" +cloudy_park_4_s5 = "Cloudy Park 4 - Star 5" +cloudy_park_4_s6 = "Cloudy Park 4 - Star 6" +cloudy_park_4_s7 = "Cloudy Park 4 - Star 7" +cloudy_park_4_s8 = "Cloudy Park 4 - Star 8" +cloudy_park_4_s9 = "Cloudy Park 4 - Star 9" +cloudy_park_4_s10 = "Cloudy Park 4 - Star 10" +cloudy_park_4_s11 = "Cloudy Park 4 - Star 11" +cloudy_park_4_s12 = "Cloudy Park 4 - Star 12" +cloudy_park_4_s13 = "Cloudy Park 4 - Star 13" +cloudy_park_4_s14 = "Cloudy Park 4 - Star 14" +cloudy_park_4_s15 = "Cloudy Park 4 - Star 15" +cloudy_park_4_s16 = "Cloudy Park 4 - Star 16" +cloudy_park_4_s17 = "Cloudy Park 4 - Star 17" +cloudy_park_4_s18 = "Cloudy Park 4 - Star 18" +cloudy_park_4_s19 = "Cloudy Park 4 - Star 19" +cloudy_park_4_s20 = "Cloudy Park 4 - Star 20" +cloudy_park_4_s21 = "Cloudy Park 4 - Star 21" +cloudy_park_4_s22 = "Cloudy Park 4 - Star 22" +cloudy_park_4_s23 = "Cloudy Park 4 - Star 23" +cloudy_park_4_s24 = "Cloudy Park 4 - Star 24" +cloudy_park_4_s25 = "Cloudy Park 4 - Star 25" +cloudy_park_4_s26 = "Cloudy Park 4 - Star 26" +cloudy_park_4_s27 = "Cloudy Park 4 - Star 27" +cloudy_park_4_s28 = "Cloudy Park 4 - Star 28" +cloudy_park_4_s29 = "Cloudy Park 4 - Star 29" +cloudy_park_4_s30 = "Cloudy Park 4 - Star 30" +cloudy_park_4_s31 = "Cloudy Park 4 - Star 31" +cloudy_park_4_s32 = "Cloudy Park 4 - Star 32" +cloudy_park_4_s33 = "Cloudy Park 4 - Star 33" +cloudy_park_4_s34 = "Cloudy Park 4 - Star 34" +cloudy_park_4_s35 = "Cloudy Park 4 - Star 35" +cloudy_park_4_s36 = "Cloudy Park 4 - Star 36" +cloudy_park_4_s37 = "Cloudy Park 4 - Star 37" +cloudy_park_4_s38 = "Cloudy Park 4 - Star 38" +cloudy_park_4_s39 = "Cloudy Park 4 - Star 39" +cloudy_park_4_s40 = "Cloudy Park 4 - Star 40" +cloudy_park_4_s41 = "Cloudy Park 4 - Star 41" +cloudy_park_4_s42 = "Cloudy Park 4 - Star 42" +cloudy_park_4_s43 = "Cloudy Park 4 - Star 43" +cloudy_park_4_s44 = "Cloudy Park 4 - Star 44" +cloudy_park_4_s45 = "Cloudy Park 4 - Star 45" +cloudy_park_4_s46 = "Cloudy Park 4 - Star 46" +cloudy_park_4_s47 = "Cloudy Park 4 - Star 47" +cloudy_park_4_s48 = "Cloudy Park 4 - Star 48" +cloudy_park_4_s49 = "Cloudy Park 4 - Star 49" +cloudy_park_4_s50 = "Cloudy Park 4 - Star 50" +cloudy_park_5_s1 = "Cloudy Park 5 - Star 1" +cloudy_park_5_s2 = "Cloudy Park 5 - Star 2" +cloudy_park_5_s3 = "Cloudy Park 5 - Star 3" +cloudy_park_5_s4 = "Cloudy Park 5 - Star 4" +cloudy_park_5_s5 = "Cloudy Park 5 - Star 5" +cloudy_park_5_s6 = "Cloudy Park 5 - Star 6" +cloudy_park_6_s1 = "Cloudy Park 6 - Star 1" +cloudy_park_6_s2 = "Cloudy Park 6 - Star 2" +cloudy_park_6_s3 = "Cloudy Park 6 - Star 3" +cloudy_park_6_s4 = "Cloudy Park 6 - Star 4" +cloudy_park_6_s5 = "Cloudy Park 6 - Star 5" +cloudy_park_6_s6 = "Cloudy Park 6 - Star 6" +cloudy_park_6_s7 = "Cloudy Park 6 - Star 7" +cloudy_park_6_s8 = "Cloudy Park 6 - Star 8" +cloudy_park_6_s9 = "Cloudy Park 6 - Star 9" +cloudy_park_6_s10 = "Cloudy Park 6 - Star 10" +cloudy_park_6_s11 = "Cloudy Park 6 - Star 11" +cloudy_park_6_s12 = "Cloudy Park 6 - Star 12" +cloudy_park_6_s13 = "Cloudy Park 6 - Star 13" +cloudy_park_6_s14 = "Cloudy Park 6 - Star 14" +cloudy_park_6_s15 = "Cloudy Park 6 - Star 15" +cloudy_park_6_s16 = "Cloudy Park 6 - Star 16" +cloudy_park_6_s17 = "Cloudy Park 6 - Star 17" +cloudy_park_6_s18 = "Cloudy Park 6 - Star 18" +cloudy_park_6_s19 = "Cloudy Park 6 - Star 19" +cloudy_park_6_s20 = "Cloudy Park 6 - Star 20" +cloudy_park_6_s21 = "Cloudy Park 6 - Star 21" +cloudy_park_6_s22 = "Cloudy Park 6 - Star 22" +cloudy_park_6_s23 = "Cloudy Park 6 - Star 23" +cloudy_park_6_s24 = "Cloudy Park 6 - Star 24" +cloudy_park_6_s25 = "Cloudy Park 6 - Star 25" +cloudy_park_6_s26 = "Cloudy Park 6 - Star 26" +cloudy_park_6_s27 = "Cloudy Park 6 - Star 27" +cloudy_park_6_s28 = "Cloudy Park 6 - Star 28" +cloudy_park_6_s29 = "Cloudy Park 6 - Star 29" +cloudy_park_6_s30 = "Cloudy Park 6 - Star 30" +cloudy_park_6_s31 = "Cloudy Park 6 - Star 31" +cloudy_park_6_s32 = "Cloudy Park 6 - Star 32" +cloudy_park_6_s33 = "Cloudy Park 6 - Star 33" +iceberg_1_s1 = "Iceberg 1 - Star 1" +iceberg_1_s2 = "Iceberg 1 - Star 2" +iceberg_1_s3 = "Iceberg 1 - Star 3" +iceberg_1_s4 = "Iceberg 1 - Star 4" +iceberg_1_s5 = "Iceberg 1 - Star 5" +iceberg_1_s6 = "Iceberg 1 - Star 6" +iceberg_2_s1 = "Iceberg 2 - Star 1" +iceberg_2_s2 = "Iceberg 2 - Star 2" +iceberg_2_s3 = "Iceberg 2 - Star 3" +iceberg_2_s4 = "Iceberg 2 - Star 4" +iceberg_2_s5 = "Iceberg 2 - Star 5" +iceberg_2_s6 = "Iceberg 2 - Star 6" +iceberg_2_s7 = "Iceberg 2 - Star 7" +iceberg_2_s8 = "Iceberg 2 - Star 8" +iceberg_2_s9 = "Iceberg 2 - Star 9" +iceberg_2_s10 = "Iceberg 2 - Star 10" +iceberg_2_s11 = "Iceberg 2 - Star 11" +iceberg_2_s12 = "Iceberg 2 - Star 12" +iceberg_2_s13 = "Iceberg 2 - Star 13" +iceberg_2_s14 = "Iceberg 2 - Star 14" +iceberg_2_s15 = "Iceberg 2 - Star 15" +iceberg_2_s16 = "Iceberg 2 - Star 16" +iceberg_2_s17 = "Iceberg 2 - Star 17" +iceberg_2_s18 = "Iceberg 2 - Star 18" +iceberg_2_s19 = "Iceberg 2 - Star 19" +iceberg_3_s1 = "Iceberg 3 - Star 1" +iceberg_3_s2 = "Iceberg 3 - Star 2" +iceberg_3_s3 = "Iceberg 3 - Star 3" +iceberg_3_s4 = "Iceberg 3 - Star 4" +iceberg_3_s5 = "Iceberg 3 - Star 5" +iceberg_3_s6 = "Iceberg 3 - Star 6" +iceberg_3_s7 = "Iceberg 3 - Star 7" +iceberg_3_s8 = "Iceberg 3 - Star 8" +iceberg_3_s9 = "Iceberg 3 - Star 9" +iceberg_3_s10 = "Iceberg 3 - Star 10" +iceberg_3_s11 = "Iceberg 3 - Star 11" +iceberg_3_s12 = "Iceberg 3 - Star 12" +iceberg_3_s13 = "Iceberg 3 - Star 13" +iceberg_3_s14 = "Iceberg 3 - Star 14" +iceberg_3_s15 = "Iceberg 3 - Star 15" +iceberg_3_s16 = "Iceberg 3 - Star 16" +iceberg_3_s17 = "Iceberg 3 - Star 17" +iceberg_3_s18 = "Iceberg 3 - Star 18" +iceberg_3_s19 = "Iceberg 3 - Star 19" +iceberg_3_s20 = "Iceberg 3 - Star 20" +iceberg_3_s21 = "Iceberg 3 - Star 21" +iceberg_4_s1 = "Iceberg 4 - Star 1" +iceberg_4_s2 = "Iceberg 4 - Star 2" +iceberg_4_s3 = "Iceberg 4 - Star 3" +iceberg_5_s1 = "Iceberg 5 - Star 1" +iceberg_5_s2 = "Iceberg 5 - Star 2" +iceberg_5_s3 = "Iceberg 5 - Star 3" +iceberg_5_s4 = "Iceberg 5 - Star 4" +iceberg_5_s5 = "Iceberg 5 - Star 5" +iceberg_5_s6 = "Iceberg 5 - Star 6" +iceberg_5_s7 = "Iceberg 5 - Star 7" +iceberg_5_s8 = "Iceberg 5 - Star 8" +iceberg_5_s9 = "Iceberg 5 - Star 9" +iceberg_5_s10 = "Iceberg 5 - Star 10" +iceberg_5_s11 = "Iceberg 5 - Star 11" +iceberg_5_s12 = "Iceberg 5 - Star 12" +iceberg_5_s13 = "Iceberg 5 - Star 13" +iceberg_5_s14 = "Iceberg 5 - Star 14" +iceberg_5_s15 = "Iceberg 5 - Star 15" +iceberg_5_s16 = "Iceberg 5 - Star 16" +iceberg_5_s17 = "Iceberg 5 - Star 17" +iceberg_5_s18 = "Iceberg 5 - Star 18" +iceberg_5_s19 = "Iceberg 5 - Star 19" +iceberg_5_s20 = "Iceberg 5 - Star 20" +iceberg_5_s21 = "Iceberg 5 - Star 21" +iceberg_5_s22 = "Iceberg 5 - Star 22" +iceberg_5_s23 = "Iceberg 5 - Star 23" +iceberg_5_s24 = "Iceberg 5 - Star 24" +iceberg_5_s25 = "Iceberg 5 - Star 25" +iceberg_5_s26 = "Iceberg 5 - Star 26" +iceberg_5_s27 = "Iceberg 5 - Star 27" +iceberg_5_s28 = "Iceberg 5 - Star 28" +iceberg_5_s29 = "Iceberg 5 - Star 29" +iceberg_5_s30 = "Iceberg 5 - Star 30" +iceberg_5_s31 = "Iceberg 5 - Star 31" +iceberg_5_s32 = "Iceberg 5 - Star 32" +iceberg_5_s33 = "Iceberg 5 - Star 33" +iceberg_5_s34 = "Iceberg 5 - Star 34" +iceberg_6_s1 = "Iceberg 6 - Star 1" diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index b7424aa51b26..30b5c410dda4 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -250,6 +250,14 @@ class ConsumableChecks(Toggle): display_name = "Consumable-sanity" +class StarChecks(Toggle): + """ + When enabled, every star in a given stage will become a check. + Will increase the possible filler pool to include 1/3/5 stars. + """ + display_name = "Starsanity" + + class KirbyFlavorPreset(Choice): """ The color of Kirby, from a list of presets. @@ -407,6 +415,7 @@ class KDL3Options(PerGameCommonOptions): ow_boss_requirement: OpenWorldBossRequirement boss_requirement_random: BossRequirementRandom consumables: ConsumableChecks + starsanity: StarChecks kirby_flavor_preset: KirbyFlavorPreset kirby_flavor: KirbyFlavor gooey_flavor_preset: GooeyFlavorPreset diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index 0d6f389c80b7..ea46b06c4908 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -47,8 +47,9 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing room_entry["entity_load"], room_entry["consumables"], room_entry["consumables_pointer"]) room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else None for location in room_entry["locations"] - if not any([x in location for x in ["1-Up", "Maxim"]]) or - world.options.consumables}, KDL3Location) + if (not any([x in location for x in ["1-Up", "Maxim"]]) or + world.options.consumables.value) and (not "Star" in location or world.options.starsanity.value)}, + KDL3Location) rooms[room.name] = room for location in room.locations: if "Animal" in location.name: diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 29ec999d1d09..c44063e412f6 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -1202,6 +1202,61 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD 0x6B, # RTL ]) + if world.options.starsanity: + rom.write_bytes(0x3A600, [0x48, # PHA + 0xDA, # PHX + 0x5A, # PHY + 0x29, 0xFF, 0x00, # AND #$00FF + 0x48, # PHA + 0xAE, 0xCF, 0x53, # LDX $53CF + 0xAC, 0xD3, 0x53, # LDY $53D3 + 0xA9, 0x00, 0x00, # LDA #$0000 + 0x88, # DEY + 0xE0, 0x00, 0x00, # CPX #$0000 + 0xF0, 0x07, # BEQ $07A61D + 0x18, # CLC + 0x69, 0x07, 0x00, # ADC #$0007 + 0xCA, # DEX + 0x80, 0xF4, # BRA $07A611 + 0xC0, 0x00, 0x00, # CPY #$0000 + 0xF0, 0x04, # BEQ $07A626 + 0x1A, # INC + 0x88, # DEY + 0x80, 0xF7, # BRA $07A61D + 0x0A, # ASL + 0xAA, # TAX + 0xBF, 0x20, 0xD0, 0x07, # LDA $07D020, X + 0x3A, # DEC + 0x0A, # ASL + 0x0A, # ASL + 0x0A, # ASL + 0x0A, # ASL + 0x0A, # ASL + 0x0A, # ASL + 0xAA, # TAX + 0x68, # PLA + 0xC9, 0x00, 0x00, # CMP #$0000 + 0xF0, 0x04, # BEQ $07A63E + 0xE8, # INX + 0x3A, # DEC + 0x80, 0xF7, # BRA $07A635 + 0xBD, 0x00, 0xB0, # LDA $B000, X + 0x09, 0x01, 0x00, # ORA #$0001 + 0x9D, 0x00, 0xB0, # STA $B000, X + 0x7A, # PLY + 0xFA, # PLX + 0x68, # PLA + 0xEB, # XBA + 0x29, 0xFF, 0x00, # AND #$00FF + 0x6B, # RET + ]) + + rom.write_bytes(0xA23EB, [ + 0xB9, 0xA2, 0x07, # LDA $07A2, Y + 0x22, 0x00, 0xA6, 0x07, # JSL $07A600 + 0xEA, 0xEA, 0xEA, # NOP, NOP, NOP + ]) + rooms = world.rooms if world.options.music_shuffle > 0: if world.options.music_shuffle == 1: @@ -1267,6 +1322,7 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD rom.write_byte(0x3D014, world.options.stage_shuffle.value) rom.write_byte(0x3D016, world.options.ow_boss_requirement.value) rom.write_byte(0x3D018, world.options.consumables.value) + rom.write_byte(0x3D01A, world.options.starsanity.value) for level in shuffled_levels: for i in range(len(shuffled_levels[level])): diff --git a/worlds/kdl3/data/Rooms.json b/worlds/kdl3/data/Rooms.json index f6e3cb2fc9bb..d5944fee2c91 100644 --- a/worlds/kdl3/data/Rooms.json +++ b/worlds/kdl3/data/Rooms.json @@ -1 +1,18202 @@ -[{"name": "Grass Land 1 - 0", "level": 1, "stage": 1, "room": 0, "pointer": 3434257, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sir Kibble", "Cappy"], "default_exits": [{"room": 1, "unkn1": 205, "unkn2": 8, "x": 72, "y": 200, "name": "Grass Land 1 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 87, "unkn2": 9, "x": 104, "y": 152, "name": "Grass Land 1 - 0 Exit 1", "access_rule": []}], "entity_load": [[0, 16], [1, 23], [0, 23], [14, 23], [27, 16], [12, 16], [4, 22]], "locations": ["Grass Land 1 - Enemy 1 (Waddle Dee)", "Grass Land 1 - Enemy 2 (Sir Kibble)", "Grass Land 1 - Enemy 3 (Cappy)"], "music": 20}, {"name": "Grass Land 1 - 1", "level": 1, "stage": 1, "room": 1, "pointer": 3368373, "animal_pointers": [], "consumables": [{"idx": 14, "pointer": 264, "x": 928, "y": 160, "etype": 22, "vtype": 0, "name": "Grass Land 1 - 1-Up (Parasol)"}, {"idx": 15, "pointer": 312, "x": 1456, "y": 176, "etype": 22, "vtype": 2, "name": "Grass Land 1 - Maxim Tomato (Spark)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Bronto Burt", "Sasuke"], "default_exits": [{"room": 3, "unkn1": 143, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [30, 16], [12, 16], [14, 23], [8, 16], [0, 22], [2, 22]], "locations": ["Grass Land 1 - Enemy 4 (Sparky)", "Grass Land 1 - Enemy 5 (Bronto Burt)", "Grass Land 1 - Enemy 6 (Sasuke)", "Grass Land 1 - 1-Up (Parasol)", "Grass Land 1 - Maxim Tomato (Spark)"], "music": 20}, {"name": "Grass Land 1 - 2", "level": 1, "stage": 1, "room": 2, "pointer": 2960650, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 1416, "y": 152, "name": "Grass Land 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 1 - Animal 1", "Grass Land 1 - Animal 2"], "music": 38}, {"name": "Grass Land 1 - 3", "level": 1, "stage": 1, "room": 3, "pointer": 3478442, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 179, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [7, 16], [0, 23], [6, 22], [14, 23], [8, 16], [1, 23]], "locations": ["Grass Land 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 20}, {"name": "Grass Land 1 - 4", "level": 1, "stage": 1, "room": 4, "pointer": 2978390, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [42, 19]], "locations": ["Grass Land 1 - Tulip"], "music": 8}, {"name": "Grass Land 1 - 5", "level": 1, "stage": 1, "room": 5, "pointer": 2890835, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 1 - Complete"], "music": 5}, {"name": "Grass Land 2 - 0", "level": 1, "stage": 2, "room": 0, "pointer": 3293347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "KeKe", "Bobo", "Poppy Bros Jr."], "default_exits": [{"room": 1, "unkn1": 112, "unkn2": 9, "x": 72, "y": 152, "name": "Grass Land 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [7, 16], [5, 16], [4, 22], [51, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 1 (Rocky)", "Grass Land 2 - Enemy 2 (KeKe)", "Grass Land 2 - Enemy 3 (Bobo)", "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)"], "music": 11}, {"name": "Grass Land 2 - 1", "level": 1, "stage": 2, "room": 1, "pointer": 3059685, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 9, "x": 56, "y": 136, "name": "Grass Land 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 2 - Animal 1", "Grass Land 2 - Animal 2"], "music": 39}, {"name": "Grass Land 2 - 2", "level": 1, "stage": 2, "room": 2, "pointer": 3432109, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Popon Ball", "Bouncy"], "default_exits": [{"room": 4, "unkn1": 133, "unkn2": 11, "x": 72, "y": 200, "name": "Grass Land 2 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 52, "unkn2": 12, "x": 56, "y": 152, "name": "Grass Land 2 - 2 Exit 1", "access_rule": []}], "entity_load": [[13, 16], [50, 16], [4, 22], [3, 16], [0, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 5 (Waddle Dee)", "Grass Land 2 - Enemy 6 (Popon Ball)", "Grass Land 2 - Enemy 7 (Bouncy)"], "music": 11}, {"name": "Grass Land 2 - 3", "level": 1, "stage": 2, "room": 3, "pointer": 2970029, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 2, "unkn2": 9, "x": 840, "y": 168, "name": "Grass Land 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 19]], "locations": [], "music": 11}, {"name": "Grass Land 2 - 4", "level": 1, "stage": 2, "room": 4, "pointer": 3578022, "animal_pointers": [], "consumables": [{"idx": 20, "pointer": 272, "x": 992, "y": 192, "etype": 22, "vtype": 0, "name": "Grass Land 2 - 1-Up (Needle)"}], "consumables_pointer": 352, "enemies": ["Tick", "Bronto Burt", "Nruff"], "default_exits": [{"room": 5, "unkn1": 154, "unkn2": 12, "x": 72, "y": 152, "name": "Grass Land 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [5, 16], [2, 16], [48, 16], [14, 23], [0, 22]], "locations": ["Grass Land 2 - Enemy 8 (Tick)", "Grass Land 2 - Enemy 9 (Bronto Burt)", "Grass Land 2 - Enemy 10 (Nruff)", "Grass Land 2 - 1-Up (Needle)"], "music": 11}, {"name": "Grass Land 2 - 5", "level": 1, "stage": 2, "room": 5, "pointer": 2966057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 19], [42, 19]], "locations": ["Grass Land 2 - Muchimuchi"], "music": 8}, {"name": "Grass Land 2 - 6", "level": 1, "stage": 2, "room": 6, "pointer": 2887461, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 2 - Complete"], "music": 5}, {"name": "Grass Land 3 - 0", "level": 1, "stage": 3, "room": 0, "pointer": 3149707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Rocky", "Nruff"], "default_exits": [{"room": 1, "unkn1": 107, "unkn2": 7, "x": 72, "y": 840, "name": "Grass Land 3 - 0 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 46, "unkn2": 9, "x": 152, "y": 152, "name": "Grass Land 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [14, 23], [15, 16], [0, 16], [8, 16]], "locations": ["Grass Land 3 - Enemy 1 (Sparky)", "Grass Land 3 - Enemy 2 (Rocky)", "Grass Land 3 - Enemy 3 (Nruff)"], "music": 19}, {"name": "Grass Land 3 - 1", "level": 1, "stage": 3, "room": 1, "pointer": 3204939, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 360, "x": 208, "y": 344, "etype": 22, "vtype": 0, "name": "Grass Land 3 - 1-Up (Climb)"}, {"idx": 11, "pointer": 376, "x": 224, "y": 568, "etype": 22, "vtype": 2, "name": "Grass Land 3 - Maxim Tomato (Climb)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [6, 23], [2, 22], [5, 23], [14, 23], [1, 23], [0, 23], [31, 16]], "locations": ["Grass Land 3 - 1-Up (Climb)", "Grass Land 3 - Maxim Tomato (Climb)"], "music": 19}, {"name": "Grass Land 3 - 2", "level": 1, "stage": 3, "room": 2, "pointer": 3200066, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 55, "x": 56, "y": 152, "name": "Grass Land 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [14, 23]], "locations": [], "music": 19}, {"name": "Grass Land 3 - 3", "level": 1, "stage": 3, "room": 3, "pointer": 2959784, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 15, "unkn2": 9, "x": 56, "y": 120, "name": "Grass Land 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 31}, {"name": "Grass Land 3 - 4", "level": 1, "stage": 3, "room": 4, "pointer": 2979121, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 8, "unkn2": 9, "x": 760, "y": 152, "name": "Grass Land 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 3 - Animal 1", "Grass Land 3 - Animal 2"], "music": 40}, {"name": "Grass Land 3 - 5", "level": 1, "stage": 3, "room": 5, "pointer": 2997811, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 8}, {"name": "Grass Land 3 - 6", "level": 1, "stage": 3, "room": 6, "pointer": 3084876, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bouncy"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [14, 16], [1, 23], [59, 16], [14, 23]], "locations": ["Grass Land 3 - Pitcherman", "Grass Land 3 - Enemy 4 (Bouncy)"], "music": 19}, {"name": "Grass Land 3 - 7", "level": 1, "stage": 3, "room": 7, "pointer": 2891317, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 3 - Complete"], "music": 5}, {"name": "Grass Land 4 - 0", "level": 1, "stage": 4, "room": 0, "pointer": 3471284, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Babut", "Rocky"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 13, "x": 72, "y": 136, "name": "Grass Land 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [14, 23], [40, 16], [61, 16], [4, 22]], "locations": ["Grass Land 4 - Enemy 1 (Loud)", "Grass Land 4 - Enemy 2 (Babut)", "Grass Land 4 - Enemy 3 (Rocky)"], "music": 10}, {"name": "Grass Land 4 - 1", "level": 1, "stage": 4, "room": 1, "pointer": 3436401, "animal_pointers": [], "consumables": [{"idx": 12, "pointer": 290, "x": 1008, "y": 144, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Zebon Right)"}], "consumables_pointer": 368, "enemies": ["Kapar"], "default_exits": [{"room": 5, "unkn1": 58, "unkn2": 5, "x": 184, "y": 312, "name": "Grass Land 4 - 1 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 42, "unkn2": 18, "x": 168, "y": 88, "name": "Grass Land 4 - 1 Exit 1", "access_rule": []}], "entity_load": [[43, 16], [10, 23], [6, 22], [14, 23], [2, 22], [67, 16]], "locations": ["Grass Land 4 - Enemy 4 (Kapar)", "Grass Land 4 - Maxim Tomato (Zebon Right)"], "music": 10}, {"name": "Grass Land 4 - 2", "level": 1, "stage": 4, "room": 2, "pointer": 3039401, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 4, "x": 56, "y": 72, "name": "Grass Land 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": [], "music": 9}, {"name": "Grass Land 4 - 3", "level": 1, "stage": 4, "room": 3, "pointer": 3722714, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 280, "x": 856, "y": 224, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Gordo)"}, {"idx": 22, "pointer": 480, "x": 1352, "y": 112, "etype": 22, "vtype": 0, "name": "Grass Land 4 - 1-Up (Gordo)"}], "consumables_pointer": 288, "enemies": ["Glunk", "Oro"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 5, "x": 72, "y": 200, "name": "Grass Land 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [55, 16], [16, 16], [25, 16], [14, 23], [0, 22], [2, 22], [4, 22]], "locations": ["Grass Land 4 - Enemy 5 (Glunk)", "Grass Land 4 - Enemy 6 (Oro)", "Grass Land 4 - Maxim Tomato (Gordo)", "Grass Land 4 - 1-Up (Gordo)"], "music": 10}, {"name": "Grass Land 4 - 4", "level": 1, "stage": 4, "room": 4, "pointer": 3304980, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 208, "x": 488, "y": 64, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Cliff)"}], "consumables_pointer": 160, "enemies": [], "default_exits": [{"room": 8, "unkn1": 94, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [2, 22], [54, 16], [1, 16], [40, 16], [14, 23]], "locations": ["Grass Land 4 - Maxim Tomato (Cliff)"], "music": 10}, {"name": "Grass Land 4 - 5", "level": 1, "stage": 4, "room": 5, "pointer": 3498127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 2, "unkn1": 61, "unkn2": 13, "x": 56, "y": 72, "name": "Grass Land 4 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 61, "unkn2": 18, "x": 56, "y": 200, "name": "Grass Land 4 - 5 Exit 1", "access_rule": []}], "entity_load": [[72, 16], [43, 16], [4, 22], [14, 23], [10, 23], [3, 16]], "locations": ["Grass Land 4 - Enemy 7 (Peran)"], "music": 10}, {"name": "Grass Land 4 - 6", "level": 1, "stage": 4, "room": 6, "pointer": 3160191, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 28, "unkn2": 4, "x": 72, "y": 376, "name": "Grass Land 4 - 6 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 28, "unkn2": 12, "x": 72, "y": 440, "name": "Grass Land 4 - 6 Exit 1", "access_rule": []}], "entity_load": [[3, 19], [6, 23]], "locations": [], "music": 10}, {"name": "Grass Land 4 - 7", "level": 1, "stage": 4, "room": 7, "pointer": 3035801, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 12, "x": 56, "y": 200, "name": "Grass Land 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Grass Land 4 - Miniboss 1 (Boboo)"], "music": 4}, {"name": "Grass Land 4 - 8", "level": 1, "stage": 4, "room": 8, "pointer": 2989794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[3, 19], [42, 19]], "locations": ["Grass Land 4 - Chao & Goku"], "music": 8}, {"name": "Grass Land 4 - 9", "level": 1, "stage": 4, "room": 9, "pointer": 3043518, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 9, "unkn2": 5, "x": 696, "y": 296, "name": "Grass Land 4 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 4 - Animal 1", "Grass Land 4 - Animal 2"], "music": 38}, {"name": "Grass Land 4 - 10", "level": 1, "stage": 4, "room": 10, "pointer": 2888425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 4 - Complete"], "music": 5}, {"name": "Grass Land 5 - 0", "level": 1, "stage": 5, "room": 0, "pointer": 3303565, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 1, "unkn1": 120, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [4, 22], [14, 23], [6, 23], [11, 16], [89, 16]], "locations": ["Grass Land 5 - Enemy 1 (Propeller)", "Grass Land 5 - Enemy 2 (Broom Hatter)", "Grass Land 5 - Enemy 3 (Bouncy)"], "music": 11}, {"name": "Grass Land 5 - 1", "level": 1, "stage": 5, "room": 1, "pointer": 3048718, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 3, "unkn1": 18, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 21, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 36, "unkn2": 9, "x": 56, "y": 88, "name": "Grass Land 5 - 1 Exit 2", "access_rule": []}], "entity_load": [[27, 16], [14, 23]], "locations": ["Grass Land 5 - Enemy 4 (Sir Kibble)"], "music": 11}, {"name": "Grass Land 5 - 2", "level": 1, "stage": 5, "room": 2, "pointer": 3327019, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sasuke", "Nruff"], "default_exits": [{"room": 7, "unkn1": 121, "unkn2": 6, "x": 56, "y": 72, "name": "Grass Land 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [4, 22], [30, 16], [15, 16], [1, 16]], "locations": ["Grass Land 5 - Enemy 5 (Waddle Dee)", "Grass Land 5 - Enemy 6 (Sasuke)", "Grass Land 5 - Enemy 7 (Nruff)"], "music": 11}, {"name": "Grass Land 5 - 3", "level": 1, "stage": 5, "room": 3, "pointer": 2966459, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 312, "y": 72, "name": "Grass Land 5 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 1", "Grass Land 5 - Animal 2"], "music": 38}, {"name": "Grass Land 5 - 4", "level": 1, "stage": 5, "room": 4, "pointer": 2973509, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 360, "y": 72, "name": "Grass Land 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 3", "Grass Land 5 - Animal 4"], "music": 38}, {"name": "Grass Land 5 - 5", "level": 1, "stage": 5, "room": 5, "pointer": 2962351, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[4, 19], [42, 19]], "locations": ["Grass Land 5 - Mine"], "music": 8}, {"name": "Grass Land 5 - 6", "level": 1, "stage": 5, "room": 6, "pointer": 2886738, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 5 - Complete"], "music": 5}, {"name": "Grass Land 5 - 7", "level": 1, "stage": 5, "room": 7, "pointer": 3255423, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [4, 22], [14, 23]], "locations": ["Grass Land 5 - Enemy 8 (Tick)"], "music": 11}, {"name": "Grass Land 6 - 0", "level": 1, "stage": 6, "room": 0, "pointer": 3376872, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Togezo", "Bronto Burt", "Cappy"], "default_exits": [{"room": 6, "unkn1": 51, "unkn2": 9, "x": 216, "y": 152, "name": "Grass Land 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 96, "unkn2": 9, "x": 216, "y": 1144, "name": "Grass Land 6 - 0 Exit 1", "access_rule": []}], "entity_load": [[12, 16], [18, 16], [2, 16], [41, 16], [4, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 1 (Como)", "Grass Land 6 - Enemy 2 (Togezo)", "Grass Land 6 - Enemy 3 (Bronto Burt)", "Grass Land 6 - Enemy 4 (Cappy)"], "music": 20}, {"name": "Grass Land 6 - 1", "level": 1, "stage": 6, "room": 1, "pointer": 3395125, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 192, "x": 104, "y": 1144, "etype": 22, "vtype": 0, "name": "Grass Land 6 - 1-Up (Tower)"}], "consumables_pointer": 256, "enemies": ["Bobo", "Mariel"], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 5, "x": 72, "y": 88, "name": "Grass Land 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [5, 19], [45, 16], [0, 22], [4, 22], [14, 23], [55, 16]], "locations": ["Grass Land 6 - Enemy 5 (Bobo)", "Grass Land 6 - Enemy 6 (Mariel)", "Grass Land 6 - 1-Up (Tower)"], "music": 20}, {"name": "Grass Land 6 - 2", "level": 1, "stage": 6, "room": 2, "pointer": 3375177, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter"], "default_exits": [{"room": 3, "unkn1": 93, "unkn2": 6, "x": 200, "y": 152, "name": "Grass Land 6 - 2 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 49, "unkn2": 7, "x": 216, "y": 104, "name": "Grass Land 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[11, 16], [45, 16], [41, 16], [4, 22], [32, 16], [14, 23]], "locations": ["Grass Land 6 - Enemy 7 (Yaban)", "Grass Land 6 - Enemy 8 (Broom Hatter)"], "music": 20}, {"name": "Grass Land 6 - 3", "level": 1, "stage": 6, "room": 3, "pointer": 3322977, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Apolo", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 52, "x": 72, "y": 104, "name": "Grass Land 6 - 3 Exit 0", "access_rule": []}], "entity_load": [[41, 16], [49, 16], [30, 16], [14, 23], [4, 22]], "locations": ["Grass Land 6 - Enemy 9 (Apolo)", "Grass Land 6 - Enemy 10 (Sasuke)"], "music": 20}, {"name": "Grass Land 6 - 4", "level": 1, "stage": 6, "room": 4, "pointer": 3490819, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 192, "x": 40, "y": 104, "etype": 22, "vtype": 1, "name": "Grass Land 6 - 1-Up (Falling)"}], "consumables_pointer": 176, "enemies": ["Rocky"], "default_exits": [{"room": 5, "unkn1": 145, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [4, 22], [49, 16], [61, 16], [3, 16], [1, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 11 (Rocky)", "Grass Land 6 - 1-Up (Falling)"], "music": 20}, {"name": "Grass Land 6 - 5", "level": 1, "stage": 6, "room": 5, "pointer": 3076769, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 19], [42, 19]], "locations": ["Grass Land 6 - Pierre"], "music": 8}, {"name": "Grass Land 6 - 6", "level": 1, "stage": 6, "room": 6, "pointer": 3047576, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 9, "x": 840, "y": 152, "name": "Grass Land 6 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 1", "Grass Land 6 - Animal 2"], "music": 39}, {"name": "Grass Land 6 - 7", "level": 1, "stage": 6, "room": 7, "pointer": 3022909, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 808, "y": 120, "name": "Grass Land 6 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 3", "Grass Land 6 - Animal 4"], "music": 38}, {"name": "Grass Land 6 - 8", "level": 1, "stage": 6, "room": 8, "pointer": 2884569, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 6 - Complete"], "music": 5}, {"name": "Grass Land Boss - 0", "level": 1, "stage": 7, "room": 0, "pointer": 2984105, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[0, 18]], "locations": ["Grass Land - Boss (Whispy Woods) Purified", "Level 1 Boss - Defeated", "Level 1 Boss - Purified"], "music": 2}, {"name": "Ripple Field 1 - 0", "level": 2, "stage": 1, "room": 0, "pointer": 3279855, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Glunk", "Broom Hatter", "Cappy"], "default_exits": [{"room": 2, "unkn1": 102, "unkn2": 8, "x": 56, "y": 152, "name": "Ripple Field 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[16, 16], [0, 16], [12, 16], [11, 16], [14, 23]], "locations": ["Ripple Field 1 - Enemy 1 (Waddle Dee)", "Ripple Field 1 - Enemy 2 (Glunk)", "Ripple Field 1 - Enemy 3 (Broom Hatter)", "Ripple Field 1 - Enemy 4 (Cappy)"], "music": 15}, {"name": "Ripple Field 1 - 1", "level": 2, "stage": 1, "room": 1, "pointer": 3588688, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 11, "x": 40, "y": 232, "name": "Ripple Field 1 - 1 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 108, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 138, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [2, 16], [3, 16], [7, 16]], "locations": ["Ripple Field 1 - Enemy 5 (Bronto Burt)", "Ripple Field 1 - Enemy 6 (Rocky)", "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 1 - 2", "level": 2, "stage": 1, "room": 2, "pointer": 2955848, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 18, "unkn2": 9, "x": 56, "y": 168, "name": "Ripple Field 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 1 - Animal 1", "Ripple Field 1 - Animal 2"], "music": 40}, {"name": "Ripple Field 1 - 3", "level": 2, "stage": 1, "room": 3, "pointer": 3558828, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin"], "default_exits": [{"room": 4, "unkn1": 171, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[73, 16], [6, 22], [14, 23], [4, 22], [0, 16], [10, 23]], "locations": ["Ripple Field 1 - Enemy 8 (Bobin)"], "music": 15}, {"name": "Ripple Field 1 - 4", "level": 2, "stage": 1, "room": 4, "pointer": 2974271, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [42, 19]], "locations": ["Ripple Field 1 - Kamuribana"], "music": 8}, {"name": "Ripple Field 1 - 5", "level": 2, "stage": 1, "room": 5, "pointer": 3051513, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 264, "name": "Ripple Field 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 6", "level": 2, "stage": 1, "room": 6, "pointer": 3049838, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1752, "y": 264, "name": "Ripple Field 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 7", "level": 2, "stage": 1, "room": 7, "pointer": 3066407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 2232, "y": 264, "name": "Ripple Field 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[7, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 8", "level": 2, "stage": 1, "room": 8, "pointer": 2889148, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 1 - Complete"], "music": 5}, {"name": "Ripple Field 2 - 0", "level": 2, "stage": 2, "room": 0, "pointer": 3342336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Coconut", "Blipper", "Sasuke"], "default_exits": [{"room": 1, "unkn1": 103, "unkn2": 15, "x": 56, "y": 104, "name": "Ripple Field 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[5, 22], [34, 16], [30, 16], [21, 16], [14, 23], [4, 22], [18, 16]], "locations": ["Ripple Field 2 - Enemy 1 (Togezo)", "Ripple Field 2 - Enemy 2 (Coconut)", "Ripple Field 2 - Enemy 3 (Blipper)", "Ripple Field 2 - Enemy 4 (Sasuke)"], "music": 10}, {"name": "Ripple Field 2 - 1", "level": 2, "stage": 2, "room": 1, "pointer": 3084099, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 23, "unkn2": 8, "x": 72, "y": 248, "name": "Ripple Field 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 1", "Ripple Field 2 - Animal 2"], "music": 39}, {"name": "Ripple Field 2 - 2", "level": 2, "stage": 2, "room": 2, "pointer": 3451207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 4, "unkn1": 31, "unkn2": 5, "x": 72, "y": 152, "name": "Ripple Field 2 - 2 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 96, "unkn2": 6, "x": 56, "y": 152, "name": "Ripple Field 2 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 56, "unkn2": 17, "x": 136, "y": 264, "name": "Ripple Field 2 - 2 Exit 2", "access_rule": []}], "entity_load": [[29, 16], [47, 16], [1, 16], [46, 16], [14, 23]], "locations": ["Ripple Field 2 - Enemy 5 (Kany)"], "music": 10}, {"name": "Ripple Field 2 - 3", "level": 2, "stage": 2, "room": 3, "pointer": 3674327, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 480, "x": 1384, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 2 - Maxim Tomato (Currents)"}, {"idx": 10, "pointer": 520, "x": 1456, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 2 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Glunk"], "default_exits": [{"room": 2, "unkn1": 134, "unkn2": 5, "x": 40, "y": 136, "name": "Ripple Field 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [14, 23], [16, 16], [21, 16], [4, 22]], "locations": ["Ripple Field 2 - Enemy 6 (Glunk)", "Ripple Field 2 - Maxim Tomato (Currents)", "Ripple Field 2 - 1-Up (Currents)"], "music": 10}, {"name": "Ripple Field 2 - 4", "level": 2, "stage": 2, "room": 4, "pointer": 2972744, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 3, "unkn2": 9, "x": 520, "y": 88, "name": "Ripple Field 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[8, 19]], "locations": [], "music": 10}, {"name": "Ripple Field 2 - 5", "level": 2, "stage": 2, "room": 5, "pointer": 3109710, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 16, "x": 1048, "y": 280, "name": "Ripple Field 2 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 3", "Ripple Field 2 - Animal 4"], "music": 38}, {"name": "Ripple Field 2 - 6", "level": 2, "stage": 2, "room": 6, "pointer": 2973127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[8, 19], [42, 19]], "locations": ["Ripple Field 2 - Bakasa"], "music": 8}, {"name": "Ripple Field 2 - 7", "level": 2, "stage": 2, "room": 7, "pointer": 2890353, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 2 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 0", "level": 2, "stage": 3, "room": 0, "pointer": 3517254, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 105, "unkn2": 8, "x": 40, "y": 104, "name": "Ripple Field 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[21, 16], [57, 16], [62, 16], [67, 16], [4, 22], [14, 23]], "locations": ["Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", "Ripple Field 3 - Enemy 2 (Kapar)", "Ripple Field 3 - Enemy 3 (Blipper)"], "music": 18}, {"name": "Ripple Field 3 - 1", "level": 2, "stage": 3, "room": 1, "pointer": 3604480, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 320, "x": 832, "y": 152, "etype": 22, "vtype": 2, "name": "Ripple Field 3 - Maxim Tomato (Cove)"}, {"idx": 13, "pointer": 424, "x": 1128, "y": 384, "etype": 22, "vtype": 0, "name": "Ripple Field 3 - 1-Up (Cutter/Spark)"}], "consumables_pointer": 160, "enemies": ["Sparky", "Glunk", "Joe"], "default_exits": [{"room": 7, "unkn1": 80, "unkn2": 24, "x": 104, "y": 328, "name": "Ripple Field 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[13, 23], [14, 23], [91, 16], [16, 16], [2, 22], [8, 16], [0, 22]], "locations": ["Ripple Field 3 - Enemy 4 (Sparky)", "Ripple Field 3 - Enemy 5 (Glunk)", "Ripple Field 3 - Enemy 6 (Joe)", "Ripple Field 3 - Maxim Tomato (Cove)", "Ripple Field 3 - 1-Up (Cutter/Spark)"], "music": 18}, {"name": "Ripple Field 3 - 2", "level": 2, "stage": 3, "room": 2, "pointer": 3715428, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobo"], "default_exits": [{"room": 4, "unkn1": 118, "unkn2": 9, "x": 56, "y": 152, "name": "Ripple Field 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [21, 16], [4, 22], [46, 16], [47, 16], [5, 16], [14, 23]], "locations": ["Ripple Field 3 - Enemy 7 (Bobo)"], "music": 18}, {"name": "Ripple Field 3 - 3", "level": 2, "stage": 3, "room": 3, "pointer": 3071919, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 15, "unkn2": 6, "x": 56, "y": 104, "name": "Ripple Field 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 3 - Animal 1", "Ripple Field 3 - Animal 2"], "music": 39}, {"name": "Ripple Field 3 - 4", "level": 2, "stage": 3, "room": 4, "pointer": 2970810, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": ["Ripple Field 3 - Elieel"], "music": 8}, {"name": "Ripple Field 3 - 5", "level": 2, "stage": 3, "room": 5, "pointer": 2987502, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 232, "y": 88, "name": "Ripple Field 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": [], "music": 31}, {"name": "Ripple Field 3 - 6", "level": 2, "stage": 3, "room": 6, "pointer": 2888666, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 3 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 7", "level": 2, "stage": 3, "room": 7, "pointer": 3161120, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 3, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 3 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 11, "unkn2": 20, "x": 56, "y": 216, "name": "Ripple Field 3 - 7 Exit 1", "access_rule": []}], "entity_load": [[57, 16]], "locations": [], "music": 18}, {"name": "Ripple Field 4 - 0", "level": 2, "stage": 4, "room": 0, "pointer": 3082540, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Stone)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Mony"], "default_exits": [{"room": 6, "unkn1": 4, "unkn2": 16, "x": 72, "y": 232, "name": "Ripple Field 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [79, 16], [80, 16], [81, 16], [4, 22], [20, 16], [77, 16]], "locations": ["Ripple Field 4 - Enemy 1 (Bukiset (Stone))", "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", "Ripple Field 4 - Enemy 5 (Mony)"], "music": 15}, {"name": "Ripple Field 4 - 1", "level": 2, "stage": 4, "room": 1, "pointer": 2964846, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 72, "y": 88, "name": "Ripple Field 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Ripple Field 4 - Miniboss 1 (Captain Stitch)"], "music": 4}, {"name": "Ripple Field 4 - 2", "level": 2, "stage": 4, "room": 2, "pointer": 3018503, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)"], "default_exits": [{"room": 11, "unkn1": 25, "unkn2": 5, "x": 56, "y": 88, "name": "Ripple Field 4 - 2 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 25, "unkn2": 15, "x": 56, "y": 216, "name": "Ripple Field 4 - 2 Exit 1", "access_rule": []}], "entity_load": [[10, 19], [76, 16]], "locations": ["Ripple Field 4 - Enemy 6 (Bukiset (Burning))"], "music": 15}, {"name": "Ripple Field 4 - 3", "level": 2, "stage": 4, "room": 3, "pointer": 2988166, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[10, 19], [42, 19]], "locations": ["Ripple Field 4 - Toad & Little Toad"], "music": 8}, {"name": "Ripple Field 4 - 4", "level": 2, "stage": 4, "room": 4, "pointer": 2885533, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 4 - Complete"], "music": 5}, {"name": "Ripple Field 4 - 5", "level": 2, "stage": 4, "room": 5, "pointer": 3042349, "animal_pointers": [222, 230, 238], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 5, "x": 360, "y": 120, "name": "Ripple Field 4 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 488, "y": 120, "name": "Ripple Field 4 - 5 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 16, "unkn2": 5, "x": 104, "y": 88, "name": "Ripple Field 4 - 5 Exit 2", "access_rule": []}, {"room": 6, "unkn1": 10, "unkn2": 11, "x": 440, "y": 216, "name": "Ripple Field 4 - 5 Exit 3", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 4 - Animal 1", "Ripple Field 4 - Animal 2", "Ripple Field 4 - Animal 3"], "music": 40}, {"name": "Ripple Field 4 - 6", "level": 2, "stage": 4, "room": 6, "pointer": 3234805, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Blipper"], "default_exits": [{"room": 5, "unkn1": 21, "unkn2": 7, "x": 104, "y": 88, "name": "Ripple Field 4 - 6 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 31, "unkn2": 7, "x": 232, "y": 88, "name": "Ripple Field 4 - 6 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 26, "unkn2": 13, "x": 184, "y": 184, "name": "Ripple Field 4 - 6 Exit 2", "access_rule": []}, {"room": 12, "unkn1": 48, "unkn2": 15, "x": 88, "y": 216, "name": "Ripple Field 4 - 6 Exit 3", "access_rule": []}], "entity_load": [[73, 16], [14, 23], [21, 16], [13, 23]], "locations": ["Ripple Field 4 - Enemy 7 (Bobin)", "Ripple Field 4 - Enemy 8 (Blipper)"], "music": 15}, {"name": "Ripple Field 4 - 7", "level": 2, "stage": 4, "room": 7, "pointer": 3155468, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 6, "x": 104, "y": 136, "name": "Ripple Field 4 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 18, "unkn2": 9, "x": 72, "y": 248, "name": "Ripple Field 4 - 7 Exit 1", "access_rule": []}], "entity_load": [[14, 23], [1, 16], [0, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 4 - 8", "level": 2, "stage": 4, "room": 8, "pointer": 3350031, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Oro"], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 22, "x": 184, "y": 440, "name": "Ripple Field 4 - 8 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 34, "unkn2": 22, "x": 296, "y": 440, "name": "Ripple Field 4 - 8 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 16, "unkn2": 72, "x": 168, "y": 152, "name": "Ripple Field 4 - 8 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 23, "unkn2": 72, "x": 120, "y": 152, "name": "Ripple Field 4 - 8 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [68, 16], [14, 23], [25, 16], [6, 23]], "locations": ["Ripple Field 4 - Enemy 9 (Como)", "Ripple Field 4 - Enemy 10 (Oro)"], "music": 15}, {"name": "Ripple Field 4 - 9", "level": 2, "stage": 4, "room": 9, "pointer": 3050397, "animal_pointers": [], "consumables": [{"idx": 29, "pointer": 200, "x": 88, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Stone)"}], "consumables_pointer": 176, "enemies": ["Gansan"], "default_exits": [{"room": 8, "unkn1": 11, "unkn2": 9, "x": 264, "y": 1144, "name": "Ripple Field 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[75, 16], [2, 22]], "locations": ["Ripple Field 4 - Enemy 11 (Gansan)", "Ripple Field 4 - Maxim Tomato (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 10", "level": 2, "stage": 4, "room": 10, "pointer": 3052069, "animal_pointers": [], "consumables": [{"idx": 30, "pointer": 192, "x": 200, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 4 - 1-Up (Stone)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 8, "unkn1": 6, "unkn2": 9, "x": 376, "y": 1144, "name": "Ripple Field 4 - 10 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [75, 16]], "locations": ["Ripple Field 4 - 1-Up (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 11", "level": 2, "stage": 4, "room": 11, "pointer": 3386974, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Kapar", "Squishy"], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 13, "x": 72, "y": 152, "name": "Ripple Field 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[22, 16], [67, 16], [14, 23], [62, 16], [0, 16]], "locations": ["Ripple Field 4 - Enemy 12 (Waddle Dee)", "Ripple Field 4 - Enemy 13 (Kapar)", "Ripple Field 4 - Enemy 14 (Squishy)"], "music": 15}, {"name": "Ripple Field 4 - 12", "level": 2, "stage": 4, "room": 12, "pointer": 3168339, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 8, "unkn1": 67, "unkn2": 7, "x": 88, "y": 1224, "name": "Ripple Field 4 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 75, "unkn2": 7, "x": 88, "y": 136, "name": "Ripple Field 4 - 12 Exit 1", "access_rule": []}], "entity_load": [[59, 16], [13, 23], [28, 16]], "locations": ["Ripple Field 4 - Enemy 15 (Nidoo)"], "music": 15}, {"name": "Ripple Field 4 - 13", "level": 2, "stage": 4, "room": 13, "pointer": 2958478, "animal_pointers": [], "consumables": [{"idx": 54, "pointer": 264, "x": 216, "y": 136, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Dark)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 12, "unkn1": 4, "unkn2": 8, "x": 1192, "y": 120, "name": "Ripple Field 4 - 13 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [2, 22], [59, 16]], "locations": ["Ripple Field 4 - Maxim Tomato (Dark)"], "music": 15}, {"name": "Ripple Field 5 - 0", "level": 2, "stage": 5, "room": 0, "pointer": 3240369, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 9, "unkn2": 43, "x": 88, "y": 344, "name": "Ripple Field 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 1", "level": 2, "stage": 5, "room": 1, "pointer": 3547528, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 4, "x": 184, "y": 344, "name": "Ripple Field 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 2", "level": 2, "stage": 5, "room": 2, "pointer": 3611327, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Joe"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 21, "x": 56, "y": 184, "name": "Ripple Field 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 1 (Glunk)", "Ripple Field 5 - Enemy 2 (Joe)"], "music": 16}, {"name": "Ripple Field 5 - 3", "level": 2, "stage": 5, "room": 3, "pointer": 3926157, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 1258, "x": 1488, "y": 192, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Currents)"}, {"idx": 31, "pointer": 1290, "x": 1520, "y": 192, "etype": 22, "vtype": 0, "name": "Ripple Field 5 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Bobin", "Mony", "Squishy"], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 38, "x": 152, "y": 152, "name": "Ripple Field 5 - 3 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 95, "unkn2": 38, "x": 248, "y": 1064, "name": "Ripple Field 5 - 3 Exit 1", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [6, 22], [14, 23], [1, 16], [73, 16], [22, 16], [20, 16]], "locations": ["Ripple Field 5 - Enemy 3 (Bobin)", "Ripple Field 5 - Enemy 4 (Mony)", "Ripple Field 5 - Enemy 5 (Squishy)", "Ripple Field 5 - Maxim Tomato (Currents)", "Ripple Field 5 - 1-Up (Currents)"], "music": 16}, {"name": "Ripple Field 5 - 4", "level": 2, "stage": 5, "room": 4, "pointer": 3026639, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 4, "x": 232, "y": 152, "name": "Ripple Field 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 1"], "music": 40}, {"name": "Ripple Field 5 - 5", "level": 2, "stage": 5, "room": 5, "pointer": 3207333, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 56, "y": 72, "name": "Ripple Field 5 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 9, "x": 120, "y": 552, "name": "Ripple Field 5 - 5 Exit 1", "access_rule": ["Kine"]}], "entity_load": [[14, 23]], "locations": [], "music": 16}, {"name": "Ripple Field 5 - 6", "level": 2, "stage": 5, "room": 6, "pointer": 3485896, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 9, "unkn1": 121, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [22, 16], [14, 23], [13, 16], [11, 16], [32, 16]], "locations": ["Ripple Field 5 - Enemy 6 (Yaban)", "Ripple Field 5 - Enemy 7 (Broom Hatter)", "Ripple Field 5 - Enemy 8 (Bouncy)"], "music": 16}, {"name": "Ripple Field 5 - 7", "level": 2, "stage": 5, "room": 7, "pointer": 3752698, "animal_pointers": [], "consumables": [{"idx": 53, "pointer": 418, "x": 1512, "y": 608, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Exit)"}], "consumables_pointer": 352, "enemies": ["Sparky", "Rocky", "Babut"], "default_exits": [{"room": 10, "unkn1": 45, "unkn2": 31, "x": 152, "y": 152, "name": "Ripple Field 5 - 7 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 94, "unkn2": 40, "x": 88, "y": 200, "name": "Ripple Field 5 - 7 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [8, 16], [22, 16], [14, 23], [2, 22]], "locations": ["Ripple Field 5 - Enemy 9 (Sparky)", "Ripple Field 5 - Enemy 10 (Rocky)", "Ripple Field 5 - Enemy 11 (Babut)", "Ripple Field 5 - Maxim Tomato (Exit)"], "music": 16}, {"name": "Ripple Field 5 - 8", "level": 2, "stage": 5, "room": 8, "pointer": 3044682, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 8, "unkn2": 9, "x": 88, "y": 616, "name": "Ripple Field 5 - 8 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 2"], "music": 39}, {"name": "Ripple Field 5 - 9", "level": 2, "stage": 5, "room": 9, "pointer": 2963193, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[11, 19], [42, 19]], "locations": ["Ripple Field 5 - Mama Pitch"], "music": 8}, {"name": "Ripple Field 5 - 10", "level": 2, "stage": 5, "room": 10, "pointer": 3042934, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 8, "unkn2": 9, "x": 712, "y": 504, "name": "Ripple Field 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 12 (Galbo)"], "music": 16}, {"name": "Ripple Field 5 - 11", "level": 2, "stage": 5, "room": 11, "pointer": 2886256, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 5 - Complete"], "music": 5}, {"name": "Ripple Field 6 - 0", "level": 2, "stage": 6, "room": 0, "pointer": 2949576, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 1, "unkn1": 56, "unkn2": 7, "x": 40, "y": 152, "name": "Ripple Field 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[29, 16], [13, 23]], "locations": ["Ripple Field 6 - Enemy 1 (Kany)"], "music": 15}, {"name": "Ripple Field 6 - 1", "level": 2, "stage": 6, "room": 1, "pointer": 2971200, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 23, "unkn2": 9, "x": 56, "y": 264, "name": "Ripple Field 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 1", "Ripple Field 6 - Animal 2", "Ripple Field 6 - Animal 3"], "music": 38}, {"name": "Ripple Field 6 - 2", "level": 2, "stage": 6, "room": 2, "pointer": 3637749, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 95, "unkn2": 9, "x": 104, "y": 872, "name": "Ripple Field 6 - 2 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 50, "unkn2": 22, "x": 184, "y": 88, "name": "Ripple Field 6 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 45, "unkn2": 26, "x": 88, "y": 88, "name": "Ripple Field 6 - 2 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 55, "unkn2": 26, "x": 248, "y": 88, "name": "Ripple Field 6 - 2 Exit 3", "access_rule": []}], "entity_load": [[52, 16], [13, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 3", "level": 2, "stage": 6, "room": 3, "pointer": 3092564, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 5, "x": 744, "y": 424, "name": "Ripple Field 6 - 3 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 16, "unkn2": 5, "x": 872, "y": 424, "name": "Ripple Field 6 - 3 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 4", "level": 2, "stage": 6, "room": 4, "pointer": 3133247, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 5, "x": 824, "y": 360, "name": "Ripple Field 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[12, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 5", "level": 2, "stage": 6, "room": 5, "pointer": 3507762, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 76, "unkn2": 4, "x": 680, "y": 72, "name": "Ripple Field 6 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 6, "x": 440, "y": 104, "name": "Ripple Field 6 - 5 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 10, "x": 440, "y": 168, "name": "Ripple Field 6 - 5 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 88, "unkn2": 10, "x": 104, "y": 152, "name": "Ripple Field 6 - 5 Exit 3", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 12, "x": 200, "y": 200, "name": "Ripple Field 6 - 5 Exit 4", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 12, "x": 680, "y": 200, "name": "Ripple Field 6 - 5 Exit 5", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 16, "x": 680, "y": 264, "name": "Ripple Field 6 - 5 Exit 6", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 6", "level": 2, "stage": 6, "room": 6, "pointer": 3211264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 10, "x": 72, "y": 168, "name": "Ripple Field 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 7", "level": 2, "stage": 6, "room": 7, "pointer": 3586039, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Kapar", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 5, "unkn1": 134, "unkn2": 16, "x": 72, "y": 168, "name": "Ripple Field 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [3, 16], [67, 16], [51, 16], [7, 16]], "locations": ["Ripple Field 6 - Enemy 2 (KeKe)", "Ripple Field 6 - Enemy 3 (Kapar)", "Ripple Field 6 - Enemy 4 (Rocky)", "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 6 - 8", "level": 2, "stage": 6, "room": 8, "pointer": 3621483, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Coconut", "Sasuke", "Nruff"], "default_exits": [{"room": 10, "unkn1": 70, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 6 - 8 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 26, "unkn2": 54, "x": 72, "y": 152, "name": "Ripple Field 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[89, 16], [15, 16], [30, 16], [34, 16], [14, 23]], "locations": ["Ripple Field 6 - Enemy 6 (Propeller)", "Ripple Field 6 - Enemy 7 (Coconut)", "Ripple Field 6 - Enemy 8 (Sasuke)", "Ripple Field 6 - Enemy 9 (Nruff)"], "music": 15}, {"name": "Ripple Field 6 - 9", "level": 2, "stage": 6, "room": 9, "pointer": 2954523, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 3, "unkn2": 9, "x": 408, "y": 872, "name": "Ripple Field 6 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 4"], "music": 39}, {"name": "Ripple Field 6 - 10", "level": 2, "stage": 6, "room": 10, "pointer": 3069438, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[12, 19], [42, 19]], "locations": ["Ripple Field 6 - HB-002"], "music": 8}, {"name": "Ripple Field 6 - 11", "level": 2, "stage": 6, "room": 11, "pointer": 2886497, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 6 - Complete"], "music": 5}, {"name": "Ripple Field Boss - 0", "level": 2, "stage": 7, "room": 0, "pointer": 3157370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[7, 18]], "locations": ["Ripple Field - Boss (Acro) Purified", "Level 2 Boss - Defeated", "Level 2 Boss - Purified"], "music": 2}, {"name": "Sand Canyon 1 - 0", "level": 3, "stage": 1, "room": 0, "pointer": 3524267, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo"], "default_exits": [{"room": 5, "unkn1": 196, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [1, 16], [26, 16], [2, 16]], "locations": ["Sand Canyon 1 - Enemy 1 (Bronto Burt)", "Sand Canyon 1 - Enemy 2 (Galbo)"], "music": 13}, {"name": "Sand Canyon 1 - 1", "level": 3, "stage": 1, "room": 1, "pointer": 3163860, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 34, "unkn2": 5, "x": 104, "y": 408, "name": "Sand Canyon 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 1 - Animal 1", "Sand Canyon 1 - Animal 2"], "music": 38}, {"name": "Sand Canyon 1 - 2", "level": 3, "stage": 1, "room": 2, "pointer": 3512532, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro"], "default_exits": [{"room": 3, "unkn1": 73, "unkn2": 6, "x": 56, "y": 120, "name": "Sand Canyon 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [26, 16], [25, 16], [4, 22], [14, 23], [1, 23], [0, 23], [4, 23]], "locations": ["Sand Canyon 1 - Enemy 3 (Oro)"], "music": 13}, {"name": "Sand Canyon 1 - 3", "level": 3, "stage": 1, "room": 3, "pointer": 3719146, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Propeller", "Gansan", "Babut"], "default_exits": [{"room": 4, "unkn1": 25, "unkn2": 73, "x": 72, "y": 280, "name": "Sand Canyon 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [75, 16], [43, 16], [8, 16]], "locations": ["Sand Canyon 1 - Enemy 4 (Sparky)", "Sand Canyon 1 - Enemy 5 (Propeller)", "Sand Canyon 1 - Enemy 6 (Gansan)", "Sand Canyon 1 - Enemy 7 (Babut)"], "music": 13}, {"name": "Sand Canyon 1 - 4", "level": 3, "stage": 1, "room": 4, "pointer": 3421212, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Dogon", "Bouncy", "Pteran"], "default_exits": [{"room": 7, "unkn1": 196, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[90, 16], [13, 16], [40, 16], [14, 23], [39, 16]], "locations": ["Sand Canyon 1 - Enemy 8 (Loud)", "Sand Canyon 1 - Enemy 9 (Dogon)", "Sand Canyon 1 - Enemy 10 (Bouncy)", "Sand Canyon 1 - Enemy 11 (Pteran)"], "music": 13}, {"name": "Sand Canyon 1 - 5", "level": 3, "stage": 1, "room": 5, "pointer": 3203325, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Polof"], "default_exits": [{"room": 6, "unkn1": 32, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 1 - 5 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 46, "unkn2": 9, "x": 56, "y": 344, "name": "Sand Canyon 1 - 5 Exit 1", "access_rule": []}], "entity_load": [[9, 16]], "locations": ["Sand Canyon 1 - Enemy 12 (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 6", "level": 3, "stage": 1, "room": 6, "pointer": 3138524, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 248, "x": 168, "y": 104, "etype": 22, "vtype": 0, "name": "Sand Canyon 1 - 1-Up (Polof)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 5, "unkn1": 5, "unkn2": 9, "x": 536, "y": 152, "name": "Sand Canyon 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [0, 22]], "locations": ["Sand Canyon 1 - 1-Up (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 7", "level": 3, "stage": 1, "room": 7, "pointer": 2988822, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [42, 19]], "locations": ["Sand Canyon 1 - Geromuzudake"], "music": 8}, {"name": "Sand Canyon 1 - 8", "level": 3, "stage": 1, "room": 8, "pointer": 2885292, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 1 - Complete"], "music": 5}, {"name": "Sand Canyon 2 - 0", "level": 3, "stage": 2, "room": 0, "pointer": 3668370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Doka", "Boten"], "default_exits": [{"room": 1, "unkn1": 178, "unkn2": 8, "x": 184, "y": 104, "name": "Sand Canyon 2 - 0 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 244, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 2 - 0 Exit 1", "access_rule": []}], "entity_load": [[35, 16], [33, 16], [14, 23], [51, 16], [47, 16], [46, 16]], "locations": ["Sand Canyon 2 - Enemy 1 (KeKe)", "Sand Canyon 2 - Enemy 2 (Doka)", "Sand Canyon 2 - Enemy 3 (Boten)"], "music": 21}, {"name": "Sand Canyon 2 - 1", "level": 3, "stage": 2, "room": 1, "pointer": 2952738, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 10, "unkn2": 6, "x": 2872, "y": 136, "name": "Sand Canyon 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 2 - Animal 1", "Sand Canyon 2 - Animal 2"], "music": 40}, {"name": "Sand Canyon 2 - 2", "level": 3, "stage": 2, "room": 2, "pointer": 3531156, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 9, "unkn1": 45, "unkn2": 60, "x": 88, "y": 184, "name": "Sand Canyon 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[6, 23], [89, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 4 (Propeller)"], "music": 21}, {"name": "Sand Canyon 2 - 3", "level": 3, "stage": 2, "room": 3, "pointer": 3263731, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Sasuke", "Como"], "default_exits": [{"room": 4, "unkn1": 63, "unkn2": 5, "x": 88, "y": 184, "name": "Sand Canyon 2 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 68, "unkn2": 5, "x": 184, "y": 184, "name": "Sand Canyon 2 - 3 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 73, "unkn2": 5, "x": 248, "y": 184, "name": "Sand Canyon 2 - 3 Exit 2", "access_rule": []}, {"room": 5, "unkn1": 130, "unkn2": 9, "x": 72, "y": 312, "name": "Sand Canyon 2 - 3 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [8, 16], [30, 16], [0, 16]], "locations": ["Sand Canyon 2 - Enemy 5 (Waddle Dee)", "Sand Canyon 2 - Enemy 6 (Sparky)", "Sand Canyon 2 - Enemy 7 (Sasuke)", "Sand Canyon 2 - Enemy 8 (Como)"], "music": 21}, {"name": "Sand Canyon 2 - 4", "level": 3, "stage": 2, "room": 4, "pointer": 3076300, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 228, "x": 168, "y": 72, "etype": 22, "vtype": 0, "name": "Sand Canyon 2 - 1-Up (Enclave)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 5, "unkn2": 11, "x": 1016, "y": 88, "name": "Sand Canyon 2 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 10, "unkn2": 11, "x": 1112, "y": 88, "name": "Sand Canyon 2 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 11, "x": 1176, "y": 88, "name": "Sand Canyon 2 - 4 Exit 2", "access_rule": []}], "entity_load": [[14, 23], [0, 22], [4, 22]], "locations": ["Sand Canyon 2 - 1-Up (Enclave)"], "music": 21}, {"name": "Sand Canyon 2 - 5", "level": 3, "stage": 2, "room": 5, "pointer": 3302133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 6, "unkn1": 63, "unkn2": 15, "x": 120, "y": 216, "name": "Sand Canyon 2 - 5 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 71, "unkn2": 18, "x": 152, "y": 136, "name": "Sand Canyon 2 - 5 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 130, "unkn2": 19, "x": 72, "y": 952, "name": "Sand Canyon 2 - 5 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 56, "unkn2": 23, "x": 88, "y": 216, "name": "Sand Canyon 2 - 5 Exit 3", "access_rule": []}], "entity_load": [[80, 16], [78, 16], [81, 16], [83, 16], [79, 16], [82, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))"], "music": 21}, {"name": "Sand Canyon 2 - 6", "level": 3, "stage": 2, "room": 6, "pointer": 3800612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 5, "unkn1": 17, "unkn2": 13, "x": 1144, "y": 248, "name": "Sand Canyon 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 15 (Nidoo)"], "music": 21}, {"name": "Sand Canyon 2 - 7", "level": 3, "stage": 2, "room": 7, "pointer": 3073888, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 15, "unkn2": 8, "x": 1016, "y": 296, "name": "Sand Canyon 2 - 7 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 5, "unkn2": 13, "x": 904, "y": 376, "name": "Sand Canyon 2 - 7 Exit 1", "access_rule": []}], "entity_load": [[15, 19]], "locations": [], "music": 21}, {"name": "Sand Canyon 2 - 8", "level": 3, "stage": 2, "room": 8, "pointer": 3061270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 5, "unkn1": 19, "unkn2": 13, "x": 1256, "y": 376, "name": "Sand Canyon 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 16 (Mariel)"], "music": 21}, {"name": "Sand Canyon 2 - 9", "level": 3, "stage": 2, "room": 9, "pointer": 3453286, "animal_pointers": [], "consumables": [{"idx": 51, "pointer": 240, "x": 1408, "y": 216, "etype": 22, "vtype": 2, "name": "Sand Canyon 2 - Maxim Tomato (Underwater)"}], "consumables_pointer": 128, "enemies": ["Yaban", "Wapod", "Squishy", "Pteran"], "default_exits": [{"room": 10, "unkn1": 246, "unkn2": 10, "x": 56, "y": 152, "name": "Sand Canyon 2 - 9 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [22, 16], [2, 22], [39, 16], [88, 16], [32, 16]], "locations": ["Sand Canyon 2 - Enemy 17 (Yaban)", "Sand Canyon 2 - Enemy 18 (Wapod)", "Sand Canyon 2 - Enemy 19 (Squishy)", "Sand Canyon 2 - Enemy 20 (Pteran)", "Sand Canyon 2 - Maxim Tomato (Underwater)"], "music": 21}, {"name": "Sand Canyon 2 - 10", "level": 3, "stage": 2, "room": 10, "pointer": 2994821, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 2 - 10 Exit 0", "access_rule": []}], "entity_load": [[15, 19], [42, 19]], "locations": ["Sand Canyon 2 - Auntie"], "music": 8}, {"name": "Sand Canyon 2 - 11", "level": 3, "stage": 2, "room": 11, "pointer": 2891799, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 2 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 0", "level": 3, "stage": 3, "room": 0, "pointer": 3544676, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Broom Hatter", "Rocky", "Gabon"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 57, "x": 104, "y": 152, "name": "Sand Canyon 3 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 11, "unkn2": 57, "x": 200, "y": 152, "name": "Sand Canyon 3 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 16, "unkn2": 57, "x": 296, "y": 152, "name": "Sand Canyon 3 - 0 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 23, "unkn2": 109, "x": 104, "y": 72, "name": "Sand Canyon 3 - 0 Exit 3", "access_rule": []}], "entity_load": [[24, 16], [3, 16], [11, 16], [27, 16]], "locations": ["Sand Canyon 3 - Enemy 1 (Sir Kibble)", "Sand Canyon 3 - Enemy 2 (Broom Hatter)", "Sand Canyon 3 - Enemy 3 (Rocky)", "Sand Canyon 3 - Enemy 4 (Gabon)"], "music": 16}, {"name": "Sand Canyon 3 - 1", "level": 3, "stage": 3, "room": 1, "pointer": 2965655, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 88, "y": 920, "name": "Sand Canyon 3 - 1 Exit 0", "access_rule": []}, {"room": 0, "unkn1": 11, "unkn2": 9, "x": 168, "y": 920, "name": "Sand Canyon 3 - 1 Exit 1", "access_rule": []}, {"room": 0, "unkn1": 17, "unkn2": 9, "x": 248, "y": 920, "name": "Sand Canyon 3 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 3 - Animal 1", "Sand Canyon 3 - Animal 2", "Sand Canyon 3 - Animal 3"], "music": 39}, {"name": "Sand Canyon 3 - 2", "level": 3, "stage": 3, "room": 2, "pointer": 3726270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 3, "unkn1": 184, "unkn2": 20, "x": 104, "y": 232, "name": "Sand Canyon 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[63, 16], [55, 16], [14, 23], [4, 23], [29, 16]], "locations": ["Sand Canyon 3 - Enemy 5 (Kany)"], "music": 16}, {"name": "Sand Canyon 3 - 3", "level": 3, "stage": 3, "room": 3, "pointer": 3416806, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 8, "unkn1": 130, "unkn2": 14, "x": 40, "y": 152, "name": "Sand Canyon 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [6, 23], [5, 23]], "locations": ["Sand Canyon 3 - Enemy 6 (Galbo)"], "music": 16}, {"name": "Sand Canyon 3 - 4", "level": 3, "stage": 3, "room": 4, "pointer": 3564419, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Sasuke"], "default_exits": [{"room": 5, "unkn1": 135, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[68, 16], [30, 16], [14, 23], [89, 16], [24, 16]], "locations": ["Sand Canyon 3 - Enemy 7 (Propeller)", "Sand Canyon 3 - Enemy 8 (Sasuke)"], "music": 16}, {"name": "Sand Canyon 3 - 5", "level": 3, "stage": 3, "room": 5, "pointer": 2973891, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": ["Sand Canyon 3 - Caramello"], "music": 8}, {"name": "Sand Canyon 3 - 6", "level": 3, "stage": 3, "room": 6, "pointer": 3247969, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod", "Bobo", "Babut", "Magoo"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 8, "x": 88, "y": 424, "name": "Sand Canyon 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[53, 16], [88, 16], [46, 16], [47, 16], [5, 16], [43, 16]], "locations": ["Sand Canyon 3 - Enemy 9 (Wapod)", "Sand Canyon 3 - Enemy 10 (Bobo)", "Sand Canyon 3 - Enemy 11 (Babut)", "Sand Canyon 3 - Enemy 12 (Magoo)"], "music": 16}, {"name": "Sand Canyon 3 - 7", "level": 3, "stage": 3, "room": 7, "pointer": 2887702, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 3 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 8", "level": 3, "stage": 3, "room": 8, "pointer": 2968057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 104, "y": 120, "name": "Sand Canyon 3 - 8 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": [], "music": 31}, {"name": "Sand Canyon 4 - 0", "level": 3, "stage": 4, "room": 0, "pointer": 3521954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Popon Ball", "Mariel", "Chilly"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 8, "x": 216, "y": 88, "name": "Sand Canyon 4 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 199, "unkn2": 15, "x": 104, "y": 88, "name": "Sand Canyon 4 - 0 Exit 1", "access_rule": []}], "entity_load": [[6, 16], [45, 16], [6, 23], [50, 16], [14, 23]], "locations": ["Sand Canyon 4 - Enemy 1 (Popon Ball)", "Sand Canyon 4 - Enemy 2 (Mariel)", "Sand Canyon 4 - Enemy 3 (Chilly)"], "music": 18}, {"name": "Sand Canyon 4 - 1", "level": 3, "stage": 4, "room": 1, "pointer": 2956289, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 5, "x": 1544, "y": 136, "name": "Sand Canyon 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 4 - Animal 1", "Sand Canyon 4 - Animal 2", "Sand Canyon 4 - Animal 3"], "music": 39}, {"name": "Sand Canyon 4 - 2", "level": 3, "stage": 4, "room": 2, "pointer": 3505360, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 328, "x": 2024, "y": 72, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Pacto)"}], "consumables_pointer": 160, "enemies": ["Tick", "Bronto Burt", "Babut"], "default_exits": [{"room": 3, "unkn1": 149, "unkn2": 14, "x": 88, "y": 216, "name": "Sand Canyon 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [2, 22], [43, 16], [2, 16], [48, 16]], "locations": ["Sand Canyon 4 - Enemy 4 (Tick)", "Sand Canyon 4 - Enemy 5 (Bronto Burt)", "Sand Canyon 4 - Enemy 6 (Babut)", "Sand Canyon 4 - Maxim Tomato (Pacto)"], "music": 18}, {"name": "Sand Canyon 4 - 3", "level": 3, "stage": 4, "room": 3, "pointer": 3412361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Joe", "Mony", "Blipper"], "default_exits": [{"room": 4, "unkn1": 115, "unkn2": 6, "x": 776, "y": 120, "name": "Sand Canyon 4 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 29, "unkn2": 8, "x": 72, "y": 88, "name": "Sand Canyon 4 - 3 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 105, "unkn2": 14, "x": 104, "y": 216, "name": "Sand Canyon 4 - 3 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 115, "unkn2": 20, "x": 776, "y": 248, "name": "Sand Canyon 4 - 3 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 64, "unkn2": 21, "x": 408, "y": 232, "name": "Sand Canyon 4 - 3 Exit 4", "access_rule": []}], "entity_load": [[73, 16], [20, 16], [91, 16], [14, 23], [21, 16]], "locations": ["Sand Canyon 4 - Enemy 7 (Bobin)", "Sand Canyon 4 - Enemy 8 (Joe)", "Sand Canyon 4 - Enemy 9 (Mony)", "Sand Canyon 4 - Enemy 10 (Blipper)"], "music": 18}, {"name": "Sand Canyon 4 - 4", "level": 3, "stage": 4, "room": 4, "pointer": 3307804, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 60, "unkn2": 6, "x": 88, "y": 104, "name": "Sand Canyon 4 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 60, "unkn2": 16, "x": 88, "y": 360, "name": "Sand Canyon 4 - 4 Exit 1", "access_rule": []}], "entity_load": [[21, 16], [20, 16], [91, 16], [73, 16]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 5", "level": 3, "stage": 4, "room": 5, "pointer": 2955407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 16, "unkn2": 13, "x": 88, "y": 232, "name": "Sand Canyon 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Sand Canyon 4 - Miniboss 1 (Haboki)"], "music": 4}, {"name": "Sand Canyon 4 - 6", "level": 3, "stage": 4, "room": 6, "pointer": 3094851, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 6, "x": 56, "y": 56, "name": "Sand Canyon 4 - 6 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 14, "x": 56, "y": 104, "name": "Sand Canyon 4 - 6 Exit 1", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 22, "x": 56, "y": 152, "name": "Sand Canyon 4 - 6 Exit 2", "access_rule": []}], "entity_load": [[17, 19], [4, 23], [5, 23]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 7", "level": 3, "stage": 4, "room": 7, "pointer": 3483428, "animal_pointers": [], "consumables": [{"idx": 25, "pointer": 200, "x": 344, "y": 144, "etype": 22, "vtype": 0, "name": "Sand Canyon 4 - 1-Up (Clean)"}, {"idx": 26, "pointer": 336, "x": 1656, "y": 144, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Needle)"}], "consumables_pointer": 128, "enemies": ["Togezo", "Rocky", "Bobo"], "default_exits": [{"room": 8, "unkn1": 266, "unkn2": 9, "x": 56, "y": 152, "name": "Sand Canyon 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [3, 16], [14, 23], [5, 16], [2, 16], [18, 16], [0, 22], [2, 22]], "locations": ["Sand Canyon 4 - Enemy 11 (Togezo)", "Sand Canyon 4 - Enemy 12 (Rocky)", "Sand Canyon 4 - Enemy 13 (Bobo)", "Sand Canyon 4 - 1-Up (Clean)", "Sand Canyon 4 - Maxim Tomato (Needle)"], "music": 18}, {"name": "Sand Canyon 4 - 8", "level": 3, "stage": 4, "room": 8, "pointer": 3002086, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[17, 19], [42, 19]], "locations": ["Sand Canyon 4 - Donbe & Hikari"], "music": 8}, {"name": "Sand Canyon 4 - 9", "level": 3, "stage": 4, "room": 9, "pointer": 2885774, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 4 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 0", "level": 3, "stage": 5, "room": 0, "pointer": 3662486, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 450, "x": 2256, "y": 232, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Falling Block)"}], "consumables_pointer": 208, "enemies": ["Wapod", "Dogon", "Tick"], "default_exits": [{"room": 3, "unkn1": 151, "unkn2": 15, "x": 184, "y": 56, "name": "Sand Canyon 5 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 83, "unkn2": 16, "x": 72, "y": 120, "name": "Sand Canyon 5 - 0 Exit 1", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [0, 22], [14, 23], [90, 16], [88, 16]], "locations": ["Sand Canyon 5 - Enemy 1 (Wapod)", "Sand Canyon 5 - Enemy 2 (Dogon)", "Sand Canyon 5 - Enemy 3 (Tick)", "Sand Canyon 5 - 1-Up (Falling Block)"], "music": 13}, {"name": "Sand Canyon 5 - 1", "level": 3, "stage": 5, "room": 1, "pointer": 3052622, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "Bobo", "Chilly", "Sparky", "Togezo"], "default_exits": [{"room": 9, "unkn1": 6, "unkn2": 9, "x": 216, "y": 1128, "name": "Sand Canyon 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [6, 16], [3, 16], [8, 16], [18, 16]], "locations": ["Sand Canyon 5 - Enemy 4 (Rocky)", "Sand Canyon 5 - Enemy 5 (Bobo)", "Sand Canyon 5 - Enemy 6 (Chilly)", "Sand Canyon 5 - Enemy 7 (Sparky)", "Sand Canyon 5 - Enemy 8 (Togezo)"], "music": 13}, {"name": "Sand Canyon 5 - 2", "level": 3, "stage": 5, "room": 2, "pointer": 3057544, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 3, "unkn2": 7, "x": 1320, "y": 264, "name": "Sand Canyon 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 1"], "music": 40}, {"name": "Sand Canyon 5 - 3", "level": 3, "stage": 5, "room": 3, "pointer": 3419011, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 192, "x": 56, "y": 648, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 2)"}, {"idx": 14, "pointer": 200, "x": 56, "y": 664, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 3)"}, {"idx": 15, "pointer": 208, "x": 56, "y": 632, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 1)"}, {"idx": 12, "pointer": 368, "x": 320, "y": 264, "etype": 22, "vtype": 2, "name": "Sand Canyon 5 - Maxim Tomato (Pit)"}], "consumables_pointer": 304, "enemies": ["Bronto Burt", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 66, "x": 88, "y": 88, "name": "Sand Canyon 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [30, 16], [2, 16], [0, 22], [2, 22], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 9 (Bronto Burt)", "Sand Canyon 5 - Enemy 10 (Sasuke)", "Sand Canyon 5 - 1-Up (Ice 2)", "Sand Canyon 5 - 1-Up (Ice 3)", "Sand Canyon 5 - 1-Up (Ice 1)", "Sand Canyon 5 - Maxim Tomato (Pit)"], "music": 13}, {"name": "Sand Canyon 5 - 4", "level": 3, "stage": 5, "room": 4, "pointer": 3644149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro", "Galbo", "Nidoo"], "default_exits": [{"room": 5, "unkn1": 76, "unkn2": 9, "x": 88, "y": 120, "name": "Sand Canyon 5 - 4 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 116, "unkn2": 14, "x": 200, "y": 1256, "name": "Sand Canyon 5 - 4 Exit 1", "access_rule": []}], "entity_load": [[54, 16], [26, 16], [28, 16], [25, 16], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 11 (Oro)", "Sand Canyon 5 - Enemy 12 (Galbo)", "Sand Canyon 5 - Enemy 13 (Nidoo)"], "music": 13}, {"name": "Sand Canyon 5 - 5", "level": 3, "stage": 5, "room": 5, "pointer": 3044100, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 7, "x": 1240, "y": 152, "name": "Sand Canyon 5 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 2"], "music": 39}, {"name": "Sand Canyon 5 - 6", "level": 3, "stage": 5, "room": 6, "pointer": 3373481, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 25, "unkn2": 5, "x": 56, "y": 152, "name": "Sand Canyon 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [31, 16], [89, 16], [6, 16]], "locations": ["Sand Canyon 5 - Enemy 14 (Propeller)"], "music": 13}, {"name": "Sand Canyon 5 - 7", "level": 3, "stage": 5, "room": 7, "pointer": 2964028, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[18, 19], [42, 19]], "locations": ["Sand Canyon 5 - Nyupun"], "music": 8}, {"name": "Sand Canyon 5 - 8", "level": 3, "stage": 5, "room": 8, "pointer": 2890112, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 5 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 9", "level": 3, "stage": 5, "room": 9, "pointer": 3647264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "KeKe", "Kabu"], "default_exits": [{"room": 6, "unkn1": 12, "unkn2": 6, "x": 72, "y": 760, "name": "Sand Canyon 5 - 9 Exit 0", "access_rule": ["Cutter"]}, {"room": 1, "unkn1": 12, "unkn2": 70, "x": 120, "y": 152, "name": "Sand Canyon 5 - 9 Exit 1", "access_rule": []}], "entity_load": [[27, 16], [61, 16], [4, 22], [14, 23], [51, 16], [19, 16]], "locations": ["Sand Canyon 5 - Enemy 15 (Sir Kibble)", "Sand Canyon 5 - Enemy 16 (KeKe)", "Sand Canyon 5 - Enemy 17 (Kabu)"], "music": 13}, {"name": "Sand Canyon 6 - 0", "level": 3, "stage": 6, "room": 0, "pointer": 3314761, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Doka", "Cappy", "Pteran"], "default_exits": [{"room": 2, "unkn1": 132, "unkn2": 16, "x": 56, "y": 136, "name": "Sand Canyon 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [35, 16], [39, 16], [12, 16]], "locations": ["Sand Canyon 6 - Enemy 1 (Sparky)", "Sand Canyon 6 - Enemy 2 (Doka)", "Sand Canyon 6 - Enemy 3 (Cappy)", "Sand Canyon 6 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Sand Canyon 6 - 1", "level": 3, "stage": 6, "room": 1, "pointer": 2976913, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 24, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 1", "Sand Canyon 6 - Animal 2", "Sand Canyon 6 - Animal 3"], "music": 39}, {"name": "Sand Canyon 6 - 2", "level": 3, "stage": 6, "room": 2, "pointer": 2978757, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 55, "unkn2": 6, "x": 104, "y": 104, "name": "Sand Canyon 6 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 3", "level": 3, "stage": 6, "room": 3, "pointer": 3178082, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 3 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 3 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 3 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 3 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 3 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 3 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 4", "level": 3, "stage": 6, "room": 4, "pointer": 3181563, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 4 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 4 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 4 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 4 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 4 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 4 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 5", "level": 3, "stage": 6, "room": 5, "pointer": 3177209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 5 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 5 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 5 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 5 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 5 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 5 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 6", "level": 3, "stage": 6, "room": 6, "pointer": 3183291, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 6 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 6 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 6 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 6 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 6 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 6 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 7", "level": 3, "stage": 6, "room": 7, "pointer": 3175453, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 7 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 7 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 7 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 7 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 7 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 7 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 8", "level": 3, "stage": 6, "room": 8, "pointer": 3179826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 8 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 8 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 8 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 8 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 8 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 8 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 9", "level": 3, "stage": 6, "room": 9, "pointer": 3176334, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 9 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 9 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 9 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 9 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 9 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 9 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 10", "level": 3, "stage": 6, "room": 10, "pointer": 3178954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 10 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 10 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 10 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 10 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 10 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 10 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 11", "level": 3, "stage": 6, "room": 11, "pointer": 2989149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 37, "unkn2": 6, "x": 88, "y": 264, "name": "Sand Canyon 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[59, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 12", "level": 3, "stage": 6, "room": 12, "pointer": 3015947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 8, "x": 440, "y": 264, "name": "Sand Canyon 6 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 86, "unkn2": 8, "x": 72, "y": 104, "name": "Sand Canyon 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[64, 16], [59, 16], [55, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 13", "level": 3, "stage": 6, "room": 13, "pointer": 2976539, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 55, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 6 - 13 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 14", "level": 3, "stage": 6, "room": 14, "pointer": 3030336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 5, "unkn2": 9, "x": 200, "y": 152, "name": "Sand Canyon 6 - 14 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 35, "unkn2": 9, "x": 152, "y": 392, "name": "Sand Canyon 6 - 14 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 15", "level": 3, "stage": 6, "room": 15, "pointer": 2972361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 13, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 16", "level": 3, "stage": 6, "room": 16, "pointer": 2953186, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 16 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 16 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 17", "level": 3, "stage": 6, "room": 17, "pointer": 2953633, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 17 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 17 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 18", "level": 3, "stage": 6, "room": 18, "pointer": 2991707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 14, "unkn2": 9, "x": 184, "y": 312, "name": "Sand Canyon 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 19", "level": 3, "stage": 6, "room": 19, "pointer": 2974651, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 5, "unkn2": 9, "x": 376, "y": 392, "name": "Sand Canyon 6 - 19 Exit 0", "access_rule": []}, {"room": 20, "unkn1": 35, "unkn2": 9, "x": 88, "y": 152, "name": "Sand Canyon 6 - 19 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 20", "level": 3, "stage": 6, "room": 20, "pointer": 2969638, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 4, "unkn2": 9, "x": 552, "y": 152, "name": "Sand Canyon 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 21", "level": 3, "stage": 6, "room": 21, "pointer": 2976163, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 9, "unkn2": 13, "x": 296, "y": 216, "name": "Sand Canyon 6 - 21 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 4", "Sand Canyon 6 - Animal 5", "Sand Canyon 6 - Animal 6"], "music": 40}, {"name": "Sand Canyon 6 - 22", "level": 3, "stage": 6, "room": 22, "pointer": 2950938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 38, "unkn1": 14, "unkn2": 8, "x": 168, "y": 376, "name": "Sand Canyon 6 - 22 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 9, "unkn2": 13, "x": 376, "y": 216, "name": "Sand Canyon 6 - 22 Exit 1", "access_rule": []}, {"room": 21, "unkn1": 19, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 22 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 23", "level": 3, "stage": 6, "room": 23, "pointer": 3311993, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 43, "unkn1": 145, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 24", "level": 3, "stage": 6, "room": 24, "pointer": 3079078, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 39, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 24 Exit 0", "access_rule": []}, {"room": 25, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 24 Exit 1", "access_rule": []}, {"room": 39, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 24 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 25", "level": 3, "stage": 6, "room": 25, "pointer": 3065898, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 25 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 25 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 25 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 26", "level": 3, "stage": 6, "room": 26, "pointer": 3063347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 26 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 26 Exit 1", "access_rule": []}, {"room": 27, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 26 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 27", "level": 3, "stage": 6, "room": 27, "pointer": 3066916, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 28, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 27 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 27 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 27 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 28", "level": 3, "stage": 6, "room": 28, "pointer": 3067425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 28 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 11, "unkn2": 8, "x": 184, "y": 344, "name": "Sand Canyon 6 - 28 Exit 1", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 28 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 29", "level": 3, "stage": 6, "room": 29, "pointer": 2950032, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 30, "unkn1": 11, "unkn2": 8, "x": 168, "y": 136, "name": "Sand Canyon 6 - 29 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 30", "level": 3, "stage": 6, "room": 30, "pointer": 2986500, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 10, "unkn2": 44, "x": 136, "y": 152, "name": "Sand Canyon 6 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 31", "level": 3, "stage": 6, "room": 31, "pointer": 3070930, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 31 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 648, "name": "Sand Canyon 6 - 31 Exit 1", "access_rule": []}, {"room": 32, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 31 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 32", "level": 3, "stage": 6, "room": 32, "pointer": 3054817, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Parasol)", "Bukiset (Cutter)"], "default_exits": [{"room": 33, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 32 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 536, "name": "Sand Canyon 6 - 32 Exit 1", "access_rule": []}, {"room": 33, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 32 Exit 2", "access_rule": []}], "entity_load": [[81, 16], [83, 16]], "locations": ["Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))"], "music": 14}, {"name": "Sand Canyon 6 - 33", "level": 3, "stage": 6, "room": 33, "pointer": 3053173, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Clean)", "Bukiset (Spark)"], "default_exits": [{"room": 34, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 33 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 440, "name": "Sand Canyon 6 - 33 Exit 1", "access_rule": []}, {"room": 34, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 33 Exit 2", "access_rule": []}], "entity_load": [[80, 16], [82, 16]], "locations": ["Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))"], "music": 14}, {"name": "Sand Canyon 6 - 34", "level": 3, "stage": 6, "room": 34, "pointer": 3053721, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)"], "default_exits": [{"room": 35, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 34 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 344, "name": "Sand Canyon 6 - 34 Exit 1", "access_rule": []}, {"room": 35, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 34 Exit 2", "access_rule": []}], "entity_load": [[79, 16], [78, 16]], "locations": ["Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))"], "music": 14}, {"name": "Sand Canyon 6 - 35", "level": 3, "stage": 6, "room": 35, "pointer": 3054269, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)"], "default_exits": [{"room": 37, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 35 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 248, "name": "Sand Canyon 6 - 35 Exit 1", "access_rule": []}, {"room": 37, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 35 Exit 2", "access_rule": []}], "entity_load": [[77, 16], [76, 16]], "locations": ["Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))"], "music": 14}, {"name": "Sand Canyon 6 - 36", "level": 3, "stage": 6, "room": 36, "pointer": 2986164, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 10, "unkn2": 44, "x": 392, "y": 152, "name": "Sand Canyon 6 - 36 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 37", "level": 3, "stage": 6, "room": 37, "pointer": 3074377, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 152, "name": "Sand Canyon 6 - 37 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 38", "level": 3, "stage": 6, "room": 38, "pointer": 2971589, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 10, "unkn2": 5, "x": 264, "y": 440, "name": "Sand Canyon 6 - 38 Exit 0", "access_rule": []}, {"room": 22, "unkn1": 10, "unkn2": 23, "x": 248, "y": 136, "name": "Sand Canyon 6 - 38 Exit 1", "access_rule": []}], "entity_load": [[76, 16], [77, 16], [78, 16], [79, 16], [80, 16], [81, 16], [82, 16], [83, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 39", "level": 3, "stage": 6, "room": 39, "pointer": 3063858, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 40, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 39 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 39 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 39 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 40", "level": 3, "stage": 6, "room": 40, "pointer": 3064368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 40 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 40 Exit 1", "access_rule": []}, {"room": 41, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 40 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 41", "level": 3, "stage": 6, "room": 41, "pointer": 3064878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 42, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 41 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 41 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 41 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 42", "level": 3, "stage": 6, "room": 42, "pointer": 3068939, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 42 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 42 Exit 1", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Sand Canyon 6 - Enemy 13 (Nidoo)"], "music": 14}, {"name": "Sand Canyon 6 - 43", "level": 3, "stage": 6, "room": 43, "pointer": 2988495, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 44, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 6 - 43 Exit 0", "access_rule": []}], "entity_load": [[19, 19], [42, 19]], "locations": ["Sand Canyon 6 - Professor Hector & R.O.B"], "music": 8}, {"name": "Sand Canyon 6 - 44", "level": 3, "stage": 6, "room": 44, "pointer": 2886979, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 6 - Complete"], "music": 5}, {"name": "Sand Canyon Boss - 0", "level": 3, "stage": 7, "room": 0, "pointer": 2991389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[6, 18]], "locations": ["Sand Canyon - Boss (Pon & Con) Purified", "Level 3 Boss - Defeated", "Level 3 Boss - Purified"], "music": 2}, {"name": "Cloudy Park 1 - 0", "level": 4, "stage": 1, "room": 0, "pointer": 3172795, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "KeKe", "Cappy"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 5, "x": 56, "y": 152, "name": "Cloudy Park 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [12, 16], [51, 16], [1, 23], [0, 23]], "locations": ["Cloudy Park 1 - Enemy 1 (Waddle Dee)", "Cloudy Park 1 - Enemy 2 (KeKe)", "Cloudy Park 1 - Enemy 3 (Cappy)"], "music": 17}, {"name": "Cloudy Park 1 - 1", "level": 4, "stage": 1, "room": 1, "pointer": 3078163, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 88, "y": 424, "name": "Cloudy Park 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 1"], "music": 39}, {"name": "Cloudy Park 1 - 2", "level": 4, "stage": 1, "room": 2, "pointer": 3285882, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Togezo"], "default_exits": [{"room": 3, "unkn1": 95, "unkn2": 8, "x": 40, "y": 104, "name": "Cloudy Park 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [4, 16], [18, 16], [6, 23]], "locations": ["Cloudy Park 1 - Enemy 4 (Yaban)", "Cloudy Park 1 - Enemy 5 (Togezo)"], "music": 17}, {"name": "Cloudy Park 1 - 3", "level": 4, "stage": 1, "room": 3, "pointer": 3062831, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 15, "unkn2": 6, "x": 56, "y": 264, "name": "Cloudy Park 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 2"], "music": 39}, {"name": "Cloudy Park 1 - 4", "level": 4, "stage": 1, "room": 4, "pointer": 3396729, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 92, "unkn2": 16, "x": 56, "y": 152, "name": "Cloudy Park 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [0, 16], [14, 23], [68, 16], [26, 16], [4, 22]], "locations": ["Cloudy Park 1 - Enemy 6 (Galbo)"], "music": 17}, {"name": "Cloudy Park 1 - 5", "level": 4, "stage": 1, "room": 5, "pointer": 3038805, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 6, "unkn2": 5, "x": 2344, "y": 232, "name": "Cloudy Park 1 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 3", "Cloudy Park 1 - Animal 4"], "music": 39}, {"name": "Cloudy Park 1 - 6", "level": 4, "stage": 1, "room": 6, "pointer": 3535736, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Como"], "default_exits": [{"room": 8, "unkn1": 5, "unkn2": 8, "x": 72, "y": 104, "name": "Cloudy Park 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [14, 23], [0, 16], [41, 16], [8, 16]], "locations": ["Cloudy Park 1 - Enemy 7 (Sparky)", "Cloudy Park 1 - Enemy 8 (Como)"], "music": 17}, {"name": "Cloudy Park 1 - 7", "level": 4, "stage": 1, "room": 7, "pointer": 2954080, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 6, "x": 88, "y": 104, "name": "Cloudy Park 1 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 5"], "music": 39}, {"name": "Cloudy Park 1 - 8", "level": 4, "stage": 1, "room": 8, "pointer": 3465407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt"], "default_exits": [{"room": 12, "unkn1": 181, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 1 - 8 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [2, 16], [51, 16], [1, 23], [14, 23]], "locations": ["Cloudy Park 1 - Enemy 9 (Bronto Burt)"], "music": 17}, {"name": "Cloudy Park 1 - 9", "level": 4, "stage": 1, "room": 9, "pointer": 3078621, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 56, "y": 264, "name": "Cloudy Park 1 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 6"], "music": 39}, {"name": "Cloudy Park 1 - 10", "level": 4, "stage": 1, "room": 10, "pointer": 3281366, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Sir Kibble"], "default_exits": [{"room": 9, "unkn1": 99, "unkn2": 8, "x": 56, "y": 152, "name": "Cloudy Park 1 - 10 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [24, 16], [27, 16], [4, 23]], "locations": ["Cloudy Park 1 - Enemy 10 (Gabon)", "Cloudy Park 1 - Enemy 11 (Sir Kibble)"], "music": 17}, {"name": "Cloudy Park 1 - 11", "level": 4, "stage": 1, "room": 11, "pointer": 3519608, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 192, "x": 216, "y": 600, "etype": 22, "vtype": 0, "name": "Cloudy Park 1 - 1-Up (Shotzo)"}, {"idx": 18, "pointer": 456, "x": 856, "y": 408, "etype": 22, "vtype": 2, "name": "Cloudy Park 1 - Maxim Tomato (Mariel)"}], "consumables_pointer": 352, "enemies": ["Mariel", "Nruff"], "default_exits": [{"room": 5, "unkn1": 64, "unkn2": 6, "x": 104, "y": 216, "name": "Cloudy Park 1 - 11 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [27, 16], [15, 16], [45, 16], [14, 23], [2, 22], [0, 22], [6, 22]], "locations": ["Cloudy Park 1 - Enemy 12 (Mariel)", "Cloudy Park 1 - Enemy 13 (Nruff)", "Cloudy Park 1 - 1-Up (Shotzo)", "Cloudy Park 1 - Maxim Tomato (Mariel)"], "music": 17}, {"name": "Cloudy Park 1 - 12", "level": 4, "stage": 1, "room": 12, "pointer": 2958914, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 1 - 12 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [42, 19]], "locations": ["Cloudy Park 1 - Hibanamodoki"], "music": 8}, {"name": "Cloudy Park 1 - 13", "level": 4, "stage": 1, "room": 13, "pointer": 2886015, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 1 - Complete"], "music": 5}, {"name": "Cloudy Park 2 - 0", "level": 4, "stage": 2, "room": 0, "pointer": 3142443, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly", "Sasuke"], "default_exits": [{"room": 6, "unkn1": 96, "unkn2": 7, "x": 56, "y": 88, "name": "Cloudy Park 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16], [30, 16], [6, 16], [14, 23]], "locations": ["Cloudy Park 2 - Enemy 1 (Chilly)", "Cloudy Park 2 - Enemy 2 (Sasuke)"], "music": 19}, {"name": "Cloudy Park 2 - 1", "level": 4, "stage": 2, "room": 1, "pointer": 3235925, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Broom Hatter"], "default_exits": [{"room": 2, "unkn1": 146, "unkn2": 5, "x": 88, "y": 88, "name": "Cloudy Park 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [8, 16], [11, 16]], "locations": ["Cloudy Park 2 - Enemy 3 (Waddle Dee)", "Cloudy Park 2 - Enemy 4 (Sparky)", "Cloudy Park 2 - Enemy 5 (Broom Hatter)"], "music": 19}, {"name": "Cloudy Park 2 - 2", "level": 4, "stage": 2, "room": 2, "pointer": 3297758, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Pteran"], "default_exits": [{"room": 3, "unkn1": 147, "unkn2": 8, "x": 72, "y": 136, "name": "Cloudy Park 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[27, 16], [39, 16], [1, 23]], "locations": ["Cloudy Park 2 - Enemy 6 (Sir Kibble)", "Cloudy Park 2 - Enemy 7 (Pteran)"], "music": 19}, {"name": "Cloudy Park 2 - 3", "level": 4, "stage": 2, "room": 3, "pointer": 3341087, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Dogon"], "default_exits": [{"room": 4, "unkn1": 145, "unkn2": 12, "x": 72, "y": 136, "name": "Cloudy Park 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[4, 16], [14, 23], [90, 16], [89, 16]], "locations": ["Cloudy Park 2 - Enemy 8 (Propeller)", "Cloudy Park 2 - Enemy 9 (Dogon)"], "music": 19}, {"name": "Cloudy Park 2 - 4", "level": 4, "stage": 2, "room": 4, "pointer": 3457404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Oro", "Bronto Burt", "Rocky"], "default_exits": [{"room": 5, "unkn1": 165, "unkn2": 5, "x": 72, "y": 104, "name": "Cloudy Park 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [3, 16], [14, 23], [18, 16], [25, 16]], "locations": ["Cloudy Park 2 - Enemy 10 (Togezo)", "Cloudy Park 2 - Enemy 11 (Oro)", "Cloudy Park 2 - Enemy 12 (Bronto Burt)", "Cloudy Park 2 - Enemy 13 (Rocky)"], "music": 19}, {"name": "Cloudy Park 2 - 5", "level": 4, "stage": 2, "room": 5, "pointer": 3273878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Kapar"], "default_exits": [{"room": 7, "unkn1": 96, "unkn2": 8, "x": 56, "y": 88, "name": "Cloudy Park 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [62, 16], [26, 16], [67, 16]], "locations": ["Cloudy Park 2 - Enemy 14 (Galbo)", "Cloudy Park 2 - Enemy 15 (Kapar)"], "music": 19}, {"name": "Cloudy Park 2 - 6", "level": 4, "stage": 2, "room": 6, "pointer": 2984453, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 25, "unkn2": 5, "x": 72, "y": 152, "name": "Cloudy Park 2 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 2 - Animal 1", "Cloudy Park 2 - Animal 2", "Cloudy Park 2 - Animal 3"], "music": 38}, {"name": "Cloudy Park 2 - 7", "level": 4, "stage": 2, "room": 7, "pointer": 2985482, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 5, "x": 40, "y": 88, "name": "Cloudy Park 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[22, 19]], "locations": [], "music": 19}, {"name": "Cloudy Park 2 - 8", "level": 4, "stage": 2, "room": 8, "pointer": 2990753, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[22, 19], [42, 19]], "locations": ["Cloudy Park 2 - Piyo & Keko"], "music": 8}, {"name": "Cloudy Park 2 - 9", "level": 4, "stage": 2, "room": 9, "pointer": 2889630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 2 - Complete"], "music": 5}, {"name": "Cloudy Park 3 - 0", "level": 4, "stage": 3, "room": 0, "pointer": 3100859, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Mopoo", "Poppy Bros Jr."], "default_exits": [{"room": 2, "unkn1": 145, "unkn2": 8, "x": 56, "y": 136, "name": "Cloudy Park 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [74, 16], [47, 16], [7, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 1 (Bronto Burt)", "Cloudy Park 3 - Enemy 2 (Mopoo)", "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)"], "music": 15}, {"name": "Cloudy Park 3 - 1", "level": 4, "stage": 3, "room": 1, "pointer": 3209719, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como"], "default_exits": [{"room": 5, "unkn1": 13, "unkn2": 14, "x": 56, "y": 152, "name": "Cloudy Park 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [4, 22], [41, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 4 (Como)"], "music": 15}, {"name": "Cloudy Park 3 - 2", "level": 4, "stage": 3, "room": 2, "pointer": 3216185, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Bobin", "Loud", "Kapar"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 6, "x": 216, "y": 1064, "name": "Cloudy Park 3 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 24, "unkn2": 14, "x": 104, "y": 152, "name": "Cloudy Park 3 - 2 Exit 1", "access_rule": []}], "entity_load": [[67, 16], [40, 16], [73, 16], [14, 23], [16, 16]], "locations": ["Cloudy Park 3 - Enemy 5 (Glunk)", "Cloudy Park 3 - Enemy 6 (Bobin)", "Cloudy Park 3 - Enemy 7 (Loud)", "Cloudy Park 3 - Enemy 8 (Kapar)"], "music": 15}, {"name": "Cloudy Park 3 - 3", "level": 4, "stage": 3, "room": 3, "pointer": 2994208, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 5, "unkn2": 9, "x": 408, "y": 232, "name": "Cloudy Park 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 3 - Animal 1", "Cloudy Park 3 - Animal 2", "Cloudy Park 3 - Animal 3"], "music": 40}, {"name": "Cloudy Park 3 - 4", "level": 4, "stage": 3, "room": 4, "pointer": 3229151, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Batamon", "Bouncy"], "default_exits": [{"room": 6, "unkn1": 156, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 126, "unkn2": 9, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 1", "access_rule": []}], "entity_load": [[7, 16], [26, 16], [14, 23], [13, 16], [68, 16]], "locations": ["Cloudy Park 3 - Enemy 9 (Galbo)", "Cloudy Park 3 - Enemy 10 (Batamon)", "Cloudy Park 3 - Enemy 11 (Bouncy)"], "music": 15}, {"name": "Cloudy Park 3 - 5", "level": 4, "stage": 3, "room": 5, "pointer": 2969244, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": [], "music": 31}, {"name": "Cloudy Park 3 - 6", "level": 4, "stage": 3, "room": 6, "pointer": 4128530, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": ["Cloudy Park 3 - Mr. Ball"], "music": 8}, {"name": "Cloudy Park 3 - 7", "level": 4, "stage": 3, "room": 7, "pointer": 2885051, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 3 - Complete"], "music": 5}, {"name": "Cloudy Park 4 - 0", "level": 4, "stage": 4, "room": 0, "pointer": 3072905, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[4, 23], [1, 23], [0, 23], [31, 16]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 1", "level": 4, "stage": 4, "room": 1, "pointer": 3074863, "animal_pointers": [208, 224], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 21, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 4 - Animal 1", "Cloudy Park 4 - Animal 2"], "music": 38}, {"name": "Cloudy Park 4 - 2", "level": 4, "stage": 4, "room": 2, "pointer": 3309209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Como", "Wapod", "Cappy"], "default_exits": [{"room": 3, "unkn1": 145, "unkn2": 9, "x": 104, "y": 152, "name": "Cloudy Park 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [24, 16], [12, 16], [14, 23], [41, 16], [4, 22]], "locations": ["Cloudy Park 4 - Enemy 1 (Gabon)", "Cloudy Park 4 - Enemy 2 (Como)", "Cloudy Park 4 - Enemy 3 (Wapod)", "Cloudy Park 4 - Enemy 4 (Cappy)"], "music": 21}, {"name": "Cloudy Park 4 - 3", "level": 4, "stage": 4, "room": 3, "pointer": 3296291, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 776, "x": 1880, "y": 152, "etype": 22, "vtype": 0, "name": "Cloudy Park 4 - 1-Up (Windy)"}, {"idx": 34, "pointer": 912, "x": 2160, "y": 152, "etype": 22, "vtype": 2, "name": "Cloudy Park 4 - Maxim Tomato (Windy)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Togezo"], "default_exits": [{"room": 5, "unkn1": 144, "unkn2": 9, "x": 56, "y": 136, "name": "Cloudy Park 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[18, 16], [8, 16], [31, 16], [14, 23], [4, 22], [4, 16], [0, 22], [2, 22]], "locations": ["Cloudy Park 4 - Enemy 5 (Sparky)", "Cloudy Park 4 - Enemy 6 (Togezo)", "Cloudy Park 4 - 1-Up (Windy)", "Cloudy Park 4 - Maxim Tomato (Windy)"], "music": 21}, {"name": "Cloudy Park 4 - 4", "level": 4, "stage": 4, "room": 4, "pointer": 3330996, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "KeKe", "Bouncy"], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 15, "x": 72, "y": 152, "name": "Cloudy Park 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [51, 16], [17, 16], [14, 23], [2, 16]], "locations": ["Cloudy Park 4 - Enemy 7 (Bronto Burt)", "Cloudy Park 4 - Enemy 8 (KeKe)", "Cloudy Park 4 - Enemy 9 (Bouncy)"], "music": 21}, {"name": "Cloudy Park 4 - 5", "level": 4, "stage": 4, "room": 5, "pointer": 3332300, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Mariel"], "default_exits": [{"room": 4, "unkn1": 21, "unkn2": 51, "x": 2328, "y": 120, "name": "Cloudy Park 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [46, 16], [27, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 10 (Sir Kibble)", "Cloudy Park 4 - Enemy 11 (Mariel)"], "music": 21}, {"name": "Cloudy Park 4 - 6", "level": 4, "stage": 4, "room": 6, "pointer": 3253310, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu", "Wappa"], "default_exits": [{"room": 9, "unkn1": 3, "unkn2": 6, "x": 72, "y": 152, "name": "Cloudy Park 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [31, 16], [19, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 12 (Kabu)", "Cloudy Park 4 - Enemy 13 (Wappa)"], "music": 21}, {"name": "Cloudy Park 4 - 7", "level": 4, "stage": 4, "room": 7, "pointer": 2967658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 12, "unkn2": 9, "x": 152, "y": 120, "name": "Cloudy Park 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Cloudy Park 4 - Miniboss 1 (Jumper Shoot)"], "music": 4}, {"name": "Cloudy Park 4 - 8", "level": 4, "stage": 4, "room": 8, "pointer": 2981644, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 344, "y": 680, "name": "Cloudy Park 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[24, 19]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 9", "level": 4, "stage": 4, "room": 9, "pointer": 3008001, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[24, 19], [42, 19]], "locations": ["Cloudy Park 4 - Mikarin & Kagami Mocchi"], "music": 8}, {"name": "Cloudy Park 4 - 10", "level": 4, "stage": 4, "room": 10, "pointer": 2888184, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 4 - Complete"], "music": 5}, {"name": "Cloudy Park 5 - 0", "level": 4, "stage": 5, "room": 0, "pointer": 3192630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Sir Kibble", "Cappy", "Wappa"], "default_exits": [{"room": 1, "unkn1": 146, "unkn2": 6, "x": 168, "y": 616, "name": "Cloudy Park 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [27, 16], [44, 16], [12, 16], [14, 23]], "locations": ["Cloudy Park 5 - Enemy 1 (Yaban)", "Cloudy Park 5 - Enemy 2 (Sir Kibble)", "Cloudy Park 5 - Enemy 3 (Cappy)", "Cloudy Park 5 - Enemy 4 (Wappa)"], "music": 17}, {"name": "Cloudy Park 5 - 1", "level": 4, "stage": 5, "room": 1, "pointer": 3050956, "animal_pointers": [], "consumables": [{"idx": 5, "pointer": 264, "x": 480, "y": 720, "etype": 22, "vtype": 2, "name": "Cloudy Park 5 - Maxim Tomato (Pillars)"}], "consumables_pointer": 288, "enemies": ["Galbo", "Bronto Burt", "KeKe"], "default_exits": [{"room": 2, "unkn1": 32, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [51, 16], [26, 16], [14, 23], [2, 22]], "locations": ["Cloudy Park 5 - Enemy 5 (Galbo)", "Cloudy Park 5 - Enemy 6 (Bronto Burt)", "Cloudy Park 5 - Enemy 7 (KeKe)", "Cloudy Park 5 - Maxim Tomato (Pillars)"], "music": 17}, {"name": "Cloudy Park 5 - 2", "level": 4, "stage": 5, "room": 2, "pointer": 3604194, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 17, "unkn2": 9, "x": 72, "y": 88, "name": "Cloudy Park 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 5 - Animal 1", "Cloudy Park 5 - Animal 2"], "music": 40}, {"name": "Cloudy Park 5 - 3", "level": 4, "stage": 5, "room": 3, "pointer": 3131242, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Klinko"], "default_exits": [{"room": 4, "unkn1": 98, "unkn2": 5, "x": 72, "y": 120, "name": "Cloudy Park 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [4, 16], [42, 16], [4, 23]], "locations": ["Cloudy Park 5 - Enemy 8 (Propeller)", "Cloudy Park 5 - Enemy 9 (Klinko)"], "music": 17}, {"name": "Cloudy Park 5 - 4", "level": 4, "stage": 5, "room": 4, "pointer": 2990116, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 23, "unkn2": 7, "x": 216, "y": 744, "name": "Cloudy Park 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[88, 16]], "locations": ["Cloudy Park 5 - Enemy 10 (Wapod)"], "music": 17}, {"name": "Cloudy Park 5 - 5", "level": 4, "stage": 5, "room": 5, "pointer": 2975410, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 4, "x": 104, "y": 296, "name": "Cloudy Park 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [2, 16]], "locations": [], "music": 17}, {"name": "Cloudy Park 5 - 6", "level": 4, "stage": 5, "room": 6, "pointer": 3173683, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 7, "unkn1": 115, "unkn2": 6, "x": 56, "y": 136, "name": "Cloudy Park 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [1, 23], [39, 16], [70, 16]], "locations": ["Cloudy Park 5 - Enemy 11 (Pteran)"], "music": 17}, {"name": "Cloudy Park 5 - 7", "level": 4, "stage": 5, "room": 7, "pointer": 2992340, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[25, 19], [42, 19]], "locations": ["Cloudy Park 5 - Pick"], "music": 8}, {"name": "Cloudy Park 5 - 8", "level": 4, "stage": 5, "room": 8, "pointer": 2891558, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 5 - Complete"], "music": 5}, {"name": "Cloudy Park 6 - 0", "level": 4, "stage": 6, "room": 0, "pointer": 3269847, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 1", "level": 4, "stage": 6, "room": 1, "pointer": 3252248, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 3, "unkn2": 25, "x": 72, "y": 72, "name": "Cloudy Park 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [55, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 2", "level": 4, "stage": 6, "room": 2, "pointer": 3028494, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 0, "unkn1": 4, "unkn2": 9, "x": 1032, "y": 152, "name": "Cloudy Park 6 - 2 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 13, "unkn2": 9, "x": 56, "y": 72, "name": "Cloudy Park 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 1 (Madoo)"], "music": 11}, {"name": "Cloudy Park 6 - 3", "level": 4, "stage": 6, "room": 3, "pointer": 3131911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 3 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 3 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 3 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 3 Exit 3", "access_rule": []}, {"room": 10, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 3 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 4", "level": 4, "stage": 6, "room": 4, "pointer": 3115416, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick", "Como"], "default_exits": [{"room": 8, "unkn1": 20, "unkn2": 4, "x": 72, "y": 488, "name": "Cloudy Park 6 - 4 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 4 Exit 1", "access_rule": []}, {"room": 11, "unkn1": 8, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 12, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 4 Exit 3", "access_rule": []}, {"room": 11, "unkn1": 16, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 4 Exit 4", "access_rule": []}, {"room": 11, "unkn1": 20, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 4 Exit 5", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [41, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 2 (Tick)", "Cloudy Park 6 - Enemy 3 (Como)"], "music": 11}, {"name": "Cloudy Park 6 - 5", "level": 4, "stage": 6, "room": 5, "pointer": 3245809, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 15, "unkn1": 65, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16], [14, 23], [4, 22]], "locations": ["Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)"], "music": 11}, {"name": "Cloudy Park 6 - 6", "level": 4, "stage": 6, "room": 6, "pointer": 3237044, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 56, "unkn2": 9, "x": 72, "y": 136, "name": "Cloudy Park 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[89, 16]], "locations": ["Cloudy Park 6 - Enemy 7 (Propeller)"], "music": 11}, {"name": "Cloudy Park 6 - 7", "level": 4, "stage": 6, "room": 7, "pointer": 3262705, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo"], "default_exits": [{"room": 13, "unkn1": 12, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 57, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 64, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 6 - 7 Exit 2", "access_rule": []}], "entity_load": [[74, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 8 (Mopoo)"], "music": 11}, {"name": "Cloudy Park 6 - 8", "level": 4, "stage": 6, "room": 8, "pointer": 3027259, "animal_pointers": [], "consumables": [{"idx": 22, "pointer": 312, "x": 224, "y": 256, "etype": 22, "vtype": 0, "name": "Cloudy Park 6 - 1-Up (Cutter)"}], "consumables_pointer": 304, "enemies": ["Bukiset (Burning)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Cutter)"], "default_exits": [{"room": 12, "unkn1": 13, "unkn2": 4, "x": 88, "y": 152, "name": "Cloudy Park 6 - 8 Exit 0", "access_rule": []}], "entity_load": [[78, 16], [80, 16], [76, 16], [79, 16], [83, 16], [14, 23], [4, 22], [0, 22]], "locations": ["Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", "Cloudy Park 6 - 1-Up (Cutter)"], "music": 11}, {"name": "Cloudy Park 6 - 9", "level": 4, "stage": 6, "room": 9, "pointer": 3089504, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 35, "unkn2": 7, "x": 72, "y": 72, "name": "Cloudy Park 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[41, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 10", "level": 4, "stage": 6, "room": 10, "pointer": 3132579, "animal_pointers": [242, 250, 258], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 20, "unkn2": 4, "x": 72, "y": 152, "name": "Cloudy Park 6 - 10 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 4, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 10 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 10 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 10 Exit 3", "access_rule": []}, {"room": 3, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 10 Exit 4", "access_rule": []}, {"room": 3, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 10 Exit 5", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 6 - Animal 1", "Cloudy Park 6 - Animal 2", "Cloudy Park 6 - Animal 3"], "music": 40}, {"name": "Cloudy Park 6 - 11", "level": 4, "stage": 6, "room": 11, "pointer": 3017866, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 11 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 8, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 11 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 12, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 11 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 16, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 11 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 20, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 11 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 12", "level": 4, "stage": 6, "room": 12, "pointer": 3036404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 9, "x": 200, "y": 72, "name": "Cloudy Park 6 - 12 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 13, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 13", "level": 4, "stage": 6, "room": 13, "pointer": 2965251, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 216, "y": 136, "name": "Cloudy Park 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[26, 19]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 14", "level": 4, "stage": 6, "room": 14, "pointer": 3077236, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 936, "y": 136, "name": "Cloudy Park 6 - 14 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 15", "level": 4, "stage": 6, "room": 15, "pointer": 3061794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[26, 19], [42, 19]], "locations": ["Cloudy Park 6 - HB-007"], "music": 8}, {"name": "Cloudy Park 6 - 16", "level": 4, "stage": 6, "room": 16, "pointer": 2888907, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 6 - Complete"], "music": 5}, {"name": "Cloudy Park Boss - 0", "level": 4, "stage": 7, "room": 0, "pointer": 2998682, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[3, 18]], "locations": ["Cloudy Park - Boss (Ado) Purified", "Level 4 Boss - Defeated", "Level 4 Boss - Purified"], "music": 2}, {"name": "Iceberg 1 - 0", "level": 5, "stage": 1, "room": 0, "pointer": 3363111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Klinko", "KeKe"], "default_exits": [{"room": 1, "unkn1": 104, "unkn2": 8, "x": 312, "y": 1384, "name": "Iceberg 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [0, 16], [51, 16]], "locations": ["Iceberg 1 - Enemy 1 (Waddle Dee)", "Iceberg 1 - Enemy 2 (Klinko)", "Iceberg 1 - Enemy 3 (KeKe)"], "music": 18}, {"name": "Iceberg 1 - 1", "level": 5, "stage": 1, "room": 1, "pointer": 3596524, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Galbo", "Rocky"], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 8, "x": 72, "y": 344, "name": "Iceberg 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [41, 16], [26, 16], [14, 23], [4, 22], [6, 23]], "locations": ["Iceberg 1 - Enemy 4 (Como)", "Iceberg 1 - Enemy 5 (Galbo)", "Iceberg 1 - Enemy 6 (Rocky)"], "music": 18}, {"name": "Iceberg 1 - 2", "level": 5, "stage": 1, "room": 2, "pointer": 3288880, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 3, "unkn1": 49, "unkn2": 9, "x": 184, "y": 152, "name": "Iceberg 1 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 94, "unkn2": 21, "x": 120, "y": 168, "name": "Iceberg 1 - 2 Exit 1", "access_rule": []}], "entity_load": [[28, 19], [46, 16], [47, 16], [17, 16], [67, 16]], "locations": ["Iceberg 1 - Enemy 7 (Kapar)"], "music": 18}, {"name": "Iceberg 1 - 3", "level": 5, "stage": 1, "room": 3, "pointer": 3068439, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 9, "x": 808, "y": 152, "name": "Iceberg 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 1 - Animal 1", "Iceberg 1 - Animal 2"], "music": 38}, {"name": "Iceberg 1 - 4", "level": 5, "stage": 1, "room": 4, "pointer": 3233681, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo", "Babut", "Wappa"], "default_exits": [{"room": 6, "unkn1": 74, "unkn2": 4, "x": 56, "y": 152, "name": "Iceberg 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [43, 16], [74, 16]], "locations": ["Iceberg 1 - Enemy 8 (Mopoo)", "Iceberg 1 - Enemy 9 (Babut)", "Iceberg 1 - Enemy 10 (Wappa)"], "music": 18}, {"name": "Iceberg 1 - 5", "level": 5, "stage": 1, "room": 5, "pointer": 3406133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Chilly", "Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 196, "unkn2": 9, "x": 72, "y": 744, "name": "Iceberg 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [7, 16], [2, 16], [0, 16]], "locations": ["Iceberg 1 - Enemy 11 (Bronto Burt)", "Iceberg 1 - Enemy 12 (Chilly)", "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)"], "music": 18}, {"name": "Iceberg 1 - 6", "level": 5, "stage": 1, "room": 6, "pointer": 2985823, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 19], [42, 19]], "locations": ["Iceberg 1 - Kogoesou"], "music": 8}, {"name": "Iceberg 1 - 7", "level": 5, "stage": 1, "room": 7, "pointer": 2892040, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 1 - Complete"], "music": 5}, {"name": "Iceberg 2 - 0", "level": 5, "stage": 2, "room": 0, "pointer": 3106800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Nruff"], "default_exits": [{"room": 1, "unkn1": 113, "unkn2": 36, "x": 88, "y": 152, "name": "Iceberg 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [24, 16]], "locations": ["Iceberg 2 - Enemy 1 (Gabon)", "Iceberg 2 - Enemy 2 (Nruff)"], "music": 20}, {"name": "Iceberg 2 - 1", "level": 5, "stage": 2, "room": 1, "pointer": 3334841, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Chilly", "Pteran"], "default_exits": [{"room": 2, "unkn1": 109, "unkn2": 20, "x": 88, "y": 72, "name": "Iceberg 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [0, 16], [4, 16], [39, 16]], "locations": ["Iceberg 2 - Enemy 3 (Waddle Dee)", "Iceberg 2 - Enemy 4 (Chilly)", "Iceberg 2 - Enemy 5 (Pteran)"], "music": 20}, {"name": "Iceberg 2 - 2", "level": 5, "stage": 2, "room": 2, "pointer": 3473408, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Galbo", "Babut", "Magoo"], "default_exits": [{"room": 6, "unkn1": 102, "unkn2": 5, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 24, "unkn2": 18, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 37, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 55, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 3", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 4", "access_rule": []}], "entity_load": [[53, 16], [26, 16], [43, 16], [14, 23], [16, 16]], "locations": ["Iceberg 2 - Enemy 6 (Glunk)", "Iceberg 2 - Enemy 7 (Galbo)", "Iceberg 2 - Enemy 8 (Babut)", "Iceberg 2 - Enemy 9 (Magoo)"], "music": 20}, {"name": "Iceberg 2 - 3", "level": 5, "stage": 2, "room": 3, "pointer": 3037006, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 616, "y": 424, "name": "Iceberg 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 4", "level": 5, "stage": 2, "room": 4, "pointer": 3035198, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 904, "y": 424, "name": "Iceberg 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 5", "level": 5, "stage": 2, "room": 5, "pointer": 3128551, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 424, "name": "Iceberg 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": [], "music": 20}, {"name": "Iceberg 2 - 6", "level": 5, "stage": 2, "room": 6, "pointer": 3270857, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Nidoo", "Oro"], "default_exits": [{"room": 7, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Iceberg 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [4, 22], [89, 16], [28, 16], [25, 16]], "locations": ["Iceberg 2 - Enemy 10 (Propeller)", "Iceberg 2 - Enemy 11 (Nidoo)", "Iceberg 2 - Enemy 12 (Oro)"], "music": 20}, {"name": "Iceberg 2 - 7", "level": 5, "stage": 2, "room": 7, "pointer": 3212501, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Klinko", "Bronto Burt"], "default_exits": [{"room": 8, "unkn1": 124, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [14, 23], [2, 16], [4, 23]], "locations": ["Iceberg 2 - Enemy 13 (Klinko)", "Iceberg 2 - Enemy 14 (Bronto Burt)"], "music": 20}, {"name": "Iceberg 2 - 8", "level": 5, "stage": 2, "room": 8, "pointer": 2994515, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [42, 19]], "locations": ["Iceberg 2 - Samus"], "music": 8}, {"name": "Iceberg 2 - 9", "level": 5, "stage": 2, "room": 9, "pointer": 3058084, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 9, "x": 408, "y": 296, "name": "Iceberg 2 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 2 - Animal 1", "Iceberg 2 - Animal 2"], "music": 39}, {"name": "Iceberg 2 - 10", "level": 5, "stage": 2, "room": 10, "pointer": 2887220, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 2 - Complete"], "music": 5}, {"name": "Iceberg 3 - 0", "level": 5, "stage": 3, "room": 0, "pointer": 3455346, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori", "Bouncy", "Chilly", "Pteran"], "default_exits": [{"room": 1, "unkn1": 98, "unkn2": 6, "x": 200, "y": 232, "name": "Iceberg 3 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 217, "unkn2": 7, "x": 40, "y": 120, "name": "Iceberg 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[60, 16], [6, 16], [39, 16], [13, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 1 (Corori)", "Iceberg 3 - Enemy 2 (Bouncy)", "Iceberg 3 - Enemy 3 (Chilly)", "Iceberg 3 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Iceberg 3 - 1", "level": 5, "stage": 3, "room": 1, "pointer": 3019769, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 11, "unkn2": 14, "x": 1592, "y": 104, "name": "Iceberg 3 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 1", "Iceberg 3 - Animal 2", "Iceberg 3 - Animal 3"], "music": 38}, {"name": "Iceberg 3 - 2", "level": 5, "stage": 3, "room": 2, "pointer": 3618121, "animal_pointers": [], "consumables": [{"idx": 2, "pointer": 352, "x": 1776, "y": 104, "etype": 22, "vtype": 2, "name": "Iceberg 3 - Maxim Tomato (Ceiling)"}], "consumables_pointer": 128, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 196, "unkn2": 11, "x": 72, "y": 152, "name": "Iceberg 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[2, 22], [71, 16], [57, 16], [21, 16], [67, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 5 (Raft Waddle Dee)", "Iceberg 3 - Enemy 6 (Kapar)", "Iceberg 3 - Enemy 7 (Blipper)", "Iceberg 3 - Maxim Tomato (Ceiling)"], "music": 14}, {"name": "Iceberg 3 - 3", "level": 5, "stage": 3, "room": 3, "pointer": 3650368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 116, "unkn2": 11, "x": 40, "y": 152, "name": "Iceberg 3 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 63, "unkn2": 13, "x": 184, "y": 136, "name": "Iceberg 3 - 3 Exit 1", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [4, 22], [6, 16], [88, 16]], "locations": ["Iceberg 3 - Enemy 8 (Wapod)"], "music": 14}, {"name": "Iceberg 3 - 4", "level": 5, "stage": 3, "room": 4, "pointer": 3038208, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 10, "unkn2": 8, "x": 1032, "y": 216, "name": "Iceberg 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 4", "Iceberg 3 - Animal 5"], "music": 39}, {"name": "Iceberg 3 - 5", "level": 5, "stage": 3, "room": 5, "pointer": 3013938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": [], "music": 31}, {"name": "Iceberg 3 - 6", "level": 5, "stage": 3, "room": 6, "pointer": 3624789, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Icicle"], "default_exits": [{"room": 7, "unkn1": 211, "unkn2": 7, "x": 40, "y": 152, "name": "Iceberg 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [16, 16], [14, 23], [36, 16], [4, 22]], "locations": ["Iceberg 3 - Enemy 9 (Glunk)", "Iceberg 3 - Enemy 10 (Icicle)"], "music": 14}, {"name": "Iceberg 3 - 7", "level": 5, "stage": 3, "room": 7, "pointer": 2989472, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 7 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": ["Iceberg 3 - Chef Kawasaki"], "music": 8}, {"name": "Iceberg 3 - 8", "level": 5, "stage": 3, "room": 8, "pointer": 2889871, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 3 - Complete"], "music": 5}, {"name": "Iceberg 4 - 0", "level": 5, "stage": 4, "room": 0, "pointer": 3274879, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo", "Klinko", "Chilly"], "default_exits": [{"room": 1, "unkn1": 111, "unkn2": 8, "x": 72, "y": 104, "name": "Iceberg 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [2, 16], [26, 16]], "locations": ["Iceberg 4 - Enemy 1 (Bronto Burt)", "Iceberg 4 - Enemy 2 (Galbo)", "Iceberg 4 - Enemy 3 (Klinko)", "Iceberg 4 - Enemy 4 (Chilly)"], "music": 19}, {"name": "Iceberg 4 - 1", "level": 5, "stage": 4, "room": 1, "pointer": 3371780, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Babut", "Wappa"], "default_exits": [{"room": 2, "unkn1": 60, "unkn2": 36, "x": 216, "y": 88, "name": "Iceberg 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [4, 22], [44, 16]], "locations": ["Iceberg 4 - Enemy 5 (Babut)", "Iceberg 4 - Enemy 6 (Wappa)"], "music": 19}, {"name": "Iceberg 4 - 2", "level": 5, "stage": 4, "room": 2, "pointer": 3284378, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 8, "unkn2": 39, "x": 168, "y": 152, "name": "Iceberg 4 - 2 Exit 0", "access_rule": ["Burning"]}, {"room": 3, "unkn1": 13, "unkn2": 39, "x": 88, "y": 136, "name": "Iceberg 4 - 2 Exit 1", "access_rule": []}, {"room": 17, "unkn1": 18, "unkn2": 39, "x": 120, "y": 152, "name": "Iceberg 4 - 2 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 3", "level": 5, "stage": 4, "room": 3, "pointer": 3162957, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 44, "unkn2": 8, "x": 216, "y": 104, "name": "Iceberg 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[69, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 4", "level": 5, "stage": 4, "room": 4, "pointer": 3261679, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Icicle"], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 42, "x": 104, "y": 840, "name": "Iceberg 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[36, 16]], "locations": ["Iceberg 4 - Enemy 7 (Icicle)"], "music": 19}, {"name": "Iceberg 4 - 5", "level": 5, "stage": 4, "room": 5, "pointer": 3217398, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori"], "default_exits": [{"room": 6, "unkn1": 19, "unkn2": 5, "x": 72, "y": 120, "name": "Iceberg 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[60, 16], [44, 16], [4, 22]], "locations": ["Iceberg 4 - Enemy 8 (Corori)"], "music": 19}, {"name": "Iceberg 4 - 6", "level": 5, "stage": 4, "room": 6, "pointer": 3108265, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 61, "unkn2": 7, "x": 456, "y": 72, "name": "Iceberg 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 7", "level": 5, "stage": 4, "room": 7, "pointer": 3346202, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 39, "unkn2": 6, "x": 168, "y": 104, "name": "Iceberg 4 - 7 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 4, "unkn2": 21, "x": 88, "y": 168, "name": "Iceberg 4 - 7 Exit 1", "access_rule": ["Burning"]}, {"room": 13, "unkn1": 21, "unkn2": 21, "x": 280, "y": 168, "name": "Iceberg 4 - 7 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[14, 23], [4, 22], [4, 23]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 8", "level": 5, "stage": 4, "room": 8, "pointer": 3055911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 5, "x": 648, "y": 104, "name": "Iceberg 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 9", "level": 5, "stage": 4, "room": 9, "pointer": 3056457, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 9, "x": 136, "y": 136, "name": "Iceberg 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 4 - Miniboss 1 (Yuki)"], "music": 4}, {"name": "Iceberg 4 - 10", "level": 5, "stage": 4, "room": 10, "pointer": 3257516, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 8, "unkn2": 37, "x": 88, "y": 40, "name": "Iceberg 4 - 10 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 15, "unkn2": 37, "x": 200, "y": 40, "name": "Iceberg 4 - 10 Exit 1", "access_rule": []}], "entity_load": [[31, 19]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 11", "level": 5, "stage": 4, "room": 11, "pointer": 3083322, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon"], "default_exits": [{"room": 12, "unkn1": 46, "unkn2": 8, "x": 88, "y": 120, "name": "Iceberg 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[24, 16]], "locations": ["Iceberg 4 - Enemy 9 (Gabon)"], "music": 19}, {"name": "Iceberg 4 - 12", "level": 5, "stage": 4, "room": 12, "pointer": 3147724, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu"], "default_exits": [{"room": 18, "unkn1": 64, "unkn2": 7, "x": 72, "y": 456, "name": "Iceberg 4 - 12 Exit 0", "access_rule": []}], "entity_load": [[19, 16], [61, 16]], "locations": ["Iceberg 4 - Enemy 10 (Kabu)"], "music": 19}, {"name": "Iceberg 4 - 13", "level": 5, "stage": 4, "room": 13, "pointer": 3370077, "animal_pointers": [232, 240, 248], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 31, "unkn2": 4, "x": 216, "y": 120, "name": "Iceberg 4 - 13 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 46, "unkn2": 10, "x": 72, "y": 88, "name": "Iceberg 4 - 13 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 57, "unkn2": 10, "x": 312, "y": 88, "name": "Iceberg 4 - 13 Exit 2", "access_rule": []}, {"room": 14, "unkn1": 28, "unkn2": 21, "x": 152, "y": 136, "name": "Iceberg 4 - 13 Exit 3", "access_rule": []}, {"room": 14, "unkn1": 34, "unkn2": 21, "x": 280, "y": 136, "name": "Iceberg 4 - 13 Exit 4", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 1", "Iceberg 4 - Animal 2", "Iceberg 4 - Animal 3"], "music": 19}, {"name": "Iceberg 4 - 14", "level": 5, "stage": 4, "room": 14, "pointer": 3057002, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Broom Hatter", "Sasuke"], "default_exits": [{"room": 15, "unkn1": 4, "unkn2": 8, "x": 88, "y": 360, "name": "Iceberg 4 - 14 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 10, "unkn2": 8, "x": 440, "y": 344, "name": "Iceberg 4 - 14 Exit 1", "access_rule": []}, {"room": 13, "unkn1": 16, "unkn2": 8, "x": 568, "y": 344, "name": "Iceberg 4 - 14 Exit 2", "access_rule": []}, {"room": 15, "unkn1": 22, "unkn2": 8, "x": 344, "y": 360, "name": "Iceberg 4 - 14 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [30, 16]], "locations": ["Iceberg 4 - Enemy 11 (Broom Hatter)", "Iceberg 4 - Enemy 12 (Sasuke)"], "music": 19}, {"name": "Iceberg 4 - 15", "level": 5, "stage": 4, "room": 15, "pointer": 3116124, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 6, "x": 520, "y": 72, "name": "Iceberg 4 - 15 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 4, "unkn2": 22, "x": 88, "y": 136, "name": "Iceberg 4 - 15 Exit 1", "access_rule": []}, {"room": 14, "unkn1": 22, "unkn2": 22, "x": 344, "y": 136, "name": "Iceberg 4 - 15 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 16", "level": 5, "stage": 4, "room": 16, "pointer": 3069937, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 9, "x": 152, "y": 632, "name": "Iceberg 4 - 16 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 4"], "music": 38}, {"name": "Iceberg 4 - 17", "level": 5, "stage": 4, "room": 17, "pointer": 3072413, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 6, "unkn2": 9, "x": 280, "y": 632, "name": "Iceberg 4 - 17 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 5"], "music": 38}, {"name": "Iceberg 4 - 18", "level": 5, "stage": 4, "room": 18, "pointer": 3404593, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 19, "unkn1": 94, "unkn2": 12, "x": 72, "y": 152, "name": "Iceberg 4 - 18 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [43, 16], [30, 16], [15, 16]], "locations": ["Iceberg 4 - Enemy 13 (Nruff)"], "music": 19}, {"name": "Iceberg 4 - 19", "level": 5, "stage": 4, "room": 19, "pointer": 3075826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 4 - 19 Exit 0", "access_rule": []}], "entity_load": [[31, 19], [42, 19]], "locations": ["Iceberg 4 - Name"], "music": 8}, {"name": "Iceberg 4 - 20", "level": 5, "stage": 4, "room": 20, "pointer": 2887943, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 4 - Complete"], "music": 5}, {"name": "Iceberg 5 - 0", "level": 5, "stage": 5, "room": 0, "pointer": 3316135, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 30, "unkn1": 75, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[79, 16], [76, 16], [81, 16], [78, 16], [77, 16], [82, 16], [80, 16], [83, 16]], "locations": ["Iceberg 5 - Enemy 1 (Bukiset (Burning))", "Iceberg 5 - Enemy 2 (Bukiset (Stone))", "Iceberg 5 - Enemy 3 (Bukiset (Ice))", "Iceberg 5 - Enemy 4 (Bukiset (Needle))", "Iceberg 5 - Enemy 5 (Bukiset (Clean))", "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", "Iceberg 5 - Enemy 7 (Bukiset (Spark))", "Iceberg 5 - Enemy 8 (Bukiset (Cutter))"], "music": 16}, {"name": "Iceberg 5 - 1", "level": 5, "stage": 5, "room": 1, "pointer": 3037607, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 72, "y": 104, "name": "Iceberg 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 2", "level": 5, "stage": 5, "room": 2, "pointer": 3103842, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk"], "default_exits": [{"room": 25, "unkn1": 27, "unkn2": 6, "x": 72, "y": 200, "name": "Iceberg 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[16, 16]], "locations": ["Iceberg 5 - Enemy 9 (Glunk)"], "music": 16}, {"name": "Iceberg 5 - 3", "level": 5, "stage": 5, "room": 3, "pointer": 3135899, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 4, "unkn1": 20, "unkn2": 7, "x": 72, "y": 88, "name": "Iceberg 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 10 (Wapod)"], "music": 16}, {"name": "Iceberg 5 - 4", "level": 5, "stage": 5, "room": 4, "pointer": 3180695, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 26, "unkn2": 5, "x": 56, "y": 104, "name": "Iceberg 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 11 (Tick)"], "music": 16}, {"name": "Iceberg 5 - 5", "level": 5, "stage": 5, "room": 5, "pointer": 3106064, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 24, "unkn1": 14, "unkn2": 6, "x": 168, "y": 152, "name": "Iceberg 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[58, 16], [14, 23], [4, 22]], "locations": ["Iceberg 5 - Enemy 12 (Madoo)"], "music": 16}, {"name": "Iceberg 5 - 6", "level": 5, "stage": 5, "room": 6, "pointer": 3276800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 59, "unkn2": 12, "x": 72, "y": 120, "name": "Iceberg 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[55, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 7", "level": 5, "stage": 5, "room": 7, "pointer": 3104585, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 25, "unkn2": 7, "x": 72, "y": 136, "name": "Iceberg 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 8", "level": 5, "stage": 5, "room": 8, "pointer": 3195121, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 35, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 8 Exit 0", "access_rule": []}], "entity_load": [[4, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 9", "level": 5, "stage": 5, "room": 9, "pointer": 3087198, "animal_pointers": [], "consumables": [{"idx": 16, "pointer": 200, "x": 256, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Boulder)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 28, "unkn1": 20, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [54, 16]], "locations": ["Iceberg 5 - 1-Up (Boulder)"], "music": 16}, {"name": "Iceberg 5 - 10", "level": 5, "stage": 5, "room": 10, "pointer": 3321612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 45, "unkn2": 15, "x": 72, "y": 120, "name": "Iceberg 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 11", "level": 5, "stage": 5, "room": 11, "pointer": 3139178, "animal_pointers": [], "consumables": [{"idx": 17, "pointer": 192, "x": 152, "y": 168, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Floor)"}], "consumables_pointer": 176, "enemies": ["Yaban"], "default_exits": [{"room": 12, "unkn1": 17, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 11 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [0, 22]], "locations": ["Iceberg 5 - Enemy 13 (Yaban)", "Iceberg 5 - 1-Up (Floor)"], "music": 16}, {"name": "Iceberg 5 - 12", "level": 5, "stage": 5, "room": 12, "pointer": 3118231, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 7, "x": 72, "y": 104, "name": "Iceberg 5 - 12 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 14 (Propeller)"], "music": 16}, {"name": "Iceberg 5 - 13", "level": 5, "stage": 5, "room": 13, "pointer": 3021658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 27, "unkn1": 16, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 13 Exit 0", "access_rule": []}], "entity_load": [[45, 16]], "locations": ["Iceberg 5 - Enemy 15 (Mariel)"], "music": 16}, {"name": "Iceberg 5 - 14", "level": 5, "stage": 5, "room": 14, "pointer": 3025398, "animal_pointers": [], "consumables": [{"idx": 24, "pointer": 200, "x": 208, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Peloo)"}], "consumables_pointer": 176, "enemies": [], "default_exits": [{"room": 15, "unkn1": 13, "unkn2": 9, "x": 72, "y": 216, "name": "Iceberg 5 - 14 Exit 0", "access_rule": []}], "entity_load": [[64, 16], [0, 22]], "locations": ["Iceberg 5 - 1-Up (Peloo)"], "music": 16}, {"name": "Iceberg 5 - 15", "level": 5, "stage": 5, "room": 15, "pointer": 3167445, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 13, "x": 72, "y": 152, "name": "Iceberg 5 - 15 Exit 0", "access_rule": []}], "entity_load": [[39, 16]], "locations": ["Iceberg 5 - Enemy 16 (Pteran)"], "music": 16}, {"name": "Iceberg 5 - 16", "level": 5, "stage": 5, "room": 16, "pointer": 3033990, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 33, "unkn1": 36, "unkn2": 9, "x": 168, "y": 152, "name": "Iceberg 5 - 16 Exit 0", "access_rule": []}], "entity_load": [[68, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 17", "level": 5, "stage": 5, "room": 17, "pointer": 3100111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 40, "unkn2": 7, "x": 72, "y": 200, "name": "Iceberg 5 - 17 Exit 0", "access_rule": []}], "entity_load": [[52, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 18", "level": 5, "stage": 5, "room": 18, "pointer": 3030947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 17, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 18 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": ["Iceberg 5 - Enemy 17 (Galbo)"], "music": 16}, {"name": "Iceberg 5 - 19", "level": 5, "stage": 5, "room": 19, "pointer": 3105326, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe"], "default_exits": [{"room": 21, "unkn1": 13, "unkn2": 4, "x": 72, "y": 152, "name": "Iceberg 5 - 19 Exit 0", "access_rule": []}], "entity_load": [[51, 16]], "locations": ["Iceberg 5 - Enemy 18 (KeKe)"], "music": 16}, {"name": "Iceberg 5 - 20", "level": 5, "stage": 5, "room": 20, "pointer": 3118928, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 19, "unkn1": 13, "unkn2": 6, "x": 72, "y": 264, "name": "Iceberg 5 - 20 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 5 - Enemy 19 (Nidoo)"], "music": 16}, {"name": "Iceberg 5 - 21", "level": 5, "stage": 5, "room": 21, "pointer": 3202517, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 22, "unkn1": 29, "unkn2": 9, "x": 72, "y": 72, "name": "Iceberg 5 - 21 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16]], "locations": ["Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", "Iceberg 5 - Enemy 22 (Bouncy Drawing)"], "music": 16}, {"name": "Iceberg 5 - 22", "level": 5, "stage": 5, "room": 22, "pointer": 3014656, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Joe"], "default_exits": [{"room": 23, "unkn1": 13, "unkn2": 4, "x": 72, "y": 104, "name": "Iceberg 5 - 22 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 23 (Joe)"], "music": 16}, {"name": "Iceberg 5 - 23", "level": 5, "stage": 5, "room": 23, "pointer": 3166550, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 34, "unkn1": 27, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 23 Exit 0", "access_rule": []}], "entity_load": [[67, 16]], "locations": ["Iceberg 5 - Enemy 24 (Kapar)"], "music": 16}, {"name": "Iceberg 5 - 24", "level": 5, "stage": 5, "room": 24, "pointer": 3029110, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gansan"], "default_exits": [{"room": 31, "unkn1": 10, "unkn2": 4, "x": 72, "y": 88, "name": "Iceberg 5 - 24 Exit 0", "access_rule": []}], "entity_load": [[75, 16]], "locations": ["Iceberg 5 - Enemy 25 (Gansan)"], "music": 16}, {"name": "Iceberg 5 - 25", "level": 5, "stage": 5, "room": 25, "pointer": 3156420, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sasuke"], "default_exits": [{"room": 3, "unkn1": 25, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 25 Exit 0", "access_rule": []}], "entity_load": [[30, 16]], "locations": ["Iceberg 5 - Enemy 26 (Sasuke)"], "music": 16}, {"name": "Iceberg 5 - 26", "level": 5, "stage": 5, "room": 26, "pointer": 3127877, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo"], "default_exits": [{"room": 8, "unkn1": 24, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 5 - 26 Exit 0", "access_rule": []}], "entity_load": [[18, 16]], "locations": ["Iceberg 5 - Enemy 27 (Togezo)"], "music": 16}, {"name": "Iceberg 5 - 27", "level": 5, "stage": 5, "room": 27, "pointer": 3256471, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Bobin"], "default_exits": [{"room": 14, "unkn1": 26, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 27 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [73, 16]], "locations": ["Iceberg 5 - Enemy 28 (Sparky)", "Iceberg 5 - Enemy 29 (Bobin)"], "music": 16}, {"name": "Iceberg 5 - 28", "level": 5, "stage": 5, "room": 28, "pointer": 3029723, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly"], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 248, "name": "Iceberg 5 - 28 Exit 0", "access_rule": []}], "entity_load": [[6, 16]], "locations": ["Iceberg 5 - Enemy 30 (Chilly)"], "music": 16}, {"name": "Iceberg 5 - 29", "level": 5, "stage": 5, "room": 29, "pointer": 3526568, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 29 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [14, 23]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 30", "level": 5, "stage": 5, "room": 30, "pointer": 3022285, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 13, "unkn2": 5, "x": 88, "y": 104, "name": "Iceberg 5 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 1", "Iceberg 5 - Animal 2"], "music": 40}, {"name": "Iceberg 5 - 31", "level": 5, "stage": 5, "room": 31, "pointer": 3026019, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 72, "y": 200, "name": "Iceberg 5 - 31 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 3", "Iceberg 5 - Animal 4"], "music": 40}, {"name": "Iceberg 5 - 32", "level": 5, "stage": 5, "room": 32, "pointer": 3039996, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 32 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 5", "Iceberg 5 - Animal 6"], "music": 40}, {"name": "Iceberg 5 - 33", "level": 5, "stage": 5, "room": 33, "pointer": 3015302, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 33 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 7", "Iceberg 5 - Animal 8"], "music": 40}, {"name": "Iceberg 5 - 34", "level": 5, "stage": 5, "room": 34, "pointer": 3185868, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 35, "unkn1": 35, "unkn2": 9, "x": 200, "y": 328, "name": "Iceberg 5 - 34 Exit 0", "access_rule": []}], "entity_load": [[72, 16], [4, 22], [14, 23]], "locations": ["Iceberg 5 - Enemy 31 (Peran)"], "music": 16}, {"name": "Iceberg 5 - 35", "level": 5, "stage": 5, "room": 35, "pointer": 3865635, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 12, "unkn2": 7, "x": 168, "y": 1384, "name": "Iceberg 5 - 35 Exit 0", "access_rule": []}], "entity_load": [[17, 16], [4, 22]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 36", "level": 5, "stage": 5, "room": 36, "pointer": 3024154, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 37, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 5 - 36 Exit 0", "access_rule": []}], "entity_load": [[32, 19], [42, 19]], "locations": ["Iceberg 5 - Shiro"], "music": 8}, {"name": "Iceberg 5 - 37", "level": 5, "stage": 5, "room": 37, "pointer": 2890594, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 5 - Complete"], "music": 5}, {"name": "Iceberg 6 - 0", "level": 5, "stage": 6, "room": 0, "pointer": 3385305, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 28, "x": 136, "y": 184, "name": "Iceberg 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 12, "unkn2": 28, "x": 248, "y": 184, "name": "Iceberg 6 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 18, "unkn2": 28, "x": 360, "y": 184, "name": "Iceberg 6 - 0 Exit 2", "access_rule": []}], "entity_load": [[15, 16]], "locations": ["Iceberg 6 - Enemy 1 (Nruff)"], "music": 12}, {"name": "Iceberg 6 - 1", "level": 5, "stage": 6, "room": 1, "pointer": 3197599, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 1 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 1", "Iceberg 6 - Animal 2", "Iceberg 6 - Animal 3"], "music": 12}, {"name": "Iceberg 6 - 2", "level": 5, "stage": 6, "room": 2, "pointer": 3097113, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 2 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 3", "level": 5, "stage": 6, "room": 3, "pointer": 3198422, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 3 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 3 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 3 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 4", "Iceberg 6 - Animal 5", "Iceberg 6 - Animal 6"], "music": 12}, {"name": "Iceberg 6 - 4", "level": 5, "stage": 6, "room": 4, "pointer": 3210507, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 4 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 5", "level": 5, "stage": 6, "room": 5, "pointer": 3196776, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 212, "x": 136, "y": 120, "etype": 22, "vtype": 2, "name": "Iceberg 6 - Maxim Tomato (Left)"}, {"idx": 1, "pointer": 220, "x": 248, "y": 120, "etype": 22, "vtype": 0, "name": "Iceberg 6 - 1-Up (Middle)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 4, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 5 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 5 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 5 Exit 2", "access_rule": []}], "entity_load": [[2, 22], [0, 22], [14, 23]], "locations": ["Iceberg 6 - Maxim Tomato (Left)", "Iceberg 6 - 1-Up (Middle)"], "music": 12}, {"name": "Iceberg 6 - 6", "level": 5, "stage": 6, "room": 6, "pointer": 3208130, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 7, "unkn1": 9, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 6 - Enemy 2 (Nidoo)"], "music": 12}, {"name": "Iceberg 6 - 7", "level": 5, "stage": 6, "room": 7, "pointer": 3124478, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky"], "default_exits": [{"room": 8, "unkn1": 17, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[8, 16]], "locations": ["Iceberg 6 - Enemy 3 (Sparky)"], "music": 12}, {"name": "Iceberg 6 - 8", "level": 5, "stage": 6, "room": 8, "pointer": 3110431, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 8 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 14, "unkn2": 5, "x": 296, "y": 136, "name": "Iceberg 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 9", "level": 5, "stage": 6, "room": 9, "pointer": 3139832, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[2, 27]], "locations": ["Iceberg 6 - Miniboss 1 (Blocky)"], "music": 12}, {"name": "Iceberg 6 - 10", "level": 5, "stage": 6, "room": 10, "pointer": 3119624, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 11", "level": 5, "stage": 6, "room": 11, "pointer": 3141139, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 12, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Iceberg 6 - Miniboss 2 (Jumper Shoot)"], "music": 12}, {"name": "Iceberg 6 - 12", "level": 5, "stage": 6, "room": 12, "pointer": 3123788, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 12 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 13", "level": 5, "stage": 6, "room": 13, "pointer": 3143741, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 6 - Miniboss 3 (Yuki)"], "music": 12}, {"name": "Iceberg 6 - 14", "level": 5, "stage": 6, "room": 14, "pointer": 3120319, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 14 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 15", "level": 5, "stage": 6, "room": 15, "pointer": 3135238, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 16, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[27, 16]], "locations": ["Iceberg 6 - Enemy 4 (Sir Kibble)"], "music": 12}, {"name": "Iceberg 6 - 16", "level": 5, "stage": 6, "room": 16, "pointer": 3123096, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 16 Exit 0", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 17", "level": 5, "stage": 6, "room": 17, "pointer": 3144389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 17 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Iceberg 6 - Miniboss 4 (Haboki)"], "music": 12}, {"name": "Iceberg 6 - 18", "level": 5, "stage": 6, "room": 18, "pointer": 3121014, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 19", "level": 5, "stage": 6, "room": 19, "pointer": 3017228, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 19 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Iceberg 6 - Miniboss 5 (Boboo)"], "music": 12}, {"name": "Iceberg 6 - 20", "level": 5, "stage": 6, "room": 20, "pointer": 3121709, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 21, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 21", "level": 5, "stage": 6, "room": 21, "pointer": 3145036, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 21 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Iceberg 6 - Miniboss 6 (Captain Stitch)"], "music": 12}, {"name": "Iceberg 6 - 22", "level": 5, "stage": 6, "room": 22, "pointer": 3116830, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 7, "unkn2": 5, "x": 136, "y": 152, "name": "Iceberg 6 - 22 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 23", "level": 5, "stage": 6, "room": 23, "pointer": 3045263, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 24, "unkn1": 17, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [42, 19]], "locations": ["Iceberg 6 - Angel"], "music": 8}, {"name": "Iceberg 6 - 24", "level": 5, "stage": 6, "room": 24, "pointer": 2889389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 6 - Complete"], "music": 5}, {"name": "Iceberg Boss - 0", "level": 5, "stage": 7, "room": 0, "pointer": 2980207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[8, 18]], "locations": ["Iceberg - Boss (Dedede) Purified", "Level 5 Boss - Defeated", "Level 5 Boss - Purified"], "music": 7}] \ No newline at end of file +[ + { + "name": "Grass Land 1 - 0", + "level": 1, + "stage": 1, + "room": 0, + "pointer": 3434257, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee", + "Sir Kibble", + "Cappy" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 205, + "unkn2": 8, + "x": 72, + "y": 200, + "name": "Grass Land 1 - 0 Exit 0", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 87, + "unkn2": 9, + "x": 104, + "y": 152, + "name": "Grass Land 1 - 0 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 16 + ], + [ + 1, + 23 + ], + [ + 0, + 23 + ], + [ + 14, + 23 + ], + [ + 27, + 16 + ], + [ + 12, + 16 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Grass Land 1 - Enemy 1 (Waddle Dee)", + "Grass Land 1 - Enemy 2 (Sir Kibble)", + "Grass Land 1 - Enemy 3 (Cappy)", + "Grass Land 1 - Star 1", + "Grass Land 1 - Star 2", + "Grass Land 1 - Star 3", + "Grass Land 1 - Star 4", + "Grass Land 1 - Star 5", + "Grass Land 1 - Star 6", + "Grass Land 1 - Star 7", + "Grass Land 1 - Star 8", + "Grass Land 1 - Star 9", + "Grass Land 1 - Star 10" + ], + "music": 20 + }, + { + "name": "Grass Land 1 - 1", + "level": 1, + "stage": 1, + "room": 1, + "pointer": 3368373, + "animal_pointers": [], + "consumables": [ + { + "idx": 14, + "pointer": 264, + "x": 928, + "y": 160, + "etype": 22, + "vtype": 0, + "name": "Grass Land 1 - 1-Up (Parasol)" + }, + { + "idx": 15, + "pointer": 312, + "x": 1456, + "y": 176, + "etype": 22, + "vtype": 2, + "name": "Grass Land 1 - Maxim Tomato (Spark)" + } + ], + "consumables_pointer": 304, + "enemies": [ + "Sparky", + "Bronto Burt", + "Sasuke" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 143, + "unkn2": 6, + "x": 56, + "y": 152, + "name": "Grass Land 1 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 30, + 16 + ], + [ + 12, + 16 + ], + [ + 14, + 23 + ], + [ + 8, + 16 + ], + [ + 0, + 22 + ], + [ + 2, + 22 + ] + ], + "locations": [ + "Grass Land 1 - Enemy 4 (Sparky)", + "Grass Land 1 - Enemy 5 (Bronto Burt)", + "Grass Land 1 - Enemy 6 (Sasuke)", + "Grass Land 1 - Star 11", + "Grass Land 1 - Star 12", + "Grass Land 1 - Star 13", + "Grass Land 1 - Star 14", + "Grass Land 1 - Star 15", + "Grass Land 1 - 1-Up (Parasol)", + "Grass Land 1 - Maxim Tomato (Spark)" + ], + "music": 20 + }, + { + "name": "Grass Land 1 - 2", + "level": 1, + "stage": 1, + "room": 2, + "pointer": 2960650, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 0, + "unkn1": 5, + "unkn2": 9, + "x": 1416, + "y": 152, + "name": "Grass Land 1 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Grass Land 1 - Animal 1", + "Grass Land 1 - Animal 2" + ], + "music": 38 + }, + { + "name": "Grass Land 1 - 3", + "level": 1, + "stage": 1, + "room": 3, + "pointer": 3478442, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Poppy Bros Jr." + ], + "default_exits": [ + { + "room": 4, + "unkn1": 179, + "unkn2": 9, + "x": 56, + "y": 152, + "name": "Grass Land 1 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 19 + ], + [ + 7, + 16 + ], + [ + 0, + 23 + ], + [ + 6, + 22 + ], + [ + 14, + 23 + ], + [ + 8, + 16 + ], + [ + 1, + 23 + ] + ], + "locations": [ + "Grass Land 1 - Enemy 7 (Poppy Bros Jr.)", + "Grass Land 1 - Star 16", + "Grass Land 1 - Star 17", + "Grass Land 1 - Star 18", + "Grass Land 1 - Star 19", + "Grass Land 1 - Star 20", + "Grass Land 1 - Star 21", + "Grass Land 1 - Star 22", + "Grass Land 1 - Star 23" + ], + "music": 20 + }, + { + "name": "Grass Land 1 - 4", + "level": 1, + "stage": 1, + "room": 4, + "pointer": 2978390, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 5, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Grass Land 1 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Grass Land 1 - Tulip" + ], + "music": 8 + }, + { + "name": "Grass Land 1 - 5", + "level": 1, + "stage": 1, + "room": 5, + "pointer": 2890835, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Grass Land 1 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land 2 - 0", + "level": 1, + "stage": 2, + "room": 0, + "pointer": 3293347, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Rocky", + "KeKe", + "Bobo", + "Poppy Bros Jr." + ], + "default_exits": [ + { + "room": 1, + "unkn1": 112, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Grass Land 2 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 3, + 16 + ], + [ + 7, + 16 + ], + [ + 5, + 16 + ], + [ + 4, + 22 + ], + [ + 51, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 2 - Enemy 1 (Rocky)", + "Grass Land 2 - Enemy 2 (KeKe)", + "Grass Land 2 - Enemy 3 (Bobo)", + "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)", + "Grass Land 2 - Star 1", + "Grass Land 2 - Star 2", + "Grass Land 2 - Star 3", + "Grass Land 2 - Star 4", + "Grass Land 2 - Star 5", + "Grass Land 2 - Star 6", + "Grass Land 2 - Star 7", + "Grass Land 2 - Star 8", + "Grass Land 2 - Star 9", + "Grass Land 2 - Star 10" + ], + "music": 11 + }, + { + "name": "Grass Land 2 - 1", + "level": 1, + "stage": 2, + "room": 1, + "pointer": 3059685, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 20, + "unkn2": 9, + "x": 56, + "y": 136, + "name": "Grass Land 2 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Grass Land 2 - Animal 1", + "Grass Land 2 - Animal 2" + ], + "music": 39 + }, + { + "name": "Grass Land 2 - 2", + "level": 1, + "stage": 2, + "room": 2, + "pointer": 3432109, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee", + "Popon Ball", + "Bouncy" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 133, + "unkn2": 11, + "x": 72, + "y": 200, + "name": "Grass Land 2 - 2 Exit 0", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 52, + "unkn2": 12, + "x": 56, + "y": 152, + "name": "Grass Land 2 - 2 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 13, + 16 + ], + [ + 50, + 16 + ], + [ + 4, + 22 + ], + [ + 3, + 16 + ], + [ + 0, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 2 - Enemy 5 (Waddle Dee)", + "Grass Land 2 - Enemy 6 (Popon Ball)", + "Grass Land 2 - Enemy 7 (Bouncy)", + "Grass Land 2 - Star 11", + "Grass Land 2 - Star 12", + "Grass Land 2 - Star 13" + ], + "music": 11 + }, + { + "name": "Grass Land 2 - 3", + "level": 1, + "stage": 2, + "room": 3, + "pointer": 2970029, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 2, + "unkn2": 9, + "x": 840, + "y": 168, + "name": "Grass Land 2 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 1, + 19 + ] + ], + "locations": [], + "music": 11 + }, + { + "name": "Grass Land 2 - 4", + "level": 1, + "stage": 2, + "room": 4, + "pointer": 3578022, + "animal_pointers": [], + "consumables": [ + { + "idx": 20, + "pointer": 272, + "x": 992, + "y": 192, + "etype": 22, + "vtype": 0, + "name": "Grass Land 2 - 1-Up (Needle)" + } + ], + "consumables_pointer": 352, + "enemies": [ + "Tick", + "Bronto Burt", + "Nruff" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 154, + "unkn2": 12, + "x": 72, + "y": 152, + "name": "Grass Land 2 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 15, + 16 + ], + [ + 5, + 16 + ], + [ + 2, + 16 + ], + [ + 48, + 16 + ], + [ + 14, + 23 + ], + [ + 0, + 22 + ] + ], + "locations": [ + "Grass Land 2 - Enemy 8 (Tick)", + "Grass Land 2 - Enemy 9 (Bronto Burt)", + "Grass Land 2 - Enemy 10 (Nruff)", + "Grass Land 2 - Star 14", + "Grass Land 2 - Star 15", + "Grass Land 2 - Star 16", + "Grass Land 2 - Star 17", + "Grass Land 2 - Star 18", + "Grass Land 2 - Star 19", + "Grass Land 2 - Star 20", + "Grass Land 2 - Star 21", + "Grass Land 2 - 1-Up (Needle)" + ], + "music": 11 + }, + { + "name": "Grass Land 2 - 5", + "level": 1, + "stage": 2, + "room": 5, + "pointer": 2966057, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Grass Land 2 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 1, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Grass Land 2 - Muchimuchi" + ], + "music": 8 + }, + { + "name": "Grass Land 2 - 6", + "level": 1, + "stage": 2, + "room": 6, + "pointer": 2887461, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Grass Land 2 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land 3 - 0", + "level": 1, + "stage": 3, + "room": 0, + "pointer": 3149707, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sparky", + "Rocky", + "Nruff" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 107, + "unkn2": 7, + "x": 72, + "y": 840, + "name": "Grass Land 3 - 0 Exit 0", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 46, + "unkn2": 9, + "x": 152, + "y": 152, + "name": "Grass Land 3 - 0 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 3, + 16 + ], + [ + 14, + 23 + ], + [ + 15, + 16 + ], + [ + 0, + 16 + ], + [ + 8, + 16 + ] + ], + "locations": [ + "Grass Land 3 - Enemy 1 (Sparky)", + "Grass Land 3 - Enemy 2 (Rocky)", + "Grass Land 3 - Enemy 3 (Nruff)", + "Grass Land 3 - Star 1", + "Grass Land 3 - Star 2", + "Grass Land 3 - Star 3", + "Grass Land 3 - Star 4", + "Grass Land 3 - Star 5", + "Grass Land 3 - Star 6", + "Grass Land 3 - Star 7", + "Grass Land 3 - Star 8", + "Grass Land 3 - Star 9", + "Grass Land 3 - Star 10" + ], + "music": 19 + }, + { + "name": "Grass Land 3 - 1", + "level": 1, + "stage": 3, + "room": 1, + "pointer": 3204939, + "animal_pointers": [], + "consumables": [ + { + "idx": 10, + "pointer": 360, + "x": 208, + "y": 344, + "etype": 22, + "vtype": 0, + "name": "Grass Land 3 - 1-Up (Climb)" + }, + { + "idx": 11, + "pointer": 376, + "x": 224, + "y": 568, + "etype": 22, + "vtype": 2, + "name": "Grass Land 3 - Maxim Tomato (Climb)" + } + ], + "consumables_pointer": 128, + "enemies": [], + "default_exits": [ + { + "room": 3, + "unkn1": 9, + "unkn2": 9, + "x": 56, + "y": 152, + "name": "Grass Land 3 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 22 + ], + [ + 6, + 23 + ], + [ + 2, + 22 + ], + [ + 5, + 23 + ], + [ + 14, + 23 + ], + [ + 1, + 23 + ], + [ + 0, + 23 + ], + [ + 31, + 16 + ] + ], + "locations": [ + "Grass Land 3 - Star 11", + "Grass Land 3 - Star 12", + "Grass Land 3 - Star 13", + "Grass Land 3 - Star 14", + "Grass Land 3 - Star 15", + "Grass Land 3 - Star 16", + "Grass Land 3 - 1-Up (Climb)", + "Grass Land 3 - Maxim Tomato (Climb)" + ], + "music": 19 + }, + { + "name": "Grass Land 3 - 2", + "level": 1, + "stage": 3, + "room": 2, + "pointer": 3200066, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 13, + "unkn2": 55, + "x": 56, + "y": 152, + "name": "Grass Land 3 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 15, + 16 + ], + [ + 0, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 3 - Star 17", + "Grass Land 3 - Star 18", + "Grass Land 3 - Star 19", + "Grass Land 3 - Star 20", + "Grass Land 3 - Star 21", + "Grass Land 3 - Star 22", + "Grass Land 3 - Star 23", + "Grass Land 3 - Star 24", + "Grass Land 3 - Star 25", + "Grass Land 3 - Star 26" + ], + "music": 19 + }, + { + "name": "Grass Land 3 - 3", + "level": 1, + "stage": 3, + "room": 3, + "pointer": 2959784, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 15, + "unkn2": 9, + "x": 56, + "y": 120, + "name": "Grass Land 3 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 19 + ] + ], + "locations": [], + "music": 31 + }, + { + "name": "Grass Land 3 - 4", + "level": 1, + "stage": 3, + "room": 4, + "pointer": 2979121, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 0, + "unkn1": 8, + "unkn2": 9, + "x": 760, + "y": 152, + "name": "Grass Land 3 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Grass Land 3 - Animal 1", + "Grass Land 3 - Animal 2" + ], + "music": 40 + }, + { + "name": "Grass Land 3 - 5", + "level": 1, + "stage": 3, + "room": 5, + "pointer": 2997811, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 15, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Grass Land 3 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 19 + ] + ], + "locations": [], + "music": 8 + }, + { + "name": "Grass Land 3 - 6", + "level": 1, + "stage": 3, + "room": 6, + "pointer": 3084876, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bouncy" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 96, + "unkn2": 9, + "x": 40, + "y": 152, + "name": "Grass Land 3 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 13, + 16 + ], + [ + 14, + 16 + ], + [ + 1, + 23 + ], + [ + 59, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 3 - Pitcherman", + "Grass Land 3 - Enemy 4 (Bouncy)", + "Grass Land 3 - Star 27", + "Grass Land 3 - Star 28", + "Grass Land 3 - Star 29", + "Grass Land 3 - Star 30", + "Grass Land 3 - Star 31" + ], + "music": 19 + }, + { + "name": "Grass Land 3 - 7", + "level": 1, + "stage": 3, + "room": 7, + "pointer": 2891317, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Grass Land 3 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land 4 - 0", + "level": 1, + "stage": 4, + "room": 0, + "pointer": 3471284, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Loud", + "Babut", + "Rocky" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 145, + "unkn2": 13, + "x": 72, + "y": 136, + "name": "Grass Land 4 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 3, + 16 + ], + [ + 43, + 16 + ], + [ + 14, + 23 + ], + [ + 40, + 16 + ], + [ + 61, + 16 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Grass Land 4 - Enemy 1 (Loud)", + "Grass Land 4 - Enemy 2 (Babut)", + "Grass Land 4 - Enemy 3 (Rocky)", + "Grass Land 4 - Star 1", + "Grass Land 4 - Star 2", + "Grass Land 4 - Star 3", + "Grass Land 4 - Star 4", + "Grass Land 4 - Star 5", + "Grass Land 4 - Star 6", + "Grass Land 4 - Star 7", + "Grass Land 4 - Star 8", + "Grass Land 4 - Star 9" + ], + "music": 10 + }, + { + "name": "Grass Land 4 - 1", + "level": 1, + "stage": 4, + "room": 1, + "pointer": 3436401, + "animal_pointers": [], + "consumables": [ + { + "idx": 12, + "pointer": 290, + "x": 1008, + "y": 144, + "etype": 22, + "vtype": 2, + "name": "Grass Land 4 - Maxim Tomato (Zebon Right)" + } + ], + "consumables_pointer": 368, + "enemies": [ + "Kapar" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 58, + "unkn2": 5, + "x": 184, + "y": 312, + "name": "Grass Land 4 - 1 Exit 0", + "access_rule": [] + }, + { + "room": 9, + "unkn1": 42, + "unkn2": 18, + "x": 168, + "y": 88, + "name": "Grass Land 4 - 1 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 43, + 16 + ], + [ + 10, + 23 + ], + [ + 6, + 22 + ], + [ + 14, + 23 + ], + [ + 2, + 22 + ], + [ + 67, + 16 + ] + ], + "locations": [ + "Grass Land 4 - Enemy 4 (Kapar)", + "Grass Land 4 - Star 10", + "Grass Land 4 - Maxim Tomato (Zebon Right)" + ], + "music": 10 + }, + { + "name": "Grass Land 4 - 2", + "level": 1, + "stage": 4, + "room": 2, + "pointer": 3039401, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 4, + "x": 56, + "y": 72, + "name": "Grass Land 4 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 27 + ] + ], + "locations": [], + "music": 9 + }, + { + "name": "Grass Land 4 - 3", + "level": 1, + "stage": 4, + "room": 3, + "pointer": 3722714, + "animal_pointers": [], + "consumables": [ + { + "idx": 23, + "pointer": 280, + "x": 856, + "y": 224, + "etype": 22, + "vtype": 2, + "name": "Grass Land 4 - Maxim Tomato (Gordo)" + }, + { + "idx": 22, + "pointer": 480, + "x": 1352, + "y": 112, + "etype": 22, + "vtype": 0, + "name": "Grass Land 4 - 1-Up (Gordo)" + } + ], + "consumables_pointer": 288, + "enemies": [ + "Glunk", + "Oro" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 95, + "unkn2": 5, + "x": 72, + "y": 200, + "name": "Grass Land 4 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 1, + 16 + ], + [ + 55, + 16 + ], + [ + 16, + 16 + ], + [ + 25, + 16 + ], + [ + 14, + 23 + ], + [ + 0, + 22 + ], + [ + 2, + 22 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Grass Land 4 - Enemy 5 (Glunk)", + "Grass Land 4 - Enemy 6 (Oro)", + "Grass Land 4 - Star 11", + "Grass Land 4 - Star 12", + "Grass Land 4 - Star 13", + "Grass Land 4 - Star 14", + "Grass Land 4 - Star 15", + "Grass Land 4 - Star 16", + "Grass Land 4 - Star 17", + "Grass Land 4 - Star 18", + "Grass Land 4 - Star 19", + "Grass Land 4 - Star 20", + "Grass Land 4 - Star 21", + "Grass Land 4 - Star 22", + "Grass Land 4 - Star 23", + "Grass Land 4 - Star 24", + "Grass Land 4 - Star 25", + "Grass Land 4 - Star 26", + "Grass Land 4 - Maxim Tomato (Gordo)", + "Grass Land 4 - 1-Up (Gordo)" + ], + "music": 10 + }, + { + "name": "Grass Land 4 - 4", + "level": 1, + "stage": 4, + "room": 4, + "pointer": 3304980, + "animal_pointers": [], + "consumables": [ + { + "idx": 32, + "pointer": 208, + "x": 488, + "y": 64, + "etype": 22, + "vtype": 2, + "name": "Grass Land 4 - Maxim Tomato (Cliff)" + } + ], + "consumables_pointer": 160, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 94, + "unkn2": 9, + "x": 40, + "y": 152, + "name": "Grass Land 4 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 43, + 16 + ], + [ + 2, + 22 + ], + [ + 54, + 16 + ], + [ + 1, + 16 + ], + [ + 40, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 4 - Star 27", + "Grass Land 4 - Maxim Tomato (Cliff)" + ], + "music": 10 + }, + { + "name": "Grass Land 4 - 5", + "level": 1, + "stage": 4, + "room": 5, + "pointer": 3498127, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Peran" + ], + "default_exits": [ + { + "room": 2, + "unkn1": 61, + "unkn2": 13, + "x": 56, + "y": 72, + "name": "Grass Land 4 - 5 Exit 0", + "access_rule": [] + }, + { + "room": 7, + "unkn1": 61, + "unkn2": 18, + "x": 56, + "y": 200, + "name": "Grass Land 4 - 5 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 72, + 16 + ], + [ + 43, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ], + [ + 10, + 23 + ], + [ + 3, + 16 + ] + ], + "locations": [ + "Grass Land 4 - Enemy 7 (Peran)", + "Grass Land 4 - Star 28", + "Grass Land 4 - Star 29", + "Grass Land 4 - Star 30", + "Grass Land 4 - Star 31", + "Grass Land 4 - Star 32", + "Grass Land 4 - Star 33", + "Grass Land 4 - Star 34", + "Grass Land 4 - Star 35", + "Grass Land 4 - Star 36", + "Grass Land 4 - Star 37" + ], + "music": 10 + }, + { + "name": "Grass Land 4 - 6", + "level": 1, + "stage": 4, + "room": 6, + "pointer": 3160191, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 3, + "unkn1": 28, + "unkn2": 4, + "x": 72, + "y": 376, + "name": "Grass Land 4 - 6 Exit 0", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 28, + "unkn2": 12, + "x": 72, + "y": 440, + "name": "Grass Land 4 - 6 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 3, + 19 + ], + [ + 6, + 23 + ] + ], + "locations": [], + "music": 10 + }, + { + "name": "Grass Land 4 - 7", + "level": 1, + "stage": 4, + "room": 7, + "pointer": 3035801, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 12, + "x": 56, + "y": 200, + "name": "Grass Land 4 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 27 + ] + ], + "locations": [ + "Grass Land 4 - Miniboss 1 (Boboo)" + ], + "music": 4 + }, + { + "name": "Grass Land 4 - 8", + "level": 1, + "stage": 4, + "room": 8, + "pointer": 2989794, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 10, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Grass Land 4 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 3, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Grass Land 4 - Chao & Goku" + ], + "music": 8 + }, + { + "name": "Grass Land 4 - 9", + "level": 1, + "stage": 4, + "room": 9, + "pointer": 3043518, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 9, + "unkn2": 5, + "x": 696, + "y": 296, + "name": "Grass Land 4 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Grass Land 4 - Animal 1", + "Grass Land 4 - Animal 2" + ], + "music": 38 + }, + { + "name": "Grass Land 4 - 10", + "level": 1, + "stage": 4, + "room": 10, + "pointer": 2888425, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Grass Land 4 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land 5 - 0", + "level": 1, + "stage": 5, + "room": 0, + "pointer": 3303565, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Propeller", + "Broom Hatter", + "Bouncy" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 120, + "unkn2": 9, + "x": 56, + "y": 152, + "name": "Grass Land 5 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 13, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ], + [ + 6, + 23 + ], + [ + 11, + 16 + ], + [ + 89, + 16 + ] + ], + "locations": [ + "Grass Land 5 - Enemy 1 (Propeller)", + "Grass Land 5 - Enemy 2 (Broom Hatter)", + "Grass Land 5 - Enemy 3 (Bouncy)", + "Grass Land 5 - Star 1", + "Grass Land 5 - Star 2", + "Grass Land 5 - Star 3", + "Grass Land 5 - Star 4", + "Grass Land 5 - Star 5", + "Grass Land 5 - Star 6", + "Grass Land 5 - Star 7", + "Grass Land 5 - Star 8" + ], + "music": 11 + }, + { + "name": "Grass Land 5 - 1", + "level": 1, + "stage": 5, + "room": 1, + "pointer": 3048718, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sir Kibble" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 18, + "unkn2": 4, + "x": 184, + "y": 152, + "name": "Grass Land 5 - 1 Exit 0", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 21, + "unkn2": 4, + "x": 184, + "y": 152, + "name": "Grass Land 5 - 1 Exit 1", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 36, + "unkn2": 9, + "x": 56, + "y": 88, + "name": "Grass Land 5 - 1 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 27, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 5 - Enemy 4 (Sir Kibble)", + "Grass Land 5 - Star 9", + "Grass Land 5 - Star 10" + ], + "music": 11 + }, + { + "name": "Grass Land 5 - 2", + "level": 1, + "stage": 5, + "room": 2, + "pointer": 3327019, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee", + "Sasuke", + "Nruff" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 121, + "unkn2": 6, + "x": 56, + "y": 72, + "name": "Grass Land 5 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 30, + 16 + ], + [ + 15, + 16 + ], + [ + 1, + 16 + ] + ], + "locations": [ + "Grass Land 5 - Enemy 5 (Waddle Dee)", + "Grass Land 5 - Enemy 6 (Sasuke)", + "Grass Land 5 - Enemy 7 (Nruff)", + "Grass Land 5 - Star 11", + "Grass Land 5 - Star 12", + "Grass Land 5 - Star 13", + "Grass Land 5 - Star 14", + "Grass Land 5 - Star 15", + "Grass Land 5 - Star 16" + ], + "music": 11 + }, + { + "name": "Grass Land 5 - 3", + "level": 1, + "stage": 5, + "room": 3, + "pointer": 2966459, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 10, + "unkn2": 9, + "x": 312, + "y": 72, + "name": "Grass Land 5 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Grass Land 5 - Animal 1", + "Grass Land 5 - Animal 2" + ], + "music": 38 + }, + { + "name": "Grass Land 5 - 4", + "level": 1, + "stage": 5, + "room": 4, + "pointer": 2973509, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 10, + "unkn2": 9, + "x": 360, + "y": 72, + "name": "Grass Land 5 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Grass Land 5 - Animal 3", + "Grass Land 5 - Animal 4" + ], + "music": 38 + }, + { + "name": "Grass Land 5 - 5", + "level": 1, + "stage": 5, + "room": 5, + "pointer": 2962351, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Grass Land 5 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Grass Land 5 - Mine" + ], + "music": 8 + }, + { + "name": "Grass Land 5 - 6", + "level": 1, + "stage": 5, + "room": 6, + "pointer": 2886738, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Grass Land 5 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land 5 - 7", + "level": 1, + "stage": 5, + "room": 7, + "pointer": 3255423, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Tick" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 96, + "unkn2": 9, + "x": 56, + "y": 152, + "name": "Grass Land 5 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 48, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 5 - Enemy 8 (Tick)", + "Grass Land 5 - Star 17", + "Grass Land 5 - Star 18", + "Grass Land 5 - Star 19", + "Grass Land 5 - Star 20", + "Grass Land 5 - Star 21", + "Grass Land 5 - Star 22", + "Grass Land 5 - Star 23", + "Grass Land 5 - Star 24", + "Grass Land 5 - Star 25", + "Grass Land 5 - Star 26", + "Grass Land 5 - Star 27", + "Grass Land 5 - Star 28", + "Grass Land 5 - Star 29" + ], + "music": 11 + }, + { + "name": "Grass Land 6 - 0", + "level": 1, + "stage": 6, + "room": 0, + "pointer": 3376872, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Como", + "Togezo", + "Bronto Burt", + "Cappy" + ], + "default_exits": [ + { + "room": 6, + "unkn1": 51, + "unkn2": 9, + "x": 216, + "y": 152, + "name": "Grass Land 6 - 0 Exit 0", + "access_rule": [] + }, + { + "room": 1, + "unkn1": 96, + "unkn2": 9, + "x": 216, + "y": 1144, + "name": "Grass Land 6 - 0 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 12, + 16 + ], + [ + 18, + 16 + ], + [ + 2, + 16 + ], + [ + 41, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 6 - Enemy 1 (Como)", + "Grass Land 6 - Enemy 2 (Togezo)", + "Grass Land 6 - Enemy 3 (Bronto Burt)", + "Grass Land 6 - Enemy 4 (Cappy)", + "Grass Land 6 - Star 1", + "Grass Land 6 - Star 2", + "Grass Land 6 - Star 3", + "Grass Land 6 - Star 4", + "Grass Land 6 - Star 5", + "Grass Land 6 - Star 6", + "Grass Land 6 - Star 7", + "Grass Land 6 - Star 8", + "Grass Land 6 - Star 9" + ], + "music": 20 + }, + { + "name": "Grass Land 6 - 1", + "level": 1, + "stage": 6, + "room": 1, + "pointer": 3395125, + "animal_pointers": [], + "consumables": [ + { + "idx": 10, + "pointer": 192, + "x": 104, + "y": 1144, + "etype": 22, + "vtype": 0, + "name": "Grass Land 6 - 1-Up (Tower)" + } + ], + "consumables_pointer": 256, + "enemies": [ + "Bobo", + "Mariel" + ], + "default_exits": [ + { + "room": 2, + "unkn1": 16, + "unkn2": 5, + "x": 72, + "y": 88, + "name": "Grass Land 6 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 5, + 16 + ], + [ + 5, + 19 + ], + [ + 45, + 16 + ], + [ + 0, + 22 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ], + [ + 55, + 16 + ] + ], + "locations": [ + "Grass Land 6 - Enemy 5 (Bobo)", + "Grass Land 6 - Enemy 6 (Mariel)", + "Grass Land 6 - Star 10", + "Grass Land 6 - Star 11", + "Grass Land 6 - Star 12", + "Grass Land 6 - Star 13", + "Grass Land 6 - Star 14", + "Grass Land 6 - 1-Up (Tower)" + ], + "music": 20 + }, + { + "name": "Grass Land 6 - 2", + "level": 1, + "stage": 6, + "room": 2, + "pointer": 3375177, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Yaban", + "Broom Hatter" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 93, + "unkn2": 6, + "x": 200, + "y": 152, + "name": "Grass Land 6 - 2 Exit 0", + "access_rule": [] + }, + { + "room": 7, + "unkn1": 49, + "unkn2": 7, + "x": 216, + "y": 104, + "name": "Grass Land 6 - 2 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 11, + 16 + ], + [ + 45, + 16 + ], + [ + 41, + 16 + ], + [ + 4, + 22 + ], + [ + 32, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 6 - Enemy 7 (Yaban)", + "Grass Land 6 - Enemy 8 (Broom Hatter)", + "Grass Land 6 - Star 15", + "Grass Land 6 - Star 16" + ], + "music": 20 + }, + { + "name": "Grass Land 6 - 3", + "level": 1, + "stage": 6, + "room": 3, + "pointer": 3322977, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Apolo", + "Sasuke" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 12, + "unkn2": 52, + "x": 72, + "y": 104, + "name": "Grass Land 6 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 41, + 16 + ], + [ + 49, + 16 + ], + [ + 30, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Grass Land 6 - Enemy 9 (Apolo)", + "Grass Land 6 - Enemy 10 (Sasuke)", + "Grass Land 6 - Star 17", + "Grass Land 6 - Star 18", + "Grass Land 6 - Star 19", + "Grass Land 6 - Star 20", + "Grass Land 6 - Star 21", + "Grass Land 6 - Star 22", + "Grass Land 6 - Star 23", + "Grass Land 6 - Star 24", + "Grass Land 6 - Star 25" + ], + "music": 20 + }, + { + "name": "Grass Land 6 - 4", + "level": 1, + "stage": 6, + "room": 4, + "pointer": 3490819, + "animal_pointers": [], + "consumables": [ + { + "idx": 33, + "pointer": 192, + "x": 40, + "y": 104, + "etype": 22, + "vtype": 1, + "name": "Grass Land 6 - 1-Up (Falling)" + } + ], + "consumables_pointer": 176, + "enemies": [ + "Rocky" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 145, + "unkn2": 6, + "x": 56, + "y": 152, + "name": "Grass Land 6 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 5, + 16 + ], + [ + 4, + 22 + ], + [ + 49, + 16 + ], + [ + 61, + 16 + ], + [ + 3, + 16 + ], + [ + 1, + 22 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Grass Land 6 - Enemy 11 (Rocky)", + "Grass Land 6 - Star 26", + "Grass Land 6 - Star 27", + "Grass Land 6 - Star 28", + "Grass Land 6 - Star 29", + "Grass Land 6 - 1-Up (Falling)" + ], + "music": 20 + }, + { + "name": "Grass Land 6 - 5", + "level": 1, + "stage": 6, + "room": 5, + "pointer": 3076769, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Grass Land 6 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 5, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Grass Land 6 - Pierre" + ], + "music": 8 + }, + { + "name": "Grass Land 6 - 6", + "level": 1, + "stage": 6, + "room": 6, + "pointer": 3047576, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 0, + "unkn1": 12, + "unkn2": 9, + "x": 840, + "y": 152, + "name": "Grass Land 6 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Grass Land 6 - Animal 1", + "Grass Land 6 - Animal 2" + ], + "music": 39 + }, + { + "name": "Grass Land 6 - 7", + "level": 1, + "stage": 6, + "room": 7, + "pointer": 3022909, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 12, + "unkn2": 6, + "x": 808, + "y": 120, + "name": "Grass Land 6 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Grass Land 6 - Animal 3", + "Grass Land 6 - Animal 4" + ], + "music": 38 + }, + { + "name": "Grass Land 6 - 8", + "level": 1, + "stage": 6, + "room": 8, + "pointer": 2884569, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Grass Land 6 - Complete" + ], + "music": 5 + }, + { + "name": "Grass Land Boss - 0", + "level": 1, + "stage": 7, + "room": 0, + "pointer": 2984105, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 0, + 18 + ] + ], + "locations": [ + "Grass Land - Boss (Whispy Woods) Purified", + "Level 1 Boss - Defeated", + "Level 1 Boss - Purified" + ], + "music": 2 + }, + { + "name": "Ripple Field 1 - 0", + "level": 2, + "stage": 1, + "room": 0, + "pointer": 3279855, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee", + "Glunk", + "Broom Hatter", + "Cappy" + ], + "default_exits": [ + { + "room": 2, + "unkn1": 102, + "unkn2": 8, + "x": 56, + "y": 152, + "name": "Ripple Field 1 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 16, + 16 + ], + [ + 0, + 16 + ], + [ + 12, + 16 + ], + [ + 11, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 1 - Enemy 1 (Waddle Dee)", + "Ripple Field 1 - Enemy 2 (Glunk)", + "Ripple Field 1 - Enemy 3 (Broom Hatter)", + "Ripple Field 1 - Enemy 4 (Cappy)", + "Ripple Field 1 - Star 1", + "Ripple Field 1 - Star 2", + "Ripple Field 1 - Star 3", + "Ripple Field 1 - Star 4", + "Ripple Field 1 - Star 5", + "Ripple Field 1 - Star 6" + ], + "music": 15 + }, + { + "name": "Ripple Field 1 - 1", + "level": 2, + "stage": 1, + "room": 1, + "pointer": 3588688, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bronto Burt", + "Rocky", + "Poppy Bros Jr." + ], + "default_exits": [ + { + "room": 3, + "unkn1": 146, + "unkn2": 11, + "x": 40, + "y": 232, + "name": "Ripple Field 1 - 1 Exit 0", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 73, + "unkn2": 16, + "x": 200, + "y": 184, + "name": "Ripple Field 1 - 1 Exit 1", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 108, + "unkn2": 16, + "x": 200, + "y": 184, + "name": "Ripple Field 1 - 1 Exit 2", + "access_rule": [] + }, + { + "room": 7, + "unkn1": 138, + "unkn2": 16, + "x": 200, + "y": 184, + "name": "Ripple Field 1 - 1 Exit 3", + "access_rule": [] + } + ], + "entity_load": [ + [ + 11, + 16 + ], + [ + 2, + 16 + ], + [ + 3, + 16 + ], + [ + 7, + 16 + ] + ], + "locations": [ + "Ripple Field 1 - Enemy 5 (Bronto Burt)", + "Ripple Field 1 - Enemy 6 (Rocky)", + "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)" + ], + "music": 15 + }, + { + "name": "Ripple Field 1 - 2", + "level": 2, + "stage": 1, + "room": 2, + "pointer": 2955848, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 18, + "unkn2": 9, + "x": 56, + "y": 168, + "name": "Ripple Field 1 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Ripple Field 1 - Animal 1", + "Ripple Field 1 - Animal 2" + ], + "music": 40 + }, + { + "name": "Ripple Field 1 - 3", + "level": 2, + "stage": 1, + "room": 3, + "pointer": 3558828, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bobin" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 171, + "unkn2": 5, + "x": 40, + "y": 152, + "name": "Ripple Field 1 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 73, + 16 + ], + [ + 6, + 22 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 0, + 16 + ], + [ + 10, + 23 + ] + ], + "locations": [ + "Ripple Field 1 - Enemy 8 (Bobin)", + "Ripple Field 1 - Star 7", + "Ripple Field 1 - Star 8", + "Ripple Field 1 - Star 9", + "Ripple Field 1 - Star 10", + "Ripple Field 1 - Star 11", + "Ripple Field 1 - Star 12", + "Ripple Field 1 - Star 13", + "Ripple Field 1 - Star 14", + "Ripple Field 1 - Star 15", + "Ripple Field 1 - Star 16" + ], + "music": 15 + }, + { + "name": "Ripple Field 1 - 4", + "level": 2, + "stage": 1, + "room": 4, + "pointer": 2974271, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Ripple Field 1 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 7, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Ripple Field 1 - Kamuribana" + ], + "music": 8 + }, + { + "name": "Ripple Field 1 - 5", + "level": 2, + "stage": 1, + "room": 5, + "pointer": 3051513, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 11, + "unkn2": 11, + "x": 1192, + "y": 264, + "name": "Ripple Field 1 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 7, + 19 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 1 - Star 17", + "Ripple Field 1 - Star 18" + ], + "music": 15 + }, + { + "name": "Ripple Field 1 - 6", + "level": 2, + "stage": 1, + "room": 6, + "pointer": 3049838, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 11, + "unkn2": 11, + "x": 1752, + "y": 264, + "name": "Ripple Field 1 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 7, + 19 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 1 - Star 19" + ], + "music": 15 + }, + { + "name": "Ripple Field 1 - 7", + "level": 2, + "stage": 1, + "room": 7, + "pointer": 3066407, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 11, + "unkn2": 11, + "x": 2232, + "y": 264, + "name": "Ripple Field 1 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 7, + 19 + ] + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 1 - 8", + "level": 2, + "stage": 1, + "room": 8, + "pointer": 2889148, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Ripple Field 1 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field 2 - 0", + "level": 2, + "stage": 2, + "room": 0, + "pointer": 3342336, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Togezo", + "Coconut", + "Blipper", + "Sasuke" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 103, + "unkn2": 15, + "x": 56, + "y": 104, + "name": "Ripple Field 2 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 5, + 22 + ], + [ + 34, + 16 + ], + [ + 30, + 16 + ], + [ + 21, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 18, + 16 + ] + ], + "locations": [ + "Ripple Field 2 - Enemy 1 (Togezo)", + "Ripple Field 2 - Enemy 2 (Coconut)", + "Ripple Field 2 - Enemy 3 (Blipper)", + "Ripple Field 2 - Enemy 4 (Sasuke)", + "Ripple Field 2 - Star 1", + "Ripple Field 2 - Star 2", + "Ripple Field 2 - Star 3", + "Ripple Field 2 - Star 4" + ], + "music": 10 + }, + { + "name": "Ripple Field 2 - 1", + "level": 2, + "stage": 2, + "room": 1, + "pointer": 3084099, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 3, + "unkn1": 23, + "unkn2": 8, + "x": 72, + "y": 248, + "name": "Ripple Field 2 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Ripple Field 2 - Animal 1", + "Ripple Field 2 - Animal 2" + ], + "music": 39 + }, + { + "name": "Ripple Field 2 - 2", + "level": 2, + "stage": 2, + "room": 2, + "pointer": 3451207, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Kany" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 31, + "unkn2": 5, + "x": 72, + "y": 152, + "name": "Ripple Field 2 - 2 Exit 0", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 96, + "unkn2": 6, + "x": 56, + "y": 152, + "name": "Ripple Field 2 - 2 Exit 1", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 56, + "unkn2": 17, + "x": 136, + "y": 264, + "name": "Ripple Field 2 - 2 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 29, + 16 + ], + [ + 47, + 16 + ], + [ + 1, + 16 + ], + [ + 46, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 2 - Enemy 5 (Kany)", + "Ripple Field 2 - Star 5", + "Ripple Field 2 - Star 6", + "Ripple Field 2 - Star 7", + "Ripple Field 2 - Star 8" + ], + "music": 10 + }, + { + "name": "Ripple Field 2 - 3", + "level": 2, + "stage": 2, + "room": 3, + "pointer": 3674327, + "animal_pointers": [], + "consumables": [ + { + "idx": 11, + "pointer": 480, + "x": 1384, + "y": 200, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 2 - Maxim Tomato (Currents)" + }, + { + "idx": 10, + "pointer": 520, + "x": 1456, + "y": 200, + "etype": 22, + "vtype": 0, + "name": "Ripple Field 2 - 1-Up (Currents)" + } + ], + "consumables_pointer": 128, + "enemies": [ + "Glunk" + ], + "default_exits": [ + { + "room": 2, + "unkn1": 134, + "unkn2": 5, + "x": 40, + "y": 136, + "name": "Ripple Field 2 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 22 + ], + [ + 2, + 22 + ], + [ + 14, + 23 + ], + [ + 16, + 16 + ], + [ + 21, + 16 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Ripple Field 2 - Enemy 6 (Glunk)", + "Ripple Field 2 - Star 9", + "Ripple Field 2 - Star 10", + "Ripple Field 2 - Star 11", + "Ripple Field 2 - Star 12", + "Ripple Field 2 - Star 13", + "Ripple Field 2 - Star 14", + "Ripple Field 2 - Star 15", + "Ripple Field 2 - Star 16", + "Ripple Field 2 - Star 17", + "Ripple Field 2 - Maxim Tomato (Currents)", + "Ripple Field 2 - 1-Up (Currents)" + ], + "music": 10 + }, + { + "name": "Ripple Field 2 - 4", + "level": 2, + "stage": 2, + "room": 4, + "pointer": 2972744, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 3, + "unkn2": 9, + "x": 520, + "y": 88, + "name": "Ripple Field 2 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 8, + 19 + ] + ], + "locations": [], + "music": 10 + }, + { + "name": "Ripple Field 2 - 5", + "level": 2, + "stage": 2, + "room": 5, + "pointer": 3109710, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 16, + "unkn2": 16, + "x": 1048, + "y": 280, + "name": "Ripple Field 2 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Ripple Field 2 - Animal 3", + "Ripple Field 2 - Animal 4" + ], + "music": 38 + }, + { + "name": "Ripple Field 2 - 6", + "level": 2, + "stage": 2, + "room": 6, + "pointer": 2973127, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Ripple Field 2 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 8, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Ripple Field 2 - Bakasa" + ], + "music": 8 + }, + { + "name": "Ripple Field 2 - 7", + "level": 2, + "stage": 2, + "room": 7, + "pointer": 2890353, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Ripple Field 2 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field 3 - 0", + "level": 2, + "stage": 3, + "room": 0, + "pointer": 3517254, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Raft Waddle Dee", + "Kapar", + "Blipper" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 105, + "unkn2": 8, + "x": 40, + "y": 104, + "name": "Ripple Field 3 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 21, + 16 + ], + [ + 57, + 16 + ], + [ + 62, + 16 + ], + [ + 67, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", + "Ripple Field 3 - Enemy 2 (Kapar)", + "Ripple Field 3 - Enemy 3 (Blipper)", + "Ripple Field 3 - Star 1", + "Ripple Field 3 - Star 2", + "Ripple Field 3 - Star 3", + "Ripple Field 3 - Star 4" + ], + "music": 18 + }, + { + "name": "Ripple Field 3 - 1", + "level": 2, + "stage": 3, + "room": 1, + "pointer": 3604480, + "animal_pointers": [], + "consumables": [ + { + "idx": 10, + "pointer": 320, + "x": 832, + "y": 152, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 3 - Maxim Tomato (Cove)" + }, + { + "idx": 13, + "pointer": 424, + "x": 1128, + "y": 384, + "etype": 22, + "vtype": 0, + "name": "Ripple Field 3 - 1-Up (Cutter/Spark)" + } + ], + "consumables_pointer": 160, + "enemies": [ + "Sparky", + "Glunk", + "Joe" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 80, + "unkn2": 24, + "x": 104, + "y": 328, + "name": "Ripple Field 3 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 13, + 23 + ], + [ + 14, + 23 + ], + [ + 91, + 16 + ], + [ + 16, + 16 + ], + [ + 2, + 22 + ], + [ + 8, + 16 + ], + [ + 0, + 22 + ] + ], + "locations": [ + "Ripple Field 3 - Enemy 4 (Sparky)", + "Ripple Field 3 - Enemy 5 (Glunk)", + "Ripple Field 3 - Enemy 6 (Joe)", + "Ripple Field 3 - Star 5", + "Ripple Field 3 - Star 6", + "Ripple Field 3 - Star 7", + "Ripple Field 3 - Star 8", + "Ripple Field 3 - Star 9", + "Ripple Field 3 - Star 10", + "Ripple Field 3 - Star 11", + "Ripple Field 3 - Maxim Tomato (Cove)", + "Ripple Field 3 - 1-Up (Cutter/Spark)" + ], + "music": 18 + }, + { + "name": "Ripple Field 3 - 2", + "level": 2, + "stage": 3, + "room": 2, + "pointer": 3715428, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bobo" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 118, + "unkn2": 9, + "x": 56, + "y": 152, + "name": "Ripple Field 3 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 91, + 16 + ], + [ + 16, + 16 + ], + [ + 21, + 16 + ], + [ + 4, + 22 + ], + [ + 46, + 16 + ], + [ + 47, + 16 + ], + [ + 5, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 3 - Enemy 7 (Bobo)", + "Ripple Field 3 - Star 12", + "Ripple Field 3 - Star 13", + "Ripple Field 3 - Star 14", + "Ripple Field 3 - Star 15", + "Ripple Field 3 - Star 16", + "Ripple Field 3 - Star 17", + "Ripple Field 3 - Star 18", + "Ripple Field 3 - Star 19", + "Ripple Field 3 - Star 20", + "Ripple Field 3 - Star 21" + ], + "music": 18 + }, + { + "name": "Ripple Field 3 - 3", + "level": 2, + "stage": 3, + "room": 3, + "pointer": 3071919, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 15, + "unkn2": 6, + "x": 56, + "y": 104, + "name": "Ripple Field 3 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Ripple Field 3 - Animal 1", + "Ripple Field 3 - Animal 2" + ], + "music": 39 + }, + { + "name": "Ripple Field 3 - 4", + "level": 2, + "stage": 3, + "room": 4, + "pointer": 2970810, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Ripple Field 3 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 9, + 19 + ] + ], + "locations": [ + "Ripple Field 3 - Elieel" + ], + "music": 8 + }, + { + "name": "Ripple Field 3 - 5", + "level": 2, + "stage": 3, + "room": 5, + "pointer": 2987502, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 15, + "unkn2": 9, + "x": 232, + "y": 88, + "name": "Ripple Field 3 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 9, + 19 + ] + ], + "locations": [], + "music": 31 + }, + { + "name": "Ripple Field 3 - 6", + "level": 2, + "stage": 3, + "room": 6, + "pointer": 2888666, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Ripple Field 3 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field 3 - 7", + "level": 2, + "stage": 3, + "room": 7, + "pointer": 3161120, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 5, + "unkn1": 3, + "unkn2": 5, + "x": 40, + "y": 152, + "name": "Ripple Field 3 - 7 Exit 0", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 11, + "unkn2": 20, + "x": 56, + "y": 216, + "name": "Ripple Field 3 - 7 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 57, + 16 + ] + ], + "locations": [], + "music": 18 + }, + { + "name": "Ripple Field 4 - 0", + "level": 2, + "stage": 4, + "room": 0, + "pointer": 3082540, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bukiset (Stone)", + "Bukiset (Needle)", + "Bukiset (Clean)", + "Bukiset (Parasol)", + "Mony" + ], + "default_exits": [ + { + "room": 6, + "unkn1": 4, + "unkn2": 16, + "x": 72, + "y": 232, + "name": "Ripple Field 4 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 79, + 16 + ], + [ + 80, + 16 + ], + [ + 81, + 16 + ], + [ + 4, + 22 + ], + [ + 20, + 16 + ], + [ + 77, + 16 + ] + ], + "locations": [ + "Ripple Field 4 - Enemy 1 (Bukiset (Stone))", + "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", + "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", + "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", + "Ripple Field 4 - Enemy 5 (Mony)", + "Ripple Field 4 - Star 1", + "Ripple Field 4 - Star 2", + "Ripple Field 4 - Star 3", + "Ripple Field 4 - Star 4", + "Ripple Field 4 - Star 5" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 1", + "level": 2, + "stage": 4, + "room": 1, + "pointer": 2964846, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 14, + "unkn2": 8, + "x": 72, + "y": 88, + "name": "Ripple Field 4 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 27 + ] + ], + "locations": [ + "Ripple Field 4 - Miniboss 1 (Captain Stitch)" + ], + "music": 4 + }, + { + "name": "Ripple Field 4 - 2", + "level": 2, + "stage": 4, + "room": 2, + "pointer": 3018503, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bukiset (Burning)" + ], + "default_exits": [ + { + "room": 11, + "unkn1": 25, + "unkn2": 5, + "x": 56, + "y": 88, + "name": "Ripple Field 4 - 2 Exit 0", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 25, + "unkn2": 15, + "x": 56, + "y": 216, + "name": "Ripple Field 4 - 2 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 19 + ], + [ + 76, + 16 + ] + ], + "locations": [ + "Ripple Field 4 - Enemy 6 (Bukiset (Burning))" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 3", + "level": 2, + "stage": 4, + "room": 3, + "pointer": 2988166, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 4, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Ripple Field 4 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Ripple Field 4 - Toad & Little Toad" + ], + "music": 8 + }, + { + "name": "Ripple Field 4 - 4", + "level": 2, + "stage": 4, + "room": 4, + "pointer": 2885533, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Ripple Field 4 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field 4 - 5", + "level": 2, + "stage": 4, + "room": 5, + "pointer": 3042349, + "animal_pointers": [ + 222, + 230, + 238 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 5, + "unkn2": 5, + "x": 360, + "y": 120, + "name": "Ripple Field 4 - 5 Exit 0", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 15, + "unkn2": 5, + "x": 488, + "y": 120, + "name": "Ripple Field 4 - 5 Exit 1", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 16, + "unkn2": 5, + "x": 104, + "y": 88, + "name": "Ripple Field 4 - 5 Exit 2", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 10, + "unkn2": 11, + "x": 440, + "y": 216, + "name": "Ripple Field 4 - 5 Exit 3", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Ripple Field 4 - Animal 1", + "Ripple Field 4 - Animal 2", + "Ripple Field 4 - Animal 3" + ], + "music": 40 + }, + { + "name": "Ripple Field 4 - 6", + "level": 2, + "stage": 4, + "room": 6, + "pointer": 3234805, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bobin", + "Blipper" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 21, + "unkn2": 7, + "x": 104, + "y": 88, + "name": "Ripple Field 4 - 6 Exit 0", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 31, + "unkn2": 7, + "x": 232, + "y": 88, + "name": "Ripple Field 4 - 6 Exit 1", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 26, + "unkn2": 13, + "x": 184, + "y": 184, + "name": "Ripple Field 4 - 6 Exit 2", + "access_rule": [] + }, + { + "room": 12, + "unkn1": 48, + "unkn2": 15, + "x": 88, + "y": 216, + "name": "Ripple Field 4 - 6 Exit 3", + "access_rule": [] + } + ], + "entity_load": [ + [ + 73, + 16 + ], + [ + 14, + 23 + ], + [ + 21, + 16 + ], + [ + 13, + 23 + ] + ], + "locations": [ + "Ripple Field 4 - Enemy 7 (Bobin)", + "Ripple Field 4 - Enemy 8 (Blipper)", + "Ripple Field 4 - Star 6", + "Ripple Field 4 - Star 7" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 7", + "level": 2, + "stage": 4, + "room": 7, + "pointer": 3155468, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 11, + "unkn2": 6, + "x": 104, + "y": 136, + "name": "Ripple Field 4 - 7 Exit 0", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 18, + "unkn2": 9, + "x": 72, + "y": 248, + "name": "Ripple Field 4 - 7 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 1, + 16 + ], + [ + 0, + 23 + ] + ], + "locations": [ + "Ripple Field 4 - Star 8", + "Ripple Field 4 - Star 9", + "Ripple Field 4 - Star 10", + "Ripple Field 4 - Star 11", + "Ripple Field 4 - Star 12", + "Ripple Field 4 - Star 13", + "Ripple Field 4 - Star 14", + "Ripple Field 4 - Star 15", + "Ripple Field 4 - Star 16", + "Ripple Field 4 - Star 17", + "Ripple Field 4 - Star 18", + "Ripple Field 4 - Star 19", + "Ripple Field 4 - Star 20", + "Ripple Field 4 - Star 21" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 8", + "level": 2, + "stage": 4, + "room": 8, + "pointer": 3350031, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Como", + "Oro" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 24, + "unkn2": 22, + "x": 184, + "y": 440, + "name": "Ripple Field 4 - 8 Exit 0", + "access_rule": [] + }, + { + "room": 7, + "unkn1": 34, + "unkn2": 22, + "x": 296, + "y": 440, + "name": "Ripple Field 4 - 8 Exit 1", + "access_rule": [] + }, + { + "room": 9, + "unkn1": 16, + "unkn2": 72, + "x": 168, + "y": 152, + "name": "Ripple Field 4 - 8 Exit 2", + "access_rule": [] + }, + { + "room": 10, + "unkn1": 23, + "unkn2": 72, + "x": 120, + "y": 152, + "name": "Ripple Field 4 - 8 Exit 3", + "access_rule": [] + } + ], + "entity_load": [ + [ + 41, + 16 + ], + [ + 68, + 16 + ], + [ + 14, + 23 + ], + [ + 25, + 16 + ], + [ + 6, + 23 + ] + ], + "locations": [ + "Ripple Field 4 - Enemy 9 (Como)", + "Ripple Field 4 - Enemy 10 (Oro)", + "Ripple Field 4 - Star 22", + "Ripple Field 4 - Star 23", + "Ripple Field 4 - Star 24", + "Ripple Field 4 - Star 25", + "Ripple Field 4 - Star 26", + "Ripple Field 4 - Star 27", + "Ripple Field 4 - Star 28" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 9", + "level": 2, + "stage": 4, + "room": 9, + "pointer": 3050397, + "animal_pointers": [], + "consumables": [ + { + "idx": 29, + "pointer": 200, + "x": 88, + "y": 200, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 4 - Maxim Tomato (Stone)" + } + ], + "consumables_pointer": 176, + "enemies": [ + "Gansan" + ], + "default_exits": [ + { + "room": 8, + "unkn1": 11, + "unkn2": 9, + "x": 264, + "y": 1144, + "name": "Ripple Field 4 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 75, + 16 + ], + [ + 2, + 22 + ] + ], + "locations": [ + "Ripple Field 4 - Enemy 11 (Gansan)", + "Ripple Field 4 - Maxim Tomato (Stone)" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 10", + "level": 2, + "stage": 4, + "room": 10, + "pointer": 3052069, + "animal_pointers": [], + "consumables": [ + { + "idx": 30, + "pointer": 192, + "x": 200, + "y": 200, + "etype": 22, + "vtype": 0, + "name": "Ripple Field 4 - 1-Up (Stone)" + } + ], + "consumables_pointer": 128, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 6, + "unkn2": 9, + "x": 376, + "y": 1144, + "name": "Ripple Field 4 - 10 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 22 + ], + [ + 75, + 16 + ] + ], + "locations": [ + "Ripple Field 4 - 1-Up (Stone)" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 11", + "level": 2, + "stage": 4, + "room": 11, + "pointer": 3386974, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee", + "Kapar", + "Squishy" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 146, + "unkn2": 13, + "x": 72, + "y": 152, + "name": "Ripple Field 4 - 11 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 22, + 16 + ], + [ + 67, + 16 + ], + [ + 14, + 23 + ], + [ + 62, + 16 + ], + [ + 0, + 16 + ] + ], + "locations": [ + "Ripple Field 4 - Enemy 12 (Waddle Dee)", + "Ripple Field 4 - Enemy 13 (Kapar)", + "Ripple Field 4 - Enemy 14 (Squishy)", + "Ripple Field 4 - Star 29", + "Ripple Field 4 - Star 30", + "Ripple Field 4 - Star 31", + "Ripple Field 4 - Star 32", + "Ripple Field 4 - Star 33", + "Ripple Field 4 - Star 34", + "Ripple Field 4 - Star 35", + "Ripple Field 4 - Star 36", + "Ripple Field 4 - Star 37", + "Ripple Field 4 - Star 38", + "Ripple Field 4 - Star 39", + "Ripple Field 4 - Star 40", + "Ripple Field 4 - Star 41", + "Ripple Field 4 - Star 42", + "Ripple Field 4 - Star 43" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 12", + "level": 2, + "stage": 4, + "room": 12, + "pointer": 3168339, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Nidoo" + ], + "default_exits": [ + { + "room": 8, + "unkn1": 67, + "unkn2": 7, + "x": 88, + "y": 1224, + "name": "Ripple Field 4 - 12 Exit 0", + "access_rule": [] + }, + { + "room": 13, + "unkn1": 75, + "unkn2": 7, + "x": 88, + "y": 136, + "name": "Ripple Field 4 - 12 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 59, + 16 + ], + [ + 13, + 23 + ], + [ + 28, + 16 + ] + ], + "locations": [ + "Ripple Field 4 - Enemy 15 (Nidoo)" + ], + "music": 15 + }, + { + "name": "Ripple Field 4 - 13", + "level": 2, + "stage": 4, + "room": 13, + "pointer": 2958478, + "animal_pointers": [], + "consumables": [ + { + "idx": 54, + "pointer": 264, + "x": 216, + "y": 136, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 4 - Maxim Tomato (Dark)" + } + ], + "consumables_pointer": 128, + "enemies": [], + "default_exits": [ + { + "room": 12, + "unkn1": 4, + "unkn2": 8, + "x": 1192, + "y": 120, + "name": "Ripple Field 4 - 13 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 2, + 22 + ], + [ + 59, + 16 + ] + ], + "locations": [ + "Ripple Field 4 - Star 44", + "Ripple Field 4 - Star 45", + "Ripple Field 4 - Star 46", + "Ripple Field 4 - Star 47", + "Ripple Field 4 - Star 48", + "Ripple Field 4 - Star 49", + "Ripple Field 4 - Star 50", + "Ripple Field 4 - Star 51", + "Ripple Field 4 - Maxim Tomato (Dark)" + ], + "music": 15 + }, + { + "name": "Ripple Field 5 - 0", + "level": 2, + "stage": 5, + "room": 0, + "pointer": 3240369, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 9, + "unkn2": 43, + "x": 88, + "y": 344, + "name": "Ripple Field 5 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 5 - Star 1", + "Ripple Field 5 - Star 2", + "Ripple Field 5 - Star 3", + "Ripple Field 5 - Star 4", + "Ripple Field 5 - Star 5", + "Ripple Field 5 - Star 6" + ], + "music": 16 + }, + { + "name": "Ripple Field 5 - 1", + "level": 2, + "stage": 5, + "room": 1, + "pointer": 3547528, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 15, + "unkn2": 4, + "x": 184, + "y": 344, + "name": "Ripple Field 5 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 1, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 5 - Star 7", + "Ripple Field 5 - Star 8", + "Ripple Field 5 - Star 9", + "Ripple Field 5 - Star 10", + "Ripple Field 5 - Star 11", + "Ripple Field 5 - Star 12", + "Ripple Field 5 - Star 13", + "Ripple Field 5 - Star 14", + "Ripple Field 5 - Star 15", + "Ripple Field 5 - Star 16", + "Ripple Field 5 - Star 17" + ], + "music": 16 + }, + { + "name": "Ripple Field 5 - 2", + "level": 2, + "stage": 5, + "room": 2, + "pointer": 3611327, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Glunk", + "Joe" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 95, + "unkn2": 21, + "x": 56, + "y": 184, + "name": "Ripple Field 5 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 91, + 16 + ], + [ + 16, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 5 - Enemy 1 (Glunk)", + "Ripple Field 5 - Enemy 2 (Joe)", + "Ripple Field 5 - Star 18", + "Ripple Field 5 - Star 19", + "Ripple Field 5 - Star 20", + "Ripple Field 5 - Star 21", + "Ripple Field 5 - Star 22", + "Ripple Field 5 - Star 23", + "Ripple Field 5 - Star 24", + "Ripple Field 5 - Star 25", + "Ripple Field 5 - Star 26", + "Ripple Field 5 - Star 27", + "Ripple Field 5 - Star 28", + "Ripple Field 5 - Star 29", + "Ripple Field 5 - Star 30", + "Ripple Field 5 - Star 31" + ], + "music": 16 + }, + { + "name": "Ripple Field 5 - 3", + "level": 2, + "stage": 5, + "room": 3, + "pointer": 3926157, + "animal_pointers": [], + "consumables": [ + { + "idx": 32, + "pointer": 1258, + "x": 1488, + "y": 192, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 5 - Maxim Tomato (Currents)" + }, + { + "idx": 31, + "pointer": 1290, + "x": 1520, + "y": 192, + "etype": 22, + "vtype": 0, + "name": "Ripple Field 5 - 1-Up (Currents)" + } + ], + "consumables_pointer": 128, + "enemies": [ + "Bobin", + "Mony", + "Squishy" + ], + "default_exits": [ + { + "room": 8, + "unkn1": 4, + "unkn2": 38, + "x": 152, + "y": 152, + "name": "Ripple Field 5 - 3 Exit 0", + "access_rule": [] + }, + { + "room": 1, + "unkn1": 95, + "unkn2": 38, + "x": 248, + "y": 1064, + "name": "Ripple Field 5 - 3 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 22 + ], + [ + 2, + 22 + ], + [ + 6, + 22 + ], + [ + 14, + 23 + ], + [ + 1, + 16 + ], + [ + 73, + 16 + ], + [ + 22, + 16 + ], + [ + 20, + 16 + ] + ], + "locations": [ + "Ripple Field 5 - Enemy 3 (Bobin)", + "Ripple Field 5 - Enemy 4 (Mony)", + "Ripple Field 5 - Enemy 5 (Squishy)", + "Ripple Field 5 - Star 32", + "Ripple Field 5 - Star 33", + "Ripple Field 5 - Star 34", + "Ripple Field 5 - Star 35", + "Ripple Field 5 - Star 36", + "Ripple Field 5 - Star 37", + "Ripple Field 5 - Maxim Tomato (Currents)", + "Ripple Field 5 - 1-Up (Currents)" + ], + "music": 16 + }, + { + "name": "Ripple Field 5 - 4", + "level": 2, + "stage": 5, + "room": 4, + "pointer": 3026639, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 5, + "unkn1": 14, + "unkn2": 4, + "x": 232, + "y": 152, + "name": "Ripple Field 5 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Ripple Field 5 - Animal 1" + ], + "music": 40 + }, + { + "name": "Ripple Field 5 - 5", + "level": 2, + "stage": 5, + "room": 5, + "pointer": 3207333, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 4, + "unkn1": 4, + "unkn2": 9, + "x": 56, + "y": 72, + "name": "Ripple Field 5 - 5 Exit 0", + "access_rule": [] + }, + { + "room": 7, + "unkn1": 24, + "unkn2": 9, + "x": 120, + "y": 552, + "name": "Ripple Field 5 - 5 Exit 1", + "access_rule": [ + "Kine" + ] + } + ], + "entity_load": [ + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 5 - Star 38", + "Ripple Field 5 - Star 39", + "Ripple Field 5 - Star 40", + "Ripple Field 5 - Star 41", + "Ripple Field 5 - Star 42" + ], + "music": 16 + }, + { + "name": "Ripple Field 5 - 6", + "level": 2, + "stage": 5, + "room": 6, + "pointer": 3485896, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Yaban", + "Broom Hatter", + "Bouncy" + ], + "default_exits": [ + { + "room": 9, + "unkn1": 121, + "unkn2": 11, + "x": 56, + "y": 152, + "name": "Ripple Field 5 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 6, + 22 + ], + [ + 22, + 16 + ], + [ + 14, + 23 + ], + [ + 13, + 16 + ], + [ + 11, + 16 + ], + [ + 32, + 16 + ] + ], + "locations": [ + "Ripple Field 5 - Enemy 6 (Yaban)", + "Ripple Field 5 - Enemy 7 (Broom Hatter)", + "Ripple Field 5 - Enemy 8 (Bouncy)", + "Ripple Field 5 - Star 43", + "Ripple Field 5 - Star 44", + "Ripple Field 5 - Star 45" + ], + "music": 16 + }, + { + "name": "Ripple Field 5 - 7", + "level": 2, + "stage": 5, + "room": 7, + "pointer": 3752698, + "animal_pointers": [], + "consumables": [ + { + "idx": 53, + "pointer": 418, + "x": 1512, + "y": 608, + "etype": 22, + "vtype": 2, + "name": "Ripple Field 5 - Maxim Tomato (Exit)" + } + ], + "consumables_pointer": 352, + "enemies": [ + "Sparky", + "Rocky", + "Babut" + ], + "default_exits": [ + { + "room": 10, + "unkn1": 45, + "unkn2": 31, + "x": 152, + "y": 152, + "name": "Ripple Field 5 - 7 Exit 0", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 94, + "unkn2": 40, + "x": 88, + "y": 200, + "name": "Ripple Field 5 - 7 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 3, + 16 + ], + [ + 43, + 16 + ], + [ + 8, + 16 + ], + [ + 22, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 22 + ] + ], + "locations": [ + "Ripple Field 5 - Enemy 9 (Sparky)", + "Ripple Field 5 - Enemy 10 (Rocky)", + "Ripple Field 5 - Enemy 11 (Babut)", + "Ripple Field 5 - Star 46", + "Ripple Field 5 - Star 47", + "Ripple Field 5 - Star 48", + "Ripple Field 5 - Star 49", + "Ripple Field 5 - Maxim Tomato (Exit)" + ], + "music": 16 + }, + { + "name": "Ripple Field 5 - 8", + "level": 2, + "stage": 5, + "room": 8, + "pointer": 3044682, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 3, + "unkn1": 8, + "unkn2": 9, + "x": 88, + "y": 616, + "name": "Ripple Field 5 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Ripple Field 5 - Animal 2" + ], + "music": 39 + }, + { + "name": "Ripple Field 5 - 9", + "level": 2, + "stage": 5, + "room": 9, + "pointer": 2963193, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 11, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Ripple Field 5 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 11, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Ripple Field 5 - Mama Pitch" + ], + "music": 8 + }, + { + "name": "Ripple Field 5 - 10", + "level": 2, + "stage": 5, + "room": 10, + "pointer": 3042934, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Galbo" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 8, + "unkn2": 9, + "x": 712, + "y": 504, + "name": "Ripple Field 5 - 10 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 26, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 5 - Enemy 12 (Galbo)", + "Ripple Field 5 - Star 50", + "Ripple Field 5 - Star 51" + ], + "music": 16 + }, + { + "name": "Ripple Field 5 - 11", + "level": 2, + "stage": 5, + "room": 11, + "pointer": 2886256, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Ripple Field 5 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field 6 - 0", + "level": 2, + "stage": 6, + "room": 0, + "pointer": 2949576, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Kany" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 56, + "unkn2": 7, + "x": 40, + "y": 152, + "name": "Ripple Field 6 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 29, + 16 + ], + [ + 13, + 23 + ] + ], + "locations": [ + "Ripple Field 6 - Enemy 1 (Kany)" + ], + "music": 15 + }, + { + "name": "Ripple Field 6 - 1", + "level": 2, + "stage": 6, + "room": 1, + "pointer": 2971200, + "animal_pointers": [ + 192, + 200, + 208 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 23, + "unkn2": 9, + "x": 56, + "y": 264, + "name": "Ripple Field 6 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Ripple Field 6 - Animal 1", + "Ripple Field 6 - Animal 2", + "Ripple Field 6 - Animal 3" + ], + "music": 38 + }, + { + "name": "Ripple Field 6 - 2", + "level": 2, + "stage": 6, + "room": 2, + "pointer": 3637749, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 95, + "unkn2": 9, + "x": 104, + "y": 872, + "name": "Ripple Field 6 - 2 Exit 0", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 50, + "unkn2": 22, + "x": 184, + "y": 88, + "name": "Ripple Field 6 - 2 Exit 1", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 45, + "unkn2": 26, + "x": 88, + "y": 88, + "name": "Ripple Field 6 - 2 Exit 2", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 55, + "unkn2": 26, + "x": 248, + "y": 88, + "name": "Ripple Field 6 - 2 Exit 3", + "access_rule": [] + } + ], + "entity_load": [ + [ + 52, + 16 + ], + [ + 13, + 23 + ] + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 3", + "level": 2, + "stage": 6, + "room": 3, + "pointer": 3092564, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 4, + "unkn2": 5, + "x": 744, + "y": 424, + "name": "Ripple Field 6 - 3 Exit 0", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 16, + "unkn2": 5, + "x": 872, + "y": 424, + "name": "Ripple Field 6 - 3 Exit 1", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 4", + "level": 2, + "stage": 6, + "room": 4, + "pointer": 3133247, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 10, + "unkn2": 5, + "x": 824, + "y": 360, + "name": "Ripple Field 6 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 12, + 19 + ] + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 5", + "level": 2, + "stage": 6, + "room": 5, + "pointer": 3507762, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 76, + "unkn2": 4, + "x": 680, + "y": 72, + "name": "Ripple Field 6 - 5 Exit 0", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 49, + "unkn2": 6, + "x": 440, + "y": 104, + "name": "Ripple Field 6 - 5 Exit 1", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 49, + "unkn2": 10, + "x": 440, + "y": 168, + "name": "Ripple Field 6 - 5 Exit 2", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 88, + "unkn2": 10, + "x": 104, + "y": 152, + "name": "Ripple Field 6 - 5 Exit 3", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 22, + "unkn2": 12, + "x": 200, + "y": 200, + "name": "Ripple Field 6 - 5 Exit 4", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 76, + "unkn2": 12, + "x": 680, + "y": 200, + "name": "Ripple Field 6 - 5 Exit 5", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 76, + "unkn2": 16, + "x": 680, + "y": 264, + "name": "Ripple Field 6 - 5 Exit 6", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ] + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 6", + "level": 2, + "stage": 6, + "room": 6, + "pointer": 3211264, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 5, + "unkn1": 4, + "unkn2": 10, + "x": 72, + "y": 168, + "name": "Ripple Field 6 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 6, + 23 + ] + ], + "locations": [], + "music": 15 + }, + { + "name": "Ripple Field 6 - 7", + "level": 2, + "stage": 6, + "room": 7, + "pointer": 3586039, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "KeKe", + "Kapar", + "Rocky", + "Poppy Bros Jr." + ], + "default_exits": [ + { + "room": 5, + "unkn1": 134, + "unkn2": 16, + "x": 72, + "y": 168, + "name": "Ripple Field 6 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 3, + 16 + ], + [ + 67, + 16 + ], + [ + 51, + 16 + ], + [ + 7, + 16 + ] + ], + "locations": [ + "Ripple Field 6 - Enemy 2 (KeKe)", + "Ripple Field 6 - Enemy 3 (Kapar)", + "Ripple Field 6 - Enemy 4 (Rocky)", + "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)", + "Ripple Field 6 - Star 1", + "Ripple Field 6 - Star 2", + "Ripple Field 6 - Star 3", + "Ripple Field 6 - Star 4", + "Ripple Field 6 - Star 5", + "Ripple Field 6 - Star 6", + "Ripple Field 6 - Star 7", + "Ripple Field 6 - Star 8", + "Ripple Field 6 - Star 9", + "Ripple Field 6 - Star 10", + "Ripple Field 6 - Star 11", + "Ripple Field 6 - Star 12", + "Ripple Field 6 - Star 13", + "Ripple Field 6 - Star 14" + ], + "music": 15 + }, + { + "name": "Ripple Field 6 - 8", + "level": 2, + "stage": 6, + "room": 8, + "pointer": 3621483, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Propeller", + "Coconut", + "Sasuke", + "Nruff" + ], + "default_exits": [ + { + "room": 10, + "unkn1": 70, + "unkn2": 11, + "x": 56, + "y": 152, + "name": "Ripple Field 6 - 8 Exit 0", + "access_rule": [] + }, + { + "room": 9, + "unkn1": 26, + "unkn2": 54, + "x": 72, + "y": 152, + "name": "Ripple Field 6 - 8 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 89, + 16 + ], + [ + 15, + 16 + ], + [ + 30, + 16 + ], + [ + 34, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Ripple Field 6 - Enemy 6 (Propeller)", + "Ripple Field 6 - Enemy 7 (Coconut)", + "Ripple Field 6 - Enemy 8 (Sasuke)", + "Ripple Field 6 - Enemy 9 (Nruff)", + "Ripple Field 6 - Star 15", + "Ripple Field 6 - Star 16", + "Ripple Field 6 - Star 17", + "Ripple Field 6 - Star 18", + "Ripple Field 6 - Star 19", + "Ripple Field 6 - Star 20", + "Ripple Field 6 - Star 21", + "Ripple Field 6 - Star 22", + "Ripple Field 6 - Star 23" + ], + "music": 15 + }, + { + "name": "Ripple Field 6 - 9", + "level": 2, + "stage": 6, + "room": 9, + "pointer": 2954523, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 3, + "unkn2": 9, + "x": 408, + "y": 872, + "name": "Ripple Field 6 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Ripple Field 6 - Animal 4" + ], + "music": 39 + }, + { + "name": "Ripple Field 6 - 10", + "level": 2, + "stage": 6, + "room": 10, + "pointer": 3069438, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 11, + "unkn1": 15, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Ripple Field 6 - 10 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 12, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Ripple Field 6 - HB-002" + ], + "music": 8 + }, + { + "name": "Ripple Field 6 - 11", + "level": 2, + "stage": 6, + "room": 11, + "pointer": 2886497, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Ripple Field 6 - Complete" + ], + "music": 5 + }, + { + "name": "Ripple Field Boss - 0", + "level": 2, + "stage": 7, + "room": 0, + "pointer": 3157370, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 7, + 18 + ] + ], + "locations": [ + "Ripple Field - Boss (Acro) Purified", + "Level 2 Boss - Defeated", + "Level 2 Boss - Purified" + ], + "music": 2 + }, + { + "name": "Sand Canyon 1 - 0", + "level": 3, + "stage": 1, + "room": 0, + "pointer": 3524267, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bronto Burt", + "Galbo" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 196, + "unkn2": 7, + "x": 72, + "y": 152, + "name": "Sand Canyon 1 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 19 + ], + [ + 1, + 16 + ], + [ + 26, + 16 + ], + [ + 2, + 16 + ] + ], + "locations": [ + "Sand Canyon 1 - Enemy 1 (Bronto Burt)", + "Sand Canyon 1 - Enemy 2 (Galbo)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 1", + "level": 3, + "stage": 1, + "room": 1, + "pointer": 3163860, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 34, + "unkn2": 5, + "x": 104, + "y": 408, + "name": "Sand Canyon 1 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Sand Canyon 1 - Animal 1", + "Sand Canyon 1 - Animal 2" + ], + "music": 38 + }, + { + "name": "Sand Canyon 1 - 2", + "level": 3, + "stage": 1, + "room": 2, + "pointer": 3512532, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Oro" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 73, + "unkn2": 6, + "x": 56, + "y": 120, + "name": "Sand Canyon 1 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 16 + ], + [ + 26, + 16 + ], + [ + 25, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ], + [ + 1, + 23 + ], + [ + 0, + 23 + ], + [ + 4, + 23 + ] + ], + "locations": [ + "Sand Canyon 1 - Enemy 3 (Oro)", + "Sand Canyon 1 - Star 1", + "Sand Canyon 1 - Star 2", + "Sand Canyon 1 - Star 3", + "Sand Canyon 1 - Star 4" + ], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 3", + "level": 3, + "stage": 1, + "room": 3, + "pointer": 3719146, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sparky", + "Propeller", + "Gansan", + "Babut" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 25, + "unkn2": 73, + "x": 72, + "y": 280, + "name": "Sand Canyon 1 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 89, + 16 + ], + [ + 75, + 16 + ], + [ + 43, + 16 + ], + [ + 8, + 16 + ] + ], + "locations": [ + "Sand Canyon 1 - Enemy 4 (Sparky)", + "Sand Canyon 1 - Enemy 5 (Propeller)", + "Sand Canyon 1 - Enemy 6 (Gansan)", + "Sand Canyon 1 - Enemy 7 (Babut)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 4", + "level": 3, + "stage": 1, + "room": 4, + "pointer": 3421212, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Loud", + "Dogon", + "Bouncy", + "Pteran" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 196, + "unkn2": 8, + "x": 56, + "y": 152, + "name": "Sand Canyon 1 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 90, + 16 + ], + [ + 13, + 16 + ], + [ + 40, + 16 + ], + [ + 14, + 23 + ], + [ + 39, + 16 + ] + ], + "locations": [ + "Sand Canyon 1 - Enemy 8 (Loud)", + "Sand Canyon 1 - Enemy 9 (Dogon)", + "Sand Canyon 1 - Enemy 10 (Bouncy)", + "Sand Canyon 1 - Enemy 11 (Pteran)", + "Sand Canyon 1 - Star 5", + "Sand Canyon 1 - Star 6", + "Sand Canyon 1 - Star 7", + "Sand Canyon 1 - Star 8", + "Sand Canyon 1 - Star 9", + "Sand Canyon 1 - Star 10" + ], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 5", + "level": 3, + "stage": 1, + "room": 5, + "pointer": 3203325, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Polof" + ], + "default_exits": [ + { + "room": 6, + "unkn1": 32, + "unkn2": 9, + "x": 104, + "y": 152, + "name": "Sand Canyon 1 - 5 Exit 0", + "access_rule": [] + }, + { + "room": 1, + "unkn1": 46, + "unkn2": 9, + "x": 56, + "y": 344, + "name": "Sand Canyon 1 - 5 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 9, + 16 + ] + ], + "locations": [ + "Sand Canyon 1 - Enemy 12 (Polof)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 6", + "level": 3, + "stage": 1, + "room": 6, + "pointer": 3138524, + "animal_pointers": [], + "consumables": [ + { + "idx": 23, + "pointer": 248, + "x": 168, + "y": 104, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 1 - 1-Up (Polof)" + } + ], + "consumables_pointer": 128, + "enemies": [], + "default_exits": [ + { + "room": 5, + "unkn1": 5, + "unkn2": 9, + "x": 536, + "y": 152, + "name": "Sand Canyon 1 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 0, + 22 + ] + ], + "locations": [ + "Sand Canyon 1 - Star 11", + "Sand Canyon 1 - Star 12", + "Sand Canyon 1 - Star 13", + "Sand Canyon 1 - Star 14", + "Sand Canyon 1 - Star 15", + "Sand Canyon 1 - Star 16", + "Sand Canyon 1 - Star 17", + "Sand Canyon 1 - Star 18", + "Sand Canyon 1 - Star 19", + "Sand Canyon 1 - Star 20", + "Sand Canyon 1 - Star 21", + "Sand Canyon 1 - Star 22", + "Sand Canyon 1 - 1-Up (Polof)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 1 - 7", + "level": 3, + "stage": 1, + "room": 7, + "pointer": 2988822, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 15, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Sand Canyon 1 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Sand Canyon 1 - Geromuzudake" + ], + "music": 8 + }, + { + "name": "Sand Canyon 1 - 8", + "level": 3, + "stage": 1, + "room": 8, + "pointer": 2885292, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Sand Canyon 1 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon 2 - 0", + "level": 3, + "stage": 2, + "room": 0, + "pointer": 3668370, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "KeKe", + "Doka", + "Boten" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 178, + "unkn2": 8, + "x": 184, + "y": 104, + "name": "Sand Canyon 2 - 0 Exit 0", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 244, + "unkn2": 11, + "x": 56, + "y": 152, + "name": "Sand Canyon 2 - 0 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 35, + 16 + ], + [ + 33, + 16 + ], + [ + 14, + 23 + ], + [ + 51, + 16 + ], + [ + 47, + 16 + ], + [ + 46, + 16 + ] + ], + "locations": [ + "Sand Canyon 2 - Enemy 1 (KeKe)", + "Sand Canyon 2 - Enemy 2 (Doka)", + "Sand Canyon 2 - Enemy 3 (Boten)", + "Sand Canyon 2 - Star 1", + "Sand Canyon 2 - Star 2", + "Sand Canyon 2 - Star 3", + "Sand Canyon 2 - Star 4", + "Sand Canyon 2 - Star 5", + "Sand Canyon 2 - Star 6", + "Sand Canyon 2 - Star 7", + "Sand Canyon 2 - Star 8", + "Sand Canyon 2 - Star 9", + "Sand Canyon 2 - Star 10", + "Sand Canyon 2 - Star 11" + ], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 1", + "level": 3, + "stage": 2, + "room": 1, + "pointer": 2952738, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 0, + "unkn1": 10, + "unkn2": 6, + "x": 2872, + "y": 136, + "name": "Sand Canyon 2 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Sand Canyon 2 - Animal 1", + "Sand Canyon 2 - Animal 2" + ], + "music": 40 + }, + { + "name": "Sand Canyon 2 - 2", + "level": 3, + "stage": 2, + "room": 2, + "pointer": 3531156, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Propeller" + ], + "default_exits": [ + { + "room": 9, + "unkn1": 45, + "unkn2": 60, + "x": 88, + "y": 184, + "name": "Sand Canyon 2 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 6, + 23 + ], + [ + 89, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Sand Canyon 2 - Enemy 4 (Propeller)", + "Sand Canyon 2 - Star 12", + "Sand Canyon 2 - Star 13", + "Sand Canyon 2 - Star 14", + "Sand Canyon 2 - Star 15", + "Sand Canyon 2 - Star 16", + "Sand Canyon 2 - Star 17" + ], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 3", + "level": 3, + "stage": 2, + "room": 3, + "pointer": 3263731, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee", + "Sparky", + "Sasuke", + "Como" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 63, + "unkn2": 5, + "x": 88, + "y": 184, + "name": "Sand Canyon 2 - 3 Exit 0", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 68, + "unkn2": 5, + "x": 184, + "y": 184, + "name": "Sand Canyon 2 - 3 Exit 1", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 73, + "unkn2": 5, + "x": 248, + "y": 184, + "name": "Sand Canyon 2 - 3 Exit 2", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 130, + "unkn2": 9, + "x": 72, + "y": 312, + "name": "Sand Canyon 2 - 3 Exit 3", + "access_rule": [] + } + ], + "entity_load": [ + [ + 41, + 16 + ], + [ + 8, + 16 + ], + [ + 30, + 16 + ], + [ + 0, + 16 + ] + ], + "locations": [ + "Sand Canyon 2 - Enemy 5 (Waddle Dee)", + "Sand Canyon 2 - Enemy 6 (Sparky)", + "Sand Canyon 2 - Enemy 7 (Sasuke)", + "Sand Canyon 2 - Enemy 8 (Como)" + ], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 4", + "level": 3, + "stage": 2, + "room": 4, + "pointer": 3076300, + "animal_pointers": [], + "consumables": [ + { + "idx": 19, + "pointer": 228, + "x": 168, + "y": 72, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 2 - 1-Up (Enclave)" + } + ], + "consumables_pointer": 128, + "enemies": [], + "default_exits": [ + { + "room": 3, + "unkn1": 5, + "unkn2": 11, + "x": 1016, + "y": 88, + "name": "Sand Canyon 2 - 4 Exit 0", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 10, + "unkn2": 11, + "x": 1112, + "y": 88, + "name": "Sand Canyon 2 - 4 Exit 1", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 15, + "unkn2": 11, + "x": 1176, + "y": 88, + "name": "Sand Canyon 2 - 4 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 0, + 22 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Sand Canyon 2 - Star 18", + "Sand Canyon 2 - Star 19", + "Sand Canyon 2 - 1-Up (Enclave)" + ], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 5", + "level": 3, + "stage": 2, + "room": 5, + "pointer": 3302133, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bukiset (Ice)", + "Bukiset (Needle)", + "Bukiset (Clean)", + "Bukiset (Parasol)", + "Bukiset (Spark)", + "Bukiset (Cutter)" + ], + "default_exits": [ + { + "room": 6, + "unkn1": 63, + "unkn2": 15, + "x": 120, + "y": 216, + "name": "Sand Canyon 2 - 5 Exit 0", + "access_rule": [] + }, + { + "room": 8, + "unkn1": 71, + "unkn2": 18, + "x": 152, + "y": 136, + "name": "Sand Canyon 2 - 5 Exit 1", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 130, + "unkn2": 19, + "x": 72, + "y": 952, + "name": "Sand Canyon 2 - 5 Exit 2", + "access_rule": [] + }, + { + "room": 7, + "unkn1": 56, + "unkn2": 23, + "x": 88, + "y": 216, + "name": "Sand Canyon 2 - 5 Exit 3", + "access_rule": [] + } + ], + "entity_load": [ + [ + 80, + 16 + ], + [ + 78, + 16 + ], + [ + 81, + 16 + ], + [ + 83, + 16 + ], + [ + 79, + 16 + ], + [ + 82, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", + "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", + "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", + "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", + "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", + "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))", + "Sand Canyon 2 - Star 20", + "Sand Canyon 2 - Star 21", + "Sand Canyon 2 - Star 22", + "Sand Canyon 2 - Star 23", + "Sand Canyon 2 - Star 24", + "Sand Canyon 2 - Star 25", + "Sand Canyon 2 - Star 26", + "Sand Canyon 2 - Star 27", + "Sand Canyon 2 - Star 28", + "Sand Canyon 2 - Star 29", + "Sand Canyon 2 - Star 30", + "Sand Canyon 2 - Star 31", + "Sand Canyon 2 - Star 32", + "Sand Canyon 2 - Star 33" + ], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 6", + "level": 3, + "stage": 2, + "room": 6, + "pointer": 3800612, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Nidoo" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 17, + "unkn2": 13, + "x": 1144, + "y": 248, + "name": "Sand Canyon 2 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 28, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Sand Canyon 2 - Enemy 15 (Nidoo)", + "Sand Canyon 2 - Star 34" + ], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 7", + "level": 3, + "stage": 2, + "room": 7, + "pointer": 3073888, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 5, + "unkn1": 15, + "unkn2": 8, + "x": 1016, + "y": 296, + "name": "Sand Canyon 2 - 7 Exit 0", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 5, + "unkn2": 13, + "x": 904, + "y": 376, + "name": "Sand Canyon 2 - 7 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 15, + 19 + ] + ], + "locations": [], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 8", + "level": 3, + "stage": 2, + "room": 8, + "pointer": 3061270, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Mariel" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 19, + "unkn2": 13, + "x": 1256, + "y": 376, + "name": "Sand Canyon 2 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 45, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Sand Canyon 2 - Enemy 16 (Mariel)", + "Sand Canyon 2 - Star 35" + ], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 9", + "level": 3, + "stage": 2, + "room": 9, + "pointer": 3453286, + "animal_pointers": [], + "consumables": [ + { + "idx": 51, + "pointer": 240, + "x": 1408, + "y": 216, + "etype": 22, + "vtype": 2, + "name": "Sand Canyon 2 - Maxim Tomato (Underwater)" + } + ], + "consumables_pointer": 128, + "enemies": [ + "Yaban", + "Wapod", + "Squishy", + "Pteran" + ], + "default_exits": [ + { + "room": 10, + "unkn1": 246, + "unkn2": 10, + "x": 56, + "y": 152, + "name": "Sand Canyon 2 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 22, + 16 + ], + [ + 2, + 22 + ], + [ + 39, + 16 + ], + [ + 88, + 16 + ], + [ + 32, + 16 + ] + ], + "locations": [ + "Sand Canyon 2 - Enemy 17 (Yaban)", + "Sand Canyon 2 - Enemy 18 (Wapod)", + "Sand Canyon 2 - Enemy 19 (Squishy)", + "Sand Canyon 2 - Enemy 20 (Pteran)", + "Sand Canyon 2 - Star 36", + "Sand Canyon 2 - Star 37", + "Sand Canyon 2 - Star 38", + "Sand Canyon 2 - Star 39", + "Sand Canyon 2 - Star 40", + "Sand Canyon 2 - Star 41", + "Sand Canyon 2 - Star 42", + "Sand Canyon 2 - Star 43", + "Sand Canyon 2 - Star 44", + "Sand Canyon 2 - Star 45", + "Sand Canyon 2 - Star 46", + "Sand Canyon 2 - Star 47", + "Sand Canyon 2 - Star 48", + "Sand Canyon 2 - Maxim Tomato (Underwater)" + ], + "music": 21 + }, + { + "name": "Sand Canyon 2 - 10", + "level": 3, + "stage": 2, + "room": 10, + "pointer": 2994821, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 11, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Sand Canyon 2 - 10 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 15, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Sand Canyon 2 - Auntie" + ], + "music": 8 + }, + { + "name": "Sand Canyon 2 - 11", + "level": 3, + "stage": 2, + "room": 11, + "pointer": 2891799, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Sand Canyon 2 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon 3 - 0", + "level": 3, + "stage": 3, + "room": 0, + "pointer": 3544676, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sir Kibble", + "Broom Hatter", + "Rocky", + "Gabon" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 6, + "unkn2": 57, + "x": 104, + "y": 152, + "name": "Sand Canyon 3 - 0 Exit 0", + "access_rule": [] + }, + { + "room": 1, + "unkn1": 11, + "unkn2": 57, + "x": 200, + "y": 152, + "name": "Sand Canyon 3 - 0 Exit 1", + "access_rule": [] + }, + { + "room": 1, + "unkn1": 16, + "unkn2": 57, + "x": 296, + "y": 152, + "name": "Sand Canyon 3 - 0 Exit 2", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 23, + "unkn2": 109, + "x": 104, + "y": 72, + "name": "Sand Canyon 3 - 0 Exit 3", + "access_rule": [] + } + ], + "entity_load": [ + [ + 24, + 16 + ], + [ + 3, + 16 + ], + [ + 11, + 16 + ], + [ + 27, + 16 + ] + ], + "locations": [ + "Sand Canyon 3 - Enemy 1 (Sir Kibble)", + "Sand Canyon 3 - Enemy 2 (Broom Hatter)", + "Sand Canyon 3 - Enemy 3 (Rocky)", + "Sand Canyon 3 - Enemy 4 (Gabon)" + ], + "music": 16 + }, + { + "name": "Sand Canyon 3 - 1", + "level": 3, + "stage": 3, + "room": 1, + "pointer": 2965655, + "animal_pointers": [ + 212, + 220, + 228 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 0, + "unkn1": 5, + "unkn2": 9, + "x": 88, + "y": 920, + "name": "Sand Canyon 3 - 1 Exit 0", + "access_rule": [] + }, + { + "room": 0, + "unkn1": 11, + "unkn2": 9, + "x": 168, + "y": 920, + "name": "Sand Canyon 3 - 1 Exit 1", + "access_rule": [] + }, + { + "room": 0, + "unkn1": 17, + "unkn2": 9, + "x": 248, + "y": 920, + "name": "Sand Canyon 3 - 1 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Sand Canyon 3 - Animal 1", + "Sand Canyon 3 - Animal 2", + "Sand Canyon 3 - Animal 3" + ], + "music": 39 + }, + { + "name": "Sand Canyon 3 - 2", + "level": 3, + "stage": 3, + "room": 2, + "pointer": 3726270, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Kany" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 184, + "unkn2": 20, + "x": 104, + "y": 232, + "name": "Sand Canyon 3 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 63, + 16 + ], + [ + 55, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 23 + ], + [ + 29, + 16 + ] + ], + "locations": [ + "Sand Canyon 3 - Enemy 5 (Kany)", + "Sand Canyon 3 - Star 1", + "Sand Canyon 3 - Star 2", + "Sand Canyon 3 - Star 3", + "Sand Canyon 3 - Star 4", + "Sand Canyon 3 - Star 5", + "Sand Canyon 3 - Star 6" + ], + "music": 16 + }, + { + "name": "Sand Canyon 3 - 3", + "level": 3, + "stage": 3, + "room": 3, + "pointer": 3416806, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Galbo" + ], + "default_exits": [ + { + "room": 8, + "unkn1": 130, + "unkn2": 14, + "x": 40, + "y": 152, + "name": "Sand Canyon 3 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 26, + 16 + ], + [ + 6, + 23 + ], + [ + 5, + 23 + ] + ], + "locations": [ + "Sand Canyon 3 - Enemy 6 (Galbo)" + ], + "music": 16 + }, + { + "name": "Sand Canyon 3 - 4", + "level": 3, + "stage": 3, + "room": 4, + "pointer": 3564419, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Propeller", + "Sasuke" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 135, + "unkn2": 11, + "x": 56, + "y": 152, + "name": "Sand Canyon 3 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 68, + 16 + ], + [ + 30, + 16 + ], + [ + 14, + 23 + ], + [ + 89, + 16 + ], + [ + 24, + 16 + ] + ], + "locations": [ + "Sand Canyon 3 - Enemy 7 (Propeller)", + "Sand Canyon 3 - Enemy 8 (Sasuke)", + "Sand Canyon 3 - Star 7", + "Sand Canyon 3 - Star 8", + "Sand Canyon 3 - Star 9", + "Sand Canyon 3 - Star 10" + ], + "music": 16 + }, + { + "name": "Sand Canyon 3 - 5", + "level": 3, + "stage": 3, + "room": 5, + "pointer": 2973891, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Sand Canyon 3 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 16, + 19 + ] + ], + "locations": [ + "Sand Canyon 3 - Caramello" + ], + "music": 8 + }, + { + "name": "Sand Canyon 3 - 6", + "level": 3, + "stage": 3, + "room": 6, + "pointer": 3247969, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Wapod", + "Bobo", + "Babut", + "Magoo" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 95, + "unkn2": 8, + "x": 88, + "y": 424, + "name": "Sand Canyon 3 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 53, + 16 + ], + [ + 88, + 16 + ], + [ + 46, + 16 + ], + [ + 47, + 16 + ], + [ + 5, + 16 + ], + [ + 43, + 16 + ] + ], + "locations": [ + "Sand Canyon 3 - Enemy 9 (Wapod)", + "Sand Canyon 3 - Enemy 10 (Bobo)", + "Sand Canyon 3 - Enemy 11 (Babut)", + "Sand Canyon 3 - Enemy 12 (Magoo)" + ], + "music": 16 + }, + { + "name": "Sand Canyon 3 - 7", + "level": 3, + "stage": 3, + "room": 7, + "pointer": 2887702, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Sand Canyon 3 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon 3 - 8", + "level": 3, + "stage": 3, + "room": 8, + "pointer": 2968057, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 14, + "unkn2": 9, + "x": 104, + "y": 120, + "name": "Sand Canyon 3 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 16, + 19 + ] + ], + "locations": [], + "music": 31 + }, + { + "name": "Sand Canyon 4 - 0", + "level": 3, + "stage": 4, + "room": 0, + "pointer": 3521954, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Popon Ball", + "Mariel", + "Chilly" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 95, + "unkn2": 8, + "x": 216, + "y": 88, + "name": "Sand Canyon 4 - 0 Exit 0", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 199, + "unkn2": 15, + "x": 104, + "y": 88, + "name": "Sand Canyon 4 - 0 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 6, + 16 + ], + [ + 45, + 16 + ], + [ + 6, + 23 + ], + [ + 50, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Sand Canyon 4 - Enemy 1 (Popon Ball)", + "Sand Canyon 4 - Enemy 2 (Mariel)", + "Sand Canyon 4 - Enemy 3 (Chilly)", + "Sand Canyon 4 - Star 1", + "Sand Canyon 4 - Star 2", + "Sand Canyon 4 - Star 3", + "Sand Canyon 4 - Star 4", + "Sand Canyon 4 - Star 5", + "Sand Canyon 4 - Star 6", + "Sand Canyon 4 - Star 7", + "Sand Canyon 4 - Star 8", + "Sand Canyon 4 - Star 9", + "Sand Canyon 4 - Star 10", + "Sand Canyon 4 - Star 11" + ], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 1", + "level": 3, + "stage": 4, + "room": 1, + "pointer": 2956289, + "animal_pointers": [ + 192, + 200, + 208 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 0, + "unkn1": 12, + "unkn2": 5, + "x": 1544, + "y": 136, + "name": "Sand Canyon 4 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Sand Canyon 4 - Animal 1", + "Sand Canyon 4 - Animal 2", + "Sand Canyon 4 - Animal 3" + ], + "music": 39 + }, + { + "name": "Sand Canyon 4 - 2", + "level": 3, + "stage": 4, + "room": 2, + "pointer": 3505360, + "animal_pointers": [], + "consumables": [ + { + "idx": 11, + "pointer": 328, + "x": 2024, + "y": 72, + "etype": 22, + "vtype": 2, + "name": "Sand Canyon 4 - Maxim Tomato (Pacto)" + } + ], + "consumables_pointer": 160, + "enemies": [ + "Tick", + "Bronto Burt", + "Babut" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 149, + "unkn2": 14, + "x": 88, + "y": 216, + "name": "Sand Canyon 4 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 62, + 16 + ], + [ + 2, + 22 + ], + [ + 43, + 16 + ], + [ + 2, + 16 + ], + [ + 48, + 16 + ] + ], + "locations": [ + "Sand Canyon 4 - Enemy 4 (Tick)", + "Sand Canyon 4 - Enemy 5 (Bronto Burt)", + "Sand Canyon 4 - Enemy 6 (Babut)", + "Sand Canyon 4 - Maxim Tomato (Pacto)" + ], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 3", + "level": 3, + "stage": 4, + "room": 3, + "pointer": 3412361, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bobin", + "Joe", + "Mony", + "Blipper" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 115, + "unkn2": 6, + "x": 776, + "y": 120, + "name": "Sand Canyon 4 - 3 Exit 0", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 29, + "unkn2": 8, + "x": 72, + "y": 88, + "name": "Sand Canyon 4 - 3 Exit 1", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 105, + "unkn2": 14, + "x": 104, + "y": 216, + "name": "Sand Canyon 4 - 3 Exit 2", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 115, + "unkn2": 20, + "x": 776, + "y": 248, + "name": "Sand Canyon 4 - 3 Exit 3", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 64, + "unkn2": 21, + "x": 408, + "y": 232, + "name": "Sand Canyon 4 - 3 Exit 4", + "access_rule": [] + } + ], + "entity_load": [ + [ + 73, + 16 + ], + [ + 20, + 16 + ], + [ + 91, + 16 + ], + [ + 14, + 23 + ], + [ + 21, + 16 + ] + ], + "locations": [ + "Sand Canyon 4 - Enemy 7 (Bobin)", + "Sand Canyon 4 - Enemy 8 (Joe)", + "Sand Canyon 4 - Enemy 9 (Mony)", + "Sand Canyon 4 - Enemy 10 (Blipper)", + "Sand Canyon 4 - Star 12", + "Sand Canyon 4 - Star 13", + "Sand Canyon 4 - Star 14", + "Sand Canyon 4 - Star 15" + ], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 4", + "level": 3, + "stage": 4, + "room": 4, + "pointer": 3307804, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 60, + "unkn2": 6, + "x": 88, + "y": 104, + "name": "Sand Canyon 4 - 4 Exit 0", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 60, + "unkn2": 16, + "x": 88, + "y": 360, + "name": "Sand Canyon 4 - 4 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 21, + 16 + ], + [ + 20, + 16 + ], + [ + 91, + 16 + ], + [ + 73, + 16 + ] + ], + "locations": [], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 5", + "level": 3, + "stage": 4, + "room": 5, + "pointer": 2955407, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 16, + "unkn2": 13, + "x": 88, + "y": 232, + "name": "Sand Canyon 4 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 5, + 27 + ] + ], + "locations": [ + "Sand Canyon 4 - Miniboss 1 (Haboki)" + ], + "music": 4 + }, + { + "name": "Sand Canyon 4 - 6", + "level": 3, + "stage": 4, + "room": 6, + "pointer": 3094851, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 24, + "unkn2": 6, + "x": 56, + "y": 56, + "name": "Sand Canyon 4 - 6 Exit 0", + "access_rule": [] + }, + { + "room": 7, + "unkn1": 24, + "unkn2": 14, + "x": 56, + "y": 104, + "name": "Sand Canyon 4 - 6 Exit 1", + "access_rule": [] + }, + { + "room": 7, + "unkn1": 24, + "unkn2": 22, + "x": 56, + "y": 152, + "name": "Sand Canyon 4 - 6 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 17, + 19 + ], + [ + 4, + 23 + ], + [ + 5, + 23 + ] + ], + "locations": [], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 7", + "level": 3, + "stage": 4, + "room": 7, + "pointer": 3483428, + "animal_pointers": [], + "consumables": [ + { + "idx": 25, + "pointer": 200, + "x": 344, + "y": 144, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 4 - 1-Up (Clean)" + }, + { + "idx": 26, + "pointer": 336, + "x": 1656, + "y": 144, + "etype": 22, + "vtype": 2, + "name": "Sand Canyon 4 - Maxim Tomato (Needle)" + } + ], + "consumables_pointer": 128, + "enemies": [ + "Togezo", + "Rocky", + "Bobo" + ], + "default_exits": [ + { + "room": 8, + "unkn1": 266, + "unkn2": 9, + "x": 56, + "y": 152, + "name": "Sand Canyon 4 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 6, + 22 + ], + [ + 3, + 16 + ], + [ + 14, + 23 + ], + [ + 5, + 16 + ], + [ + 2, + 16 + ], + [ + 18, + 16 + ], + [ + 0, + 22 + ], + [ + 2, + 22 + ] + ], + "locations": [ + "Sand Canyon 4 - Enemy 11 (Togezo)", + "Sand Canyon 4 - Enemy 12 (Rocky)", + "Sand Canyon 4 - Enemy 13 (Bobo)", + "Sand Canyon 4 - Star 16", + "Sand Canyon 4 - Star 17", + "Sand Canyon 4 - Star 18", + "Sand Canyon 4 - Star 19", + "Sand Canyon 4 - Star 20", + "Sand Canyon 4 - Star 21", + "Sand Canyon 4 - Star 22", + "Sand Canyon 4 - Star 23", + "Sand Canyon 4 - 1-Up (Clean)", + "Sand Canyon 4 - Maxim Tomato (Needle)" + ], + "music": 18 + }, + { + "name": "Sand Canyon 4 - 8", + "level": 3, + "stage": 4, + "room": 8, + "pointer": 3002086, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 9, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Sand Canyon 4 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 17, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Sand Canyon 4 - Donbe & Hikari" + ], + "music": 8 + }, + { + "name": "Sand Canyon 4 - 9", + "level": 3, + "stage": 4, + "room": 9, + "pointer": 2885774, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Sand Canyon 4 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon 5 - 0", + "level": 3, + "stage": 5, + "room": 0, + "pointer": 3662486, + "animal_pointers": [], + "consumables": [ + { + "idx": 0, + "pointer": 450, + "x": 2256, + "y": 232, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 5 - 1-Up (Falling Block)" + } + ], + "consumables_pointer": 208, + "enemies": [ + "Wapod", + "Dogon", + "Tick" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 151, + "unkn2": 15, + "x": 184, + "y": 56, + "name": "Sand Canyon 5 - 0 Exit 0", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 83, + "unkn2": 16, + "x": 72, + "y": 120, + "name": "Sand Canyon 5 - 0 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 55, + 16 + ], + [ + 48, + 16 + ], + [ + 0, + 22 + ], + [ + 14, + 23 + ], + [ + 90, + 16 + ], + [ + 88, + 16 + ] + ], + "locations": [ + "Sand Canyon 5 - Enemy 1 (Wapod)", + "Sand Canyon 5 - Enemy 2 (Dogon)", + "Sand Canyon 5 - Enemy 3 (Tick)", + "Sand Canyon 5 - Star 1", + "Sand Canyon 5 - Star 2", + "Sand Canyon 5 - Star 3", + "Sand Canyon 5 - Star 4", + "Sand Canyon 5 - Star 5", + "Sand Canyon 5 - Star 6", + "Sand Canyon 5 - Star 7", + "Sand Canyon 5 - Star 8", + "Sand Canyon 5 - Star 9", + "Sand Canyon 5 - Star 10", + "Sand Canyon 5 - 1-Up (Falling Block)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 5 - 1", + "level": 3, + "stage": 5, + "room": 1, + "pointer": 3052622, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Rocky", + "Bobo", + "Chilly", + "Sparky", + "Togezo" + ], + "default_exits": [ + { + "room": 9, + "unkn1": 6, + "unkn2": 9, + "x": 216, + "y": 1128, + "name": "Sand Canyon 5 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 5, + 16 + ], + [ + 6, + 16 + ], + [ + 3, + 16 + ], + [ + 8, + 16 + ], + [ + 18, + 16 + ] + ], + "locations": [ + "Sand Canyon 5 - Enemy 4 (Rocky)", + "Sand Canyon 5 - Enemy 5 (Bobo)", + "Sand Canyon 5 - Enemy 6 (Chilly)", + "Sand Canyon 5 - Enemy 7 (Sparky)", + "Sand Canyon 5 - Enemy 8 (Togezo)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 5 - 2", + "level": 3, + "stage": 5, + "room": 2, + "pointer": 3057544, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 0, + "unkn1": 3, + "unkn2": 7, + "x": 1320, + "y": 264, + "name": "Sand Canyon 5 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Sand Canyon 5 - Animal 1" + ], + "music": 40 + }, + { + "name": "Sand Canyon 5 - 3", + "level": 3, + "stage": 5, + "room": 3, + "pointer": 3419011, + "animal_pointers": [], + "consumables": [ + { + "idx": 11, + "pointer": 192, + "x": 56, + "y": 648, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 5 - 1-Up (Ice 2)" + }, + { + "idx": 14, + "pointer": 200, + "x": 56, + "y": 664, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 5 - 1-Up (Ice 3)" + }, + { + "idx": 15, + "pointer": 208, + "x": 56, + "y": 632, + "etype": 22, + "vtype": 0, + "name": "Sand Canyon 5 - 1-Up (Ice 1)" + }, + { + "idx": 12, + "pointer": 368, + "x": 320, + "y": 264, + "etype": 22, + "vtype": 2, + "name": "Sand Canyon 5 - Maxim Tomato (Pit)" + } + ], + "consumables_pointer": 304, + "enemies": [ + "Bronto Burt", + "Sasuke" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 12, + "unkn2": 66, + "x": 88, + "y": 88, + "name": "Sand Canyon 5 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 6, + 16 + ], + [ + 30, + 16 + ], + [ + 2, + 16 + ], + [ + 0, + 22 + ], + [ + 2, + 22 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Sand Canyon 5 - Enemy 9 (Bronto Burt)", + "Sand Canyon 5 - Enemy 10 (Sasuke)", + "Sand Canyon 5 - Star 11", + "Sand Canyon 5 - Star 12", + "Sand Canyon 5 - Star 13", + "Sand Canyon 5 - Star 14", + "Sand Canyon 5 - Star 15", + "Sand Canyon 5 - Star 16", + "Sand Canyon 5 - Star 17", + "Sand Canyon 5 - 1-Up (Ice 2)", + "Sand Canyon 5 - 1-Up (Ice 3)", + "Sand Canyon 5 - 1-Up (Ice 1)", + "Sand Canyon 5 - Maxim Tomato (Pit)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 5 - 4", + "level": 3, + "stage": 5, + "room": 4, + "pointer": 3644149, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Oro", + "Galbo", + "Nidoo" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 76, + "unkn2": 9, + "x": 88, + "y": 120, + "name": "Sand Canyon 5 - 4 Exit 0", + "access_rule": [] + }, + { + "room": 9, + "unkn1": 116, + "unkn2": 14, + "x": 200, + "y": 1256, + "name": "Sand Canyon 5 - 4 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 54, + 16 + ], + [ + 26, + 16 + ], + [ + 28, + 16 + ], + [ + 25, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Sand Canyon 5 - Enemy 11 (Oro)", + "Sand Canyon 5 - Enemy 12 (Galbo)", + "Sand Canyon 5 - Enemy 13 (Nidoo)", + "Sand Canyon 5 - Star 18" + ], + "music": 13 + }, + { + "name": "Sand Canyon 5 - 5", + "level": 3, + "stage": 5, + "room": 5, + "pointer": 3044100, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 4, + "unkn1": 4, + "unkn2": 7, + "x": 1240, + "y": 152, + "name": "Sand Canyon 5 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Sand Canyon 5 - Animal 2" + ], + "music": 39 + }, + { + "name": "Sand Canyon 5 - 6", + "level": 3, + "stage": 5, + "room": 6, + "pointer": 3373481, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Propeller" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 25, + "unkn2": 5, + "x": 56, + "y": 152, + "name": "Sand Canyon 5 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 31, + 16 + ], + [ + 89, + 16 + ], + [ + 6, + 16 + ] + ], + "locations": [ + "Sand Canyon 5 - Enemy 14 (Propeller)" + ], + "music": 13 + }, + { + "name": "Sand Canyon 5 - 7", + "level": 3, + "stage": 5, + "room": 7, + "pointer": 2964028, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Sand Canyon 5 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 18, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Sand Canyon 5 - Nyupun" + ], + "music": 8 + }, + { + "name": "Sand Canyon 5 - 8", + "level": 3, + "stage": 5, + "room": 8, + "pointer": 2890112, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Sand Canyon 5 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon 5 - 9", + "level": 3, + "stage": 5, + "room": 9, + "pointer": 3647264, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sir Kibble", + "KeKe", + "Kabu" + ], + "default_exits": [ + { + "room": 6, + "unkn1": 12, + "unkn2": 6, + "x": 72, + "y": 760, + "name": "Sand Canyon 5 - 9 Exit 0", + "access_rule": [ + "Cutter" + ] + }, + { + "room": 1, + "unkn1": 12, + "unkn2": 70, + "x": 120, + "y": 152, + "name": "Sand Canyon 5 - 9 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 27, + 16 + ], + [ + 61, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ], + [ + 51, + 16 + ], + [ + 19, + 16 + ] + ], + "locations": [ + "Sand Canyon 5 - Enemy 15 (Sir Kibble)", + "Sand Canyon 5 - Enemy 16 (KeKe)", + "Sand Canyon 5 - Enemy 17 (Kabu)", + "Sand Canyon 5 - Star 19", + "Sand Canyon 5 - Star 20", + "Sand Canyon 5 - Star 21", + "Sand Canyon 5 - Star 22", + "Sand Canyon 5 - Star 23", + "Sand Canyon 5 - Star 24", + "Sand Canyon 5 - Star 25", + "Sand Canyon 5 - Star 26", + "Sand Canyon 5 - Star 27", + "Sand Canyon 5 - Star 28", + "Sand Canyon 5 - Star 29", + "Sand Canyon 5 - Star 30", + "Sand Canyon 5 - Star 31", + "Sand Canyon 5 - Star 32", + "Sand Canyon 5 - Star 33", + "Sand Canyon 5 - Star 34", + "Sand Canyon 5 - Star 35", + "Sand Canyon 5 - Star 36", + "Sand Canyon 5 - Star 37", + "Sand Canyon 5 - Star 38", + "Sand Canyon 5 - Star 39", + "Sand Canyon 5 - Star 40" + ], + "music": 13 + }, + { + "name": "Sand Canyon 6 - 0", + "level": 3, + "stage": 6, + "room": 0, + "pointer": 3314761, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sparky", + "Doka", + "Cappy", + "Pteran" + ], + "default_exits": [ + { + "room": 2, + "unkn1": 132, + "unkn2": 16, + "x": 56, + "y": 136, + "name": "Sand Canyon 6 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 8, + 16 + ], + [ + 35, + 16 + ], + [ + 39, + 16 + ], + [ + 12, + 16 + ] + ], + "locations": [ + "Sand Canyon 6 - Enemy 1 (Sparky)", + "Sand Canyon 6 - Enemy 2 (Doka)", + "Sand Canyon 6 - Enemy 3 (Cappy)", + "Sand Canyon 6 - Enemy 4 (Pteran)" + ], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 1", + "level": 3, + "stage": 6, + "room": 1, + "pointer": 2976913, + "animal_pointers": [ + 192, + 200, + 208 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 22, + "unkn1": 24, + "unkn2": 13, + "x": 168, + "y": 216, + "name": "Sand Canyon 6 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Sand Canyon 6 - Animal 1", + "Sand Canyon 6 - Animal 2", + "Sand Canyon 6 - Animal 3" + ], + "music": 39 + }, + { + "name": "Sand Canyon 6 - 2", + "level": 3, + "stage": 6, + "room": 2, + "pointer": 2978757, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 11, + "unkn1": 55, + "unkn2": 6, + "x": 104, + "y": 104, + "name": "Sand Canyon 6 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 3", + "level": 3, + "stage": 6, + "room": 3, + "pointer": 3178082, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "name": "Sand Canyon 6 - 3 Exit 0", + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 3 Exit 1", + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 3 Exit 2", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "name": "Sand Canyon 6 - 3 Exit 3", + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "name": "Sand Canyon 6 - 3 Exit 4", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "name": "Sand Canyon 6 - 3 Exit 5", + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "name": "Sand Canyon 6 - 3 Exit 6", + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "name": "Sand Canyon 6 - 3 Exit 7", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 4", + "level": 3, + "stage": 6, + "room": 4, + "pointer": 3181563, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "name": "Sand Canyon 6 - 4 Exit 0", + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 4 Exit 1", + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 4 Exit 2", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "name": "Sand Canyon 6 - 4 Exit 3", + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "name": "Sand Canyon 6 - 4 Exit 4", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "name": "Sand Canyon 6 - 4 Exit 5", + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "name": "Sand Canyon 6 - 4 Exit 6", + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "name": "Sand Canyon 6 - 4 Exit 7", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 5", + "level": 3, + "stage": 6, + "room": 5, + "pointer": 3177209, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "name": "Sand Canyon 6 - 5 Exit 0", + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 5 Exit 1", + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 5 Exit 2", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "name": "Sand Canyon 6 - 5 Exit 3", + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "name": "Sand Canyon 6 - 5 Exit 4", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "name": "Sand Canyon 6 - 5 Exit 5", + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "name": "Sand Canyon 6 - 5 Exit 6", + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "name": "Sand Canyon 6 - 5 Exit 7", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 6", + "level": 3, + "stage": 6, + "room": 6, + "pointer": 3183291, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "name": "Sand Canyon 6 - 6 Exit 0", + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 6 Exit 1", + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 6 Exit 2", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "name": "Sand Canyon 6 - 6 Exit 3", + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "name": "Sand Canyon 6 - 6 Exit 4", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "name": "Sand Canyon 6 - 6 Exit 5", + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "name": "Sand Canyon 6 - 6 Exit 6", + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "name": "Sand Canyon 6 - 6 Exit 7", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 7", + "level": 3, + "stage": 6, + "room": 7, + "pointer": 3175453, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "name": "Sand Canyon 6 - 7 Exit 0", + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 7 Exit 1", + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 7 Exit 2", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "name": "Sand Canyon 6 - 7 Exit 3", + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "name": "Sand Canyon 6 - 7 Exit 4", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "name": "Sand Canyon 6 - 7 Exit 5", + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "name": "Sand Canyon 6 - 7 Exit 6", + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "name": "Sand Canyon 6 - 7 Exit 7", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 8", + "level": 3, + "stage": 6, + "room": 8, + "pointer": 3179826, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "name": "Sand Canyon 6 - 8 Exit 0", + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 8 Exit 1", + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 8 Exit 2", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "name": "Sand Canyon 6 - 8 Exit 3", + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "name": "Sand Canyon 6 - 8 Exit 4", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "name": "Sand Canyon 6 - 8 Exit 5", + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "name": "Sand Canyon 6 - 8 Exit 6", + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "name": "Sand Canyon 6 - 8 Exit 7", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 9", + "level": 3, + "stage": 6, + "room": 9, + "pointer": 3176334, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "name": "Sand Canyon 6 - 9 Exit 0", + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 9 Exit 1", + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 9 Exit 2", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "name": "Sand Canyon 6 - 9 Exit 3", + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "name": "Sand Canyon 6 - 9 Exit 4", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "name": "Sand Canyon 6 - 9 Exit 5", + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "name": "Sand Canyon 6 - 9 Exit 6", + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "name": "Sand Canyon 6 - 9 Exit 7", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 10", + "level": 3, + "stage": 6, + "room": 10, + "pointer": 3178954, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 16, + "unkn1": 16, + "unkn2": 4, + "x": 184, + "y": 712, + "name": "Sand Canyon 6 - 10 Exit 0", + "access_rule": [] + }, + { + "room": 24, + "unkn1": 8, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 10 Exit 1", + "access_rule": [] + }, + { + "room": 31, + "unkn1": 24, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 10 Exit 2", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 16, + "x": 600, + "y": 104, + "name": "Sand Canyon 6 - 10 Exit 3", + "access_rule": [] + }, + { + "room": 12, + "unkn1": 28, + "unkn2": 16, + "x": 88, + "y": 136, + "name": "Sand Canyon 6 - 10 Exit 4", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 8, + "unkn2": 24, + "x": 552, + "y": 152, + "name": "Sand Canyon 6 - 10 Exit 5", + "access_rule": [] + }, + { + "room": 19, + "unkn1": 24, + "unkn2": 24, + "x": 104, + "y": 152, + "name": "Sand Canyon 6 - 10 Exit 6", + "access_rule": [] + }, + { + "room": 38, + "unkn1": 16, + "unkn2": 28, + "x": 168, + "y": 88, + "name": "Sand Canyon 6 - 10 Exit 7", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 11", + "level": 3, + "stage": 6, + "room": 11, + "pointer": 2989149, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 3, + "unkn1": 37, + "unkn2": 6, + "x": 88, + "y": 264, + "name": "Sand Canyon 6 - 11 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 59, + 16 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 12", + "level": 3, + "stage": 6, + "room": 12, + "pointer": 3015947, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 4, + "unkn2": 8, + "x": 440, + "y": 264, + "name": "Sand Canyon 6 - 12 Exit 0", + "access_rule": [] + }, + { + "room": 13, + "unkn1": 86, + "unkn2": 8, + "x": 72, + "y": 104, + "name": "Sand Canyon 6 - 12 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 64, + 16 + ], + [ + 59, + 16 + ], + [ + 55, + 16 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 13", + "level": 3, + "stage": 6, + "room": 13, + "pointer": 2976539, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 23, + "unkn1": 55, + "unkn2": 8, + "x": 56, + "y": 152, + "name": "Sand Canyon 6 - 13 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 14", + "level": 3, + "stage": 6, + "room": 14, + "pointer": 3030336, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 15, + "unkn1": 5, + "unkn2": 9, + "x": 200, + "y": 152, + "name": "Sand Canyon 6 - 14 Exit 0", + "access_rule": [] + }, + { + "room": 8, + "unkn1": 35, + "unkn2": 9, + "x": 152, + "y": 392, + "name": "Sand Canyon 6 - 14 Exit 1", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 15", + "level": 3, + "stage": 6, + "room": 15, + "pointer": 2972361, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 14, + "unkn1": 13, + "unkn2": 9, + "x": 104, + "y": 152, + "name": "Sand Canyon 6 - 15 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 19, + 19 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 16", + "level": 3, + "stage": 6, + "room": 16, + "pointer": 2953186, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 18, + "unkn1": 10, + "unkn2": 19, + "x": 248, + "y": 152, + "name": "Sand Canyon 6 - 16 Exit 0", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 10, + "unkn2": 44, + "x": 264, + "y": 88, + "name": "Sand Canyon 6 - 16 Exit 1", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 17", + "level": 3, + "stage": 6, + "room": 17, + "pointer": 2953633, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 18, + "unkn1": 10, + "unkn2": 19, + "x": 248, + "y": 152, + "name": "Sand Canyon 6 - 17 Exit 0", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 10, + "unkn2": 44, + "x": 264, + "y": 88, + "name": "Sand Canyon 6 - 17 Exit 1", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 18", + "level": 3, + "stage": 6, + "room": 18, + "pointer": 2991707, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 17, + "unkn1": 14, + "unkn2": 9, + "x": 184, + "y": 312, + "name": "Sand Canyon 6 - 18 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 19, + 19 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 19", + "level": 3, + "stage": 6, + "room": 19, + "pointer": 2974651, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 10, + "unkn1": 5, + "unkn2": 9, + "x": 376, + "y": 392, + "name": "Sand Canyon 6 - 19 Exit 0", + "access_rule": [] + }, + { + "room": 20, + "unkn1": 35, + "unkn2": 9, + "x": 88, + "y": 152, + "name": "Sand Canyon 6 - 19 Exit 1", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 20", + "level": 3, + "stage": 6, + "room": 20, + "pointer": 2969638, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 19, + "unkn1": 4, + "unkn2": 9, + "x": 552, + "y": 152, + "name": "Sand Canyon 6 - 20 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 19, + 19 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 21", + "level": 3, + "stage": 6, + "room": 21, + "pointer": 2976163, + "animal_pointers": [ + 192, + 200, + 208 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 22, + "unkn1": 9, + "unkn2": 13, + "x": 296, + "y": 216, + "name": "Sand Canyon 6 - 21 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Sand Canyon 6 - Animal 4", + "Sand Canyon 6 - Animal 5", + "Sand Canyon 6 - Animal 6" + ], + "music": 40 + }, + { + "name": "Sand Canyon 6 - 22", + "level": 3, + "stage": 6, + "room": 22, + "pointer": 2950938, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 38, + "unkn1": 14, + "unkn2": 8, + "x": 168, + "y": 376, + "name": "Sand Canyon 6 - 22 Exit 0", + "access_rule": [] + }, + { + "room": 1, + "unkn1": 9, + "unkn2": 13, + "x": 376, + "y": 216, + "name": "Sand Canyon 6 - 22 Exit 1", + "access_rule": [] + }, + { + "room": 21, + "unkn1": 19, + "unkn2": 13, + "x": 168, + "y": 216, + "name": "Sand Canyon 6 - 22 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 22 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 23", + "level": 3, + "stage": 6, + "room": 23, + "pointer": 3311993, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 43, + "unkn1": 145, + "unkn2": 7, + "x": 72, + "y": 152, + "name": "Sand Canyon 6 - 23 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 16 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 24", + "level": 3, + "stage": 6, + "room": 24, + "pointer": 3079078, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 39, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 24 Exit 0", + "access_rule": [] + }, + { + "room": 25, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 24 Exit 1", + "access_rule": [] + }, + { + "room": 39, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 24 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 25", + "level": 3, + "stage": 6, + "room": 25, + "pointer": 3065898, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 26, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 25 Exit 0", + "access_rule": [] + }, + { + "room": 40, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 25 Exit 1", + "access_rule": [] + }, + { + "room": 40, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 25 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 26", + "level": 3, + "stage": 6, + "room": 26, + "pointer": 3063347, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 41, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 26 Exit 0", + "access_rule": [] + }, + { + "room": 41, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 26 Exit 1", + "access_rule": [] + }, + { + "room": 27, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 26 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 27", + "level": 3, + "stage": 6, + "room": 27, + "pointer": 3066916, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 28, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 27 Exit 0", + "access_rule": [] + }, + { + "room": 42, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 27 Exit 1", + "access_rule": [] + }, + { + "room": 42, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 27 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 28", + "level": 3, + "stage": 6, + "room": 28, + "pointer": 3067425, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 29, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 344, + "name": "Sand Canyon 6 - 28 Exit 0", + "access_rule": [] + }, + { + "room": 29, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 344, + "name": "Sand Canyon 6 - 28 Exit 1", + "access_rule": [] + }, + { + "room": 29, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 344, + "name": "Sand Canyon 6 - 28 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 29", + "level": 3, + "stage": 6, + "room": 29, + "pointer": 2950032, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 30, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 136, + "name": "Sand Canyon 6 - 29 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 19, + 19 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 30", + "level": 3, + "stage": 6, + "room": 30, + "pointer": 2986500, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 4, + "unkn1": 10, + "unkn2": 44, + "x": 136, + "y": 152, + "name": "Sand Canyon 6 - 30 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 31", + "level": 3, + "stage": 6, + "room": 31, + "pointer": 3070930, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 32, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 31 Exit 0", + "access_rule": [] + }, + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 648, + "name": "Sand Canyon 6 - 31 Exit 1", + "access_rule": [] + }, + { + "room": 32, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 31 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 32", + "level": 3, + "stage": 6, + "room": 32, + "pointer": 3054817, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bukiset (Parasol)", + "Bukiset (Cutter)" + ], + "default_exits": [ + { + "room": 33, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 32 Exit 0", + "access_rule": [] + }, + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 536, + "name": "Sand Canyon 6 - 32 Exit 1", + "access_rule": [] + }, + { + "room": 33, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 32 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 81, + 16 + ], + [ + 83, + 16 + ] + ], + "locations": [ + "Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", + "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))" + ], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 33", + "level": 3, + "stage": 6, + "room": 33, + "pointer": 3053173, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bukiset (Clean)", + "Bukiset (Spark)" + ], + "default_exits": [ + { + "room": 34, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 33 Exit 0", + "access_rule": [] + }, + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 440, + "name": "Sand Canyon 6 - 33 Exit 1", + "access_rule": [] + }, + { + "room": 34, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 33 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 80, + 16 + ], + [ + 82, + 16 + ] + ], + "locations": [ + "Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", + "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))" + ], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 34", + "level": 3, + "stage": 6, + "room": 34, + "pointer": 3053721, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bukiset (Ice)", + "Bukiset (Needle)" + ], + "default_exits": [ + { + "room": 35, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 34 Exit 0", + "access_rule": [] + }, + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 344, + "name": "Sand Canyon 6 - 34 Exit 1", + "access_rule": [] + }, + { + "room": 35, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 34 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 79, + 16 + ], + [ + 78, + 16 + ] + ], + "locations": [ + "Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", + "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))" + ], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 35", + "level": 3, + "stage": 6, + "room": 35, + "pointer": 3054269, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bukiset (Burning)", + "Bukiset (Stone)" + ], + "default_exits": [ + { + "room": 37, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 344, + "name": "Sand Canyon 6 - 35 Exit 0", + "access_rule": [] + }, + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 248, + "name": "Sand Canyon 6 - 35 Exit 1", + "access_rule": [] + }, + { + "room": 37, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 344, + "name": "Sand Canyon 6 - 35 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 77, + 16 + ], + [ + 76, + 16 + ] + ], + "locations": [ + "Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", + "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))" + ], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 36", + "level": 3, + "stage": 6, + "room": 36, + "pointer": 2986164, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 10, + "unkn2": 44, + "x": 392, + "y": 152, + "name": "Sand Canyon 6 - 36 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 37", + "level": 3, + "stage": 6, + "room": 37, + "pointer": 3074377, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 36, + "unkn1": 11, + "unkn2": 8, + "x": 168, + "y": 152, + "name": "Sand Canyon 6 - 37 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 19, + 19 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 38", + "level": 3, + "stage": 6, + "room": 38, + "pointer": 2971589, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 9, + "unkn1": 10, + "unkn2": 5, + "x": 264, + "y": 440, + "name": "Sand Canyon 6 - 38 Exit 0", + "access_rule": [] + }, + { + "room": 22, + "unkn1": 10, + "unkn2": 23, + "x": 248, + "y": 136, + "name": "Sand Canyon 6 - 38 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 76, + 16 + ], + [ + 77, + 16 + ], + [ + 78, + 16 + ], + [ + 79, + 16 + ], + [ + 80, + 16 + ], + [ + 81, + 16 + ], + [ + 82, + 16 + ], + [ + 83, + 16 + ] + ], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 39", + "level": 3, + "stage": 6, + "room": 39, + "pointer": 3063858, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 40, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 39 Exit 0", + "access_rule": [] + }, + { + "room": 40, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 39 Exit 1", + "access_rule": [] + }, + { + "room": 40, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 39 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 40", + "level": 3, + "stage": 6, + "room": 40, + "pointer": 3064368, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 41, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 40 Exit 0", + "access_rule": [] + }, + { + "room": 41, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 40 Exit 1", + "access_rule": [] + }, + { + "room": 41, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 40 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 41", + "level": 3, + "stage": 6, + "room": 41, + "pointer": 3064878, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 42, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 328, + "name": "Sand Canyon 6 - 41 Exit 0", + "access_rule": [] + }, + { + "room": 42, + "unkn1": 11, + "unkn2": 8, + "x": 184, + "y": 328, + "name": "Sand Canyon 6 - 41 Exit 1", + "access_rule": [] + }, + { + "room": 42, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 328, + "name": "Sand Canyon 6 - 41 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 42", + "level": 3, + "stage": 6, + "room": 42, + "pointer": 3068939, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Nidoo" + ], + "default_exits": [ + { + "room": 29, + "unkn1": 7, + "unkn2": 8, + "x": 120, + "y": 344, + "name": "Sand Canyon 6 - 42 Exit 0", + "access_rule": [] + }, + { + "room": 29, + "unkn1": 15, + "unkn2": 8, + "x": 248, + "y": 344, + "name": "Sand Canyon 6 - 42 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 28, + 16 + ] + ], + "locations": [ + "Sand Canyon 6 - Enemy 13 (Nidoo)" + ], + "music": 14 + }, + { + "name": "Sand Canyon 6 - 43", + "level": 3, + "stage": 6, + "room": 43, + "pointer": 2988495, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 44, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Sand Canyon 6 - 43 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 19, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Sand Canyon 6 - Professor Hector & R.O.B" + ], + "music": 8 + }, + { + "name": "Sand Canyon 6 - 44", + "level": 3, + "stage": 6, + "room": 44, + "pointer": 2886979, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Sand Canyon 6 - Complete" + ], + "music": 5 + }, + { + "name": "Sand Canyon Boss - 0", + "level": 3, + "stage": 7, + "room": 0, + "pointer": 2991389, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 6, + 18 + ] + ], + "locations": [ + "Sand Canyon - Boss (Pon & Con) Purified", + "Level 3 Boss - Defeated", + "Level 3 Boss - Purified" + ], + "music": 2 + }, + { + "name": "Cloudy Park 1 - 0", + "level": 4, + "stage": 1, + "room": 0, + "pointer": 3172795, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee", + "KeKe", + "Cappy" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 95, + "unkn2": 5, + "x": 56, + "y": 152, + "name": "Cloudy Park 1 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 16 + ], + [ + 12, + 16 + ], + [ + 51, + 16 + ], + [ + 1, + 23 + ], + [ + 0, + 23 + ] + ], + "locations": [ + "Cloudy Park 1 - Enemy 1 (Waddle Dee)", + "Cloudy Park 1 - Enemy 2 (KeKe)", + "Cloudy Park 1 - Enemy 3 (Cappy)" + ], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 1", + "level": 4, + "stage": 1, + "room": 1, + "pointer": 3078163, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 14, + "unkn2": 8, + "x": 88, + "y": 424, + "name": "Cloudy Park 1 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Cloudy Park 1 - Animal 1" + ], + "music": 39 + }, + { + "name": "Cloudy Park 1 - 2", + "level": 4, + "stage": 1, + "room": 2, + "pointer": 3285882, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Yaban", + "Togezo" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 95, + "unkn2": 8, + "x": 40, + "y": 104, + "name": "Cloudy Park 1 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 32, + 16 + ], + [ + 4, + 16 + ], + [ + 18, + 16 + ], + [ + 6, + 23 + ] + ], + "locations": [ + "Cloudy Park 1 - Enemy 4 (Yaban)", + "Cloudy Park 1 - Enemy 5 (Togezo)" + ], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 3", + "level": 4, + "stage": 1, + "room": 3, + "pointer": 3062831, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 10, + "unkn1": 15, + "unkn2": 6, + "x": 56, + "y": 264, + "name": "Cloudy Park 1 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Cloudy Park 1 - Animal 2" + ], + "music": 39 + }, + { + "name": "Cloudy Park 1 - 4", + "level": 4, + "stage": 1, + "room": 4, + "pointer": 3396729, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Galbo" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 92, + "unkn2": 16, + "x": 56, + "y": 152, + "name": "Cloudy Park 1 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 54, + 16 + ], + [ + 0, + 16 + ], + [ + 14, + 23 + ], + [ + 68, + 16 + ], + [ + 26, + 16 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Cloudy Park 1 - Enemy 6 (Galbo)", + "Cloudy Park 1 - Star 1" + ], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 5", + "level": 4, + "stage": 1, + "room": 5, + "pointer": 3038805, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 6, + "unkn2": 5, + "x": 2344, + "y": 232, + "name": "Cloudy Park 1 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Cloudy Park 1 - Animal 3", + "Cloudy Park 1 - Animal 4" + ], + "music": 39 + }, + { + "name": "Cloudy Park 1 - 6", + "level": 4, + "stage": 1, + "room": 6, + "pointer": 3535736, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sparky", + "Como" + ], + "default_exits": [ + { + "room": 8, + "unkn1": 5, + "unkn2": 8, + "x": 72, + "y": 104, + "name": "Cloudy Park 1 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 54, + 16 + ], + [ + 14, + 23 + ], + [ + 0, + 16 + ], + [ + 41, + 16 + ], + [ + 8, + 16 + ] + ], + "locations": [ + "Cloudy Park 1 - Enemy 7 (Sparky)", + "Cloudy Park 1 - Enemy 8 (Como)", + "Cloudy Park 1 - Star 2" + ], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 7", + "level": 4, + "stage": 1, + "room": 7, + "pointer": 2954080, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 11, + "unkn1": 14, + "unkn2": 6, + "x": 88, + "y": 104, + "name": "Cloudy Park 1 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Cloudy Park 1 - Animal 5" + ], + "music": 39 + }, + { + "name": "Cloudy Park 1 - 8", + "level": 4, + "stage": 1, + "room": 8, + "pointer": 3465407, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bronto Burt" + ], + "default_exits": [ + { + "room": 12, + "unkn1": 181, + "unkn2": 6, + "x": 56, + "y": 152, + "name": "Cloudy Park 1 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 21, + 19 + ], + [ + 2, + 16 + ], + [ + 51, + 16 + ], + [ + 1, + 23 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 1 - Enemy 9 (Bronto Burt)", + "Cloudy Park 1 - Star 3", + "Cloudy Park 1 - Star 4", + "Cloudy Park 1 - Star 5", + "Cloudy Park 1 - Star 6", + "Cloudy Park 1 - Star 7", + "Cloudy Park 1 - Star 8", + "Cloudy Park 1 - Star 9", + "Cloudy Park 1 - Star 10", + "Cloudy Park 1 - Star 11" + ], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 9", + "level": 4, + "stage": 1, + "room": 9, + "pointer": 3078621, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 4, + "unkn1": 14, + "unkn2": 9, + "x": 56, + "y": 264, + "name": "Cloudy Park 1 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Cloudy Park 1 - Animal 6" + ], + "music": 39 + }, + { + "name": "Cloudy Park 1 - 10", + "level": 4, + "stage": 1, + "room": 10, + "pointer": 3281366, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Gabon", + "Sir Kibble" + ], + "default_exits": [ + { + "room": 9, + "unkn1": 99, + "unkn2": 8, + "x": 56, + "y": 152, + "name": "Cloudy Park 1 - 10 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 1, + 16 + ], + [ + 24, + 16 + ], + [ + 27, + 16 + ], + [ + 4, + 23 + ] + ], + "locations": [ + "Cloudy Park 1 - Enemy 10 (Gabon)", + "Cloudy Park 1 - Enemy 11 (Sir Kibble)" + ], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 11", + "level": 4, + "stage": 1, + "room": 11, + "pointer": 3519608, + "animal_pointers": [], + "consumables": [ + { + "idx": 19, + "pointer": 192, + "x": 216, + "y": 600, + "etype": 22, + "vtype": 0, + "name": "Cloudy Park 1 - 1-Up (Shotzo)" + }, + { + "idx": 18, + "pointer": 456, + "x": 856, + "y": 408, + "etype": 22, + "vtype": 2, + "name": "Cloudy Park 1 - Maxim Tomato (Mariel)" + } + ], + "consumables_pointer": 352, + "enemies": [ + "Mariel", + "Nruff" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 64, + "unkn2": 6, + "x": 104, + "y": 216, + "name": "Cloudy Park 1 - 11 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 16 + ], + [ + 27, + 16 + ], + [ + 15, + 16 + ], + [ + 45, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 22 + ], + [ + 0, + 22 + ], + [ + 6, + 22 + ] + ], + "locations": [ + "Cloudy Park 1 - Enemy 12 (Mariel)", + "Cloudy Park 1 - Enemy 13 (Nruff)", + "Cloudy Park 1 - Star 12", + "Cloudy Park 1 - Star 13", + "Cloudy Park 1 - Star 14", + "Cloudy Park 1 - Star 15", + "Cloudy Park 1 - Star 16", + "Cloudy Park 1 - Star 17", + "Cloudy Park 1 - Star 18", + "Cloudy Park 1 - Star 19", + "Cloudy Park 1 - Star 20", + "Cloudy Park 1 - Star 21", + "Cloudy Park 1 - Star 22", + "Cloudy Park 1 - Star 23", + "Cloudy Park 1 - 1-Up (Shotzo)", + "Cloudy Park 1 - Maxim Tomato (Mariel)" + ], + "music": 17 + }, + { + "name": "Cloudy Park 1 - 12", + "level": 4, + "stage": 1, + "room": 12, + "pointer": 2958914, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 13, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Cloudy Park 1 - 12 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 21, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Cloudy Park 1 - Hibanamodoki" + ], + "music": 8 + }, + { + "name": "Cloudy Park 1 - 13", + "level": 4, + "stage": 1, + "room": 13, + "pointer": 2886015, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Cloudy Park 1 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park 2 - 0", + "level": 4, + "stage": 2, + "room": 0, + "pointer": 3142443, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Chilly", + "Sasuke" + ], + "default_exits": [ + { + "room": 6, + "unkn1": 96, + "unkn2": 7, + "x": 56, + "y": 88, + "name": "Cloudy Park 2 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 23, + 16 + ], + [ + 7, + 16 + ], + [ + 30, + 16 + ], + [ + 6, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 2 - Enemy 1 (Chilly)", + "Cloudy Park 2 - Enemy 2 (Sasuke)", + "Cloudy Park 2 - Star 1", + "Cloudy Park 2 - Star 2", + "Cloudy Park 2 - Star 3", + "Cloudy Park 2 - Star 4", + "Cloudy Park 2 - Star 5", + "Cloudy Park 2 - Star 6" + ], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 1", + "level": 4, + "stage": 2, + "room": 1, + "pointer": 3235925, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee", + "Sparky", + "Broom Hatter" + ], + "default_exits": [ + { + "room": 2, + "unkn1": 146, + "unkn2": 5, + "x": 88, + "y": 88, + "name": "Cloudy Park 2 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 16 + ], + [ + 14, + 23 + ], + [ + 8, + 16 + ], + [ + 11, + 16 + ] + ], + "locations": [ + "Cloudy Park 2 - Enemy 3 (Waddle Dee)", + "Cloudy Park 2 - Enemy 4 (Sparky)", + "Cloudy Park 2 - Enemy 5 (Broom Hatter)", + "Cloudy Park 2 - Star 7", + "Cloudy Park 2 - Star 8", + "Cloudy Park 2 - Star 9", + "Cloudy Park 2 - Star 10", + "Cloudy Park 2 - Star 11", + "Cloudy Park 2 - Star 12", + "Cloudy Park 2 - Star 13", + "Cloudy Park 2 - Star 14", + "Cloudy Park 2 - Star 15" + ], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 2", + "level": 4, + "stage": 2, + "room": 2, + "pointer": 3297758, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sir Kibble", + "Pteran" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 147, + "unkn2": 8, + "x": 72, + "y": 136, + "name": "Cloudy Park 2 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 27, + 16 + ], + [ + 39, + 16 + ], + [ + 1, + 23 + ] + ], + "locations": [ + "Cloudy Park 2 - Enemy 6 (Sir Kibble)", + "Cloudy Park 2 - Enemy 7 (Pteran)" + ], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 3", + "level": 4, + "stage": 2, + "room": 3, + "pointer": 3341087, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Propeller", + "Dogon" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 145, + "unkn2": 12, + "x": 72, + "y": 136, + "name": "Cloudy Park 2 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 16 + ], + [ + 14, + 23 + ], + [ + 90, + 16 + ], + [ + 89, + 16 + ] + ], + "locations": [ + "Cloudy Park 2 - Enemy 8 (Propeller)", + "Cloudy Park 2 - Enemy 9 (Dogon)", + "Cloudy Park 2 - Star 16", + "Cloudy Park 2 - Star 17", + "Cloudy Park 2 - Star 18", + "Cloudy Park 2 - Star 19", + "Cloudy Park 2 - Star 20", + "Cloudy Park 2 - Star 21", + "Cloudy Park 2 - Star 22", + "Cloudy Park 2 - Star 23", + "Cloudy Park 2 - Star 24", + "Cloudy Park 2 - Star 25", + "Cloudy Park 2 - Star 26", + "Cloudy Park 2 - Star 27", + "Cloudy Park 2 - Star 28", + "Cloudy Park 2 - Star 29", + "Cloudy Park 2 - Star 30", + "Cloudy Park 2 - Star 31", + "Cloudy Park 2 - Star 32", + "Cloudy Park 2 - Star 33", + "Cloudy Park 2 - Star 34", + "Cloudy Park 2 - Star 35", + "Cloudy Park 2 - Star 36", + "Cloudy Park 2 - Star 37" + ], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 4", + "level": 4, + "stage": 2, + "room": 4, + "pointer": 3457404, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Togezo", + "Oro", + "Bronto Burt", + "Rocky" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 165, + "unkn2": 5, + "x": 72, + "y": 104, + "name": "Cloudy Park 2 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 3, + 16 + ], + [ + 14, + 23 + ], + [ + 18, + 16 + ], + [ + 25, + 16 + ] + ], + "locations": [ + "Cloudy Park 2 - Enemy 10 (Togezo)", + "Cloudy Park 2 - Enemy 11 (Oro)", + "Cloudy Park 2 - Enemy 12 (Bronto Burt)", + "Cloudy Park 2 - Enemy 13 (Rocky)", + "Cloudy Park 2 - Star 38", + "Cloudy Park 2 - Star 39", + "Cloudy Park 2 - Star 40", + "Cloudy Park 2 - Star 41", + "Cloudy Park 2 - Star 42", + "Cloudy Park 2 - Star 43", + "Cloudy Park 2 - Star 44", + "Cloudy Park 2 - Star 45", + "Cloudy Park 2 - Star 46", + "Cloudy Park 2 - Star 47" + ], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 5", + "level": 4, + "stage": 2, + "room": 5, + "pointer": 3273878, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Galbo", + "Kapar" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 96, + "unkn2": 8, + "x": 56, + "y": 88, + "name": "Cloudy Park 2 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 62, + 16 + ], + [ + 26, + 16 + ], + [ + 67, + 16 + ] + ], + "locations": [ + "Cloudy Park 2 - Enemy 14 (Galbo)", + "Cloudy Park 2 - Enemy 15 (Kapar)", + "Cloudy Park 2 - Star 48", + "Cloudy Park 2 - Star 49", + "Cloudy Park 2 - Star 50", + "Cloudy Park 2 - Star 51", + "Cloudy Park 2 - Star 52", + "Cloudy Park 2 - Star 53", + "Cloudy Park 2 - Star 54" + ], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 6", + "level": 4, + "stage": 2, + "room": 6, + "pointer": 2984453, + "animal_pointers": [ + 192, + 200, + 208 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 25, + "unkn2": 5, + "x": 72, + "y": 152, + "name": "Cloudy Park 2 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Cloudy Park 2 - Animal 1", + "Cloudy Park 2 - Animal 2", + "Cloudy Park 2 - Animal 3" + ], + "music": 38 + }, + { + "name": "Cloudy Park 2 - 7", + "level": 4, + "stage": 2, + "room": 7, + "pointer": 2985482, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 15, + "unkn2": 5, + "x": 40, + "y": 88, + "name": "Cloudy Park 2 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 22, + 19 + ] + ], + "locations": [], + "music": 19 + }, + { + "name": "Cloudy Park 2 - 8", + "level": 4, + "stage": 2, + "room": 8, + "pointer": 2990753, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 9, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Cloudy Park 2 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 22, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Cloudy Park 2 - Piyo & Keko" + ], + "music": 8 + }, + { + "name": "Cloudy Park 2 - 9", + "level": 4, + "stage": 2, + "room": 9, + "pointer": 2889630, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Cloudy Park 2 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park 3 - 0", + "level": 4, + "stage": 3, + "room": 0, + "pointer": 3100859, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bronto Burt", + "Mopoo", + "Poppy Bros Jr." + ], + "default_exits": [ + { + "room": 2, + "unkn1": 145, + "unkn2": 8, + "x": 56, + "y": 136, + "name": "Cloudy Park 3 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 74, + 16 + ], + [ + 47, + 16 + ], + [ + 7, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 3 - Enemy 1 (Bronto Burt)", + "Cloudy Park 3 - Enemy 2 (Mopoo)", + "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)", + "Cloudy Park 3 - Star 1", + "Cloudy Park 3 - Star 2", + "Cloudy Park 3 - Star 3", + "Cloudy Park 3 - Star 4", + "Cloudy Park 3 - Star 5", + "Cloudy Park 3 - Star 6", + "Cloudy Park 3 - Star 7" + ], + "music": 15 + }, + { + "name": "Cloudy Park 3 - 1", + "level": 4, + "stage": 3, + "room": 1, + "pointer": 3209719, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Como" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 13, + "unkn2": 14, + "x": 56, + "y": 152, + "name": "Cloudy Park 3 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ], + [ + 31, + 16 + ], + [ + 4, + 22 + ], + [ + 41, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 3 - Enemy 4 (Como)", + "Cloudy Park 3 - Star 8", + "Cloudy Park 3 - Star 9" + ], + "music": 15 + }, + { + "name": "Cloudy Park 3 - 2", + "level": 4, + "stage": 3, + "room": 2, + "pointer": 3216185, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Glunk", + "Bobin", + "Loud", + "Kapar" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 145, + "unkn2": 6, + "x": 216, + "y": 1064, + "name": "Cloudy Park 3 - 2 Exit 0", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 24, + "unkn2": 14, + "x": 104, + "y": 152, + "name": "Cloudy Park 3 - 2 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 67, + 16 + ], + [ + 40, + 16 + ], + [ + 73, + 16 + ], + [ + 14, + 23 + ], + [ + 16, + 16 + ] + ], + "locations": [ + "Cloudy Park 3 - Enemy 5 (Glunk)", + "Cloudy Park 3 - Enemy 6 (Bobin)", + "Cloudy Park 3 - Enemy 7 (Loud)", + "Cloudy Park 3 - Enemy 8 (Kapar)", + "Cloudy Park 3 - Star 10", + "Cloudy Park 3 - Star 11", + "Cloudy Park 3 - Star 12", + "Cloudy Park 3 - Star 13", + "Cloudy Park 3 - Star 14", + "Cloudy Park 3 - Star 15", + "Cloudy Park 3 - Star 16" + ], + "music": 15 + }, + { + "name": "Cloudy Park 3 - 3", + "level": 4, + "stage": 3, + "room": 3, + "pointer": 2994208, + "animal_pointers": [ + 192, + 200, + 208 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 5, + "unkn2": 9, + "x": 408, + "y": 232, + "name": "Cloudy Park 3 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Cloudy Park 3 - Animal 1", + "Cloudy Park 3 - Animal 2", + "Cloudy Park 3 - Animal 3" + ], + "music": 40 + }, + { + "name": "Cloudy Park 3 - 4", + "level": 4, + "stage": 3, + "room": 4, + "pointer": 3229151, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Galbo", + "Batamon", + "Bouncy" + ], + "default_exits": [ + { + "room": 6, + "unkn1": 156, + "unkn2": 6, + "x": 56, + "y": 152, + "name": "Cloudy Park 3 - 4 Exit 0", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 126, + "unkn2": 9, + "x": 56, + "y": 152, + "name": "Cloudy Park 3 - 4 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 7, + 16 + ], + [ + 26, + 16 + ], + [ + 14, + 23 + ], + [ + 13, + 16 + ], + [ + 68, + 16 + ] + ], + "locations": [ + "Cloudy Park 3 - Enemy 9 (Galbo)", + "Cloudy Park 3 - Enemy 10 (Batamon)", + "Cloudy Park 3 - Enemy 11 (Bouncy)", + "Cloudy Park 3 - Star 17", + "Cloudy Park 3 - Star 18", + "Cloudy Park 3 - Star 19", + "Cloudy Park 3 - Star 20", + "Cloudy Park 3 - Star 21", + "Cloudy Park 3 - Star 22" + ], + "music": 15 + }, + { + "name": "Cloudy Park 3 - 5", + "level": 4, + "stage": 3, + "room": 5, + "pointer": 2969244, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 4, + "unkn1": 14, + "unkn2": 9, + "x": 88, + "y": 152, + "name": "Cloudy Park 3 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 23, + 19 + ] + ], + "locations": [], + "music": 31 + }, + { + "name": "Cloudy Park 3 - 6", + "level": 4, + "stage": 3, + "room": 6, + "pointer": 4128530, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Cloudy Park 3 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 23, + 19 + ] + ], + "locations": [ + "Cloudy Park 3 - Mr. Ball" + ], + "music": 8 + }, + { + "name": "Cloudy Park 3 - 7", + "level": 4, + "stage": 3, + "room": 7, + "pointer": 2885051, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Cloudy Park 3 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park 4 - 0", + "level": 4, + "stage": 4, + "room": 0, + "pointer": 3072905, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 95, + "unkn2": 9, + "x": 88, + "y": 152, + "name": "Cloudy Park 4 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 23 + ], + [ + 1, + 23 + ], + [ + 0, + 23 + ], + [ + 31, + 16 + ] + ], + "locations": [], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 1", + "level": 4, + "stage": 4, + "room": 1, + "pointer": 3074863, + "animal_pointers": [ + 208, + 224 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 21, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Cloudy Park 4 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Cloudy Park 4 - Animal 1", + "Cloudy Park 4 - Animal 2" + ], + "music": 38 + }, + { + "name": "Cloudy Park 4 - 2", + "level": 4, + "stage": 4, + "room": 2, + "pointer": 3309209, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Gabon", + "Como", + "Wapod", + "Cappy" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 145, + "unkn2": 9, + "x": 104, + "y": 152, + "name": "Cloudy Park 4 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 88, + 16 + ], + [ + 24, + 16 + ], + [ + 12, + 16 + ], + [ + 14, + 23 + ], + [ + 41, + 16 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Cloudy Park 4 - Enemy 1 (Gabon)", + "Cloudy Park 4 - Enemy 2 (Como)", + "Cloudy Park 4 - Enemy 3 (Wapod)", + "Cloudy Park 4 - Enemy 4 (Cappy)", + "Cloudy Park 4 - Star 1", + "Cloudy Park 4 - Star 2", + "Cloudy Park 4 - Star 3", + "Cloudy Park 4 - Star 4", + "Cloudy Park 4 - Star 5", + "Cloudy Park 4 - Star 6", + "Cloudy Park 4 - Star 7", + "Cloudy Park 4 - Star 8", + "Cloudy Park 4 - Star 9", + "Cloudy Park 4 - Star 10", + "Cloudy Park 4 - Star 11", + "Cloudy Park 4 - Star 12" + ], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 3", + "level": 4, + "stage": 4, + "room": 3, + "pointer": 3296291, + "animal_pointers": [], + "consumables": [ + { + "idx": 33, + "pointer": 776, + "x": 1880, + "y": 152, + "etype": 22, + "vtype": 0, + "name": "Cloudy Park 4 - 1-Up (Windy)" + }, + { + "idx": 34, + "pointer": 912, + "x": 2160, + "y": 152, + "etype": 22, + "vtype": 2, + "name": "Cloudy Park 4 - Maxim Tomato (Windy)" + } + ], + "consumables_pointer": 304, + "enemies": [ + "Sparky", + "Togezo" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 144, + "unkn2": 9, + "x": 56, + "y": 136, + "name": "Cloudy Park 4 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 18, + 16 + ], + [ + 8, + 16 + ], + [ + 31, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 4, + 16 + ], + [ + 0, + 22 + ], + [ + 2, + 22 + ] + ], + "locations": [ + "Cloudy Park 4 - Enemy 5 (Sparky)", + "Cloudy Park 4 - Enemy 6 (Togezo)", + "Cloudy Park 4 - Star 13", + "Cloudy Park 4 - Star 14", + "Cloudy Park 4 - Star 15", + "Cloudy Park 4 - Star 16", + "Cloudy Park 4 - Star 17", + "Cloudy Park 4 - Star 18", + "Cloudy Park 4 - Star 19", + "Cloudy Park 4 - Star 20", + "Cloudy Park 4 - Star 21", + "Cloudy Park 4 - Star 22", + "Cloudy Park 4 - Star 23", + "Cloudy Park 4 - Star 24", + "Cloudy Park 4 - Star 25", + "Cloudy Park 4 - Star 26", + "Cloudy Park 4 - Star 27", + "Cloudy Park 4 - Star 28", + "Cloudy Park 4 - Star 29", + "Cloudy Park 4 - Star 30", + "Cloudy Park 4 - 1-Up (Windy)", + "Cloudy Park 4 - Maxim Tomato (Windy)" + ], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 4", + "level": 4, + "stage": 4, + "room": 4, + "pointer": 3330996, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bronto Burt", + "KeKe", + "Bouncy" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 4, + "unkn2": 15, + "x": 72, + "y": 152, + "name": "Cloudy Park 4 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 13, + 16 + ], + [ + 51, + 16 + ], + [ + 17, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 16 + ] + ], + "locations": [ + "Cloudy Park 4 - Enemy 7 (Bronto Burt)", + "Cloudy Park 4 - Enemy 8 (KeKe)", + "Cloudy Park 4 - Enemy 9 (Bouncy)", + "Cloudy Park 4 - Star 31", + "Cloudy Park 4 - Star 32", + "Cloudy Park 4 - Star 33", + "Cloudy Park 4 - Star 34", + "Cloudy Park 4 - Star 35", + "Cloudy Park 4 - Star 36", + "Cloudy Park 4 - Star 37", + "Cloudy Park 4 - Star 38" + ], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 5", + "level": 4, + "stage": 4, + "room": 5, + "pointer": 3332300, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sir Kibble", + "Mariel" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 21, + "unkn2": 51, + "x": 2328, + "y": 120, + "name": "Cloudy Park 4 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 45, + 16 + ], + [ + 46, + 16 + ], + [ + 27, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 4 - Enemy 10 (Sir Kibble)", + "Cloudy Park 4 - Enemy 11 (Mariel)", + "Cloudy Park 4 - Star 39", + "Cloudy Park 4 - Star 40", + "Cloudy Park 4 - Star 41", + "Cloudy Park 4 - Star 42", + "Cloudy Park 4 - Star 43" + ], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 6", + "level": 4, + "stage": 4, + "room": 6, + "pointer": 3253310, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Kabu", + "Wappa" + ], + "default_exits": [ + { + "room": 9, + "unkn1": 3, + "unkn2": 6, + "x": 72, + "y": 152, + "name": "Cloudy Park 4 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 44, + 16 + ], + [ + 31, + 16 + ], + [ + 19, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 4 - Enemy 12 (Kabu)", + "Cloudy Park 4 - Enemy 13 (Wappa)", + "Cloudy Park 4 - Star 44", + "Cloudy Park 4 - Star 45", + "Cloudy Park 4 - Star 46", + "Cloudy Park 4 - Star 47", + "Cloudy Park 4 - Star 48", + "Cloudy Park 4 - Star 49", + "Cloudy Park 4 - Star 50" + ], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 7", + "level": 4, + "stage": 4, + "room": 7, + "pointer": 2967658, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 12, + "unkn2": 9, + "x": 152, + "y": 120, + "name": "Cloudy Park 4 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 3, + 27 + ] + ], + "locations": [ + "Cloudy Park 4 - Miniboss 1 (Jumper Shoot)" + ], + "music": 4 + }, + { + "name": "Cloudy Park 4 - 8", + "level": 4, + "stage": 4, + "room": 8, + "pointer": 2981644, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 13, + "unkn2": 9, + "x": 344, + "y": 680, + "name": "Cloudy Park 4 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 24, + 19 + ] + ], + "locations": [], + "music": 21 + }, + { + "name": "Cloudy Park 4 - 9", + "level": 4, + "stage": 4, + "room": 9, + "pointer": 3008001, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 10, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Cloudy Park 4 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 24, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Cloudy Park 4 - Mikarin & Kagami Mocchi" + ], + "music": 8 + }, + { + "name": "Cloudy Park 4 - 10", + "level": 4, + "stage": 4, + "room": 10, + "pointer": 2888184, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Cloudy Park 4 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park 5 - 0", + "level": 4, + "stage": 5, + "room": 0, + "pointer": 3192630, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Yaban", + "Sir Kibble", + "Cappy", + "Wappa" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 146, + "unkn2": 6, + "x": 168, + "y": 616, + "name": "Cloudy Park 5 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 32, + 16 + ], + [ + 27, + 16 + ], + [ + 44, + 16 + ], + [ + 12, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 5 - Enemy 1 (Yaban)", + "Cloudy Park 5 - Enemy 2 (Sir Kibble)", + "Cloudy Park 5 - Enemy 3 (Cappy)", + "Cloudy Park 5 - Enemy 4 (Wappa)", + "Cloudy Park 5 - Star 1", + "Cloudy Park 5 - Star 2" + ], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 1", + "level": 4, + "stage": 5, + "room": 1, + "pointer": 3050956, + "animal_pointers": [], + "consumables": [ + { + "idx": 5, + "pointer": 264, + "x": 480, + "y": 720, + "etype": 22, + "vtype": 2, + "name": "Cloudy Park 5 - Maxim Tomato (Pillars)" + } + ], + "consumables_pointer": 288, + "enemies": [ + "Galbo", + "Bronto Burt", + "KeKe" + ], + "default_exits": [ + { + "room": 2, + "unkn1": 32, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Cloudy Park 5 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 51, + 16 + ], + [ + 26, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 22 + ] + ], + "locations": [ + "Cloudy Park 5 - Enemy 5 (Galbo)", + "Cloudy Park 5 - Enemy 6 (Bronto Burt)", + "Cloudy Park 5 - Enemy 7 (KeKe)", + "Cloudy Park 5 - Star 3", + "Cloudy Park 5 - Star 4", + "Cloudy Park 5 - Star 5", + "Cloudy Park 5 - Maxim Tomato (Pillars)" + ], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 2", + "level": 4, + "stage": 5, + "room": 2, + "pointer": 3604194, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 3, + "unkn1": 17, + "unkn2": 9, + "x": 72, + "y": 88, + "name": "Cloudy Park 5 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Cloudy Park 5 - Animal 1", + "Cloudy Park 5 - Animal 2" + ], + "music": 40 + }, + { + "name": "Cloudy Park 5 - 3", + "level": 4, + "stage": 5, + "room": 3, + "pointer": 3131242, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Propeller", + "Klinko" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 98, + "unkn2": 5, + "x": 72, + "y": 120, + "name": "Cloudy Park 5 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 89, + 16 + ], + [ + 4, + 16 + ], + [ + 42, + 16 + ], + [ + 4, + 23 + ] + ], + "locations": [ + "Cloudy Park 5 - Enemy 8 (Propeller)", + "Cloudy Park 5 - Enemy 9 (Klinko)" + ], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 4", + "level": 4, + "stage": 5, + "room": 4, + "pointer": 2990116, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Wapod" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 23, + "unkn2": 7, + "x": 216, + "y": 744, + "name": "Cloudy Park 5 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 88, + 16 + ] + ], + "locations": [ + "Cloudy Park 5 - Enemy 10 (Wapod)" + ], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 5", + "level": 4, + "stage": 5, + "room": 5, + "pointer": 2975410, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 5, + "unkn2": 4, + "x": 104, + "y": 296, + "name": "Cloudy Park 5 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 1, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 16 + ] + ], + "locations": [ + "Cloudy Park 5 - Star 6" + ], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 6", + "level": 4, + "stage": 5, + "room": 6, + "pointer": 3173683, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Pteran" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 115, + "unkn2": 6, + "x": 56, + "y": 136, + "name": "Cloudy Park 5 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 16 + ], + [ + 1, + 23 + ], + [ + 39, + 16 + ], + [ + 70, + 16 + ] + ], + "locations": [ + "Cloudy Park 5 - Enemy 11 (Pteran)" + ], + "music": 17 + }, + { + "name": "Cloudy Park 5 - 7", + "level": 4, + "stage": 5, + "room": 7, + "pointer": 2992340, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 14, + "unkn2": 8, + "x": 72, + "y": 120, + "name": "Cloudy Park 5 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 25, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Cloudy Park 5 - Pick" + ], + "music": 8 + }, + { + "name": "Cloudy Park 5 - 8", + "level": 4, + "stage": 5, + "room": 8, + "pointer": 2891558, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Cloudy Park 5 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park 6 - 0", + "level": 4, + "stage": 6, + "room": 0, + "pointer": 3269847, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 65, + "unkn2": 9, + "x": 88, + "y": 152, + "name": "Cloudy Park 6 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 6 - Star 1" + ], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 1", + "level": 4, + "stage": 6, + "room": 1, + "pointer": 3252248, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 10, + "unkn1": 3, + "unkn2": 25, + "x": 72, + "y": 72, + "name": "Cloudy Park 6 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 16 + ], + [ + 55, + 16 + ] + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 2", + "level": 4, + "stage": 6, + "room": 2, + "pointer": 3028494, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Madoo" + ], + "default_exits": [ + { + "room": 0, + "unkn1": 4, + "unkn2": 9, + "x": 1032, + "y": 152, + "name": "Cloudy Park 6 - 2 Exit 0", + "access_rule": [] + }, + { + "room": 1, + "unkn1": 13, + "unkn2": 9, + "x": 56, + "y": 72, + "name": "Cloudy Park 6 - 2 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 58, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 6 - Enemy 1 (Madoo)", + "Cloudy Park 6 - Star 2", + "Cloudy Park 6 - Star 3", + "Cloudy Park 6 - Star 4", + "Cloudy Park 6 - Star 5" + ], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 3", + "level": 4, + "stage": 6, + "room": 3, + "pointer": 3131911, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 10, + "unkn1": 4, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Cloudy Park 6 - 3 Exit 0", + "access_rule": [] + }, + { + "room": 10, + "unkn1": 8, + "unkn2": 9, + "x": 136, + "y": 152, + "name": "Cloudy Park 6 - 3 Exit 1", + "access_rule": [] + }, + { + "room": 10, + "unkn1": 12, + "unkn2": 9, + "x": 200, + "y": 152, + "name": "Cloudy Park 6 - 3 Exit 2", + "access_rule": [] + }, + { + "room": 10, + "unkn1": 16, + "unkn2": 9, + "x": 264, + "y": 152, + "name": "Cloudy Park 6 - 3 Exit 3", + "access_rule": [] + }, + { + "room": 10, + "unkn1": 20, + "unkn2": 9, + "x": 328, + "y": 152, + "name": "Cloudy Park 6 - 3 Exit 4", + "access_rule": [] + } + ], + "entity_load": [ + [ + 58, + 16 + ] + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 4", + "level": 4, + "stage": 6, + "room": 4, + "pointer": 3115416, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Tick", + "Como" + ], + "default_exits": [ + { + "room": 8, + "unkn1": 20, + "unkn2": 4, + "x": 72, + "y": 488, + "name": "Cloudy Park 6 - 4 Exit 0", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 4, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Cloudy Park 6 - 4 Exit 1", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 8, + "unkn2": 9, + "x": 200, + "y": 152, + "name": "Cloudy Park 6 - 4 Exit 2", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 12, + "unkn2": 9, + "x": 328, + "y": 152, + "name": "Cloudy Park 6 - 4 Exit 3", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 16, + "unkn2": 9, + "x": 136, + "y": 152, + "name": "Cloudy Park 6 - 4 Exit 4", + "access_rule": [] + }, + { + "room": 11, + "unkn1": 20, + "unkn2": 9, + "x": 264, + "y": 152, + "name": "Cloudy Park 6 - 4 Exit 5", + "access_rule": [] + } + ], + "entity_load": [ + [ + 55, + 16 + ], + [ + 48, + 16 + ], + [ + 41, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 6 - Enemy 2 (Tick)", + "Cloudy Park 6 - Enemy 3 (Como)", + "Cloudy Park 6 - Star 6", + "Cloudy Park 6 - Star 7", + "Cloudy Park 6 - Star 8" + ], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 5", + "level": 4, + "stage": 6, + "room": 5, + "pointer": 3245809, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee Drawing", + "Bronto Burt Drawing", + "Bouncy Drawing" + ], + "default_exits": [ + { + "room": 15, + "unkn1": 65, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Cloudy Park 6 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 84, + 16 + ], + [ + 85, + 16 + ], + [ + 86, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", + "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", + "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)", + "Cloudy Park 6 - Star 9", + "Cloudy Park 6 - Star 10", + "Cloudy Park 6 - Star 11", + "Cloudy Park 6 - Star 12", + "Cloudy Park 6 - Star 13" + ], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 6", + "level": 4, + "stage": 6, + "room": 6, + "pointer": 3237044, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Propeller" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 56, + "unkn2": 9, + "x": 72, + "y": 136, + "name": "Cloudy Park 6 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 89, + 16 + ] + ], + "locations": [ + "Cloudy Park 6 - Enemy 7 (Propeller)" + ], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 7", + "level": 4, + "stage": 6, + "room": 7, + "pointer": 3262705, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Mopoo" + ], + "default_exits": [ + { + "room": 13, + "unkn1": 12, + "unkn2": 8, + "x": 184, + "y": 216, + "name": "Cloudy Park 6 - 7 Exit 0", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 57, + "unkn2": 8, + "x": 184, + "y": 216, + "name": "Cloudy Park 6 - 7 Exit 1", + "access_rule": [] + }, + { + "room": 9, + "unkn1": 64, + "unkn2": 8, + "x": 72, + "y": 120, + "name": "Cloudy Park 6 - 7 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 74, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 6 - Enemy 8 (Mopoo)", + "Cloudy Park 6 - Star 14", + "Cloudy Park 6 - Star 15", + "Cloudy Park 6 - Star 16", + "Cloudy Park 6 - Star 17" + ], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 8", + "level": 4, + "stage": 6, + "room": 8, + "pointer": 3027259, + "animal_pointers": [], + "consumables": [ + { + "idx": 22, + "pointer": 312, + "x": 224, + "y": 256, + "etype": 22, + "vtype": 0, + "name": "Cloudy Park 6 - 1-Up (Cutter)" + } + ], + "consumables_pointer": 304, + "enemies": [ + "Bukiset (Burning)", + "Bukiset (Ice)", + "Bukiset (Needle)", + "Bukiset (Clean)", + "Bukiset (Cutter)" + ], + "default_exits": [ + { + "room": 12, + "unkn1": 13, + "unkn2": 4, + "x": 88, + "y": 152, + "name": "Cloudy Park 6 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 78, + 16 + ], + [ + 80, + 16 + ], + [ + 76, + 16 + ], + [ + 79, + 16 + ], + [ + 83, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 0, + 22 + ] + ], + "locations": [ + "Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", + "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", + "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", + "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", + "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", + "Cloudy Park 6 - Star 18", + "Cloudy Park 6 - Star 19", + "Cloudy Park 6 - Star 20", + "Cloudy Park 6 - Star 21", + "Cloudy Park 6 - Star 22", + "Cloudy Park 6 - Star 23", + "Cloudy Park 6 - Star 24", + "Cloudy Park 6 - Star 25", + "Cloudy Park 6 - Star 26", + "Cloudy Park 6 - Star 27", + "Cloudy Park 6 - Star 28", + "Cloudy Park 6 - Star 29", + "Cloudy Park 6 - 1-Up (Cutter)" + ], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 9", + "level": 4, + "stage": 6, + "room": 9, + "pointer": 3089504, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 4, + "unkn1": 35, + "unkn2": 7, + "x": 72, + "y": 72, + "name": "Cloudy Park 6 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 41, + 16 + ] + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 10", + "level": 4, + "stage": 6, + "room": 10, + "pointer": 3132579, + "animal_pointers": [ + 242, + 250, + 258 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 20, + "unkn2": 4, + "x": 72, + "y": 152, + "name": "Cloudy Park 6 - 10 Exit 0", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 4, + "unkn2": 9, + "x": 88, + "y": 152, + "name": "Cloudy Park 6 - 10 Exit 1", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 8, + "unkn2": 9, + "x": 136, + "y": 152, + "name": "Cloudy Park 6 - 10 Exit 2", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 12, + "unkn2": 9, + "x": 200, + "y": 152, + "name": "Cloudy Park 6 - 10 Exit 3", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 16, + "unkn2": 9, + "x": 264, + "y": 152, + "name": "Cloudy Park 6 - 10 Exit 4", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 20, + "unkn2": 9, + "x": 328, + "y": 152, + "name": "Cloudy Park 6 - 10 Exit 5", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Cloudy Park 6 - Animal 1", + "Cloudy Park 6 - Animal 2", + "Cloudy Park 6 - Animal 3" + ], + "music": 40 + }, + { + "name": "Cloudy Park 6 - 11", + "level": 4, + "stage": 6, + "room": 11, + "pointer": 3017866, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 4, + "unkn1": 4, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Cloudy Park 6 - 11 Exit 0", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 8, + "unkn2": 9, + "x": 264, + "y": 152, + "name": "Cloudy Park 6 - 11 Exit 1", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 12, + "unkn2": 9, + "x": 136, + "y": 152, + "name": "Cloudy Park 6 - 11 Exit 2", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 16, + "unkn2": 9, + "x": 328, + "y": 152, + "name": "Cloudy Park 6 - 11 Exit 3", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 20, + "unkn2": 9, + "x": 200, + "y": 152, + "name": "Cloudy Park 6 - 11 Exit 4", + "access_rule": [] + } + ], + "entity_load": [ + [ + 58, + 16 + ] + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 12", + "level": 4, + "stage": 6, + "room": 12, + "pointer": 3036404, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 4, + "unkn2": 9, + "x": 200, + "y": 72, + "name": "Cloudy Park 6 - 12 Exit 0", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 13, + "unkn2": 9, + "x": 88, + "y": 152, + "name": "Cloudy Park 6 - 12 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 58, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Cloudy Park 6 - Star 30", + "Cloudy Park 6 - Star 31", + "Cloudy Park 6 - Star 32", + "Cloudy Park 6 - Star 33" + ], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 13", + "level": 4, + "stage": 6, + "room": 13, + "pointer": 2965251, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 10, + "unkn2": 13, + "x": 216, + "y": 136, + "name": "Cloudy Park 6 - 13 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 26, + 19 + ] + ], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 14", + "level": 4, + "stage": 6, + "room": 14, + "pointer": 3077236, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 10, + "unkn2": 13, + "x": 936, + "y": 136, + "name": "Cloudy Park 6 - 14 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 11 + }, + { + "name": "Cloudy Park 6 - 15", + "level": 4, + "stage": 6, + "room": 15, + "pointer": 3061794, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 16, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Cloudy Park 6 - 15 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 26, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Cloudy Park 6 - HB-007" + ], + "music": 8 + }, + { + "name": "Cloudy Park 6 - 16", + "level": 4, + "stage": 6, + "room": 16, + "pointer": 2888907, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Cloudy Park 6 - Complete" + ], + "music": 5 + }, + { + "name": "Cloudy Park Boss - 0", + "level": 4, + "stage": 7, + "room": 0, + "pointer": 2998682, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 3, + 18 + ] + ], + "locations": [ + "Cloudy Park - Boss (Ado) Purified", + "Level 4 Boss - Defeated", + "Level 4 Boss - Purified" + ], + "music": 2 + }, + { + "name": "Iceberg 1 - 0", + "level": 5, + "stage": 1, + "room": 0, + "pointer": 3363111, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee", + "Klinko", + "KeKe" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 104, + "unkn2": 8, + "x": 312, + "y": 1384, + "name": "Iceberg 1 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 42, + 16 + ], + [ + 0, + 16 + ], + [ + 51, + 16 + ] + ], + "locations": [ + "Iceberg 1 - Enemy 1 (Waddle Dee)", + "Iceberg 1 - Enemy 2 (Klinko)", + "Iceberg 1 - Enemy 3 (KeKe)" + ], + "music": 18 + }, + { + "name": "Iceberg 1 - 1", + "level": 5, + "stage": 1, + "room": 1, + "pointer": 3596524, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Como", + "Galbo", + "Rocky" + ], + "default_exits": [ + { + "room": 2, + "unkn1": 20, + "unkn2": 8, + "x": 72, + "y": 344, + "name": "Iceberg 1 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 3, + 16 + ], + [ + 41, + 16 + ], + [ + 26, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 6, + 23 + ] + ], + "locations": [ + "Iceberg 1 - Enemy 4 (Como)", + "Iceberg 1 - Enemy 5 (Galbo)", + "Iceberg 1 - Enemy 6 (Rocky)", + "Iceberg 1 - Star 1", + "Iceberg 1 - Star 2", + "Iceberg 1 - Star 3", + "Iceberg 1 - Star 4", + "Iceberg 1 - Star 5", + "Iceberg 1 - Star 6" + ], + "music": 18 + }, + { + "name": "Iceberg 1 - 2", + "level": 5, + "stage": 1, + "room": 2, + "pointer": 3288880, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Kapar" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 49, + "unkn2": 9, + "x": 184, + "y": 152, + "name": "Iceberg 1 - 2 Exit 0", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 94, + "unkn2": 21, + "x": 120, + "y": 168, + "name": "Iceberg 1 - 2 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 28, + 19 + ], + [ + 46, + 16 + ], + [ + 47, + 16 + ], + [ + 17, + 16 + ], + [ + 67, + 16 + ] + ], + "locations": [ + "Iceberg 1 - Enemy 7 (Kapar)" + ], + "music": 18 + }, + { + "name": "Iceberg 1 - 3", + "level": 5, + "stage": 1, + "room": 3, + "pointer": 3068439, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 10, + "unkn2": 9, + "x": 808, + "y": 152, + "name": "Iceberg 1 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 1 - Animal 1", + "Iceberg 1 - Animal 2" + ], + "music": 38 + }, + { + "name": "Iceberg 1 - 4", + "level": 5, + "stage": 1, + "room": 4, + "pointer": 3233681, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Mopoo", + "Babut", + "Wappa" + ], + "default_exits": [ + { + "room": 6, + "unkn1": 74, + "unkn2": 4, + "x": 56, + "y": 152, + "name": "Iceberg 1 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 44, + 16 + ], + [ + 43, + 16 + ], + [ + 74, + 16 + ] + ], + "locations": [ + "Iceberg 1 - Enemy 8 (Mopoo)", + "Iceberg 1 - Enemy 9 (Babut)", + "Iceberg 1 - Enemy 10 (Wappa)" + ], + "music": 18 + }, + { + "name": "Iceberg 1 - 5", + "level": 5, + "stage": 1, + "room": 5, + "pointer": 3406133, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bronto Burt", + "Chilly", + "Poppy Bros Jr." + ], + "default_exits": [ + { + "room": 4, + "unkn1": 196, + "unkn2": 9, + "x": 72, + "y": 744, + "name": "Iceberg 1 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 6, + 16 + ], + [ + 7, + 16 + ], + [ + 2, + 16 + ], + [ + 0, + 16 + ] + ], + "locations": [ + "Iceberg 1 - Enemy 11 (Bronto Burt)", + "Iceberg 1 - Enemy 12 (Chilly)", + "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)" + ], + "music": 18 + }, + { + "name": "Iceberg 1 - 6", + "level": 5, + "stage": 1, + "room": 6, + "pointer": 2985823, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Iceberg 1 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 28, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Iceberg 1 - Kogoesou" + ], + "music": 8 + }, + { + "name": "Iceberg 1 - 7", + "level": 5, + "stage": 1, + "room": 7, + "pointer": 2892040, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Iceberg 1 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg 2 - 0", + "level": 5, + "stage": 2, + "room": 0, + "pointer": 3106800, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Gabon", + "Nruff" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 113, + "unkn2": 36, + "x": 88, + "y": 152, + "name": "Iceberg 2 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 15, + 16 + ], + [ + 0, + 16 + ], + [ + 24, + 16 + ] + ], + "locations": [ + "Iceberg 2 - Enemy 1 (Gabon)", + "Iceberg 2 - Enemy 2 (Nruff)" + ], + "music": 20 + }, + { + "name": "Iceberg 2 - 1", + "level": 5, + "stage": 2, + "room": 1, + "pointer": 3334841, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee", + "Chilly", + "Pteran" + ], + "default_exits": [ + { + "room": 2, + "unkn1": 109, + "unkn2": 20, + "x": 88, + "y": 72, + "name": "Iceberg 2 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 6, + 16 + ], + [ + 0, + 16 + ], + [ + 4, + 16 + ], + [ + 39, + 16 + ] + ], + "locations": [ + "Iceberg 2 - Enemy 3 (Waddle Dee)", + "Iceberg 2 - Enemy 4 (Chilly)", + "Iceberg 2 - Enemy 5 (Pteran)" + ], + "music": 20 + }, + { + "name": "Iceberg 2 - 2", + "level": 5, + "stage": 2, + "room": 2, + "pointer": 3473408, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Glunk", + "Galbo", + "Babut", + "Magoo" + ], + "default_exits": [ + { + "room": 6, + "unkn1": 102, + "unkn2": 5, + "x": 88, + "y": 152, + "name": "Iceberg 2 - 2 Exit 0", + "access_rule": [] + }, + { + "room": 9, + "unkn1": 24, + "unkn2": 18, + "x": 88, + "y": 152, + "name": "Iceberg 2 - 2 Exit 1", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 37, + "unkn2": 26, + "x": 200, + "y": 184, + "name": "Iceberg 2 - 2 Exit 2", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 55, + "unkn2": 26, + "x": 200, + "y": 184, + "name": "Iceberg 2 - 2 Exit 3", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 73, + "unkn2": 26, + "x": 200, + "y": 184, + "name": "Iceberg 2 - 2 Exit 4", + "access_rule": [] + } + ], + "entity_load": [ + [ + 53, + 16 + ], + [ + 26, + 16 + ], + [ + 43, + 16 + ], + [ + 14, + 23 + ], + [ + 16, + 16 + ] + ], + "locations": [ + "Iceberg 2 - Enemy 6 (Glunk)", + "Iceberg 2 - Enemy 7 (Galbo)", + "Iceberg 2 - Enemy 8 (Babut)", + "Iceberg 2 - Enemy 9 (Magoo)", + "Iceberg 2 - Star 1", + "Iceberg 2 - Star 2" + ], + "music": 20 + }, + { + "name": "Iceberg 2 - 3", + "level": 5, + "stage": 2, + "room": 3, + "pointer": 3037006, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 11, + "unkn2": 11, + "x": 616, + "y": 424, + "name": "Iceberg 2 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 29, + 19 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 2 - Star 3" + ], + "music": 20 + }, + { + "name": "Iceberg 2 - 4", + "level": 5, + "stage": 2, + "room": 4, + "pointer": 3035198, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 11, + "unkn2": 11, + "x": 904, + "y": 424, + "name": "Iceberg 2 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 29, + 19 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 2 - Star 4", + "Iceberg 2 - Star 5" + ], + "music": 20 + }, + { + "name": "Iceberg 2 - 5", + "level": 5, + "stage": 2, + "room": 5, + "pointer": 3128551, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 11, + "unkn2": 11, + "x": 1192, + "y": 424, + "name": "Iceberg 2 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 29, + 19 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 2 - Star 6", + "Iceberg 2 - Star 7", + "Iceberg 2 - Star 8" + ], + "music": 20 + }, + { + "name": "Iceberg 2 - 6", + "level": 5, + "stage": 2, + "room": 6, + "pointer": 3270857, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Propeller", + "Nidoo", + "Oro" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 65, + "unkn2": 9, + "x": 88, + "y": 152, + "name": "Iceberg 2 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 62, + 16 + ], + [ + 4, + 22 + ], + [ + 89, + 16 + ], + [ + 28, + 16 + ], + [ + 25, + 16 + ] + ], + "locations": [ + "Iceberg 2 - Enemy 10 (Propeller)", + "Iceberg 2 - Enemy 11 (Nidoo)", + "Iceberg 2 - Enemy 12 (Oro)" + ], + "music": 20 + }, + { + "name": "Iceberg 2 - 7", + "level": 5, + "stage": 2, + "room": 7, + "pointer": 3212501, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Klinko", + "Bronto Burt" + ], + "default_exits": [ + { + "room": 8, + "unkn1": 124, + "unkn2": 8, + "x": 72, + "y": 152, + "name": "Iceberg 2 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 42, + 16 + ], + [ + 6, + 16 + ], + [ + 14, + 23 + ], + [ + 2, + 16 + ], + [ + 4, + 23 + ] + ], + "locations": [ + "Iceberg 2 - Enemy 13 (Klinko)", + "Iceberg 2 - Enemy 14 (Bronto Burt)", + "Iceberg 2 - Star 9", + "Iceberg 2 - Star 10", + "Iceberg 2 - Star 11", + "Iceberg 2 - Star 12", + "Iceberg 2 - Star 13", + "Iceberg 2 - Star 14", + "Iceberg 2 - Star 15", + "Iceberg 2 - Star 16", + "Iceberg 2 - Star 17", + "Iceberg 2 - Star 18", + "Iceberg 2 - Star 19" + ], + "music": 20 + }, + { + "name": "Iceberg 2 - 8", + "level": 5, + "stage": 2, + "room": 8, + "pointer": 2994515, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 10, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Iceberg 2 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 29, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Iceberg 2 - Samus" + ], + "music": 8 + }, + { + "name": "Iceberg 2 - 9", + "level": 5, + "stage": 2, + "room": 9, + "pointer": 3058084, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 4, + "unkn2": 9, + "x": 408, + "y": 296, + "name": "Iceberg 2 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 2 - Animal 1", + "Iceberg 2 - Animal 2" + ], + "music": 39 + }, + { + "name": "Iceberg 2 - 10", + "level": 5, + "stage": 2, + "room": 10, + "pointer": 2887220, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Iceberg 2 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg 3 - 0", + "level": 5, + "stage": 3, + "room": 0, + "pointer": 3455346, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Corori", + "Bouncy", + "Chilly", + "Pteran" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 98, + "unkn2": 6, + "x": 200, + "y": 232, + "name": "Iceberg 3 - 0 Exit 0", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 217, + "unkn2": 7, + "x": 40, + "y": 120, + "name": "Iceberg 3 - 0 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 60, + 16 + ], + [ + 6, + 16 + ], + [ + 39, + 16 + ], + [ + 13, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 3 - Enemy 1 (Corori)", + "Iceberg 3 - Enemy 2 (Bouncy)", + "Iceberg 3 - Enemy 3 (Chilly)", + "Iceberg 3 - Enemy 4 (Pteran)", + "Iceberg 3 - Star 1", + "Iceberg 3 - Star 2" + ], + "music": 14 + }, + { + "name": "Iceberg 3 - 1", + "level": 5, + "stage": 3, + "room": 1, + "pointer": 3019769, + "animal_pointers": [ + 192, + 200, + 208 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 0, + "unkn1": 11, + "unkn2": 14, + "x": 1592, + "y": 104, + "name": "Iceberg 3 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 3 - Animal 1", + "Iceberg 3 - Animal 2", + "Iceberg 3 - Animal 3" + ], + "music": 38 + }, + { + "name": "Iceberg 3 - 2", + "level": 5, + "stage": 3, + "room": 2, + "pointer": 3618121, + "animal_pointers": [], + "consumables": [ + { + "idx": 2, + "pointer": 352, + "x": 1776, + "y": 104, + "etype": 22, + "vtype": 2, + "name": "Iceberg 3 - Maxim Tomato (Ceiling)" + } + ], + "consumables_pointer": 128, + "enemies": [ + "Raft Waddle Dee", + "Kapar", + "Blipper" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 196, + "unkn2": 11, + "x": 72, + "y": 152, + "name": "Iceberg 3 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 22 + ], + [ + 71, + 16 + ], + [ + 57, + 16 + ], + [ + 21, + 16 + ], + [ + 67, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 3 - Enemy 5 (Raft Waddle Dee)", + "Iceberg 3 - Enemy 6 (Kapar)", + "Iceberg 3 - Enemy 7 (Blipper)", + "Iceberg 3 - Star 3", + "Iceberg 3 - Maxim Tomato (Ceiling)" + ], + "music": 14 + }, + { + "name": "Iceberg 3 - 3", + "level": 5, + "stage": 3, + "room": 3, + "pointer": 3650368, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Wapod" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 116, + "unkn2": 11, + "x": 40, + "y": 152, + "name": "Iceberg 3 - 3 Exit 0", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 63, + "unkn2": 13, + "x": 184, + "y": 136, + "name": "Iceberg 3 - 3 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 1, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 6, + 16 + ], + [ + 88, + 16 + ] + ], + "locations": [ + "Iceberg 3 - Enemy 8 (Wapod)", + "Iceberg 3 - Star 4", + "Iceberg 3 - Star 5", + "Iceberg 3 - Star 6", + "Iceberg 3 - Star 7", + "Iceberg 3 - Star 8", + "Iceberg 3 - Star 9", + "Iceberg 3 - Star 10" + ], + "music": 14 + }, + { + "name": "Iceberg 3 - 4", + "level": 5, + "stage": 3, + "room": 4, + "pointer": 3038208, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 3, + "unkn1": 10, + "unkn2": 8, + "x": 1032, + "y": 216, + "name": "Iceberg 3 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 3 - Animal 4", + "Iceberg 3 - Animal 5" + ], + "music": 39 + }, + { + "name": "Iceberg 3 - 5", + "level": 5, + "stage": 3, + "room": 5, + "pointer": 3013938, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 15, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Iceberg 3 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 30, + 19 + ] + ], + "locations": [], + "music": 31 + }, + { + "name": "Iceberg 3 - 6", + "level": 5, + "stage": 3, + "room": 6, + "pointer": 3624789, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Glunk", + "Icicle" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 211, + "unkn2": 7, + "x": 40, + "y": 152, + "name": "Iceberg 3 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 6, + 16 + ], + [ + 16, + 16 + ], + [ + 14, + 23 + ], + [ + 36, + 16 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Iceberg 3 - Enemy 9 (Glunk)", + "Iceberg 3 - Enemy 10 (Icicle)", + "Iceberg 3 - Star 11", + "Iceberg 3 - Star 12", + "Iceberg 3 - Star 13", + "Iceberg 3 - Star 14", + "Iceberg 3 - Star 15", + "Iceberg 3 - Star 16", + "Iceberg 3 - Star 17", + "Iceberg 3 - Star 18", + "Iceberg 3 - Star 19", + "Iceberg 3 - Star 20", + "Iceberg 3 - Star 21" + ], + "music": 14 + }, + { + "name": "Iceberg 3 - 7", + "level": 5, + "stage": 3, + "room": 7, + "pointer": 2989472, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 15, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Iceberg 3 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 30, + 19 + ] + ], + "locations": [ + "Iceberg 3 - Chef Kawasaki" + ], + "music": 8 + }, + { + "name": "Iceberg 3 - 8", + "level": 5, + "stage": 3, + "room": 8, + "pointer": 2889871, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Iceberg 3 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg 4 - 0", + "level": 5, + "stage": 4, + "room": 0, + "pointer": 3274879, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bronto Burt", + "Galbo", + "Klinko", + "Chilly" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 111, + "unkn2": 8, + "x": 72, + "y": 104, + "name": "Iceberg 4 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 42, + 16 + ], + [ + 6, + 16 + ], + [ + 2, + 16 + ], + [ + 26, + 16 + ] + ], + "locations": [ + "Iceberg 4 - Enemy 1 (Bronto Burt)", + "Iceberg 4 - Enemy 2 (Galbo)", + "Iceberg 4 - Enemy 3 (Klinko)", + "Iceberg 4 - Enemy 4 (Chilly)" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 1", + "level": 5, + "stage": 4, + "room": 1, + "pointer": 3371780, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Babut", + "Wappa" + ], + "default_exits": [ + { + "room": 2, + "unkn1": 60, + "unkn2": 36, + "x": 216, + "y": 88, + "name": "Iceberg 4 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 43, + 16 + ], + [ + 4, + 22 + ], + [ + 44, + 16 + ] + ], + "locations": [ + "Iceberg 4 - Enemy 5 (Babut)", + "Iceberg 4 - Enemy 6 (Wappa)" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 2", + "level": 5, + "stage": 4, + "room": 2, + "pointer": 3284378, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 16, + "unkn1": 8, + "unkn2": 39, + "x": 168, + "y": 152, + "name": "Iceberg 4 - 2 Exit 0", + "access_rule": [ + "Burning" + ] + }, + { + "room": 3, + "unkn1": 13, + "unkn2": 39, + "x": 88, + "y": 136, + "name": "Iceberg 4 - 2 Exit 1", + "access_rule": [] + }, + { + "room": 17, + "unkn1": 18, + "unkn2": 39, + "x": 120, + "y": 152, + "name": "Iceberg 4 - 2 Exit 2", + "access_rule": [ + "Burning" + ] + } + ], + "entity_load": [ + [ + 26, + 16 + ] + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 3", + "level": 5, + "stage": 4, + "room": 3, + "pointer": 3162957, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 4, + "unkn1": 44, + "unkn2": 8, + "x": 216, + "y": 104, + "name": "Iceberg 4 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 69, + 16 + ] + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 4", + "level": 5, + "stage": 4, + "room": 4, + "pointer": 3261679, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Icicle" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 4, + "unkn2": 42, + "x": 104, + "y": 840, + "name": "Iceberg 4 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 36, + 16 + ] + ], + "locations": [ + "Iceberg 4 - Enemy 7 (Icicle)" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 5", + "level": 5, + "stage": 4, + "room": 5, + "pointer": 3217398, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Corori" + ], + "default_exits": [ + { + "room": 6, + "unkn1": 19, + "unkn2": 5, + "x": 72, + "y": 120, + "name": "Iceberg 4 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 60, + 16 + ], + [ + 44, + 16 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Iceberg 4 - Enemy 8 (Corori)" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 6", + "level": 5, + "stage": 4, + "room": 6, + "pointer": 3108265, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 61, + "unkn2": 7, + "x": 456, + "y": 72, + "name": "Iceberg 4 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 62, + 16 + ] + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 7", + "level": 5, + "stage": 4, + "room": 7, + "pointer": 3346202, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 8, + "unkn1": 39, + "unkn2": 6, + "x": 168, + "y": 104, + "name": "Iceberg 4 - 7 Exit 0", + "access_rule": [] + }, + { + "room": 13, + "unkn1": 4, + "unkn2": 21, + "x": 88, + "y": 168, + "name": "Iceberg 4 - 7 Exit 1", + "access_rule": [ + "Burning" + ] + }, + { + "room": 13, + "unkn1": 21, + "unkn2": 21, + "x": 280, + "y": 168, + "name": "Iceberg 4 - 7 Exit 2", + "access_rule": [ + "Burning" + ] + } + ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 4, + 22 + ], + [ + 4, + 23 + ] + ], + "locations": [ + "Iceberg 4 - Star 1", + "Iceberg 4 - Star 2" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 8", + "level": 5, + "stage": 4, + "room": 8, + "pointer": 3055911, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 10, + "unkn2": 5, + "x": 648, + "y": 104, + "name": "Iceberg 4 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 26, + 16 + ] + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 9", + "level": 5, + "stage": 4, + "room": 9, + "pointer": 3056457, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 11, + "unkn1": 13, + "unkn2": 9, + "x": 136, + "y": 136, + "name": "Iceberg 4 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 1, + 27 + ] + ], + "locations": [ + "Iceberg 4 - Miniboss 1 (Yuki)" + ], + "music": 4 + }, + { + "name": "Iceberg 4 - 10", + "level": 5, + "stage": 4, + "room": 10, + "pointer": 3257516, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 9, + "unkn1": 8, + "unkn2": 37, + "x": 88, + "y": 40, + "name": "Iceberg 4 - 10 Exit 0", + "access_rule": [] + }, + { + "room": 9, + "unkn1": 15, + "unkn2": 37, + "x": 200, + "y": 40, + "name": "Iceberg 4 - 10 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 31, + 19 + ] + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 11", + "level": 5, + "stage": 4, + "room": 11, + "pointer": 3083322, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Gabon" + ], + "default_exits": [ + { + "room": 12, + "unkn1": 46, + "unkn2": 8, + "x": 88, + "y": 120, + "name": "Iceberg 4 - 11 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 24, + 16 + ] + ], + "locations": [ + "Iceberg 4 - Enemy 9 (Gabon)" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 12", + "level": 5, + "stage": 4, + "room": 12, + "pointer": 3147724, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Kabu" + ], + "default_exits": [ + { + "room": 18, + "unkn1": 64, + "unkn2": 7, + "x": 72, + "y": 456, + "name": "Iceberg 4 - 12 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 19, + 16 + ], + [ + 61, + 16 + ] + ], + "locations": [ + "Iceberg 4 - Enemy 10 (Kabu)" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 13", + "level": 5, + "stage": 4, + "room": 13, + "pointer": 3370077, + "animal_pointers": [ + 232, + 240, + 248 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 15, + "unkn1": 31, + "unkn2": 4, + "x": 216, + "y": 120, + "name": "Iceberg 4 - 13 Exit 0", + "access_rule": [] + }, + { + "room": 10, + "unkn1": 46, + "unkn2": 10, + "x": 72, + "y": 88, + "name": "Iceberg 4 - 13 Exit 1", + "access_rule": [] + }, + { + "room": 10, + "unkn1": 57, + "unkn2": 10, + "x": 312, + "y": 88, + "name": "Iceberg 4 - 13 Exit 2", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 28, + "unkn2": 21, + "x": 152, + "y": 136, + "name": "Iceberg 4 - 13 Exit 3", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 34, + "unkn2": 21, + "x": 280, + "y": 136, + "name": "Iceberg 4 - 13 Exit 4", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 4 - Animal 1", + "Iceberg 4 - Animal 2", + "Iceberg 4 - Animal 3" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 14", + "level": 5, + "stage": 4, + "room": 14, + "pointer": 3057002, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Broom Hatter", + "Sasuke" + ], + "default_exits": [ + { + "room": 15, + "unkn1": 4, + "unkn2": 8, + "x": 88, + "y": 360, + "name": "Iceberg 4 - 14 Exit 0", + "access_rule": [] + }, + { + "room": 13, + "unkn1": 10, + "unkn2": 8, + "x": 440, + "y": 344, + "name": "Iceberg 4 - 14 Exit 1", + "access_rule": [] + }, + { + "room": 13, + "unkn1": 16, + "unkn2": 8, + "x": 568, + "y": 344, + "name": "Iceberg 4 - 14 Exit 2", + "access_rule": [] + }, + { + "room": 15, + "unkn1": 22, + "unkn2": 8, + "x": 344, + "y": 360, + "name": "Iceberg 4 - 14 Exit 3", + "access_rule": [] + } + ], + "entity_load": [ + [ + 11, + 16 + ], + [ + 30, + 16 + ] + ], + "locations": [ + "Iceberg 4 - Enemy 11 (Broom Hatter)", + "Iceberg 4 - Enemy 12 (Sasuke)" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 15", + "level": 5, + "stage": 4, + "room": 15, + "pointer": 3116124, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 13, + "unkn1": 13, + "unkn2": 6, + "x": 520, + "y": 72, + "name": "Iceberg 4 - 15 Exit 0", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 4, + "unkn2": 22, + "x": 88, + "y": 136, + "name": "Iceberg 4 - 15 Exit 1", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 22, + "unkn2": 22, + "x": 344, + "y": 136, + "name": "Iceberg 4 - 15 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 22 + ] + ], + "locations": [], + "music": 19 + }, + { + "name": "Iceberg 4 - 16", + "level": 5, + "stage": 4, + "room": 16, + "pointer": 3069937, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 11, + "unkn2": 9, + "x": 152, + "y": 632, + "name": "Iceberg 4 - 16 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 4 - Animal 4" + ], + "music": 38 + }, + { + "name": "Iceberg 4 - 17", + "level": 5, + "stage": 4, + "room": 17, + "pointer": 3072413, + "animal_pointers": [ + 192 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 6, + "unkn2": 9, + "x": 280, + "y": 632, + "name": "Iceberg 4 - 17 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 4 - Animal 5" + ], + "music": 38 + }, + { + "name": "Iceberg 4 - 18", + "level": 5, + "stage": 4, + "room": 18, + "pointer": 3404593, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Nruff" + ], + "default_exits": [ + { + "room": 19, + "unkn1": 94, + "unkn2": 12, + "x": 72, + "y": 152, + "name": "Iceberg 4 - 18 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 23 + ], + [ + 43, + 16 + ], + [ + 30, + 16 + ], + [ + 15, + 16 + ] + ], + "locations": [ + "Iceberg 4 - Enemy 13 (Nruff)", + "Iceberg 4 - Star 3" + ], + "music": 19 + }, + { + "name": "Iceberg 4 - 19", + "level": 5, + "stage": 4, + "room": 19, + "pointer": 3075826, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 20, + "unkn1": 14, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Iceberg 4 - 19 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 31, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Iceberg 4 - Name" + ], + "music": 8 + }, + { + "name": "Iceberg 4 - 20", + "level": 5, + "stage": 4, + "room": 20, + "pointer": 2887943, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Iceberg 4 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg 5 - 0", + "level": 5, + "stage": 5, + "room": 0, + "pointer": 3316135, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Bukiset (Burning)", + "Bukiset (Stone)", + "Bukiset (Ice)", + "Bukiset (Needle)", + "Bukiset (Clean)", + "Bukiset (Parasol)", + "Bukiset (Spark)", + "Bukiset (Cutter)" + ], + "default_exits": [ + { + "room": 30, + "unkn1": 75, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 0 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 79, + 16 + ], + [ + 76, + 16 + ], + [ + 81, + 16 + ], + [ + 78, + 16 + ], + [ + 77, + 16 + ], + [ + 82, + 16 + ], + [ + 80, + 16 + ], + [ + 83, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 1 (Bukiset (Burning))", + "Iceberg 5 - Enemy 2 (Bukiset (Stone))", + "Iceberg 5 - Enemy 3 (Bukiset (Ice))", + "Iceberg 5 - Enemy 4 (Bukiset (Needle))", + "Iceberg 5 - Enemy 5 (Bukiset (Clean))", + "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", + "Iceberg 5 - Enemy 7 (Bukiset (Spark))", + "Iceberg 5 - Enemy 8 (Bukiset (Cutter))" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 1", + "level": 5, + "stage": 5, + "room": 1, + "pointer": 3037607, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 12, + "unkn2": 6, + "x": 72, + "y": 104, + "name": "Iceberg 5 - 1 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 1, + 16 + ] + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 2", + "level": 5, + "stage": 5, + "room": 2, + "pointer": 3103842, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Glunk" + ], + "default_exits": [ + { + "room": 25, + "unkn1": 27, + "unkn2": 6, + "x": 72, + "y": 200, + "name": "Iceberg 5 - 2 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 16, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 9 (Glunk)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 3", + "level": 5, + "stage": 5, + "room": 3, + "pointer": 3135899, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Wapod" + ], + "default_exits": [ + { + "room": 4, + "unkn1": 20, + "unkn2": 7, + "x": 72, + "y": 88, + "name": "Iceberg 5 - 3 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 88, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 10 (Wapod)", + "Iceberg 5 - Star 1", + "Iceberg 5 - Star 2" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 4", + "level": 5, + "stage": 5, + "room": 4, + "pointer": 3180695, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Tick" + ], + "default_exits": [ + { + "room": 5, + "unkn1": 26, + "unkn2": 5, + "x": 56, + "y": 104, + "name": "Iceberg 5 - 4 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 48, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 11 (Tick)", + "Iceberg 5 - Star 3", + "Iceberg 5 - Star 4", + "Iceberg 5 - Star 5", + "Iceberg 5 - Star 6", + "Iceberg 5 - Star 7", + "Iceberg 5 - Star 8" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 5", + "level": 5, + "stage": 5, + "room": 5, + "pointer": 3106064, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Madoo" + ], + "default_exits": [ + { + "room": 24, + "unkn1": 14, + "unkn2": 6, + "x": 168, + "y": 152, + "name": "Iceberg 5 - 5 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 58, + 16 + ], + [ + 14, + 23 + ], + [ + 4, + 22 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 12 (Madoo)", + "Iceberg 5 - Star 9", + "Iceberg 5 - Star 10", + "Iceberg 5 - Star 11", + "Iceberg 5 - Star 12", + "Iceberg 5 - Star 13", + "Iceberg 5 - Star 14" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 6", + "level": 5, + "stage": 5, + "room": 6, + "pointer": 3276800, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 7, + "unkn1": 59, + "unkn2": 12, + "x": 72, + "y": 120, + "name": "Iceberg 5 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 55, + 16 + ] + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 7", + "level": 5, + "stage": 5, + "room": 7, + "pointer": 3104585, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 26, + "unkn1": 25, + "unkn2": 7, + "x": 72, + "y": 136, + "name": "Iceberg 5 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 23, + 16 + ], + [ + 7, + 16 + ] + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 8", + "level": 5, + "stage": 5, + "room": 8, + "pointer": 3195121, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 9, + "unkn1": 35, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 8 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 16 + ] + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 9", + "level": 5, + "stage": 5, + "room": 9, + "pointer": 3087198, + "animal_pointers": [], + "consumables": [ + { + "idx": 16, + "pointer": 200, + "x": 256, + "y": 88, + "etype": 22, + "vtype": 0, + "name": "Iceberg 5 - 1-Up (Boulder)" + } + ], + "consumables_pointer": 128, + "enemies": [], + "default_exits": [ + { + "room": 28, + "unkn1": 20, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 22 + ], + [ + 54, + 16 + ] + ], + "locations": [ + "Iceberg 5 - 1-Up (Boulder)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 10", + "level": 5, + "stage": 5, + "room": 10, + "pointer": 3321612, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 32, + "unkn1": 45, + "unkn2": 15, + "x": 72, + "y": 120, + "name": "Iceberg 5 - 10 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 14, + 16 + ] + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 11", + "level": 5, + "stage": 5, + "room": 11, + "pointer": 3139178, + "animal_pointers": [], + "consumables": [ + { + "idx": 17, + "pointer": 192, + "x": 152, + "y": 168, + "etype": 22, + "vtype": 0, + "name": "Iceberg 5 - 1-Up (Floor)" + } + ], + "consumables_pointer": 176, + "enemies": [ + "Yaban" + ], + "default_exits": [ + { + "room": 12, + "unkn1": 17, + "unkn2": 7, + "x": 72, + "y": 120, + "name": "Iceberg 5 - 11 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 32, + 16 + ], + [ + 0, + 22 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 13 (Yaban)", + "Iceberg 5 - 1-Up (Floor)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 12", + "level": 5, + "stage": 5, + "room": 12, + "pointer": 3118231, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Propeller" + ], + "default_exits": [ + { + "room": 13, + "unkn1": 13, + "unkn2": 7, + "x": 72, + "y": 104, + "name": "Iceberg 5 - 12 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 89, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 14 (Propeller)", + "Iceberg 5 - Star 15", + "Iceberg 5 - Star 16", + "Iceberg 5 - Star 17", + "Iceberg 5 - Star 18", + "Iceberg 5 - Star 19", + "Iceberg 5 - Star 20" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 13", + "level": 5, + "stage": 5, + "room": 13, + "pointer": 3021658, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Mariel" + ], + "default_exits": [ + { + "room": 27, + "unkn1": 16, + "unkn2": 6, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 13 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 45, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 15 (Mariel)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 14", + "level": 5, + "stage": 5, + "room": 14, + "pointer": 3025398, + "animal_pointers": [], + "consumables": [ + { + "idx": 24, + "pointer": 200, + "x": 208, + "y": 88, + "etype": 22, + "vtype": 0, + "name": "Iceberg 5 - 1-Up (Peloo)" + } + ], + "consumables_pointer": 176, + "enemies": [], + "default_exits": [ + { + "room": 15, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 216, + "name": "Iceberg 5 - 14 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 64, + 16 + ], + [ + 0, + 22 + ] + ], + "locations": [ + "Iceberg 5 - 1-Up (Peloo)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 15", + "level": 5, + "stage": 5, + "room": 15, + "pointer": 3167445, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Pteran" + ], + "default_exits": [ + { + "room": 16, + "unkn1": 13, + "unkn2": 13, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 15 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 39, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 16 (Pteran)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 16", + "level": 5, + "stage": 5, + "room": 16, + "pointer": 3033990, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 33, + "unkn1": 36, + "unkn2": 9, + "x": 168, + "y": 152, + "name": "Iceberg 5 - 16 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 68, + 16 + ] + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 17", + "level": 5, + "stage": 5, + "room": 17, + "pointer": 3100111, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 20, + "unkn1": 40, + "unkn2": 7, + "x": 72, + "y": 200, + "name": "Iceberg 5 - 17 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 52, + 16 + ] + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 18", + "level": 5, + "stage": 5, + "room": 18, + "pointer": 3030947, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Galbo" + ], + "default_exits": [ + { + "room": 17, + "unkn1": 13, + "unkn2": 7, + "x": 72, + "y": 120, + "name": "Iceberg 5 - 18 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 26, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 17 (Galbo)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 19", + "level": 5, + "stage": 5, + "room": 19, + "pointer": 3105326, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "KeKe" + ], + "default_exits": [ + { + "room": 21, + "unkn1": 13, + "unkn2": 4, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 19 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 51, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 18 (KeKe)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 20", + "level": 5, + "stage": 5, + "room": 20, + "pointer": 3118928, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Nidoo" + ], + "default_exits": [ + { + "room": 19, + "unkn1": 13, + "unkn2": 6, + "x": 72, + "y": 264, + "name": "Iceberg 5 - 20 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 28, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 19 (Nidoo)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 21", + "level": 5, + "stage": 5, + "room": 21, + "pointer": 3202517, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Waddle Dee Drawing", + "Bronto Burt Drawing", + "Bouncy Drawing" + ], + "default_exits": [ + { + "room": 22, + "unkn1": 29, + "unkn2": 9, + "x": 72, + "y": 72, + "name": "Iceberg 5 - 21 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 84, + 16 + ], + [ + 85, + 16 + ], + [ + 86, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", + "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", + "Iceberg 5 - Enemy 22 (Bouncy Drawing)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 22", + "level": 5, + "stage": 5, + "room": 22, + "pointer": 3014656, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Joe" + ], + "default_exits": [ + { + "room": 23, + "unkn1": 13, + "unkn2": 4, + "x": 72, + "y": 104, + "name": "Iceberg 5 - 22 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 91, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 23 (Joe)", + "Iceberg 5 - Star 21", + "Iceberg 5 - Star 22", + "Iceberg 5 - Star 23", + "Iceberg 5 - Star 24", + "Iceberg 5 - Star 25" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 23", + "level": 5, + "stage": 5, + "room": 23, + "pointer": 3166550, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Kapar" + ], + "default_exits": [ + { + "room": 34, + "unkn1": 27, + "unkn2": 6, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 23 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 67, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 24 (Kapar)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 24", + "level": 5, + "stage": 5, + "room": 24, + "pointer": 3029110, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Gansan" + ], + "default_exits": [ + { + "room": 31, + "unkn1": 10, + "unkn2": 4, + "x": 72, + "y": 88, + "name": "Iceberg 5 - 24 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 75, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 25 (Gansan)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 25", + "level": 5, + "stage": 5, + "room": 25, + "pointer": 3156420, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sasuke" + ], + "default_exits": [ + { + "room": 3, + "unkn1": 25, + "unkn2": 7, + "x": 72, + "y": 120, + "name": "Iceberg 5 - 25 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 30, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 26 (Sasuke)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 26", + "level": 5, + "stage": 5, + "room": 26, + "pointer": 3127877, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Togezo" + ], + "default_exits": [ + { + "room": 8, + "unkn1": 24, + "unkn2": 8, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 26 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 18, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 27 (Togezo)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 27", + "level": 5, + "stage": 5, + "room": 27, + "pointer": 3256471, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sparky", + "Bobin" + ], + "default_exits": [ + { + "room": 14, + "unkn1": 26, + "unkn2": 9, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 27 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 8, + 16 + ], + [ + 73, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 28 (Sparky)", + "Iceberg 5 - Enemy 29 (Bobin)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 28", + "level": 5, + "stage": 5, + "room": 28, + "pointer": 3029723, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Chilly" + ], + "default_exits": [ + { + "room": 10, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 248, + "name": "Iceberg 5 - 28 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 6, + 16 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 30 (Chilly)" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 29", + "level": 5, + "stage": 5, + "room": 29, + "pointer": 3526568, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 36, + "unkn1": 10, + "unkn2": 6, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 29 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 10, + 23 + ], + [ + 31, + 16 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 5 - Star 26", + "Iceberg 5 - Star 27", + "Iceberg 5 - Star 28", + "Iceberg 5 - Star 29", + "Iceberg 5 - Star 30", + "Iceberg 5 - Star 31", + "Iceberg 5 - Star 32" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 30", + "level": 5, + "stage": 5, + "room": 30, + "pointer": 3022285, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 1, + "unkn1": 13, + "unkn2": 5, + "x": 88, + "y": 104, + "name": "Iceberg 5 - 30 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 5 - Animal 1", + "Iceberg 5 - Animal 2" + ], + "music": 40 + }, + { + "name": "Iceberg 5 - 31", + "level": 5, + "stage": 5, + "room": 31, + "pointer": 3026019, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 200, + "name": "Iceberg 5 - 31 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 5 - Animal 3", + "Iceberg 5 - Animal 4" + ], + "music": 40 + }, + { + "name": "Iceberg 5 - 32", + "level": 5, + "stage": 5, + "room": 32, + "pointer": 3039996, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 11, + "unkn1": 13, + "unkn2": 7, + "x": 72, + "y": 120, + "name": "Iceberg 5 - 32 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 5 - Animal 5", + "Iceberg 5 - Animal 6" + ], + "music": 40 + }, + { + "name": "Iceberg 5 - 33", + "level": 5, + "stage": 5, + "room": 33, + "pointer": 3015302, + "animal_pointers": [ + 192, + 200 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 18, + "unkn1": 10, + "unkn2": 6, + "x": 72, + "y": 152, + "name": "Iceberg 5 - 33 Exit 0", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 5 - Animal 7", + "Iceberg 5 - Animal 8" + ], + "music": 40 + }, + { + "name": "Iceberg 5 - 34", + "level": 5, + "stage": 5, + "room": 34, + "pointer": 3185868, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Peran" + ], + "default_exits": [ + { + "room": 35, + "unkn1": 35, + "unkn2": 9, + "x": 200, + "y": 328, + "name": "Iceberg 5 - 34 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 72, + 16 + ], + [ + 4, + 22 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 5 - Enemy 31 (Peran)", + "Iceberg 5 - Star 33", + "Iceberg 5 - Star 34" + ], + "music": 16 + }, + { + "name": "Iceberg 5 - 35", + "level": 5, + "stage": 5, + "room": 35, + "pointer": 3865635, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 29, + "unkn1": 12, + "unkn2": 7, + "x": 168, + "y": 1384, + "name": "Iceberg 5 - 35 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 17, + 16 + ], + [ + 4, + 22 + ] + ], + "locations": [], + "music": 16 + }, + { + "name": "Iceberg 5 - 36", + "level": 5, + "stage": 5, + "room": 36, + "pointer": 3024154, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 37, + "unkn1": 13, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Iceberg 5 - 36 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 32, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Iceberg 5 - Shiro" + ], + "music": 8 + }, + { + "name": "Iceberg 5 - 37", + "level": 5, + "stage": 5, + "room": 37, + "pointer": 2890594, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Iceberg 5 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg 6 - 0", + "level": 5, + "stage": 6, + "room": 0, + "pointer": 3385305, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Nruff" + ], + "default_exits": [ + { + "room": 1, + "unkn1": 6, + "unkn2": 28, + "x": 136, + "y": 184, + "name": "Iceberg 6 - 0 Exit 0", + "access_rule": [] + }, + { + "room": 1, + "unkn1": 12, + "unkn2": 28, + "x": 248, + "y": 184, + "name": "Iceberg 6 - 0 Exit 1", + "access_rule": [] + }, + { + "room": 1, + "unkn1": 18, + "unkn2": 28, + "x": 360, + "y": 184, + "name": "Iceberg 6 - 0 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 15, + 16 + ] + ], + "locations": [ + "Iceberg 6 - Enemy 1 (Nruff)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 1", + "level": 5, + "stage": 6, + "room": 1, + "pointer": 3197599, + "animal_pointers": [ + 212, + 220, + 228 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 2, + "unkn1": 8, + "unkn2": 5, + "x": 152, + "y": 184, + "name": "Iceberg 6 - 1 Exit 0", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 15, + "unkn2": 5, + "x": 248, + "y": 184, + "name": "Iceberg 6 - 1 Exit 1", + "access_rule": [] + }, + { + "room": 2, + "unkn1": 22, + "unkn2": 5, + "x": 344, + "y": 184, + "name": "Iceberg 6 - 1 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 6 - Animal 1", + "Iceberg 6 - Animal 2", + "Iceberg 6 - Animal 3" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 2", + "level": 5, + "stage": 6, + "room": 2, + "pointer": 3097113, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 5, + "unkn1": 9, + "unkn2": 5, + "x": 136, + "y": 184, + "name": "Iceberg 6 - 2 Exit 0", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 15, + "unkn2": 5, + "x": 248, + "y": 184, + "name": "Iceberg 6 - 2 Exit 1", + "access_rule": [] + }, + { + "room": 5, + "unkn1": 21, + "unkn2": 5, + "x": 360, + "y": 184, + "name": "Iceberg 6 - 2 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 3", + "level": 5, + "stage": 6, + "room": 3, + "pointer": 3198422, + "animal_pointers": [ + 212, + 220, + 228 + ], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 6, + "unkn1": 8, + "unkn2": 5, + "x": 152, + "y": 184, + "name": "Iceberg 6 - 3 Exit 0", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 15, + "unkn2": 5, + "x": 248, + "y": 184, + "name": "Iceberg 6 - 3 Exit 1", + "access_rule": [] + }, + { + "room": 6, + "unkn1": 22, + "unkn2": 5, + "x": 344, + "y": 184, + "name": "Iceberg 6 - 3 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [ + "Iceberg 6 - Animal 4", + "Iceberg 6 - Animal 5", + "Iceberg 6 - Animal 6" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 4", + "level": 5, + "stage": 6, + "room": 4, + "pointer": 3210507, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 3, + "unkn1": 9, + "unkn2": 5, + "x": 136, + "y": 184, + "name": "Iceberg 6 - 4 Exit 0", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 15, + "unkn2": 5, + "x": 248, + "y": 184, + "name": "Iceberg 6 - 4 Exit 1", + "access_rule": [] + }, + { + "room": 3, + "unkn1": 21, + "unkn2": 5, + "x": 360, + "y": 184, + "name": "Iceberg 6 - 4 Exit 2", + "access_rule": [] + } + ], + "entity_load": [], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 5", + "level": 5, + "stage": 6, + "room": 5, + "pointer": 3196776, + "animal_pointers": [], + "consumables": [ + { + "idx": 0, + "pointer": 212, + "x": 136, + "y": 120, + "etype": 22, + "vtype": 2, + "name": "Iceberg 6 - Maxim Tomato (Left)" + }, + { + "idx": 1, + "pointer": 220, + "x": 248, + "y": 120, + "etype": 22, + "vtype": 0, + "name": "Iceberg 6 - 1-Up (Middle)" + } + ], + "consumables_pointer": 128, + "enemies": [], + "default_exits": [ + { + "room": 4, + "unkn1": 8, + "unkn2": 5, + "x": 152, + "y": 184, + "name": "Iceberg 6 - 5 Exit 0", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 15, + "unkn2": 5, + "x": 248, + "y": 184, + "name": "Iceberg 6 - 5 Exit 1", + "access_rule": [] + }, + { + "room": 4, + "unkn1": 22, + "unkn2": 5, + "x": 344, + "y": 184, + "name": "Iceberg 6 - 5 Exit 2", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 22 + ], + [ + 0, + 22 + ], + [ + 14, + 23 + ] + ], + "locations": [ + "Iceberg 6 - Star 1", + "Iceberg 6 - Maxim Tomato (Left)", + "Iceberg 6 - 1-Up (Middle)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 6", + "level": 5, + "stage": 6, + "room": 6, + "pointer": 3208130, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Nidoo" + ], + "default_exits": [ + { + "room": 7, + "unkn1": 9, + "unkn2": 5, + "x": 136, + "y": 168, + "name": "Iceberg 6 - 6 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 28, + 16 + ] + ], + "locations": [ + "Iceberg 6 - Enemy 2 (Nidoo)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 7", + "level": 5, + "stage": 6, + "room": 7, + "pointer": 3124478, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sparky" + ], + "default_exits": [ + { + "room": 8, + "unkn1": 17, + "unkn2": 10, + "x": 296, + "y": 136, + "name": "Iceberg 6 - 7 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 8, + 16 + ] + ], + "locations": [ + "Iceberg 6 - Enemy 3 (Sparky)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 8", + "level": 5, + "stage": 6, + "room": 8, + "pointer": 3110431, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 9, + "unkn1": 7, + "unkn2": 5, + "x": 152, + "y": 168, + "name": "Iceberg 6 - 8 Exit 0", + "access_rule": [] + }, + { + "room": 14, + "unkn1": 14, + "unkn2": 5, + "x": 296, + "y": 136, + "name": "Iceberg 6 - 8 Exit 1", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 22 + ], + [ + 33, + 19 + ] + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 9", + "level": 5, + "stage": 6, + "room": 9, + "pointer": 3139832, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 10, + "unkn1": 16, + "unkn2": 10, + "x": 296, + "y": 136, + "name": "Iceberg 6 - 9 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 2, + 27 + ] + ], + "locations": [ + "Iceberg 6 - Miniboss 1 (Blocky)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 10", + "level": 5, + "stage": 6, + "room": 10, + "pointer": 3119624, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 11, + "unkn1": 7, + "unkn2": 5, + "x": 152, + "y": 168, + "name": "Iceberg 6 - 10 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 11", + "level": 5, + "stage": 6, + "room": 11, + "pointer": 3141139, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 12, + "unkn1": 16, + "unkn2": 10, + "x": 296, + "y": 136, + "name": "Iceberg 6 - 11 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 3, + 27 + ] + ], + "locations": [ + "Iceberg 6 - Miniboss 2 (Jumper Shoot)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 12", + "level": 5, + "stage": 6, + "room": 12, + "pointer": 3123788, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 13, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 168, + "name": "Iceberg 6 - 12 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 13", + "level": 5, + "stage": 6, + "room": 13, + "pointer": 3143741, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 14, + "unkn1": 15, + "unkn2": 10, + "x": 296, + "y": 136, + "name": "Iceberg 6 - 13 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 1, + 27 + ] + ], + "locations": [ + "Iceberg 6 - Miniboss 3 (Yuki)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 14", + "level": 5, + "stage": 6, + "room": 14, + "pointer": 3120319, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 15, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 168, + "name": "Iceberg 6 - 14 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 15", + "level": 5, + "stage": 6, + "room": 15, + "pointer": 3135238, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [ + "Sir Kibble" + ], + "default_exits": [ + { + "room": 16, + "unkn1": 15, + "unkn2": 10, + "x": 296, + "y": 136, + "name": "Iceberg 6 - 15 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 27, + 16 + ] + ], + "locations": [ + "Iceberg 6 - Enemy 4 (Sir Kibble)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 16", + "level": 5, + "stage": 6, + "room": 16, + "pointer": 3123096, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 17, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 168, + "name": "Iceberg 6 - 16 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 22 + ], + [ + 33, + 19 + ] + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 17", + "level": 5, + "stage": 6, + "room": 17, + "pointer": 3144389, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 18, + "unkn1": 15, + "unkn2": 10, + "x": 296, + "y": 136, + "name": "Iceberg 6 - 17 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 5, + 27 + ] + ], + "locations": [ + "Iceberg 6 - Miniboss 4 (Haboki)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 18", + "level": 5, + "stage": 6, + "room": 18, + "pointer": 3121014, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 19, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 168, + "name": "Iceberg 6 - 18 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 19", + "level": 5, + "stage": 6, + "room": 19, + "pointer": 3017228, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 20, + "unkn1": 15, + "unkn2": 10, + "x": 296, + "y": 136, + "name": "Iceberg 6 - 19 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 4, + 27 + ] + ], + "locations": [ + "Iceberg 6 - Miniboss 5 (Boboo)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 20", + "level": 5, + "stage": 6, + "room": 20, + "pointer": 3121709, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 21, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 168, + "name": "Iceberg 6 - 20 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 21", + "level": 5, + "stage": 6, + "room": 21, + "pointer": 3145036, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 22, + "unkn1": 15, + "unkn2": 10, + "x": 296, + "y": 136, + "name": "Iceberg 6 - 21 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 0, + 27 + ] + ], + "locations": [ + "Iceberg 6 - Miniboss 6 (Captain Stitch)" + ], + "music": 12 + }, + { + "name": "Iceberg 6 - 22", + "level": 5, + "stage": 6, + "room": 22, + "pointer": 3116830, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 23, + "unkn1": 7, + "unkn2": 5, + "x": 136, + "y": 152, + "name": "Iceberg 6 - 22 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 4, + 22 + ] + ], + "locations": [], + "music": 12 + }, + { + "name": "Iceberg 6 - 23", + "level": 5, + "stage": 6, + "room": 23, + "pointer": 3045263, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [ + { + "room": 24, + "unkn1": 17, + "unkn2": 9, + "x": 72, + "y": 120, + "name": "Iceberg 6 - 23 Exit 0", + "access_rule": [] + } + ], + "entity_load": [ + [ + 33, + 19 + ], + [ + 42, + 19 + ] + ], + "locations": [ + "Iceberg 6 - Angel" + ], + "music": 8 + }, + { + "name": "Iceberg 6 - 24", + "level": 5, + "stage": 6, + "room": 24, + "pointer": 2889389, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 38, + 19 + ] + ], + "locations": [ + "Iceberg 6 - Complete" + ], + "music": 5 + }, + { + "name": "Iceberg Boss - 0", + "level": 5, + "stage": 7, + "room": 0, + "pointer": 2980207, + "animal_pointers": [], + "consumables": [], + "consumables_pointer": 0, + "enemies": [], + "default_exits": [], + "entity_load": [ + [ + 8, + 18 + ] + ], + "locations": [ + "Iceberg - Boss (Dedede) Purified", + "Level 5 Boss - Defeated", + "Level 5 Boss - Purified" + ], + "music": 7 + } +] \ No newline at end of file From 7501e01bbc0ea0f9a42ebee1104a9671047d9712 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 20 Jan 2024 19:51:28 -0600 Subject: [PATCH 143/165] set rules and fix non-star generation --- worlds/kdl3/Rules.py | 56 ++++++++++++++++++++++++++++++++++++++--- worlds/kdl3/__init__.py | 9 ++++--- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 6cf5e67bfe42..36e0824c07cd 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -204,14 +204,64 @@ def set_rules(world: "KDL3World") -> None: add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_m2, world.player), lambda state: can_reach_needle(state, world.player)) add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u2, world.player), - lambda state: can_reach_ice(state, world.player) and can_reach_rick(state, world.player)) + lambda state: can_reach_ice(state, world.player) and + (can_reach_rick(state, world.player) or can_reach_coo(state, world.player))) add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u3, world.player), - lambda state: can_reach_ice(state, world.player) and can_reach_rick(state, world.player)) + lambda state: can_reach_ice(state, world.player) and + (can_reach_rick(state, world.player) or can_reach_coo(state, world.player))) add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u4, world.player), - lambda state: can_reach_ice(state, world.player) and can_reach_rick(state, world.player)) + lambda state: can_reach_ice(state, world.player) and + (can_reach_rick(state, world.player) or can_reach_coo(state, world.player))) add_rule(world.multiworld.get_location(LocationName.cloudy_park_6_u1, world.player), lambda state: can_reach_cutter(state, world.player)) + if world.options.starsanity: + # ranges are our friend + for i in range(7, 11): + add_rule(world.multiworld.get_location(f"Grass Land 1 - Star {i}", world.player), + lambda state: can_reach_cutter(state, world.player)) + for i in range(11, 14): + add_rule(world.multiworld.get_location(f"Grass Land 1 - Star {i}", world.player), + lambda state: can_reach_parasol(state, world.player)) + for i in [1, 3, 4, 9, 10]: + add_rule(world.multiworld.get_location(f"Grass Land 2 - Star {i}", world.player), + lambda state: can_reach_stone(state, world.player)) + add_rule(world.multiworld.get_location("Grass Land 2 - Star 2", world.player), + lambda state: can_reach_burning(state, world.player)) + add_rule(world.multiworld.get_location("Ripple Field 2 - Star 17", world.player), + lambda state: can_reach_kine(state, world.player)) + for i in range(41, 43): + # any star past this point also needs kine, but so does the exit + add_rule(world.multiworld.get_location(f"Ripple Field 5 - Star {i}", world.player), + lambda state: can_reach_kine(state, world.player)) + for i in range(46, 49): + # also requires kine, but only for access from the prior room + add_rule(world.multiworld.get_location(f"Ripple Field 5 - Star {i}", world.player), + lambda state: can_reach_burning(state, world.player) and can_reach_stone(state, world.player)) + for i in range(12, 18): + add_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), + lambda state: can_reach_ice(state, world.player) and + (can_reach_rick(state, world.player) or can_reach_coo(state, world.player))) + for i in range(21, 23): + add_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), + lambda state: can_reach_chuchu(state, world.player)) + for r in [range(19, 21), range(23, 31)]: + for i in r: + add_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), + lambda state: can_reach_clean(state, world.player)) + for i in range(31, 41): + add_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), + lambda state: can_reach_burning(state, world.player)) + for r in [range(1, 31), range(44, 51)]: + for i in r: + add_rule(world.multiworld.get_location(f"Cloudy Park 4 - Star {i}", world.player), + lambda state: can_reach_clean(state, world.player)) + for i in [18, *list(range(20, 25))]: + add_rule(world.multiworld.get_location(f"Cloudy Park 6 - Star {i}", world.player), + lambda state: can_reach_ice(state, world.player)) + for i in [19, *list(range(25, 30))]: + add_rule(world.multiworld.get_location(f"Cloudy Park 6 - Star {i}", world.player), + lambda state: can_reach_ice(state, world.player)) # copy ability access edge cases # Kirby cannot eat enemies fully submerged in water. Vast majority of cases, the enemy can be brought to the surface # and eaten by inhaling while falling on top of them diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 2dd1f77f9e9f..7551beefcd9a 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -7,7 +7,7 @@ from worlds.AutoWorld import World, WebWorld from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item, \ trap_item_table, copy_ability_access_table -from .Locations import location_table, KDL3Location, level_consumables, consumable_locations +from .Locations import location_table, KDL3Location, level_consumables, consumable_locations, star_locations from .Names.AnimalFriendSpawns import animal_friend_spawns from .Names.EnemyAbilities import vanilla_enemies, enemy_mapping, enemy_restrictive from .Regions import create_levels, default_levels @@ -180,8 +180,11 @@ def create_items(self) -> None: itempool.extend([self.create_item(name) for name in copy_ability_table]) itempool.extend([self.create_item(name) for name in animal_friend_table]) required_percentage = self.options.heart_stars_required / 100.0 - remaining_items = (len(location_table) if self.options.consumables - else len(location_table) - len(consumable_locations)) - len(itempool) + remaining_items = len(location_table) + if not self.options.consumables: + remaining_items -= len(consumable_locations) + if not self.options.starsanity: + remaining_items -= len(star_locations) total_heart_stars = self.options.total_heart_stars required_heart_stars = max(math.floor(total_heart_stars * required_percentage), 5) # ensure at least 1 heart star required From 1e030cb1827d76ad9d219a883831dd37497f9a2d Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 21 Jan 2024 02:06:49 -0600 Subject: [PATCH 144/165] add stars to generation --- worlds/kdl3/Items.py | 11 +++++++++++ worlds/kdl3/__init__.py | 21 ++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index cfd44ccedf42..3958a93032f0 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -76,6 +76,17 @@ class KDL3Item(Item): "Invincible Candy": 2 } +star_item_weights = { + "Little Star": 4, + "Medium Star": 2, + "Big Star": 1 +} + +total_filler_weights = { + **filler_item_weights, + **star_item_weights +} + item_table = { **copy_ability_table, diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 7551beefcd9a..069f4aa0e855 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -6,7 +6,7 @@ from Options import PerGameCommonOptions from worlds.AutoWorld import World, WebWorld from .Items import item_table, item_names, copy_ability_table, animal_friend_table, filler_item_weights, KDL3Item, \ - trap_item_table, copy_ability_access_table + trap_item_table, copy_ability_access_table, star_item_weights, total_filler_weights from .Locations import location_table, KDL3Location, level_consumables, consumable_locations, star_locations from .Names.AnimalFriendSpawns import animal_friend_spawns from .Names.EnemyAbilities import vanilla_enemies, enemy_mapping, enemy_restrictive @@ -100,7 +100,10 @@ def create_item(self, name: str, force_non_progression=False) -> KDL3Item: classification = ItemClassification.trap return KDL3Item(name, classification, item.code, self.player) - def get_filler_item_name(self) -> str: + def get_filler_item_name(self, include_stars=True) -> str: + if include_stars: + return self.random.choices(list(total_filler_weights.keys()), + weights=list(total_filler_weights.values()))[0] return self.random.choices(list(filler_item_weights.keys()), weights=list(filler_item_weights.values()))[0] @@ -180,14 +183,18 @@ def create_items(self) -> None: itempool.extend([self.create_item(name) for name in copy_ability_table]) itempool.extend([self.create_item(name) for name in animal_friend_table]) required_percentage = self.options.heart_stars_required / 100.0 - remaining_items = len(location_table) + remaining_items = len(location_table) - len(itempool) if not self.options.consumables: remaining_items -= len(consumable_locations) - if not self.options.starsanity: - remaining_items -= len(star_locations) + remaining_items -= len(star_locations) + if self.options.starsanity: + # star fill, keep consumable pool locked to consumable and fill 767 stars specifically + itempool.extend([self.create_item(self.random.choices(list(star_item_weights.keys()), + weights=list(star_item_weights.values()))[0]) + for _ in range(767)]) total_heart_stars = self.options.total_heart_stars required_heart_stars = max(math.floor(total_heart_stars * required_percentage), - 5) # ensure at least 1 heart star required + 5) # ensure at least 1 heart star required per world filler_items = total_heart_stars - required_heart_stars filler_amount = math.floor(filler_items * (self.options.filler_percentage / 100.0)) trap_amount = math.floor(filler_amount * (self.options.trap_percentage / 100.0)) @@ -214,7 +221,7 @@ def create_items(self) -> None: requirements.insert(i - 1, quotient * i) self.boss_requirements = requirements itempool.extend([self.create_item("Heart Star") for _ in range(required_heart_stars)]) - itempool.extend([self.create_item(self.get_filler_item_name()) + itempool.extend([self.create_item(self.get_filler_item_name(False)) for _ in range(filler_amount + (remaining_items - total_heart_stars))]) itempool.extend([self.create_item(self.get_trap_item_name()) for _ in range(trap_amount)]) From 85241fa9ba052d34bcf85cd73acc2d6a83d1904f Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 3 Feb 2024 16:35:12 -0600 Subject: [PATCH 145/165] fix hint extension, needs testing --- worlds/kdl3/__init__.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 069f4aa0e855..5b591588f0b2 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -309,15 +309,6 @@ def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): if self.stage_shuffle_enabled: regions = {LocationName.level_names[level]: level for level in LocationName.level_names} level_hint_data = {} - for level in self.player_levels: - for i in range(len(self.player_levels[level]) - 1): - stage = self.player_levels[level][i] - level_hint_data[stage] = regions[level] + f" {i + 1}" - if stage & 0x200 == 0: - level_hint_data[stage + 0x100] = regions[level] + f" {i + 1}" - if self.options.consumables and stage & 0xFF in level_consumables: - for consumable in level_consumables[stage & 0xFF]: - level_hint_data[consumable + 0x770300] = regions[level] + f" {i + 1}" - for i in range(5): - level_hint_data[0x770200 + i] = regions[i + 1] + " Boss" + for location in [location for location in self.multiworld.get_locations(self.player) if location.address]: + level_hint_data[location.address] = f"{regions[location.parent_region.level]} {location.parent_region.stage if location.parent_region.stage < 7 else 'Boss'}" hint_data[self.player] = level_hint_data From 9bc6d1f965e6ab6d41857ffbfa0da95e8b14e2a3 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 10 Feb 2024 16:58:53 -0600 Subject: [PATCH 146/165] move to assembled basepatch, needs repairing --- worlds/kdl3/Rom.py | 868 +---------------- worlds/kdl3/data/kdl3_basepatch.bsdiff4 | Bin 0 -> 2305 bytes worlds/kdl3/src/kdl3_basepatch.asm | 1138 +++++++++++++++++++++++ 3 files changed, 1142 insertions(+), 864 deletions(-) create mode 100644 worlds/kdl3/data/kdl3_basepatch.bsdiff4 create mode 100644 worlds/kdl3/src/kdl3_basepatch.asm diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index c44063e412f6..bcab748a75b7 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -284,6 +284,9 @@ def read_from_file(self, file: str): with open(file, 'rb') as stream: self.file = bytearray(stream.read()) + def apply_patch(self, patch: bytes): + self.file = bytearray(bsdiff4.patch(bytes(self.file), patch)) + def write_crc(self): crc = (sum(self.file[:0x7FDC] + self.file[0x7FE0:]) + 0x01FE) & 0xFFFF inv = crc ^ 0xFFFF @@ -381,881 +384,18 @@ def patch(self, target: str): def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomData, heart_stars_required: int, boss_requirements: Dict[int, int], shuffled_levels: Dict[int, List[int]], bb_boss_enabled: List[bool], copy_abilities: Dict[str, str], slot_random: Random): - # increase BWRAM by 0x8000 - rom.write_byte(0x7FD8, 0x06) - - # hook BWRAM initialization for initializing our new BWRAM - rom.write_bytes(0x33, [0x22, 0x00, 0x9E, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # JSL $079E00, NOP the rest - - # Initialize BWRAM with ROM parameters - rom.write_bytes(0x39E00, [0xA0, 0x01, 0x60, # LDA #$6001 starting addr - 0xA9, 0xFE, 0x1F, # LDY #$1FFE bytes to write - 0x54, 0x40, 0x40, # MVN $40, $40 copy $406000 from 406001 to 407FFE - 0xA2, 0x00, 0x00, # LDX #$0000 - 0xA0, 0x14, 0x00, # LDY #$0014 - 0xBD, 0x00, 0x81, # LDA $8100, X - rom header - 0xDF, 0x00, 0xC0, 0x07, # CMP $07C000, X - compare to real rom name - 0xD0, 0x06, # BNE $079E1E - area is uninitialized or corrupt, reset - 0xE8, # INX - 0x88, # DEY - 0x30, 0x2C, # BMI $079E48 - if Y is negative, rom header matches, valid bwram - 0x80, 0xF1, # BRA $079E0F - else continue loop - 0xA9, 0x00, 0x00, # LDA #$0000 - 0x8D, 0x00, 0x80, # STA $8000 - initialize first byte that gets copied - 0xA2, 0x00, 0x80, # LDX #$8000 - 0xA0, 0x01, 0x80, # LDY #$8001 - 0xA9, 0xFD, 0x7F, # LDA #$7FFD - 0x54, 0x40, 0x40, # MVN $40, $40 - initialize 0x8000 onward - 0xA2, 0x00, 0xD0, # LDX #$D000 - seed info 0x3D000 - 0xA0, 0x00, 0x90, # LDY #$9000 - target location - 0xA9, 0x00, 0x10, # LDA #$1000 - 0x54, 0x40, 0x07, # MVN $07, $40 - 0xA2, 0x00, 0xC0, # LDX #$C000 - ROM name - 0xA0, 0x00, 0x81, # LDY #$8100 - target - 0xA9, 0x15, 0x00, # LDA #$0015 - 0x54, 0x40, 0x07, # MVN $07, $40 - 0x6B, # RTL - ]) - - rom.write_bytes(0x23FC, [0x22, 0x30, 0xA0, 0x07, # JSL $07A030 - 0xEA, ]) # NOP - - # write halken/ninten validation into bwram - rom.write_bytes(0x3A030, [0xA2, 0x05, 0x00, # LDX #$0005 - 0xBF, 0x05, 0xA4, 0x00, # LDA $A405, X - loop head (halken) - 0x9F, 0xF0, 0x80, 0x40, # STA $4080F0, X - 0xCA, # DEX - 0x10, 0xF5, # BPL loop head - branch if more letters to copy - 0xA2, 0x05, 0x00, # LDX #$0005 - 0xBF, 0x0B, 0xA4, 0x00, # LDA $A40B, X - loop head (ninten) - 0x9F, 0xF0, 0x8F, 0x40, # STA $408FF0, X - 0xCA, # DEX - 0x10, 0xF5, # BPL loop head - branch if more letters to copy - 0xC2, 0x20, # REP #$20 - 0xA9, 0x01, 0x00, # LDA #$0001 - 0x6B, # RTL - ]) - - # Copy Ability - rom.write_bytes(0x399A0, [0xB9, 0xF3, 0x54, # LDA $54F3 - 0x48, # PHA - 0x0A, # ASL - 0xAA, # TAX - 0x68, # PLA - 0xDD, 0x20, 0x80, # CMP $7F50, X - 0xEA, 0xEA, # NOP NOP - 0xF0, 0x03, # BEQ $0799B1 - 0xA9, 0x00, 0x00, # LDA #$0000 - 0x99, 0xA9, 0x54, # STA $54A9, Y - 0x6B, # RET - 0xEA, 0xEA, 0xEA, 0xEA, # NOPs to fill gap - 0x48, # PHA - 0x0A, # ASL - 0xA8, # TAX - 0x68, # PLA - 0xD9, 0x20, 0x80, # CMP $7F50, Y - 0xEA, # NOP - 0xF0, 0x03, # BEQ $0799C6 - 0xA9, 0x00, 0x00, # LDA #$0000 - 0x9D, 0xA9, 0x54, # STA $54A9, X - 0x9D, 0xDF, 0x39, # STA $39DF, X - 0x6B, # RET - ]) - - # Kirby/Gooey Copy Ability - rom.write_bytes(0x30518, [0x22, 0xA0, 0x99, 0x07, 0xEA, 0xEA, ]) # JSL $0799A0 - - # Animal Copy Ability - rom.write_bytes(0x507E8, [0x22, 0xB9, 0x99, 0x07, 0xEA, 0xEA, ]) # JSL $0799B0 - - # Entity Spawn - rom.write_bytes(0x21CD7, [0x22, 0x00, 0x9D, 0x07, ]) # JSL $079D00 - - # Check Spawn Animal - rom.write_bytes(0x39D00, [0x48, # PHA - 0xE0, 0x02, 0x00, # CPX #$0002 - is this an animal friend? - 0xD0, 0x0C, # BNE $079D12 - 0xEB, # XBA - 0x48, # PHA - 0x0A, # ASL - 0xA8, # TAY - 0x68, # PLA - 0x1A, # INC - 0xD9, 0x00, 0x80, # CMP $8000, Y - do we have this animal friend - 0xF0, 0x01, # BEQ $079D12 - we have this animal friend - 0xE8, # INX - 0x7A, # PLY - 0xA9, 0x99, 0x99, # LDA #$9999 - 0x6B, # RTL - ]) - - # Allow Purification - rom.write_bytes(0xAFC8, [0x22, 0x00, 0x9A, 0x07, # JSL $079A00 - 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) - - # Check Purification and Enable Sub-games - rom.write_bytes(0x39A00, [0x8A, # TXA - 0xC9, 0x00, 0x00, # CMP #$0000 - is this level 1 - 0xF0, 0x03, # BEQ $079A09 - 0x4A, # LSR - 0x4A, # LSR - 0x1A, # INC - 0xAA, # TAX - 0xAD, 0x70, 0x80, # LDA $8070 - heart stars - 0x18, # CLC - 0xCF, 0x0A, 0xD0, 0x07, # Compare to goal heart stars - 0x90, 0x28, # BCC $079A3C - we don't have enough - 0xDA, # PHX - 0xA9, 0x14, 0x00, # LDA #$0014 - 0x8D, 0x62, 0x7F, # STA #$7F62 - play sound fx 0x14 - 0xAF, 0x12, 0xD0, 0x07, # LDA $07D012 - goal - 0xC9, 0x00, 0x00, # CMP #$0000 - are we on zero goal? - 0xF0, 0x11, # BEQ $079A35 - we are - 0xA9, 0x01, 0x00, # LDA #$0001 - 0xAE, 0x17, 0x36, # LDX $3617 - current save - 0x9D, 0xDD, 0x53, # STA $53DD - boss butch - 0x9D, 0xDF, 0x53, # STA $53DF - MG5 - 0x9D, 0xE1, 0x53, # STA $53E1 - Jumping - 0x80, 0x06, # BRA $079A3B - 0xA9, 0x01, 0x00, # LDA #$0001 - 0x8D, 0xA0, 0x80, # STA $80A0 - zero unlock address - 0xFA, # PLX - 0xAD, 0x70, 0x80, # LDA $8070 - current heart stars - 0xDF, 0x00, 0xD0, 0x07, # CMP $07D000, X - compare to world heart stars - 0xB0, 0x02, # BCS $079A47 - 0x18, # CLC - 0x6B, # RTL - 0x38, # SEC - 0x6B, # RTL - ]) - - # Check for Sound on Main Loop - rom.write_bytes(0x6AE4, [0x22, 0x00, 0x9B, 0x07, 0xEA]) # JSL $079B00 - - # Play Sound Effect at given address and check/update traps - rom.write_bytes(0x39B00, [0x85, 0xD4, # STA $D4 - 0xEE, 0x24, 0x35, # INC $3524 - 0xEA, # NOP - 0xAD, 0x62, 0x7F, # LDA $7F62 - sfx to be played - 0xF0, 0x07, # BEQ $079B12 - skip if 0 - 0x22, 0x27, 0xD9, 0x00, # JSL $00D927 - play sfx - 0x9C, 0x62, 0x7F, # STZ $7F62 - 0xAD, 0xD0, 0x36, # LDA $36D0 - 0xC9, 0xFF, 0xFF, # CMP #$FFFF - are we in menus? - 0xF0, 0x34, # BEQ $079B4E - return if we are - 0xAD, 0x41, 0x55, # LDA $5541 - gooey status - 0x10, 0x0F, # BPL $079B2E - gooey is already spawned - 0xAD, 0x80, 0x80, # LDA $8080 - 0xC9, 0x00, 0x00, # CMP #$0000 - did we get a gooey trap - 0xF0, 0x07, # BEQ $079B2E - branch if we did not - 0x22, 0x80, 0xA1, 0x07, # JSL $07A180 - spawn gooey - 0x9C, 0x80, 0x80, # STZ $8080 - 0xAD, 0x82, 0x80, # LDA $8082 - slowness - 0xF0, 0x04, # BEQ $079B37 - are we under the effects of a slowness trap - 0x3A, # DEC - 0x8D, 0x82, 0x80, # STA $8082 - dec by 1 each frame - 0xDA, # PHX - 0x5A, # PHY - 0xAD, 0xA9, 0x54, # LDA $54A9 - copy ability - 0xF0, 0x0E, # BEQ $079B4C - branch if we do not have a copy ability - 0xAD, 0x84, 0x80, # LDA $8084 - eject ability - 0xF0, 0x09, # BEQ $079B4C - branch if we haven't received eject - 0xA9, 0x00, 0x20, # LDA #$2000 - select button press - 0x8D, 0xC1, 0x60, # STA $60C1 - write to controller mirror - 0x9C, 0x84, 0x80, # STZ $8084 - 0x7A, # PLY - 0xFA, # PLX - 0x6B, # RTL - ]) - - # Dedede - Remove bad ending - rom.write_byte(0xB013, 0x38) # Change CLC to SEC - - # Heart Star Graphics Fix - rom.write_bytes(0x39B50, [0xA9, 0x00, 0x00, # LDA #$0000 - 0xDA, # PHX - 0x5A, # PHY - 0xAE, 0x3F, 0x36, # LDX $363F - current level - 0xAC, 0x41, 0x36, # LDY $3641 - current stage - 0xE0, 0x00, 0x00, # CPX #$0000 - 0xF0, 0x09, # BEQ $079B69 - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, # INC x6 - 0xCA, # DEX - 0x80, 0xF2, # BRA $079B5B - return to loop head - 0xC0, 0x00, 0x00, # CPY #$0000 - 0xF0, 0x04, # BEQ $079B72 - 0x1A, # INC - 0x88, # DEY - 0x80, 0xF7, # BRA $079B69 - return to loop head - 0x0A, # ASL - 0xAA, # TAX - 0xBF, 0x80, 0xD0, 0x07, # LDA $079D080, X - table of original stage number - 0xC9, 0x03, 0x00, # CMP #$0003 - is the current stage a minigame stage? - 0xF0, 0x03, # BEQ $079B80 - branch if so - 0x18, # CLC - 0x80, 0x01, # BRA $079B81 - 0x38, # SEC - 0x7A, # PLY - 0xFA, # PLX - 0x6B, # RTL - ]) - - # Reroute Heart Star Graphic Check - rom.write_bytes(0x4A01F, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0xB0, ]) # 1-Ups - rom.write_bytes(0x4A0AE, [0x22, 0x50, 0x9B, 0x07, 0xEA, 0xEA, 0x90, ]) # Heart Stars - - # reroute 5-6 miniboss music override - rom.write_bytes(0x93238, [0x22, 0x80, 0x9F, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xB0, - ]) - rom.write_bytes(0x39F80, [0xEA, - 0xDA, # PHX - 0x5A, # PHY - 0xA9, 0x00, 0x00, # LDA #0000 - 0xAE, 0x3F, 0x36, # LDX $363F - 0xAC, 0x41, 0x36, # LDY $3641 - 0xE0, 0x00, 0x00, # CPX #$0000 - 0xF0, 0x0A, # BEQ $079F9B - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, # INC x6 - 0xCA, # DEX - 0x80, 0xF1, # BRA $079F8C - return to loop head - 0xC0, 0x00, 0x00, # CPY #$0000 - 0xF0, 0x04, # BEQ $079FA4 - 0x1A, # INC - 0x88, # DEY - 0x80, 0xF7, # BRA $079F9B - return to loop head - 0x0A, # ASL - 0xAA, # TAX - 0xBF, 0x20, 0xD0, 0x07, # LDA $07D020, X - 0xC9, 0x1E, 0x00, # CMP #$001E - 0xF0, 0x03, # BEQ $079FB2 - 0x18, # CLC - 0x80, 0x01, # BRA $079FB3 - 0x38, # SEC - 0x7A, # PLY - 0xFA, # PLX - 0x6B, # RTL - ]) - # reroute zero eligibility - rom.write_bytes(0x137B1, [0xA0, 0x80, 0xC9, 0x01, ]) # compare $80A0 to #$0001 for validating zero access - - # set goal on non-fast goal - rom.write_bytes(0x14463, [0x22, 0x00, 0x9F, 0x07, 0xEA, 0xEA, ]) - rom.write_bytes(0x39F00, [0xDA, # PHX - 0xAF, 0x12, 0xD0, 0x07, # LDA $07D012 - 0xC9, 0x00, 0x00, # CMP #$0000 - 0xF0, 0x11, # BEQ $079F1B - 0xA9, 0x01, 0x00, # LDA #$0001 - 0xAE, 0x17, 0x36, # LDX $3617 - current save - 0x9D, 0xDD, 0x53, # STA $53DD, X - Boss butch - 0x9D, 0xDF, 0x53, # STA $53DF, X - MG5 - 0x9D, 0xD1, 0x53, # STA $53D1, X - Jumping - 0x80, 0x06, # BRA $079F21 - 0xA9, 0x01, 0x00, # LDA #$0001 - 0x8D, 0xA0, 0x80, # STA $80A0 - 0xFA, # PLX - 0xA9, 0x06, 0x00, # LDA #$0006 - 0x8D, 0xC1, 0x5A, # STA $5AC1 - cutscene - 0x6B, # RTL - ]) - - # set flag for completing a stage - rom.write_bytes(0x1439D, [0x22, 0x80, 0xA0, 0x07, 0xEA, 0xEA, ]) - rom.write_bytes(0x3A080, [0xDA, # PHX - 0xAD, 0xC1, 0x5A, # LDA $5AC1 - completed stage cutscene - 0xF0, 0x38, # BEQ $07A0BE - we have not completed a stage - 0xA9, 0x00, 0x00, # LDA #$0000 - 0xAE, 0xCF, 0x53, # LDX $53CF - current level - 0xE0, 0x00, 0x00, # CPX #$0000 - 0xF0, 0x0A, # BEQ $07A09B - 0xCA, # DEX - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, # INC x6 - 0x80, 0xF1, # BRA $07A08C - return to loop head - 0xAE, 0xD3, 0x53, # LDX $53D3 - current stage - 0xE0, 0x07, 0x00, # CPX #$0007 - is this a boss stage - 0xF0, 0x1B, # BEQ $07A0BE - return if so - 0xCA, # DEX - 0xE0, 0x00, 0x00, # CPX #$0000 - 0xF0, 0x04, # BEQ $07A0AD - 0x1A, # INC - 0xCA, # DEX - 0x80, 0xF7, # BRA $07A0A4 - return to loop head - 0x0A, # ASL - 0xAA, # TAX - 0xBD, 0x20, 0x90, # LDA $9020, X - load the stage we completed - 0x3A, # DEC - 0x0A, # ASL - 0xAA, # TAX - 0xA9, 0x01, 0x00, # LDA #$0001 - 0x1D, 0x00, 0x82, # ORA $8200, X - 0x9D, 0x00, 0x82, # STA $8200, X - 0xFA, # PLX - 0xAD, 0xCF, 0x53, # LDA $53CF - 0xCD, 0xCB, 0x53, # CMP $53CB - 0x6B, # RTL - ]) - - # spawn Gooey for Gooey trap - rom.write_bytes(0x3A180, [0x5A, 0xDA, 0xA2, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x8D, 0x43, 0x55, 0xB9, 0x22, 0x19, 0x85, - 0xC0, 0xB9, 0xA2, 0x19, 0x85, 0xC2, 0xA9, 0x08, 0x00, 0x85, 0xC4, 0xA9, 0x02, 0x00, 0x8D, - 0x2A, 0x35, 0xA9, 0x03, 0x00, 0x22, 0x4F, 0xF5, 0x00, 0x8E, 0x41, 0x55, 0xA9, 0xFF, 0xFF, - 0x9D, 0x22, 0x06, 0x22, 0xEF, 0xBA, 0x00, 0x22, 0x3C, 0x88, 0xC4, 0xAE, 0xD1, 0x39, 0xE0, - 0x01, 0x00, 0xF0, 0x0D, 0xA9, 0xFF, 0xFF, 0xE0, 0x02, 0x00, 0xF0, 0x01, 0x3A, 0x22, 0x22, - 0x3C, 0xC4, 0xFA, 0x7A, 0x6B, ]) - # this is mostly just a copy of the function to spawn gooey when you press the A button, could probably be simpler - - # limit player speed when speed trap enabled - rom.write_bytes(0x3A200, [0xDA, # PHX - 0xAE, 0x82, 0x80, # LDX $8082 - do we have slowness - 0xF0, 0x01, # BEQ $07A207 - branch if we do not - 0x4A, # LSR - 0xFA, # PLX - 0x99, 0x22, 0x1F, # STA $1F22, Y - player max speed - 0x49, 0xFF, 0xFF, # EOR #$FFFF - 0x6B, # RTL - ]) - rom.write_bytes(0x785E, [0x22, 0x00, 0xA2, 0x07, 0xEA, 0xEA, ]) - - # write heart star count - rom.write_bytes(0x2246, [0x0D, 0xDA, 0xBD, 0xA0, 0x6C, 0xAA, 0xBD, 0x22, 0x6E, 0x20, 0x5B, 0xA2, 0xFA, 0xE8, 0x22, - 0x80, 0xA2, 0x07, ]) # change upper branch to hit our JSL, then JSL - rom.write_bytes(0x14317, [0x22, 0x00, 0xA3, 0x07, ]) - rom.write_bytes(0x3A280, [0xE0, 0x00, 0x00, # CPX #$0000 - 0xF0, 0x01, # BEQ $07A286 - 0xE8, # INX - 0xEC, 0x1E, 0x65, # CPX $651E - 0x90, 0x66, # BCC 07A2F1 - 0xE0, 0x00, 0x00, # CPX #$0000 - 0xF0, 0x61, # BEQ $07A2F1 - 0xAF, 0xD0, 0x36, 0x40, # LDA $4036D0 - 0x29, 0xFF, 0x00, # AND #$00FF - 0xF0, 0x57, # BEQ $07A2F0 - 0xAD, 0x00, 0x30, # LDA $3000 - 0x29, 0x00, 0x02, # AND #$0200 - 0xC9, 0x00, 0x00, # CMP #$0000 - 0xD0, 0x4C, # BNE $07A2F0 - 0x5A, # PHY - 0xAD, 0x00, 0x30, # LDA $3000 - 0xA8, # TAY - 0x18, # CLC - 0x69, 0x20, 0x00, # ADC #$0020 - 0x8D, 0x00, 0x30, # STA $3000 - 0xAF, 0x70, 0x80, 0x40, # LDA $408070 - 0xA2, 0x00, 0x00, # LDX #$0000 - 0xC9, 0x0A, 0x00, # CMP $000A - 0x90, 0x07, # BCC $07A2C3 - 0x38, # SEC - 0xE9, 0x0A, 0x00, # SBC #$000A - 0xE8, # INX - 0x80, 0xF4, # BRA $07A2B7 - 0xDA, # PHX - 0xAA, # TAX - 0x68, # PLA - 0x09, 0x00, 0x25, # ORA #$2500 - 0x48, # PHA - 0xA9, 0x70, 0x2C, # LDA #$2C70 - 0x99, 0x00, 0x00, # STA $0000, Y - 0x68, # PLA - 0xC8, # INY - 0xC8, # INY - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0x8A, # TXA - 0x09, 0x00, 0x25, # ORA #$2500 - 0x48, # PHA - 0xA9, 0x78, 0x2C, # LDA #$2C78 - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0x68, # PLA - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0x22, 0x80, 0xA3, 0x07, # JSL $07A380 - we ran out of room - 0x7A, # PLY - 0x38, # SEC - 0x6B, # RTL - ]) - rom.write_bytes(0x3A300, [0x22, 0x9F, 0xD2, 0x00, # JSL $00D29F - play sfx - 0xDA, # PHX - 0x8B, # PHB - 0xA9, 0x00, 0x00, - 0x48, # PHA - 0xAB, # PLB - 0xAB, # PLB - 0xA9, 0x00, 0x70, # LDA #$7000 - 0x8D, 0x16, 0x21, # STA $2116 - 0xA2, 0x00, 0x00, # LDX #$0000 - 0xE0, 0x40, 0x01, # CPX #$0140 - 0xF0, 0x0B, # BEQ $07A325 - 0xBF, 0x50, 0x2F, 0xD9, # LDA $D92F50, X - 0x8D, 0x18, 0x21, # STA $2118 - 0xE8, # INX - 0xE8, # INX - 0x80, 0xF0, # BRA $07A315 - 0xA2, 0x00, 0x00, # LDX #$0000 - 0xE0, 0x20, 0x00, # CPX #$0020 - 0xF0, 0x0B, # BEQ $07A338 - 0xBF, 0x10, 0x2E, 0xD9, # LDA $D92E10, X - 0x8D, 0x18, 0x21, # STA $2118 - 0xE8, # INX - 0xE8, # INX - 0x80, 0xF0, # BRA $07A328 - 0x5A, # PHY - 0xAF, 0x12, 0xD0, 0x07, # LDA $07D012 - 0x0A, # ASL - 0xAA, # TAX - 0xBF, 0x00, 0xE0, 0x07, # LDA $07E000, X - 0xAA, # TAX - 0xA0, 0x00, 0x00, # LDY #$0000 - 0xC0, 0x20, 0x00, # CPY #$0020 - 0xF0, 0x0D, # BEQ $07A359 - 0xBF, 0x70, 0x31, 0xD9, # LDA $D93170, X - 0x8D, 0x18, 0x21, # STA $2118 - 0xE8, # INX - 0xE8, # INX - 0xC8, # INY - 0xC8, # INY - 0x80, 0xEE, # BRA $07A347 - 0xAF, 0x0C, 0xD0, 0x07, # LDA $07D00C - 0x0A, # ASL - 0xAA, # TAX - 0xBF, 0x10, 0xE0, 0x07, # LDA $07E010, X - 0xAA, # TAX - 0xA0, 0x00, 0x00, # LDY #$0000 - 0xC0, 0x20, 0x00, # CPY #$0020 - 0xF0, 0x0D, # BEQ $07A379 - 0xBF, 0x70, 0x31, 0xD9, # LDA $D93170, X - 0x8D, 0x18, 0x21, # STA $2118 - 0xE8, # INX - 0xE8, # INX - 0xC8, # INY - 0xC8, # INY - 0x80, 0xEE, # BRA $07A367 - 0x7A, # PLY - 0xAB, # PLB - 0xFA, # PLX - 0x6B, # RTL - ]) - rom.write_bytes(0x3A380, [0xA9, 0x80, 0x2C, # LDA #$2C80 - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0xA9, 0x0A, 0x25, # LDA #$250A - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0xAF, 0xCF, 0x53, 0x40, # LDA $4053CF - 0x0A, # ASL - 0xAA, # TAX - 0xBF, 0x00, 0x90, 0x40, # LDA $409000, X - 0xC9, 0xFF, 0xFF, # CMP #$FFFF - 0xD0, 0x04, # BNE $07A3A3 - 0xCA, # DEX - 0xCA, # DEX - 0x80, 0xF3, # BRA $07A396 - 0xA2, 0x00, 0x00, # LDX #$0000 - 0xC9, 0x0A, 0x00, # CMP #$000A - 0x90, 0x07, # BCC $07A3A9 - 0x38, # SEC - 0xE9, 0x0A, 0x00, # SBC #$000A - 0xE8, # INX - 0x80, 0xF4, # BRA $07A39D - return to loop head - 0xDA, # PHX - 0xAA, # TAX - 0x68, # PLA - 0x09, 0x00, 0x25, # ORA #$2500 - 0x48, # PHA - 0xA9, 0x88, 0x2C, # LDA #$2C88 - 0x99, 0x00, 0x00, # STA $0000, Y - 0x68, # PLA - 0xC8, # INY - 0xC8, # INY - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0x8A, # TXA - 0x09, 0x00, 0x25, # ORA #$2500 - 0x48, # PHA - 0xA9, 0x90, 0x2C, # LDA #$2C90 - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0x68, # PLA - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0xA9, 0xD8, 0x14, # LDA #$14D8 - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0xA9, 0x0B, 0x25, # LDA #$250B - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0xA9, 0xE0, 0x14, # LDA #$14E0 - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0xA9, 0x0A, 0x25, # LDA #$250A - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0xA9, 0xE8, 0x14, # LDA #$14E8 - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0xA9, 0x0C, 0x25, # LDA #$250C - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0xAD, 0x00, 0x30, # LDA $3000 - 0x38, # SEC - 0xE9, 0x40, 0x30, # SBC #$3040 - 0x4A, # LSR - 0x4A, # LSR - 0xC9, 0x04, 0x00, # CMP #$0004 - 0x90, 0x06, # BCC $07A415 - 0x3A, 0x3A, 0x3A, 0x3A, # DEC x4 - 0x80, 0xF5, # BRA $07A40A - return to loop head - 0x8D, 0x40, 0x32, # STA $3240 - 0xA9, 0x04, 0x00, # LDA #$0004 - 0x38, # SEC - 0xED, 0x40, 0x32, # SBC $3240 - 0xAA, # TAX - 0xA9, 0xFF, 0x00, # LDA #$00FF - 0xE0, 0x00, 0x00, # CPX #$0000 - 0xF0, 0x05, # BEQ $07A42D - 0x4A, # LSR - 0x4A, # LSR - 0xCA, # DEX - 0x80, 0xF6, # BRA $07A423 - 0xAC, 0x02, 0x30, # LDY $3002 - 0x39, 0x00, 0x00, # AND $0000, Y - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xA9, 0x00, 0x00, # LDA #$0000 - 0x99, 0x00, 0x00, # STA $0000, Y - 0xC8, # INY - 0xC8, # INY - 0x99, 0x00, 0x00, # STA $0000, Y - 0x6B, # RTL - ]) - # Goal/Goal Speed letter offsets - rom.write_bytes(0x3E000, [0x20, 0x03, 0x20, 0x00, 0x80, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xA0, 0x01, 0xA0, 0x00, ]) - - # Heart Star Visual redirect - rom.write_bytes(0x1427C, [0x22, 0x80, 0xA4, 0x07, 0xEA, 0xEA, ]) - rom.write_bytes(0x3A480, [0xDA, # PHX - 0x8A, # TXA - 0x0A, # ASL - 0xAA, # TAX - 0xBD, 0x20, 0x90, # LDA $9020, X - 0x3A, # DEC - 0xAA, # TAX - 0xC9, 0x06, 0x00, # CMP #$0006 - 0x30, 0x07, # BMI $07A495 - 0xE8, # INX - 0x38, # SEC - 0xE9, 0x06, 0x00, # SBC #$0006 - 0x80, 0xF4, # BRA $07A489 - 0xBD, 0xA7, 0x53, # LDA $53A7, X - 0xFA, # PLX - 0x29, 0xFF, 0x00, # AND #$00FF - 0x6B, # RTL - ]) - - # Heart Star Cutscene redirect - rom.write_bytes(0x49F35, [0x22, 0x00, 0xA5, 0x07, ]) - rom.write_bytes(0x3A500, [0xAA, # TAX - 0xAD, 0xD3, 0x53, # LDA $53D3 - 0x3A, # DEC - 0x8D, 0xC3, 0x5A, # STA $5AC3 - 0x6B, # RTL - ]) - - # display received items in pause menu - rom.write_bytes(0x8406, [0x50, 0xA5, 0x07]) - rom.write_bytes(0x3A550, [0x22, 0x9F, 0xD2, 0x00, # JSL $00D29F - 0xDA, # PHX - 0x5A, # PHY - 0xA9, 0x00, 0x33, # LDA #$3300 - 0x8F, 0x16, 0x21, 0x00, # STA VMADDL - 0xA9, 0x07, 0x00, # LDA #$0007 - 0x8F, 0x04, 0x43, 0x00, # STA A1B0 - 0xA9, 0x00, 0xF0, # LDA #$F000 - 0x8F, 0x02, 0x43, 0x00, # STA A1T0L - 0xA9, 0xC0, 0x01, # LDA #$01C0 - 0x8F, 0x05, 0x43, 0x00, # STA DAS0L - 0xE2, 0x20, # SEP #$20 - 0xA9, 0x01, # LDA #$01 - 0x8F, 0x00, 0x43, 0x00, # STA DMAP0 - 0xA9, 0x18, # LDA #$18 - 0x8F, 0x01, 0x43, 0x00, # STA BBAD0 - 0xA9, 0x01, # LDA #$01 - 0x8F, 0x0B, 0x42, 0x00, # MDMAEN - 0xC2, 0x20, # REP #$20 - 0xA0, 0x00, 0x00, # LDY #$0000 - 0xC8, # INY - loop head - 0xC0, 0x09, 0x00, # CPY #$0009 - 0x10, 0x1B, # BPL $07A5AC - 0x98, # TYA - 0x0A, # ASL - 0xAA, # TAX - 0xBD, 0x20, 0x80, # LDA $8020, X - 0xF0, 0xF2, # BEQ $07A58B - return to loop head - 0x98, # TYA - 0x18, # CLC - 0x69, 0xE2, 0x31, # ADC #$31E2 - 0x8F, 0x16, 0x21, 0x00, # STA VMADDL - 0xBF, 0x20, 0xE0, 0x07, # LDA $07E020, X - 0x8F, 0x18, 0x21, 0x00, # STA VMDATAL - 0x80, 0xDF, # BRA $07A58B - return to loop head - 0xA0, 0xFF, 0xFF, # LDY #$FFFF - 0xC8, # INY - loop head - 0xC0, 0x07, 0x00, # CPY #$0007 - 0x10, 0x1B, # BPL $07A5D0 - 0x98, # TYA - 0x0A, # ASL - 0xAA, # TAX - 0xBD, 0x00, 0x80, # LDA $8000, X - 0xF0, 0xF2, # BEQ $07A5AF - return to loop head - 0x98, # TYA - 0x18, # CLC - 0x69, 0x03, 0x32, # ADC #$3203 - 0x8F, 0x16, 0x21, 0x00, # STA VMADDL - 0xBF, 0x40, 0xE0, 0x07, # LDA $07E040, X - 0x8F, 0x18, 0x21, 0x00, # STA VMDATAL - 0x80, 0xDF, # BRA $07A5AF - return to loop head - 0x7A, # PLY - 0xFA, # PLX - 0x6B, # RTL - ]) - - # data writing for prior - rom.write_bytes(0x3E020, - [0x00, 0x0C, 0x30, 0x09, 0x31, 0x09, 0x32, 0x09, 0x33, 0x09, 0x34, 0x09, 0x35, 0x09, 0x36, 0x09, - 0x37, 0x09, - ]) - rom.write_bytes(0x3E040, [0x38, 0x05, 0x39, 0x05, 0x3A, 0x01, 0x3B, 0x05, 0x3C, 0x05, 0x3D, 0x05, ]) + rom.apply_patch(get_data(__name__, os.path.join("data", "kdl3_basepatch.bsdiff4"))) tiles = get_data(__name__, os.path.join("data", "APPauseIcons.dat")) rom.write_bytes(0x3F000, tiles) - # base patch done, write relevant slot info - - # Write strict bosses patch - if world.options.strict_bosses: - rom.write_bytes(0x3A000, [0xDA, # PHX - 0xAD, 0xCB, 0x53, # LDA $53CB - unlocked level - 0xC9, 0x05, 0x00, # CMP #$0005 - have we unlocked level 5? - 0xB0, 0x15, # BCS $07A01E - we don't need to do anything if so - 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, # NOP x5, unsure when these got here - 0xAE, 0xCB, 0x53, # LDX $53CB - 0xCA, # DEX - 0x8A, # TXA - 0x0A, # ASL - 0xAA, # TAX - 0xAD, 0x70, 0x80, # LDA $8070 - current heart stars - 0xDF, 0x00, 0xD0, 0x07, # CMP $07D000, X - do we have enough HS to purify? - 0xB0, 0x03, # BCS $07A021 - branch if we do not - 0x38, # SEC - 0x80, 0x01, # BRA $07A022 - 0x18, # CLC - 0xFA, # PLX - 0xAD, 0xCD, 0x53, # LDA $53CD - 0x6B, # RTL - ]) - rom.write_bytes(0x143D9, [0x22, 0x00, 0xA0, 0x07, 0xEA, 0xEA, ]) - # Write open world patch if world.options.open_world: - rom.write_bytes(0x14238, [0xA9, 0x06, 0x00, # LDA #$0006 - 0x22, 0x80, 0x9A, 0x07, # JSL $079A80 - 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) # set starting stages to 6 - rom.write_bytes(0x39A80, [0x8D, 0xC1, 0x5A, # STA $5AC1 (cutscene) - 0x8D, 0xCD, 0x53, # STA $53CD (unlocked stages) - 0x1A, # INC - 0x8D, 0xB9, 0x5A, # STA $5AB9 (currently selectable stages) - 0xA9, 0x01, 0x00, # LDA #$0001 - 0x8D, 0x9D, 0x5A, # STA $5A9D - 0x8D, 0x9F, 0x5A, # STA $5A9F - 0x8D, 0xA1, 0x5A, # STA $5AA1 - 0x8D, 0xA3, 0x5A, # STA $5AA3 - 0x8D, 0xA5, 0x5A, # STA $5AA5 - 0x6B, # RTL - ]) rom.write_bytes(0x143C7, [0xAD, 0xC1, 0x5A, 0xCD, 0xC1, 0x5A, ]) # changes the stage flag function to compare $5AC1 to $5AC1, # always running the "new stage" function # This has further checks present for bosses already, so we just # need to handle regular stages # write check for boss to be unlocked - rom.write_bytes(0x3A100, [0xDA, # PHX - 0x5A, # PHY - 0xAD, 0xCD, 0x53, # LDA $53CD - 0xC9, 0x06, 0x00, # CMP #$0006 - 0xD0, 0x50, # BNE $07A15A - return if we aren't on stage 6 - 0xAD, 0xCF, 0x53, # LDA $53CF - 0x1A, # INC - 0xCD, 0xCB, 0x53, # CMP $53CB - are we on the most unlocked level? - 0xD0, 0x47, # BNE $07A15A - return if we aren't - 0xA9, 0x00, 0x00, # LDA #$0000 - 0xAE, 0xCF, 0x53, # LDX $53CF - 0xE0, 0x00, 0x00, # CPX #$0000 - 0xF0, 0x06, # BEQ $07A124 - 0x69, 0x06, 0x00, # ADC #$0006 - 0xCA, # DEX - 0x80, 0xF5, # BRA $07A119 - return to loop head - 0x0A, # ASL - 0xAA, # TAX - 0xA9, 0x00, 0x00, # LDA #$0000 - 0xA0, 0x06, 0x00, # LDX #$0006 - 0x5A, # PHY - 0xDA, # PHX - 0xFA, # PLX - 0xBC, 0x20, 0x90, # LDY $9020, X - get stage id - 0x88, # DEY - 0xE8, # INX - 0xE8, # INX - 0x48, # PHA - 0x98, # TYA - 0x0A, # ASL - 0xA8, # TAY - 0x68, # PLA - 0x79, 0x00, 0x82, # ADC $8200, Y - add current stage value to total - 0x7A, # PLY - 0x88, # DEY - 0x5A, # PHY - 0xDA, # PHX - 0xC0, 0x00, 0x00, # CPY #$0000 - 0xD0, 0xE8, # BNE $07A12E - return to loop head - 0xFA, # PLX - 0x7A, # PLY - 0x38, # SEC - 0xED, 0x16, 0x90, # SBC $9016 - 0x90, 0x0C, # BCC $07A12E - 0xAD, 0xCD, 0x53, # LDA $53CD - 0x1A, # INC - 0x8D, 0xCD, 0x53, # STA $53CD - 0x8D, 0xC1, 0x5A, # STA $5AC1 - 0x80, 0x03, # BRA 07A15D - 0x9C, 0xC1, 0x5A, # STZ $5AC1 - 0x7A, # PLY - 0xFA, # PLX - 0x6B, # RTL - ]) - # write hook to boss check - rom.write_bytes(0x143F0, [0x22, 0x00, 0xA1, 0x07, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, ]) - - # Write checks for consumable-sanity - if world.options.consumables: - # Redirect Consumable Effect and write index - rom.write_bytes(0x3001E, [0x22, 0x80, 0x9E, 0x07, 0x4A, 0xC9, 0x05, 0x00, 0xB0, 0xFE, 0x0A, 0xAA, 0x7C, 0x2D, - 0x00, 0x37, 0x00, 0x37, 0x00, 0x7E, 0x00, 0x94, 0x00, 0x37, 0x00, 0xA9, 0x26, 0x00, - 0x22, 0x27, 0xD9, 0x00, 0xA4, 0xD2, 0x6B, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, - 0xEA, 0xEA, 0xEA, ]) - # JSL first, then edit the following sections to point 1-ups and heart stars to the same function, function just - # calls sound effect playing and prepares for the next function - - # Write Consumable Index to index array - rom.write_bytes(0x39E80, [0x48, # PHA - 0xDA, # PHX - 0x5A, # PHY - 0x29, 0xFF, 0x00, # AND #$00FF - 0x48, # PHA - 0xAE, 0xCF, 0x53, # LDX $53CF - 0xAC, 0xD3, 0x53, # LDY $53D3 - 0xA9, 0x00, 0x00, # LDA #$0000 - 0x88, # DEY - 0xE0, 0x00, 0x00, # CPX #$0000 - 0xF0, 0x07, # BEQ $079E9D - 0x18, # CLC - 0x69, 0x07, 0x00, # ADC #$0007 - 0xCA, # DEX - 0x80, 0xF4, # BRA $079E91 - return to loop head - 0xC0, 0x00, 0x00, # CPY #$0000 - 0xF0, 0x04, # BEQ $079EA6 - 0x1A, # INC - 0x88, # DEY - 0x80, 0xF7, # BRA $079E9D - return to loop head - 0x0A, # ASL - 0xAA, # TAX - 0xBF, 0x20, 0xD0, 0x07, # LDA $07D020, X - current stage - 0x3A, # DEC - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, # ASL x6 - 0xAA, # TAX - 0x68, # PLA - 0xC9, 0x00, 0x00, # CMP #$0000 - 0xF0, 0x04, # BEQ $079EBE - 0xE8, # INX - 0x3A, # DEC - 0x80, 0xF7, # BRA $079EB5 - return to loop head - 0xBD, 0x00, 0xA0, # LDA $A000, X - consumables index - 0x09, 0x01, 0x00, # ORA #$0001 - 0x9D, 0x00, 0xA0, # STA $A000, X - 0x7A, # PLY - 0xFA, # PLX - 0x68, # PLA - 0xEB, # XBA - 0x29, 0xFF, 0x00, # AND #$00FF - 0x6B, # RTL - ]) - - if world.options.starsanity: - rom.write_bytes(0x3A600, [0x48, # PHA - 0xDA, # PHX - 0x5A, # PHY - 0x29, 0xFF, 0x00, # AND #$00FF - 0x48, # PHA - 0xAE, 0xCF, 0x53, # LDX $53CF - 0xAC, 0xD3, 0x53, # LDY $53D3 - 0xA9, 0x00, 0x00, # LDA #$0000 - 0x88, # DEY - 0xE0, 0x00, 0x00, # CPX #$0000 - 0xF0, 0x07, # BEQ $07A61D - 0x18, # CLC - 0x69, 0x07, 0x00, # ADC #$0007 - 0xCA, # DEX - 0x80, 0xF4, # BRA $07A611 - 0xC0, 0x00, 0x00, # CPY #$0000 - 0xF0, 0x04, # BEQ $07A626 - 0x1A, # INC - 0x88, # DEY - 0x80, 0xF7, # BRA $07A61D - 0x0A, # ASL - 0xAA, # TAX - 0xBF, 0x20, 0xD0, 0x07, # LDA $07D020, X - 0x3A, # DEC - 0x0A, # ASL - 0x0A, # ASL - 0x0A, # ASL - 0x0A, # ASL - 0x0A, # ASL - 0x0A, # ASL - 0xAA, # TAX - 0x68, # PLA - 0xC9, 0x00, 0x00, # CMP #$0000 - 0xF0, 0x04, # BEQ $07A63E - 0xE8, # INX - 0x3A, # DEC - 0x80, 0xF7, # BRA $07A635 - 0xBD, 0x00, 0xB0, # LDA $B000, X - 0x09, 0x01, 0x00, # ORA #$0001 - 0x9D, 0x00, 0xB0, # STA $B000, X - 0x7A, # PLY - 0xFA, # PLX - 0x68, # PLA - 0xEB, # XBA - 0x29, 0xFF, 0x00, # AND #$00FF - 0x6B, # RET - ]) - - rom.write_bytes(0xA23EB, [ - 0xB9, 0xA2, 0x07, # LDA $07A2, Y - 0x22, 0x00, 0xA6, 0x07, # JSL $07A600 - 0xEA, 0xEA, 0xEA, # NOP, NOP, NOP - ]) rooms = world.rooms if world.options.music_shuffle > 0: diff --git a/worlds/kdl3/data/kdl3_basepatch.bsdiff4 b/worlds/kdl3/data/kdl3_basepatch.bsdiff4 new file mode 100644 index 0000000000000000000000000000000000000000..dd2299d7b5ab7cbef3dc32c3c5125d1c76a34a40 GIT binary patch literal 2305 zcmYM!dpy(o9|!R7d}l_DjTwDYZE{(Z&=95HcN=pZ)6AhHG_?_@ql;R~bWDh1E)S7x z#%w9XQo0Hyol~1j7oE;Yr<-(FE~(9Lo!{^AIPX6`kN5lWd3-*P_v@c0jqMl2U{G9d z0spHpdB;CZ-FV;tBqW?z2h13*UB+=1ENE%ni$157m`+5sq_HwYj_B8-p# zRx%$jAOZzA%Ce3EUx#DMWK?;P{+BP*1~*0_lY%IWp6$x4KjK`)-l?j+siqNRW(Z&%pK{pJwXmMn)Ol%|IN`k zaKsG&jI!qDbWgrbPS1UQGnaNPeSg$h-PCl;pdd{zft*G%=LwY z12P8~<4ck=DH=C-42lWd5}cG*(|8ad5b}7MTac&J!WL*03mnDV$#6e2@&fn8av?~E zQ9@oX04#vqDG&uAqr?1hE@B)21LTrl8F0U3ei6h2hK!4QDFYG>fGV=a$zcpg9D?0Z zxk62UF+v6dd||;7&4sc)1(eyE_1%7Xy*juK$L5! zE%q?E-yr|6kmDaENV4D5ay@i;M~d(46=Yr0m38T=sjK+LL&y6@@oMfREBg z>evDFNy4*@d;2UHL*0{qOkItMu~?gGar4U{J5C+F+3CDoG1h#_@-jXBKR<6Yim|1C z_TTf~WwL(cYN9uJ-E7-vAnl=L*Rz&KiPZ^EuouOm)4$MDv*rkIF_E-+Q4r*Ix!?SwY6G2+MMK4Yr3_v1t%}N`)!0tshSk64Z-IYO3l1CqF zw#KjeYPPbt)Q(Wt*Hf7BOWnDXL|0{fa`$Yro$F>M;%IZue%vHe391|SYcF?{47saj zQ&enw2y10HaSpN%TuOG+UJ(XS-4o|U5qQay$G?WknY&l1npth_iSrH|uzFJztgU0) zd@NnN@g@{kc+X~5CmL4Yb~=EuNeWDPefROF;DM18As_ntOk`6(w2RWRFQbFWs~>c$ z#iHLA{$iY35Rbn6%yrPf+BCP4;^F;mGQsm*kh_{3qJc1bmJIGg`9VF;oG+|FSt#>O zHiji<9zEo?VM|L+5}82hp7%@S2s@#s`c$j|Os!uK@&HJc_%p;4vpb&!$~dH#-}})% z<;fm*->=9r;sg)%vJS7V8KJL6;yMknMwP9R?6ISDr|)RoJOZ+I#TM>A)hX7cUo8*0 zl$3dnZ48!NZ(gU{_0{_&;$ees@nzaF>m?U|yIQ#+=x=VxGJ{2 zdSCS338%jp+ry}$D#2r%EV5jI8moxN z119?<*KRy63B%jD>`MF{{@1yZG14&rftZ_{yPWYk>($&`v?kD9JO=L`5Cm*{Jl7?k z5j@&0b@{AC>YX{!PD~w^CbwWgo_IeQcNkw z1>9t=S;RQ%b|Q}lGWD1$0G^%|9st5xmaS5k4arj3!zhN(7p8#Jaqd6NVB7(X9!roJ zNW-8=5=j5#ho(R7^prvr9_13uGDi(){3Eev@68kERb8LnkbRKgWcUZ;PUA3=Sh5ID z<~MzLd>s5P25`G;YpdFyCQ zh|;!qescu7cSp78xn+k-d7TGOz+b5$=@YQ)#(rZ(Z*@F{3vp2h!AN0R| zl8pcjf!8c6pn*j;G-8+0=09H1M$B8(TKt>SRYYx{`M$W3`a{vjYt#^{qFa0I$;&ub zL2>&!jbyFmzO)4o0`IIKj?kWT@-`3iZs9C8ARUEpXhBp;Zhj?=>U<6(*aB`)$LE<6 YuKBfUMA5^gI+y1KJEWwg8v5e@0t%ni!T Date: Sun, 11 Feb 2024 00:50:25 -0600 Subject: [PATCH 147/165] fix basepatch, add gifting patch --- worlds/kdl3/data/kdl3_basepatch.bsdiff4 | Bin 2305 -> 2389 bytes worlds/kdl3/src/kdl3_basepatch.asm | 181 +++++++++++++++--------- 2 files changed, 118 insertions(+), 63 deletions(-) diff --git a/worlds/kdl3/data/kdl3_basepatch.bsdiff4 b/worlds/kdl3/data/kdl3_basepatch.bsdiff4 index dd2299d7b5ab7cbef3dc32c3c5125d1c76a34a40..332f4063b789f319b79b4f3f38dc7ef33ddfdce4 100644 GIT binary patch literal 2389 zcmYM0dsNZ~AI5(mA{Z#e_m@z@x5Ex1X0}@eS z43KO+N`cB-?EgH- zoV9(tJpM&PEVb_jIgefrC_rrcLNF!77H0xj4G;CG*iVXhK`VBE0c@XGmD%jFc49tD zI(cR^=pDH+BA;>;rw1g7e@u7P`>w&6Slq7J*mBx;7qjH^-T$U=yBWI-0Pu~^n%tP% zc>5`j{Pj09_x0DQ9V>5F8{e(1%b%uxtXFA80*k6^C#S}7M)eDE1k*u%wuXC^PQb

?sb^#LtcX!;!^o=HN!`< z9Bkvi^U?w!Rtmf#o=e3LCIC8ntFXJ;rUcr)P|!<1^KNrc>zfl-kP%~7Ed z89o>^5)I%Gg#Zpv;?Ud@fCGRs)jo6~lmzy*W%DG3X#4<&0|2}=g4M)-wbB;%0thJUwqMDbzT z;TOTlqRk{A>2QLCp~%SkRoA{T;-&Zo3Pu7<`T~yka`}dgJd*G-^{_Al0hyFX#-Hg5 zve2s^dGmS=r4I0NH27+n!2Ef>k4=5s?A)wOJrcpeq#JXr zfX?lJt!-&-k%{wK?pi<)??HT>D7Q2;#TIVqqMyN26r0h(wUj%iOA;xOBH~gQzJv9rwE4Lstg_W7lr|Ws_RzN-Yk( zIC0|Yl81q=3jG>T%Kdh98?b*1RGn8wNAz?#-7_ZcWI9;0I3P34ocb*Vu_=X-xsV6D z(?_i{%othBZkNiM>WqLsy+~Q_8crtix~#h&m}9t;xj@zc-x6?zQ!zf3vjcF)`k z@r|^f($d@>_UE%iD3?`Clo9h`w7oMwybGb13T#tOdFcyE+$O5RO}D7vSko-=wKweQ z!N(PQ#{`0yiM@`EoR)%`i08BB7^PM|=BGy3nWb>#t|vioJ$C5TuR79xw`HEt3JH~a zC=c36zlLCnc{K691nVc|BPDemwz7FwtZS$!wZ=@mpY!Gzzh@3oO37ADf4F|Ej#stD zQ1u^|z^5ey=$B?XLNWht>H@6by=&LQErscF)%`Cl7dY}G-9mp9psim|uD0X4?wx}Rh>oQb!6fQS4XU_^kVZ6 zP01Qc?!VmN5Y<_GpCDm|w!jDFQTqX2nO+IAx9)6e<%AKqwS8-gm0w5stuU^1@aC_F z5Z|)A!oO7h22a5SXeU$QNsC2st5qTKJvF3=dzw8}a+;^t2JLrXJeSe6+gZ-gqS?8Y*L9+u#r8;fa2&#~N?Tu5WGkWlESigh&r240bwx;NaXSb2Mf;)@RR< z5v`7w-r}R&IZev&zco`eAemz++Xr;a{#;SZ8Vt*J)YLb4xV9%L{R>FxUo3@3r^R~@ zpIPCCnc~m({f_DFLQ^*-PKcX+pE*Xcfp6756lqtses^OOT}B3xVRY|eA{IB+o_%p^il5-%CTb|;NiSo zkUbXs2g5c!@T{S-i9fWSU�{mSk+Umx!SZS?ij8u(Pb{{PO#%wH_;k)9ppakNfJ! zz0XrTe-YcH;?vZEk)%E33ayFWA!GL}lB{mQO!)FuA-ub@bG9eD)vL#!6F%&CGkfcc zxBz!}U)YtZN~9sn$R>+uEM6}}>^<2W(73dB;CZ-FV;tBqW?z2h13*UB+=1ENE%ni$157m`+5sq_HwYj_B8-p# zRx%$jAOZzA%Ce3EUx#DMWK?;P{+BP*1~*0_lY%IWp6$x4KjK`)-l?j+siqNRW(Z&%pK{pJwXmMn)Ol%|IN`k zaKsG&jI!qDbWgrbPS1UQGnaNPeSg$h-PCl;pdd{zft*G%=LwY z12P8~<4ck=DH=C-42lWd5}cG*(|8ad5b}7MTac&J!WL*03mnDV$#6e2@&fn8av?~E zQ9@oX04#vqDG&uAqr?1hE@B)21LTrl8F0U3ei6h2hK!4QDFYG>fGV=a$zcpg9D?0Z zxk62UF+v6dd||;7&4sc)1(eyE_1%7Xy*juK$L5! zE%q?E-yr|6kmDaENV4D5ay@i;M~d(46=Yr0m38T=sjK+LL&y6@@oMfREBg z>evDFNy4*@d;2UHL*0{qOkItMu~?gGar4U{J5C+F+3CDoG1h#_@-jXBKR<6Yim|1C z_TTf~WwL(cYN9uJ-E7-vAnl=L*Rz&KiPZ^EuouOm)4$MDv*rkIF_E-+Q4r*Ix!?SwY6G2+MMK4Yr3_v1t%}N`)!0tshSk64Z-IYO3l1CqF zw#KjeYPPbt)Q(Wt*Hf7BOWnDXL|0{fa`$Yro$F>M;%IZue%vHe391|SYcF?{47saj zQ&enw2y10HaSpN%TuOG+UJ(XS-4o|U5qQay$G?WknY&l1npth_iSrH|uzFJztgU0) zd@NnN@g@{kc+X~5CmL4Yb~=EuNeWDPefROF;DM18As_ntOk`6(w2RWRFQbFWs~>c$ z#iHLA{$iY35Rbn6%yrPf+BCP4;^F;mGQsm*kh_{3qJc1bmJIGg`9VF;oG+|FSt#>O zHiji<9zEo?VM|L+5}82hp7%@S2s@#s`c$j|Os!uK@&HJc_%p;4vpb&!$~dH#-}})% z<;fm*->=9r;sg)%vJS7V8KJL6;yMknMwP9R?6ISDr|)RoJOZ+I#TM>A)hX7cUo8*0 zl$3dnZ48!NZ(gU{_0{_&;$ees@nzaF>m?U|yIQ#+=x=VxGJ{2 zdSCS338%jp+ry}$D#2r%EV5jI8moxN z119?<*KRy63B%jD>`MF{{@1yZG14&rftZ_{yPWYk>($&`v?kD9JO=L`5Cm*{Jl7?k z5j@&0b@{AC>YX{!PD~w^CbwWgo_IeQcNkw z1>9t=S;RQ%b|Q}lGWD1$0G^%|9st5xmaS5k4arj3!zhN(7p8#Jaqd6NVB7(X9!roJ zNW-8=5=j5#ho(R7^prvr9_13uGDi(){3Eev@68kERb8LnkbRKgWcUZ;PUA3=Sh5ID z<~MzLd>s5P25`G;YpdFyCQ zh|;!qescu7cSp78xn+k-d7TGOz+b5$=@YQ)#(rZ(Z*@F{3vp2h!AN0R| zl8pcjf!8c6pn*j;G-8+0=09H1M$B8(TKt>SRYYx{`M$W3`a{vjYt#^{qFa0I$;&ub zL2>&!jbyFmzO)4o0`IIKj?kWT@-`3iZs9C8ARUEpXhBp;Zhj?=>U<6(*aB`)$LE<6 YuKBfUMA5^gI+y1KJEWwg8v5e@0t%ni!T Date: Sun, 11 Feb 2024 22:27:14 -0600 Subject: [PATCH 148/165] client refactor, attempt gooey fix --- worlds/kdl3/Client.py | 1277 +---------------------- worlds/kdl3/ClientAddrs.py | 816 +++++++++++++++ worlds/kdl3/Gifting.py | 296 ++++++ worlds/kdl3/Options.py | 1 + worlds/kdl3/Rom.py | 3 +- worlds/kdl3/data/kdl3_basepatch.bsdiff4 | Bin 2389 -> 2366 bytes worlds/kdl3/src/kdl3_basepatch.asm | 6 +- 7 files changed, 1173 insertions(+), 1226 deletions(-) create mode 100644 worlds/kdl3/ClientAddrs.py create mode 100644 worlds/kdl3/Gifting.py diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 1e1fd740545c..5737cca7e204 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -12,6 +12,8 @@ from Utils import async_start from worlds.AutoSNIClient import SNIClient from .Locations import boss_locations +from .Gifting import kdl3_gifting_options, kdl3_trap_gifts, kdl3_gifts, update_object, pop_object, initialize_giftboxes +from .ClientAddrs import consumable_addrs, star_addrs from typing import TYPE_CHECKING if TYPE_CHECKING: @@ -64,823 +66,7 @@ KDL3_COMPLETED_STAGES = SRAM_1_START + 0x8200 KDL3_CONSUMABLES = SRAM_1_START + 0xA000 KDL3_STARS = SRAM_1_START + 0xB000 - -consumable_addrs = { - 0: 14, - 1: 15, - 2: 84, - 3: 138, - 4: 139, - 5: 204, - 6: 214, - 7: 215, - 8: 224, - 9: 330, - 10: 353, - 11: 458, - 12: 459, - 13: 522, - 14: 525, - 15: 605, - 16: 606, - 17: 630, - 18: 671, - 19: 672, - 20: 693, - 21: 791, - 22: 851, - 23: 883, - 24: 971, - 25: 985, - 26: 986, - 27: 1024, - 28: 1035, - 29: 1036, - 30: 1038, - 31: 1039, - 32: 1170, - 33: 1171, - 34: 1377, - 35: 1378, - 36: 1413, - 37: 1494, - 38: 1666, - 39: 1808, - 40: 1809, - 41: 1816, - 42: 1856, - 43: 1857, -} - -star_addrs = { - 0x770401: 0, - 0x770402: 1, - 0x770403: 2, - 0x770404: 3, - 0x770405: 4, - 0x770406: 5, - 0x770407: 7, - 0x770408: 8, - 0x770409: 9, - 0x77040a: 10, - 0x77040b: 11, - 0x77040c: 12, - 0x77040d: 13, - 0x77040e: 16, - 0x77040f: 17, - 0x770410: 19, - 0x770411: 20, - 0x770412: 21, - 0x770413: 22, - 0x770414: 23, - 0x770415: 24, - 0x770416: 25, - 0x770417: 26, - 0x770418: 65, - 0x770419: 66, - 0x77041a: 67, - 0x77041b: 68, - 0x77041c: 69, - 0x77041d: 70, - 0x77041e: 71, - 0x77041f: 72, - 0x770420: 73, - 0x770421: 74, - 0x770422: 76, - 0x770423: 77, - 0x770424: 78, - 0x770425: 79, - 0x770426: 80, - 0x770427: 81, - 0x770428: 82, - 0x770429: 83, - 0x77042a: 85, - 0x77042b: 86, - 0x77042c: 87, - 0x77042d: 128, - 0x77042e: 129, - 0x77042f: 130, - 0x770430: 131, - 0x770431: 132, - 0x770432: 133, - 0x770433: 134, - 0x770434: 135, - 0x770435: 136, - 0x770436: 137, - 0x770437: 140, - 0x770438: 141, - 0x770439: 142, - 0x77043a: 143, - 0x77043b: 144, - 0x77043c: 145, - 0x77043d: 146, - 0x77043e: 147, - 0x77043f: 148, - 0x770440: 149, - 0x770441: 150, - 0x770442: 151, - 0x770443: 152, - 0x770444: 153, - 0x770445: 154, - 0x770446: 155, - 0x770447: 156, - 0x770448: 157, - 0x770449: 158, - 0x77044a: 159, - 0x77044b: 160, - 0x77044c: 192, - 0x77044d: 193, - 0x77044e: 194, - 0x77044f: 195, - 0x770450: 197, - 0x770451: 198, - 0x770452: 199, - 0x770453: 200, - 0x770454: 201, - 0x770455: 203, - 0x770456: 205, - 0x770457: 206, - 0x770458: 207, - 0x770459: 208, - 0x77045a: 209, - 0x77045b: 210, - 0x77045c: 211, - 0x77045d: 212, - 0x77045e: 213, - 0x77045f: 216, - 0x770460: 217, - 0x770461: 218, - 0x770462: 219, - 0x770463: 220, - 0x770464: 221, - 0x770465: 222, - 0x770466: 225, - 0x770467: 227, - 0x770468: 228, - 0x770469: 229, - 0x77046a: 230, - 0x77046b: 231, - 0x77046c: 232, - 0x77046d: 233, - 0x77046e: 234, - 0x77046f: 235, - 0x770470: 236, - 0x770471: 257, - 0x770472: 258, - 0x770473: 259, - 0x770474: 260, - 0x770475: 261, - 0x770476: 262, - 0x770477: 263, - 0x770478: 264, - 0x770479: 265, - 0x77047a: 266, - 0x77047b: 267, - 0x77047c: 268, - 0x77047d: 270, - 0x77047e: 271, - 0x77047f: 272, - 0x770480: 273, - 0x770481: 275, - 0x770482: 276, - 0x770483: 277, - 0x770484: 278, - 0x770485: 279, - 0x770486: 280, - 0x770487: 281, - 0x770488: 282, - 0x770489: 283, - 0x77048a: 284, - 0x77048b: 285, - 0x77048c: 286, - 0x77048d: 287, - 0x77048e: 321, - 0x77048f: 322, - 0x770490: 323, - 0x770491: 324, - 0x770492: 325, - 0x770493: 326, - 0x770494: 327, - 0x770495: 328, - 0x770496: 329, - 0x770497: 332, - 0x770498: 334, - 0x770499: 335, - 0x77049a: 336, - 0x77049b: 337, - 0x77049c: 340, - 0x77049d: 341, - 0x77049e: 342, - 0x77049f: 343, - 0x7704a0: 345, - 0x7704a1: 346, - 0x7704a2: 347, - 0x7704a3: 348, - 0x7704a4: 349, - 0x7704a5: 350, - 0x7704a6: 351, - 0x7704a7: 354, - 0x7704a8: 355, - 0x7704a9: 356, - 0x7704aa: 357, - 0x7704ab: 384, - 0x7704ac: 385, - 0x7704ad: 386, - 0x7704ae: 387, - 0x7704af: 388, - 0x7704b0: 389, - 0x7704b1: 391, - 0x7704b2: 392, - 0x7704b3: 393, - 0x7704b4: 394, - 0x7704b5: 396, - 0x7704b6: 397, - 0x7704b7: 398, - 0x7704b8: 399, - 0x7704b9: 400, - 0x7704ba: 401, - 0x7704bb: 402, - 0x7704bc: 403, - 0x7704bd: 404, - 0x7704be: 449, - 0x7704bf: 450, - 0x7704c0: 451, - 0x7704c1: 453, - 0x7704c2: 454, - 0x7704c3: 455, - 0x7704c4: 456, - 0x7704c5: 457, - 0x7704c6: 460, - 0x7704c7: 461, - 0x7704c8: 462, - 0x7704c9: 463, - 0x7704ca: 464, - 0x7704cb: 465, - 0x7704cc: 466, - 0x7704cd: 467, - 0x7704ce: 468, - 0x7704cf: 513, - 0x7704d0: 514, - 0x7704d1: 515, - 0x7704d2: 516, - 0x7704d3: 517, - 0x7704d4: 518, - 0x7704d5: 519, - 0x7704d6: 520, - 0x7704d7: 521, - 0x7704d8: 523, - 0x7704d9: 524, - 0x7704da: 527, - 0x7704db: 528, - 0x7704dc: 529, - 0x7704dd: 531, - 0x7704de: 532, - 0x7704df: 533, - 0x7704e0: 534, - 0x7704e1: 535, - 0x7704e2: 536, - 0x7704e3: 537, - 0x7704e4: 576, - 0x7704e5: 577, - 0x7704e6: 578, - 0x7704e7: 579, - 0x7704e8: 580, - 0x7704e9: 582, - 0x7704ea: 583, - 0x7704eb: 584, - 0x7704ec: 585, - 0x7704ed: 586, - 0x7704ee: 587, - 0x7704ef: 588, - 0x7704f0: 589, - 0x7704f1: 590, - 0x7704f2: 591, - 0x7704f3: 592, - 0x7704f4: 593, - 0x7704f5: 594, - 0x7704f6: 595, - 0x7704f7: 596, - 0x7704f8: 597, - 0x7704f9: 598, - 0x7704fa: 599, - 0x7704fb: 600, - 0x7704fc: 601, - 0x7704fd: 602, - 0x7704fe: 603, - 0x7704ff: 604, - 0x770500: 607, - 0x770501: 608, - 0x770502: 609, - 0x770503: 610, - 0x770504: 611, - 0x770505: 612, - 0x770506: 613, - 0x770507: 614, - 0x770508: 615, - 0x770509: 616, - 0x77050a: 617, - 0x77050b: 618, - 0x77050c: 619, - 0x77050d: 620, - 0x77050e: 621, - 0x77050f: 622, - 0x770510: 623, - 0x770511: 624, - 0x770512: 625, - 0x770513: 626, - 0x770514: 627, - 0x770515: 628, - 0x770516: 629, - 0x770517: 640, - 0x770518: 641, - 0x770519: 642, - 0x77051a: 643, - 0x77051b: 644, - 0x77051c: 645, - 0x77051d: 646, - 0x77051e: 647, - 0x77051f: 648, - 0x770520: 649, - 0x770521: 650, - 0x770522: 651, - 0x770523: 652, - 0x770524: 653, - 0x770525: 654, - 0x770526: 655, - 0x770527: 656, - 0x770528: 657, - 0x770529: 658, - 0x77052a: 659, - 0x77052b: 660, - 0x77052c: 661, - 0x77052d: 662, - 0x77052e: 663, - 0x77052f: 664, - 0x770530: 665, - 0x770531: 666, - 0x770532: 667, - 0x770533: 668, - 0x770534: 669, - 0x770535: 670, - 0x770536: 674, - 0x770537: 675, - 0x770538: 676, - 0x770539: 677, - 0x77053a: 678, - 0x77053b: 679, - 0x77053c: 680, - 0x77053d: 681, - 0x77053e: 682, - 0x77053f: 683, - 0x770540: 684, - 0x770541: 686, - 0x770542: 687, - 0x770543: 688, - 0x770544: 689, - 0x770545: 690, - 0x770546: 691, - 0x770547: 692, - 0x770548: 694, - 0x770549: 695, - 0x77054a: 704, - 0x77054b: 705, - 0x77054c: 706, - 0x77054d: 707, - 0x77054e: 708, - 0x77054f: 709, - 0x770550: 710, - 0x770551: 711, - 0x770552: 712, - 0x770553: 713, - 0x770554: 714, - 0x770555: 715, - 0x770556: 716, - 0x770557: 717, - 0x770558: 718, - 0x770559: 719, - 0x77055a: 720, - 0x77055b: 721, - 0x77055c: 722, - 0x77055d: 723, - 0x77055e: 724, - 0x77055f: 725, - 0x770560: 726, - 0x770561: 769, - 0x770562: 770, - 0x770563: 771, - 0x770564: 772, - 0x770565: 773, - 0x770566: 774, - 0x770567: 775, - 0x770568: 776, - 0x770569: 777, - 0x77056a: 778, - 0x77056b: 779, - 0x77056c: 780, - 0x77056d: 781, - 0x77056e: 782, - 0x77056f: 783, - 0x770570: 784, - 0x770571: 785, - 0x770572: 786, - 0x770573: 787, - 0x770574: 788, - 0x770575: 789, - 0x770576: 790, - 0x770577: 832, - 0x770578: 833, - 0x770579: 834, - 0x77057a: 835, - 0x77057b: 836, - 0x77057c: 837, - 0x77057d: 838, - 0x77057e: 839, - 0x77057f: 840, - 0x770580: 841, - 0x770581: 842, - 0x770582: 843, - 0x770583: 844, - 0x770584: 845, - 0x770585: 846, - 0x770586: 847, - 0x770587: 848, - 0x770588: 849, - 0x770589: 850, - 0x77058a: 854, - 0x77058b: 855, - 0x77058c: 856, - 0x77058d: 857, - 0x77058e: 858, - 0x77058f: 859, - 0x770590: 860, - 0x770591: 861, - 0x770592: 862, - 0x770593: 863, - 0x770594: 864, - 0x770595: 865, - 0x770596: 866, - 0x770597: 867, - 0x770598: 868, - 0x770599: 869, - 0x77059a: 870, - 0x77059b: 871, - 0x77059c: 872, - 0x77059d: 873, - 0x77059e: 874, - 0x77059f: 875, - 0x7705a0: 876, - 0x7705a1: 877, - 0x7705a2: 878, - 0x7705a3: 879, - 0x7705a4: 880, - 0x7705a5: 881, - 0x7705a6: 882, - 0x7705a7: 896, - 0x7705a8: 897, - 0x7705a9: 898, - 0x7705aa: 899, - 0x7705ab: 900, - 0x7705ac: 901, - 0x7705ad: 902, - 0x7705ae: 903, - 0x7705af: 904, - 0x7705b0: 905, - 0x7705b1: 960, - 0x7705b2: 961, - 0x7705b3: 962, - 0x7705b4: 963, - 0x7705b5: 964, - 0x7705b6: 965, - 0x7705b7: 966, - 0x7705b8: 967, - 0x7705b9: 968, - 0x7705ba: 969, - 0x7705bb: 970, - 0x7705bc: 972, - 0x7705bd: 973, - 0x7705be: 974, - 0x7705bf: 975, - 0x7705c0: 977, - 0x7705c1: 978, - 0x7705c2: 979, - 0x7705c3: 980, - 0x7705c4: 981, - 0x7705c5: 982, - 0x7705c6: 983, - 0x7705c7: 984, - 0x7705c8: 1025, - 0x7705c9: 1026, - 0x7705ca: 1027, - 0x7705cb: 1028, - 0x7705cc: 1029, - 0x7705cd: 1030, - 0x7705ce: 1031, - 0x7705cf: 1032, - 0x7705d0: 1033, - 0x7705d1: 1034, - 0x7705d2: 1037, - 0x7705d3: 1040, - 0x7705d4: 1041, - 0x7705d5: 1042, - 0x7705d6: 1043, - 0x7705d7: 1044, - 0x7705d8: 1045, - 0x7705d9: 1046, - 0x7705da: 1049, - 0x7705db: 1050, - 0x7705dc: 1051, - 0x7705dd: 1052, - 0x7705de: 1053, - 0x7705df: 1054, - 0x7705e0: 1055, - 0x7705e1: 1056, - 0x7705e2: 1057, - 0x7705e3: 1058, - 0x7705e4: 1059, - 0x7705e5: 1060, - 0x7705e6: 1061, - 0x7705e7: 1062, - 0x7705e8: 1063, - 0x7705e9: 1064, - 0x7705ea: 1065, - 0x7705eb: 1066, - 0x7705ec: 1067, - 0x7705ed: 1068, - 0x7705ee: 1069, - 0x7705ef: 1070, - 0x7705f0: 1152, - 0x7705f1: 1154, - 0x7705f2: 1155, - 0x7705f3: 1156, - 0x7705f4: 1157, - 0x7705f5: 1158, - 0x7705f6: 1159, - 0x7705f7: 1160, - 0x7705f8: 1161, - 0x7705f9: 1162, - 0x7705fa: 1163, - 0x7705fb: 1164, - 0x7705fc: 1165, - 0x7705fd: 1166, - 0x7705fe: 1167, - 0x7705ff: 1168, - 0x770600: 1169, - 0x770601: 1173, - 0x770602: 1174, - 0x770603: 1175, - 0x770604: 1176, - 0x770605: 1177, - 0x770606: 1178, - 0x770607: 1216, - 0x770608: 1217, - 0x770609: 1218, - 0x77060a: 1219, - 0x77060b: 1220, - 0x77060c: 1221, - 0x77060d: 1222, - 0x77060e: 1223, - 0x77060f: 1224, - 0x770610: 1225, - 0x770611: 1226, - 0x770612: 1227, - 0x770613: 1228, - 0x770614: 1229, - 0x770615: 1230, - 0x770616: 1231, - 0x770617: 1232, - 0x770618: 1233, - 0x770619: 1234, - 0x77061a: 1235, - 0x77061b: 1236, - 0x77061c: 1237, - 0x77061d: 1238, - 0x77061e: 1239, - 0x77061f: 1240, - 0x770620: 1241, - 0x770621: 1242, - 0x770622: 1243, - 0x770623: 1244, - 0x770624: 1245, - 0x770625: 1246, - 0x770626: 1247, - 0x770627: 1248, - 0x770628: 1249, - 0x770629: 1250, - 0x77062a: 1251, - 0x77062b: 1252, - 0x77062c: 1253, - 0x77062d: 1254, - 0x77062e: 1255, - 0x77062f: 1256, - 0x770630: 1257, - 0x770631: 1258, - 0x770632: 1259, - 0x770633: 1260, - 0x770634: 1261, - 0x770635: 1262, - 0x770636: 1263, - 0x770637: 1264, - 0x770638: 1265, - 0x770639: 1266, - 0x77063a: 1267, - 0x77063b: 1268, - 0x77063c: 1269, - 0x77063d: 1280, - 0x77063e: 1281, - 0x77063f: 1282, - 0x770640: 1283, - 0x770641: 1284, - 0x770642: 1285, - 0x770643: 1286, - 0x770644: 1289, - 0x770645: 1290, - 0x770646: 1291, - 0x770647: 1292, - 0x770648: 1293, - 0x770649: 1294, - 0x77064a: 1295, - 0x77064b: 1296, - 0x77064c: 1297, - 0x77064d: 1298, - 0x77064e: 1299, - 0x77064f: 1300, - 0x770650: 1301, - 0x770651: 1302, - 0x770652: 1303, - 0x770653: 1344, - 0x770654: 1345, - 0x770655: 1346, - 0x770656: 1347, - 0x770657: 1348, - 0x770658: 1349, - 0x770659: 1350, - 0x77065a: 1351, - 0x77065b: 1352, - 0x77065c: 1354, - 0x77065d: 1355, - 0x77065e: 1356, - 0x77065f: 1357, - 0x770660: 1358, - 0x770661: 1359, - 0x770662: 1360, - 0x770663: 1361, - 0x770664: 1362, - 0x770665: 1363, - 0x770666: 1365, - 0x770667: 1366, - 0x770668: 1367, - 0x770669: 1368, - 0x77066a: 1369, - 0x77066b: 1370, - 0x77066c: 1371, - 0x77066d: 1372, - 0x77066e: 1374, - 0x77066f: 1375, - 0x770670: 1376, - 0x770671: 1379, - 0x770672: 1380, - 0x770673: 1381, - 0x770674: 1382, - 0x770675: 1383, - 0x770676: 1384, - 0x770677: 1385, - 0x770678: 1386, - 0x770679: 1387, - 0x77067a: 1388, - 0x77067b: 1389, - 0x77067c: 1390, - 0x77067d: 1391, - 0x77067e: 1392, - 0x77067f: 1393, - 0x770680: 1394, - 0x770681: 1395, - 0x770682: 1396, - 0x770683: 1397, - 0x770684: 1398, - 0x770685: 1408, - 0x770686: 1409, - 0x770687: 1410, - 0x770688: 1411, - 0x770689: 1412, - 0x77068a: 1414, - 0x77068b: 1472, - 0x77068c: 1473, - 0x77068d: 1474, - 0x77068e: 1475, - 0x77068f: 1476, - 0x770690: 1477, - 0x770691: 1478, - 0x770692: 1479, - 0x770693: 1480, - 0x770694: 1481, - 0x770695: 1482, - 0x770696: 1483, - 0x770697: 1484, - 0x770698: 1486, - 0x770699: 1487, - 0x77069a: 1488, - 0x77069b: 1489, - 0x77069c: 1490, - 0x77069d: 1491, - 0x77069e: 1495, - 0x77069f: 1496, - 0x7706a0: 1497, - 0x7706a1: 1498, - 0x7706a2: 1499, - 0x7706a3: 1500, - 0x7706a4: 1501, - 0x7706a5: 1502, - 0x7706a6: 1503, - 0x7706a7: 1504, - 0x7706a8: 1505, - 0x7706a9: 1506, - 0x7706aa: 1507, - 0x7706ab: 1508, - 0x7706ac: 1536, - 0x7706ad: 1537, - 0x7706ae: 1538, - 0x7706af: 1539, - 0x7706b0: 1540, - 0x7706b1: 1541, - 0x7706b2: 1600, - 0x7706b3: 1601, - 0x7706b4: 1602, - 0x7706b5: 1603, - 0x7706b6: 1604, - 0x7706b7: 1605, - 0x7706b8: 1606, - 0x7706b9: 1607, - 0x7706ba: 1612, - 0x7706bb: 1613, - 0x7706bc: 1614, - 0x7706bd: 1615, - 0x7706be: 1616, - 0x7706bf: 1617, - 0x7706c0: 1618, - 0x7706c1: 1619, - 0x7706c2: 1620, - 0x7706c3: 1621, - 0x7706c4: 1622, - 0x7706c5: 1664, - 0x7706c6: 1665, - 0x7706c7: 1667, - 0x7706c8: 1668, - 0x7706c9: 1670, - 0x7706ca: 1671, - 0x7706cb: 1672, - 0x7706cc: 1673, - 0x7706cd: 1674, - 0x7706ce: 1675, - 0x7706cf: 1676, - 0x7706d0: 1677, - 0x7706d1: 1678, - 0x7706d2: 1679, - 0x7706d3: 1680, - 0x7706d4: 1681, - 0x7706d5: 1682, - 0x7706d6: 1683, - 0x7706d7: 1684, - 0x7706d8: 1685, - 0x7706d9: 1686, - 0x7706da: 1730, - 0x7706db: 1732, - 0x7706dc: 1734, - 0x7706dd: 1792, - 0x7706de: 1793, - 0x7706df: 1794, - 0x7706e0: 1795, - 0x7706e1: 1796, - 0x7706e2: 1797, - 0x7706e3: 1798, - 0x7706e4: 1799, - 0x7706e5: 1800, - 0x7706e6: 1801, - 0x7706e7: 1802, - 0x7706e8: 1803, - 0x7706e9: 1804, - 0x7706ea: 1805, - 0x7706eb: 1810, - 0x7706ec: 1811, - 0x7706ed: 1812, - 0x7706ee: 1813, - 0x7706ef: 1814, - 0x7706f0: 1815, - 0x7706f1: 1817, - 0x7706f2: 1818, - 0x7706f3: 1819, - 0x7706f4: 1820, - 0x7706f5: 1821, - 0x7706f6: 1822, - 0x7706f7: 1823, - 0x7706f8: 1824, - 0x7706f9: 1825, - 0x7706fa: 1826, - 0x7706fb: 1827, - 0x7706fc: 1828, - 0x7706fd: 1831, - 0x7706fe: 1832, - 0x7706ff: 1858, -} +KDL3_ITEM_QUEUE = SRAM_1_START + 0xC000 deathlink_messages = defaultdict(lambda: " was defeated.", { 0x0200: " was bonked by apples from Whispy Woods.", @@ -890,288 +76,6 @@ 0x0204: " was clobbered by King Dedede.", 0x0205: " lost their battle against Dark Matter." }) -kdl3_gifting_options = { - "AcceptsAnyGift": True, - "DesiredTraits": [ - "Consumable", "Food", "Drink", "Candy", "Tomato", - "Invincible", "Life", "Heal", "Health", "Trap", - "Goo", "Gel", "Slow", "Slowness", "Eject", "Removal" - ] -} - -kdl3_gifts = { - 1: { - "Item": { - "Name": "1-Up", - "Amount": 1, - "Value": 400000 - }, - "Traits": [ - { - "Trait": "Consumable", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Life", - "Quality": 1, - "Duration": 1 - } - ] - }, - 2: { - "Item": { - "Name": "Maxim Tomato", - "Amount": 1, - "Value": 500000 - }, - "Traits": [ - { - "Trait": "Consumable", - "Quality": 5, - "Duration": 1, - }, - { - "Trait": "Heal", - "Quality": 5, - "Duration": 1, - }, - { - "Trait": "Food", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Tomato", - "Quality": 5, - "Duration": 1, - } - ] - }, - 3: { - "Item": { - "Name": "Energy Drink", - "Amount": 1, - "Value": 100000 - }, - "Traits": [ - { - "Trait": "Consumable", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Heal", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Drink", - "Quality": 1, - "Duration": 1, - }, - ] - }, - 5: { - "Item": { - "Name": "Small Star Piece", - "Amount": 1, - "Value": 10000 - }, - "Traits": [ - { - "Trait": "Currency", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Money", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Star", - "Quality": 1, - "Duration": 1 - } - ] - }, - 6: { - "Item": { - "Name": "Medium Star Piece", - "Amount": 1, - "Value": 30000 - }, - "Traits": [ - { - "Trait": "Currency", - "Quality": 3, - "Duration": 1, - }, - { - "Trait": "Money", - "Quality": 3, - "Duration": 1, - }, - { - "Trait": "Star", - "Quality": 3, - "Duration": 1 - } - ] - }, - 7: { - "Item": { - "Name": "Large Star Piece", - "Amount": 1, - "Value": 50000 - }, - "Traits": [ - { - "Trait": "Currency", - "Quality": 5, - "Duration": 1, - }, - { - "Trait": "Money", - "Quality": 5, - "Duration": 1, - }, - { - "Trait": "Star", - "Quality": 5, - "Duration": 1 - } - ] - }, -} - -kdl3_trap_gifts = { - 0: { - "Item": { - "Name": "Gooey Bag", - "Amount": 1, - "Value": 10000 - }, - "Traits": [ - { - "Trait": "Trap", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Goo", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Gel", - "Quality": 1, - "Duration": 1 - } - ] - }, - 1: { - "Item": { - "Name": "Slowness", - "Amount": 1, - "Value": 10000 - }, - "Traits": [ - { - "Trait": "Trap", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Slow", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Slowness", - "Quality": 1, - "Duration": 1 - } - ] - }, - 2: { - "Item": { - "Name": "Eject Ability", - "Amount": 1, - "Value": 10000 - }, - "Traits": [ - { - "Trait": "Trap", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Eject", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Removal", - "Quality": 1, - "Duration": 1 - } - ] - }, - 3: { - "Item": { - "Name": "Bad Meal", - "Amount": 1, - "Value": 10000 - }, - "Traits": [ - { - "Trait": "Trap", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Damage", - "Quality": 1, - "Duration": 1, - }, - { - "Trait": "Food", - "Quality": 1, - "Duration": 1 - } - ] - }, -} - - -async def update_object(ctx: "SNIContext", key: str, value: typing.Dict): - await ctx.send_msgs([ - { - "cmd": "Set", - "key": key, - "default": {}, - "want_reply": False, - "operations": [ - {"operation": "update", "value": value} - ] - } - ]) - - -async def pop_object(ctx: "SNIContext", key: str, value: str): - await ctx.send_msgs([ - { - "cmd": "Set", - "key": key, - "default": {}, - "want_reply": False, - "operations": [ - {"operation": "pop", "value": value} - ] - } - ]) @mark_raw @@ -1197,7 +101,7 @@ class KDL3SNIClient(SNIClient): consumables = None stars = None item_queue: typing.List = [] - initialize_gifting: bool = False + initialize_gifting = False giftbox_key: str = "" motherbox_key: str = "" client_random: random.Random = random.Random() @@ -1236,70 +140,34 @@ async def validate_rom(self, ctx) -> bool: ctx.rom = rom_name ctx.items_handling = 0b111 # always remote items ctx.allow_collect = True - ctx.command_processor.commands["gift"] = cmd_gift + if "gift" not in ctx.command_processor.commands: + ctx.command_processor.commands["gift"] = cmd_gift death_link = await snes_read(ctx, KDL3_DEATH_LINK_ADDR, 1) if death_link: await ctx.update_death_link(bool(death_link[0] & 0b1)) - + self.giftbox_key = f"Giftbox;{ctx.team};{ctx.slot}" + self.motherbox_key = f"Giftboxes;{ctx.team}" + enable_gifting = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x01) + await initialize_giftboxes(ctx, self.giftbox_key, self.motherbox_key, bool(enable_gifting[0])) return True - async def pop_item(self, ctx): + async def pop_item(self, ctx, in_stage): from SNIClient import snes_buffered_write, snes_read if len(self.item_queue) > 0: item = self.item_queue.pop() - # special handling for the remaining items - item_idx = item.item & 0x0000FF - if item_idx == 0x21: - # 1-Up - life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 2) - life_bytes = pack("H", unpack("H", life_count)[0] + 1) - snes_buffered_write(ctx, KDL3_LIFE_COUNT, life_bytes) - snes_buffered_write(ctx, KDL3_LIFE_VISUAL, life_bytes) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x33])) - elif item_idx == 0x22: - # Maxim Tomato - # Check for Gooey - gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) - if gooey_hp[0] > 0x00: - snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x08, 0x00])) - snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, bytes([0x08, 0x00])) - else: - snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x0A, 0x00])) - elif item_idx == 0x23: - # Invincibility Candy - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x26])) - snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x84, 0x03])) - elif item_idx in [0x24, 0x25, 0x26]: - # Little/Medium/Big Star - amount = 2 * (item_idx - 0x24) + 1 - current_count = struct.unpack("H", await snes_read(ctx, KDL3_STAR_COUNT, 2))[0] - if not 0x8000 & current_count: # check that we just collected one in the current frame - # 0x8000 flags the game to check for changes in this value - snes_buffered_write(ctx, KDL3_STAR_COUNT, struct.pack("H", (current_count + amount) | 0x8000)) - elif item_idx == 0x40: - check_gooey_r = await snes_read(ctx, KDL3_GOOEY_TRAP, 2) - check_gooey = struct.unpack("H", check_gooey_r) - if check_gooey[0] == 0: - snes_buffered_write(ctx, KDL3_GOOEY_TRAP, bytes([0x01, 0x00])) - else: - self.item_queue.append(item) # We can't apply this yet - elif item_idx == 0x41: - check_slow_r = await snes_read(ctx, KDL3_SLOWNESS_TRAP, 2) - check_slow = struct.unpack("H", check_slow_r) - if check_slow[0] == 0: - snes_buffered_write(ctx, KDL3_SLOWNESS_TRAP, bytes([0x84, 0x03])) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0xA7])) - else: - self.item_queue.append(item) # We can't apply this yet - elif item_idx == 0x42: - check_ability_r = await snes_read(ctx, KDL3_ABILITY_TRAP, 2) - check_ability = struct.unpack("H", check_ability_r) - if check_ability[0] == 0: - snes_buffered_write(ctx, KDL3_ABILITY_TRAP, bytes([0x01, 0x00])) - else: - self.item_queue.append(item) # We can't apply this yet + if not in_stage and item & 0xC0: + # can't handle this item right now, send it to the back and return to handle the rest + self.item_queue.append(item) + return + ingame_queue = list(unpack("HHHHHHHH", await snes_read(ctx, KDL3_ITEM_QUEUE, 16))) + for i in range(len(ingame_queue)): + if ingame_queue[i] == 0x00: + ingame_queue[i] = item + snes_buffered_write(ctx, KDL3_ITEM_QUEUE, pack("HHHHHHHH", *ingame_queue)) + break + else: + self.item_queue.append(item) # no more slots, get it next go around async def pop_gift(self, ctx): if ctx.stored_data[self.giftbox_key]: @@ -1310,52 +178,33 @@ async def pop_gift(self, ctx): traits = [trait["Trait"] for trait in gift["Traits"]] if "Candy" in traits or "Invincible" in traits: # apply invincibility candy - snes_buffered_write(ctx, KDL3_INVINCIBILITY_TIMER, bytes([0x84, 0x03])) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x2B])) + self.item_queue.append(0x43) elif "Tomato" in traits: # apply maxim tomato - gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x2B])) - if gooey_hp[0] > 0x00: - snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x08, 0x00])) - snes_buffered_write(ctx, KDL3_KIRBY_HP + 2, bytes([0x08, 0x00])) - else: - snes_buffered_write(ctx, KDL3_KIRBY_HP, bytes([0x0A, 0x00])) + self.item_queue.append(0x42) elif "Life" in traits: # Apply 1-Up - life_count = await snes_read(ctx, KDL3_LIFE_COUNT, 2) - life_bytes = pack("H", unpack("H", life_count)[0] + 1) - snes_buffered_write(ctx, KDL3_LIFE_COUNT, life_bytes) - snes_buffered_write(ctx, KDL3_LIFE_VISUAL, life_bytes) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x33])) + self.item_queue.append(0x41) + elif "Currency" in traits or "Star" in traits: + value = gift["Item"]["Value"] + if value >= 50000: + self.item_queue.append(0x46) + elif value >= 30000: + self.item_queue.append(0x45) + else: + self.item_queue.append(0x44) elif "Trap" in traits: # find the best trap to apply if "Goo" in traits or "Gel" in traits: - check_gooey_r = await snes_read(ctx, KDL3_GOOEY_TRAP, 2) - check_gooey = struct.unpack("H", check_gooey_r) - if check_gooey[0] == 0: - snes_buffered_write(ctx, KDL3_GOOEY_TRAP, bytes([0x01, 0x00])) - else: - await update_object(ctx, key, {key: gift}) # We can't apply this yet + self.item_queue.append(0x80) elif "Slow" in traits or "Slowness" in traits: - check_slow_r = await snes_read(ctx, KDL3_SLOWNESS_TRAP, 2) - check_slow = struct.unpack("H", check_slow_r) - if check_slow[0] == 0: - snes_buffered_write(ctx, KDL3_SLOWNESS_TRAP, bytes([0x84, 0x03])) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0xA7])) - else: - await update_object(ctx, key, {key: gift}) # We can't apply this yet + self.item_queue.append(0x81) elif "Eject" in traits or "Removal" in traits: - check_ability_r = await snes_read(ctx, KDL3_ABILITY_TRAP, 2) - check_ability = struct.unpack("H", check_ability_r) - if check_ability[0] == 0: - snes_buffered_write(ctx, KDL3_ABILITY_TRAP, bytes([0x01, 0x00])) - else: - await update_object(ctx, key, {key: gift}) # We can't apply this yet + self.item_queue.append(0x82) else: # just deal damage to Kirby kirby_hp = struct.unpack("H", await snes_read(ctx, KDL3_KIRBY_HP, 2))[0] - snes_buffered_write(ctx, KDL3_KIRBY_HP, struct.pack("H", max(kirby_hp - 2, 0))) + snes_buffered_write(ctx, KDL3_KIRBY_HP, struct.pack("H", max(kirby_hp - 1, 0))) else: # check if it's tasty if any(x in traits for x in ["Consumable", "Food", "Drink", "Heal", "Health"]): @@ -1389,7 +238,7 @@ async def pick_gift_recipient(self, ctx, gift): if desire > most_applicable: most_applicable = desire most_applicable_slot = int(slot) - print(most_applicable, most_applicable_slot) + # print(most_applicable, most_applicable_slot) Uuid = uuid.uuid4().hex item = { **gift_base, @@ -1401,7 +250,7 @@ async def pick_gift_recipient(self, ctx, gift): "IsRefund": False, "GiftValue": gift_base["Item"]["Value"] * gift_base["Item"]["Amount"] } - print(item) + # print(item) await update_object(ctx, f"Giftbox;{ctx.team};{most_applicable_slot}", { Uuid: item, }) @@ -1420,18 +269,6 @@ async def game_watcher(self, ctx) -> None: return if not ctx.server: return - enable_gifting = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x01) - if not self.initialize_gifting: - self.giftbox_key = f"Giftbox;{ctx.team};{ctx.slot}" - self.motherbox_key = f"Giftboxes;{ctx.team}" - ctx.set_notify(self.motherbox_key, self.giftbox_key) - await update_object(ctx, f"Giftboxes;{ctx.team}", {f"{ctx.slot}": - { - "IsOpen": bool(enable_gifting[0]), - **kdl3_gifting_options - }}) - ctx.gifting = bool(enable_gifting[0]) - self.initialize_gifting = True # can't check debug anymore, without going and copying the value. might be important later. if self.levels is None: self.levels = dict() @@ -1481,25 +318,21 @@ async def game_watcher(self, ctx) -> None: ctx.location_names[item.location], recv_amount, len(ctx.items_received))) snes_buffered_write(ctx, KDL3_RECV_COUNT, pack("H", recv_amount)) + item_idx = item.item & 0x00000F if item.item & 0x000070 == 0: - ability = item.item & 0x00000F - snes_buffered_write(ctx, KDL3_ABILITY_ARRAY + (ability * 2), pack("H", ability)) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) + self.item_queue.append(item_idx | 0x10) elif item.item & 0x000010 > 0: - friend = (item.item & 0x00000F) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x32])) - snes_buffered_write(ctx, KDL3_ANIMAL_FRIENDS + (friend << 1), pack("H", friend + 1)) - elif item.item == 0x770020: - # Heart Star - heart_star_count = await snes_read(ctx, KDL3_HEART_STAR_COUNT, 2) - snes_buffered_write(ctx, KDL3_HEART_STAR_COUNT, pack("H", unpack("H", heart_star_count)[0] + 1)) - snes_buffered_write(ctx, KDL3_SOUND_FX, bytes([0x16])) - else: - self.item_queue.append(item) + self.item_queue.append(item_idx | 0x20) + elif item.item & 0x000020 > 0: + # Positive + self.item_queue.append(item_idx | 0x40) + elif item.item & 0x000040 > 0: + self.item_queue.append(item_idx | 0x80) # handle gifts here + gifting_status = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x01) if ctx.gifting: - if enable_gifting[0]: + if gifting_status[0]: gift = await snes_read(ctx, KDL3_GIFTING_SEND, 0x01) if gift[0]: # we have a gift to send @@ -1508,7 +341,7 @@ async def game_watcher(self, ctx) -> None: else: snes_buffered_write(ctx, KDL3_GIFTING_FLAG, bytes([0x01])) else: - if enable_gifting[0]: + if gifting_status[0]: snes_buffered_write(ctx, KDL3_GIFTING_FLAG, bytes([0x00])) await snes_flush_writes(ctx) @@ -1550,6 +383,10 @@ async def game_watcher(self, ctx) -> None: for star in star_addrs: if star not in ctx.checked_locations and stars[star_addrs[star]] == 0x01: new_checks.append(star) + + if game_state[0] != 0xFF: + await self.pop_gift(ctx) + await self.pop_item(ctx, game_state[0] != 0xFF) await snes_flush_writes(ctx) # boss status @@ -1565,10 +402,6 @@ async def game_watcher(self, ctx) -> None: snes_logger.info( f'New Check: {location} ({len(ctx.locations_checked)}/{len(ctx.missing_locations) + len(ctx.checked_locations)})') await ctx.send_msgs([{"cmd": 'LocationChecks', "locations": [new_check_id]}]) - - if game_state[0] != 0xFF: - await self.pop_item(ctx) - await self.pop_gift(ctx) except Exception as ex: # we crashed, so print log and clean up snes_logger.error("", exc_info=ex) diff --git a/worlds/kdl3/ClientAddrs.py b/worlds/kdl3/ClientAddrs.py new file mode 100644 index 000000000000..af5fd8b33a8c --- /dev/null +++ b/worlds/kdl3/ClientAddrs.py @@ -0,0 +1,816 @@ +consumable_addrs = { + 0: 14, + 1: 15, + 2: 84, + 3: 138, + 4: 139, + 5: 204, + 6: 214, + 7: 215, + 8: 224, + 9: 330, + 10: 353, + 11: 458, + 12: 459, + 13: 522, + 14: 525, + 15: 605, + 16: 606, + 17: 630, + 18: 671, + 19: 672, + 20: 693, + 21: 791, + 22: 851, + 23: 883, + 24: 971, + 25: 985, + 26: 986, + 27: 1024, + 28: 1035, + 29: 1036, + 30: 1038, + 31: 1039, + 32: 1170, + 33: 1171, + 34: 1377, + 35: 1378, + 36: 1413, + 37: 1494, + 38: 1666, + 39: 1808, + 40: 1809, + 41: 1816, + 42: 1856, + 43: 1857, +} + +star_addrs = { + 0x770401: 0, + 0x770402: 1, + 0x770403: 2, + 0x770404: 3, + 0x770405: 4, + 0x770406: 5, + 0x770407: 7, + 0x770408: 8, + 0x770409: 9, + 0x77040a: 10, + 0x77040b: 11, + 0x77040c: 12, + 0x77040d: 13, + 0x77040e: 16, + 0x77040f: 17, + 0x770410: 19, + 0x770411: 20, + 0x770412: 21, + 0x770413: 22, + 0x770414: 23, + 0x770415: 24, + 0x770416: 25, + 0x770417: 26, + 0x770418: 65, + 0x770419: 66, + 0x77041a: 67, + 0x77041b: 68, + 0x77041c: 69, + 0x77041d: 70, + 0x77041e: 71, + 0x77041f: 72, + 0x770420: 73, + 0x770421: 74, + 0x770422: 76, + 0x770423: 77, + 0x770424: 78, + 0x770425: 79, + 0x770426: 80, + 0x770427: 81, + 0x770428: 82, + 0x770429: 83, + 0x77042a: 85, + 0x77042b: 86, + 0x77042c: 87, + 0x77042d: 128, + 0x77042e: 129, + 0x77042f: 130, + 0x770430: 131, + 0x770431: 132, + 0x770432: 133, + 0x770433: 134, + 0x770434: 135, + 0x770435: 136, + 0x770436: 137, + 0x770437: 140, + 0x770438: 141, + 0x770439: 142, + 0x77043a: 143, + 0x77043b: 144, + 0x77043c: 145, + 0x77043d: 146, + 0x77043e: 147, + 0x77043f: 148, + 0x770440: 149, + 0x770441: 150, + 0x770442: 151, + 0x770443: 152, + 0x770444: 153, + 0x770445: 154, + 0x770446: 155, + 0x770447: 156, + 0x770448: 157, + 0x770449: 158, + 0x77044a: 159, + 0x77044b: 160, + 0x77044c: 192, + 0x77044d: 193, + 0x77044e: 194, + 0x77044f: 195, + 0x770450: 197, + 0x770451: 198, + 0x770452: 199, + 0x770453: 200, + 0x770454: 201, + 0x770455: 203, + 0x770456: 205, + 0x770457: 206, + 0x770458: 207, + 0x770459: 208, + 0x77045a: 209, + 0x77045b: 210, + 0x77045c: 211, + 0x77045d: 212, + 0x77045e: 213, + 0x77045f: 216, + 0x770460: 217, + 0x770461: 218, + 0x770462: 219, + 0x770463: 220, + 0x770464: 221, + 0x770465: 222, + 0x770466: 225, + 0x770467: 227, + 0x770468: 228, + 0x770469: 229, + 0x77046a: 230, + 0x77046b: 231, + 0x77046c: 232, + 0x77046d: 233, + 0x77046e: 234, + 0x77046f: 235, + 0x770470: 236, + 0x770471: 257, + 0x770472: 258, + 0x770473: 259, + 0x770474: 260, + 0x770475: 261, + 0x770476: 262, + 0x770477: 263, + 0x770478: 264, + 0x770479: 265, + 0x77047a: 266, + 0x77047b: 267, + 0x77047c: 268, + 0x77047d: 270, + 0x77047e: 271, + 0x77047f: 272, + 0x770480: 273, + 0x770481: 275, + 0x770482: 276, + 0x770483: 277, + 0x770484: 278, + 0x770485: 279, + 0x770486: 280, + 0x770487: 281, + 0x770488: 282, + 0x770489: 283, + 0x77048a: 284, + 0x77048b: 285, + 0x77048c: 286, + 0x77048d: 287, + 0x77048e: 321, + 0x77048f: 322, + 0x770490: 323, + 0x770491: 324, + 0x770492: 325, + 0x770493: 326, + 0x770494: 327, + 0x770495: 328, + 0x770496: 329, + 0x770497: 332, + 0x770498: 334, + 0x770499: 335, + 0x77049a: 336, + 0x77049b: 337, + 0x77049c: 340, + 0x77049d: 341, + 0x77049e: 342, + 0x77049f: 343, + 0x7704a0: 345, + 0x7704a1: 346, + 0x7704a2: 347, + 0x7704a3: 348, + 0x7704a4: 349, + 0x7704a5: 350, + 0x7704a6: 351, + 0x7704a7: 354, + 0x7704a8: 355, + 0x7704a9: 356, + 0x7704aa: 357, + 0x7704ab: 384, + 0x7704ac: 385, + 0x7704ad: 386, + 0x7704ae: 387, + 0x7704af: 388, + 0x7704b0: 389, + 0x7704b1: 391, + 0x7704b2: 392, + 0x7704b3: 393, + 0x7704b4: 394, + 0x7704b5: 396, + 0x7704b6: 397, + 0x7704b7: 398, + 0x7704b8: 399, + 0x7704b9: 400, + 0x7704ba: 401, + 0x7704bb: 402, + 0x7704bc: 403, + 0x7704bd: 404, + 0x7704be: 449, + 0x7704bf: 450, + 0x7704c0: 451, + 0x7704c1: 453, + 0x7704c2: 454, + 0x7704c3: 455, + 0x7704c4: 456, + 0x7704c5: 457, + 0x7704c6: 460, + 0x7704c7: 461, + 0x7704c8: 462, + 0x7704c9: 463, + 0x7704ca: 464, + 0x7704cb: 465, + 0x7704cc: 466, + 0x7704cd: 467, + 0x7704ce: 468, + 0x7704cf: 513, + 0x7704d0: 514, + 0x7704d1: 515, + 0x7704d2: 516, + 0x7704d3: 517, + 0x7704d4: 518, + 0x7704d5: 519, + 0x7704d6: 520, + 0x7704d7: 521, + 0x7704d8: 523, + 0x7704d9: 524, + 0x7704da: 527, + 0x7704db: 528, + 0x7704dc: 529, + 0x7704dd: 531, + 0x7704de: 532, + 0x7704df: 533, + 0x7704e0: 534, + 0x7704e1: 535, + 0x7704e2: 536, + 0x7704e3: 537, + 0x7704e4: 576, + 0x7704e5: 577, + 0x7704e6: 578, + 0x7704e7: 579, + 0x7704e8: 580, + 0x7704e9: 582, + 0x7704ea: 583, + 0x7704eb: 584, + 0x7704ec: 585, + 0x7704ed: 586, + 0x7704ee: 587, + 0x7704ef: 588, + 0x7704f0: 589, + 0x7704f1: 590, + 0x7704f2: 591, + 0x7704f3: 592, + 0x7704f4: 593, + 0x7704f5: 594, + 0x7704f6: 595, + 0x7704f7: 596, + 0x7704f8: 597, + 0x7704f9: 598, + 0x7704fa: 599, + 0x7704fb: 600, + 0x7704fc: 601, + 0x7704fd: 602, + 0x7704fe: 603, + 0x7704ff: 604, + 0x770500: 607, + 0x770501: 608, + 0x770502: 609, + 0x770503: 610, + 0x770504: 611, + 0x770505: 612, + 0x770506: 613, + 0x770507: 614, + 0x770508: 615, + 0x770509: 616, + 0x77050a: 617, + 0x77050b: 618, + 0x77050c: 619, + 0x77050d: 620, + 0x77050e: 621, + 0x77050f: 622, + 0x770510: 623, + 0x770511: 624, + 0x770512: 625, + 0x770513: 626, + 0x770514: 627, + 0x770515: 628, + 0x770516: 629, + 0x770517: 640, + 0x770518: 641, + 0x770519: 642, + 0x77051a: 643, + 0x77051b: 644, + 0x77051c: 645, + 0x77051d: 646, + 0x77051e: 647, + 0x77051f: 648, + 0x770520: 649, + 0x770521: 650, + 0x770522: 651, + 0x770523: 652, + 0x770524: 653, + 0x770525: 654, + 0x770526: 655, + 0x770527: 656, + 0x770528: 657, + 0x770529: 658, + 0x77052a: 659, + 0x77052b: 660, + 0x77052c: 661, + 0x77052d: 662, + 0x77052e: 663, + 0x77052f: 664, + 0x770530: 665, + 0x770531: 666, + 0x770532: 667, + 0x770533: 668, + 0x770534: 669, + 0x770535: 670, + 0x770536: 674, + 0x770537: 675, + 0x770538: 676, + 0x770539: 677, + 0x77053a: 678, + 0x77053b: 679, + 0x77053c: 680, + 0x77053d: 681, + 0x77053e: 682, + 0x77053f: 683, + 0x770540: 684, + 0x770541: 686, + 0x770542: 687, + 0x770543: 688, + 0x770544: 689, + 0x770545: 690, + 0x770546: 691, + 0x770547: 692, + 0x770548: 694, + 0x770549: 695, + 0x77054a: 704, + 0x77054b: 705, + 0x77054c: 706, + 0x77054d: 707, + 0x77054e: 708, + 0x77054f: 709, + 0x770550: 710, + 0x770551: 711, + 0x770552: 712, + 0x770553: 713, + 0x770554: 714, + 0x770555: 715, + 0x770556: 716, + 0x770557: 717, + 0x770558: 718, + 0x770559: 719, + 0x77055a: 720, + 0x77055b: 721, + 0x77055c: 722, + 0x77055d: 723, + 0x77055e: 724, + 0x77055f: 725, + 0x770560: 726, + 0x770561: 769, + 0x770562: 770, + 0x770563: 771, + 0x770564: 772, + 0x770565: 773, + 0x770566: 774, + 0x770567: 775, + 0x770568: 776, + 0x770569: 777, + 0x77056a: 778, + 0x77056b: 779, + 0x77056c: 780, + 0x77056d: 781, + 0x77056e: 782, + 0x77056f: 783, + 0x770570: 784, + 0x770571: 785, + 0x770572: 786, + 0x770573: 787, + 0x770574: 788, + 0x770575: 789, + 0x770576: 790, + 0x770577: 832, + 0x770578: 833, + 0x770579: 834, + 0x77057a: 835, + 0x77057b: 836, + 0x77057c: 837, + 0x77057d: 838, + 0x77057e: 839, + 0x77057f: 840, + 0x770580: 841, + 0x770581: 842, + 0x770582: 843, + 0x770583: 844, + 0x770584: 845, + 0x770585: 846, + 0x770586: 847, + 0x770587: 848, + 0x770588: 849, + 0x770589: 850, + 0x77058a: 854, + 0x77058b: 855, + 0x77058c: 856, + 0x77058d: 857, + 0x77058e: 858, + 0x77058f: 859, + 0x770590: 860, + 0x770591: 861, + 0x770592: 862, + 0x770593: 863, + 0x770594: 864, + 0x770595: 865, + 0x770596: 866, + 0x770597: 867, + 0x770598: 868, + 0x770599: 869, + 0x77059a: 870, + 0x77059b: 871, + 0x77059c: 872, + 0x77059d: 873, + 0x77059e: 874, + 0x77059f: 875, + 0x7705a0: 876, + 0x7705a1: 877, + 0x7705a2: 878, + 0x7705a3: 879, + 0x7705a4: 880, + 0x7705a5: 881, + 0x7705a6: 882, + 0x7705a7: 896, + 0x7705a8: 897, + 0x7705a9: 898, + 0x7705aa: 899, + 0x7705ab: 900, + 0x7705ac: 901, + 0x7705ad: 902, + 0x7705ae: 903, + 0x7705af: 904, + 0x7705b0: 905, + 0x7705b1: 960, + 0x7705b2: 961, + 0x7705b3: 962, + 0x7705b4: 963, + 0x7705b5: 964, + 0x7705b6: 965, + 0x7705b7: 966, + 0x7705b8: 967, + 0x7705b9: 968, + 0x7705ba: 969, + 0x7705bb: 970, + 0x7705bc: 972, + 0x7705bd: 973, + 0x7705be: 974, + 0x7705bf: 975, + 0x7705c0: 977, + 0x7705c1: 978, + 0x7705c2: 979, + 0x7705c3: 980, + 0x7705c4: 981, + 0x7705c5: 982, + 0x7705c6: 983, + 0x7705c7: 984, + 0x7705c8: 1025, + 0x7705c9: 1026, + 0x7705ca: 1027, + 0x7705cb: 1028, + 0x7705cc: 1029, + 0x7705cd: 1030, + 0x7705ce: 1031, + 0x7705cf: 1032, + 0x7705d0: 1033, + 0x7705d1: 1034, + 0x7705d2: 1037, + 0x7705d3: 1040, + 0x7705d4: 1041, + 0x7705d5: 1042, + 0x7705d6: 1043, + 0x7705d7: 1044, + 0x7705d8: 1045, + 0x7705d9: 1046, + 0x7705da: 1049, + 0x7705db: 1050, + 0x7705dc: 1051, + 0x7705dd: 1052, + 0x7705de: 1053, + 0x7705df: 1054, + 0x7705e0: 1055, + 0x7705e1: 1056, + 0x7705e2: 1057, + 0x7705e3: 1058, + 0x7705e4: 1059, + 0x7705e5: 1060, + 0x7705e6: 1061, + 0x7705e7: 1062, + 0x7705e8: 1063, + 0x7705e9: 1064, + 0x7705ea: 1065, + 0x7705eb: 1066, + 0x7705ec: 1067, + 0x7705ed: 1068, + 0x7705ee: 1069, + 0x7705ef: 1070, + 0x7705f0: 1152, + 0x7705f1: 1154, + 0x7705f2: 1155, + 0x7705f3: 1156, + 0x7705f4: 1157, + 0x7705f5: 1158, + 0x7705f6: 1159, + 0x7705f7: 1160, + 0x7705f8: 1161, + 0x7705f9: 1162, + 0x7705fa: 1163, + 0x7705fb: 1164, + 0x7705fc: 1165, + 0x7705fd: 1166, + 0x7705fe: 1167, + 0x7705ff: 1168, + 0x770600: 1169, + 0x770601: 1173, + 0x770602: 1174, + 0x770603: 1175, + 0x770604: 1176, + 0x770605: 1177, + 0x770606: 1178, + 0x770607: 1216, + 0x770608: 1217, + 0x770609: 1218, + 0x77060a: 1219, + 0x77060b: 1220, + 0x77060c: 1221, + 0x77060d: 1222, + 0x77060e: 1223, + 0x77060f: 1224, + 0x770610: 1225, + 0x770611: 1226, + 0x770612: 1227, + 0x770613: 1228, + 0x770614: 1229, + 0x770615: 1230, + 0x770616: 1231, + 0x770617: 1232, + 0x770618: 1233, + 0x770619: 1234, + 0x77061a: 1235, + 0x77061b: 1236, + 0x77061c: 1237, + 0x77061d: 1238, + 0x77061e: 1239, + 0x77061f: 1240, + 0x770620: 1241, + 0x770621: 1242, + 0x770622: 1243, + 0x770623: 1244, + 0x770624: 1245, + 0x770625: 1246, + 0x770626: 1247, + 0x770627: 1248, + 0x770628: 1249, + 0x770629: 1250, + 0x77062a: 1251, + 0x77062b: 1252, + 0x77062c: 1253, + 0x77062d: 1254, + 0x77062e: 1255, + 0x77062f: 1256, + 0x770630: 1257, + 0x770631: 1258, + 0x770632: 1259, + 0x770633: 1260, + 0x770634: 1261, + 0x770635: 1262, + 0x770636: 1263, + 0x770637: 1264, + 0x770638: 1265, + 0x770639: 1266, + 0x77063a: 1267, + 0x77063b: 1268, + 0x77063c: 1269, + 0x77063d: 1280, + 0x77063e: 1281, + 0x77063f: 1282, + 0x770640: 1283, + 0x770641: 1284, + 0x770642: 1285, + 0x770643: 1286, + 0x770644: 1289, + 0x770645: 1290, + 0x770646: 1291, + 0x770647: 1292, + 0x770648: 1293, + 0x770649: 1294, + 0x77064a: 1295, + 0x77064b: 1296, + 0x77064c: 1297, + 0x77064d: 1298, + 0x77064e: 1299, + 0x77064f: 1300, + 0x770650: 1301, + 0x770651: 1302, + 0x770652: 1303, + 0x770653: 1344, + 0x770654: 1345, + 0x770655: 1346, + 0x770656: 1347, + 0x770657: 1348, + 0x770658: 1349, + 0x770659: 1350, + 0x77065a: 1351, + 0x77065b: 1352, + 0x77065c: 1354, + 0x77065d: 1355, + 0x77065e: 1356, + 0x77065f: 1357, + 0x770660: 1358, + 0x770661: 1359, + 0x770662: 1360, + 0x770663: 1361, + 0x770664: 1362, + 0x770665: 1363, + 0x770666: 1365, + 0x770667: 1366, + 0x770668: 1367, + 0x770669: 1368, + 0x77066a: 1369, + 0x77066b: 1370, + 0x77066c: 1371, + 0x77066d: 1372, + 0x77066e: 1374, + 0x77066f: 1375, + 0x770670: 1376, + 0x770671: 1379, + 0x770672: 1380, + 0x770673: 1381, + 0x770674: 1382, + 0x770675: 1383, + 0x770676: 1384, + 0x770677: 1385, + 0x770678: 1386, + 0x770679: 1387, + 0x77067a: 1388, + 0x77067b: 1389, + 0x77067c: 1390, + 0x77067d: 1391, + 0x77067e: 1392, + 0x77067f: 1393, + 0x770680: 1394, + 0x770681: 1395, + 0x770682: 1396, + 0x770683: 1397, + 0x770684: 1398, + 0x770685: 1408, + 0x770686: 1409, + 0x770687: 1410, + 0x770688: 1411, + 0x770689: 1412, + 0x77068a: 1414, + 0x77068b: 1472, + 0x77068c: 1473, + 0x77068d: 1474, + 0x77068e: 1475, + 0x77068f: 1476, + 0x770690: 1477, + 0x770691: 1478, + 0x770692: 1479, + 0x770693: 1480, + 0x770694: 1481, + 0x770695: 1482, + 0x770696: 1483, + 0x770697: 1484, + 0x770698: 1486, + 0x770699: 1487, + 0x77069a: 1488, + 0x77069b: 1489, + 0x77069c: 1490, + 0x77069d: 1491, + 0x77069e: 1495, + 0x77069f: 1496, + 0x7706a0: 1497, + 0x7706a1: 1498, + 0x7706a2: 1499, + 0x7706a3: 1500, + 0x7706a4: 1501, + 0x7706a5: 1502, + 0x7706a6: 1503, + 0x7706a7: 1504, + 0x7706a8: 1505, + 0x7706a9: 1506, + 0x7706aa: 1507, + 0x7706ab: 1508, + 0x7706ac: 1536, + 0x7706ad: 1537, + 0x7706ae: 1538, + 0x7706af: 1539, + 0x7706b0: 1540, + 0x7706b1: 1541, + 0x7706b2: 1600, + 0x7706b3: 1601, + 0x7706b4: 1602, + 0x7706b5: 1603, + 0x7706b6: 1604, + 0x7706b7: 1605, + 0x7706b8: 1606, + 0x7706b9: 1607, + 0x7706ba: 1612, + 0x7706bb: 1613, + 0x7706bc: 1614, + 0x7706bd: 1615, + 0x7706be: 1616, + 0x7706bf: 1617, + 0x7706c0: 1618, + 0x7706c1: 1619, + 0x7706c2: 1620, + 0x7706c3: 1621, + 0x7706c4: 1622, + 0x7706c5: 1664, + 0x7706c6: 1665, + 0x7706c7: 1667, + 0x7706c8: 1668, + 0x7706c9: 1670, + 0x7706ca: 1671, + 0x7706cb: 1672, + 0x7706cc: 1673, + 0x7706cd: 1674, + 0x7706ce: 1675, + 0x7706cf: 1676, + 0x7706d0: 1677, + 0x7706d1: 1678, + 0x7706d2: 1679, + 0x7706d3: 1680, + 0x7706d4: 1681, + 0x7706d5: 1682, + 0x7706d6: 1683, + 0x7706d7: 1684, + 0x7706d8: 1685, + 0x7706d9: 1686, + 0x7706da: 1730, + 0x7706db: 1732, + 0x7706dc: 1734, + 0x7706dd: 1792, + 0x7706de: 1793, + 0x7706df: 1794, + 0x7706e0: 1795, + 0x7706e1: 1796, + 0x7706e2: 1797, + 0x7706e3: 1798, + 0x7706e4: 1799, + 0x7706e5: 1800, + 0x7706e6: 1801, + 0x7706e7: 1802, + 0x7706e8: 1803, + 0x7706e9: 1804, + 0x7706ea: 1805, + 0x7706eb: 1810, + 0x7706ec: 1811, + 0x7706ed: 1812, + 0x7706ee: 1813, + 0x7706ef: 1814, + 0x7706f0: 1815, + 0x7706f1: 1817, + 0x7706f2: 1818, + 0x7706f3: 1819, + 0x7706f4: 1820, + 0x7706f5: 1821, + 0x7706f6: 1822, + 0x7706f7: 1823, + 0x7706f8: 1824, + 0x7706f9: 1825, + 0x7706fa: 1826, + 0x7706fb: 1827, + 0x7706fc: 1828, + 0x7706fd: 1831, + 0x7706fe: 1832, + 0x7706ff: 1858, +} \ No newline at end of file diff --git a/worlds/kdl3/Gifting.py b/worlds/kdl3/Gifting.py new file mode 100644 index 000000000000..5047410bf385 --- /dev/null +++ b/worlds/kdl3/Gifting.py @@ -0,0 +1,296 @@ +# Small subfile to handle gifting info such as desired traits and giftbox management +import typing + + +async def update_object(ctx, key: str, value: typing.Dict): + await ctx.send_msgs([ + { + "cmd": "Set", + "key": key, + "default": {}, + "want_reply": False, + "operations": [ + {"operation": "update", "value": value} + ] + } + ]) + + +async def pop_object(ctx, key: str, value: str): + await ctx.send_msgs([ + { + "cmd": "Set", + "key": key, + "default": {}, + "want_reply": False, + "operations": [ + {"operation": "pop", "value": value} + ] + } + ]) + + +async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_open: bool): + ctx.set_notify(motherbox_key, giftbox_key) + await update_object(ctx, f"Giftboxes;{ctx.team}", {f"{ctx.slot}": + { + "IsOpen": is_open, + **kdl3_gifting_options + }}) + ctx.gifting = is_open + + +kdl3_gifting_options = { + "AcceptsAnyGift": True, + "DesiredTraits": [ + "Consumable", "Food", "Drink", "Candy", "Tomato", + "Invincible", "Life", "Heal", "Health", "Trap", + "Goo", "Gel", "Slow", "Slowness", "Eject", "Removal" + ] +} + +kdl3_gifts = { + 1: { + "Item": { + "Name": "1-Up", + "Amount": 1, + "Value": 400000 + }, + "Traits": [ + { + "Trait": "Consumable", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Life", + "Quality": 1, + "Duration": 1 + } + ] + }, + 2: { + "Item": { + "Name": "Maxim Tomato", + "Amount": 1, + "Value": 500000 + }, + "Traits": [ + { + "Trait": "Consumable", + "Quality": 5, + "Duration": 1, + }, + { + "Trait": "Heal", + "Quality": 5, + "Duration": 1, + }, + { + "Trait": "Food", + "Quality": 5, + "Duration": 1, + }, + { + "Trait": "Tomato", + "Quality": 5, + "Duration": 1, + } + ] + }, + 3: { + "Item": { + "Name": "Energy Drink", + "Amount": 1, + "Value": 100000 + }, + "Traits": [ + { + "Trait": "Consumable", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Heal", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Drink", + "Quality": 1, + "Duration": 1, + }, + ] + }, + 5: { + "Item": { + "Name": "Small Star Piece", + "Amount": 1, + "Value": 10000 + }, + "Traits": [ + { + "Trait": "Currency", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Money", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Star", + "Quality": 1, + "Duration": 1 + } + ] + }, + 6: { + "Item": { + "Name": "Medium Star Piece", + "Amount": 1, + "Value": 30000 + }, + "Traits": [ + { + "Trait": "Currency", + "Quality": 3, + "Duration": 1, + }, + { + "Trait": "Money", + "Quality": 3, + "Duration": 1, + }, + { + "Trait": "Star", + "Quality": 3, + "Duration": 1 + } + ] + }, + 7: { + "Item": { + "Name": "Large Star Piece", + "Amount": 1, + "Value": 50000 + }, + "Traits": [ + { + "Trait": "Currency", + "Quality": 5, + "Duration": 1, + }, + { + "Trait": "Money", + "Quality": 5, + "Duration": 1, + }, + { + "Trait": "Star", + "Quality": 5, + "Duration": 1 + } + ] + }, +} + +kdl3_trap_gifts = { + 0: { + "Item": { + "Name": "Gooey Bag", + "Amount": 1, + "Value": 10000 + }, + "Traits": [ + { + "Trait": "Trap", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Goo", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Gel", + "Quality": 1, + "Duration": 1 + } + ] + }, + 1: { + "Item": { + "Name": "Slowness", + "Amount": 1, + "Value": 10000 + }, + "Traits": [ + { + "Trait": "Trap", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Slow", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Slowness", + "Quality": 1, + "Duration": 1 + } + ] + }, + 2: { + "Item": { + "Name": "Eject Ability", + "Amount": 1, + "Value": 10000 + }, + "Traits": [ + { + "Trait": "Trap", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Eject", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Removal", + "Quality": 1, + "Duration": 1 + } + ] + }, + 3: { + "Item": { + "Name": "Bad Meal", + "Amount": 1, + "Value": 10000 + }, + "Traits": [ + { + "Trait": "Trap", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Damage", + "Quality": 1, + "Duration": 1, + }, + { + "Trait": "Food", + "Quality": 1, + "Duration": 1 + } + ] + }, +} diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index eca09a269efd..cae8eea1ac3f 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -390,6 +390,7 @@ class VirtualConsoleChanges(Choice): option_both = 3 default = 1 + class Gifting(Toggle): """ When enabled, the goal game item will be sent to other compatible games as a gift, diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 1d3b913f2a57..79564561ea82 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -463,7 +463,8 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD rom.write_byte(0x3D016, world.options.ow_boss_requirement.value) rom.write_byte(0x3D018, world.options.consumables.value) rom.write_byte(0x3D01A, world.options.starsanity.value) - rom.write_byte(0x3D01C, world.options.gifting) + rom.write_byte(0x3D01C, world.options.gifting.value if world.multiworld.players > 1 else 0) + # don't write gifting for solo game for level in shuffled_levels: for i in range(len(shuffled_levels[level])): diff --git a/worlds/kdl3/data/kdl3_basepatch.bsdiff4 b/worlds/kdl3/data/kdl3_basepatch.bsdiff4 index 332f4063b789f319b79b4f3f38dc7ef33ddfdce4..4a8dbce652bcb3c63b8dcca07234f0e95c3cc90d 100644 GIT binary patch delta 1275 zcmV?&;)4HCTZ#dWW*X^ zO#>znWWYuQ^%#MZMoflGOeTX60}yDuCG|(~)01X2`Gy#y%(+~qd#LzSb zKmY(TG-3ll0004@k)tL8GGx<0ic*O5Kn#OGe*gdg4FCWD00001pa1{>13&-(00000 z5v7QRUF;>VmItH;{EKzcJ&(ZXkRXB1nR$q22rM8IIn1FWzkvo+DLn$Gz7YqV3W|DQ zQ85rJKMD&f0YoT}2nj`n0Sh!L4(`CYAw7P^hRh2oVH8Y14|ckRpfx ze;kO2h+vzLk|ejt%R?~sW{8NE0T2KS93@)8B&cEqkeZ~+4Mc?!2Jz5#axCt4J*jl@ z8{zp-0P4K8D$5@EbuV_b_$k@8KO`kG2ILPa0yEqmDw zX4S&SlvWYKLI@WD35{?9@_>X1&mcqD_}EB`WV0C?PbFeWN-!`BSQ*Mx(FnmuUo0U0J5J&hy5Gh4Q{1R7_qR`oIRe=7l6H)XPUQgdXFSd zenrOaLg{Ix$-|oDs1Qa?WwR@@3$_=s0+Y9aX%~ja?3P4CkpgRLIHQJKMBS5Wd*(Bw zX+ZEtaFDfV#cSC6=KE?Uf2fso$sE`@>saZjz0(zrXfH~24XBL zGX)M>n*^Fh6`QlEin~)Rdk5zfP9ka)j{3NjA_fQ~frnWzk!x^cqjyJBAh5lHLeGg0JGW!djpmeEW!W) delta 1310 zcmV+(1>yR>64eqBLQ_OZMn*I+#sB~S00000^pO$Ye=fLW@c;k`|NsC0|J(oO|M&m@ z{vP?BHWIRks zriMWDOa`Hmh|mBT9;QtL5M*hgiKY<7jWs<@F)}fz(dq`uX|)Kc`iY_$45yULm`y{} z@lPX2e>SJ;0GfJ%rpg9~plD4nXeXeJqA(-W)6~e*(rKe6OoP!HW`xsZPegi*m;^-9 zVoj2sD9ua&Mg-F*q`(oQ1T?@JL4!$wFlYb?ko7Q31Yp#_m`xa)DUdY7LqQM$rkZJx z$kCwC8fefO41+@;8Vwo%G7OCXG62Lf8flOKe`o*!gwsPzng&1uMI=*tri~gj$Y^K) z0D6El0iXZ?00w{!0000000001pwIvf4JRMMDqf{EN8=#&u+KM@+(TvKgqAWWLO0iC zJ(3tl2r7d@;jsdnX%tLJA0~tgrqV)1BN7phVoR9P1gcCD5KJ&YBBas*1-+z!Z`g&> ze_{}n;}S_tG=xzwNS0|KBnnFqfd~azodR{B57lm}2tWW9 z#z|_yX@L_>i9njFL|dAJ3uw7)6HFIAc7TWe<1*|EdV4WlAMkfD*K50NltppW}cvkl2v#l z2_HEzDTl3awekM*E=0{8E>j=Erhf0isnk5!%6YqIY%5em>6@&LrMM=!b&Q|wF7e~QFm zUA(p_!WBI>P$wc$XaO12=F|5=3=4QogzAY1y~aeI6N|=4I)80d#|`>H>ll#*0;?`1 z$!t$8hmbO0b+EIm9}_Nr$Z+6?$0PhkOVt8OYBMWCW2rSe!Mz&MoZAcroKc(}Ub-@l z=i`#hHhoc?{Tq*dj#!f34Rp?`E$93emcRolvz5<>;9-FxEudsL`8AAP<%5VZNe&=2gnoiciV1cK~DmVR3RP-QE<)RDs8g^Uy`nj8iz1WYeNPO!6&{18IU-vY=9!XGvp1=53Sz$umfRGP(PEr>( zYC8Lv;jzP8LI?|ol#=H{WeY^WE((r}XQbsl@;eB!Sl5+5(wUiJ*gq(vXse8yUF78) zAjAWUAlah`ckfvZINeSO4pUXKZ?AyvBv5MuR8_Mx#8@S$bOa!ee|kotN^K(Dl+BQy zuOzAHEHErppnsbgp;Bn{XMw!t1d>9A(Bk^FXP$bO`%TctYNiR|rZom!83&r7fxmz1 z2#onGw$B%hg0s-WJ|F66vtPQJNDu%851&DpC21@=;yae&t`xL%NBmvM6yZWZy5W<= ULRx4wF+o`-Q(4iWv(E)@1Dwl7{r~^~ diff --git a/worlds/kdl3/src/kdl3_basepatch.asm b/worlds/kdl3/src/kdl3_basepatch.asm index 305e90318d68..d659c5bd2f72 100644 --- a/worlds/kdl3/src/kdl3_basepatch.asm +++ b/worlds/kdl3/src/kdl3_basepatch.asm @@ -248,8 +248,8 @@ MainLoopHook: LDA $8080 CMP #$0000 ; did we get a gooey trap BEQ .Slowness ; branch if we did not - LDA #$0800 ; A button press - STA $60C1 ; write to controller mirror + LDA #$0080 ; A button press + STA $60C7 ; write to controller mirror STZ $8080 .Slowness: LDA $8082 ; slowness @@ -423,7 +423,7 @@ ParseItemQueue: BRA .PlaySFX .ApplyNegative: CPY #$0005 - BCC .PlayNone + BCS .PlayNone LDA $8080,Y BNE .Return LDA #$0384 From 31c73c137a67c2f5b86103c4a9626ba5489c6f8c Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 11 Feb 2024 22:47:21 -0600 Subject: [PATCH 149/165] fix hint information --- worlds/kdl3/__init__.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 5b591588f0b2..20a241c07512 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -309,6 +309,12 @@ def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): if self.stage_shuffle_enabled: regions = {LocationName.level_names[level]: level for level in LocationName.level_names} level_hint_data = {} - for location in [location for location in self.multiworld.get_locations(self.player) if location.address]: - level_hint_data[location.address] = f"{regions[location.parent_region.level]} {location.parent_region.stage if location.parent_region.stage < 7 else 'Boss'}" + for level in regions: + for stage in range(7): + stage_name = self.multiworld.get_location(self.location_id_to_name[self.player_levels[level][stage]], + self.player).name.replace(" - Complete", "") + stage_regions = [room for room in self.rooms if stage_name in room.name] + for region in stage_regions: + for location in region.locations: + level_hint_data[location.address] = f"{regions[level]} {stage if stage < 7 else 'Boss'}" hint_data[self.player] = level_hint_data From 7d53e6ee573344ac651cae150467264020cd118e Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 11 Feb 2024 22:54:59 -0600 Subject: [PATCH 150/165] return to explicit gooey --- worlds/kdl3/data/kdl3_basepatch.bsdiff4 | Bin 2366 -> 2361 bytes worlds/kdl3/src/kdl3_basepatch.asm | 39 ++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/data/kdl3_basepatch.bsdiff4 b/worlds/kdl3/data/kdl3_basepatch.bsdiff4 index 4a8dbce652bcb3c63b8dcca07234f0e95c3cc90d..9cad0b986ed62ea6fe217b3124439178fc8110a0 100644 GIT binary patch literal 2361 zcmYL}dpOhm8^^!fY_>6mIW326<`i-oKZn$?mN|rH$rJS>hm1-hB`RYMqcDtYIm|>< zkLMZrDLObusWz76P?S!3lwVP(c&56p=lR--`91&+~^bS9_#nk(IP|A>3}Jn9%;9uyR7h{2H$-;4GjA1Yxup72MbY0A53khfE-o?nvlaj?+8 ziTkVgBcf4lY+phycG$&dc=51?d%V`gwzg@-G@etf!As-zp=;eqnXf-&)Dl@s?M0?t z8R<69+a3OG%QS3=3IK@IHJOdCeO~*r_F=X8Qwr63^<(PoPhURQEPY*VewO;ZN(>3^ z^v^y&89uR%MES@f1EgUx77zmf>BpcTKjwu+$u2OaVnm%3%K)@tEO#=Nv=dZr5py zMlm2%L&FiYOc0`fr|t~=(-bA>B=X9jNwFB|v3yXBF=eX9cMb_0ZUBxr$BC`a`` z>0iSZz5)}=^7*)`yKLL0>B5z=)^oI!_k~gV(|bD0?P8#!xuU27LumOasS$>7L{7@~ zMMJm^g_5h>xQd241(n0m!N`F`vx$`#za3D&QCjME;|jkrMLobl&xRubo;=5f^)Swt z2+|@QjUty9q21#DqG>VZf~}Zo-d~IQU1BaZuphOu)=wFFrIgblxiSkrbYU|a^{Qun z+1!cqb+Nq6n{e9e_cgtGTqzTbQ1Kht@W2Y4#I@fZA9OXk_Zr5%uy zoWyipIjF&t<;Qo_ukK5PjSF|$V4_q&K~r7Zw(NO+x=EqCr$mH&Dj$sJk9$J*DpFEg zFGxW0oMR`yCBwrNCU5(H?JGr9(N5DYcZnid;8yvLv(@^OnIWaBy;B2_exnCm(EhP7 zZ9Q^dbC=!Ykc0T~b4g=w-{WYIt&^^A423;{bVCoZ5#Rpsr~)U>{YKnixmvd#E|8P1 zg)r3-U+~8Yk=3nt3QlZ6fA^g@U@_zL!Xm$xG^DuH5aYW^)Q3czyaJ9Ha6@H0&2ms4 zfZU8=*5_T{m*cTqatR}XbP$!s{Mrq0#tQ{nQG|eVC~vyET=tmTU7}`~MN$+dwAX*g zUS;pZu36pO$=&tEWfZXEvH9ow*?fsk$#`H2dN7@cZo$kw$rDx#vK$7eJR&3!ugSS7 z2~6m2ovIMk8aWCO3wykA=#AmgjU!;K2s`JLtBF-~*tbj34`yFZc<)9bNL9jZv-Dul9za)Juvu)!kOdFrTfZen|<&;;Oz=5MeD*-q;{JRhlXt} zo88Rp7R;T;ujwQ;jtWHy1u5#sz^#q23dz6&aP0X*+qM%v`o?DQ#$BfjXwW8vfvtcu zyZ!T5lZw(~lAPZD(W9z6vR8Zuy97)??OX8>bC`N?36nVB5gWu=(~RHd;Kx}<)W5*` zROJ{7fJic2tsZ~&DRTMr?+YH>W(GM<64bGObgjc^DS0%0J~g$l16X9{4 z(U(5NSR`Tf3ajh#NHQLY0c8qEz>v}4K9xn~19rZ2x|GCEuH+dN&~czT9tuL1(EAn6nJH#4WGKO6L3LS7S(bgZ0O4a|I&0rBQ&~slM}S&L zDAKSRmKlN4Vvz@G#8lSy`siY68V8hfQYv;p*dBizU6m!;Y0^ue@v2Ri%a2QrA}EV| zWUF^S)9WB!vD1FJk8`)YL;KA1t-e0BIZ9P~K%{Xt1Q%~f8;~mPnDlC|Cs@+0ytYn} z-;H^X-p@Gi5NF(U>1+&}JmZS!`Mc-_CVk(LK3f{YgSXIT-XM{CarVqj7CWNYW(ccF z@P0LB_`6iqN|`CJ1~}dR4oBn+Jrz6Kl!EQxO}RYCe8T&VJk7G0@DiIsWi{6h({!~} z8{;ya&%V)VOvb}2t%Jumw8tlWO-eD`g!8v=3T+cy){NQ~^0bVspwp8H(R2R7NGlCa zw@=t#p#1J(e&w5-A@Toh+^Ss#)8vOH82zrd5>Ng>TmbP7_nXHc$2x!Ea@j^N4QMTk zTj}@6E@0?D0~*3Uf^*z!fH2BA_s1QPf!>zg54Cd$B_6zFG6W!?0z`}|F zxcyWp{@E3xzJ)X=3tw}Hyx|E!uHa$QxdrYnFSD7FmBTzWf-7az&oB&ydKJx1!h5Kn zf-kZ+)TRI{M_I`F9@laKURz`oxTA2+t07!2eA5)}=yVh#ZMBy5OwVLR4>Yv14+eW} z4bv1@UZ&1fnu!-=ojRv(D_(Z4%Db3ZtxL;vF?)M@#HBT7LU)=34$zQ-ROLEh+2~5B zo3G?78CiP&!0qyro)&=-EiXE0)1#E&d!U9>^zY+d-x`TXwb+ld-)SxWG*#s8*H`c#oIm+# literal 2366 zcmYLLeKgaH8~<+BY?!9JZRF0|5Eb)PRLeFjb2la~k#1rw%dMkaWED1Vi!g7KDcP{L zh$N}FrIHxBV@SG{E~%()^d^cQ{q8yUbI$W}p7Z?ie4cZj&v_^To-`^IbnF2Bk0-Ey z6M*z1p@c@cIFUo}0U@7nRRjP4b8&HDb~K`jc~{qmj38M7P@oM8V3?2YP6 z+6$|P(}UZjEYFT+@=1CT&;|*>=RhfeRs=)9yhqup3V4#s_5ENC=plS0sMREtN)a>czrBN|;x`fGVko^`ZSl@EX_0t!HBkU)q~rABLz+EpN&1ONmuLSrdFB>9ziD1oIW zW$h4rBt%^V5@GhRH_s`Bx?|+1j+Wd(FV;CH_ZcYfPGsy(Lq0HdXEJOfRXw?Yzam zlcB5_cz*S%6@_+P4|1CVNF$B=6lW_5qzGw55aU7}6CtRHiD{U##T*XKfA_e)BSi0m za{9!vbJ{Xo!e23v`%b2&82I`G>$m*p5HE=vmC^}FCp>xaU$`x*zhaAD+BB zfBC@6{)Y((VQ#*jjkzO_y;3)UkoP2upRKlk!v!6(x?Fb?Q|^H8s~ZN(fB)M5?J0WO ziZDWxhrt)});N|BBi9uQtWApgFMOHZ7+C-O-nUlouAT9kpW^e_yf^D%cO%2Hee!1* zWpiR50>$g6$#usbq1c0W?iU5=-Ju|iAjq5;=uAo)@=u({quF8aY*r)2#Lqf{=Huw7 zy%VDheBsA-U3;M7kByu6>iLdNzBPOmM!Hfda97Wyv@u6ud(0L*EDiU0&BPw&9n5Y~ z)n<*%*R0W*rGEcfkEob?#8Nu=ri>+C9vi&jt-VQG@=Bz}5jPJfHIJ>zNE(S3bu`1+ zo`E)%#v)F$rZ;oVsiS+%2J2ii9FO~1loh)LptsMG(RNxd}rK;x!orfPRfUw<0 zNrZ;zt45wQc6+*$f#J}-MEx`zM&G6$x-l&u`AcJzuRiKQ3u@J#n2C@yenG<-VtJoY z${(fs#mzC?JS*QMua0+=*PQCEyW(*#^nQDcuqoC9;CVZ7eftR{A3;zxB(U^EU^?m9Wvcz^i>JHU_9jI(d1SZWQN*_ zPVQe6Z>~rI*xy2GPwxM7$i?bj4TrJvVZqVG?CTb1Y`tCTG>d@$#H~+KTL(baCogGQ z!n4?YUz2tYco#KBkz)En+t|a4ZTMO4@R9e)$@y*26Lrl2geVt38WCUWK|*0U0xXeS zNzzFHux1rML;+P`oEpd)pqI;>@HjZV6f_fd$;4O?QUPK?0(MzJ;3=AZ0Rz*kQP8L^ zK^v@>;dok41`EgQoh&5t9nELGZ%SDZY{`1oh9*E!Z*0L-JGpHnm2CCf%TrRB zr@SS}Aan!1sNl@(pKI>7k1?9W(*x`7amNn@waVcTl{vXAfeW77tn=;&Kc&~Ls+Ag< zja5tU42mdw;R=7p#>_jb%*_1PoN6fISA`P~UC4!#FCx2NA!D}J?yqc7G?~T8S3Wl=@}ir1>I|}HPV^)5p!s$_9Ei- zkRs@3!Maz!A(4vc8<7ha3*UbYU5~}rIc(BhGj$~I7Ias2&=_&0Cs2B}rud7$B(ECl z*J9Xne6)3r-nXTfvVVU)wCAKNY^xcsyT`H>nXW7xey=f}pE}ncYk+Yl;wVZBEzF$t zPbCduH%sPQ&2{Wr-r9cmIXAc^i?Zo2iDfdFqAu-?-AXRj7{0AEa7rgB$|o`6*Hbyj z8x0LFS~F_hTD_w}dTg&{n7rIab3%3mUn&uyR{QH)rV|Y$3pqOOzg5#JcjW4`f&`a% z=%aC97G-p@akQeU`pVm4Iw-W;fOGn8nlf)QZ)jA)CicU2i?r_vrJ1gQl;VGk$GR`V WZG5hrd2H>nNi+HNzkkK@vHcGTgAS(v diff --git a/worlds/kdl3/src/kdl3_basepatch.asm b/worlds/kdl3/src/kdl3_basepatch.asm index d659c5bd2f72..0a417c56c072 100644 --- a/worlds/kdl3/src/kdl3_basepatch.asm +++ b/worlds/kdl3/src/kdl3_basepatch.asm @@ -248,8 +248,7 @@ MainLoopHook: LDA $8080 CMP #$0000 ; did we get a gooey trap BEQ .Slowness ; branch if we did not - LDA #$0080 ; A button press - STA $60C7 ; write to controller mirror + JSL GooeySpawn STZ $8080 .Slowness: LDA $8082 ; slowness @@ -734,6 +733,42 @@ OpenWorldBossUnlock: PLX RTL +org $07A180 +GooeySpawn: + PHY + PHX + LDX #$0000 + LDY #$0000 + STA $5543 + LDA $1922,Y + STA $C0 + LDA $19A2,Y + STA $C2 + LDA #$0008 + STA $C4 + LDA #$0002 + STA $352A + LDA #$0003 + JSL $00F54F + STX $5541 + LDA #$FFFF + STA $0622,X + JSL $00BAEF + JSL $C4883C + LDX $39D1 + CPX #$0001 + BEQ .Return + LDA #$FFFF + CPX #$0002 + BEQ .Call + DEC + .Call: + JSL $C43C22 + .Return: + PLX + PLY + RTL + org $07A200 SpeedTrap: PHX From 06d0fbf4fefb280d4db2015b04673ca52a26490a Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 12 Feb 2024 01:14:42 -0600 Subject: [PATCH 151/165] gifting cleanup, fix options, star sprites --- worlds/kdl3/Client.py | 32 +++++++++------- worlds/kdl3/Gifting.py | 9 ++++- worlds/kdl3/Rom.py | 30 ++++++++++++--- worlds/kdl3/data/APStars.bsdiff4 | Bin 0 -> 250 bytes worlds/kdl3/data/kdl3_basepatch.bsdiff4 | Bin 2361 -> 2411 bytes worlds/kdl3/src/kdl3_basepatch.asm | 47 ++++++++++++++---------- 6 files changed, 78 insertions(+), 40 deletions(-) create mode 100644 worlds/kdl3/data/APStars.bsdiff4 diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 5737cca7e204..9b249e5bcafd 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -17,7 +17,7 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from SNIClient import SNIClientCommandProcessor, SNIContext + from SNIClient import SNIClientCommandProcessor snes_logger = logging.getLogger("SNES") @@ -146,10 +146,6 @@ async def validate_rom(self, ctx) -> bool: death_link = await snes_read(ctx, KDL3_DEATH_LINK_ADDR, 1) if death_link: await ctx.update_death_link(bool(death_link[0] & 0b1)) - self.giftbox_key = f"Giftbox;{ctx.team};{ctx.slot}" - self.motherbox_key = f"Giftboxes;{ctx.team}" - enable_gifting = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x01) - await initialize_giftboxes(ctx, self.giftbox_key, self.motherbox_key, bool(enable_gifting[0])) return True async def pop_item(self, ctx, in_stage): @@ -179,8 +175,9 @@ async def pop_gift(self, ctx): if "Candy" in traits or "Invincible" in traits: # apply invincibility candy self.item_queue.append(0x43) - elif "Tomato" in traits: + elif "Tomato" in traits or "tomato" in gift["Name"].lower(): # apply maxim tomato + # only want tomatos here, no other vegetable is that good self.item_queue.append(0x42) elif "Life" in traits: # Apply 1-Up @@ -213,7 +210,7 @@ async def pop_gift(self, ctx): if trait["Trait"] in ["Consumable", "Food", "Drink", "Heal", "Health"])) quality = min(10, quality * 2) else: - # it's not really edible, but he'll eat it anyways + # it's not really edible, but he'll eat it anyway quality = self.client_random.choices(range(0, 2), {0: 75, 1: 25})[0] kirby_hp = await snes_read(ctx, KDL3_KIRBY_HP, 1) gooey_hp = await snes_read(ctx, KDL3_KIRBY_HP + 2, 1) @@ -230,7 +227,7 @@ async def pick_gift_recipient(self, ctx, gift): else: gift_base = kdl3_trap_gifts[self.client_random.randint(0, 3)] most_applicable = -1 - most_applicable_slot = -1 + most_applicable_slot = ctx.slot for slot, info in ctx.stored_data[self.motherbox_key].items(): if int(slot) == ctx.slot and len(ctx.stored_data[self.motherbox_key]) > 1: continue @@ -238,11 +235,14 @@ async def pick_gift_recipient(self, ctx, gift): if desire > most_applicable: most_applicable = desire most_applicable_slot = int(slot) + elif most_applicable_slot == ctx.slot and info["AcceptsAnyGift"]: + # only send to ourselves if no one else will take it + most_applicable_slot = int(slot) # print(most_applicable, most_applicable_slot) - Uuid = uuid.uuid4().hex + UUID = uuid.uuid4().hex item = { **gift_base, - "ID": Uuid, + "ID": UUID, "Sender": ctx.player_names[ctx.slot], "Receiver": ctx.player_names[most_applicable_slot], "SenderTeam": ctx.team, @@ -252,7 +252,7 @@ async def pick_gift_recipient(self, ctx, gift): } # print(item) await update_object(ctx, f"Giftbox;{ctx.team};{most_applicable_slot}", { - Uuid: item, + UUID: item, }) async def game_watcher(self, ctx) -> None: @@ -269,6 +269,11 @@ async def game_watcher(self, ctx) -> None: return if not ctx.server: return + if not self.initialize_gifting: + self.giftbox_key = f"Giftbox;{ctx.team};{ctx.slot}" + self.motherbox_key = f"Giftboxes;{ctx.team}" + enable_gifting = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x01) + await initialize_giftboxes(ctx, self.giftbox_key, self.motherbox_key, bool(enable_gifting[0])) # can't check debug anymore, without going and copying the value. might be important later. if self.levels is None: self.levels = dict() @@ -282,7 +287,8 @@ async def game_watcher(self, ctx) -> None: if self.stars is None: stars = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) self.stars = stars[0] == 0x01 - is_demo = await snes_read(ctx, KDL3_IS_DEMO, 1) # 1 - recording a demo, 2 - playing back recorded, 3+ is a demo + is_demo = await snes_read(ctx, KDL3_IS_DEMO, 1) + # 1 - recording a demo, 2 - playing back recorded, 3+ is a demo if is_demo[0] > 0x00: return current_save = await snes_read(ctx, KDL3_GAME_SAVE, 1) @@ -331,7 +337,7 @@ async def game_watcher(self, ctx) -> None: # handle gifts here gifting_status = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x01) - if ctx.gifting: + if hasattr(ctx, "gifting") and ctx.gifting: if gifting_status[0]: gift = await snes_read(ctx, KDL3_GIFTING_SEND, 0x01) if gift[0]: diff --git a/worlds/kdl3/Gifting.py b/worlds/kdl3/Gifting.py index 5047410bf385..a1c7dd238580 100644 --- a/worlds/kdl3/Gifting.py +++ b/worlds/kdl3/Gifting.py @@ -33,10 +33,10 @@ async def pop_object(ctx, key: str, value: str): async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_open: bool): ctx.set_notify(motherbox_key, giftbox_key) await update_object(ctx, f"Giftboxes;{ctx.team}", {f"{ctx.slot}": - { + { "IsOpen": is_open, **kdl3_gifting_options - }}) + }}) ctx.gifting = is_open @@ -95,6 +95,11 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope "Trait": "Tomato", "Quality": 5, "Duration": 1, + }, + { + "Trait": "Vegetable", + "Quality": 5, + "Duration": 1, } ] }, diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 79564561ea82..991f264f1cdb 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -335,11 +335,16 @@ def write_heart_star_sprites(rom: RomData): rom.write_bytes(0x3F0EBF, [0x00, 0xD0, 0x39]) -def write_consumable_sprites(rom: RomData): +def write_consumable_sprites(rom: RomData, consumables, stars): compressed = rom.read_bytes(consumable_address, consumable_size) decompressed = hal_decompress(compressed) - patch = get_data(__name__, os.path.join("data", "APConsumable.bsdiff4")) - patched = bytearray(bsdiff4.patch(decompressed, patch)) + patched = bytearray(decompressed) + if consumables: + patch = get_data(__name__, os.path.join("data", "APConsumable.bsdiff4")) + patched = bytearray(bsdiff4.patch(bytes(patched), patch)) + if stars: + patch = get_data(__name__, os.path.join("data", "APStars.bsdiff4")) + patched = bytearray(bsdiff4.patch(bytes(patched), patch)) patched[0:0] = [0xE3, 0xFF] patched.append(0xFF) rom.write_bytes(0x1CD500, patched) @@ -373,8 +378,7 @@ def patch(self, target: str): rom.write_bytes(addr, level_sprite) rom.write_bytes(0x460A, [0x00, 0xA0, 0x39, 0x20, 0xA9, 0x39, 0x30, 0xB2, 0x39, 0x40, 0xBB, 0x39, 0x50, 0xC4, 0x39]) - if rom.read_bytes(0x3D018, 1)[0] > 0: - write_consumable_sprites(rom) + write_consumable_sprites(rom, rom.read_byte(0x3D018) > 0, rom.read_byte(0x3D01A) > 0) rom_name = rom.read_bytes(0x3C000, 21) rom.write_bytes(0x7FC0, rom_name) rom.write_crc() @@ -397,6 +401,18 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD # need to handle regular stages # write check for boss to be unlocked + if world.options.consumables: + # reroute maxim tomatoes to use the 1-UP function, then null out the function + rom.write_bytes(0x3002F, [0x37, 0x00]) + rom.write_bytes(0x30037, [0xA9, 0x26, 0x00, # LDA #$0026 + 0x22, 0x27, 0xD9, 0x00, # JSL $00D927 + 0xA4, 0xD2, # LDY $D2 + 0x6B, # RTL + 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, # NOP #10 + ]) + + # stars handling is built into the rom, so no changes there + rooms = world.rooms if world.options.music_shuffle > 0: if world.options.music_shuffle == 1: @@ -457,6 +473,7 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD boss_requirements[3], boss_requirements[4])) rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if world.options.goal_speed == 1 else 0xFFFF)) rom.write_byte(0x3D00C, world.options.goal_speed.value) + rom.write_byte(0x3D00E, world.options.open_world.value) rom.write_byte(0x3D010, world.options.death_link.value) rom.write_byte(0x3D012, world.options.goal.value) rom.write_byte(0x3D014, world.options.stage_shuffle.value) @@ -464,7 +481,8 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD rom.write_byte(0x3D018, world.options.consumables.value) rom.write_byte(0x3D01A, world.options.starsanity.value) rom.write_byte(0x3D01C, world.options.gifting.value if world.multiworld.players > 1 else 0) - # don't write gifting for solo game + rom.write_byte(0x3D01E, world.options.strict_bosses.value) + # don't write gifting for solo game, since there's no one to send anything to for level in shuffled_levels: for i in range(len(shuffled_levels[level])): diff --git a/worlds/kdl3/data/APStars.bsdiff4 b/worlds/kdl3/data/APStars.bsdiff4 new file mode 100644 index 0000000000000000000000000000000000000000..c335bae9cadaa0297ecaac90e06568a2bfd37ebb GIT binary patch literal 250 zcmZnt=tvaEi(>HFS(r3y$2Sqj83Tf%$+#h(G{?0)wJP<_iP1 zGQRdLu_r|yIyt@Au-E{hc(IVuLk0%Mzuo^jSaokP2)G?!Z~$sI*WiVloVq8$f_IlAwjdNSf8~ZLi%@Q;a)a-mv!ar-iLuaFd z>crW#j5qIlzC9OeIO$2!M(-`}!%vH>cQx4g^1j@H>+AjqmFjPCJDj!LL?O;eu*V`| egZPW4e|k^43KlB5skj~jIZwRE)goX5$Zr4uwN>Z< literal 0 HcmV?d00001 diff --git a/worlds/kdl3/data/kdl3_basepatch.bsdiff4 b/worlds/kdl3/data/kdl3_basepatch.bsdiff4 index 9cad0b986ed62ea6fe217b3124439178fc8110a0..cd002121cd38dcb319ba2148ced46c9592c3905b 100644 GIT binary patch delta 2383 zcmV-V39$CL66+EXLQ_OZMn*I+=l}o!00000yO9wYe_RoqU;qGffB*XV z4nQCz0sv6}02n|31qKKJU?2!_5C9+mh&b|@8Z`9NLJvuZJq=8nFii~%CI}Th2Bw2e z0ie(_27m)i2cbPj2b7u;V4z?k*SCgot8W#nKmypA@nqf~ChEDFd9VI4v>g)L63zPh=d&@W{$@xDQSWF?4Ur12;Cz!B-QF#CXgxjki775R2#&v zx15IEO+T1GPEeDLJ2NRmZD0n-K!{8T(Hj9gPc0&~wefe^llZ%mDZ+$;;Edw{LRx4w zF+o`-Q&~+e#9#mb2!H?o|Nq*)X^8bb6G5k_(8+>&o~A*y2dMQ1O$M7&Bhdf`ni>Xy ze}OaxnKZ;UqeD!d)d;7d6BP9^Hj_!|qeQ|FD8^F*L}00w{n00000e*gdg00000000005(bNmrT*x}G8JLuBtiEf zCJZQIF#RSOB?K6u1PPge*)ax=5t#s|!Vw3b3W|E5Q8REW$b|)*fKdu;0s>Q^KthTY z2X_KI=n)or1y*b*nkWS&!lIzkU_=oC_|KwGz^Whsa-t$2Af1v(k_jP}_U6P9e<%b% z04QK6EYeGYAz2Bv8AYlYAPM#(vzlFb9f3lYJN#V30Cri(xNxzO!<+~vi4z<_D7ZnP zT@Tk8CRB?oQm&Pptn|6c+&3HKh)Fvjpg4#?6jf@IB(PUtupwNCQYAy%EDZtWpfDq2 zMSxm}?qYYh1bqE-v-mW{I8n4Ze}D`|#K$gNx5b@P5~1KIG&-opcmP3Sac^>#plV~b zBH8X$%uj_Q?^AnI$V2-L40yg^bgOqDqVj`50Forh&0U86NrdYhcR%>`Z54`y-+m|- zviN~L%FrqY1L9U=n1O}IMFG-0rxctlD+Pvnu&J968AzT2#C(4dN43Ere=hxlMp>Z= z@W56|8|sR4QcXX!xbS4p%{0OOOSNM5>^lvHBd?^MbiohKVv|M zAQ2`^;0!8ALB1@w>BD?`!wH6AfHW9UX50^cbXkeq%d;!^b^hbYT2B_`}VsNEhzE~ z^>-T9SJt*Jfl0cjlPNt_f(r*jYT9~{gwI}{&y?+=x|7M17U!!a-7l8J2Ld=rI*O&> zzl>oiN_}WZX^}xTf3>DWGOw6dB}ZSD1VrG;1WZxYNH~6$AhSKkLtB3LPB= z%$Y^KxK&?fwEv5_BAh5lCYNF`076=5H8DY1CR15$Vzx{G0X+Zz|NoP{1tNcLQ<*dx zrXZRVMw$%(WCKi^VKg42O$`76rcDNb000004@5M`HB-bRQzxdTYBNLzjSPpV8X7VN zfCE4P05kvq0ibBe(?E)PLrQH!(gSK9iIXOc8feG^BSwZm$Nj`G#K~wA{@ItriEvmu!%c01$$uDTu_DldDtoOQea5E%+DsO(2WDAXxG6gXr0s z_`syq<}hZpP6bI0kq9h_n9ko{BY`$ujf8NqtV->9+M2y?$H)Eu7ji{7P>^k6woHQU B52gSB delta 2333 zcmYL}dpy&98^?d!Y_>6mIjv}$ITbmLN91mpF^6!EJS9(Z$PkH?s5a&>a+tHtX(pn& zyYG=lp>j%;YGX+bMd_rw@(4x6GxfY)&-KUk{l31}_4-`b_j--V->P5s!ygcYYtUd-uK6XFSjT}?T*u^~Ui$>Fw_t7BlX4c)mBQvdbadh2s0^GB^1 z64>LLRXH6xt2!D-(jTHl+uDivDt7W16!U3gRV;0RO8-`gM`D3v71E zIuz#CR&;lIkEMCNN>qXGTf1~Pt_=SScLNHC<|jbx4B24CIb#R##aCC}D&rlAWL0%a)Di$L>oP+}L3`GUh>?M5Ai^Ku(0uCpb z&n+U}aJ!e8v+_CwUINAe8cFVti)ai2l*?;$Hzk4wrONk}RX)UO+}?dV;(6!{EhA_x z=HHK5O-I?K`Ewm}Xs_$cwDVOMwZ)}1^&CV>HQm_SlyccQ?v`76$vYKLpA#T#BtZ+5 zg1M^EWq*yDdJBxqsutpE?{TbJW((IU+RJGv9}6S4%^vKjvW|j^J`_b1=tHZ{N)0fC z<8o4tHyTpXTqwC#5?9^asGxEzG7veGxMOPV=`iJ>dQVrM+*QAJI1x4}^s~f7sDKX4^t$|Z@Wr_ng}(k$5%QUQAf7+z z4h>SIFxxLkK=Ry^XTB%HLlvfP`+gfJL)FsG(JuFj!r9<<`R?4hZPOWt%2e;n3_%7B z9+rTPOoV9bk_TFQt)Cn^ik~b`nt1mSM}zE{c6_TZ>}Lwn^xeb;e4AtA3fws7uDIbU zwLV>305?qwVZ2p*!51q;*0tX)IQ<*?hxb&p>73n5)BFa~h~n4gDDR!30VLwg6>!v$ z6Ds{#rmgZ2D=6SyCl_8E;qWC}OD6+T(8Fm&bQ|Ww(>!7IFxz&B z$|FJ&@tWM5l7NK1_L*u?gTXEVV(FkK4!u1z^6D5^E6mzHsTpIf1;c(%JMTQ(Of-VGBAesFU?D2Ug!)6Jg#v5lzrLZiuqPAycgJ2fvsp! zc$U;@`6*`9%B2xWHpIpN;D4^p&jXV^DECT}y#@a*_jO_)g!}MAbLm0_=&Ymn? zZZb>EV92O}#ey0$S+XpfIswAV$avnSd9J3B$`1pzkx(S&s2Y|PhSFk_hw8;twrf*l zF*TJ7%043%+ajz^J&CN%6!{t5A<%er#;aAQBqtD*Wj?aqbCBh66tCE0vpT@NSJkb3 ze)iVDfZ7L2ZKr>@VHN}zZ$=xED(#*2=xidG(ak;f%#hztc#c0vue6ObY`K&h#Ual* zBKrR>Vs>HD4j&(|qA}cfOC2W761kVT=Wnt(Va1jsSXF}O>k0jTN>$C3Spo}y+vjV0 zTu$Fzv8O{R&>G&7!-Fg&eC*ECtcVINwJcOtbL=)wQ(Lz*tk}BZ9hu5vJi5|8d}>Q) ze8RV+6#bnzUz?WT4#8#32$w_8D#!|3`!gWAO#3g4)Uv=dn}j0;%I_cL*SyUh5&y^1 zsm@U_OMYa8+1C3`;?5t6^C#Xd`R+E%wa8z(T(R9l1KPkYsquMi?LQLTjD~QI<8}q< zAq=w1|F|pC)BSD#BkgPgIaT=RyLmT?^OAb=bRRl6ps;!fZZi{%e}09y%~YD5iLZ|# zGq*e?$Q3+lDPJnt=dok1bnO^Vjo?Tb_t6hQpcVaezk-FZ%ey(e@rVASJ8-T&ySim#|W|yfSYIca1WPi11 zx)iV4*XCW!sMDckIP7?LZp@)QdrF5nO9K0ANI|M{J+Lfv4b;h7l1oOGJ&3+tb;jK^ zAgt|W4{dgw5_life3t%W(&PJ8B2q1OasCIb&6lRC{ACBBo|G$n5=>smwF_RcJ(PVl zy(hdH8gAOPoQOZ>ox+4C*MB7M9y2lbV Date: Mon, 12 Feb 2024 01:40:01 -0600 Subject: [PATCH 152/165] actually fix hint extension this time --- worlds/kdl3/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 20a241c07512..ad3120e29d33 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -315,6 +315,6 @@ def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): self.player).name.replace(" - Complete", "") stage_regions = [room for room in self.rooms if stage_name in room.name] for region in stage_regions: - for location in region.locations: - level_hint_data[location.address] = f"{regions[level]} {stage if stage < 7 else 'Boss'}" + for location in [location for location in region.locations if location.address]: + level_hint_data[location.address] = f"{regions[level]} {stage + 1 if stage < 6 else 'Boss'}" hint_data[self.player] = level_hint_data From b3ecc4535b8abf1ade7f58beeed109ab46d53680 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 12 Feb 2024 01:43:43 -0600 Subject: [PATCH 153/165] de-indent json again --- worlds/kdl3/data/Rooms.json | 18203 +--------------------------------- 1 file changed, 1 insertion(+), 18202 deletions(-) diff --git a/worlds/kdl3/data/Rooms.json b/worlds/kdl3/data/Rooms.json index d5944fee2c91..4ebe8c86a2ae 100644 --- a/worlds/kdl3/data/Rooms.json +++ b/worlds/kdl3/data/Rooms.json @@ -1,18202 +1 @@ -[ - { - "name": "Grass Land 1 - 0", - "level": 1, - "stage": 1, - "room": 0, - "pointer": 3434257, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Sir Kibble", - "Cappy" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 205, - "unkn2": 8, - "x": 72, - "y": 200, - "name": "Grass Land 1 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 87, - "unkn2": 9, - "x": 104, - "y": 152, - "name": "Grass Land 1 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 16 - ], - [ - 1, - 23 - ], - [ - 0, - 23 - ], - [ - 14, - 23 - ], - [ - 27, - 16 - ], - [ - 12, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Grass Land 1 - Enemy 1 (Waddle Dee)", - "Grass Land 1 - Enemy 2 (Sir Kibble)", - "Grass Land 1 - Enemy 3 (Cappy)", - "Grass Land 1 - Star 1", - "Grass Land 1 - Star 2", - "Grass Land 1 - Star 3", - "Grass Land 1 - Star 4", - "Grass Land 1 - Star 5", - "Grass Land 1 - Star 6", - "Grass Land 1 - Star 7", - "Grass Land 1 - Star 8", - "Grass Land 1 - Star 9", - "Grass Land 1 - Star 10" - ], - "music": 20 - }, - { - "name": "Grass Land 1 - 1", - "level": 1, - "stage": 1, - "room": 1, - "pointer": 3368373, - "animal_pointers": [], - "consumables": [ - { - "idx": 14, - "pointer": 264, - "x": 928, - "y": 160, - "etype": 22, - "vtype": 0, - "name": "Grass Land 1 - 1-Up (Parasol)" - }, - { - "idx": 15, - "pointer": 312, - "x": 1456, - "y": 176, - "etype": 22, - "vtype": 2, - "name": "Grass Land 1 - Maxim Tomato (Spark)" - } - ], - "consumables_pointer": 304, - "enemies": [ - "Sparky", - "Bronto Burt", - "Sasuke" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 143, - "unkn2": 6, - "x": 56, - "y": 152, - "name": "Grass Land 1 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 30, - 16 - ], - [ - 12, - 16 - ], - [ - 14, - 23 - ], - [ - 8, - 16 - ], - [ - 0, - 22 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Grass Land 1 - Enemy 4 (Sparky)", - "Grass Land 1 - Enemy 5 (Bronto Burt)", - "Grass Land 1 - Enemy 6 (Sasuke)", - "Grass Land 1 - Star 11", - "Grass Land 1 - Star 12", - "Grass Land 1 - Star 13", - "Grass Land 1 - Star 14", - "Grass Land 1 - Star 15", - "Grass Land 1 - 1-Up (Parasol)", - "Grass Land 1 - Maxim Tomato (Spark)" - ], - "music": 20 - }, - { - "name": "Grass Land 1 - 2", - "level": 1, - "stage": 1, - "room": 2, - "pointer": 2960650, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 5, - "unkn2": 9, - "x": 1416, - "y": 152, - "name": "Grass Land 1 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 1 - Animal 1", - "Grass Land 1 - Animal 2" - ], - "music": 38 - }, - { - "name": "Grass Land 1 - 3", - "level": 1, - "stage": 1, - "room": 3, - "pointer": 3478442, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 4, - "unkn1": 179, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Grass Land 1 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 19 - ], - [ - 7, - 16 - ], - [ - 0, - 23 - ], - [ - 6, - 22 - ], - [ - 14, - 23 - ], - [ - 8, - 16 - ], - [ - 1, - 23 - ] - ], - "locations": [ - "Grass Land 1 - Enemy 7 (Poppy Bros Jr.)", - "Grass Land 1 - Star 16", - "Grass Land 1 - Star 17", - "Grass Land 1 - Star 18", - "Grass Land 1 - Star 19", - "Grass Land 1 - Star 20", - "Grass Land 1 - Star 21", - "Grass Land 1 - Star 22", - "Grass Land 1 - Star 23" - ], - "music": 20 - }, - { - "name": "Grass Land 1 - 4", - "level": 1, - "stage": 1, - "room": 4, - "pointer": 2978390, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 1 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Grass Land 1 - Tulip" - ], - "music": 8 - }, - { - "name": "Grass Land 1 - 5", - "level": 1, - "stage": 1, - "room": 5, - "pointer": 2890835, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 1 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land 2 - 0", - "level": 1, - "stage": 2, - "room": 0, - "pointer": 3293347, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Rocky", - "KeKe", - "Bobo", - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 1, - "unkn1": 112, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Grass Land 2 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 16 - ], - [ - 7, - 16 - ], - [ - 5, - 16 - ], - [ - 4, - 22 - ], - [ - 51, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 2 - Enemy 1 (Rocky)", - "Grass Land 2 - Enemy 2 (KeKe)", - "Grass Land 2 - Enemy 3 (Bobo)", - "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)", - "Grass Land 2 - Star 1", - "Grass Land 2 - Star 2", - "Grass Land 2 - Star 3", - "Grass Land 2 - Star 4", - "Grass Land 2 - Star 5", - "Grass Land 2 - Star 6", - "Grass Land 2 - Star 7", - "Grass Land 2 - Star 8", - "Grass Land 2 - Star 9", - "Grass Land 2 - Star 10" - ], - "music": 11 - }, - { - "name": "Grass Land 2 - 1", - "level": 1, - "stage": 2, - "room": 1, - "pointer": 3059685, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 20, - "unkn2": 9, - "x": 56, - "y": 136, - "name": "Grass Land 2 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 2 - Animal 1", - "Grass Land 2 - Animal 2" - ], - "music": 39 - }, - { - "name": "Grass Land 2 - 2", - "level": 1, - "stage": 2, - "room": 2, - "pointer": 3432109, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Popon Ball", - "Bouncy" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 133, - "unkn2": 11, - "x": 72, - "y": 200, - "name": "Grass Land 2 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 52, - "unkn2": 12, - "x": 56, - "y": 152, - "name": "Grass Land 2 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 13, - 16 - ], - [ - 50, - 16 - ], - [ - 4, - 22 - ], - [ - 3, - 16 - ], - [ - 0, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 2 - Enemy 5 (Waddle Dee)", - "Grass Land 2 - Enemy 6 (Popon Ball)", - "Grass Land 2 - Enemy 7 (Bouncy)", - "Grass Land 2 - Star 11", - "Grass Land 2 - Star 12", - "Grass Land 2 - Star 13" - ], - "music": 11 - }, - { - "name": "Grass Land 2 - 3", - "level": 1, - "stage": 2, - "room": 3, - "pointer": 2970029, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 2, - "unkn2": 9, - "x": 840, - "y": 168, - "name": "Grass Land 2 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 19 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Grass Land 2 - 4", - "level": 1, - "stage": 2, - "room": 4, - "pointer": 3578022, - "animal_pointers": [], - "consumables": [ - { - "idx": 20, - "pointer": 272, - "x": 992, - "y": 192, - "etype": 22, - "vtype": 0, - "name": "Grass Land 2 - 1-Up (Needle)" - } - ], - "consumables_pointer": 352, - "enemies": [ - "Tick", - "Bronto Burt", - "Nruff" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 154, - "unkn2": 12, - "x": 72, - "y": 152, - "name": "Grass Land 2 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 16 - ], - [ - 5, - 16 - ], - [ - 2, - 16 - ], - [ - 48, - 16 - ], - [ - 14, - 23 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Grass Land 2 - Enemy 8 (Tick)", - "Grass Land 2 - Enemy 9 (Bronto Burt)", - "Grass Land 2 - Enemy 10 (Nruff)", - "Grass Land 2 - Star 14", - "Grass Land 2 - Star 15", - "Grass Land 2 - Star 16", - "Grass Land 2 - Star 17", - "Grass Land 2 - Star 18", - "Grass Land 2 - Star 19", - "Grass Land 2 - Star 20", - "Grass Land 2 - Star 21", - "Grass Land 2 - 1-Up (Needle)" - ], - "music": 11 - }, - { - "name": "Grass Land 2 - 5", - "level": 1, - "stage": 2, - "room": 5, - "pointer": 2966057, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 2 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Grass Land 2 - Muchimuchi" - ], - "music": 8 - }, - { - "name": "Grass Land 2 - 6", - "level": 1, - "stage": 2, - "room": 6, - "pointer": 2887461, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 2 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land 3 - 0", - "level": 1, - "stage": 3, - "room": 0, - "pointer": 3149707, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky", - "Rocky", - "Nruff" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 107, - "unkn2": 7, - "x": 72, - "y": 840, - "name": "Grass Land 3 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 46, - "unkn2": 9, - "x": 152, - "y": 152, - "name": "Grass Land 3 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 16 - ], - [ - 14, - 23 - ], - [ - 15, - 16 - ], - [ - 0, - 16 - ], - [ - 8, - 16 - ] - ], - "locations": [ - "Grass Land 3 - Enemy 1 (Sparky)", - "Grass Land 3 - Enemy 2 (Rocky)", - "Grass Land 3 - Enemy 3 (Nruff)", - "Grass Land 3 - Star 1", - "Grass Land 3 - Star 2", - "Grass Land 3 - Star 3", - "Grass Land 3 - Star 4", - "Grass Land 3 - Star 5", - "Grass Land 3 - Star 6", - "Grass Land 3 - Star 7", - "Grass Land 3 - Star 8", - "Grass Land 3 - Star 9", - "Grass Land 3 - Star 10" - ], - "music": 19 - }, - { - "name": "Grass Land 3 - 1", - "level": 1, - "stage": 3, - "room": 1, - "pointer": 3204939, - "animal_pointers": [], - "consumables": [ - { - "idx": 10, - "pointer": 360, - "x": 208, - "y": 344, - "etype": 22, - "vtype": 0, - "name": "Grass Land 3 - 1-Up (Climb)" - }, - { - "idx": 11, - "pointer": 376, - "x": 224, - "y": 568, - "etype": 22, - "vtype": 2, - "name": "Grass Land 3 - Maxim Tomato (Climb)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 9, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Grass Land 3 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 22 - ], - [ - 6, - 23 - ], - [ - 2, - 22 - ], - [ - 5, - 23 - ], - [ - 14, - 23 - ], - [ - 1, - 23 - ], - [ - 0, - 23 - ], - [ - 31, - 16 - ] - ], - "locations": [ - "Grass Land 3 - Star 11", - "Grass Land 3 - Star 12", - "Grass Land 3 - Star 13", - "Grass Land 3 - Star 14", - "Grass Land 3 - Star 15", - "Grass Land 3 - Star 16", - "Grass Land 3 - 1-Up (Climb)", - "Grass Land 3 - Maxim Tomato (Climb)" - ], - "music": 19 - }, - { - "name": "Grass Land 3 - 2", - "level": 1, - "stage": 3, - "room": 2, - "pointer": 3200066, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 13, - "unkn2": 55, - "x": 56, - "y": 152, - "name": "Grass Land 3 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 16 - ], - [ - 0, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 3 - Star 17", - "Grass Land 3 - Star 18", - "Grass Land 3 - Star 19", - "Grass Land 3 - Star 20", - "Grass Land 3 - Star 21", - "Grass Land 3 - Star 22", - "Grass Land 3 - Star 23", - "Grass Land 3 - Star 24", - "Grass Land 3 - Star 25", - "Grass Land 3 - Star 26" - ], - "music": 19 - }, - { - "name": "Grass Land 3 - 3", - "level": 1, - "stage": 3, - "room": 3, - "pointer": 2959784, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 15, - "unkn2": 9, - "x": 56, - "y": 120, - "name": "Grass Land 3 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 19 - ] - ], - "locations": [], - "music": 31 - }, - { - "name": "Grass Land 3 - 4", - "level": 1, - "stage": 3, - "room": 4, - "pointer": 2979121, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 8, - "unkn2": 9, - "x": 760, - "y": 152, - "name": "Grass Land 3 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 3 - Animal 1", - "Grass Land 3 - Animal 2" - ], - "music": 40 - }, - { - "name": "Grass Land 3 - 5", - "level": 1, - "stage": 3, - "room": 5, - "pointer": 2997811, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 15, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 3 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 19 - ] - ], - "locations": [], - "music": 8 - }, - { - "name": "Grass Land 3 - 6", - "level": 1, - "stage": 3, - "room": 6, - "pointer": 3084876, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bouncy" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 96, - "unkn2": 9, - "x": 40, - "y": 152, - "name": "Grass Land 3 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 13, - 16 - ], - [ - 14, - 16 - ], - [ - 1, - 23 - ], - [ - 59, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 3 - Pitcherman", - "Grass Land 3 - Enemy 4 (Bouncy)", - "Grass Land 3 - Star 27", - "Grass Land 3 - Star 28", - "Grass Land 3 - Star 29", - "Grass Land 3 - Star 30", - "Grass Land 3 - Star 31" - ], - "music": 19 - }, - { - "name": "Grass Land 3 - 7", - "level": 1, - "stage": 3, - "room": 7, - "pointer": 2891317, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 3 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land 4 - 0", - "level": 1, - "stage": 4, - "room": 0, - "pointer": 3471284, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Loud", - "Babut", - "Rocky" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 145, - "unkn2": 13, - "x": 72, - "y": 136, - "name": "Grass Land 4 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 16 - ], - [ - 43, - 16 - ], - [ - 14, - 23 - ], - [ - 40, - 16 - ], - [ - 61, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Grass Land 4 - Enemy 1 (Loud)", - "Grass Land 4 - Enemy 2 (Babut)", - "Grass Land 4 - Enemy 3 (Rocky)", - "Grass Land 4 - Star 1", - "Grass Land 4 - Star 2", - "Grass Land 4 - Star 3", - "Grass Land 4 - Star 4", - "Grass Land 4 - Star 5", - "Grass Land 4 - Star 6", - "Grass Land 4 - Star 7", - "Grass Land 4 - Star 8", - "Grass Land 4 - Star 9" - ], - "music": 10 - }, - { - "name": "Grass Land 4 - 1", - "level": 1, - "stage": 4, - "room": 1, - "pointer": 3436401, - "animal_pointers": [], - "consumables": [ - { - "idx": 12, - "pointer": 290, - "x": 1008, - "y": 144, - "etype": 22, - "vtype": 2, - "name": "Grass Land 4 - Maxim Tomato (Zebon Right)" - } - ], - "consumables_pointer": 368, - "enemies": [ - "Kapar" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 58, - "unkn2": 5, - "x": 184, - "y": 312, - "name": "Grass Land 4 - 1 Exit 0", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 42, - "unkn2": 18, - "x": 168, - "y": 88, - "name": "Grass Land 4 - 1 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 43, - 16 - ], - [ - 10, - 23 - ], - [ - 6, - 22 - ], - [ - 14, - 23 - ], - [ - 2, - 22 - ], - [ - 67, - 16 - ] - ], - "locations": [ - "Grass Land 4 - Enemy 4 (Kapar)", - "Grass Land 4 - Star 10", - "Grass Land 4 - Maxim Tomato (Zebon Right)" - ], - "music": 10 - }, - { - "name": "Grass Land 4 - 2", - "level": 1, - "stage": 4, - "room": 2, - "pointer": 3039401, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 4, - "x": 56, - "y": 72, - "name": "Grass Land 4 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 27 - ] - ], - "locations": [], - "music": 9 - }, - { - "name": "Grass Land 4 - 3", - "level": 1, - "stage": 4, - "room": 3, - "pointer": 3722714, - "animal_pointers": [], - "consumables": [ - { - "idx": 23, - "pointer": 280, - "x": 856, - "y": 224, - "etype": 22, - "vtype": 2, - "name": "Grass Land 4 - Maxim Tomato (Gordo)" - }, - { - "idx": 22, - "pointer": 480, - "x": 1352, - "y": 112, - "etype": 22, - "vtype": 0, - "name": "Grass Land 4 - 1-Up (Gordo)" - } - ], - "consumables_pointer": 288, - "enemies": [ - "Glunk", - "Oro" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 95, - "unkn2": 5, - "x": 72, - "y": 200, - "name": "Grass Land 4 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ], - [ - 55, - 16 - ], - [ - 16, - 16 - ], - [ - 25, - 16 - ], - [ - 14, - 23 - ], - [ - 0, - 22 - ], - [ - 2, - 22 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Grass Land 4 - Enemy 5 (Glunk)", - "Grass Land 4 - Enemy 6 (Oro)", - "Grass Land 4 - Star 11", - "Grass Land 4 - Star 12", - "Grass Land 4 - Star 13", - "Grass Land 4 - Star 14", - "Grass Land 4 - Star 15", - "Grass Land 4 - Star 16", - "Grass Land 4 - Star 17", - "Grass Land 4 - Star 18", - "Grass Land 4 - Star 19", - "Grass Land 4 - Star 20", - "Grass Land 4 - Star 21", - "Grass Land 4 - Star 22", - "Grass Land 4 - Star 23", - "Grass Land 4 - Star 24", - "Grass Land 4 - Star 25", - "Grass Land 4 - Star 26", - "Grass Land 4 - Maxim Tomato (Gordo)", - "Grass Land 4 - 1-Up (Gordo)" - ], - "music": 10 - }, - { - "name": "Grass Land 4 - 4", - "level": 1, - "stage": 4, - "room": 4, - "pointer": 3304980, - "animal_pointers": [], - "consumables": [ - { - "idx": 32, - "pointer": 208, - "x": 488, - "y": 64, - "etype": 22, - "vtype": 2, - "name": "Grass Land 4 - Maxim Tomato (Cliff)" - } - ], - "consumables_pointer": 160, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 94, - "unkn2": 9, - "x": 40, - "y": 152, - "name": "Grass Land 4 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 43, - 16 - ], - [ - 2, - 22 - ], - [ - 54, - 16 - ], - [ - 1, - 16 - ], - [ - 40, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 4 - Star 27", - "Grass Land 4 - Maxim Tomato (Cliff)" - ], - "music": 10 - }, - { - "name": "Grass Land 4 - 5", - "level": 1, - "stage": 4, - "room": 5, - "pointer": 3498127, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Peran" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 61, - "unkn2": 13, - "x": 56, - "y": 72, - "name": "Grass Land 4 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 61, - "unkn2": 18, - "x": 56, - "y": 200, - "name": "Grass Land 4 - 5 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 72, - 16 - ], - [ - 43, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ], - [ - 10, - 23 - ], - [ - 3, - 16 - ] - ], - "locations": [ - "Grass Land 4 - Enemy 7 (Peran)", - "Grass Land 4 - Star 28", - "Grass Land 4 - Star 29", - "Grass Land 4 - Star 30", - "Grass Land 4 - Star 31", - "Grass Land 4 - Star 32", - "Grass Land 4 - Star 33", - "Grass Land 4 - Star 34", - "Grass Land 4 - Star 35", - "Grass Land 4 - Star 36", - "Grass Land 4 - Star 37" - ], - "music": 10 - }, - { - "name": "Grass Land 4 - 6", - "level": 1, - "stage": 4, - "room": 6, - "pointer": 3160191, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 28, - "unkn2": 4, - "x": 72, - "y": 376, - "name": "Grass Land 4 - 6 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 28, - "unkn2": 12, - "x": 72, - "y": 440, - "name": "Grass Land 4 - 6 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 19 - ], - [ - 6, - 23 - ] - ], - "locations": [], - "music": 10 - }, - { - "name": "Grass Land 4 - 7", - "level": 1, - "stage": 4, - "room": 7, - "pointer": 3035801, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 12, - "x": 56, - "y": 200, - "name": "Grass Land 4 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 27 - ] - ], - "locations": [ - "Grass Land 4 - Miniboss 1 (Boboo)" - ], - "music": 4 - }, - { - "name": "Grass Land 4 - 8", - "level": 1, - "stage": 4, - "room": 8, - "pointer": 2989794, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 4 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Grass Land 4 - Chao & Goku" - ], - "music": 8 - }, - { - "name": "Grass Land 4 - 9", - "level": 1, - "stage": 4, - "room": 9, - "pointer": 3043518, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 9, - "unkn2": 5, - "x": 696, - "y": 296, - "name": "Grass Land 4 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 4 - Animal 1", - "Grass Land 4 - Animal 2" - ], - "music": 38 - }, - { - "name": "Grass Land 4 - 10", - "level": 1, - "stage": 4, - "room": 10, - "pointer": 2888425, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 4 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land 5 - 0", - "level": 1, - "stage": 5, - "room": 0, - "pointer": 3303565, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Broom Hatter", - "Bouncy" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 120, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Grass Land 5 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 13, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ], - [ - 6, - 23 - ], - [ - 11, - 16 - ], - [ - 89, - 16 - ] - ], - "locations": [ - "Grass Land 5 - Enemy 1 (Propeller)", - "Grass Land 5 - Enemy 2 (Broom Hatter)", - "Grass Land 5 - Enemy 3 (Bouncy)", - "Grass Land 5 - Star 1", - "Grass Land 5 - Star 2", - "Grass Land 5 - Star 3", - "Grass Land 5 - Star 4", - "Grass Land 5 - Star 5", - "Grass Land 5 - Star 6", - "Grass Land 5 - Star 7", - "Grass Land 5 - Star 8" - ], - "music": 11 - }, - { - "name": "Grass Land 5 - 1", - "level": 1, - "stage": 5, - "room": 1, - "pointer": 3048718, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 18, - "unkn2": 4, - "x": 184, - "y": 152, - "name": "Grass Land 5 - 1 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 21, - "unkn2": 4, - "x": 184, - "y": 152, - "name": "Grass Land 5 - 1 Exit 1", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 36, - "unkn2": 9, - "x": 56, - "y": 88, - "name": "Grass Land 5 - 1 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 27, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 5 - Enemy 4 (Sir Kibble)", - "Grass Land 5 - Star 9", - "Grass Land 5 - Star 10" - ], - "music": 11 - }, - { - "name": "Grass Land 5 - 2", - "level": 1, - "stage": 5, - "room": 2, - "pointer": 3327019, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Sasuke", - "Nruff" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 121, - "unkn2": 6, - "x": 56, - "y": 72, - "name": "Grass Land 5 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 30, - 16 - ], - [ - 15, - 16 - ], - [ - 1, - 16 - ] - ], - "locations": [ - "Grass Land 5 - Enemy 5 (Waddle Dee)", - "Grass Land 5 - Enemy 6 (Sasuke)", - "Grass Land 5 - Enemy 7 (Nruff)", - "Grass Land 5 - Star 11", - "Grass Land 5 - Star 12", - "Grass Land 5 - Star 13", - "Grass Land 5 - Star 14", - "Grass Land 5 - Star 15", - "Grass Land 5 - Star 16" - ], - "music": 11 - }, - { - "name": "Grass Land 5 - 3", - "level": 1, - "stage": 5, - "room": 3, - "pointer": 2966459, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 10, - "unkn2": 9, - "x": 312, - "y": 72, - "name": "Grass Land 5 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 5 - Animal 1", - "Grass Land 5 - Animal 2" - ], - "music": 38 - }, - { - "name": "Grass Land 5 - 4", - "level": 1, - "stage": 5, - "room": 4, - "pointer": 2973509, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 10, - "unkn2": 9, - "x": 360, - "y": 72, - "name": "Grass Land 5 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 5 - Animal 3", - "Grass Land 5 - Animal 4" - ], - "music": 38 - }, - { - "name": "Grass Land 5 - 5", - "level": 1, - "stage": 5, - "room": 5, - "pointer": 2962351, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 5 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Grass Land 5 - Mine" - ], - "music": 8 - }, - { - "name": "Grass Land 5 - 6", - "level": 1, - "stage": 5, - "room": 6, - "pointer": 2886738, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 5 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land 5 - 7", - "level": 1, - "stage": 5, - "room": 7, - "pointer": 3255423, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Tick" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 96, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Grass Land 5 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 48, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 5 - Enemy 8 (Tick)", - "Grass Land 5 - Star 17", - "Grass Land 5 - Star 18", - "Grass Land 5 - Star 19", - "Grass Land 5 - Star 20", - "Grass Land 5 - Star 21", - "Grass Land 5 - Star 22", - "Grass Land 5 - Star 23", - "Grass Land 5 - Star 24", - "Grass Land 5 - Star 25", - "Grass Land 5 - Star 26", - "Grass Land 5 - Star 27", - "Grass Land 5 - Star 28", - "Grass Land 5 - Star 29" - ], - "music": 11 - }, - { - "name": "Grass Land 6 - 0", - "level": 1, - "stage": 6, - "room": 0, - "pointer": 3376872, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Como", - "Togezo", - "Bronto Burt", - "Cappy" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 51, - "unkn2": 9, - "x": 216, - "y": 152, - "name": "Grass Land 6 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 96, - "unkn2": 9, - "x": 216, - "y": 1144, - "name": "Grass Land 6 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 12, - 16 - ], - [ - 18, - 16 - ], - [ - 2, - 16 - ], - [ - 41, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 6 - Enemy 1 (Como)", - "Grass Land 6 - Enemy 2 (Togezo)", - "Grass Land 6 - Enemy 3 (Bronto Burt)", - "Grass Land 6 - Enemy 4 (Cappy)", - "Grass Land 6 - Star 1", - "Grass Land 6 - Star 2", - "Grass Land 6 - Star 3", - "Grass Land 6 - Star 4", - "Grass Land 6 - Star 5", - "Grass Land 6 - Star 6", - "Grass Land 6 - Star 7", - "Grass Land 6 - Star 8", - "Grass Land 6 - Star 9" - ], - "music": 20 - }, - { - "name": "Grass Land 6 - 1", - "level": 1, - "stage": 6, - "room": 1, - "pointer": 3395125, - "animal_pointers": [], - "consumables": [ - { - "idx": 10, - "pointer": 192, - "x": 104, - "y": 1144, - "etype": 22, - "vtype": 0, - "name": "Grass Land 6 - 1-Up (Tower)" - } - ], - "consumables_pointer": 256, - "enemies": [ - "Bobo", - "Mariel" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 16, - "unkn2": 5, - "x": 72, - "y": 88, - "name": "Grass Land 6 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 16 - ], - [ - 5, - 19 - ], - [ - 45, - 16 - ], - [ - 0, - 22 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ], - [ - 55, - 16 - ] - ], - "locations": [ - "Grass Land 6 - Enemy 5 (Bobo)", - "Grass Land 6 - Enemy 6 (Mariel)", - "Grass Land 6 - Star 10", - "Grass Land 6 - Star 11", - "Grass Land 6 - Star 12", - "Grass Land 6 - Star 13", - "Grass Land 6 - Star 14", - "Grass Land 6 - 1-Up (Tower)" - ], - "music": 20 - }, - { - "name": "Grass Land 6 - 2", - "level": 1, - "stage": 6, - "room": 2, - "pointer": 3375177, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Yaban", - "Broom Hatter" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 93, - "unkn2": 6, - "x": 200, - "y": 152, - "name": "Grass Land 6 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 49, - "unkn2": 7, - "x": 216, - "y": 104, - "name": "Grass Land 6 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 11, - 16 - ], - [ - 45, - 16 - ], - [ - 41, - 16 - ], - [ - 4, - 22 - ], - [ - 32, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 6 - Enemy 7 (Yaban)", - "Grass Land 6 - Enemy 8 (Broom Hatter)", - "Grass Land 6 - Star 15", - "Grass Land 6 - Star 16" - ], - "music": 20 - }, - { - "name": "Grass Land 6 - 3", - "level": 1, - "stage": 6, - "room": 3, - "pointer": 3322977, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Apolo", - "Sasuke" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 12, - "unkn2": 52, - "x": 72, - "y": 104, - "name": "Grass Land 6 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 41, - 16 - ], - [ - 49, - 16 - ], - [ - 30, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Grass Land 6 - Enemy 9 (Apolo)", - "Grass Land 6 - Enemy 10 (Sasuke)", - "Grass Land 6 - Star 17", - "Grass Land 6 - Star 18", - "Grass Land 6 - Star 19", - "Grass Land 6 - Star 20", - "Grass Land 6 - Star 21", - "Grass Land 6 - Star 22", - "Grass Land 6 - Star 23", - "Grass Land 6 - Star 24", - "Grass Land 6 - Star 25" - ], - "music": 20 - }, - { - "name": "Grass Land 6 - 4", - "level": 1, - "stage": 6, - "room": 4, - "pointer": 3490819, - "animal_pointers": [], - "consumables": [ - { - "idx": 33, - "pointer": 192, - "x": 40, - "y": 104, - "etype": 22, - "vtype": 1, - "name": "Grass Land 6 - 1-Up (Falling)" - } - ], - "consumables_pointer": 176, - "enemies": [ - "Rocky" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 145, - "unkn2": 6, - "x": 56, - "y": 152, - "name": "Grass Land 6 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 16 - ], - [ - 4, - 22 - ], - [ - 49, - 16 - ], - [ - 61, - 16 - ], - [ - 3, - 16 - ], - [ - 1, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Grass Land 6 - Enemy 11 (Rocky)", - "Grass Land 6 - Star 26", - "Grass Land 6 - Star 27", - "Grass Land 6 - Star 28", - "Grass Land 6 - Star 29", - "Grass Land 6 - 1-Up (Falling)" - ], - "music": 20 - }, - { - "name": "Grass Land 6 - 5", - "level": 1, - "stage": 6, - "room": 5, - "pointer": 3076769, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Grass Land 6 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Grass Land 6 - Pierre" - ], - "music": 8 - }, - { - "name": "Grass Land 6 - 6", - "level": 1, - "stage": 6, - "room": 6, - "pointer": 3047576, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 12, - "unkn2": 9, - "x": 840, - "y": 152, - "name": "Grass Land 6 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 6 - Animal 1", - "Grass Land 6 - Animal 2" - ], - "music": 39 - }, - { - "name": "Grass Land 6 - 7", - "level": 1, - "stage": 6, - "room": 7, - "pointer": 3022909, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 12, - "unkn2": 6, - "x": 808, - "y": 120, - "name": "Grass Land 6 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Grass Land 6 - Animal 3", - "Grass Land 6 - Animal 4" - ], - "music": 38 - }, - { - "name": "Grass Land 6 - 8", - "level": 1, - "stage": 6, - "room": 8, - "pointer": 2884569, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Grass Land 6 - Complete" - ], - "music": 5 - }, - { - "name": "Grass Land Boss - 0", - "level": 1, - "stage": 7, - "room": 0, - "pointer": 2984105, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 0, - 18 - ] - ], - "locations": [ - "Grass Land - Boss (Whispy Woods) Purified", - "Level 1 Boss - Defeated", - "Level 1 Boss - Purified" - ], - "music": 2 - }, - { - "name": "Ripple Field 1 - 0", - "level": 2, - "stage": 1, - "room": 0, - "pointer": 3279855, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Glunk", - "Broom Hatter", - "Cappy" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 102, - "unkn2": 8, - "x": 56, - "y": 152, - "name": "Ripple Field 1 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 16, - 16 - ], - [ - 0, - 16 - ], - [ - 12, - 16 - ], - [ - 11, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 1 - Enemy 1 (Waddle Dee)", - "Ripple Field 1 - Enemy 2 (Glunk)", - "Ripple Field 1 - Enemy 3 (Broom Hatter)", - "Ripple Field 1 - Enemy 4 (Cappy)", - "Ripple Field 1 - Star 1", - "Ripple Field 1 - Star 2", - "Ripple Field 1 - Star 3", - "Ripple Field 1 - Star 4", - "Ripple Field 1 - Star 5", - "Ripple Field 1 - Star 6" - ], - "music": 15 - }, - { - "name": "Ripple Field 1 - 1", - "level": 2, - "stage": 1, - "room": 1, - "pointer": 3588688, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "Rocky", - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 3, - "unkn1": 146, - "unkn2": 11, - "x": 40, - "y": 232, - "name": "Ripple Field 1 - 1 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 73, - "unkn2": 16, - "x": 200, - "y": 184, - "name": "Ripple Field 1 - 1 Exit 1", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 108, - "unkn2": 16, - "x": 200, - "y": 184, - "name": "Ripple Field 1 - 1 Exit 2", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 138, - "unkn2": 16, - "x": 200, - "y": 184, - "name": "Ripple Field 1 - 1 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 11, - 16 - ], - [ - 2, - 16 - ], - [ - 3, - 16 - ], - [ - 7, - 16 - ] - ], - "locations": [ - "Ripple Field 1 - Enemy 5 (Bronto Burt)", - "Ripple Field 1 - Enemy 6 (Rocky)", - "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)" - ], - "music": 15 - }, - { - "name": "Ripple Field 1 - 2", - "level": 2, - "stage": 1, - "room": 2, - "pointer": 2955848, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 18, - "unkn2": 9, - "x": 56, - "y": 168, - "name": "Ripple Field 1 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 1 - Animal 1", - "Ripple Field 1 - Animal 2" - ], - "music": 40 - }, - { - "name": "Ripple Field 1 - 3", - "level": 2, - "stage": 1, - "room": 3, - "pointer": 3558828, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bobin" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 171, - "unkn2": 5, - "x": 40, - "y": 152, - "name": "Ripple Field 1 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 73, - 16 - ], - [ - 6, - 22 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 0, - 16 - ], - [ - 10, - 23 - ] - ], - "locations": [ - "Ripple Field 1 - Enemy 8 (Bobin)", - "Ripple Field 1 - Star 7", - "Ripple Field 1 - Star 8", - "Ripple Field 1 - Star 9", - "Ripple Field 1 - Star 10", - "Ripple Field 1 - Star 11", - "Ripple Field 1 - Star 12", - "Ripple Field 1 - Star 13", - "Ripple Field 1 - Star 14", - "Ripple Field 1 - Star 15", - "Ripple Field 1 - Star 16" - ], - "music": 15 - }, - { - "name": "Ripple Field 1 - 4", - "level": 2, - "stage": 1, - "room": 4, - "pointer": 2974271, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 1 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 7, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Ripple Field 1 - Kamuribana" - ], - "music": 8 - }, - { - "name": "Ripple Field 1 - 5", - "level": 2, - "stage": 1, - "room": 5, - "pointer": 3051513, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 11, - "unkn2": 11, - "x": 1192, - "y": 264, - "name": "Ripple Field 1 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 7, - 19 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 1 - Star 17", - "Ripple Field 1 - Star 18" - ], - "music": 15 - }, - { - "name": "Ripple Field 1 - 6", - "level": 2, - "stage": 1, - "room": 6, - "pointer": 3049838, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 11, - "unkn2": 11, - "x": 1752, - "y": 264, - "name": "Ripple Field 1 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 7, - 19 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 1 - Star 19" - ], - "music": 15 - }, - { - "name": "Ripple Field 1 - 7", - "level": 2, - "stage": 1, - "room": 7, - "pointer": 3066407, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 11, - "unkn2": 11, - "x": 2232, - "y": 264, - "name": "Ripple Field 1 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 7, - 19 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 1 - 8", - "level": 2, - "stage": 1, - "room": 8, - "pointer": 2889148, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 1 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field 2 - 0", - "level": 2, - "stage": 2, - "room": 0, - "pointer": 3342336, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Togezo", - "Coconut", - "Blipper", - "Sasuke" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 103, - "unkn2": 15, - "x": 56, - "y": 104, - "name": "Ripple Field 2 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 22 - ], - [ - 34, - 16 - ], - [ - 30, - 16 - ], - [ - 21, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 18, - 16 - ] - ], - "locations": [ - "Ripple Field 2 - Enemy 1 (Togezo)", - "Ripple Field 2 - Enemy 2 (Coconut)", - "Ripple Field 2 - Enemy 3 (Blipper)", - "Ripple Field 2 - Enemy 4 (Sasuke)", - "Ripple Field 2 - Star 1", - "Ripple Field 2 - Star 2", - "Ripple Field 2 - Star 3", - "Ripple Field 2 - Star 4" - ], - "music": 10 - }, - { - "name": "Ripple Field 2 - 1", - "level": 2, - "stage": 2, - "room": 1, - "pointer": 3084099, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 23, - "unkn2": 8, - "x": 72, - "y": 248, - "name": "Ripple Field 2 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 2 - Animal 1", - "Ripple Field 2 - Animal 2" - ], - "music": 39 - }, - { - "name": "Ripple Field 2 - 2", - "level": 2, - "stage": 2, - "room": 2, - "pointer": 3451207, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kany" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 31, - "unkn2": 5, - "x": 72, - "y": 152, - "name": "Ripple Field 2 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 96, - "unkn2": 6, - "x": 56, - "y": 152, - "name": "Ripple Field 2 - 2 Exit 1", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 56, - "unkn2": 17, - "x": 136, - "y": 264, - "name": "Ripple Field 2 - 2 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 16 - ], - [ - 47, - 16 - ], - [ - 1, - 16 - ], - [ - 46, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 2 - Enemy 5 (Kany)", - "Ripple Field 2 - Star 5", - "Ripple Field 2 - Star 6", - "Ripple Field 2 - Star 7", - "Ripple Field 2 - Star 8" - ], - "music": 10 - }, - { - "name": "Ripple Field 2 - 3", - "level": 2, - "stage": 2, - "room": 3, - "pointer": 3674327, - "animal_pointers": [], - "consumables": [ - { - "idx": 11, - "pointer": 480, - "x": 1384, - "y": 200, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 2 - Maxim Tomato (Currents)" - }, - { - "idx": 10, - "pointer": 520, - "x": 1456, - "y": 200, - "etype": 22, - "vtype": 0, - "name": "Ripple Field 2 - 1-Up (Currents)" - } - ], - "consumables_pointer": 128, - "enemies": [ - "Glunk" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 134, - "unkn2": 5, - "x": 40, - "y": 136, - "name": "Ripple Field 2 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 22 - ], - [ - 2, - 22 - ], - [ - 14, - 23 - ], - [ - 16, - 16 - ], - [ - 21, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Ripple Field 2 - Enemy 6 (Glunk)", - "Ripple Field 2 - Star 9", - "Ripple Field 2 - Star 10", - "Ripple Field 2 - Star 11", - "Ripple Field 2 - Star 12", - "Ripple Field 2 - Star 13", - "Ripple Field 2 - Star 14", - "Ripple Field 2 - Star 15", - "Ripple Field 2 - Star 16", - "Ripple Field 2 - Star 17", - "Ripple Field 2 - Maxim Tomato (Currents)", - "Ripple Field 2 - 1-Up (Currents)" - ], - "music": 10 - }, - { - "name": "Ripple Field 2 - 4", - "level": 2, - "stage": 2, - "room": 4, - "pointer": 2972744, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 3, - "unkn2": 9, - "x": 520, - "y": 88, - "name": "Ripple Field 2 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 8, - 19 - ] - ], - "locations": [], - "music": 10 - }, - { - "name": "Ripple Field 2 - 5", - "level": 2, - "stage": 2, - "room": 5, - "pointer": 3109710, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 16, - "unkn2": 16, - "x": 1048, - "y": 280, - "name": "Ripple Field 2 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 2 - Animal 3", - "Ripple Field 2 - Animal 4" - ], - "music": 38 - }, - { - "name": "Ripple Field 2 - 6", - "level": 2, - "stage": 2, - "room": 6, - "pointer": 2973127, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 2 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 8, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Ripple Field 2 - Bakasa" - ], - "music": 8 - }, - { - "name": "Ripple Field 2 - 7", - "level": 2, - "stage": 2, - "room": 7, - "pointer": 2890353, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 2 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field 3 - 0", - "level": 2, - "stage": 3, - "room": 0, - "pointer": 3517254, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Raft Waddle Dee", - "Kapar", - "Blipper" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 105, - "unkn2": 8, - "x": 40, - "y": 104, - "name": "Ripple Field 3 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 21, - 16 - ], - [ - 57, - 16 - ], - [ - 62, - 16 - ], - [ - 67, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", - "Ripple Field 3 - Enemy 2 (Kapar)", - "Ripple Field 3 - Enemy 3 (Blipper)", - "Ripple Field 3 - Star 1", - "Ripple Field 3 - Star 2", - "Ripple Field 3 - Star 3", - "Ripple Field 3 - Star 4" - ], - "music": 18 - }, - { - "name": "Ripple Field 3 - 1", - "level": 2, - "stage": 3, - "room": 1, - "pointer": 3604480, - "animal_pointers": [], - "consumables": [ - { - "idx": 10, - "pointer": 320, - "x": 832, - "y": 152, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 3 - Maxim Tomato (Cove)" - }, - { - "idx": 13, - "pointer": 424, - "x": 1128, - "y": 384, - "etype": 22, - "vtype": 0, - "name": "Ripple Field 3 - 1-Up (Cutter/Spark)" - } - ], - "consumables_pointer": 160, - "enemies": [ - "Sparky", - "Glunk", - "Joe" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 80, - "unkn2": 24, - "x": 104, - "y": 328, - "name": "Ripple Field 3 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 13, - 23 - ], - [ - 14, - 23 - ], - [ - 91, - 16 - ], - [ - 16, - 16 - ], - [ - 2, - 22 - ], - [ - 8, - 16 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Ripple Field 3 - Enemy 4 (Sparky)", - "Ripple Field 3 - Enemy 5 (Glunk)", - "Ripple Field 3 - Enemy 6 (Joe)", - "Ripple Field 3 - Star 5", - "Ripple Field 3 - Star 6", - "Ripple Field 3 - Star 7", - "Ripple Field 3 - Star 8", - "Ripple Field 3 - Star 9", - "Ripple Field 3 - Star 10", - "Ripple Field 3 - Star 11", - "Ripple Field 3 - Maxim Tomato (Cove)", - "Ripple Field 3 - 1-Up (Cutter/Spark)" - ], - "music": 18 - }, - { - "name": "Ripple Field 3 - 2", - "level": 2, - "stage": 3, - "room": 2, - "pointer": 3715428, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bobo" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 118, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Ripple Field 3 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 91, - 16 - ], - [ - 16, - 16 - ], - [ - 21, - 16 - ], - [ - 4, - 22 - ], - [ - 46, - 16 - ], - [ - 47, - 16 - ], - [ - 5, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 3 - Enemy 7 (Bobo)", - "Ripple Field 3 - Star 12", - "Ripple Field 3 - Star 13", - "Ripple Field 3 - Star 14", - "Ripple Field 3 - Star 15", - "Ripple Field 3 - Star 16", - "Ripple Field 3 - Star 17", - "Ripple Field 3 - Star 18", - "Ripple Field 3 - Star 19", - "Ripple Field 3 - Star 20", - "Ripple Field 3 - Star 21" - ], - "music": 18 - }, - { - "name": "Ripple Field 3 - 3", - "level": 2, - "stage": 3, - "room": 3, - "pointer": 3071919, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 15, - "unkn2": 6, - "x": 56, - "y": 104, - "name": "Ripple Field 3 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 3 - Animal 1", - "Ripple Field 3 - Animal 2" - ], - "music": 39 - }, - { - "name": "Ripple Field 3 - 4", - "level": 2, - "stage": 3, - "room": 4, - "pointer": 2970810, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 3 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 9, - 19 - ] - ], - "locations": [ - "Ripple Field 3 - Elieel" - ], - "music": 8 - }, - { - "name": "Ripple Field 3 - 5", - "level": 2, - "stage": 3, - "room": 5, - "pointer": 2987502, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 15, - "unkn2": 9, - "x": 232, - "y": 88, - "name": "Ripple Field 3 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 9, - 19 - ] - ], - "locations": [], - "music": 31 - }, - { - "name": "Ripple Field 3 - 6", - "level": 2, - "stage": 3, - "room": 6, - "pointer": 2888666, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 3 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field 3 - 7", - "level": 2, - "stage": 3, - "room": 7, - "pointer": 3161120, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 3, - "unkn2": 5, - "x": 40, - "y": 152, - "name": "Ripple Field 3 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 11, - "unkn2": 20, - "x": 56, - "y": 216, - "name": "Ripple Field 3 - 7 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 57, - 16 - ] - ], - "locations": [], - "music": 18 - }, - { - "name": "Ripple Field 4 - 0", - "level": 2, - "stage": 4, - "room": 0, - "pointer": 3082540, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Stone)", - "Bukiset (Needle)", - "Bukiset (Clean)", - "Bukiset (Parasol)", - "Mony" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 4, - "unkn2": 16, - "x": 72, - "y": 232, - "name": "Ripple Field 4 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 79, - 16 - ], - [ - 80, - 16 - ], - [ - 81, - 16 - ], - [ - 4, - 22 - ], - [ - 20, - 16 - ], - [ - 77, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 1 (Bukiset (Stone))", - "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", - "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", - "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", - "Ripple Field 4 - Enemy 5 (Mony)", - "Ripple Field 4 - Star 1", - "Ripple Field 4 - Star 2", - "Ripple Field 4 - Star 3", - "Ripple Field 4 - Star 4", - "Ripple Field 4 - Star 5" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 1", - "level": 2, - "stage": 4, - "room": 1, - "pointer": 2964846, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 14, - "unkn2": 8, - "x": 72, - "y": 88, - "name": "Ripple Field 4 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 27 - ] - ], - "locations": [ - "Ripple Field 4 - Miniboss 1 (Captain Stitch)" - ], - "music": 4 - }, - { - "name": "Ripple Field 4 - 2", - "level": 2, - "stage": 4, - "room": 2, - "pointer": 3018503, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Burning)" - ], - "default_exits": [ - { - "room": 11, - "unkn1": 25, - "unkn2": 5, - "x": 56, - "y": 88, - "name": "Ripple Field 4 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 25, - "unkn2": 15, - "x": 56, - "y": 216, - "name": "Ripple Field 4 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 19 - ], - [ - 76, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 6 (Bukiset (Burning))" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 3", - "level": 2, - "stage": 4, - "room": 3, - "pointer": 2988166, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 4 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Ripple Field 4 - Toad & Little Toad" - ], - "music": 8 - }, - { - "name": "Ripple Field 4 - 4", - "level": 2, - "stage": 4, - "room": 4, - "pointer": 2885533, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 4 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field 4 - 5", - "level": 2, - "stage": 4, - "room": 5, - "pointer": 3042349, - "animal_pointers": [ - 222, - 230, - 238 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 5, - "unkn2": 5, - "x": 360, - "y": 120, - "name": "Ripple Field 4 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 15, - "unkn2": 5, - "x": 488, - "y": 120, - "name": "Ripple Field 4 - 5 Exit 1", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 16, - "unkn2": 5, - "x": 104, - "y": 88, - "name": "Ripple Field 4 - 5 Exit 2", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 10, - "unkn2": 11, - "x": 440, - "y": 216, - "name": "Ripple Field 4 - 5 Exit 3", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 4 - Animal 1", - "Ripple Field 4 - Animal 2", - "Ripple Field 4 - Animal 3" - ], - "music": 40 - }, - { - "name": "Ripple Field 4 - 6", - "level": 2, - "stage": 4, - "room": 6, - "pointer": 3234805, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bobin", - "Blipper" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 21, - "unkn2": 7, - "x": 104, - "y": 88, - "name": "Ripple Field 4 - 6 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 31, - "unkn2": 7, - "x": 232, - "y": 88, - "name": "Ripple Field 4 - 6 Exit 1", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 26, - "unkn2": 13, - "x": 184, - "y": 184, - "name": "Ripple Field 4 - 6 Exit 2", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 48, - "unkn2": 15, - "x": 88, - "y": 216, - "name": "Ripple Field 4 - 6 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 73, - 16 - ], - [ - 14, - 23 - ], - [ - 21, - 16 - ], - [ - 13, - 23 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 7 (Bobin)", - "Ripple Field 4 - Enemy 8 (Blipper)", - "Ripple Field 4 - Star 6", - "Ripple Field 4 - Star 7" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 7", - "level": 2, - "stage": 4, - "room": 7, - "pointer": 3155468, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 11, - "unkn2": 6, - "x": 104, - "y": 136, - "name": "Ripple Field 4 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 18, - "unkn2": 9, - "x": 72, - "y": 248, - "name": "Ripple Field 4 - 7 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 1, - 16 - ], - [ - 0, - 23 - ] - ], - "locations": [ - "Ripple Field 4 - Star 8", - "Ripple Field 4 - Star 9", - "Ripple Field 4 - Star 10", - "Ripple Field 4 - Star 11", - "Ripple Field 4 - Star 12", - "Ripple Field 4 - Star 13", - "Ripple Field 4 - Star 14", - "Ripple Field 4 - Star 15", - "Ripple Field 4 - Star 16", - "Ripple Field 4 - Star 17", - "Ripple Field 4 - Star 18", - "Ripple Field 4 - Star 19", - "Ripple Field 4 - Star 20", - "Ripple Field 4 - Star 21" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 8", - "level": 2, - "stage": 4, - "room": 8, - "pointer": 3350031, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Como", - "Oro" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 24, - "unkn2": 22, - "x": 184, - "y": 440, - "name": "Ripple Field 4 - 8 Exit 0", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 34, - "unkn2": 22, - "x": 296, - "y": 440, - "name": "Ripple Field 4 - 8 Exit 1", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 16, - "unkn2": 72, - "x": 168, - "y": 152, - "name": "Ripple Field 4 - 8 Exit 2", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 23, - "unkn2": 72, - "x": 120, - "y": 152, - "name": "Ripple Field 4 - 8 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 41, - 16 - ], - [ - 68, - 16 - ], - [ - 14, - 23 - ], - [ - 25, - 16 - ], - [ - 6, - 23 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 9 (Como)", - "Ripple Field 4 - Enemy 10 (Oro)", - "Ripple Field 4 - Star 22", - "Ripple Field 4 - Star 23", - "Ripple Field 4 - Star 24", - "Ripple Field 4 - Star 25", - "Ripple Field 4 - Star 26", - "Ripple Field 4 - Star 27", - "Ripple Field 4 - Star 28" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 9", - "level": 2, - "stage": 4, - "room": 9, - "pointer": 3050397, - "animal_pointers": [], - "consumables": [ - { - "idx": 29, - "pointer": 200, - "x": 88, - "y": 200, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 4 - Maxim Tomato (Stone)" - } - ], - "consumables_pointer": 176, - "enemies": [ - "Gansan" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 11, - "unkn2": 9, - "x": 264, - "y": 1144, - "name": "Ripple Field 4 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 75, - 16 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 11 (Gansan)", - "Ripple Field 4 - Maxim Tomato (Stone)" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 10", - "level": 2, - "stage": 4, - "room": 10, - "pointer": 3052069, - "animal_pointers": [], - "consumables": [ - { - "idx": 30, - "pointer": 192, - "x": 200, - "y": 200, - "etype": 22, - "vtype": 0, - "name": "Ripple Field 4 - 1-Up (Stone)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 6, - "unkn2": 9, - "x": 376, - "y": 1144, - "name": "Ripple Field 4 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 22 - ], - [ - 75, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - 1-Up (Stone)" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 11", - "level": 2, - "stage": 4, - "room": 11, - "pointer": 3386974, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Kapar", - "Squishy" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 146, - "unkn2": 13, - "x": 72, - "y": 152, - "name": "Ripple Field 4 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 22, - 16 - ], - [ - 67, - 16 - ], - [ - 14, - 23 - ], - [ - 62, - 16 - ], - [ - 0, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 12 (Waddle Dee)", - "Ripple Field 4 - Enemy 13 (Kapar)", - "Ripple Field 4 - Enemy 14 (Squishy)", - "Ripple Field 4 - Star 29", - "Ripple Field 4 - Star 30", - "Ripple Field 4 - Star 31", - "Ripple Field 4 - Star 32", - "Ripple Field 4 - Star 33", - "Ripple Field 4 - Star 34", - "Ripple Field 4 - Star 35", - "Ripple Field 4 - Star 36", - "Ripple Field 4 - Star 37", - "Ripple Field 4 - Star 38", - "Ripple Field 4 - Star 39", - "Ripple Field 4 - Star 40", - "Ripple Field 4 - Star 41", - "Ripple Field 4 - Star 42", - "Ripple Field 4 - Star 43" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 12", - "level": 2, - "stage": 4, - "room": 12, - "pointer": 3168339, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nidoo" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 67, - "unkn2": 7, - "x": 88, - "y": 1224, - "name": "Ripple Field 4 - 12 Exit 0", - "access_rule": [] - }, - { - "room": 13, - "unkn1": 75, - "unkn2": 7, - "x": 88, - "y": 136, - "name": "Ripple Field 4 - 12 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 59, - 16 - ], - [ - 13, - 23 - ], - [ - 28, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - Enemy 15 (Nidoo)" - ], - "music": 15 - }, - { - "name": "Ripple Field 4 - 13", - "level": 2, - "stage": 4, - "room": 13, - "pointer": 2958478, - "animal_pointers": [], - "consumables": [ - { - "idx": 54, - "pointer": 264, - "x": 216, - "y": 136, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 4 - Maxim Tomato (Dark)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 12, - "unkn1": 4, - "unkn2": 8, - "x": 1192, - "y": 120, - "name": "Ripple Field 4 - 13 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 2, - 22 - ], - [ - 59, - 16 - ] - ], - "locations": [ - "Ripple Field 4 - Star 44", - "Ripple Field 4 - Star 45", - "Ripple Field 4 - Star 46", - "Ripple Field 4 - Star 47", - "Ripple Field 4 - Star 48", - "Ripple Field 4 - Star 49", - "Ripple Field 4 - Star 50", - "Ripple Field 4 - Star 51", - "Ripple Field 4 - Maxim Tomato (Dark)" - ], - "music": 15 - }, - { - "name": "Ripple Field 5 - 0", - "level": 2, - "stage": 5, - "room": 0, - "pointer": 3240369, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 9, - "unkn2": 43, - "x": 88, - "y": 344, - "name": "Ripple Field 5 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 5 - Star 1", - "Ripple Field 5 - Star 2", - "Ripple Field 5 - Star 3", - "Ripple Field 5 - Star 4", - "Ripple Field 5 - Star 5", - "Ripple Field 5 - Star 6" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 1", - "level": 2, - "stage": 5, - "room": 1, - "pointer": 3547528, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 15, - "unkn2": 4, - "x": 184, - "y": 344, - "name": "Ripple Field 5 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 5 - Star 7", - "Ripple Field 5 - Star 8", - "Ripple Field 5 - Star 9", - "Ripple Field 5 - Star 10", - "Ripple Field 5 - Star 11", - "Ripple Field 5 - Star 12", - "Ripple Field 5 - Star 13", - "Ripple Field 5 - Star 14", - "Ripple Field 5 - Star 15", - "Ripple Field 5 - Star 16", - "Ripple Field 5 - Star 17" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 2", - "level": 2, - "stage": 5, - "room": 2, - "pointer": 3611327, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Glunk", - "Joe" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 95, - "unkn2": 21, - "x": 56, - "y": 184, - "name": "Ripple Field 5 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 91, - 16 - ], - [ - 16, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 5 - Enemy 1 (Glunk)", - "Ripple Field 5 - Enemy 2 (Joe)", - "Ripple Field 5 - Star 18", - "Ripple Field 5 - Star 19", - "Ripple Field 5 - Star 20", - "Ripple Field 5 - Star 21", - "Ripple Field 5 - Star 22", - "Ripple Field 5 - Star 23", - "Ripple Field 5 - Star 24", - "Ripple Field 5 - Star 25", - "Ripple Field 5 - Star 26", - "Ripple Field 5 - Star 27", - "Ripple Field 5 - Star 28", - "Ripple Field 5 - Star 29", - "Ripple Field 5 - Star 30", - "Ripple Field 5 - Star 31" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 3", - "level": 2, - "stage": 5, - "room": 3, - "pointer": 3926157, - "animal_pointers": [], - "consumables": [ - { - "idx": 32, - "pointer": 1258, - "x": 1488, - "y": 192, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 5 - Maxim Tomato (Currents)" - }, - { - "idx": 31, - "pointer": 1290, - "x": 1520, - "y": 192, - "etype": 22, - "vtype": 0, - "name": "Ripple Field 5 - 1-Up (Currents)" - } - ], - "consumables_pointer": 128, - "enemies": [ - "Bobin", - "Mony", - "Squishy" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 4, - "unkn2": 38, - "x": 152, - "y": 152, - "name": "Ripple Field 5 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 95, - "unkn2": 38, - "x": 248, - "y": 1064, - "name": "Ripple Field 5 - 3 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 22 - ], - [ - 2, - 22 - ], - [ - 6, - 22 - ], - [ - 14, - 23 - ], - [ - 1, - 16 - ], - [ - 73, - 16 - ], - [ - 22, - 16 - ], - [ - 20, - 16 - ] - ], - "locations": [ - "Ripple Field 5 - Enemy 3 (Bobin)", - "Ripple Field 5 - Enemy 4 (Mony)", - "Ripple Field 5 - Enemy 5 (Squishy)", - "Ripple Field 5 - Star 32", - "Ripple Field 5 - Star 33", - "Ripple Field 5 - Star 34", - "Ripple Field 5 - Star 35", - "Ripple Field 5 - Star 36", - "Ripple Field 5 - Star 37", - "Ripple Field 5 - Maxim Tomato (Currents)", - "Ripple Field 5 - 1-Up (Currents)" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 4", - "level": 2, - "stage": 5, - "room": 4, - "pointer": 3026639, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 14, - "unkn2": 4, - "x": 232, - "y": 152, - "name": "Ripple Field 5 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 5 - Animal 1" - ], - "music": 40 - }, - { - "name": "Ripple Field 5 - 5", - "level": 2, - "stage": 5, - "room": 5, - "pointer": 3207333, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 4, - "unkn2": 9, - "x": 56, - "y": 72, - "name": "Ripple Field 5 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 24, - "unkn2": 9, - "x": 120, - "y": 552, - "name": "Ripple Field 5 - 5 Exit 1", - "access_rule": [ - "Kine" - ] - } - ], - "entity_load": [ - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 5 - Star 38", - "Ripple Field 5 - Star 39", - "Ripple Field 5 - Star 40", - "Ripple Field 5 - Star 41", - "Ripple Field 5 - Star 42" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 6", - "level": 2, - "stage": 5, - "room": 6, - "pointer": 3485896, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Yaban", - "Broom Hatter", - "Bouncy" - ], - "default_exits": [ - { - "room": 9, - "unkn1": 121, - "unkn2": 11, - "x": 56, - "y": 152, - "name": "Ripple Field 5 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 22 - ], - [ - 22, - 16 - ], - [ - 14, - 23 - ], - [ - 13, - 16 - ], - [ - 11, - 16 - ], - [ - 32, - 16 - ] - ], - "locations": [ - "Ripple Field 5 - Enemy 6 (Yaban)", - "Ripple Field 5 - Enemy 7 (Broom Hatter)", - "Ripple Field 5 - Enemy 8 (Bouncy)", - "Ripple Field 5 - Star 43", - "Ripple Field 5 - Star 44", - "Ripple Field 5 - Star 45" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 7", - "level": 2, - "stage": 5, - "room": 7, - "pointer": 3752698, - "animal_pointers": [], - "consumables": [ - { - "idx": 53, - "pointer": 418, - "x": 1512, - "y": 608, - "etype": 22, - "vtype": 2, - "name": "Ripple Field 5 - Maxim Tomato (Exit)" - } - ], - "consumables_pointer": 352, - "enemies": [ - "Sparky", - "Rocky", - "Babut" - ], - "default_exits": [ - { - "room": 10, - "unkn1": 45, - "unkn2": 31, - "x": 152, - "y": 152, - "name": "Ripple Field 5 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 94, - "unkn2": 40, - "x": 88, - "y": 200, - "name": "Ripple Field 5 - 7 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 16 - ], - [ - 43, - 16 - ], - [ - 8, - 16 - ], - [ - 22, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Ripple Field 5 - Enemy 9 (Sparky)", - "Ripple Field 5 - Enemy 10 (Rocky)", - "Ripple Field 5 - Enemy 11 (Babut)", - "Ripple Field 5 - Star 46", - "Ripple Field 5 - Star 47", - "Ripple Field 5 - Star 48", - "Ripple Field 5 - Star 49", - "Ripple Field 5 - Maxim Tomato (Exit)" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 8", - "level": 2, - "stage": 5, - "room": 8, - "pointer": 3044682, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 8, - "unkn2": 9, - "x": 88, - "y": 616, - "name": "Ripple Field 5 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 5 - Animal 2" - ], - "music": 39 - }, - { - "name": "Ripple Field 5 - 9", - "level": 2, - "stage": 5, - "room": 9, - "pointer": 2963193, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 5 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 11, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Ripple Field 5 - Mama Pitch" - ], - "music": 8 - }, - { - "name": "Ripple Field 5 - 10", - "level": 2, - "stage": 5, - "room": 10, - "pointer": 3042934, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 8, - "unkn2": 9, - "x": 712, - "y": 504, - "name": "Ripple Field 5 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 5 - Enemy 12 (Galbo)", - "Ripple Field 5 - Star 50", - "Ripple Field 5 - Star 51" - ], - "music": 16 - }, - { - "name": "Ripple Field 5 - 11", - "level": 2, - "stage": 5, - "room": 11, - "pointer": 2886256, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 5 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field 6 - 0", - "level": 2, - "stage": 6, - "room": 0, - "pointer": 2949576, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kany" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 56, - "unkn2": 7, - "x": 40, - "y": 152, - "name": "Ripple Field 6 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 16 - ], - [ - 13, - 23 - ] - ], - "locations": [ - "Ripple Field 6 - Enemy 1 (Kany)" - ], - "music": 15 - }, - { - "name": "Ripple Field 6 - 1", - "level": 2, - "stage": 6, - "room": 1, - "pointer": 2971200, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 23, - "unkn2": 9, - "x": 56, - "y": 264, - "name": "Ripple Field 6 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 6 - Animal 1", - "Ripple Field 6 - Animal 2", - "Ripple Field 6 - Animal 3" - ], - "music": 38 - }, - { - "name": "Ripple Field 6 - 2", - "level": 2, - "stage": 6, - "room": 2, - "pointer": 3637749, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 95, - "unkn2": 9, - "x": 104, - "y": 872, - "name": "Ripple Field 6 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 50, - "unkn2": 22, - "x": 184, - "y": 88, - "name": "Ripple Field 6 - 2 Exit 1", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 45, - "unkn2": 26, - "x": 88, - "y": 88, - "name": "Ripple Field 6 - 2 Exit 2", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 55, - "unkn2": 26, - "x": 248, - "y": 88, - "name": "Ripple Field 6 - 2 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 52, - 16 - ], - [ - 13, - 23 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 6 - 3", - "level": 2, - "stage": 6, - "room": 3, - "pointer": 3092564, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 4, - "unkn2": 5, - "x": 744, - "y": 424, - "name": "Ripple Field 6 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 16, - "unkn2": 5, - "x": 872, - "y": 424, - "name": "Ripple Field 6 - 3 Exit 1", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 6 - 4", - "level": 2, - "stage": 6, - "room": 4, - "pointer": 3133247, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 10, - "unkn2": 5, - "x": 824, - "y": 360, - "name": "Ripple Field 6 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 12, - 19 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 6 - 5", - "level": 2, - "stage": 6, - "room": 5, - "pointer": 3507762, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 76, - "unkn2": 4, - "x": 680, - "y": 72, - "name": "Ripple Field 6 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 49, - "unkn2": 6, - "x": 440, - "y": 104, - "name": "Ripple Field 6 - 5 Exit 1", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 49, - "unkn2": 10, - "x": 440, - "y": 168, - "name": "Ripple Field 6 - 5 Exit 2", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 88, - "unkn2": 10, - "x": 104, - "y": 152, - "name": "Ripple Field 6 - 5 Exit 3", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 22, - "unkn2": 12, - "x": 200, - "y": 200, - "name": "Ripple Field 6 - 5 Exit 4", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 76, - "unkn2": 12, - "x": 680, - "y": 200, - "name": "Ripple Field 6 - 5 Exit 5", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 76, - "unkn2": 16, - "x": 680, - "y": 264, - "name": "Ripple Field 6 - 5 Exit 6", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 6 - 6", - "level": 2, - "stage": 6, - "room": 6, - "pointer": 3211264, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 4, - "unkn2": 10, - "x": 72, - "y": 168, - "name": "Ripple Field 6 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 23 - ] - ], - "locations": [], - "music": 15 - }, - { - "name": "Ripple Field 6 - 7", - "level": 2, - "stage": 6, - "room": 7, - "pointer": 3586039, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "KeKe", - "Kapar", - "Rocky", - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 5, - "unkn1": 134, - "unkn2": 16, - "x": 72, - "y": 168, - "name": "Ripple Field 6 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 3, - 16 - ], - [ - 67, - 16 - ], - [ - 51, - 16 - ], - [ - 7, - 16 - ] - ], - "locations": [ - "Ripple Field 6 - Enemy 2 (KeKe)", - "Ripple Field 6 - Enemy 3 (Kapar)", - "Ripple Field 6 - Enemy 4 (Rocky)", - "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)", - "Ripple Field 6 - Star 1", - "Ripple Field 6 - Star 2", - "Ripple Field 6 - Star 3", - "Ripple Field 6 - Star 4", - "Ripple Field 6 - Star 5", - "Ripple Field 6 - Star 6", - "Ripple Field 6 - Star 7", - "Ripple Field 6 - Star 8", - "Ripple Field 6 - Star 9", - "Ripple Field 6 - Star 10", - "Ripple Field 6 - Star 11", - "Ripple Field 6 - Star 12", - "Ripple Field 6 - Star 13", - "Ripple Field 6 - Star 14" - ], - "music": 15 - }, - { - "name": "Ripple Field 6 - 8", - "level": 2, - "stage": 6, - "room": 8, - "pointer": 3621483, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Coconut", - "Sasuke", - "Nruff" - ], - "default_exits": [ - { - "room": 10, - "unkn1": 70, - "unkn2": 11, - "x": 56, - "y": 152, - "name": "Ripple Field 6 - 8 Exit 0", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 26, - "unkn2": 54, - "x": 72, - "y": 152, - "name": "Ripple Field 6 - 8 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 89, - 16 - ], - [ - 15, - 16 - ], - [ - 30, - 16 - ], - [ - 34, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Ripple Field 6 - Enemy 6 (Propeller)", - "Ripple Field 6 - Enemy 7 (Coconut)", - "Ripple Field 6 - Enemy 8 (Sasuke)", - "Ripple Field 6 - Enemy 9 (Nruff)", - "Ripple Field 6 - Star 15", - "Ripple Field 6 - Star 16", - "Ripple Field 6 - Star 17", - "Ripple Field 6 - Star 18", - "Ripple Field 6 - Star 19", - "Ripple Field 6 - Star 20", - "Ripple Field 6 - Star 21", - "Ripple Field 6 - Star 22", - "Ripple Field 6 - Star 23" - ], - "music": 15 - }, - { - "name": "Ripple Field 6 - 9", - "level": 2, - "stage": 6, - "room": 9, - "pointer": 2954523, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 3, - "unkn2": 9, - "x": 408, - "y": 872, - "name": "Ripple Field 6 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Ripple Field 6 - Animal 4" - ], - "music": 39 - }, - { - "name": "Ripple Field 6 - 10", - "level": 2, - "stage": 6, - "room": 10, - "pointer": 3069438, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 15, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Ripple Field 6 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 12, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Ripple Field 6 - HB-002" - ], - "music": 8 - }, - { - "name": "Ripple Field 6 - 11", - "level": 2, - "stage": 6, - "room": 11, - "pointer": 2886497, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Ripple Field 6 - Complete" - ], - "music": 5 - }, - { - "name": "Ripple Field Boss - 0", - "level": 2, - "stage": 7, - "room": 0, - "pointer": 3157370, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 7, - 18 - ] - ], - "locations": [ - "Ripple Field - Boss (Acro) Purified", - "Level 2 Boss - Defeated", - "Level 2 Boss - Purified" - ], - "music": 2 - }, - { - "name": "Sand Canyon 1 - 0", - "level": 3, - "stage": 1, - "room": 0, - "pointer": 3524267, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "Galbo" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 196, - "unkn2": 7, - "x": 72, - "y": 152, - "name": "Sand Canyon 1 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 19 - ], - [ - 1, - 16 - ], - [ - 26, - 16 - ], - [ - 2, - 16 - ] - ], - "locations": [ - "Sand Canyon 1 - Enemy 1 (Bronto Burt)", - "Sand Canyon 1 - Enemy 2 (Galbo)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 1", - "level": 3, - "stage": 1, - "room": 1, - "pointer": 3163860, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 34, - "unkn2": 5, - "x": 104, - "y": 408, - "name": "Sand Canyon 1 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 1 - Animal 1", - "Sand Canyon 1 - Animal 2" - ], - "music": 38 - }, - { - "name": "Sand Canyon 1 - 2", - "level": 3, - "stage": 1, - "room": 2, - "pointer": 3512532, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Oro" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 73, - "unkn2": 6, - "x": 56, - "y": 120, - "name": "Sand Canyon 1 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 16 - ], - [ - 26, - 16 - ], - [ - 25, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ], - [ - 1, - 23 - ], - [ - 0, - 23 - ], - [ - 4, - 23 - ] - ], - "locations": [ - "Sand Canyon 1 - Enemy 3 (Oro)", - "Sand Canyon 1 - Star 1", - "Sand Canyon 1 - Star 2", - "Sand Canyon 1 - Star 3", - "Sand Canyon 1 - Star 4" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 3", - "level": 3, - "stage": 1, - "room": 3, - "pointer": 3719146, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky", - "Propeller", - "Gansan", - "Babut" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 25, - "unkn2": 73, - "x": 72, - "y": 280, - "name": "Sand Canyon 1 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 89, - 16 - ], - [ - 75, - 16 - ], - [ - 43, - 16 - ], - [ - 8, - 16 - ] - ], - "locations": [ - "Sand Canyon 1 - Enemy 4 (Sparky)", - "Sand Canyon 1 - Enemy 5 (Propeller)", - "Sand Canyon 1 - Enemy 6 (Gansan)", - "Sand Canyon 1 - Enemy 7 (Babut)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 4", - "level": 3, - "stage": 1, - "room": 4, - "pointer": 3421212, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Loud", - "Dogon", - "Bouncy", - "Pteran" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 196, - "unkn2": 8, - "x": 56, - "y": 152, - "name": "Sand Canyon 1 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 90, - 16 - ], - [ - 13, - 16 - ], - [ - 40, - 16 - ], - [ - 14, - 23 - ], - [ - 39, - 16 - ] - ], - "locations": [ - "Sand Canyon 1 - Enemy 8 (Loud)", - "Sand Canyon 1 - Enemy 9 (Dogon)", - "Sand Canyon 1 - Enemy 10 (Bouncy)", - "Sand Canyon 1 - Enemy 11 (Pteran)", - "Sand Canyon 1 - Star 5", - "Sand Canyon 1 - Star 6", - "Sand Canyon 1 - Star 7", - "Sand Canyon 1 - Star 8", - "Sand Canyon 1 - Star 9", - "Sand Canyon 1 - Star 10" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 5", - "level": 3, - "stage": 1, - "room": 5, - "pointer": 3203325, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Polof" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 32, - "unkn2": 9, - "x": 104, - "y": 152, - "name": "Sand Canyon 1 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 46, - "unkn2": 9, - "x": 56, - "y": 344, - "name": "Sand Canyon 1 - 5 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 9, - 16 - ] - ], - "locations": [ - "Sand Canyon 1 - Enemy 12 (Polof)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 6", - "level": 3, - "stage": 1, - "room": 6, - "pointer": 3138524, - "animal_pointers": [], - "consumables": [ - { - "idx": 23, - "pointer": 248, - "x": 168, - "y": 104, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 1 - 1-Up (Polof)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 5, - "unkn2": 9, - "x": 536, - "y": 152, - "name": "Sand Canyon 1 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Sand Canyon 1 - Star 11", - "Sand Canyon 1 - Star 12", - "Sand Canyon 1 - Star 13", - "Sand Canyon 1 - Star 14", - "Sand Canyon 1 - Star 15", - "Sand Canyon 1 - Star 16", - "Sand Canyon 1 - Star 17", - "Sand Canyon 1 - Star 18", - "Sand Canyon 1 - Star 19", - "Sand Canyon 1 - Star 20", - "Sand Canyon 1 - Star 21", - "Sand Canyon 1 - Star 22", - "Sand Canyon 1 - 1-Up (Polof)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 1 - 7", - "level": 3, - "stage": 1, - "room": 7, - "pointer": 2988822, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 15, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 1 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Sand Canyon 1 - Geromuzudake" - ], - "music": 8 - }, - { - "name": "Sand Canyon 1 - 8", - "level": 3, - "stage": 1, - "room": 8, - "pointer": 2885292, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 1 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon 2 - 0", - "level": 3, - "stage": 2, - "room": 0, - "pointer": 3668370, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "KeKe", - "Doka", - "Boten" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 178, - "unkn2": 8, - "x": 184, - "y": 104, - "name": "Sand Canyon 2 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 244, - "unkn2": 11, - "x": 56, - "y": 152, - "name": "Sand Canyon 2 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 35, - 16 - ], - [ - 33, - 16 - ], - [ - 14, - 23 - ], - [ - 51, - 16 - ], - [ - 47, - 16 - ], - [ - 46, - 16 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 1 (KeKe)", - "Sand Canyon 2 - Enemy 2 (Doka)", - "Sand Canyon 2 - Enemy 3 (Boten)", - "Sand Canyon 2 - Star 1", - "Sand Canyon 2 - Star 2", - "Sand Canyon 2 - Star 3", - "Sand Canyon 2 - Star 4", - "Sand Canyon 2 - Star 5", - "Sand Canyon 2 - Star 6", - "Sand Canyon 2 - Star 7", - "Sand Canyon 2 - Star 8", - "Sand Canyon 2 - Star 9", - "Sand Canyon 2 - Star 10", - "Sand Canyon 2 - Star 11" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 1", - "level": 3, - "stage": 2, - "room": 1, - "pointer": 2952738, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 10, - "unkn2": 6, - "x": 2872, - "y": 136, - "name": "Sand Canyon 2 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 2 - Animal 1", - "Sand Canyon 2 - Animal 2" - ], - "music": 40 - }, - { - "name": "Sand Canyon 2 - 2", - "level": 3, - "stage": 2, - "room": 2, - "pointer": 3531156, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller" - ], - "default_exits": [ - { - "room": 9, - "unkn1": 45, - "unkn2": 60, - "x": 88, - "y": 184, - "name": "Sand Canyon 2 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 23 - ], - [ - 89, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 4 (Propeller)", - "Sand Canyon 2 - Star 12", - "Sand Canyon 2 - Star 13", - "Sand Canyon 2 - Star 14", - "Sand Canyon 2 - Star 15", - "Sand Canyon 2 - Star 16", - "Sand Canyon 2 - Star 17" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 3", - "level": 3, - "stage": 2, - "room": 3, - "pointer": 3263731, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Sparky", - "Sasuke", - "Como" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 63, - "unkn2": 5, - "x": 88, - "y": 184, - "name": "Sand Canyon 2 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 68, - "unkn2": 5, - "x": 184, - "y": 184, - "name": "Sand Canyon 2 - 3 Exit 1", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 73, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Sand Canyon 2 - 3 Exit 2", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 130, - "unkn2": 9, - "x": 72, - "y": 312, - "name": "Sand Canyon 2 - 3 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 41, - 16 - ], - [ - 8, - 16 - ], - [ - 30, - 16 - ], - [ - 0, - 16 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 5 (Waddle Dee)", - "Sand Canyon 2 - Enemy 6 (Sparky)", - "Sand Canyon 2 - Enemy 7 (Sasuke)", - "Sand Canyon 2 - Enemy 8 (Como)" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 4", - "level": 3, - "stage": 2, - "room": 4, - "pointer": 3076300, - "animal_pointers": [], - "consumables": [ - { - "idx": 19, - "pointer": 228, - "x": 168, - "y": 72, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 2 - 1-Up (Enclave)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 5, - "unkn2": 11, - "x": 1016, - "y": 88, - "name": "Sand Canyon 2 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 10, - "unkn2": 11, - "x": 1112, - "y": 88, - "name": "Sand Canyon 2 - 4 Exit 1", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 15, - "unkn2": 11, - "x": 1176, - "y": 88, - "name": "Sand Canyon 2 - 4 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 0, - 22 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Sand Canyon 2 - Star 18", - "Sand Canyon 2 - Star 19", - "Sand Canyon 2 - 1-Up (Enclave)" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 5", - "level": 3, - "stage": 2, - "room": 5, - "pointer": 3302133, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Ice)", - "Bukiset (Needle)", - "Bukiset (Clean)", - "Bukiset (Parasol)", - "Bukiset (Spark)", - "Bukiset (Cutter)" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 63, - "unkn2": 15, - "x": 120, - "y": 216, - "name": "Sand Canyon 2 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 8, - "unkn1": 71, - "unkn2": 18, - "x": 152, - "y": 136, - "name": "Sand Canyon 2 - 5 Exit 1", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 130, - "unkn2": 19, - "x": 72, - "y": 952, - "name": "Sand Canyon 2 - 5 Exit 2", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 56, - "unkn2": 23, - "x": 88, - "y": 216, - "name": "Sand Canyon 2 - 5 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 80, - 16 - ], - [ - 78, - 16 - ], - [ - 81, - 16 - ], - [ - 83, - 16 - ], - [ - 79, - 16 - ], - [ - 82, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", - "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", - "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", - "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", - "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", - "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))", - "Sand Canyon 2 - Star 20", - "Sand Canyon 2 - Star 21", - "Sand Canyon 2 - Star 22", - "Sand Canyon 2 - Star 23", - "Sand Canyon 2 - Star 24", - "Sand Canyon 2 - Star 25", - "Sand Canyon 2 - Star 26", - "Sand Canyon 2 - Star 27", - "Sand Canyon 2 - Star 28", - "Sand Canyon 2 - Star 29", - "Sand Canyon 2 - Star 30", - "Sand Canyon 2 - Star 31", - "Sand Canyon 2 - Star 32", - "Sand Canyon 2 - Star 33" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 6", - "level": 3, - "stage": 2, - "room": 6, - "pointer": 3800612, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nidoo" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 17, - "unkn2": 13, - "x": 1144, - "y": 248, - "name": "Sand Canyon 2 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 15 (Nidoo)", - "Sand Canyon 2 - Star 34" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 7", - "level": 3, - "stage": 2, - "room": 7, - "pointer": 3073888, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 15, - "unkn2": 8, - "x": 1016, - "y": 296, - "name": "Sand Canyon 2 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 5, - "unkn2": 13, - "x": 904, - "y": 376, - "name": "Sand Canyon 2 - 7 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 19 - ] - ], - "locations": [], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 8", - "level": 3, - "stage": 2, - "room": 8, - "pointer": 3061270, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Mariel" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 19, - "unkn2": 13, - "x": 1256, - "y": 376, - "name": "Sand Canyon 2 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 45, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 16 (Mariel)", - "Sand Canyon 2 - Star 35" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 9", - "level": 3, - "stage": 2, - "room": 9, - "pointer": 3453286, - "animal_pointers": [], - "consumables": [ - { - "idx": 51, - "pointer": 240, - "x": 1408, - "y": 216, - "etype": 22, - "vtype": 2, - "name": "Sand Canyon 2 - Maxim Tomato (Underwater)" - } - ], - "consumables_pointer": 128, - "enemies": [ - "Yaban", - "Wapod", - "Squishy", - "Pteran" - ], - "default_exits": [ - { - "room": 10, - "unkn1": 246, - "unkn2": 10, - "x": 56, - "y": 152, - "name": "Sand Canyon 2 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 22, - 16 - ], - [ - 2, - 22 - ], - [ - 39, - 16 - ], - [ - 88, - 16 - ], - [ - 32, - 16 - ] - ], - "locations": [ - "Sand Canyon 2 - Enemy 17 (Yaban)", - "Sand Canyon 2 - Enemy 18 (Wapod)", - "Sand Canyon 2 - Enemy 19 (Squishy)", - "Sand Canyon 2 - Enemy 20 (Pteran)", - "Sand Canyon 2 - Star 36", - "Sand Canyon 2 - Star 37", - "Sand Canyon 2 - Star 38", - "Sand Canyon 2 - Star 39", - "Sand Canyon 2 - Star 40", - "Sand Canyon 2 - Star 41", - "Sand Canyon 2 - Star 42", - "Sand Canyon 2 - Star 43", - "Sand Canyon 2 - Star 44", - "Sand Canyon 2 - Star 45", - "Sand Canyon 2 - Star 46", - "Sand Canyon 2 - Star 47", - "Sand Canyon 2 - Star 48", - "Sand Canyon 2 - Maxim Tomato (Underwater)" - ], - "music": 21 - }, - { - "name": "Sand Canyon 2 - 10", - "level": 3, - "stage": 2, - "room": 10, - "pointer": 2994821, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 2 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Sand Canyon 2 - Auntie" - ], - "music": 8 - }, - { - "name": "Sand Canyon 2 - 11", - "level": 3, - "stage": 2, - "room": 11, - "pointer": 2891799, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 2 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon 3 - 0", - "level": 3, - "stage": 3, - "room": 0, - "pointer": 3544676, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble", - "Broom Hatter", - "Rocky", - "Gabon" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 6, - "unkn2": 57, - "x": 104, - "y": 152, - "name": "Sand Canyon 3 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 11, - "unkn2": 57, - "x": 200, - "y": 152, - "name": "Sand Canyon 3 - 0 Exit 1", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 16, - "unkn2": 57, - "x": 296, - "y": 152, - "name": "Sand Canyon 3 - 0 Exit 2", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 23, - "unkn2": 109, - "x": 104, - "y": 72, - "name": "Sand Canyon 3 - 0 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 24, - 16 - ], - [ - 3, - 16 - ], - [ - 11, - 16 - ], - [ - 27, - 16 - ] - ], - "locations": [ - "Sand Canyon 3 - Enemy 1 (Sir Kibble)", - "Sand Canyon 3 - Enemy 2 (Broom Hatter)", - "Sand Canyon 3 - Enemy 3 (Rocky)", - "Sand Canyon 3 - Enemy 4 (Gabon)" - ], - "music": 16 - }, - { - "name": "Sand Canyon 3 - 1", - "level": 3, - "stage": 3, - "room": 1, - "pointer": 2965655, - "animal_pointers": [ - 212, - 220, - 228 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 5, - "unkn2": 9, - "x": 88, - "y": 920, - "name": "Sand Canyon 3 - 1 Exit 0", - "access_rule": [] - }, - { - "room": 0, - "unkn1": 11, - "unkn2": 9, - "x": 168, - "y": 920, - "name": "Sand Canyon 3 - 1 Exit 1", - "access_rule": [] - }, - { - "room": 0, - "unkn1": 17, - "unkn2": 9, - "x": 248, - "y": 920, - "name": "Sand Canyon 3 - 1 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 3 - Animal 1", - "Sand Canyon 3 - Animal 2", - "Sand Canyon 3 - Animal 3" - ], - "music": 39 - }, - { - "name": "Sand Canyon 3 - 2", - "level": 3, - "stage": 3, - "room": 2, - "pointer": 3726270, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kany" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 184, - "unkn2": 20, - "x": 104, - "y": 232, - "name": "Sand Canyon 3 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 63, - 16 - ], - [ - 55, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 23 - ], - [ - 29, - 16 - ] - ], - "locations": [ - "Sand Canyon 3 - Enemy 5 (Kany)", - "Sand Canyon 3 - Star 1", - "Sand Canyon 3 - Star 2", - "Sand Canyon 3 - Star 3", - "Sand Canyon 3 - Star 4", - "Sand Canyon 3 - Star 5", - "Sand Canyon 3 - Star 6" - ], - "music": 16 - }, - { - "name": "Sand Canyon 3 - 3", - "level": 3, - "stage": 3, - "room": 3, - "pointer": 3416806, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 130, - "unkn2": 14, - "x": 40, - "y": 152, - "name": "Sand Canyon 3 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 16 - ], - [ - 6, - 23 - ], - [ - 5, - 23 - ] - ], - "locations": [ - "Sand Canyon 3 - Enemy 6 (Galbo)" - ], - "music": 16 - }, - { - "name": "Sand Canyon 3 - 4", - "level": 3, - "stage": 3, - "room": 4, - "pointer": 3564419, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Sasuke" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 135, - "unkn2": 11, - "x": 56, - "y": 152, - "name": "Sand Canyon 3 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 68, - 16 - ], - [ - 30, - 16 - ], - [ - 14, - 23 - ], - [ - 89, - 16 - ], - [ - 24, - 16 - ] - ], - "locations": [ - "Sand Canyon 3 - Enemy 7 (Propeller)", - "Sand Canyon 3 - Enemy 8 (Sasuke)", - "Sand Canyon 3 - Star 7", - "Sand Canyon 3 - Star 8", - "Sand Canyon 3 - Star 9", - "Sand Canyon 3 - Star 10" - ], - "music": 16 - }, - { - "name": "Sand Canyon 3 - 5", - "level": 3, - "stage": 3, - "room": 5, - "pointer": 2973891, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 3 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 16, - 19 - ] - ], - "locations": [ - "Sand Canyon 3 - Caramello" - ], - "music": 8 - }, - { - "name": "Sand Canyon 3 - 6", - "level": 3, - "stage": 3, - "room": 6, - "pointer": 3247969, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Wapod", - "Bobo", - "Babut", - "Magoo" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 95, - "unkn2": 8, - "x": 88, - "y": 424, - "name": "Sand Canyon 3 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 53, - 16 - ], - [ - 88, - 16 - ], - [ - 46, - 16 - ], - [ - 47, - 16 - ], - [ - 5, - 16 - ], - [ - 43, - 16 - ] - ], - "locations": [ - "Sand Canyon 3 - Enemy 9 (Wapod)", - "Sand Canyon 3 - Enemy 10 (Bobo)", - "Sand Canyon 3 - Enemy 11 (Babut)", - "Sand Canyon 3 - Enemy 12 (Magoo)" - ], - "music": 16 - }, - { - "name": "Sand Canyon 3 - 7", - "level": 3, - "stage": 3, - "room": 7, - "pointer": 2887702, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 3 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon 3 - 8", - "level": 3, - "stage": 3, - "room": 8, - "pointer": 2968057, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 14, - "unkn2": 9, - "x": 104, - "y": 120, - "name": "Sand Canyon 3 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 16, - 19 - ] - ], - "locations": [], - "music": 31 - }, - { - "name": "Sand Canyon 4 - 0", - "level": 3, - "stage": 4, - "room": 0, - "pointer": 3521954, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Popon Ball", - "Mariel", - "Chilly" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 95, - "unkn2": 8, - "x": 216, - "y": 88, - "name": "Sand Canyon 4 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 199, - "unkn2": 15, - "x": 104, - "y": 88, - "name": "Sand Canyon 4 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ], - [ - 45, - 16 - ], - [ - 6, - 23 - ], - [ - 50, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 4 - Enemy 1 (Popon Ball)", - "Sand Canyon 4 - Enemy 2 (Mariel)", - "Sand Canyon 4 - Enemy 3 (Chilly)", - "Sand Canyon 4 - Star 1", - "Sand Canyon 4 - Star 2", - "Sand Canyon 4 - Star 3", - "Sand Canyon 4 - Star 4", - "Sand Canyon 4 - Star 5", - "Sand Canyon 4 - Star 6", - "Sand Canyon 4 - Star 7", - "Sand Canyon 4 - Star 8", - "Sand Canyon 4 - Star 9", - "Sand Canyon 4 - Star 10", - "Sand Canyon 4 - Star 11" - ], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 1", - "level": 3, - "stage": 4, - "room": 1, - "pointer": 2956289, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 12, - "unkn2": 5, - "x": 1544, - "y": 136, - "name": "Sand Canyon 4 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 4 - Animal 1", - "Sand Canyon 4 - Animal 2", - "Sand Canyon 4 - Animal 3" - ], - "music": 39 - }, - { - "name": "Sand Canyon 4 - 2", - "level": 3, - "stage": 4, - "room": 2, - "pointer": 3505360, - "animal_pointers": [], - "consumables": [ - { - "idx": 11, - "pointer": 328, - "x": 2024, - "y": 72, - "etype": 22, - "vtype": 2, - "name": "Sand Canyon 4 - Maxim Tomato (Pacto)" - } - ], - "consumables_pointer": 160, - "enemies": [ - "Tick", - "Bronto Burt", - "Babut" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 149, - "unkn2": 14, - "x": 88, - "y": 216, - "name": "Sand Canyon 4 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 62, - 16 - ], - [ - 2, - 22 - ], - [ - 43, - 16 - ], - [ - 2, - 16 - ], - [ - 48, - 16 - ] - ], - "locations": [ - "Sand Canyon 4 - Enemy 4 (Tick)", - "Sand Canyon 4 - Enemy 5 (Bronto Burt)", - "Sand Canyon 4 - Enemy 6 (Babut)", - "Sand Canyon 4 - Maxim Tomato (Pacto)" - ], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 3", - "level": 3, - "stage": 4, - "room": 3, - "pointer": 3412361, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bobin", - "Joe", - "Mony", - "Blipper" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 115, - "unkn2": 6, - "x": 776, - "y": 120, - "name": "Sand Canyon 4 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 29, - "unkn2": 8, - "x": 72, - "y": 88, - "name": "Sand Canyon 4 - 3 Exit 1", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 105, - "unkn2": 14, - "x": 104, - "y": 216, - "name": "Sand Canyon 4 - 3 Exit 2", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 115, - "unkn2": 20, - "x": 776, - "y": 248, - "name": "Sand Canyon 4 - 3 Exit 3", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 64, - "unkn2": 21, - "x": 408, - "y": 232, - "name": "Sand Canyon 4 - 3 Exit 4", - "access_rule": [] - } - ], - "entity_load": [ - [ - 73, - 16 - ], - [ - 20, - 16 - ], - [ - 91, - 16 - ], - [ - 14, - 23 - ], - [ - 21, - 16 - ] - ], - "locations": [ - "Sand Canyon 4 - Enemy 7 (Bobin)", - "Sand Canyon 4 - Enemy 8 (Joe)", - "Sand Canyon 4 - Enemy 9 (Mony)", - "Sand Canyon 4 - Enemy 10 (Blipper)", - "Sand Canyon 4 - Star 12", - "Sand Canyon 4 - Star 13", - "Sand Canyon 4 - Star 14", - "Sand Canyon 4 - Star 15" - ], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 4", - "level": 3, - "stage": 4, - "room": 4, - "pointer": 3307804, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 60, - "unkn2": 6, - "x": 88, - "y": 104, - "name": "Sand Canyon 4 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 60, - "unkn2": 16, - "x": 88, - "y": 360, - "name": "Sand Canyon 4 - 4 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 21, - 16 - ], - [ - 20, - 16 - ], - [ - 91, - 16 - ], - [ - 73, - 16 - ] - ], - "locations": [], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 5", - "level": 3, - "stage": 4, - "room": 5, - "pointer": 2955407, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 16, - "unkn2": 13, - "x": 88, - "y": 232, - "name": "Sand Canyon 4 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 27 - ] - ], - "locations": [ - "Sand Canyon 4 - Miniboss 1 (Haboki)" - ], - "music": 4 - }, - { - "name": "Sand Canyon 4 - 6", - "level": 3, - "stage": 4, - "room": 6, - "pointer": 3094851, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 24, - "unkn2": 6, - "x": 56, - "y": 56, - "name": "Sand Canyon 4 - 6 Exit 0", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 24, - "unkn2": 14, - "x": 56, - "y": 104, - "name": "Sand Canyon 4 - 6 Exit 1", - "access_rule": [] - }, - { - "room": 7, - "unkn1": 24, - "unkn2": 22, - "x": 56, - "y": 152, - "name": "Sand Canyon 4 - 6 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 17, - 19 - ], - [ - 4, - 23 - ], - [ - 5, - 23 - ] - ], - "locations": [], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 7", - "level": 3, - "stage": 4, - "room": 7, - "pointer": 3483428, - "animal_pointers": [], - "consumables": [ - { - "idx": 25, - "pointer": 200, - "x": 344, - "y": 144, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 4 - 1-Up (Clean)" - }, - { - "idx": 26, - "pointer": 336, - "x": 1656, - "y": 144, - "etype": 22, - "vtype": 2, - "name": "Sand Canyon 4 - Maxim Tomato (Needle)" - } - ], - "consumables_pointer": 128, - "enemies": [ - "Togezo", - "Rocky", - "Bobo" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 266, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Sand Canyon 4 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 22 - ], - [ - 3, - 16 - ], - [ - 14, - 23 - ], - [ - 5, - 16 - ], - [ - 2, - 16 - ], - [ - 18, - 16 - ], - [ - 0, - 22 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Sand Canyon 4 - Enemy 11 (Togezo)", - "Sand Canyon 4 - Enemy 12 (Rocky)", - "Sand Canyon 4 - Enemy 13 (Bobo)", - "Sand Canyon 4 - Star 16", - "Sand Canyon 4 - Star 17", - "Sand Canyon 4 - Star 18", - "Sand Canyon 4 - Star 19", - "Sand Canyon 4 - Star 20", - "Sand Canyon 4 - Star 21", - "Sand Canyon 4 - Star 22", - "Sand Canyon 4 - Star 23", - "Sand Canyon 4 - 1-Up (Clean)", - "Sand Canyon 4 - Maxim Tomato (Needle)" - ], - "music": 18 - }, - { - "name": "Sand Canyon 4 - 8", - "level": 3, - "stage": 4, - "room": 8, - "pointer": 3002086, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 4 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 17, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Sand Canyon 4 - Donbe & Hikari" - ], - "music": 8 - }, - { - "name": "Sand Canyon 4 - 9", - "level": 3, - "stage": 4, - "room": 9, - "pointer": 2885774, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 4 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon 5 - 0", - "level": 3, - "stage": 5, - "room": 0, - "pointer": 3662486, - "animal_pointers": [], - "consumables": [ - { - "idx": 0, - "pointer": 450, - "x": 2256, - "y": 232, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 5 - 1-Up (Falling Block)" - } - ], - "consumables_pointer": 208, - "enemies": [ - "Wapod", - "Dogon", - "Tick" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 151, - "unkn2": 15, - "x": 184, - "y": 56, - "name": "Sand Canyon 5 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 83, - "unkn2": 16, - "x": 72, - "y": 120, - "name": "Sand Canyon 5 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 55, - 16 - ], - [ - 48, - 16 - ], - [ - 0, - 22 - ], - [ - 14, - 23 - ], - [ - 90, - 16 - ], - [ - 88, - 16 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 1 (Wapod)", - "Sand Canyon 5 - Enemy 2 (Dogon)", - "Sand Canyon 5 - Enemy 3 (Tick)", - "Sand Canyon 5 - Star 1", - "Sand Canyon 5 - Star 2", - "Sand Canyon 5 - Star 3", - "Sand Canyon 5 - Star 4", - "Sand Canyon 5 - Star 5", - "Sand Canyon 5 - Star 6", - "Sand Canyon 5 - Star 7", - "Sand Canyon 5 - Star 8", - "Sand Canyon 5 - Star 9", - "Sand Canyon 5 - Star 10", - "Sand Canyon 5 - 1-Up (Falling Block)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 5 - 1", - "level": 3, - "stage": 5, - "room": 1, - "pointer": 3052622, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Rocky", - "Bobo", - "Chilly", - "Sparky", - "Togezo" - ], - "default_exits": [ - { - "room": 9, - "unkn1": 6, - "unkn2": 9, - "x": 216, - "y": 1128, - "name": "Sand Canyon 5 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 16 - ], - [ - 6, - 16 - ], - [ - 3, - 16 - ], - [ - 8, - 16 - ], - [ - 18, - 16 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 4 (Rocky)", - "Sand Canyon 5 - Enemy 5 (Bobo)", - "Sand Canyon 5 - Enemy 6 (Chilly)", - "Sand Canyon 5 - Enemy 7 (Sparky)", - "Sand Canyon 5 - Enemy 8 (Togezo)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 5 - 2", - "level": 3, - "stage": 5, - "room": 2, - "pointer": 3057544, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 3, - "unkn2": 7, - "x": 1320, - "y": 264, - "name": "Sand Canyon 5 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 5 - Animal 1" - ], - "music": 40 - }, - { - "name": "Sand Canyon 5 - 3", - "level": 3, - "stage": 5, - "room": 3, - "pointer": 3419011, - "animal_pointers": [], - "consumables": [ - { - "idx": 11, - "pointer": 192, - "x": 56, - "y": 648, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 5 - 1-Up (Ice 2)" - }, - { - "idx": 14, - "pointer": 200, - "x": 56, - "y": 664, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 5 - 1-Up (Ice 3)" - }, - { - "idx": 15, - "pointer": 208, - "x": 56, - "y": 632, - "etype": 22, - "vtype": 0, - "name": "Sand Canyon 5 - 1-Up (Ice 1)" - }, - { - "idx": 12, - "pointer": 368, - "x": 320, - "y": 264, - "etype": 22, - "vtype": 2, - "name": "Sand Canyon 5 - Maxim Tomato (Pit)" - } - ], - "consumables_pointer": 304, - "enemies": [ - "Bronto Burt", - "Sasuke" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 12, - "unkn2": 66, - "x": 88, - "y": 88, - "name": "Sand Canyon 5 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ], - [ - 30, - 16 - ], - [ - 2, - 16 - ], - [ - 0, - 22 - ], - [ - 2, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 9 (Bronto Burt)", - "Sand Canyon 5 - Enemy 10 (Sasuke)", - "Sand Canyon 5 - Star 11", - "Sand Canyon 5 - Star 12", - "Sand Canyon 5 - Star 13", - "Sand Canyon 5 - Star 14", - "Sand Canyon 5 - Star 15", - "Sand Canyon 5 - Star 16", - "Sand Canyon 5 - Star 17", - "Sand Canyon 5 - 1-Up (Ice 2)", - "Sand Canyon 5 - 1-Up (Ice 3)", - "Sand Canyon 5 - 1-Up (Ice 1)", - "Sand Canyon 5 - Maxim Tomato (Pit)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 5 - 4", - "level": 3, - "stage": 5, - "room": 4, - "pointer": 3644149, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Oro", - "Galbo", - "Nidoo" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 76, - "unkn2": 9, - "x": 88, - "y": 120, - "name": "Sand Canyon 5 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 116, - "unkn2": 14, - "x": 200, - "y": 1256, - "name": "Sand Canyon 5 - 4 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 54, - 16 - ], - [ - 26, - 16 - ], - [ - 28, - 16 - ], - [ - 25, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 11 (Oro)", - "Sand Canyon 5 - Enemy 12 (Galbo)", - "Sand Canyon 5 - Enemy 13 (Nidoo)", - "Sand Canyon 5 - Star 18" - ], - "music": 13 - }, - { - "name": "Sand Canyon 5 - 5", - "level": 3, - "stage": 5, - "room": 5, - "pointer": 3044100, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 4, - "unkn2": 7, - "x": 1240, - "y": 152, - "name": "Sand Canyon 5 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 5 - Animal 2" - ], - "music": 39 - }, - { - "name": "Sand Canyon 5 - 6", - "level": 3, - "stage": 5, - "room": 6, - "pointer": 3373481, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 25, - "unkn2": 5, - "x": 56, - "y": 152, - "name": "Sand Canyon 5 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 31, - 16 - ], - [ - 89, - 16 - ], - [ - 6, - 16 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 14 (Propeller)" - ], - "music": 13 - }, - { - "name": "Sand Canyon 5 - 7", - "level": 3, - "stage": 5, - "room": 7, - "pointer": 2964028, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 5 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 18, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Sand Canyon 5 - Nyupun" - ], - "music": 8 - }, - { - "name": "Sand Canyon 5 - 8", - "level": 3, - "stage": 5, - "room": 8, - "pointer": 2890112, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 5 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon 5 - 9", - "level": 3, - "stage": 5, - "room": 9, - "pointer": 3647264, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble", - "KeKe", - "Kabu" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 12, - "unkn2": 6, - "x": 72, - "y": 760, - "name": "Sand Canyon 5 - 9 Exit 0", - "access_rule": [ - "Cutter" - ] - }, - { - "room": 1, - "unkn1": 12, - "unkn2": 70, - "x": 120, - "y": 152, - "name": "Sand Canyon 5 - 9 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 27, - 16 - ], - [ - 61, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ], - [ - 51, - 16 - ], - [ - 19, - 16 - ] - ], - "locations": [ - "Sand Canyon 5 - Enemy 15 (Sir Kibble)", - "Sand Canyon 5 - Enemy 16 (KeKe)", - "Sand Canyon 5 - Enemy 17 (Kabu)", - "Sand Canyon 5 - Star 19", - "Sand Canyon 5 - Star 20", - "Sand Canyon 5 - Star 21", - "Sand Canyon 5 - Star 22", - "Sand Canyon 5 - Star 23", - "Sand Canyon 5 - Star 24", - "Sand Canyon 5 - Star 25", - "Sand Canyon 5 - Star 26", - "Sand Canyon 5 - Star 27", - "Sand Canyon 5 - Star 28", - "Sand Canyon 5 - Star 29", - "Sand Canyon 5 - Star 30", - "Sand Canyon 5 - Star 31", - "Sand Canyon 5 - Star 32", - "Sand Canyon 5 - Star 33", - "Sand Canyon 5 - Star 34", - "Sand Canyon 5 - Star 35", - "Sand Canyon 5 - Star 36", - "Sand Canyon 5 - Star 37", - "Sand Canyon 5 - Star 38", - "Sand Canyon 5 - Star 39", - "Sand Canyon 5 - Star 40" - ], - "music": 13 - }, - { - "name": "Sand Canyon 6 - 0", - "level": 3, - "stage": 6, - "room": 0, - "pointer": 3314761, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky", - "Doka", - "Cappy", - "Pteran" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 132, - "unkn2": 16, - "x": 56, - "y": 136, - "name": "Sand Canyon 6 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 8, - 16 - ], - [ - 35, - 16 - ], - [ - 39, - 16 - ], - [ - 12, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 1 (Sparky)", - "Sand Canyon 6 - Enemy 2 (Doka)", - "Sand Canyon 6 - Enemy 3 (Cappy)", - "Sand Canyon 6 - Enemy 4 (Pteran)" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 1", - "level": 3, - "stage": 6, - "room": 1, - "pointer": 2976913, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 22, - "unkn1": 24, - "unkn2": 13, - "x": 168, - "y": 216, - "name": "Sand Canyon 6 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 6 - Animal 1", - "Sand Canyon 6 - Animal 2", - "Sand Canyon 6 - Animal 3" - ], - "music": 39 - }, - { - "name": "Sand Canyon 6 - 2", - "level": 3, - "stage": 6, - "room": 2, - "pointer": 2978757, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 55, - "unkn2": 6, - "x": 104, - "y": 104, - "name": "Sand Canyon 6 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 3", - "level": 3, - "stage": 6, - "room": 3, - "pointer": 3178082, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 3 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 3 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 3 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 3 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 3 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 3 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 3 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 4", - "level": 3, - "stage": 6, - "room": 4, - "pointer": 3181563, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 4 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 4 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 4 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 4 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 4 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 4 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 4 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 5", - "level": 3, - "stage": 6, - "room": 5, - "pointer": 3177209, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 5 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 5 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 5 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 5 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 5 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 5 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 5 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 6", - "level": 3, - "stage": 6, - "room": 6, - "pointer": 3183291, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 6 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 6 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 6 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 6 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 6 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 6 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 6 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 6 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 7", - "level": 3, - "stage": 6, - "room": 7, - "pointer": 3175453, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 7 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 7 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 7 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 7 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 7 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 7 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 7 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 8", - "level": 3, - "stage": 6, - "room": 8, - "pointer": 3179826, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 8 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 8 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 8 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 8 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 8 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 8 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 8 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 8 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 9", - "level": 3, - "stage": 6, - "room": 9, - "pointer": 3176334, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 9 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 9 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 9 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 9 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 9 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 9 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 9 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 9 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 10", - "level": 3, - "stage": 6, - "room": 10, - "pointer": 3178954, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 16, - "unkn2": 4, - "x": 184, - "y": 712, - "name": "Sand Canyon 6 - 10 Exit 0", - "access_rule": [] - }, - { - "room": 24, - "unkn1": 8, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 10 Exit 1", - "access_rule": [] - }, - { - "room": 31, - "unkn1": 24, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 10 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 16, - "x": 600, - "y": 104, - "name": "Sand Canyon 6 - 10 Exit 3", - "access_rule": [] - }, - { - "room": 12, - "unkn1": 28, - "unkn2": 16, - "x": 88, - "y": 136, - "name": "Sand Canyon 6 - 10 Exit 4", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 8, - "unkn2": 24, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 10 Exit 5", - "access_rule": [] - }, - { - "room": 19, - "unkn1": 24, - "unkn2": 24, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 10 Exit 6", - "access_rule": [] - }, - { - "room": 38, - "unkn1": 16, - "unkn2": 28, - "x": 168, - "y": 88, - "name": "Sand Canyon 6 - 10 Exit 7", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 11", - "level": 3, - "stage": 6, - "room": 11, - "pointer": 2989149, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 37, - "unkn2": 6, - "x": 88, - "y": 264, - "name": "Sand Canyon 6 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 59, - 16 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 12", - "level": 3, - "stage": 6, - "room": 12, - "pointer": 3015947, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 4, - "unkn2": 8, - "x": 440, - "y": 264, - "name": "Sand Canyon 6 - 12 Exit 0", - "access_rule": [] - }, - { - "room": 13, - "unkn1": 86, - "unkn2": 8, - "x": 72, - "y": 104, - "name": "Sand Canyon 6 - 12 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 64, - 16 - ], - [ - 59, - 16 - ], - [ - 55, - 16 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 13", - "level": 3, - "stage": 6, - "room": 13, - "pointer": 2976539, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 23, - "unkn1": 55, - "unkn2": 8, - "x": 56, - "y": 152, - "name": "Sand Canyon 6 - 13 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 14", - "level": 3, - "stage": 6, - "room": 14, - "pointer": 3030336, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 15, - "unkn1": 5, - "unkn2": 9, - "x": 200, - "y": 152, - "name": "Sand Canyon 6 - 14 Exit 0", - "access_rule": [] - }, - { - "room": 8, - "unkn1": 35, - "unkn2": 9, - "x": 152, - "y": 392, - "name": "Sand Canyon 6 - 14 Exit 1", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 15", - "level": 3, - "stage": 6, - "room": 15, - "pointer": 2972361, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 14, - "unkn1": 13, - "unkn2": 9, - "x": 104, - "y": 152, - "name": "Sand Canyon 6 - 15 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 16", - "level": 3, - "stage": 6, - "room": 16, - "pointer": 2953186, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 18, - "unkn1": 10, - "unkn2": 19, - "x": 248, - "y": 152, - "name": "Sand Canyon 6 - 16 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 10, - "unkn2": 44, - "x": 264, - "y": 88, - "name": "Sand Canyon 6 - 16 Exit 1", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 17", - "level": 3, - "stage": 6, - "room": 17, - "pointer": 2953633, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 18, - "unkn1": 10, - "unkn2": 19, - "x": 248, - "y": 152, - "name": "Sand Canyon 6 - 17 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 10, - "unkn2": 44, - "x": 264, - "y": 88, - "name": "Sand Canyon 6 - 17 Exit 1", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 18", - "level": 3, - "stage": 6, - "room": 18, - "pointer": 2991707, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 17, - "unkn1": 14, - "unkn2": 9, - "x": 184, - "y": 312, - "name": "Sand Canyon 6 - 18 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 19", - "level": 3, - "stage": 6, - "room": 19, - "pointer": 2974651, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 5, - "unkn2": 9, - "x": 376, - "y": 392, - "name": "Sand Canyon 6 - 19 Exit 0", - "access_rule": [] - }, - { - "room": 20, - "unkn1": 35, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Sand Canyon 6 - 19 Exit 1", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 20", - "level": 3, - "stage": 6, - "room": 20, - "pointer": 2969638, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 19, - "unkn1": 4, - "unkn2": 9, - "x": 552, - "y": 152, - "name": "Sand Canyon 6 - 20 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 21", - "level": 3, - "stage": 6, - "room": 21, - "pointer": 2976163, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 22, - "unkn1": 9, - "unkn2": 13, - "x": 296, - "y": 216, - "name": "Sand Canyon 6 - 21 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Sand Canyon 6 - Animal 4", - "Sand Canyon 6 - Animal 5", - "Sand Canyon 6 - Animal 6" - ], - "music": 40 - }, - { - "name": "Sand Canyon 6 - 22", - "level": 3, - "stage": 6, - "room": 22, - "pointer": 2950938, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 38, - "unkn1": 14, - "unkn2": 8, - "x": 168, - "y": 376, - "name": "Sand Canyon 6 - 22 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 9, - "unkn2": 13, - "x": 376, - "y": 216, - "name": "Sand Canyon 6 - 22 Exit 1", - "access_rule": [] - }, - { - "room": 21, - "unkn1": 19, - "unkn2": 13, - "x": 168, - "y": 216, - "name": "Sand Canyon 6 - 22 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 22 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 23", - "level": 3, - "stage": 6, - "room": 23, - "pointer": 3311993, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 43, - "unkn1": 145, - "unkn2": 7, - "x": 72, - "y": 152, - "name": "Sand Canyon 6 - 23 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 16 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 24", - "level": 3, - "stage": 6, - "room": 24, - "pointer": 3079078, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 39, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 24 Exit 0", - "access_rule": [] - }, - { - "room": 25, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 24 Exit 1", - "access_rule": [] - }, - { - "room": 39, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 24 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 25", - "level": 3, - "stage": 6, - "room": 25, - "pointer": 3065898, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 26, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 25 Exit 0", - "access_rule": [] - }, - { - "room": 40, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 25 Exit 1", - "access_rule": [] - }, - { - "room": 40, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 25 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 26", - "level": 3, - "stage": 6, - "room": 26, - "pointer": 3063347, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 41, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 26 Exit 0", - "access_rule": [] - }, - { - "room": 41, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 26 Exit 1", - "access_rule": [] - }, - { - "room": 27, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 26 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 27", - "level": 3, - "stage": 6, - "room": 27, - "pointer": 3066916, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 28, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 27 Exit 0", - "access_rule": [] - }, - { - "room": 42, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 27 Exit 1", - "access_rule": [] - }, - { - "room": 42, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 27 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 28", - "level": 3, - "stage": 6, - "room": 28, - "pointer": 3067425, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 29, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 344, - "name": "Sand Canyon 6 - 28 Exit 0", - "access_rule": [] - }, - { - "room": 29, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 344, - "name": "Sand Canyon 6 - 28 Exit 1", - "access_rule": [] - }, - { - "room": 29, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 344, - "name": "Sand Canyon 6 - 28 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 29", - "level": 3, - "stage": 6, - "room": 29, - "pointer": 2950032, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 30, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 136, - "name": "Sand Canyon 6 - 29 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 30", - "level": 3, - "stage": 6, - "room": 30, - "pointer": 2986500, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 10, - "unkn2": 44, - "x": 136, - "y": 152, - "name": "Sand Canyon 6 - 30 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 31", - "level": 3, - "stage": 6, - "room": 31, - "pointer": 3070930, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 32, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 31 Exit 0", - "access_rule": [] - }, - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 648, - "name": "Sand Canyon 6 - 31 Exit 1", - "access_rule": [] - }, - { - "room": 32, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 31 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 32", - "level": 3, - "stage": 6, - "room": 32, - "pointer": 3054817, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Parasol)", - "Bukiset (Cutter)" - ], - "default_exits": [ - { - "room": 33, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 32 Exit 0", - "access_rule": [] - }, - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 536, - "name": "Sand Canyon 6 - 32 Exit 1", - "access_rule": [] - }, - { - "room": 33, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 32 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 81, - 16 - ], - [ - 83, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", - "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 33", - "level": 3, - "stage": 6, - "room": 33, - "pointer": 3053173, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Clean)", - "Bukiset (Spark)" - ], - "default_exits": [ - { - "room": 34, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 33 Exit 0", - "access_rule": [] - }, - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 440, - "name": "Sand Canyon 6 - 33 Exit 1", - "access_rule": [] - }, - { - "room": 34, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 33 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 80, - 16 - ], - [ - 82, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", - "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 34", - "level": 3, - "stage": 6, - "room": 34, - "pointer": 3053721, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Ice)", - "Bukiset (Needle)" - ], - "default_exits": [ - { - "room": 35, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 34 Exit 0", - "access_rule": [] - }, - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 344, - "name": "Sand Canyon 6 - 34 Exit 1", - "access_rule": [] - }, - { - "room": 35, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 34 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 79, - 16 - ], - [ - 78, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", - "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 35", - "level": 3, - "stage": 6, - "room": 35, - "pointer": 3054269, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Burning)", - "Bukiset (Stone)" - ], - "default_exits": [ - { - "room": 37, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 344, - "name": "Sand Canyon 6 - 35 Exit 0", - "access_rule": [] - }, - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 248, - "name": "Sand Canyon 6 - 35 Exit 1", - "access_rule": [] - }, - { - "room": 37, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 344, - "name": "Sand Canyon 6 - 35 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 77, - 16 - ], - [ - 76, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", - "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 36", - "level": 3, - "stage": 6, - "room": 36, - "pointer": 2986164, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 10, - "unkn2": 44, - "x": 392, - "y": 152, - "name": "Sand Canyon 6 - 36 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 37", - "level": 3, - "stage": 6, - "room": 37, - "pointer": 3074377, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 36, - "unkn1": 11, - "unkn2": 8, - "x": 168, - "y": 152, - "name": "Sand Canyon 6 - 37 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 38", - "level": 3, - "stage": 6, - "room": 38, - "pointer": 2971589, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 10, - "unkn2": 5, - "x": 264, - "y": 440, - "name": "Sand Canyon 6 - 38 Exit 0", - "access_rule": [] - }, - { - "room": 22, - "unkn1": 10, - "unkn2": 23, - "x": 248, - "y": 136, - "name": "Sand Canyon 6 - 38 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 76, - 16 - ], - [ - 77, - 16 - ], - [ - 78, - 16 - ], - [ - 79, - 16 - ], - [ - 80, - 16 - ], - [ - 81, - 16 - ], - [ - 82, - 16 - ], - [ - 83, - 16 - ] - ], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 39", - "level": 3, - "stage": 6, - "room": 39, - "pointer": 3063858, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 40, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 39 Exit 0", - "access_rule": [] - }, - { - "room": 40, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 39 Exit 1", - "access_rule": [] - }, - { - "room": 40, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 39 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 40", - "level": 3, - "stage": 6, - "room": 40, - "pointer": 3064368, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 41, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 40 Exit 0", - "access_rule": [] - }, - { - "room": 41, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 40 Exit 1", - "access_rule": [] - }, - { - "room": 41, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 40 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 41", - "level": 3, - "stage": 6, - "room": 41, - "pointer": 3064878, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 42, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 328, - "name": "Sand Canyon 6 - 41 Exit 0", - "access_rule": [] - }, - { - "room": 42, - "unkn1": 11, - "unkn2": 8, - "x": 184, - "y": 328, - "name": "Sand Canyon 6 - 41 Exit 1", - "access_rule": [] - }, - { - "room": 42, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 328, - "name": "Sand Canyon 6 - 41 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 42", - "level": 3, - "stage": 6, - "room": 42, - "pointer": 3068939, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nidoo" - ], - "default_exits": [ - { - "room": 29, - "unkn1": 7, - "unkn2": 8, - "x": 120, - "y": 344, - "name": "Sand Canyon 6 - 42 Exit 0", - "access_rule": [] - }, - { - "room": 29, - "unkn1": 15, - "unkn2": 8, - "x": 248, - "y": 344, - "name": "Sand Canyon 6 - 42 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 16 - ] - ], - "locations": [ - "Sand Canyon 6 - Enemy 13 (Nidoo)" - ], - "music": 14 - }, - { - "name": "Sand Canyon 6 - 43", - "level": 3, - "stage": 6, - "room": 43, - "pointer": 2988495, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 44, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Sand Canyon 6 - 43 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Sand Canyon 6 - Professor Hector & R.O.B" - ], - "music": 8 - }, - { - "name": "Sand Canyon 6 - 44", - "level": 3, - "stage": 6, - "room": 44, - "pointer": 2886979, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Sand Canyon 6 - Complete" - ], - "music": 5 - }, - { - "name": "Sand Canyon Boss - 0", - "level": 3, - "stage": 7, - "room": 0, - "pointer": 2991389, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 6, - 18 - ] - ], - "locations": [ - "Sand Canyon - Boss (Pon & Con) Purified", - "Level 3 Boss - Defeated", - "Level 3 Boss - Purified" - ], - "music": 2 - }, - { - "name": "Cloudy Park 1 - 0", - "level": 4, - "stage": 1, - "room": 0, - "pointer": 3172795, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "KeKe", - "Cappy" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 95, - "unkn2": 5, - "x": 56, - "y": 152, - "name": "Cloudy Park 1 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 16 - ], - [ - 12, - 16 - ], - [ - 51, - 16 - ], - [ - 1, - 23 - ], - [ - 0, - 23 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 1 (Waddle Dee)", - "Cloudy Park 1 - Enemy 2 (KeKe)", - "Cloudy Park 1 - Enemy 3 (Cappy)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 1", - "level": 4, - "stage": 1, - "room": 1, - "pointer": 3078163, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 14, - "unkn2": 8, - "x": 88, - "y": 424, - "name": "Cloudy Park 1 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 1 - Animal 1" - ], - "music": 39 - }, - { - "name": "Cloudy Park 1 - 2", - "level": 4, - "stage": 1, - "room": 2, - "pointer": 3285882, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Yaban", - "Togezo" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 95, - "unkn2": 8, - "x": 40, - "y": 104, - "name": "Cloudy Park 1 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 32, - 16 - ], - [ - 4, - 16 - ], - [ - 18, - 16 - ], - [ - 6, - 23 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 4 (Yaban)", - "Cloudy Park 1 - Enemy 5 (Togezo)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 3", - "level": 4, - "stage": 1, - "room": 3, - "pointer": 3062831, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 15, - "unkn2": 6, - "x": 56, - "y": 264, - "name": "Cloudy Park 1 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 1 - Animal 2" - ], - "music": 39 - }, - { - "name": "Cloudy Park 1 - 4", - "level": 4, - "stage": 1, - "room": 4, - "pointer": 3396729, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 92, - "unkn2": 16, - "x": 56, - "y": 152, - "name": "Cloudy Park 1 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 54, - 16 - ], - [ - 0, - 16 - ], - [ - 14, - 23 - ], - [ - 68, - 16 - ], - [ - 26, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 6 (Galbo)", - "Cloudy Park 1 - Star 1" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 5", - "level": 4, - "stage": 1, - "room": 5, - "pointer": 3038805, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 6, - "unkn2": 5, - "x": 2344, - "y": 232, - "name": "Cloudy Park 1 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 1 - Animal 3", - "Cloudy Park 1 - Animal 4" - ], - "music": 39 - }, - { - "name": "Cloudy Park 1 - 6", - "level": 4, - "stage": 1, - "room": 6, - "pointer": 3535736, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky", - "Como" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 5, - "unkn2": 8, - "x": 72, - "y": 104, - "name": "Cloudy Park 1 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 54, - 16 - ], - [ - 14, - 23 - ], - [ - 0, - 16 - ], - [ - 41, - 16 - ], - [ - 8, - 16 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 7 (Sparky)", - "Cloudy Park 1 - Enemy 8 (Como)", - "Cloudy Park 1 - Star 2" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 7", - "level": 4, - "stage": 1, - "room": 7, - "pointer": 2954080, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 14, - "unkn2": 6, - "x": 88, - "y": 104, - "name": "Cloudy Park 1 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 1 - Animal 5" - ], - "music": 39 - }, - { - "name": "Cloudy Park 1 - 8", - "level": 4, - "stage": 1, - "room": 8, - "pointer": 3465407, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt" - ], - "default_exits": [ - { - "room": 12, - "unkn1": 181, - "unkn2": 6, - "x": 56, - "y": 152, - "name": "Cloudy Park 1 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 21, - 19 - ], - [ - 2, - 16 - ], - [ - 51, - 16 - ], - [ - 1, - 23 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 9 (Bronto Burt)", - "Cloudy Park 1 - Star 3", - "Cloudy Park 1 - Star 4", - "Cloudy Park 1 - Star 5", - "Cloudy Park 1 - Star 6", - "Cloudy Park 1 - Star 7", - "Cloudy Park 1 - Star 8", - "Cloudy Park 1 - Star 9", - "Cloudy Park 1 - Star 10", - "Cloudy Park 1 - Star 11" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 9", - "level": 4, - "stage": 1, - "room": 9, - "pointer": 3078621, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 14, - "unkn2": 9, - "x": 56, - "y": 264, - "name": "Cloudy Park 1 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 1 - Animal 6" - ], - "music": 39 - }, - { - "name": "Cloudy Park 1 - 10", - "level": 4, - "stage": 1, - "room": 10, - "pointer": 3281366, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Gabon", - "Sir Kibble" - ], - "default_exits": [ - { - "room": 9, - "unkn1": 99, - "unkn2": 8, - "x": 56, - "y": 152, - "name": "Cloudy Park 1 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ], - [ - 24, - 16 - ], - [ - 27, - 16 - ], - [ - 4, - 23 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 10 (Gabon)", - "Cloudy Park 1 - Enemy 11 (Sir Kibble)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 11", - "level": 4, - "stage": 1, - "room": 11, - "pointer": 3519608, - "animal_pointers": [], - "consumables": [ - { - "idx": 19, - "pointer": 192, - "x": 216, - "y": 600, - "etype": 22, - "vtype": 0, - "name": "Cloudy Park 1 - 1-Up (Shotzo)" - }, - { - "idx": 18, - "pointer": 456, - "x": 856, - "y": 408, - "etype": 22, - "vtype": 2, - "name": "Cloudy Park 1 - Maxim Tomato (Mariel)" - } - ], - "consumables_pointer": 352, - "enemies": [ - "Mariel", - "Nruff" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 64, - "unkn2": 6, - "x": 104, - "y": 216, - "name": "Cloudy Park 1 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 16 - ], - [ - 27, - 16 - ], - [ - 15, - 16 - ], - [ - 45, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 22 - ], - [ - 0, - 22 - ], - [ - 6, - 22 - ] - ], - "locations": [ - "Cloudy Park 1 - Enemy 12 (Mariel)", - "Cloudy Park 1 - Enemy 13 (Nruff)", - "Cloudy Park 1 - Star 12", - "Cloudy Park 1 - Star 13", - "Cloudy Park 1 - Star 14", - "Cloudy Park 1 - Star 15", - "Cloudy Park 1 - Star 16", - "Cloudy Park 1 - Star 17", - "Cloudy Park 1 - Star 18", - "Cloudy Park 1 - Star 19", - "Cloudy Park 1 - Star 20", - "Cloudy Park 1 - Star 21", - "Cloudy Park 1 - Star 22", - "Cloudy Park 1 - Star 23", - "Cloudy Park 1 - 1-Up (Shotzo)", - "Cloudy Park 1 - Maxim Tomato (Mariel)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 1 - 12", - "level": 4, - "stage": 1, - "room": 12, - "pointer": 2958914, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 13, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Cloudy Park 1 - 12 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 21, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Cloudy Park 1 - Hibanamodoki" - ], - "music": 8 - }, - { - "name": "Cloudy Park 1 - 13", - "level": 4, - "stage": 1, - "room": 13, - "pointer": 2886015, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 1 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park 2 - 0", - "level": 4, - "stage": 2, - "room": 0, - "pointer": 3142443, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Chilly", - "Sasuke" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 96, - "unkn2": 7, - "x": 56, - "y": 88, - "name": "Cloudy Park 2 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 23, - 16 - ], - [ - 7, - 16 - ], - [ - 30, - 16 - ], - [ - 6, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 1 (Chilly)", - "Cloudy Park 2 - Enemy 2 (Sasuke)", - "Cloudy Park 2 - Star 1", - "Cloudy Park 2 - Star 2", - "Cloudy Park 2 - Star 3", - "Cloudy Park 2 - Star 4", - "Cloudy Park 2 - Star 5", - "Cloudy Park 2 - Star 6" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 1", - "level": 4, - "stage": 2, - "room": 1, - "pointer": 3235925, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Sparky", - "Broom Hatter" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 146, - "unkn2": 5, - "x": 88, - "y": 88, - "name": "Cloudy Park 2 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 16 - ], - [ - 14, - 23 - ], - [ - 8, - 16 - ], - [ - 11, - 16 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 3 (Waddle Dee)", - "Cloudy Park 2 - Enemy 4 (Sparky)", - "Cloudy Park 2 - Enemy 5 (Broom Hatter)", - "Cloudy Park 2 - Star 7", - "Cloudy Park 2 - Star 8", - "Cloudy Park 2 - Star 9", - "Cloudy Park 2 - Star 10", - "Cloudy Park 2 - Star 11", - "Cloudy Park 2 - Star 12", - "Cloudy Park 2 - Star 13", - "Cloudy Park 2 - Star 14", - "Cloudy Park 2 - Star 15" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 2", - "level": 4, - "stage": 2, - "room": 2, - "pointer": 3297758, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble", - "Pteran" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 147, - "unkn2": 8, - "x": 72, - "y": 136, - "name": "Cloudy Park 2 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 27, - 16 - ], - [ - 39, - 16 - ], - [ - 1, - 23 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 6 (Sir Kibble)", - "Cloudy Park 2 - Enemy 7 (Pteran)" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 3", - "level": 4, - "stage": 2, - "room": 3, - "pointer": 3341087, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Dogon" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 145, - "unkn2": 12, - "x": 72, - "y": 136, - "name": "Cloudy Park 2 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 16 - ], - [ - 14, - 23 - ], - [ - 90, - 16 - ], - [ - 89, - 16 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 8 (Propeller)", - "Cloudy Park 2 - Enemy 9 (Dogon)", - "Cloudy Park 2 - Star 16", - "Cloudy Park 2 - Star 17", - "Cloudy Park 2 - Star 18", - "Cloudy Park 2 - Star 19", - "Cloudy Park 2 - Star 20", - "Cloudy Park 2 - Star 21", - "Cloudy Park 2 - Star 22", - "Cloudy Park 2 - Star 23", - "Cloudy Park 2 - Star 24", - "Cloudy Park 2 - Star 25", - "Cloudy Park 2 - Star 26", - "Cloudy Park 2 - Star 27", - "Cloudy Park 2 - Star 28", - "Cloudy Park 2 - Star 29", - "Cloudy Park 2 - Star 30", - "Cloudy Park 2 - Star 31", - "Cloudy Park 2 - Star 32", - "Cloudy Park 2 - Star 33", - "Cloudy Park 2 - Star 34", - "Cloudy Park 2 - Star 35", - "Cloudy Park 2 - Star 36", - "Cloudy Park 2 - Star 37" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 4", - "level": 4, - "stage": 2, - "room": 4, - "pointer": 3457404, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Togezo", - "Oro", - "Bronto Burt", - "Rocky" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 165, - "unkn2": 5, - "x": 72, - "y": 104, - "name": "Cloudy Park 2 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 3, - 16 - ], - [ - 14, - 23 - ], - [ - 18, - 16 - ], - [ - 25, - 16 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 10 (Togezo)", - "Cloudy Park 2 - Enemy 11 (Oro)", - "Cloudy Park 2 - Enemy 12 (Bronto Burt)", - "Cloudy Park 2 - Enemy 13 (Rocky)", - "Cloudy Park 2 - Star 38", - "Cloudy Park 2 - Star 39", - "Cloudy Park 2 - Star 40", - "Cloudy Park 2 - Star 41", - "Cloudy Park 2 - Star 42", - "Cloudy Park 2 - Star 43", - "Cloudy Park 2 - Star 44", - "Cloudy Park 2 - Star 45", - "Cloudy Park 2 - Star 46", - "Cloudy Park 2 - Star 47" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 5", - "level": 4, - "stage": 2, - "room": 5, - "pointer": 3273878, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo", - "Kapar" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 96, - "unkn2": 8, - "x": 56, - "y": 88, - "name": "Cloudy Park 2 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 62, - 16 - ], - [ - 26, - 16 - ], - [ - 67, - 16 - ] - ], - "locations": [ - "Cloudy Park 2 - Enemy 14 (Galbo)", - "Cloudy Park 2 - Enemy 15 (Kapar)", - "Cloudy Park 2 - Star 48", - "Cloudy Park 2 - Star 49", - "Cloudy Park 2 - Star 50", - "Cloudy Park 2 - Star 51", - "Cloudy Park 2 - Star 52", - "Cloudy Park 2 - Star 53", - "Cloudy Park 2 - Star 54" - ], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 6", - "level": 4, - "stage": 2, - "room": 6, - "pointer": 2984453, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 25, - "unkn2": 5, - "x": 72, - "y": 152, - "name": "Cloudy Park 2 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 2 - Animal 1", - "Cloudy Park 2 - Animal 2", - "Cloudy Park 2 - Animal 3" - ], - "music": 38 - }, - { - "name": "Cloudy Park 2 - 7", - "level": 4, - "stage": 2, - "room": 7, - "pointer": 2985482, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 15, - "unkn2": 5, - "x": 40, - "y": 88, - "name": "Cloudy Park 2 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 22, - 19 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Cloudy Park 2 - 8", - "level": 4, - "stage": 2, - "room": 8, - "pointer": 2990753, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Cloudy Park 2 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 22, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Cloudy Park 2 - Piyo & Keko" - ], - "music": 8 - }, - { - "name": "Cloudy Park 2 - 9", - "level": 4, - "stage": 2, - "room": 9, - "pointer": 2889630, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 2 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park 3 - 0", - "level": 4, - "stage": 3, - "room": 0, - "pointer": 3100859, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "Mopoo", - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 2, - "unkn1": 145, - "unkn2": 8, - "x": 56, - "y": 136, - "name": "Cloudy Park 3 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 74, - 16 - ], - [ - 47, - 16 - ], - [ - 7, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 3 - Enemy 1 (Bronto Burt)", - "Cloudy Park 3 - Enemy 2 (Mopoo)", - "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)", - "Cloudy Park 3 - Star 1", - "Cloudy Park 3 - Star 2", - "Cloudy Park 3 - Star 3", - "Cloudy Park 3 - Star 4", - "Cloudy Park 3 - Star 5", - "Cloudy Park 3 - Star 6", - "Cloudy Park 3 - Star 7" - ], - "music": 15 - }, - { - "name": "Cloudy Park 3 - 1", - "level": 4, - "stage": 3, - "room": 1, - "pointer": 3209719, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Como" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 13, - "unkn2": 14, - "x": 56, - "y": 152, - "name": "Cloudy Park 3 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ], - [ - 31, - 16 - ], - [ - 4, - 22 - ], - [ - 41, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 3 - Enemy 4 (Como)", - "Cloudy Park 3 - Star 8", - "Cloudy Park 3 - Star 9" - ], - "music": 15 - }, - { - "name": "Cloudy Park 3 - 2", - "level": 4, - "stage": 3, - "room": 2, - "pointer": 3216185, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Glunk", - "Bobin", - "Loud", - "Kapar" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 145, - "unkn2": 6, - "x": 216, - "y": 1064, - "name": "Cloudy Park 3 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 24, - "unkn2": 14, - "x": 104, - "y": 152, - "name": "Cloudy Park 3 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 67, - 16 - ], - [ - 40, - 16 - ], - [ - 73, - 16 - ], - [ - 14, - 23 - ], - [ - 16, - 16 - ] - ], - "locations": [ - "Cloudy Park 3 - Enemy 5 (Glunk)", - "Cloudy Park 3 - Enemy 6 (Bobin)", - "Cloudy Park 3 - Enemy 7 (Loud)", - "Cloudy Park 3 - Enemy 8 (Kapar)", - "Cloudy Park 3 - Star 10", - "Cloudy Park 3 - Star 11", - "Cloudy Park 3 - Star 12", - "Cloudy Park 3 - Star 13", - "Cloudy Park 3 - Star 14", - "Cloudy Park 3 - Star 15", - "Cloudy Park 3 - Star 16" - ], - "music": 15 - }, - { - "name": "Cloudy Park 3 - 3", - "level": 4, - "stage": 3, - "room": 3, - "pointer": 2994208, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 5, - "unkn2": 9, - "x": 408, - "y": 232, - "name": "Cloudy Park 3 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 3 - Animal 1", - "Cloudy Park 3 - Animal 2", - "Cloudy Park 3 - Animal 3" - ], - "music": 40 - }, - { - "name": "Cloudy Park 3 - 4", - "level": 4, - "stage": 3, - "room": 4, - "pointer": 3229151, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo", - "Batamon", - "Bouncy" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 156, - "unkn2": 6, - "x": 56, - "y": 152, - "name": "Cloudy Park 3 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 126, - "unkn2": 9, - "x": 56, - "y": 152, - "name": "Cloudy Park 3 - 4 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 7, - 16 - ], - [ - 26, - 16 - ], - [ - 14, - 23 - ], - [ - 13, - 16 - ], - [ - 68, - 16 - ] - ], - "locations": [ - "Cloudy Park 3 - Enemy 9 (Galbo)", - "Cloudy Park 3 - Enemy 10 (Batamon)", - "Cloudy Park 3 - Enemy 11 (Bouncy)", - "Cloudy Park 3 - Star 17", - "Cloudy Park 3 - Star 18", - "Cloudy Park 3 - Star 19", - "Cloudy Park 3 - Star 20", - "Cloudy Park 3 - Star 21", - "Cloudy Park 3 - Star 22" - ], - "music": 15 - }, - { - "name": "Cloudy Park 3 - 5", - "level": 4, - "stage": 3, - "room": 5, - "pointer": 2969244, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 14, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Cloudy Park 3 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 23, - 19 - ] - ], - "locations": [], - "music": 31 - }, - { - "name": "Cloudy Park 3 - 6", - "level": 4, - "stage": 3, - "room": 6, - "pointer": 4128530, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Cloudy Park 3 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 23, - 19 - ] - ], - "locations": [ - "Cloudy Park 3 - Mr. Ball" - ], - "music": 8 - }, - { - "name": "Cloudy Park 3 - 7", - "level": 4, - "stage": 3, - "room": 7, - "pointer": 2885051, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 3 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park 4 - 0", - "level": 4, - "stage": 4, - "room": 0, - "pointer": 3072905, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 95, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Cloudy Park 4 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 23 - ], - [ - 1, - 23 - ], - [ - 0, - 23 - ], - [ - 31, - 16 - ] - ], - "locations": [], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 1", - "level": 4, - "stage": 4, - "room": 1, - "pointer": 3074863, - "animal_pointers": [ - 208, - 224 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 21, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 4 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 4 - Animal 1", - "Cloudy Park 4 - Animal 2" - ], - "music": 38 - }, - { - "name": "Cloudy Park 4 - 2", - "level": 4, - "stage": 4, - "room": 2, - "pointer": 3309209, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Gabon", - "Como", - "Wapod", - "Cappy" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 145, - "unkn2": 9, - "x": 104, - "y": 152, - "name": "Cloudy Park 4 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 88, - 16 - ], - [ - 24, - 16 - ], - [ - 12, - 16 - ], - [ - 14, - 23 - ], - [ - 41, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Cloudy Park 4 - Enemy 1 (Gabon)", - "Cloudy Park 4 - Enemy 2 (Como)", - "Cloudy Park 4 - Enemy 3 (Wapod)", - "Cloudy Park 4 - Enemy 4 (Cappy)", - "Cloudy Park 4 - Star 1", - "Cloudy Park 4 - Star 2", - "Cloudy Park 4 - Star 3", - "Cloudy Park 4 - Star 4", - "Cloudy Park 4 - Star 5", - "Cloudy Park 4 - Star 6", - "Cloudy Park 4 - Star 7", - "Cloudy Park 4 - Star 8", - "Cloudy Park 4 - Star 9", - "Cloudy Park 4 - Star 10", - "Cloudy Park 4 - Star 11", - "Cloudy Park 4 - Star 12" - ], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 3", - "level": 4, - "stage": 4, - "room": 3, - "pointer": 3296291, - "animal_pointers": [], - "consumables": [ - { - "idx": 33, - "pointer": 776, - "x": 1880, - "y": 152, - "etype": 22, - "vtype": 0, - "name": "Cloudy Park 4 - 1-Up (Windy)" - }, - { - "idx": 34, - "pointer": 912, - "x": 2160, - "y": 152, - "etype": 22, - "vtype": 2, - "name": "Cloudy Park 4 - Maxim Tomato (Windy)" - } - ], - "consumables_pointer": 304, - "enemies": [ - "Sparky", - "Togezo" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 144, - "unkn2": 9, - "x": 56, - "y": 136, - "name": "Cloudy Park 4 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 18, - 16 - ], - [ - 8, - 16 - ], - [ - 31, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 4, - 16 - ], - [ - 0, - 22 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Cloudy Park 4 - Enemy 5 (Sparky)", - "Cloudy Park 4 - Enemy 6 (Togezo)", - "Cloudy Park 4 - Star 13", - "Cloudy Park 4 - Star 14", - "Cloudy Park 4 - Star 15", - "Cloudy Park 4 - Star 16", - "Cloudy Park 4 - Star 17", - "Cloudy Park 4 - Star 18", - "Cloudy Park 4 - Star 19", - "Cloudy Park 4 - Star 20", - "Cloudy Park 4 - Star 21", - "Cloudy Park 4 - Star 22", - "Cloudy Park 4 - Star 23", - "Cloudy Park 4 - Star 24", - "Cloudy Park 4 - Star 25", - "Cloudy Park 4 - Star 26", - "Cloudy Park 4 - Star 27", - "Cloudy Park 4 - Star 28", - "Cloudy Park 4 - Star 29", - "Cloudy Park 4 - Star 30", - "Cloudy Park 4 - 1-Up (Windy)", - "Cloudy Park 4 - Maxim Tomato (Windy)" - ], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 4", - "level": 4, - "stage": 4, - "room": 4, - "pointer": 3330996, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "KeKe", - "Bouncy" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 4, - "unkn2": 15, - "x": 72, - "y": 152, - "name": "Cloudy Park 4 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 13, - 16 - ], - [ - 51, - 16 - ], - [ - 17, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 16 - ] - ], - "locations": [ - "Cloudy Park 4 - Enemy 7 (Bronto Burt)", - "Cloudy Park 4 - Enemy 8 (KeKe)", - "Cloudy Park 4 - Enemy 9 (Bouncy)", - "Cloudy Park 4 - Star 31", - "Cloudy Park 4 - Star 32", - "Cloudy Park 4 - Star 33", - "Cloudy Park 4 - Star 34", - "Cloudy Park 4 - Star 35", - "Cloudy Park 4 - Star 36", - "Cloudy Park 4 - Star 37", - "Cloudy Park 4 - Star 38" - ], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 5", - "level": 4, - "stage": 4, - "room": 5, - "pointer": 3332300, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble", - "Mariel" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 21, - "unkn2": 51, - "x": 2328, - "y": 120, - "name": "Cloudy Park 4 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 45, - 16 - ], - [ - 46, - 16 - ], - [ - 27, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 4 - Enemy 10 (Sir Kibble)", - "Cloudy Park 4 - Enemy 11 (Mariel)", - "Cloudy Park 4 - Star 39", - "Cloudy Park 4 - Star 40", - "Cloudy Park 4 - Star 41", - "Cloudy Park 4 - Star 42", - "Cloudy Park 4 - Star 43" - ], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 6", - "level": 4, - "stage": 4, - "room": 6, - "pointer": 3253310, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kabu", - "Wappa" - ], - "default_exits": [ - { - "room": 9, - "unkn1": 3, - "unkn2": 6, - "x": 72, - "y": 152, - "name": "Cloudy Park 4 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 44, - 16 - ], - [ - 31, - 16 - ], - [ - 19, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 4 - Enemy 12 (Kabu)", - "Cloudy Park 4 - Enemy 13 (Wappa)", - "Cloudy Park 4 - Star 44", - "Cloudy Park 4 - Star 45", - "Cloudy Park 4 - Star 46", - "Cloudy Park 4 - Star 47", - "Cloudy Park 4 - Star 48", - "Cloudy Park 4 - Star 49", - "Cloudy Park 4 - Star 50" - ], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 7", - "level": 4, - "stage": 4, - "room": 7, - "pointer": 2967658, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 12, - "unkn2": 9, - "x": 152, - "y": 120, - "name": "Cloudy Park 4 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 27 - ] - ], - "locations": [ - "Cloudy Park 4 - Miniboss 1 (Jumper Shoot)" - ], - "music": 4 - }, - { - "name": "Cloudy Park 4 - 8", - "level": 4, - "stage": 4, - "room": 8, - "pointer": 2981644, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 13, - "unkn2": 9, - "x": 344, - "y": 680, - "name": "Cloudy Park 4 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 24, - 19 - ] - ], - "locations": [], - "music": 21 - }, - { - "name": "Cloudy Park 4 - 9", - "level": 4, - "stage": 4, - "room": 9, - "pointer": 3008001, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Cloudy Park 4 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 24, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Cloudy Park 4 - Mikarin & Kagami Mocchi" - ], - "music": 8 - }, - { - "name": "Cloudy Park 4 - 10", - "level": 4, - "stage": 4, - "room": 10, - "pointer": 2888184, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 4 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park 5 - 0", - "level": 4, - "stage": 5, - "room": 0, - "pointer": 3192630, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Yaban", - "Sir Kibble", - "Cappy", - "Wappa" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 146, - "unkn2": 6, - "x": 168, - "y": 616, - "name": "Cloudy Park 5 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 32, - 16 - ], - [ - 27, - 16 - ], - [ - 44, - 16 - ], - [ - 12, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 5 - Enemy 1 (Yaban)", - "Cloudy Park 5 - Enemy 2 (Sir Kibble)", - "Cloudy Park 5 - Enemy 3 (Cappy)", - "Cloudy Park 5 - Enemy 4 (Wappa)", - "Cloudy Park 5 - Star 1", - "Cloudy Park 5 - Star 2" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 1", - "level": 4, - "stage": 5, - "room": 1, - "pointer": 3050956, - "animal_pointers": [], - "consumables": [ - { - "idx": 5, - "pointer": 264, - "x": 480, - "y": 720, - "etype": 22, - "vtype": 2, - "name": "Cloudy Park 5 - Maxim Tomato (Pillars)" - } - ], - "consumables_pointer": 288, - "enemies": [ - "Galbo", - "Bronto Burt", - "KeKe" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 32, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 5 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 51, - 16 - ], - [ - 26, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 22 - ] - ], - "locations": [ - "Cloudy Park 5 - Enemy 5 (Galbo)", - "Cloudy Park 5 - Enemy 6 (Bronto Burt)", - "Cloudy Park 5 - Enemy 7 (KeKe)", - "Cloudy Park 5 - Star 3", - "Cloudy Park 5 - Star 4", - "Cloudy Park 5 - Star 5", - "Cloudy Park 5 - Maxim Tomato (Pillars)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 2", - "level": 4, - "stage": 5, - "room": 2, - "pointer": 3604194, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 17, - "unkn2": 9, - "x": 72, - "y": 88, - "name": "Cloudy Park 5 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 5 - Animal 1", - "Cloudy Park 5 - Animal 2" - ], - "music": 40 - }, - { - "name": "Cloudy Park 5 - 3", - "level": 4, - "stage": 5, - "room": 3, - "pointer": 3131242, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Klinko" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 98, - "unkn2": 5, - "x": 72, - "y": 120, - "name": "Cloudy Park 5 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 89, - 16 - ], - [ - 4, - 16 - ], - [ - 42, - 16 - ], - [ - 4, - 23 - ] - ], - "locations": [ - "Cloudy Park 5 - Enemy 8 (Propeller)", - "Cloudy Park 5 - Enemy 9 (Klinko)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 4", - "level": 4, - "stage": 5, - "room": 4, - "pointer": 2990116, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Wapod" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 23, - "unkn2": 7, - "x": 216, - "y": 744, - "name": "Cloudy Park 5 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 88, - 16 - ] - ], - "locations": [ - "Cloudy Park 5 - Enemy 10 (Wapod)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 5", - "level": 4, - "stage": 5, - "room": 5, - "pointer": 2975410, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 5, - "unkn2": 4, - "x": 104, - "y": 296, - "name": "Cloudy Park 5 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 16 - ] - ], - "locations": [ - "Cloudy Park 5 - Star 6" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 6", - "level": 4, - "stage": 5, - "room": 6, - "pointer": 3173683, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Pteran" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 115, - "unkn2": 6, - "x": 56, - "y": 136, - "name": "Cloudy Park 5 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 16 - ], - [ - 1, - 23 - ], - [ - 39, - 16 - ], - [ - 70, - 16 - ] - ], - "locations": [ - "Cloudy Park 5 - Enemy 11 (Pteran)" - ], - "music": 17 - }, - { - "name": "Cloudy Park 5 - 7", - "level": 4, - "stage": 5, - "room": 7, - "pointer": 2992340, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 14, - "unkn2": 8, - "x": 72, - "y": 120, - "name": "Cloudy Park 5 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 25, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Cloudy Park 5 - Pick" - ], - "music": 8 - }, - { - "name": "Cloudy Park 5 - 8", - "level": 4, - "stage": 5, - "room": 8, - "pointer": 2891558, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 5 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park 6 - 0", - "level": 4, - "stage": 6, - "room": 0, - "pointer": 3269847, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 65, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Cloudy Park 6 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 6 - Star 1" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 1", - "level": 4, - "stage": 6, - "room": 1, - "pointer": 3252248, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 3, - "unkn2": 25, - "x": 72, - "y": 72, - "name": "Cloudy Park 6 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 16 - ], - [ - 55, - 16 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 2", - "level": 4, - "stage": 6, - "room": 2, - "pointer": 3028494, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Madoo" - ], - "default_exits": [ - { - "room": 0, - "unkn1": 4, - "unkn2": 9, - "x": 1032, - "y": 152, - "name": "Cloudy Park 6 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 13, - "unkn2": 9, - "x": 56, - "y": 72, - "name": "Cloudy Park 6 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 58, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 1 (Madoo)", - "Cloudy Park 6 - Star 2", - "Cloudy Park 6 - Star 3", - "Cloudy Park 6 - Star 4", - "Cloudy Park 6 - Star 5" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 3", - "level": 4, - "stage": 6, - "room": 3, - "pointer": 3131911, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 4, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 6 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 8, - "unkn2": 9, - "x": 136, - "y": 152, - "name": "Cloudy Park 6 - 3 Exit 1", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 12, - "unkn2": 9, - "x": 200, - "y": 152, - "name": "Cloudy Park 6 - 3 Exit 2", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 16, - "unkn2": 9, - "x": 264, - "y": 152, - "name": "Cloudy Park 6 - 3 Exit 3", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 20, - "unkn2": 9, - "x": 328, - "y": 152, - "name": "Cloudy Park 6 - 3 Exit 4", - "access_rule": [] - } - ], - "entity_load": [ - [ - 58, - 16 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 4", - "level": 4, - "stage": 6, - "room": 4, - "pointer": 3115416, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Tick", - "Como" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 20, - "unkn2": 4, - "x": 72, - "y": 488, - "name": "Cloudy Park 6 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 4, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 6 - 4 Exit 1", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 8, - "unkn2": 9, - "x": 200, - "y": 152, - "name": "Cloudy Park 6 - 4 Exit 2", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 12, - "unkn2": 9, - "x": 328, - "y": 152, - "name": "Cloudy Park 6 - 4 Exit 3", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 16, - "unkn2": 9, - "x": 136, - "y": 152, - "name": "Cloudy Park 6 - 4 Exit 4", - "access_rule": [] - }, - { - "room": 11, - "unkn1": 20, - "unkn2": 9, - "x": 264, - "y": 152, - "name": "Cloudy Park 6 - 4 Exit 5", - "access_rule": [] - } - ], - "entity_load": [ - [ - 55, - 16 - ], - [ - 48, - 16 - ], - [ - 41, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 2 (Tick)", - "Cloudy Park 6 - Enemy 3 (Como)", - "Cloudy Park 6 - Star 6", - "Cloudy Park 6 - Star 7", - "Cloudy Park 6 - Star 8" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 5", - "level": 4, - "stage": 6, - "room": 5, - "pointer": 3245809, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee Drawing", - "Bronto Burt Drawing", - "Bouncy Drawing" - ], - "default_exits": [ - { - "room": 15, - "unkn1": 65, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 6 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 84, - 16 - ], - [ - 85, - 16 - ], - [ - 86, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", - "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", - "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)", - "Cloudy Park 6 - Star 9", - "Cloudy Park 6 - Star 10", - "Cloudy Park 6 - Star 11", - "Cloudy Park 6 - Star 12", - "Cloudy Park 6 - Star 13" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 6", - "level": 4, - "stage": 6, - "room": 6, - "pointer": 3237044, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 56, - "unkn2": 9, - "x": 72, - "y": 136, - "name": "Cloudy Park 6 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 89, - 16 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 7 (Propeller)" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 7", - "level": 4, - "stage": 6, - "room": 7, - "pointer": 3262705, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Mopoo" - ], - "default_exits": [ - { - "room": 13, - "unkn1": 12, - "unkn2": 8, - "x": 184, - "y": 216, - "name": "Cloudy Park 6 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 57, - "unkn2": 8, - "x": 184, - "y": 216, - "name": "Cloudy Park 6 - 7 Exit 1", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 64, - "unkn2": 8, - "x": 72, - "y": 120, - "name": "Cloudy Park 6 - 7 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 74, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 8 (Mopoo)", - "Cloudy Park 6 - Star 14", - "Cloudy Park 6 - Star 15", - "Cloudy Park 6 - Star 16", - "Cloudy Park 6 - Star 17" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 8", - "level": 4, - "stage": 6, - "room": 8, - "pointer": 3027259, - "animal_pointers": [], - "consumables": [ - { - "idx": 22, - "pointer": 312, - "x": 224, - "y": 256, - "etype": 22, - "vtype": 0, - "name": "Cloudy Park 6 - 1-Up (Cutter)" - } - ], - "consumables_pointer": 304, - "enemies": [ - "Bukiset (Burning)", - "Bukiset (Ice)", - "Bukiset (Needle)", - "Bukiset (Clean)", - "Bukiset (Cutter)" - ], - "default_exits": [ - { - "room": 12, - "unkn1": 13, - "unkn2": 4, - "x": 88, - "y": 152, - "name": "Cloudy Park 6 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 78, - 16 - ], - [ - 80, - 16 - ], - [ - 76, - 16 - ], - [ - 79, - 16 - ], - [ - 83, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", - "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", - "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", - "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", - "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", - "Cloudy Park 6 - Star 18", - "Cloudy Park 6 - Star 19", - "Cloudy Park 6 - Star 20", - "Cloudy Park 6 - Star 21", - "Cloudy Park 6 - Star 22", - "Cloudy Park 6 - Star 23", - "Cloudy Park 6 - Star 24", - "Cloudy Park 6 - Star 25", - "Cloudy Park 6 - Star 26", - "Cloudy Park 6 - Star 27", - "Cloudy Park 6 - Star 28", - "Cloudy Park 6 - Star 29", - "Cloudy Park 6 - 1-Up (Cutter)" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 9", - "level": 4, - "stage": 6, - "room": 9, - "pointer": 3089504, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 35, - "unkn2": 7, - "x": 72, - "y": 72, - "name": "Cloudy Park 6 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 41, - 16 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 10", - "level": 4, - "stage": 6, - "room": 10, - "pointer": 3132579, - "animal_pointers": [ - 242, - 250, - 258 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 20, - "unkn2": 4, - "x": 72, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 4, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 1", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 8, - "unkn2": 9, - "x": 136, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 2", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 12, - "unkn2": 9, - "x": 200, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 3", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 16, - "unkn2": 9, - "x": 264, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 4", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 20, - "unkn2": 9, - "x": 328, - "y": 152, - "name": "Cloudy Park 6 - 10 Exit 5", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Cloudy Park 6 - Animal 1", - "Cloudy Park 6 - Animal 2", - "Cloudy Park 6 - Animal 3" - ], - "music": 40 - }, - { - "name": "Cloudy Park 6 - 11", - "level": 4, - "stage": 6, - "room": 11, - "pointer": 3017866, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 4, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Cloudy Park 6 - 11 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 8, - "unkn2": 9, - "x": 264, - "y": 152, - "name": "Cloudy Park 6 - 11 Exit 1", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 12, - "unkn2": 9, - "x": 136, - "y": 152, - "name": "Cloudy Park 6 - 11 Exit 2", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 16, - "unkn2": 9, - "x": 328, - "y": 152, - "name": "Cloudy Park 6 - 11 Exit 3", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 20, - "unkn2": 9, - "x": 200, - "y": 152, - "name": "Cloudy Park 6 - 11 Exit 4", - "access_rule": [] - } - ], - "entity_load": [ - [ - 58, - 16 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 12", - "level": 4, - "stage": 6, - "room": 12, - "pointer": 3036404, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 4, - "unkn2": 9, - "x": 200, - "y": 72, - "name": "Cloudy Park 6 - 12 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 13, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Cloudy Park 6 - 12 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 58, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Cloudy Park 6 - Star 30", - "Cloudy Park 6 - Star 31", - "Cloudy Park 6 - Star 32", - "Cloudy Park 6 - Star 33" - ], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 13", - "level": 4, - "stage": 6, - "room": 13, - "pointer": 2965251, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 10, - "unkn2": 13, - "x": 216, - "y": 136, - "name": "Cloudy Park 6 - 13 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 19 - ] - ], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 14", - "level": 4, - "stage": 6, - "room": 14, - "pointer": 3077236, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 10, - "unkn2": 13, - "x": 936, - "y": 136, - "name": "Cloudy Park 6 - 14 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 11 - }, - { - "name": "Cloudy Park 6 - 15", - "level": 4, - "stage": 6, - "room": 15, - "pointer": 3061794, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Cloudy Park 6 - 15 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Cloudy Park 6 - HB-007" - ], - "music": 8 - }, - { - "name": "Cloudy Park 6 - 16", - "level": 4, - "stage": 6, - "room": 16, - "pointer": 2888907, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Cloudy Park 6 - Complete" - ], - "music": 5 - }, - { - "name": "Cloudy Park Boss - 0", - "level": 4, - "stage": 7, - "room": 0, - "pointer": 2998682, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 3, - 18 - ] - ], - "locations": [ - "Cloudy Park - Boss (Ado) Purified", - "Level 4 Boss - Defeated", - "Level 4 Boss - Purified" - ], - "music": 2 - }, - { - "name": "Iceberg 1 - 0", - "level": 5, - "stage": 1, - "room": 0, - "pointer": 3363111, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Klinko", - "KeKe" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 104, - "unkn2": 8, - "x": 312, - "y": 1384, - "name": "Iceberg 1 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 42, - 16 - ], - [ - 0, - 16 - ], - [ - 51, - 16 - ] - ], - "locations": [ - "Iceberg 1 - Enemy 1 (Waddle Dee)", - "Iceberg 1 - Enemy 2 (Klinko)", - "Iceberg 1 - Enemy 3 (KeKe)" - ], - "music": 18 - }, - { - "name": "Iceberg 1 - 1", - "level": 5, - "stage": 1, - "room": 1, - "pointer": 3596524, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Como", - "Galbo", - "Rocky" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 20, - "unkn2": 8, - "x": 72, - "y": 344, - "name": "Iceberg 1 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 16 - ], - [ - 41, - 16 - ], - [ - 26, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 6, - 23 - ] - ], - "locations": [ - "Iceberg 1 - Enemy 4 (Como)", - "Iceberg 1 - Enemy 5 (Galbo)", - "Iceberg 1 - Enemy 6 (Rocky)", - "Iceberg 1 - Star 1", - "Iceberg 1 - Star 2", - "Iceberg 1 - Star 3", - "Iceberg 1 - Star 4", - "Iceberg 1 - Star 5", - "Iceberg 1 - Star 6" - ], - "music": 18 - }, - { - "name": "Iceberg 1 - 2", - "level": 5, - "stage": 1, - "room": 2, - "pointer": 3288880, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kapar" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 49, - "unkn2": 9, - "x": 184, - "y": 152, - "name": "Iceberg 1 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 94, - "unkn2": 21, - "x": 120, - "y": 168, - "name": "Iceberg 1 - 2 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 19 - ], - [ - 46, - 16 - ], - [ - 47, - 16 - ], - [ - 17, - 16 - ], - [ - 67, - 16 - ] - ], - "locations": [ - "Iceberg 1 - Enemy 7 (Kapar)" - ], - "music": 18 - }, - { - "name": "Iceberg 1 - 3", - "level": 5, - "stage": 1, - "room": 3, - "pointer": 3068439, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 10, - "unkn2": 9, - "x": 808, - "y": 152, - "name": "Iceberg 1 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 1 - Animal 1", - "Iceberg 1 - Animal 2" - ], - "music": 38 - }, - { - "name": "Iceberg 1 - 4", - "level": 5, - "stage": 1, - "room": 4, - "pointer": 3233681, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Mopoo", - "Babut", - "Wappa" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 74, - "unkn2": 4, - "x": 56, - "y": 152, - "name": "Iceberg 1 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 44, - 16 - ], - [ - 43, - 16 - ], - [ - 74, - 16 - ] - ], - "locations": [ - "Iceberg 1 - Enemy 8 (Mopoo)", - "Iceberg 1 - Enemy 9 (Babut)", - "Iceberg 1 - Enemy 10 (Wappa)" - ], - "music": 18 - }, - { - "name": "Iceberg 1 - 5", - "level": 5, - "stage": 1, - "room": 5, - "pointer": 3406133, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "Chilly", - "Poppy Bros Jr." - ], - "default_exits": [ - { - "room": 4, - "unkn1": 196, - "unkn2": 9, - "x": 72, - "y": 744, - "name": "Iceberg 1 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ], - [ - 7, - 16 - ], - [ - 2, - 16 - ], - [ - 0, - 16 - ] - ], - "locations": [ - "Iceberg 1 - Enemy 11 (Bronto Burt)", - "Iceberg 1 - Enemy 12 (Chilly)", - "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)" - ], - "music": 18 - }, - { - "name": "Iceberg 1 - 6", - "level": 5, - "stage": 1, - "room": 6, - "pointer": 2985823, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 1 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Iceberg 1 - Kogoesou" - ], - "music": 8 - }, - { - "name": "Iceberg 1 - 7", - "level": 5, - "stage": 1, - "room": 7, - "pointer": 2892040, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 1 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg 2 - 0", - "level": 5, - "stage": 2, - "room": 0, - "pointer": 3106800, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Gabon", - "Nruff" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 113, - "unkn2": 36, - "x": 88, - "y": 152, - "name": "Iceberg 2 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 16 - ], - [ - 0, - 16 - ], - [ - 24, - 16 - ] - ], - "locations": [ - "Iceberg 2 - Enemy 1 (Gabon)", - "Iceberg 2 - Enemy 2 (Nruff)" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 1", - "level": 5, - "stage": 2, - "room": 1, - "pointer": 3334841, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee", - "Chilly", - "Pteran" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 109, - "unkn2": 20, - "x": 88, - "y": 72, - "name": "Iceberg 2 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ], - [ - 0, - 16 - ], - [ - 4, - 16 - ], - [ - 39, - 16 - ] - ], - "locations": [ - "Iceberg 2 - Enemy 3 (Waddle Dee)", - "Iceberg 2 - Enemy 4 (Chilly)", - "Iceberg 2 - Enemy 5 (Pteran)" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 2", - "level": 5, - "stage": 2, - "room": 2, - "pointer": 3473408, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Glunk", - "Galbo", - "Babut", - "Magoo" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 102, - "unkn2": 5, - "x": 88, - "y": 152, - "name": "Iceberg 2 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 24, - "unkn2": 18, - "x": 88, - "y": 152, - "name": "Iceberg 2 - 2 Exit 1", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 37, - "unkn2": 26, - "x": 200, - "y": 184, - "name": "Iceberg 2 - 2 Exit 2", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 55, - "unkn2": 26, - "x": 200, - "y": 184, - "name": "Iceberg 2 - 2 Exit 3", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 73, - "unkn2": 26, - "x": 200, - "y": 184, - "name": "Iceberg 2 - 2 Exit 4", - "access_rule": [] - } - ], - "entity_load": [ - [ - 53, - 16 - ], - [ - 26, - 16 - ], - [ - 43, - 16 - ], - [ - 14, - 23 - ], - [ - 16, - 16 - ] - ], - "locations": [ - "Iceberg 2 - Enemy 6 (Glunk)", - "Iceberg 2 - Enemy 7 (Galbo)", - "Iceberg 2 - Enemy 8 (Babut)", - "Iceberg 2 - Enemy 9 (Magoo)", - "Iceberg 2 - Star 1", - "Iceberg 2 - Star 2" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 3", - "level": 5, - "stage": 2, - "room": 3, - "pointer": 3037006, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 11, - "unkn2": 11, - "x": 616, - "y": 424, - "name": "Iceberg 2 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 19 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 2 - Star 3" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 4", - "level": 5, - "stage": 2, - "room": 4, - "pointer": 3035198, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 11, - "unkn2": 11, - "x": 904, - "y": 424, - "name": "Iceberg 2 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 19 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 2 - Star 4", - "Iceberg 2 - Star 5" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 5", - "level": 5, - "stage": 2, - "room": 5, - "pointer": 3128551, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 11, - "unkn2": 11, - "x": 1192, - "y": 424, - "name": "Iceberg 2 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 19 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 2 - Star 6", - "Iceberg 2 - Star 7", - "Iceberg 2 - Star 8" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 6", - "level": 5, - "stage": 2, - "room": 6, - "pointer": 3270857, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller", - "Nidoo", - "Oro" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 65, - "unkn2": 9, - "x": 88, - "y": 152, - "name": "Iceberg 2 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 62, - 16 - ], - [ - 4, - 22 - ], - [ - 89, - 16 - ], - [ - 28, - 16 - ], - [ - 25, - 16 - ] - ], - "locations": [ - "Iceberg 2 - Enemy 10 (Propeller)", - "Iceberg 2 - Enemy 11 (Nidoo)", - "Iceberg 2 - Enemy 12 (Oro)" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 7", - "level": 5, - "stage": 2, - "room": 7, - "pointer": 3212501, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Klinko", - "Bronto Burt" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 124, - "unkn2": 8, - "x": 72, - "y": 152, - "name": "Iceberg 2 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 42, - 16 - ], - [ - 6, - 16 - ], - [ - 14, - 23 - ], - [ - 2, - 16 - ], - [ - 4, - 23 - ] - ], - "locations": [ - "Iceberg 2 - Enemy 13 (Klinko)", - "Iceberg 2 - Enemy 14 (Bronto Burt)", - "Iceberg 2 - Star 9", - "Iceberg 2 - Star 10", - "Iceberg 2 - Star 11", - "Iceberg 2 - Star 12", - "Iceberg 2 - Star 13", - "Iceberg 2 - Star 14", - "Iceberg 2 - Star 15", - "Iceberg 2 - Star 16", - "Iceberg 2 - Star 17", - "Iceberg 2 - Star 18", - "Iceberg 2 - Star 19" - ], - "music": 20 - }, - { - "name": "Iceberg 2 - 8", - "level": 5, - "stage": 2, - "room": 8, - "pointer": 2994515, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 2 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 29, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Iceberg 2 - Samus" - ], - "music": 8 - }, - { - "name": "Iceberg 2 - 9", - "level": 5, - "stage": 2, - "room": 9, - "pointer": 3058084, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 4, - "unkn2": 9, - "x": 408, - "y": 296, - "name": "Iceberg 2 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 2 - Animal 1", - "Iceberg 2 - Animal 2" - ], - "music": 39 - }, - { - "name": "Iceberg 2 - 10", - "level": 5, - "stage": 2, - "room": 10, - "pointer": 2887220, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 2 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg 3 - 0", - "level": 5, - "stage": 3, - "room": 0, - "pointer": 3455346, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Corori", - "Bouncy", - "Chilly", - "Pteran" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 98, - "unkn2": 6, - "x": 200, - "y": 232, - "name": "Iceberg 3 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 217, - "unkn2": 7, - "x": 40, - "y": 120, - "name": "Iceberg 3 - 0 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 60, - 16 - ], - [ - 6, - 16 - ], - [ - 39, - 16 - ], - [ - 13, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 3 - Enemy 1 (Corori)", - "Iceberg 3 - Enemy 2 (Bouncy)", - "Iceberg 3 - Enemy 3 (Chilly)", - "Iceberg 3 - Enemy 4 (Pteran)", - "Iceberg 3 - Star 1", - "Iceberg 3 - Star 2" - ], - "music": 14 - }, - { - "name": "Iceberg 3 - 1", - "level": 5, - "stage": 3, - "room": 1, - "pointer": 3019769, - "animal_pointers": [ - 192, - 200, - 208 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 0, - "unkn1": 11, - "unkn2": 14, - "x": 1592, - "y": 104, - "name": "Iceberg 3 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 3 - Animal 1", - "Iceberg 3 - Animal 2", - "Iceberg 3 - Animal 3" - ], - "music": 38 - }, - { - "name": "Iceberg 3 - 2", - "level": 5, - "stage": 3, - "room": 2, - "pointer": 3618121, - "animal_pointers": [], - "consumables": [ - { - "idx": 2, - "pointer": 352, - "x": 1776, - "y": 104, - "etype": 22, - "vtype": 2, - "name": "Iceberg 3 - Maxim Tomato (Ceiling)" - } - ], - "consumables_pointer": 128, - "enemies": [ - "Raft Waddle Dee", - "Kapar", - "Blipper" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 196, - "unkn2": 11, - "x": 72, - "y": 152, - "name": "Iceberg 3 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 22 - ], - [ - 71, - 16 - ], - [ - 57, - 16 - ], - [ - 21, - 16 - ], - [ - 67, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 3 - Enemy 5 (Raft Waddle Dee)", - "Iceberg 3 - Enemy 6 (Kapar)", - "Iceberg 3 - Enemy 7 (Blipper)", - "Iceberg 3 - Star 3", - "Iceberg 3 - Maxim Tomato (Ceiling)" - ], - "music": 14 - }, - { - "name": "Iceberg 3 - 3", - "level": 5, - "stage": 3, - "room": 3, - "pointer": 3650368, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Wapod" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 116, - "unkn2": 11, - "x": 40, - "y": 152, - "name": "Iceberg 3 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 63, - "unkn2": 13, - "x": 184, - "y": 136, - "name": "Iceberg 3 - 3 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 6, - 16 - ], - [ - 88, - 16 - ] - ], - "locations": [ - "Iceberg 3 - Enemy 8 (Wapod)", - "Iceberg 3 - Star 4", - "Iceberg 3 - Star 5", - "Iceberg 3 - Star 6", - "Iceberg 3 - Star 7", - "Iceberg 3 - Star 8", - "Iceberg 3 - Star 9", - "Iceberg 3 - Star 10" - ], - "music": 14 - }, - { - "name": "Iceberg 3 - 4", - "level": 5, - "stage": 3, - "room": 4, - "pointer": 3038208, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 10, - "unkn2": 8, - "x": 1032, - "y": 216, - "name": "Iceberg 3 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 3 - Animal 4", - "Iceberg 3 - Animal 5" - ], - "music": 39 - }, - { - "name": "Iceberg 3 - 5", - "level": 5, - "stage": 3, - "room": 5, - "pointer": 3013938, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 15, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 3 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 30, - 19 - ] - ], - "locations": [], - "music": 31 - }, - { - "name": "Iceberg 3 - 6", - "level": 5, - "stage": 3, - "room": 6, - "pointer": 3624789, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Glunk", - "Icicle" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 211, - "unkn2": 7, - "x": 40, - "y": 152, - "name": "Iceberg 3 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ], - [ - 16, - 16 - ], - [ - 14, - 23 - ], - [ - 36, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Iceberg 3 - Enemy 9 (Glunk)", - "Iceberg 3 - Enemy 10 (Icicle)", - "Iceberg 3 - Star 11", - "Iceberg 3 - Star 12", - "Iceberg 3 - Star 13", - "Iceberg 3 - Star 14", - "Iceberg 3 - Star 15", - "Iceberg 3 - Star 16", - "Iceberg 3 - Star 17", - "Iceberg 3 - Star 18", - "Iceberg 3 - Star 19", - "Iceberg 3 - Star 20", - "Iceberg 3 - Star 21" - ], - "music": 14 - }, - { - "name": "Iceberg 3 - 7", - "level": 5, - "stage": 3, - "room": 7, - "pointer": 2989472, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 15, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 3 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 30, - 19 - ] - ], - "locations": [ - "Iceberg 3 - Chef Kawasaki" - ], - "music": 8 - }, - { - "name": "Iceberg 3 - 8", - "level": 5, - "stage": 3, - "room": 8, - "pointer": 2889871, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 3 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg 4 - 0", - "level": 5, - "stage": 4, - "room": 0, - "pointer": 3274879, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bronto Burt", - "Galbo", - "Klinko", - "Chilly" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 111, - "unkn2": 8, - "x": 72, - "y": 104, - "name": "Iceberg 4 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 42, - 16 - ], - [ - 6, - 16 - ], - [ - 2, - 16 - ], - [ - 26, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 1 (Bronto Burt)", - "Iceberg 4 - Enemy 2 (Galbo)", - "Iceberg 4 - Enemy 3 (Klinko)", - "Iceberg 4 - Enemy 4 (Chilly)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 1", - "level": 5, - "stage": 4, - "room": 1, - "pointer": 3371780, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Babut", - "Wappa" - ], - "default_exits": [ - { - "room": 2, - "unkn1": 60, - "unkn2": 36, - "x": 216, - "y": 88, - "name": "Iceberg 4 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 43, - 16 - ], - [ - 4, - 22 - ], - [ - 44, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 5 (Babut)", - "Iceberg 4 - Enemy 6 (Wappa)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 2", - "level": 5, - "stage": 4, - "room": 2, - "pointer": 3284378, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 16, - "unkn1": 8, - "unkn2": 39, - "x": 168, - "y": 152, - "name": "Iceberg 4 - 2 Exit 0", - "access_rule": [ - "Burning" - ] - }, - { - "room": 3, - "unkn1": 13, - "unkn2": 39, - "x": 88, - "y": 136, - "name": "Iceberg 4 - 2 Exit 1", - "access_rule": [] - }, - { - "room": 17, - "unkn1": 18, - "unkn2": 39, - "x": 120, - "y": 152, - "name": "Iceberg 4 - 2 Exit 2", - "access_rule": [ - "Burning" - ] - } - ], - "entity_load": [ - [ - 26, - 16 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 3", - "level": 5, - "stage": 4, - "room": 3, - "pointer": 3162957, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 44, - "unkn2": 8, - "x": 216, - "y": 104, - "name": "Iceberg 4 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 69, - 16 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 4", - "level": 5, - "stage": 4, - "room": 4, - "pointer": 3261679, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Icicle" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 4, - "unkn2": 42, - "x": 104, - "y": 840, - "name": "Iceberg 4 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 36, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 7 (Icicle)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 5", - "level": 5, - "stage": 4, - "room": 5, - "pointer": 3217398, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Corori" - ], - "default_exits": [ - { - "room": 6, - "unkn1": 19, - "unkn2": 5, - "x": 72, - "y": 120, - "name": "Iceberg 4 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 60, - 16 - ], - [ - 44, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 8 (Corori)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 6", - "level": 5, - "stage": 4, - "room": 6, - "pointer": 3108265, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 61, - "unkn2": 7, - "x": 456, - "y": 72, - "name": "Iceberg 4 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 62, - 16 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 7", - "level": 5, - "stage": 4, - "room": 7, - "pointer": 3346202, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 8, - "unkn1": 39, - "unkn2": 6, - "x": 168, - "y": 104, - "name": "Iceberg 4 - 7 Exit 0", - "access_rule": [] - }, - { - "room": 13, - "unkn1": 4, - "unkn2": 21, - "x": 88, - "y": 168, - "name": "Iceberg 4 - 7 Exit 1", - "access_rule": [ - "Burning" - ] - }, - { - "room": 13, - "unkn1": 21, - "unkn2": 21, - "x": 280, - "y": 168, - "name": "Iceberg 4 - 7 Exit 2", - "access_rule": [ - "Burning" - ] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 4, - 22 - ], - [ - 4, - 23 - ] - ], - "locations": [ - "Iceberg 4 - Star 1", - "Iceberg 4 - Star 2" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 8", - "level": 5, - "stage": 4, - "room": 8, - "pointer": 3055911, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 10, - "unkn2": 5, - "x": 648, - "y": 104, - "name": "Iceberg 4 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 16 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 9", - "level": 5, - "stage": 4, - "room": 9, - "pointer": 3056457, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 13, - "unkn2": 9, - "x": 136, - "y": 136, - "name": "Iceberg 4 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 27 - ] - ], - "locations": [ - "Iceberg 4 - Miniboss 1 (Yuki)" - ], - "music": 4 - }, - { - "name": "Iceberg 4 - 10", - "level": 5, - "stage": 4, - "room": 10, - "pointer": 3257516, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 8, - "unkn2": 37, - "x": 88, - "y": 40, - "name": "Iceberg 4 - 10 Exit 0", - "access_rule": [] - }, - { - "room": 9, - "unkn1": 15, - "unkn2": 37, - "x": 200, - "y": 40, - "name": "Iceberg 4 - 10 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 31, - 19 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 11", - "level": 5, - "stage": 4, - "room": 11, - "pointer": 3083322, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Gabon" - ], - "default_exits": [ - { - "room": 12, - "unkn1": 46, - "unkn2": 8, - "x": 88, - "y": 120, - "name": "Iceberg 4 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 24, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 9 (Gabon)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 12", - "level": 5, - "stage": 4, - "room": 12, - "pointer": 3147724, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kabu" - ], - "default_exits": [ - { - "room": 18, - "unkn1": 64, - "unkn2": 7, - "x": 72, - "y": 456, - "name": "Iceberg 4 - 12 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 19, - 16 - ], - [ - 61, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 10 (Kabu)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 13", - "level": 5, - "stage": 4, - "room": 13, - "pointer": 3370077, - "animal_pointers": [ - 232, - 240, - 248 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 15, - "unkn1": 31, - "unkn2": 4, - "x": 216, - "y": 120, - "name": "Iceberg 4 - 13 Exit 0", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 46, - "unkn2": 10, - "x": 72, - "y": 88, - "name": "Iceberg 4 - 13 Exit 1", - "access_rule": [] - }, - { - "room": 10, - "unkn1": 57, - "unkn2": 10, - "x": 312, - "y": 88, - "name": "Iceberg 4 - 13 Exit 2", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 28, - "unkn2": 21, - "x": 152, - "y": 136, - "name": "Iceberg 4 - 13 Exit 3", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 34, - "unkn2": 21, - "x": 280, - "y": 136, - "name": "Iceberg 4 - 13 Exit 4", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 4 - Animal 1", - "Iceberg 4 - Animal 2", - "Iceberg 4 - Animal 3" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 14", - "level": 5, - "stage": 4, - "room": 14, - "pointer": 3057002, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Broom Hatter", - "Sasuke" - ], - "default_exits": [ - { - "room": 15, - "unkn1": 4, - "unkn2": 8, - "x": 88, - "y": 360, - "name": "Iceberg 4 - 14 Exit 0", - "access_rule": [] - }, - { - "room": 13, - "unkn1": 10, - "unkn2": 8, - "x": 440, - "y": 344, - "name": "Iceberg 4 - 14 Exit 1", - "access_rule": [] - }, - { - "room": 13, - "unkn1": 16, - "unkn2": 8, - "x": 568, - "y": 344, - "name": "Iceberg 4 - 14 Exit 2", - "access_rule": [] - }, - { - "room": 15, - "unkn1": 22, - "unkn2": 8, - "x": 344, - "y": 360, - "name": "Iceberg 4 - 14 Exit 3", - "access_rule": [] - } - ], - "entity_load": [ - [ - 11, - 16 - ], - [ - 30, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 11 (Broom Hatter)", - "Iceberg 4 - Enemy 12 (Sasuke)" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 15", - "level": 5, - "stage": 4, - "room": 15, - "pointer": 3116124, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 13, - "unkn1": 13, - "unkn2": 6, - "x": 520, - "y": 72, - "name": "Iceberg 4 - 15 Exit 0", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 4, - "unkn2": 22, - "x": 88, - "y": 136, - "name": "Iceberg 4 - 15 Exit 1", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 22, - "unkn2": 22, - "x": 344, - "y": 136, - "name": "Iceberg 4 - 15 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 22 - ] - ], - "locations": [], - "music": 19 - }, - { - "name": "Iceberg 4 - 16", - "level": 5, - "stage": 4, - "room": 16, - "pointer": 3069937, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 11, - "unkn2": 9, - "x": 152, - "y": 632, - "name": "Iceberg 4 - 16 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 4 - Animal 4" - ], - "music": 38 - }, - { - "name": "Iceberg 4 - 17", - "level": 5, - "stage": 4, - "room": 17, - "pointer": 3072413, - "animal_pointers": [ - 192 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 6, - "unkn2": 9, - "x": 280, - "y": 632, - "name": "Iceberg 4 - 17 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 4 - Animal 5" - ], - "music": 38 - }, - { - "name": "Iceberg 4 - 18", - "level": 5, - "stage": 4, - "room": 18, - "pointer": 3404593, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nruff" - ], - "default_exits": [ - { - "room": 19, - "unkn1": 94, - "unkn2": 12, - "x": 72, - "y": 152, - "name": "Iceberg 4 - 18 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 23 - ], - [ - 43, - 16 - ], - [ - 30, - 16 - ], - [ - 15, - 16 - ] - ], - "locations": [ - "Iceberg 4 - Enemy 13 (Nruff)", - "Iceberg 4 - Star 3" - ], - "music": 19 - }, - { - "name": "Iceberg 4 - 19", - "level": 5, - "stage": 4, - "room": 19, - "pointer": 3075826, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 20, - "unkn1": 14, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 4 - 19 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 31, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Iceberg 4 - Name" - ], - "music": 8 - }, - { - "name": "Iceberg 4 - 20", - "level": 5, - "stage": 4, - "room": 20, - "pointer": 2887943, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 4 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg 5 - 0", - "level": 5, - "stage": 5, - "room": 0, - "pointer": 3316135, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Bukiset (Burning)", - "Bukiset (Stone)", - "Bukiset (Ice)", - "Bukiset (Needle)", - "Bukiset (Clean)", - "Bukiset (Parasol)", - "Bukiset (Spark)", - "Bukiset (Cutter)" - ], - "default_exits": [ - { - "room": 30, - "unkn1": 75, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 0 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 79, - 16 - ], - [ - 76, - 16 - ], - [ - 81, - 16 - ], - [ - 78, - 16 - ], - [ - 77, - 16 - ], - [ - 82, - 16 - ], - [ - 80, - 16 - ], - [ - 83, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 1 (Bukiset (Burning))", - "Iceberg 5 - Enemy 2 (Bukiset (Stone))", - "Iceberg 5 - Enemy 3 (Bukiset (Ice))", - "Iceberg 5 - Enemy 4 (Bukiset (Needle))", - "Iceberg 5 - Enemy 5 (Bukiset (Clean))", - "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", - "Iceberg 5 - Enemy 7 (Bukiset (Spark))", - "Iceberg 5 - Enemy 8 (Bukiset (Cutter))" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 1", - "level": 5, - "stage": 5, - "room": 1, - "pointer": 3037607, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 12, - "unkn2": 6, - "x": 72, - "y": 104, - "name": "Iceberg 5 - 1 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 2", - "level": 5, - "stage": 5, - "room": 2, - "pointer": 3103842, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Glunk" - ], - "default_exits": [ - { - "room": 25, - "unkn1": 27, - "unkn2": 6, - "x": 72, - "y": 200, - "name": "Iceberg 5 - 2 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 16, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 9 (Glunk)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 3", - "level": 5, - "stage": 5, - "room": 3, - "pointer": 3135899, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Wapod" - ], - "default_exits": [ - { - "room": 4, - "unkn1": 20, - "unkn2": 7, - "x": 72, - "y": 88, - "name": "Iceberg 5 - 3 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 88, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 10 (Wapod)", - "Iceberg 5 - Star 1", - "Iceberg 5 - Star 2" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 4", - "level": 5, - "stage": 5, - "room": 4, - "pointer": 3180695, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Tick" - ], - "default_exits": [ - { - "room": 5, - "unkn1": 26, - "unkn2": 5, - "x": 56, - "y": 104, - "name": "Iceberg 5 - 4 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 48, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 11 (Tick)", - "Iceberg 5 - Star 3", - "Iceberg 5 - Star 4", - "Iceberg 5 - Star 5", - "Iceberg 5 - Star 6", - "Iceberg 5 - Star 7", - "Iceberg 5 - Star 8" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 5", - "level": 5, - "stage": 5, - "room": 5, - "pointer": 3106064, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Madoo" - ], - "default_exits": [ - { - "room": 24, - "unkn1": 14, - "unkn2": 6, - "x": 168, - "y": 152, - "name": "Iceberg 5 - 5 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 58, - 16 - ], - [ - 14, - 23 - ], - [ - 4, - 22 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 12 (Madoo)", - "Iceberg 5 - Star 9", - "Iceberg 5 - Star 10", - "Iceberg 5 - Star 11", - "Iceberg 5 - Star 12", - "Iceberg 5 - Star 13", - "Iceberg 5 - Star 14" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 6", - "level": 5, - "stage": 5, - "room": 6, - "pointer": 3276800, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 7, - "unkn1": 59, - "unkn2": 12, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 55, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 7", - "level": 5, - "stage": 5, - "room": 7, - "pointer": 3104585, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 26, - "unkn1": 25, - "unkn2": 7, - "x": 72, - "y": 136, - "name": "Iceberg 5 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 23, - 16 - ], - [ - 7, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 8", - "level": 5, - "stage": 5, - "room": 8, - "pointer": 3195121, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 35, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 8 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 9", - "level": 5, - "stage": 5, - "room": 9, - "pointer": 3087198, - "animal_pointers": [], - "consumables": [ - { - "idx": 16, - "pointer": 200, - "x": 256, - "y": 88, - "etype": 22, - "vtype": 0, - "name": "Iceberg 5 - 1-Up (Boulder)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 28, - "unkn1": 20, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 22 - ], - [ - 54, - 16 - ] - ], - "locations": [ - "Iceberg 5 - 1-Up (Boulder)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 10", - "level": 5, - "stage": 5, - "room": 10, - "pointer": 3321612, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 32, - "unkn1": 45, - "unkn2": 15, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 14, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 11", - "level": 5, - "stage": 5, - "room": 11, - "pointer": 3139178, - "animal_pointers": [], - "consumables": [ - { - "idx": 17, - "pointer": 192, - "x": 152, - "y": 168, - "etype": 22, - "vtype": 0, - "name": "Iceberg 5 - 1-Up (Floor)" - } - ], - "consumables_pointer": 176, - "enemies": [ - "Yaban" - ], - "default_exits": [ - { - "room": 12, - "unkn1": 17, - "unkn2": 7, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 32, - 16 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 13 (Yaban)", - "Iceberg 5 - 1-Up (Floor)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 12", - "level": 5, - "stage": 5, - "room": 12, - "pointer": 3118231, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Propeller" - ], - "default_exits": [ - { - "room": 13, - "unkn1": 13, - "unkn2": 7, - "x": 72, - "y": 104, - "name": "Iceberg 5 - 12 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 89, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 14 (Propeller)", - "Iceberg 5 - Star 15", - "Iceberg 5 - Star 16", - "Iceberg 5 - Star 17", - "Iceberg 5 - Star 18", - "Iceberg 5 - Star 19", - "Iceberg 5 - Star 20" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 13", - "level": 5, - "stage": 5, - "room": 13, - "pointer": 3021658, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Mariel" - ], - "default_exits": [ - { - "room": 27, - "unkn1": 16, - "unkn2": 6, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 13 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 45, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 15 (Mariel)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 14", - "level": 5, - "stage": 5, - "room": 14, - "pointer": 3025398, - "animal_pointers": [], - "consumables": [ - { - "idx": 24, - "pointer": 200, - "x": 208, - "y": 88, - "etype": 22, - "vtype": 0, - "name": "Iceberg 5 - 1-Up (Peloo)" - } - ], - "consumables_pointer": 176, - "enemies": [], - "default_exits": [ - { - "room": 15, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 216, - "name": "Iceberg 5 - 14 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 64, - 16 - ], - [ - 0, - 22 - ] - ], - "locations": [ - "Iceberg 5 - 1-Up (Peloo)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 15", - "level": 5, - "stage": 5, - "room": 15, - "pointer": 3167445, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Pteran" - ], - "default_exits": [ - { - "room": 16, - "unkn1": 13, - "unkn2": 13, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 15 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 39, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 16 (Pteran)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 16", - "level": 5, - "stage": 5, - "room": 16, - "pointer": 3033990, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 33, - "unkn1": 36, - "unkn2": 9, - "x": 168, - "y": 152, - "name": "Iceberg 5 - 16 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 68, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 17", - "level": 5, - "stage": 5, - "room": 17, - "pointer": 3100111, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 20, - "unkn1": 40, - "unkn2": 7, - "x": 72, - "y": 200, - "name": "Iceberg 5 - 17 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 52, - 16 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 18", - "level": 5, - "stage": 5, - "room": 18, - "pointer": 3030947, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Galbo" - ], - "default_exits": [ - { - "room": 17, - "unkn1": 13, - "unkn2": 7, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 18 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 26, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 17 (Galbo)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 19", - "level": 5, - "stage": 5, - "room": 19, - "pointer": 3105326, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "KeKe" - ], - "default_exits": [ - { - "room": 21, - "unkn1": 13, - "unkn2": 4, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 19 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 51, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 18 (KeKe)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 20", - "level": 5, - "stage": 5, - "room": 20, - "pointer": 3118928, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nidoo" - ], - "default_exits": [ - { - "room": 19, - "unkn1": 13, - "unkn2": 6, - "x": 72, - "y": 264, - "name": "Iceberg 5 - 20 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 19 (Nidoo)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 21", - "level": 5, - "stage": 5, - "room": 21, - "pointer": 3202517, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Waddle Dee Drawing", - "Bronto Burt Drawing", - "Bouncy Drawing" - ], - "default_exits": [ - { - "room": 22, - "unkn1": 29, - "unkn2": 9, - "x": 72, - "y": 72, - "name": "Iceberg 5 - 21 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 84, - 16 - ], - [ - 85, - 16 - ], - [ - 86, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", - "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", - "Iceberg 5 - Enemy 22 (Bouncy Drawing)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 22", - "level": 5, - "stage": 5, - "room": 22, - "pointer": 3014656, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Joe" - ], - "default_exits": [ - { - "room": 23, - "unkn1": 13, - "unkn2": 4, - "x": 72, - "y": 104, - "name": "Iceberg 5 - 22 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 91, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 23 (Joe)", - "Iceberg 5 - Star 21", - "Iceberg 5 - Star 22", - "Iceberg 5 - Star 23", - "Iceberg 5 - Star 24", - "Iceberg 5 - Star 25" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 23", - "level": 5, - "stage": 5, - "room": 23, - "pointer": 3166550, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Kapar" - ], - "default_exits": [ - { - "room": 34, - "unkn1": 27, - "unkn2": 6, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 23 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 67, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 24 (Kapar)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 24", - "level": 5, - "stage": 5, - "room": 24, - "pointer": 3029110, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Gansan" - ], - "default_exits": [ - { - "room": 31, - "unkn1": 10, - "unkn2": 4, - "x": 72, - "y": 88, - "name": "Iceberg 5 - 24 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 75, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 25 (Gansan)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 25", - "level": 5, - "stage": 5, - "room": 25, - "pointer": 3156420, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sasuke" - ], - "default_exits": [ - { - "room": 3, - "unkn1": 25, - "unkn2": 7, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 25 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 30, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 26 (Sasuke)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 26", - "level": 5, - "stage": 5, - "room": 26, - "pointer": 3127877, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Togezo" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 24, - "unkn2": 8, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 26 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 18, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 27 (Togezo)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 27", - "level": 5, - "stage": 5, - "room": 27, - "pointer": 3256471, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky", - "Bobin" - ], - "default_exits": [ - { - "room": 14, - "unkn1": 26, - "unkn2": 9, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 27 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 8, - 16 - ], - [ - 73, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 28 (Sparky)", - "Iceberg 5 - Enemy 29 (Bobin)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 28", - "level": 5, - "stage": 5, - "room": 28, - "pointer": 3029723, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Chilly" - ], - "default_exits": [ - { - "room": 10, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 248, - "name": "Iceberg 5 - 28 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 6, - 16 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 30 (Chilly)" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 29", - "level": 5, - "stage": 5, - "room": 29, - "pointer": 3526568, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 36, - "unkn1": 10, - "unkn2": 6, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 29 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 10, - 23 - ], - [ - 31, - 16 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Star 26", - "Iceberg 5 - Star 27", - "Iceberg 5 - Star 28", - "Iceberg 5 - Star 29", - "Iceberg 5 - Star 30", - "Iceberg 5 - Star 31", - "Iceberg 5 - Star 32" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 30", - "level": 5, - "stage": 5, - "room": 30, - "pointer": 3022285, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 1, - "unkn1": 13, - "unkn2": 5, - "x": 88, - "y": 104, - "name": "Iceberg 5 - 30 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 5 - Animal 1", - "Iceberg 5 - Animal 2" - ], - "music": 40 - }, - { - "name": "Iceberg 5 - 31", - "level": 5, - "stage": 5, - "room": 31, - "pointer": 3026019, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 200, - "name": "Iceberg 5 - 31 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 5 - Animal 3", - "Iceberg 5 - Animal 4" - ], - "music": 40 - }, - { - "name": "Iceberg 5 - 32", - "level": 5, - "stage": 5, - "room": 32, - "pointer": 3039996, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 13, - "unkn2": 7, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 32 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 5 - Animal 5", - "Iceberg 5 - Animal 6" - ], - "music": 40 - }, - { - "name": "Iceberg 5 - 33", - "level": 5, - "stage": 5, - "room": 33, - "pointer": 3015302, - "animal_pointers": [ - 192, - 200 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 18, - "unkn1": 10, - "unkn2": 6, - "x": 72, - "y": 152, - "name": "Iceberg 5 - 33 Exit 0", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 5 - Animal 7", - "Iceberg 5 - Animal 8" - ], - "music": 40 - }, - { - "name": "Iceberg 5 - 34", - "level": 5, - "stage": 5, - "room": 34, - "pointer": 3185868, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Peran" - ], - "default_exits": [ - { - "room": 35, - "unkn1": 35, - "unkn2": 9, - "x": 200, - "y": 328, - "name": "Iceberg 5 - 34 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 72, - 16 - ], - [ - 4, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 5 - Enemy 31 (Peran)", - "Iceberg 5 - Star 33", - "Iceberg 5 - Star 34" - ], - "music": 16 - }, - { - "name": "Iceberg 5 - 35", - "level": 5, - "stage": 5, - "room": 35, - "pointer": 3865635, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 29, - "unkn1": 12, - "unkn2": 7, - "x": 168, - "y": 1384, - "name": "Iceberg 5 - 35 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 17, - 16 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 16 - }, - { - "name": "Iceberg 5 - 36", - "level": 5, - "stage": 5, - "room": 36, - "pointer": 3024154, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 37, - "unkn1": 13, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 5 - 36 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 32, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Iceberg 5 - Shiro" - ], - "music": 8 - }, - { - "name": "Iceberg 5 - 37", - "level": 5, - "stage": 5, - "room": 37, - "pointer": 2890594, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 5 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg 6 - 0", - "level": 5, - "stage": 6, - "room": 0, - "pointer": 3385305, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nruff" - ], - "default_exits": [ - { - "room": 1, - "unkn1": 6, - "unkn2": 28, - "x": 136, - "y": 184, - "name": "Iceberg 6 - 0 Exit 0", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 12, - "unkn2": 28, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 0 Exit 1", - "access_rule": [] - }, - { - "room": 1, - "unkn1": 18, - "unkn2": 28, - "x": 360, - "y": 184, - "name": "Iceberg 6 - 0 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 15, - 16 - ] - ], - "locations": [ - "Iceberg 6 - Enemy 1 (Nruff)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 1", - "level": 5, - "stage": 6, - "room": 1, - "pointer": 3197599, - "animal_pointers": [ - 212, - 220, - 228 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 2, - "unkn1": 8, - "unkn2": 5, - "x": 152, - "y": 184, - "name": "Iceberg 6 - 1 Exit 0", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 15, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 1 Exit 1", - "access_rule": [] - }, - { - "room": 2, - "unkn1": 22, - "unkn2": 5, - "x": 344, - "y": 184, - "name": "Iceberg 6 - 1 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 6 - Animal 1", - "Iceberg 6 - Animal 2", - "Iceberg 6 - Animal 3" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 2", - "level": 5, - "stage": 6, - "room": 2, - "pointer": 3097113, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 5, - "unkn1": 9, - "unkn2": 5, - "x": 136, - "y": 184, - "name": "Iceberg 6 - 2 Exit 0", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 15, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 2 Exit 1", - "access_rule": [] - }, - { - "room": 5, - "unkn1": 21, - "unkn2": 5, - "x": 360, - "y": 184, - "name": "Iceberg 6 - 2 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 3", - "level": 5, - "stage": 6, - "room": 3, - "pointer": 3198422, - "animal_pointers": [ - 212, - 220, - 228 - ], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 6, - "unkn1": 8, - "unkn2": 5, - "x": 152, - "y": 184, - "name": "Iceberg 6 - 3 Exit 0", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 15, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 3 Exit 1", - "access_rule": [] - }, - { - "room": 6, - "unkn1": 22, - "unkn2": 5, - "x": 344, - "y": 184, - "name": "Iceberg 6 - 3 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [ - "Iceberg 6 - Animal 4", - "Iceberg 6 - Animal 5", - "Iceberg 6 - Animal 6" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 4", - "level": 5, - "stage": 6, - "room": 4, - "pointer": 3210507, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 3, - "unkn1": 9, - "unkn2": 5, - "x": 136, - "y": 184, - "name": "Iceberg 6 - 4 Exit 0", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 15, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 4 Exit 1", - "access_rule": [] - }, - { - "room": 3, - "unkn1": 21, - "unkn2": 5, - "x": 360, - "y": 184, - "name": "Iceberg 6 - 4 Exit 2", - "access_rule": [] - } - ], - "entity_load": [], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 5", - "level": 5, - "stage": 6, - "room": 5, - "pointer": 3196776, - "animal_pointers": [], - "consumables": [ - { - "idx": 0, - "pointer": 212, - "x": 136, - "y": 120, - "etype": 22, - "vtype": 2, - "name": "Iceberg 6 - Maxim Tomato (Left)" - }, - { - "idx": 1, - "pointer": 220, - "x": 248, - "y": 120, - "etype": 22, - "vtype": 0, - "name": "Iceberg 6 - 1-Up (Middle)" - } - ], - "consumables_pointer": 128, - "enemies": [], - "default_exits": [ - { - "room": 4, - "unkn1": 8, - "unkn2": 5, - "x": 152, - "y": 184, - "name": "Iceberg 6 - 5 Exit 0", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 15, - "unkn2": 5, - "x": 248, - "y": 184, - "name": "Iceberg 6 - 5 Exit 1", - "access_rule": [] - }, - { - "room": 4, - "unkn1": 22, - "unkn2": 5, - "x": 344, - "y": 184, - "name": "Iceberg 6 - 5 Exit 2", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 22 - ], - [ - 0, - 22 - ], - [ - 14, - 23 - ] - ], - "locations": [ - "Iceberg 6 - Star 1", - "Iceberg 6 - Maxim Tomato (Left)", - "Iceberg 6 - 1-Up (Middle)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 6", - "level": 5, - "stage": 6, - "room": 6, - "pointer": 3208130, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Nidoo" - ], - "default_exits": [ - { - "room": 7, - "unkn1": 9, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 6 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 28, - 16 - ] - ], - "locations": [ - "Iceberg 6 - Enemy 2 (Nidoo)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 7", - "level": 5, - "stage": 6, - "room": 7, - "pointer": 3124478, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sparky" - ], - "default_exits": [ - { - "room": 8, - "unkn1": 17, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 7 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 8, - 16 - ] - ], - "locations": [ - "Iceberg 6 - Enemy 3 (Sparky)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 8", - "level": 5, - "stage": 6, - "room": 8, - "pointer": 3110431, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 9, - "unkn1": 7, - "unkn2": 5, - "x": 152, - "y": 168, - "name": "Iceberg 6 - 8 Exit 0", - "access_rule": [] - }, - { - "room": 14, - "unkn1": 14, - "unkn2": 5, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 8 Exit 1", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 22 - ], - [ - 33, - 19 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 9", - "level": 5, - "stage": 6, - "room": 9, - "pointer": 3139832, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 10, - "unkn1": 16, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 9 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 2, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 1 (Blocky)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 10", - "level": 5, - "stage": 6, - "room": 10, - "pointer": 3119624, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 11, - "unkn1": 7, - "unkn2": 5, - "x": 152, - "y": 168, - "name": "Iceberg 6 - 10 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 11", - "level": 5, - "stage": 6, - "room": 11, - "pointer": 3141139, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 12, - "unkn1": 16, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 11 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 3, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 2 (Jumper Shoot)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 12", - "level": 5, - "stage": 6, - "room": 12, - "pointer": 3123788, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 13, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 12 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 13", - "level": 5, - "stage": 6, - "room": 13, - "pointer": 3143741, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 14, - "unkn1": 15, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 13 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 1, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 3 (Yuki)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 14", - "level": 5, - "stage": 6, - "room": 14, - "pointer": 3120319, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 15, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 14 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 15", - "level": 5, - "stage": 6, - "room": 15, - "pointer": 3135238, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [ - "Sir Kibble" - ], - "default_exits": [ - { - "room": 16, - "unkn1": 15, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 15 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 27, - 16 - ] - ], - "locations": [ - "Iceberg 6 - Enemy 4 (Sir Kibble)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 16", - "level": 5, - "stage": 6, - "room": 16, - "pointer": 3123096, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 17, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 16 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 22 - ], - [ - 33, - 19 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 17", - "level": 5, - "stage": 6, - "room": 17, - "pointer": 3144389, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 18, - "unkn1": 15, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 17 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 5, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 4 (Haboki)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 18", - "level": 5, - "stage": 6, - "room": 18, - "pointer": 3121014, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 19, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 18 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 19", - "level": 5, - "stage": 6, - "room": 19, - "pointer": 3017228, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 20, - "unkn1": 15, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 19 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 4, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 5 (Boboo)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 20", - "level": 5, - "stage": 6, - "room": 20, - "pointer": 3121709, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 21, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 168, - "name": "Iceberg 6 - 20 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 21", - "level": 5, - "stage": 6, - "room": 21, - "pointer": 3145036, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 22, - "unkn1": 15, - "unkn2": 10, - "x": 296, - "y": 136, - "name": "Iceberg 6 - 21 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 0, - 27 - ] - ], - "locations": [ - "Iceberg 6 - Miniboss 6 (Captain Stitch)" - ], - "music": 12 - }, - { - "name": "Iceberg 6 - 22", - "level": 5, - "stage": 6, - "room": 22, - "pointer": 3116830, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 23, - "unkn1": 7, - "unkn2": 5, - "x": 136, - "y": 152, - "name": "Iceberg 6 - 22 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 4, - 22 - ] - ], - "locations": [], - "music": 12 - }, - { - "name": "Iceberg 6 - 23", - "level": 5, - "stage": 6, - "room": 23, - "pointer": 3045263, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [ - { - "room": 24, - "unkn1": 17, - "unkn2": 9, - "x": 72, - "y": 120, - "name": "Iceberg 6 - 23 Exit 0", - "access_rule": [] - } - ], - "entity_load": [ - [ - 33, - 19 - ], - [ - 42, - 19 - ] - ], - "locations": [ - "Iceberg 6 - Angel" - ], - "music": 8 - }, - { - "name": "Iceberg 6 - 24", - "level": 5, - "stage": 6, - "room": 24, - "pointer": 2889389, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 38, - 19 - ] - ], - "locations": [ - "Iceberg 6 - Complete" - ], - "music": 5 - }, - { - "name": "Iceberg Boss - 0", - "level": 5, - "stage": 7, - "room": 0, - "pointer": 2980207, - "animal_pointers": [], - "consumables": [], - "consumables_pointer": 0, - "enemies": [], - "default_exits": [], - "entity_load": [ - [ - 8, - 18 - ] - ], - "locations": [ - "Iceberg - Boss (Dedede) Purified", - "Level 5 Boss - Defeated", - "Level 5 Boss - Purified" - ], - "music": 7 - } -] \ No newline at end of file +[{"name": "Grass Land 1 - 0", "level": 1, "stage": 1, "room": 0, "pointer": 3434257, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sir Kibble", "Cappy"], "default_exits": [{"room": 1, "unkn1": 205, "unkn2": 8, "x": 72, "y": 200, "name": "Grass Land 1 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 87, "unkn2": 9, "x": 104, "y": 152, "name": "Grass Land 1 - 0 Exit 1", "access_rule": []}], "entity_load": [[0, 16], [1, 23], [0, 23], [14, 23], [27, 16], [12, 16], [4, 22]], "locations": ["Grass Land 1 - Enemy 1 (Waddle Dee)", "Grass Land 1 - Enemy 2 (Sir Kibble)", "Grass Land 1 - Enemy 3 (Cappy)", "Grass Land 1 - Star 1", "Grass Land 1 - Star 2", "Grass Land 1 - Star 3", "Grass Land 1 - Star 4", "Grass Land 1 - Star 5", "Grass Land 1 - Star 6", "Grass Land 1 - Star 7", "Grass Land 1 - Star 8", "Grass Land 1 - Star 9", "Grass Land 1 - Star 10"], "music": 20}, {"name": "Grass Land 1 - 1", "level": 1, "stage": 1, "room": 1, "pointer": 3368373, "animal_pointers": [], "consumables": [{"idx": 14, "pointer": 264, "x": 928, "y": 160, "etype": 22, "vtype": 0, "name": "Grass Land 1 - 1-Up (Parasol)"}, {"idx": 15, "pointer": 312, "x": 1456, "y": 176, "etype": 22, "vtype": 2, "name": "Grass Land 1 - Maxim Tomato (Spark)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Bronto Burt", "Sasuke"], "default_exits": [{"room": 3, "unkn1": 143, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [30, 16], [12, 16], [14, 23], [8, 16], [0, 22], [2, 22]], "locations": ["Grass Land 1 - Enemy 4 (Sparky)", "Grass Land 1 - Enemy 5 (Bronto Burt)", "Grass Land 1 - Enemy 6 (Sasuke)", "Grass Land 1 - Star 11", "Grass Land 1 - Star 12", "Grass Land 1 - Star 13", "Grass Land 1 - Star 14", "Grass Land 1 - Star 15", "Grass Land 1 - 1-Up (Parasol)", "Grass Land 1 - Maxim Tomato (Spark)"], "music": 20}, {"name": "Grass Land 1 - 2", "level": 1, "stage": 1, "room": 2, "pointer": 2960650, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 1416, "y": 152, "name": "Grass Land 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 1 - Animal 1", "Grass Land 1 - Animal 2"], "music": 38}, {"name": "Grass Land 1 - 3", "level": 1, "stage": 1, "room": 3, "pointer": 3478442, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 179, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [7, 16], [0, 23], [6, 22], [14, 23], [8, 16], [1, 23]], "locations": ["Grass Land 1 - Enemy 7 (Poppy Bros Jr.)", "Grass Land 1 - Star 16", "Grass Land 1 - Star 17", "Grass Land 1 - Star 18", "Grass Land 1 - Star 19", "Grass Land 1 - Star 20", "Grass Land 1 - Star 21", "Grass Land 1 - Star 22", "Grass Land 1 - Star 23"], "music": 20}, {"name": "Grass Land 1 - 4", "level": 1, "stage": 1, "room": 4, "pointer": 2978390, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [42, 19]], "locations": ["Grass Land 1 - Tulip"], "music": 8}, {"name": "Grass Land 1 - 5", "level": 1, "stage": 1, "room": 5, "pointer": 2890835, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 1 - Complete"], "music": 5}, {"name": "Grass Land 2 - 0", "level": 1, "stage": 2, "room": 0, "pointer": 3293347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "KeKe", "Bobo", "Poppy Bros Jr."], "default_exits": [{"room": 1, "unkn1": 112, "unkn2": 9, "x": 72, "y": 152, "name": "Grass Land 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [7, 16], [5, 16], [4, 22], [51, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 1 (Rocky)", "Grass Land 2 - Enemy 2 (KeKe)", "Grass Land 2 - Enemy 3 (Bobo)", "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)", "Grass Land 2 - Star 1", "Grass Land 2 - Star 2", "Grass Land 2 - Star 3", "Grass Land 2 - Star 4", "Grass Land 2 - Star 5", "Grass Land 2 - Star 6", "Grass Land 2 - Star 7", "Grass Land 2 - Star 8", "Grass Land 2 - Star 9", "Grass Land 2 - Star 10"], "music": 11}, {"name": "Grass Land 2 - 1", "level": 1, "stage": 2, "room": 1, "pointer": 3059685, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 9, "x": 56, "y": 136, "name": "Grass Land 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 2 - Animal 1", "Grass Land 2 - Animal 2"], "music": 39}, {"name": "Grass Land 2 - 2", "level": 1, "stage": 2, "room": 2, "pointer": 3432109, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Popon Ball", "Bouncy"], "default_exits": [{"room": 4, "unkn1": 133, "unkn2": 11, "x": 72, "y": 200, "name": "Grass Land 2 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 52, "unkn2": 12, "x": 56, "y": 152, "name": "Grass Land 2 - 2 Exit 1", "access_rule": []}], "entity_load": [[13, 16], [50, 16], [4, 22], [3, 16], [0, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 5 (Waddle Dee)", "Grass Land 2 - Enemy 6 (Popon Ball)", "Grass Land 2 - Enemy 7 (Bouncy)", "Grass Land 2 - Star 11", "Grass Land 2 - Star 12", "Grass Land 2 - Star 13"], "music": 11}, {"name": "Grass Land 2 - 3", "level": 1, "stage": 2, "room": 3, "pointer": 2970029, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 2, "unkn2": 9, "x": 840, "y": 168, "name": "Grass Land 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 19]], "locations": [], "music": 11}, {"name": "Grass Land 2 - 4", "level": 1, "stage": 2, "room": 4, "pointer": 3578022, "animal_pointers": [], "consumables": [{"idx": 20, "pointer": 272, "x": 992, "y": 192, "etype": 22, "vtype": 0, "name": "Grass Land 2 - 1-Up (Needle)"}], "consumables_pointer": 352, "enemies": ["Tick", "Bronto Burt", "Nruff"], "default_exits": [{"room": 5, "unkn1": 154, "unkn2": 12, "x": 72, "y": 152, "name": "Grass Land 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [5, 16], [2, 16], [48, 16], [14, 23], [0, 22]], "locations": ["Grass Land 2 - Enemy 8 (Tick)", "Grass Land 2 - Enemy 9 (Bronto Burt)", "Grass Land 2 - Enemy 10 (Nruff)", "Grass Land 2 - Star 14", "Grass Land 2 - Star 15", "Grass Land 2 - Star 16", "Grass Land 2 - Star 17", "Grass Land 2 - Star 18", "Grass Land 2 - Star 19", "Grass Land 2 - Star 20", "Grass Land 2 - Star 21", "Grass Land 2 - 1-Up (Needle)"], "music": 11}, {"name": "Grass Land 2 - 5", "level": 1, "stage": 2, "room": 5, "pointer": 2966057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 19], [42, 19]], "locations": ["Grass Land 2 - Muchimuchi"], "music": 8}, {"name": "Grass Land 2 - 6", "level": 1, "stage": 2, "room": 6, "pointer": 2887461, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 2 - Complete"], "music": 5}, {"name": "Grass Land 3 - 0", "level": 1, "stage": 3, "room": 0, "pointer": 3149707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Rocky", "Nruff"], "default_exits": [{"room": 1, "unkn1": 107, "unkn2": 7, "x": 72, "y": 840, "name": "Grass Land 3 - 0 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 46, "unkn2": 9, "x": 152, "y": 152, "name": "Grass Land 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [14, 23], [15, 16], [0, 16], [8, 16]], "locations": ["Grass Land 3 - Enemy 1 (Sparky)", "Grass Land 3 - Enemy 2 (Rocky)", "Grass Land 3 - Enemy 3 (Nruff)", "Grass Land 3 - Star 1", "Grass Land 3 - Star 2", "Grass Land 3 - Star 3", "Grass Land 3 - Star 4", "Grass Land 3 - Star 5", "Grass Land 3 - Star 6", "Grass Land 3 - Star 7", "Grass Land 3 - Star 8", "Grass Land 3 - Star 9", "Grass Land 3 - Star 10"], "music": 19}, {"name": "Grass Land 3 - 1", "level": 1, "stage": 3, "room": 1, "pointer": 3204939, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 360, "x": 208, "y": 344, "etype": 22, "vtype": 0, "name": "Grass Land 3 - 1-Up (Climb)"}, {"idx": 11, "pointer": 376, "x": 224, "y": 568, "etype": 22, "vtype": 2, "name": "Grass Land 3 - Maxim Tomato (Climb)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [6, 23], [2, 22], [5, 23], [14, 23], [1, 23], [0, 23], [31, 16]], "locations": ["Grass Land 3 - Star 11", "Grass Land 3 - Star 12", "Grass Land 3 - Star 13", "Grass Land 3 - Star 14", "Grass Land 3 - Star 15", "Grass Land 3 - Star 16", "Grass Land 3 - 1-Up (Climb)", "Grass Land 3 - Maxim Tomato (Climb)"], "music": 19}, {"name": "Grass Land 3 - 2", "level": 1, "stage": 3, "room": 2, "pointer": 3200066, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 55, "x": 56, "y": 152, "name": "Grass Land 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [14, 23]], "locations": ["Grass Land 3 - Star 17", "Grass Land 3 - Star 18", "Grass Land 3 - Star 19", "Grass Land 3 - Star 20", "Grass Land 3 - Star 21", "Grass Land 3 - Star 22", "Grass Land 3 - Star 23", "Grass Land 3 - Star 24", "Grass Land 3 - Star 25", "Grass Land 3 - Star 26"], "music": 19}, {"name": "Grass Land 3 - 3", "level": 1, "stage": 3, "room": 3, "pointer": 2959784, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 15, "unkn2": 9, "x": 56, "y": 120, "name": "Grass Land 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 31}, {"name": "Grass Land 3 - 4", "level": 1, "stage": 3, "room": 4, "pointer": 2979121, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 8, "unkn2": 9, "x": 760, "y": 152, "name": "Grass Land 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 3 - Animal 1", "Grass Land 3 - Animal 2"], "music": 40}, {"name": "Grass Land 3 - 5", "level": 1, "stage": 3, "room": 5, "pointer": 2997811, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 8}, {"name": "Grass Land 3 - 6", "level": 1, "stage": 3, "room": 6, "pointer": 3084876, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bouncy"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [14, 16], [1, 23], [59, 16], [14, 23]], "locations": ["Grass Land 3 - Pitcherman", "Grass Land 3 - Enemy 4 (Bouncy)", "Grass Land 3 - Star 27", "Grass Land 3 - Star 28", "Grass Land 3 - Star 29", "Grass Land 3 - Star 30", "Grass Land 3 - Star 31"], "music": 19}, {"name": "Grass Land 3 - 7", "level": 1, "stage": 3, "room": 7, "pointer": 2891317, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 3 - Complete"], "music": 5}, {"name": "Grass Land 4 - 0", "level": 1, "stage": 4, "room": 0, "pointer": 3471284, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Babut", "Rocky"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 13, "x": 72, "y": 136, "name": "Grass Land 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [14, 23], [40, 16], [61, 16], [4, 22]], "locations": ["Grass Land 4 - Enemy 1 (Loud)", "Grass Land 4 - Enemy 2 (Babut)", "Grass Land 4 - Enemy 3 (Rocky)", "Grass Land 4 - Star 1", "Grass Land 4 - Star 2", "Grass Land 4 - Star 3", "Grass Land 4 - Star 4", "Grass Land 4 - Star 5", "Grass Land 4 - Star 6", "Grass Land 4 - Star 7", "Grass Land 4 - Star 8", "Grass Land 4 - Star 9"], "music": 10}, {"name": "Grass Land 4 - 1", "level": 1, "stage": 4, "room": 1, "pointer": 3436401, "animal_pointers": [], "consumables": [{"idx": 12, "pointer": 290, "x": 1008, "y": 144, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Zebon Right)"}], "consumables_pointer": 368, "enemies": ["Kapar"], "default_exits": [{"room": 5, "unkn1": 58, "unkn2": 5, "x": 184, "y": 312, "name": "Grass Land 4 - 1 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 42, "unkn2": 18, "x": 168, "y": 88, "name": "Grass Land 4 - 1 Exit 1", "access_rule": []}], "entity_load": [[43, 16], [10, 23], [6, 22], [14, 23], [2, 22], [67, 16]], "locations": ["Grass Land 4 - Enemy 4 (Kapar)", "Grass Land 4 - Star 10", "Grass Land 4 - Maxim Tomato (Zebon Right)"], "music": 10}, {"name": "Grass Land 4 - 2", "level": 1, "stage": 4, "room": 2, "pointer": 3039401, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 4, "x": 56, "y": 72, "name": "Grass Land 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": [], "music": 9}, {"name": "Grass Land 4 - 3", "level": 1, "stage": 4, "room": 3, "pointer": 3722714, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 280, "x": 856, "y": 224, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Gordo)"}, {"idx": 22, "pointer": 480, "x": 1352, "y": 112, "etype": 22, "vtype": 0, "name": "Grass Land 4 - 1-Up (Gordo)"}], "consumables_pointer": 288, "enemies": ["Glunk", "Oro"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 5, "x": 72, "y": 200, "name": "Grass Land 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [55, 16], [16, 16], [25, 16], [14, 23], [0, 22], [2, 22], [4, 22]], "locations": ["Grass Land 4 - Enemy 5 (Glunk)", "Grass Land 4 - Enemy 6 (Oro)", "Grass Land 4 - Star 11", "Grass Land 4 - Star 12", "Grass Land 4 - Star 13", "Grass Land 4 - Star 14", "Grass Land 4 - Star 15", "Grass Land 4 - Star 16", "Grass Land 4 - Star 17", "Grass Land 4 - Star 18", "Grass Land 4 - Star 19", "Grass Land 4 - Star 20", "Grass Land 4 - Star 21", "Grass Land 4 - Star 22", "Grass Land 4 - Star 23", "Grass Land 4 - Star 24", "Grass Land 4 - Star 25", "Grass Land 4 - Star 26", "Grass Land 4 - Maxim Tomato (Gordo)", "Grass Land 4 - 1-Up (Gordo)"], "music": 10}, {"name": "Grass Land 4 - 4", "level": 1, "stage": 4, "room": 4, "pointer": 3304980, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 208, "x": 488, "y": 64, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Cliff)"}], "consumables_pointer": 160, "enemies": [], "default_exits": [{"room": 8, "unkn1": 94, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [2, 22], [54, 16], [1, 16], [40, 16], [14, 23]], "locations": ["Grass Land 4 - Star 27", "Grass Land 4 - Maxim Tomato (Cliff)"], "music": 10}, {"name": "Grass Land 4 - 5", "level": 1, "stage": 4, "room": 5, "pointer": 3498127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 2, "unkn1": 61, "unkn2": 13, "x": 56, "y": 72, "name": "Grass Land 4 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 61, "unkn2": 18, "x": 56, "y": 200, "name": "Grass Land 4 - 5 Exit 1", "access_rule": []}], "entity_load": [[72, 16], [43, 16], [4, 22], [14, 23], [10, 23], [3, 16]], "locations": ["Grass Land 4 - Enemy 7 (Peran)", "Grass Land 4 - Star 28", "Grass Land 4 - Star 29", "Grass Land 4 - Star 30", "Grass Land 4 - Star 31", "Grass Land 4 - Star 32", "Grass Land 4 - Star 33", "Grass Land 4 - Star 34", "Grass Land 4 - Star 35", "Grass Land 4 - Star 36", "Grass Land 4 - Star 37"], "music": 10}, {"name": "Grass Land 4 - 6", "level": 1, "stage": 4, "room": 6, "pointer": 3160191, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 28, "unkn2": 4, "x": 72, "y": 376, "name": "Grass Land 4 - 6 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 28, "unkn2": 12, "x": 72, "y": 440, "name": "Grass Land 4 - 6 Exit 1", "access_rule": []}], "entity_load": [[3, 19], [6, 23]], "locations": [], "music": 10}, {"name": "Grass Land 4 - 7", "level": 1, "stage": 4, "room": 7, "pointer": 3035801, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 12, "x": 56, "y": 200, "name": "Grass Land 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Grass Land 4 - Miniboss 1 (Boboo)"], "music": 4}, {"name": "Grass Land 4 - 8", "level": 1, "stage": 4, "room": 8, "pointer": 2989794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[3, 19], [42, 19]], "locations": ["Grass Land 4 - Chao & Goku"], "music": 8}, {"name": "Grass Land 4 - 9", "level": 1, "stage": 4, "room": 9, "pointer": 3043518, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 9, "unkn2": 5, "x": 696, "y": 296, "name": "Grass Land 4 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 4 - Animal 1", "Grass Land 4 - Animal 2"], "music": 38}, {"name": "Grass Land 4 - 10", "level": 1, "stage": 4, "room": 10, "pointer": 2888425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 4 - Complete"], "music": 5}, {"name": "Grass Land 5 - 0", "level": 1, "stage": 5, "room": 0, "pointer": 3303565, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 1, "unkn1": 120, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [4, 22], [14, 23], [6, 23], [11, 16], [89, 16]], "locations": ["Grass Land 5 - Enemy 1 (Propeller)", "Grass Land 5 - Enemy 2 (Broom Hatter)", "Grass Land 5 - Enemy 3 (Bouncy)", "Grass Land 5 - Star 1", "Grass Land 5 - Star 2", "Grass Land 5 - Star 3", "Grass Land 5 - Star 4", "Grass Land 5 - Star 5", "Grass Land 5 - Star 6", "Grass Land 5 - Star 7", "Grass Land 5 - Star 8"], "music": 11}, {"name": "Grass Land 5 - 1", "level": 1, "stage": 5, "room": 1, "pointer": 3048718, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 3, "unkn1": 18, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 21, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 36, "unkn2": 9, "x": 56, "y": 88, "name": "Grass Land 5 - 1 Exit 2", "access_rule": []}], "entity_load": [[27, 16], [14, 23]], "locations": ["Grass Land 5 - Enemy 4 (Sir Kibble)", "Grass Land 5 - Star 9", "Grass Land 5 - Star 10"], "music": 11}, {"name": "Grass Land 5 - 2", "level": 1, "stage": 5, "room": 2, "pointer": 3327019, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sasuke", "Nruff"], "default_exits": [{"room": 7, "unkn1": 121, "unkn2": 6, "x": 56, "y": 72, "name": "Grass Land 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [4, 22], [30, 16], [15, 16], [1, 16]], "locations": ["Grass Land 5 - Enemy 5 (Waddle Dee)", "Grass Land 5 - Enemy 6 (Sasuke)", "Grass Land 5 - Enemy 7 (Nruff)", "Grass Land 5 - Star 11", "Grass Land 5 - Star 12", "Grass Land 5 - Star 13", "Grass Land 5 - Star 14", "Grass Land 5 - Star 15", "Grass Land 5 - Star 16"], "music": 11}, {"name": "Grass Land 5 - 3", "level": 1, "stage": 5, "room": 3, "pointer": 2966459, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 312, "y": 72, "name": "Grass Land 5 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 1", "Grass Land 5 - Animal 2"], "music": 38}, {"name": "Grass Land 5 - 4", "level": 1, "stage": 5, "room": 4, "pointer": 2973509, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 360, "y": 72, "name": "Grass Land 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 3", "Grass Land 5 - Animal 4"], "music": 38}, {"name": "Grass Land 5 - 5", "level": 1, "stage": 5, "room": 5, "pointer": 2962351, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[4, 19], [42, 19]], "locations": ["Grass Land 5 - Mine"], "music": 8}, {"name": "Grass Land 5 - 6", "level": 1, "stage": 5, "room": 6, "pointer": 2886738, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 5 - Complete"], "music": 5}, {"name": "Grass Land 5 - 7", "level": 1, "stage": 5, "room": 7, "pointer": 3255423, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [4, 22], [14, 23]], "locations": ["Grass Land 5 - Enemy 8 (Tick)", "Grass Land 5 - Star 17", "Grass Land 5 - Star 18", "Grass Land 5 - Star 19", "Grass Land 5 - Star 20", "Grass Land 5 - Star 21", "Grass Land 5 - Star 22", "Grass Land 5 - Star 23", "Grass Land 5 - Star 24", "Grass Land 5 - Star 25", "Grass Land 5 - Star 26", "Grass Land 5 - Star 27", "Grass Land 5 - Star 28", "Grass Land 5 - Star 29"], "music": 11}, {"name": "Grass Land 6 - 0", "level": 1, "stage": 6, "room": 0, "pointer": 3376872, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Togezo", "Bronto Burt", "Cappy"], "default_exits": [{"room": 6, "unkn1": 51, "unkn2": 9, "x": 216, "y": 152, "name": "Grass Land 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 96, "unkn2": 9, "x": 216, "y": 1144, "name": "Grass Land 6 - 0 Exit 1", "access_rule": []}], "entity_load": [[12, 16], [18, 16], [2, 16], [41, 16], [4, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 1 (Como)", "Grass Land 6 - Enemy 2 (Togezo)", "Grass Land 6 - Enemy 3 (Bronto Burt)", "Grass Land 6 - Enemy 4 (Cappy)", "Grass Land 6 - Star 1", "Grass Land 6 - Star 2", "Grass Land 6 - Star 3", "Grass Land 6 - Star 4", "Grass Land 6 - Star 5", "Grass Land 6 - Star 6", "Grass Land 6 - Star 7", "Grass Land 6 - Star 8", "Grass Land 6 - Star 9"], "music": 20}, {"name": "Grass Land 6 - 1", "level": 1, "stage": 6, "room": 1, "pointer": 3395125, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 192, "x": 104, "y": 1144, "etype": 22, "vtype": 0, "name": "Grass Land 6 - 1-Up (Tower)"}], "consumables_pointer": 256, "enemies": ["Bobo", "Mariel"], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 5, "x": 72, "y": 88, "name": "Grass Land 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [5, 19], [45, 16], [0, 22], [4, 22], [14, 23], [55, 16]], "locations": ["Grass Land 6 - Enemy 5 (Bobo)", "Grass Land 6 - Enemy 6 (Mariel)", "Grass Land 6 - Star 10", "Grass Land 6 - Star 11", "Grass Land 6 - Star 12", "Grass Land 6 - Star 13", "Grass Land 6 - Star 14", "Grass Land 6 - 1-Up (Tower)"], "music": 20}, {"name": "Grass Land 6 - 2", "level": 1, "stage": 6, "room": 2, "pointer": 3375177, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter"], "default_exits": [{"room": 3, "unkn1": 93, "unkn2": 6, "x": 200, "y": 152, "name": "Grass Land 6 - 2 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 49, "unkn2": 7, "x": 216, "y": 104, "name": "Grass Land 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[11, 16], [45, 16], [41, 16], [4, 22], [32, 16], [14, 23]], "locations": ["Grass Land 6 - Enemy 7 (Yaban)", "Grass Land 6 - Enemy 8 (Broom Hatter)", "Grass Land 6 - Star 15", "Grass Land 6 - Star 16"], "music": 20}, {"name": "Grass Land 6 - 3", "level": 1, "stage": 6, "room": 3, "pointer": 3322977, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Apolo", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 52, "x": 72, "y": 104, "name": "Grass Land 6 - 3 Exit 0", "access_rule": []}], "entity_load": [[41, 16], [49, 16], [30, 16], [14, 23], [4, 22]], "locations": ["Grass Land 6 - Enemy 9 (Apolo)", "Grass Land 6 - Enemy 10 (Sasuke)", "Grass Land 6 - Star 17", "Grass Land 6 - Star 18", "Grass Land 6 - Star 19", "Grass Land 6 - Star 20", "Grass Land 6 - Star 21", "Grass Land 6 - Star 22", "Grass Land 6 - Star 23", "Grass Land 6 - Star 24", "Grass Land 6 - Star 25"], "music": 20}, {"name": "Grass Land 6 - 4", "level": 1, "stage": 6, "room": 4, "pointer": 3490819, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 192, "x": 40, "y": 104, "etype": 22, "vtype": 1, "name": "Grass Land 6 - 1-Up (Falling)"}], "consumables_pointer": 176, "enemies": ["Rocky"], "default_exits": [{"room": 5, "unkn1": 145, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [4, 22], [49, 16], [61, 16], [3, 16], [1, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 11 (Rocky)", "Grass Land 6 - Star 26", "Grass Land 6 - Star 27", "Grass Land 6 - Star 28", "Grass Land 6 - Star 29", "Grass Land 6 - 1-Up (Falling)"], "music": 20}, {"name": "Grass Land 6 - 5", "level": 1, "stage": 6, "room": 5, "pointer": 3076769, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 19], [42, 19]], "locations": ["Grass Land 6 - Pierre"], "music": 8}, {"name": "Grass Land 6 - 6", "level": 1, "stage": 6, "room": 6, "pointer": 3047576, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 9, "x": 840, "y": 152, "name": "Grass Land 6 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 1", "Grass Land 6 - Animal 2"], "music": 39}, {"name": "Grass Land 6 - 7", "level": 1, "stage": 6, "room": 7, "pointer": 3022909, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 808, "y": 120, "name": "Grass Land 6 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 3", "Grass Land 6 - Animal 4"], "music": 38}, {"name": "Grass Land 6 - 8", "level": 1, "stage": 6, "room": 8, "pointer": 2884569, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 6 - Complete"], "music": 5}, {"name": "Grass Land Boss - 0", "level": 1, "stage": 7, "room": 0, "pointer": 2984105, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[0, 18]], "locations": ["Grass Land - Boss (Whispy Woods) Purified", "Level 1 Boss - Defeated", "Level 1 Boss - Purified"], "music": 2}, {"name": "Ripple Field 1 - 0", "level": 2, "stage": 1, "room": 0, "pointer": 3279855, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Glunk", "Broom Hatter", "Cappy"], "default_exits": [{"room": 2, "unkn1": 102, "unkn2": 8, "x": 56, "y": 152, "name": "Ripple Field 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[16, 16], [0, 16], [12, 16], [11, 16], [14, 23]], "locations": ["Ripple Field 1 - Enemy 1 (Waddle Dee)", "Ripple Field 1 - Enemy 2 (Glunk)", "Ripple Field 1 - Enemy 3 (Broom Hatter)", "Ripple Field 1 - Enemy 4 (Cappy)", "Ripple Field 1 - Star 1", "Ripple Field 1 - Star 2", "Ripple Field 1 - Star 3", "Ripple Field 1 - Star 4", "Ripple Field 1 - Star 5", "Ripple Field 1 - Star 6"], "music": 15}, {"name": "Ripple Field 1 - 1", "level": 2, "stage": 1, "room": 1, "pointer": 3588688, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 11, "x": 40, "y": 232, "name": "Ripple Field 1 - 1 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 108, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 138, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [2, 16], [3, 16], [7, 16]], "locations": ["Ripple Field 1 - Enemy 5 (Bronto Burt)", "Ripple Field 1 - Enemy 6 (Rocky)", "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 1 - 2", "level": 2, "stage": 1, "room": 2, "pointer": 2955848, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 18, "unkn2": 9, "x": 56, "y": 168, "name": "Ripple Field 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 1 - Animal 1", "Ripple Field 1 - Animal 2"], "music": 40}, {"name": "Ripple Field 1 - 3", "level": 2, "stage": 1, "room": 3, "pointer": 3558828, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin"], "default_exits": [{"room": 4, "unkn1": 171, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[73, 16], [6, 22], [14, 23], [4, 22], [0, 16], [10, 23]], "locations": ["Ripple Field 1 - Enemy 8 (Bobin)", "Ripple Field 1 - Star 7", "Ripple Field 1 - Star 8", "Ripple Field 1 - Star 9", "Ripple Field 1 - Star 10", "Ripple Field 1 - Star 11", "Ripple Field 1 - Star 12", "Ripple Field 1 - Star 13", "Ripple Field 1 - Star 14", "Ripple Field 1 - Star 15", "Ripple Field 1 - Star 16"], "music": 15}, {"name": "Ripple Field 1 - 4", "level": 2, "stage": 1, "room": 4, "pointer": 2974271, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [42, 19]], "locations": ["Ripple Field 1 - Kamuribana"], "music": 8}, {"name": "Ripple Field 1 - 5", "level": 2, "stage": 1, "room": 5, "pointer": 3051513, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 264, "name": "Ripple Field 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": ["Ripple Field 1 - Star 17", "Ripple Field 1 - Star 18"], "music": 15}, {"name": "Ripple Field 1 - 6", "level": 2, "stage": 1, "room": 6, "pointer": 3049838, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1752, "y": 264, "name": "Ripple Field 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": ["Ripple Field 1 - Star 19"], "music": 15}, {"name": "Ripple Field 1 - 7", "level": 2, "stage": 1, "room": 7, "pointer": 3066407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 2232, "y": 264, "name": "Ripple Field 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[7, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 8", "level": 2, "stage": 1, "room": 8, "pointer": 2889148, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 1 - Complete"], "music": 5}, {"name": "Ripple Field 2 - 0", "level": 2, "stage": 2, "room": 0, "pointer": 3342336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Coconut", "Blipper", "Sasuke"], "default_exits": [{"room": 1, "unkn1": 103, "unkn2": 15, "x": 56, "y": 104, "name": "Ripple Field 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[5, 22], [34, 16], [30, 16], [21, 16], [14, 23], [4, 22], [18, 16]], "locations": ["Ripple Field 2 - Enemy 1 (Togezo)", "Ripple Field 2 - Enemy 2 (Coconut)", "Ripple Field 2 - Enemy 3 (Blipper)", "Ripple Field 2 - Enemy 4 (Sasuke)", "Ripple Field 2 - Star 1", "Ripple Field 2 - Star 2", "Ripple Field 2 - Star 3", "Ripple Field 2 - Star 4"], "music": 10}, {"name": "Ripple Field 2 - 1", "level": 2, "stage": 2, "room": 1, "pointer": 3084099, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 23, "unkn2": 8, "x": 72, "y": 248, "name": "Ripple Field 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 1", "Ripple Field 2 - Animal 2"], "music": 39}, {"name": "Ripple Field 2 - 2", "level": 2, "stage": 2, "room": 2, "pointer": 3451207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 4, "unkn1": 31, "unkn2": 5, "x": 72, "y": 152, "name": "Ripple Field 2 - 2 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 96, "unkn2": 6, "x": 56, "y": 152, "name": "Ripple Field 2 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 56, "unkn2": 17, "x": 136, "y": 264, "name": "Ripple Field 2 - 2 Exit 2", "access_rule": []}], "entity_load": [[29, 16], [47, 16], [1, 16], [46, 16], [14, 23]], "locations": ["Ripple Field 2 - Enemy 5 (Kany)", "Ripple Field 2 - Star 5", "Ripple Field 2 - Star 6", "Ripple Field 2 - Star 7", "Ripple Field 2 - Star 8"], "music": 10}, {"name": "Ripple Field 2 - 3", "level": 2, "stage": 2, "room": 3, "pointer": 3674327, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 480, "x": 1384, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 2 - Maxim Tomato (Currents)"}, {"idx": 10, "pointer": 520, "x": 1456, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 2 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Glunk"], "default_exits": [{"room": 2, "unkn1": 134, "unkn2": 5, "x": 40, "y": 136, "name": "Ripple Field 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [14, 23], [16, 16], [21, 16], [4, 22]], "locations": ["Ripple Field 2 - Enemy 6 (Glunk)", "Ripple Field 2 - Star 9", "Ripple Field 2 - Star 10", "Ripple Field 2 - Star 11", "Ripple Field 2 - Star 12", "Ripple Field 2 - Star 13", "Ripple Field 2 - Star 14", "Ripple Field 2 - Star 15", "Ripple Field 2 - Star 16", "Ripple Field 2 - Star 17", "Ripple Field 2 - Maxim Tomato (Currents)", "Ripple Field 2 - 1-Up (Currents)"], "music": 10}, {"name": "Ripple Field 2 - 4", "level": 2, "stage": 2, "room": 4, "pointer": 2972744, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 3, "unkn2": 9, "x": 520, "y": 88, "name": "Ripple Field 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[8, 19]], "locations": [], "music": 10}, {"name": "Ripple Field 2 - 5", "level": 2, "stage": 2, "room": 5, "pointer": 3109710, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 16, "x": 1048, "y": 280, "name": "Ripple Field 2 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 3", "Ripple Field 2 - Animal 4"], "music": 38}, {"name": "Ripple Field 2 - 6", "level": 2, "stage": 2, "room": 6, "pointer": 2973127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[8, 19], [42, 19]], "locations": ["Ripple Field 2 - Bakasa"], "music": 8}, {"name": "Ripple Field 2 - 7", "level": 2, "stage": 2, "room": 7, "pointer": 2890353, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 2 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 0", "level": 2, "stage": 3, "room": 0, "pointer": 3517254, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 105, "unkn2": 8, "x": 40, "y": 104, "name": "Ripple Field 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[21, 16], [57, 16], [62, 16], [67, 16], [4, 22], [14, 23]], "locations": ["Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", "Ripple Field 3 - Enemy 2 (Kapar)", "Ripple Field 3 - Enemy 3 (Blipper)", "Ripple Field 3 - Star 1", "Ripple Field 3 - Star 2", "Ripple Field 3 - Star 3", "Ripple Field 3 - Star 4"], "music": 18}, {"name": "Ripple Field 3 - 1", "level": 2, "stage": 3, "room": 1, "pointer": 3604480, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 320, "x": 832, "y": 152, "etype": 22, "vtype": 2, "name": "Ripple Field 3 - Maxim Tomato (Cove)"}, {"idx": 13, "pointer": 424, "x": 1128, "y": 384, "etype": 22, "vtype": 0, "name": "Ripple Field 3 - 1-Up (Cutter/Spark)"}], "consumables_pointer": 160, "enemies": ["Sparky", "Glunk", "Joe"], "default_exits": [{"room": 7, "unkn1": 80, "unkn2": 24, "x": 104, "y": 328, "name": "Ripple Field 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[13, 23], [14, 23], [91, 16], [16, 16], [2, 22], [8, 16], [0, 22]], "locations": ["Ripple Field 3 - Enemy 4 (Sparky)", "Ripple Field 3 - Enemy 5 (Glunk)", "Ripple Field 3 - Enemy 6 (Joe)", "Ripple Field 3 - Star 5", "Ripple Field 3 - Star 6", "Ripple Field 3 - Star 7", "Ripple Field 3 - Star 8", "Ripple Field 3 - Star 9", "Ripple Field 3 - Star 10", "Ripple Field 3 - Star 11", "Ripple Field 3 - Maxim Tomato (Cove)", "Ripple Field 3 - 1-Up (Cutter/Spark)"], "music": 18}, {"name": "Ripple Field 3 - 2", "level": 2, "stage": 3, "room": 2, "pointer": 3715428, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobo"], "default_exits": [{"room": 4, "unkn1": 118, "unkn2": 9, "x": 56, "y": 152, "name": "Ripple Field 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [21, 16], [4, 22], [46, 16], [47, 16], [5, 16], [14, 23]], "locations": ["Ripple Field 3 - Enemy 7 (Bobo)", "Ripple Field 3 - Star 12", "Ripple Field 3 - Star 13", "Ripple Field 3 - Star 14", "Ripple Field 3 - Star 15", "Ripple Field 3 - Star 16", "Ripple Field 3 - Star 17", "Ripple Field 3 - Star 18", "Ripple Field 3 - Star 19", "Ripple Field 3 - Star 20", "Ripple Field 3 - Star 21"], "music": 18}, {"name": "Ripple Field 3 - 3", "level": 2, "stage": 3, "room": 3, "pointer": 3071919, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 15, "unkn2": 6, "x": 56, "y": 104, "name": "Ripple Field 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 3 - Animal 1", "Ripple Field 3 - Animal 2"], "music": 39}, {"name": "Ripple Field 3 - 4", "level": 2, "stage": 3, "room": 4, "pointer": 2970810, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": ["Ripple Field 3 - Elieel"], "music": 8}, {"name": "Ripple Field 3 - 5", "level": 2, "stage": 3, "room": 5, "pointer": 2987502, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 232, "y": 88, "name": "Ripple Field 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": [], "music": 31}, {"name": "Ripple Field 3 - 6", "level": 2, "stage": 3, "room": 6, "pointer": 2888666, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 3 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 7", "level": 2, "stage": 3, "room": 7, "pointer": 3161120, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 3, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 3 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 11, "unkn2": 20, "x": 56, "y": 216, "name": "Ripple Field 3 - 7 Exit 1", "access_rule": []}], "entity_load": [[57, 16]], "locations": [], "music": 18}, {"name": "Ripple Field 4 - 0", "level": 2, "stage": 4, "room": 0, "pointer": 3082540, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Stone)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Mony"], "default_exits": [{"room": 6, "unkn1": 4, "unkn2": 16, "x": 72, "y": 232, "name": "Ripple Field 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [79, 16], [80, 16], [81, 16], [4, 22], [20, 16], [77, 16]], "locations": ["Ripple Field 4 - Enemy 1 (Bukiset (Stone))", "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", "Ripple Field 4 - Enemy 5 (Mony)", "Ripple Field 4 - Star 1", "Ripple Field 4 - Star 2", "Ripple Field 4 - Star 3", "Ripple Field 4 - Star 4", "Ripple Field 4 - Star 5"], "music": 15}, {"name": "Ripple Field 4 - 1", "level": 2, "stage": 4, "room": 1, "pointer": 2964846, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 72, "y": 88, "name": "Ripple Field 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Ripple Field 4 - Miniboss 1 (Captain Stitch)"], "music": 4}, {"name": "Ripple Field 4 - 2", "level": 2, "stage": 4, "room": 2, "pointer": 3018503, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)"], "default_exits": [{"room": 11, "unkn1": 25, "unkn2": 5, "x": 56, "y": 88, "name": "Ripple Field 4 - 2 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 25, "unkn2": 15, "x": 56, "y": 216, "name": "Ripple Field 4 - 2 Exit 1", "access_rule": []}], "entity_load": [[10, 19], [76, 16]], "locations": ["Ripple Field 4 - Enemy 6 (Bukiset (Burning))"], "music": 15}, {"name": "Ripple Field 4 - 3", "level": 2, "stage": 4, "room": 3, "pointer": 2988166, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[10, 19], [42, 19]], "locations": ["Ripple Field 4 - Toad & Little Toad"], "music": 8}, {"name": "Ripple Field 4 - 4", "level": 2, "stage": 4, "room": 4, "pointer": 2885533, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 4 - Complete"], "music": 5}, {"name": "Ripple Field 4 - 5", "level": 2, "stage": 4, "room": 5, "pointer": 3042349, "animal_pointers": [222, 230, 238], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 5, "x": 360, "y": 120, "name": "Ripple Field 4 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 488, "y": 120, "name": "Ripple Field 4 - 5 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 16, "unkn2": 5, "x": 104, "y": 88, "name": "Ripple Field 4 - 5 Exit 2", "access_rule": []}, {"room": 6, "unkn1": 10, "unkn2": 11, "x": 440, "y": 216, "name": "Ripple Field 4 - 5 Exit 3", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 4 - Animal 1", "Ripple Field 4 - Animal 2", "Ripple Field 4 - Animal 3"], "music": 40}, {"name": "Ripple Field 4 - 6", "level": 2, "stage": 4, "room": 6, "pointer": 3234805, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Blipper"], "default_exits": [{"room": 5, "unkn1": 21, "unkn2": 7, "x": 104, "y": 88, "name": "Ripple Field 4 - 6 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 31, "unkn2": 7, "x": 232, "y": 88, "name": "Ripple Field 4 - 6 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 26, "unkn2": 13, "x": 184, "y": 184, "name": "Ripple Field 4 - 6 Exit 2", "access_rule": []}, {"room": 12, "unkn1": 48, "unkn2": 15, "x": 88, "y": 216, "name": "Ripple Field 4 - 6 Exit 3", "access_rule": []}], "entity_load": [[73, 16], [14, 23], [21, 16], [13, 23]], "locations": ["Ripple Field 4 - Enemy 7 (Bobin)", "Ripple Field 4 - Enemy 8 (Blipper)", "Ripple Field 4 - Star 6", "Ripple Field 4 - Star 7"], "music": 15}, {"name": "Ripple Field 4 - 7", "level": 2, "stage": 4, "room": 7, "pointer": 3155468, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 6, "x": 104, "y": 136, "name": "Ripple Field 4 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 18, "unkn2": 9, "x": 72, "y": 248, "name": "Ripple Field 4 - 7 Exit 1", "access_rule": []}], "entity_load": [[14, 23], [1, 16], [0, 23]], "locations": ["Ripple Field 4 - Star 8", "Ripple Field 4 - Star 9", "Ripple Field 4 - Star 10", "Ripple Field 4 - Star 11", "Ripple Field 4 - Star 12", "Ripple Field 4 - Star 13", "Ripple Field 4 - Star 14", "Ripple Field 4 - Star 15", "Ripple Field 4 - Star 16", "Ripple Field 4 - Star 17", "Ripple Field 4 - Star 18", "Ripple Field 4 - Star 19", "Ripple Field 4 - Star 20", "Ripple Field 4 - Star 21"], "music": 15}, {"name": "Ripple Field 4 - 8", "level": 2, "stage": 4, "room": 8, "pointer": 3350031, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Oro"], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 22, "x": 184, "y": 440, "name": "Ripple Field 4 - 8 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 34, "unkn2": 22, "x": 296, "y": 440, "name": "Ripple Field 4 - 8 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 16, "unkn2": 72, "x": 168, "y": 152, "name": "Ripple Field 4 - 8 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 23, "unkn2": 72, "x": 120, "y": 152, "name": "Ripple Field 4 - 8 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [68, 16], [14, 23], [25, 16], [6, 23]], "locations": ["Ripple Field 4 - Enemy 9 (Como)", "Ripple Field 4 - Enemy 10 (Oro)", "Ripple Field 4 - Star 22", "Ripple Field 4 - Star 23", "Ripple Field 4 - Star 24", "Ripple Field 4 - Star 25", "Ripple Field 4 - Star 26", "Ripple Field 4 - Star 27", "Ripple Field 4 - Star 28"], "music": 15}, {"name": "Ripple Field 4 - 9", "level": 2, "stage": 4, "room": 9, "pointer": 3050397, "animal_pointers": [], "consumables": [{"idx": 29, "pointer": 200, "x": 88, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Stone)"}], "consumables_pointer": 176, "enemies": ["Gansan"], "default_exits": [{"room": 8, "unkn1": 11, "unkn2": 9, "x": 264, "y": 1144, "name": "Ripple Field 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[75, 16], [2, 22]], "locations": ["Ripple Field 4 - Enemy 11 (Gansan)", "Ripple Field 4 - Maxim Tomato (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 10", "level": 2, "stage": 4, "room": 10, "pointer": 3052069, "animal_pointers": [], "consumables": [{"idx": 30, "pointer": 192, "x": 200, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 4 - 1-Up (Stone)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 8, "unkn1": 6, "unkn2": 9, "x": 376, "y": 1144, "name": "Ripple Field 4 - 10 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [75, 16]], "locations": ["Ripple Field 4 - 1-Up (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 11", "level": 2, "stage": 4, "room": 11, "pointer": 3386974, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Kapar", "Squishy"], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 13, "x": 72, "y": 152, "name": "Ripple Field 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[22, 16], [67, 16], [14, 23], [62, 16], [0, 16]], "locations": ["Ripple Field 4 - Enemy 12 (Waddle Dee)", "Ripple Field 4 - Enemy 13 (Kapar)", "Ripple Field 4 - Enemy 14 (Squishy)", "Ripple Field 4 - Star 29", "Ripple Field 4 - Star 30", "Ripple Field 4 - Star 31", "Ripple Field 4 - Star 32", "Ripple Field 4 - Star 33", "Ripple Field 4 - Star 34", "Ripple Field 4 - Star 35", "Ripple Field 4 - Star 36", "Ripple Field 4 - Star 37", "Ripple Field 4 - Star 38", "Ripple Field 4 - Star 39", "Ripple Field 4 - Star 40", "Ripple Field 4 - Star 41", "Ripple Field 4 - Star 42", "Ripple Field 4 - Star 43"], "music": 15}, {"name": "Ripple Field 4 - 12", "level": 2, "stage": 4, "room": 12, "pointer": 3168339, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 8, "unkn1": 67, "unkn2": 7, "x": 88, "y": 1224, "name": "Ripple Field 4 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 75, "unkn2": 7, "x": 88, "y": 136, "name": "Ripple Field 4 - 12 Exit 1", "access_rule": []}], "entity_load": [[59, 16], [13, 23], [28, 16]], "locations": ["Ripple Field 4 - Enemy 15 (Nidoo)"], "music": 15}, {"name": "Ripple Field 4 - 13", "level": 2, "stage": 4, "room": 13, "pointer": 2958478, "animal_pointers": [], "consumables": [{"idx": 54, "pointer": 264, "x": 216, "y": 136, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Dark)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 12, "unkn1": 4, "unkn2": 8, "x": 1192, "y": 120, "name": "Ripple Field 4 - 13 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [2, 22], [59, 16]], "locations": ["Ripple Field 4 - Star 44", "Ripple Field 4 - Star 45", "Ripple Field 4 - Star 46", "Ripple Field 4 - Star 47", "Ripple Field 4 - Star 48", "Ripple Field 4 - Star 49", "Ripple Field 4 - Star 50", "Ripple Field 4 - Star 51", "Ripple Field 4 - Maxim Tomato (Dark)"], "music": 15}, {"name": "Ripple Field 5 - 0", "level": 2, "stage": 5, "room": 0, "pointer": 3240369, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 9, "unkn2": 43, "x": 88, "y": 344, "name": "Ripple Field 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": ["Ripple Field 5 - Star 1", "Ripple Field 5 - Star 2", "Ripple Field 5 - Star 3", "Ripple Field 5 - Star 4", "Ripple Field 5 - Star 5", "Ripple Field 5 - Star 6"], "music": 16}, {"name": "Ripple Field 5 - 1", "level": 2, "stage": 5, "room": 1, "pointer": 3547528, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 4, "x": 184, "y": 344, "name": "Ripple Field 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23]], "locations": ["Ripple Field 5 - Star 7", "Ripple Field 5 - Star 8", "Ripple Field 5 - Star 9", "Ripple Field 5 - Star 10", "Ripple Field 5 - Star 11", "Ripple Field 5 - Star 12", "Ripple Field 5 - Star 13", "Ripple Field 5 - Star 14", "Ripple Field 5 - Star 15", "Ripple Field 5 - Star 16", "Ripple Field 5 - Star 17"], "music": 16}, {"name": "Ripple Field 5 - 2", "level": 2, "stage": 5, "room": 2, "pointer": 3611327, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Joe"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 21, "x": 56, "y": 184, "name": "Ripple Field 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 1 (Glunk)", "Ripple Field 5 - Enemy 2 (Joe)", "Ripple Field 5 - Star 18", "Ripple Field 5 - Star 19", "Ripple Field 5 - Star 20", "Ripple Field 5 - Star 21", "Ripple Field 5 - Star 22", "Ripple Field 5 - Star 23", "Ripple Field 5 - Star 24", "Ripple Field 5 - Star 25", "Ripple Field 5 - Star 26", "Ripple Field 5 - Star 27", "Ripple Field 5 - Star 28", "Ripple Field 5 - Star 29", "Ripple Field 5 - Star 30", "Ripple Field 5 - Star 31"], "music": 16}, {"name": "Ripple Field 5 - 3", "level": 2, "stage": 5, "room": 3, "pointer": 3926157, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 1258, "x": 1488, "y": 192, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Currents)"}, {"idx": 31, "pointer": 1290, "x": 1520, "y": 192, "etype": 22, "vtype": 0, "name": "Ripple Field 5 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Bobin", "Mony", "Squishy"], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 38, "x": 152, "y": 152, "name": "Ripple Field 5 - 3 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 95, "unkn2": 38, "x": 248, "y": 1064, "name": "Ripple Field 5 - 3 Exit 1", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [6, 22], [14, 23], [1, 16], [73, 16], [22, 16], [20, 16]], "locations": ["Ripple Field 5 - Enemy 3 (Bobin)", "Ripple Field 5 - Enemy 4 (Mony)", "Ripple Field 5 - Enemy 5 (Squishy)", "Ripple Field 5 - Star 32", "Ripple Field 5 - Star 33", "Ripple Field 5 - Star 34", "Ripple Field 5 - Star 35", "Ripple Field 5 - Star 36", "Ripple Field 5 - Star 37", "Ripple Field 5 - Maxim Tomato (Currents)", "Ripple Field 5 - 1-Up (Currents)"], "music": 16}, {"name": "Ripple Field 5 - 4", "level": 2, "stage": 5, "room": 4, "pointer": 3026639, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 4, "x": 232, "y": 152, "name": "Ripple Field 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 1"], "music": 40}, {"name": "Ripple Field 5 - 5", "level": 2, "stage": 5, "room": 5, "pointer": 3207333, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 56, "y": 72, "name": "Ripple Field 5 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 9, "x": 120, "y": 552, "name": "Ripple Field 5 - 5 Exit 1", "access_rule": ["Kine"]}], "entity_load": [[14, 23]], "locations": ["Ripple Field 5 - Star 38", "Ripple Field 5 - Star 39", "Ripple Field 5 - Star 40", "Ripple Field 5 - Star 41", "Ripple Field 5 - Star 42"], "music": 16}, {"name": "Ripple Field 5 - 6", "level": 2, "stage": 5, "room": 6, "pointer": 3485896, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 9, "unkn1": 121, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [22, 16], [14, 23], [13, 16], [11, 16], [32, 16]], "locations": ["Ripple Field 5 - Enemy 6 (Yaban)", "Ripple Field 5 - Enemy 7 (Broom Hatter)", "Ripple Field 5 - Enemy 8 (Bouncy)", "Ripple Field 5 - Star 43", "Ripple Field 5 - Star 44", "Ripple Field 5 - Star 45"], "music": 16}, {"name": "Ripple Field 5 - 7", "level": 2, "stage": 5, "room": 7, "pointer": 3752698, "animal_pointers": [], "consumables": [{"idx": 53, "pointer": 418, "x": 1512, "y": 608, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Exit)"}], "consumables_pointer": 352, "enemies": ["Sparky", "Rocky", "Babut"], "default_exits": [{"room": 10, "unkn1": 45, "unkn2": 31, "x": 152, "y": 152, "name": "Ripple Field 5 - 7 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 94, "unkn2": 40, "x": 88, "y": 200, "name": "Ripple Field 5 - 7 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [8, 16], [22, 16], [14, 23], [2, 22]], "locations": ["Ripple Field 5 - Enemy 9 (Sparky)", "Ripple Field 5 - Enemy 10 (Rocky)", "Ripple Field 5 - Enemy 11 (Babut)", "Ripple Field 5 - Star 46", "Ripple Field 5 - Star 47", "Ripple Field 5 - Star 48", "Ripple Field 5 - Star 49", "Ripple Field 5 - Maxim Tomato (Exit)"], "music": 16}, {"name": "Ripple Field 5 - 8", "level": 2, "stage": 5, "room": 8, "pointer": 3044682, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 8, "unkn2": 9, "x": 88, "y": 616, "name": "Ripple Field 5 - 8 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 2"], "music": 39}, {"name": "Ripple Field 5 - 9", "level": 2, "stage": 5, "room": 9, "pointer": 2963193, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[11, 19], [42, 19]], "locations": ["Ripple Field 5 - Mama Pitch"], "music": 8}, {"name": "Ripple Field 5 - 10", "level": 2, "stage": 5, "room": 10, "pointer": 3042934, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 8, "unkn2": 9, "x": 712, "y": 504, "name": "Ripple Field 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 12 (Galbo)", "Ripple Field 5 - Star 50", "Ripple Field 5 - Star 51"], "music": 16}, {"name": "Ripple Field 5 - 11", "level": 2, "stage": 5, "room": 11, "pointer": 2886256, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 5 - Complete"], "music": 5}, {"name": "Ripple Field 6 - 0", "level": 2, "stage": 6, "room": 0, "pointer": 2949576, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 1, "unkn1": 56, "unkn2": 7, "x": 40, "y": 152, "name": "Ripple Field 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[29, 16], [13, 23]], "locations": ["Ripple Field 6 - Enemy 1 (Kany)"], "music": 15}, {"name": "Ripple Field 6 - 1", "level": 2, "stage": 6, "room": 1, "pointer": 2971200, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 23, "unkn2": 9, "x": 56, "y": 264, "name": "Ripple Field 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 1", "Ripple Field 6 - Animal 2", "Ripple Field 6 - Animal 3"], "music": 38}, {"name": "Ripple Field 6 - 2", "level": 2, "stage": 6, "room": 2, "pointer": 3637749, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 95, "unkn2": 9, "x": 104, "y": 872, "name": "Ripple Field 6 - 2 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 50, "unkn2": 22, "x": 184, "y": 88, "name": "Ripple Field 6 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 45, "unkn2": 26, "x": 88, "y": 88, "name": "Ripple Field 6 - 2 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 55, "unkn2": 26, "x": 248, "y": 88, "name": "Ripple Field 6 - 2 Exit 3", "access_rule": []}], "entity_load": [[52, 16], [13, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 3", "level": 2, "stage": 6, "room": 3, "pointer": 3092564, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 5, "x": 744, "y": 424, "name": "Ripple Field 6 - 3 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 16, "unkn2": 5, "x": 872, "y": 424, "name": "Ripple Field 6 - 3 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 4", "level": 2, "stage": 6, "room": 4, "pointer": 3133247, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 5, "x": 824, "y": 360, "name": "Ripple Field 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[12, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 5", "level": 2, "stage": 6, "room": 5, "pointer": 3507762, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 76, "unkn2": 4, "x": 680, "y": 72, "name": "Ripple Field 6 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 6, "x": 440, "y": 104, "name": "Ripple Field 6 - 5 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 10, "x": 440, "y": 168, "name": "Ripple Field 6 - 5 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 88, "unkn2": 10, "x": 104, "y": 152, "name": "Ripple Field 6 - 5 Exit 3", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 12, "x": 200, "y": 200, "name": "Ripple Field 6 - 5 Exit 4", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 12, "x": 680, "y": 200, "name": "Ripple Field 6 - 5 Exit 5", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 16, "x": 680, "y": 264, "name": "Ripple Field 6 - 5 Exit 6", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 6", "level": 2, "stage": 6, "room": 6, "pointer": 3211264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 10, "x": 72, "y": 168, "name": "Ripple Field 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 7", "level": 2, "stage": 6, "room": 7, "pointer": 3586039, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Kapar", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 5, "unkn1": 134, "unkn2": 16, "x": 72, "y": 168, "name": "Ripple Field 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [3, 16], [67, 16], [51, 16], [7, 16]], "locations": ["Ripple Field 6 - Enemy 2 (KeKe)", "Ripple Field 6 - Enemy 3 (Kapar)", "Ripple Field 6 - Enemy 4 (Rocky)", "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)", "Ripple Field 6 - Star 1", "Ripple Field 6 - Star 2", "Ripple Field 6 - Star 3", "Ripple Field 6 - Star 4", "Ripple Field 6 - Star 5", "Ripple Field 6 - Star 6", "Ripple Field 6 - Star 7", "Ripple Field 6 - Star 8", "Ripple Field 6 - Star 9", "Ripple Field 6 - Star 10", "Ripple Field 6 - Star 11", "Ripple Field 6 - Star 12", "Ripple Field 6 - Star 13", "Ripple Field 6 - Star 14"], "music": 15}, {"name": "Ripple Field 6 - 8", "level": 2, "stage": 6, "room": 8, "pointer": 3621483, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Coconut", "Sasuke", "Nruff"], "default_exits": [{"room": 10, "unkn1": 70, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 6 - 8 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 26, "unkn2": 54, "x": 72, "y": 152, "name": "Ripple Field 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[89, 16], [15, 16], [30, 16], [34, 16], [14, 23]], "locations": ["Ripple Field 6 - Enemy 6 (Propeller)", "Ripple Field 6 - Enemy 7 (Coconut)", "Ripple Field 6 - Enemy 8 (Sasuke)", "Ripple Field 6 - Enemy 9 (Nruff)", "Ripple Field 6 - Star 15", "Ripple Field 6 - Star 16", "Ripple Field 6 - Star 17", "Ripple Field 6 - Star 18", "Ripple Field 6 - Star 19", "Ripple Field 6 - Star 20", "Ripple Field 6 - Star 21", "Ripple Field 6 - Star 22", "Ripple Field 6 - Star 23"], "music": 15}, {"name": "Ripple Field 6 - 9", "level": 2, "stage": 6, "room": 9, "pointer": 2954523, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 3, "unkn2": 9, "x": 408, "y": 872, "name": "Ripple Field 6 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 4"], "music": 39}, {"name": "Ripple Field 6 - 10", "level": 2, "stage": 6, "room": 10, "pointer": 3069438, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[12, 19], [42, 19]], "locations": ["Ripple Field 6 - HB-002"], "music": 8}, {"name": "Ripple Field 6 - 11", "level": 2, "stage": 6, "room": 11, "pointer": 2886497, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 6 - Complete"], "music": 5}, {"name": "Ripple Field Boss - 0", "level": 2, "stage": 7, "room": 0, "pointer": 3157370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[7, 18]], "locations": ["Ripple Field - Boss (Acro) Purified", "Level 2 Boss - Defeated", "Level 2 Boss - Purified"], "music": 2}, {"name": "Sand Canyon 1 - 0", "level": 3, "stage": 1, "room": 0, "pointer": 3524267, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo"], "default_exits": [{"room": 5, "unkn1": 196, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [1, 16], [26, 16], [2, 16]], "locations": ["Sand Canyon 1 - Enemy 1 (Bronto Burt)", "Sand Canyon 1 - Enemy 2 (Galbo)"], "music": 13}, {"name": "Sand Canyon 1 - 1", "level": 3, "stage": 1, "room": 1, "pointer": 3163860, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 34, "unkn2": 5, "x": 104, "y": 408, "name": "Sand Canyon 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 1 - Animal 1", "Sand Canyon 1 - Animal 2"], "music": 38}, {"name": "Sand Canyon 1 - 2", "level": 3, "stage": 1, "room": 2, "pointer": 3512532, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro"], "default_exits": [{"room": 3, "unkn1": 73, "unkn2": 6, "x": 56, "y": 120, "name": "Sand Canyon 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [26, 16], [25, 16], [4, 22], [14, 23], [1, 23], [0, 23], [4, 23]], "locations": ["Sand Canyon 1 - Enemy 3 (Oro)", "Sand Canyon 1 - Star 1", "Sand Canyon 1 - Star 2", "Sand Canyon 1 - Star 3", "Sand Canyon 1 - Star 4"], "music": 13}, {"name": "Sand Canyon 1 - 3", "level": 3, "stage": 1, "room": 3, "pointer": 3719146, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Propeller", "Gansan", "Babut"], "default_exits": [{"room": 4, "unkn1": 25, "unkn2": 73, "x": 72, "y": 280, "name": "Sand Canyon 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [75, 16], [43, 16], [8, 16]], "locations": ["Sand Canyon 1 - Enemy 4 (Sparky)", "Sand Canyon 1 - Enemy 5 (Propeller)", "Sand Canyon 1 - Enemy 6 (Gansan)", "Sand Canyon 1 - Enemy 7 (Babut)"], "music": 13}, {"name": "Sand Canyon 1 - 4", "level": 3, "stage": 1, "room": 4, "pointer": 3421212, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Dogon", "Bouncy", "Pteran"], "default_exits": [{"room": 7, "unkn1": 196, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[90, 16], [13, 16], [40, 16], [14, 23], [39, 16]], "locations": ["Sand Canyon 1 - Enemy 8 (Loud)", "Sand Canyon 1 - Enemy 9 (Dogon)", "Sand Canyon 1 - Enemy 10 (Bouncy)", "Sand Canyon 1 - Enemy 11 (Pteran)", "Sand Canyon 1 - Star 5", "Sand Canyon 1 - Star 6", "Sand Canyon 1 - Star 7", "Sand Canyon 1 - Star 8", "Sand Canyon 1 - Star 9", "Sand Canyon 1 - Star 10"], "music": 13}, {"name": "Sand Canyon 1 - 5", "level": 3, "stage": 1, "room": 5, "pointer": 3203325, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Polof"], "default_exits": [{"room": 6, "unkn1": 32, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 1 - 5 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 46, "unkn2": 9, "x": 56, "y": 344, "name": "Sand Canyon 1 - 5 Exit 1", "access_rule": []}], "entity_load": [[9, 16]], "locations": ["Sand Canyon 1 - Enemy 12 (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 6", "level": 3, "stage": 1, "room": 6, "pointer": 3138524, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 248, "x": 168, "y": 104, "etype": 22, "vtype": 0, "name": "Sand Canyon 1 - 1-Up (Polof)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 5, "unkn1": 5, "unkn2": 9, "x": 536, "y": 152, "name": "Sand Canyon 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [0, 22]], "locations": ["Sand Canyon 1 - Star 11", "Sand Canyon 1 - Star 12", "Sand Canyon 1 - Star 13", "Sand Canyon 1 - Star 14", "Sand Canyon 1 - Star 15", "Sand Canyon 1 - Star 16", "Sand Canyon 1 - Star 17", "Sand Canyon 1 - Star 18", "Sand Canyon 1 - Star 19", "Sand Canyon 1 - Star 20", "Sand Canyon 1 - Star 21", "Sand Canyon 1 - Star 22", "Sand Canyon 1 - 1-Up (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 7", "level": 3, "stage": 1, "room": 7, "pointer": 2988822, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [42, 19]], "locations": ["Sand Canyon 1 - Geromuzudake"], "music": 8}, {"name": "Sand Canyon 1 - 8", "level": 3, "stage": 1, "room": 8, "pointer": 2885292, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 1 - Complete"], "music": 5}, {"name": "Sand Canyon 2 - 0", "level": 3, "stage": 2, "room": 0, "pointer": 3668370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Doka", "Boten"], "default_exits": [{"room": 1, "unkn1": 178, "unkn2": 8, "x": 184, "y": 104, "name": "Sand Canyon 2 - 0 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 244, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 2 - 0 Exit 1", "access_rule": []}], "entity_load": [[35, 16], [33, 16], [14, 23], [51, 16], [47, 16], [46, 16]], "locations": ["Sand Canyon 2 - Enemy 1 (KeKe)", "Sand Canyon 2 - Enemy 2 (Doka)", "Sand Canyon 2 - Enemy 3 (Boten)", "Sand Canyon 2 - Star 1", "Sand Canyon 2 - Star 2", "Sand Canyon 2 - Star 3", "Sand Canyon 2 - Star 4", "Sand Canyon 2 - Star 5", "Sand Canyon 2 - Star 6", "Sand Canyon 2 - Star 7", "Sand Canyon 2 - Star 8", "Sand Canyon 2 - Star 9", "Sand Canyon 2 - Star 10", "Sand Canyon 2 - Star 11"], "music": 21}, {"name": "Sand Canyon 2 - 1", "level": 3, "stage": 2, "room": 1, "pointer": 2952738, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 10, "unkn2": 6, "x": 2872, "y": 136, "name": "Sand Canyon 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 2 - Animal 1", "Sand Canyon 2 - Animal 2"], "music": 40}, {"name": "Sand Canyon 2 - 2", "level": 3, "stage": 2, "room": 2, "pointer": 3531156, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 9, "unkn1": 45, "unkn2": 60, "x": 88, "y": 184, "name": "Sand Canyon 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[6, 23], [89, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 4 (Propeller)", "Sand Canyon 2 - Star 12", "Sand Canyon 2 - Star 13", "Sand Canyon 2 - Star 14", "Sand Canyon 2 - Star 15", "Sand Canyon 2 - Star 16", "Sand Canyon 2 - Star 17"], "music": 21}, {"name": "Sand Canyon 2 - 3", "level": 3, "stage": 2, "room": 3, "pointer": 3263731, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Sasuke", "Como"], "default_exits": [{"room": 4, "unkn1": 63, "unkn2": 5, "x": 88, "y": 184, "name": "Sand Canyon 2 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 68, "unkn2": 5, "x": 184, "y": 184, "name": "Sand Canyon 2 - 3 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 73, "unkn2": 5, "x": 248, "y": 184, "name": "Sand Canyon 2 - 3 Exit 2", "access_rule": []}, {"room": 5, "unkn1": 130, "unkn2": 9, "x": 72, "y": 312, "name": "Sand Canyon 2 - 3 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [8, 16], [30, 16], [0, 16]], "locations": ["Sand Canyon 2 - Enemy 5 (Waddle Dee)", "Sand Canyon 2 - Enemy 6 (Sparky)", "Sand Canyon 2 - Enemy 7 (Sasuke)", "Sand Canyon 2 - Enemy 8 (Como)"], "music": 21}, {"name": "Sand Canyon 2 - 4", "level": 3, "stage": 2, "room": 4, "pointer": 3076300, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 228, "x": 168, "y": 72, "etype": 22, "vtype": 0, "name": "Sand Canyon 2 - 1-Up (Enclave)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 5, "unkn2": 11, "x": 1016, "y": 88, "name": "Sand Canyon 2 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 10, "unkn2": 11, "x": 1112, "y": 88, "name": "Sand Canyon 2 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 11, "x": 1176, "y": 88, "name": "Sand Canyon 2 - 4 Exit 2", "access_rule": []}], "entity_load": [[14, 23], [0, 22], [4, 22]], "locations": ["Sand Canyon 2 - Star 18", "Sand Canyon 2 - Star 19", "Sand Canyon 2 - 1-Up (Enclave)"], "music": 21}, {"name": "Sand Canyon 2 - 5", "level": 3, "stage": 2, "room": 5, "pointer": 3302133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 6, "unkn1": 63, "unkn2": 15, "x": 120, "y": 216, "name": "Sand Canyon 2 - 5 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 71, "unkn2": 18, "x": 152, "y": 136, "name": "Sand Canyon 2 - 5 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 130, "unkn2": 19, "x": 72, "y": 952, "name": "Sand Canyon 2 - 5 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 56, "unkn2": 23, "x": 88, "y": 216, "name": "Sand Canyon 2 - 5 Exit 3", "access_rule": []}], "entity_load": [[80, 16], [78, 16], [81, 16], [83, 16], [79, 16], [82, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))", "Sand Canyon 2 - Star 20", "Sand Canyon 2 - Star 21", "Sand Canyon 2 - Star 22", "Sand Canyon 2 - Star 23", "Sand Canyon 2 - Star 24", "Sand Canyon 2 - Star 25", "Sand Canyon 2 - Star 26", "Sand Canyon 2 - Star 27", "Sand Canyon 2 - Star 28", "Sand Canyon 2 - Star 29", "Sand Canyon 2 - Star 30", "Sand Canyon 2 - Star 31", "Sand Canyon 2 - Star 32", "Sand Canyon 2 - Star 33"], "music": 21}, {"name": "Sand Canyon 2 - 6", "level": 3, "stage": 2, "room": 6, "pointer": 3800612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 5, "unkn1": 17, "unkn2": 13, "x": 1144, "y": 248, "name": "Sand Canyon 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 15 (Nidoo)", "Sand Canyon 2 - Star 34"], "music": 21}, {"name": "Sand Canyon 2 - 7", "level": 3, "stage": 2, "room": 7, "pointer": 3073888, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 15, "unkn2": 8, "x": 1016, "y": 296, "name": "Sand Canyon 2 - 7 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 5, "unkn2": 13, "x": 904, "y": 376, "name": "Sand Canyon 2 - 7 Exit 1", "access_rule": []}], "entity_load": [[15, 19]], "locations": [], "music": 21}, {"name": "Sand Canyon 2 - 8", "level": 3, "stage": 2, "room": 8, "pointer": 3061270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 5, "unkn1": 19, "unkn2": 13, "x": 1256, "y": 376, "name": "Sand Canyon 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 16 (Mariel)", "Sand Canyon 2 - Star 35"], "music": 21}, {"name": "Sand Canyon 2 - 9", "level": 3, "stage": 2, "room": 9, "pointer": 3453286, "animal_pointers": [], "consumables": [{"idx": 51, "pointer": 240, "x": 1408, "y": 216, "etype": 22, "vtype": 2, "name": "Sand Canyon 2 - Maxim Tomato (Underwater)"}], "consumables_pointer": 128, "enemies": ["Yaban", "Wapod", "Squishy", "Pteran"], "default_exits": [{"room": 10, "unkn1": 246, "unkn2": 10, "x": 56, "y": 152, "name": "Sand Canyon 2 - 9 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [22, 16], [2, 22], [39, 16], [88, 16], [32, 16]], "locations": ["Sand Canyon 2 - Enemy 17 (Yaban)", "Sand Canyon 2 - Enemy 18 (Wapod)", "Sand Canyon 2 - Enemy 19 (Squishy)", "Sand Canyon 2 - Enemy 20 (Pteran)", "Sand Canyon 2 - Star 36", "Sand Canyon 2 - Star 37", "Sand Canyon 2 - Star 38", "Sand Canyon 2 - Star 39", "Sand Canyon 2 - Star 40", "Sand Canyon 2 - Star 41", "Sand Canyon 2 - Star 42", "Sand Canyon 2 - Star 43", "Sand Canyon 2 - Star 44", "Sand Canyon 2 - Star 45", "Sand Canyon 2 - Star 46", "Sand Canyon 2 - Star 47", "Sand Canyon 2 - Star 48", "Sand Canyon 2 - Maxim Tomato (Underwater)"], "music": 21}, {"name": "Sand Canyon 2 - 10", "level": 3, "stage": 2, "room": 10, "pointer": 2994821, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 2 - 10 Exit 0", "access_rule": []}], "entity_load": [[15, 19], [42, 19]], "locations": ["Sand Canyon 2 - Auntie"], "music": 8}, {"name": "Sand Canyon 2 - 11", "level": 3, "stage": 2, "room": 11, "pointer": 2891799, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 2 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 0", "level": 3, "stage": 3, "room": 0, "pointer": 3544676, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Broom Hatter", "Rocky", "Gabon"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 57, "x": 104, "y": 152, "name": "Sand Canyon 3 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 11, "unkn2": 57, "x": 200, "y": 152, "name": "Sand Canyon 3 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 16, "unkn2": 57, "x": 296, "y": 152, "name": "Sand Canyon 3 - 0 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 23, "unkn2": 109, "x": 104, "y": 72, "name": "Sand Canyon 3 - 0 Exit 3", "access_rule": []}], "entity_load": [[24, 16], [3, 16], [11, 16], [27, 16]], "locations": ["Sand Canyon 3 - Enemy 1 (Sir Kibble)", "Sand Canyon 3 - Enemy 2 (Broom Hatter)", "Sand Canyon 3 - Enemy 3 (Rocky)", "Sand Canyon 3 - Enemy 4 (Gabon)"], "music": 16}, {"name": "Sand Canyon 3 - 1", "level": 3, "stage": 3, "room": 1, "pointer": 2965655, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 88, "y": 920, "name": "Sand Canyon 3 - 1 Exit 0", "access_rule": []}, {"room": 0, "unkn1": 11, "unkn2": 9, "x": 168, "y": 920, "name": "Sand Canyon 3 - 1 Exit 1", "access_rule": []}, {"room": 0, "unkn1": 17, "unkn2": 9, "x": 248, "y": 920, "name": "Sand Canyon 3 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 3 - Animal 1", "Sand Canyon 3 - Animal 2", "Sand Canyon 3 - Animal 3"], "music": 39}, {"name": "Sand Canyon 3 - 2", "level": 3, "stage": 3, "room": 2, "pointer": 3726270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 3, "unkn1": 184, "unkn2": 20, "x": 104, "y": 232, "name": "Sand Canyon 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[63, 16], [55, 16], [14, 23], [4, 23], [29, 16]], "locations": ["Sand Canyon 3 - Enemy 5 (Kany)", "Sand Canyon 3 - Star 1", "Sand Canyon 3 - Star 2", "Sand Canyon 3 - Star 3", "Sand Canyon 3 - Star 4", "Sand Canyon 3 - Star 5", "Sand Canyon 3 - Star 6"], "music": 16}, {"name": "Sand Canyon 3 - 3", "level": 3, "stage": 3, "room": 3, "pointer": 3416806, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 8, "unkn1": 130, "unkn2": 14, "x": 40, "y": 152, "name": "Sand Canyon 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [6, 23], [5, 23]], "locations": ["Sand Canyon 3 - Enemy 6 (Galbo)"], "music": 16}, {"name": "Sand Canyon 3 - 4", "level": 3, "stage": 3, "room": 4, "pointer": 3564419, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Sasuke"], "default_exits": [{"room": 5, "unkn1": 135, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[68, 16], [30, 16], [14, 23], [89, 16], [24, 16]], "locations": ["Sand Canyon 3 - Enemy 7 (Propeller)", "Sand Canyon 3 - Enemy 8 (Sasuke)", "Sand Canyon 3 - Star 7", "Sand Canyon 3 - Star 8", "Sand Canyon 3 - Star 9", "Sand Canyon 3 - Star 10"], "music": 16}, {"name": "Sand Canyon 3 - 5", "level": 3, "stage": 3, "room": 5, "pointer": 2973891, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": ["Sand Canyon 3 - Caramello"], "music": 8}, {"name": "Sand Canyon 3 - 6", "level": 3, "stage": 3, "room": 6, "pointer": 3247969, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod", "Bobo", "Babut", "Magoo"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 8, "x": 88, "y": 424, "name": "Sand Canyon 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[53, 16], [88, 16], [46, 16], [47, 16], [5, 16], [43, 16]], "locations": ["Sand Canyon 3 - Enemy 9 (Wapod)", "Sand Canyon 3 - Enemy 10 (Bobo)", "Sand Canyon 3 - Enemy 11 (Babut)", "Sand Canyon 3 - Enemy 12 (Magoo)"], "music": 16}, {"name": "Sand Canyon 3 - 7", "level": 3, "stage": 3, "room": 7, "pointer": 2887702, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 3 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 8", "level": 3, "stage": 3, "room": 8, "pointer": 2968057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 104, "y": 120, "name": "Sand Canyon 3 - 8 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": [], "music": 31}, {"name": "Sand Canyon 4 - 0", "level": 3, "stage": 4, "room": 0, "pointer": 3521954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Popon Ball", "Mariel", "Chilly"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 8, "x": 216, "y": 88, "name": "Sand Canyon 4 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 199, "unkn2": 15, "x": 104, "y": 88, "name": "Sand Canyon 4 - 0 Exit 1", "access_rule": []}], "entity_load": [[6, 16], [45, 16], [6, 23], [50, 16], [14, 23]], "locations": ["Sand Canyon 4 - Enemy 1 (Popon Ball)", "Sand Canyon 4 - Enemy 2 (Mariel)", "Sand Canyon 4 - Enemy 3 (Chilly)", "Sand Canyon 4 - Star 1", "Sand Canyon 4 - Star 2", "Sand Canyon 4 - Star 3", "Sand Canyon 4 - Star 4", "Sand Canyon 4 - Star 5", "Sand Canyon 4 - Star 6", "Sand Canyon 4 - Star 7", "Sand Canyon 4 - Star 8", "Sand Canyon 4 - Star 9", "Sand Canyon 4 - Star 10", "Sand Canyon 4 - Star 11"], "music": 18}, {"name": "Sand Canyon 4 - 1", "level": 3, "stage": 4, "room": 1, "pointer": 2956289, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 5, "x": 1544, "y": 136, "name": "Sand Canyon 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 4 - Animal 1", "Sand Canyon 4 - Animal 2", "Sand Canyon 4 - Animal 3"], "music": 39}, {"name": "Sand Canyon 4 - 2", "level": 3, "stage": 4, "room": 2, "pointer": 3505360, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 328, "x": 2024, "y": 72, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Pacto)"}], "consumables_pointer": 160, "enemies": ["Tick", "Bronto Burt", "Babut"], "default_exits": [{"room": 3, "unkn1": 149, "unkn2": 14, "x": 88, "y": 216, "name": "Sand Canyon 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [2, 22], [43, 16], [2, 16], [48, 16]], "locations": ["Sand Canyon 4 - Enemy 4 (Tick)", "Sand Canyon 4 - Enemy 5 (Bronto Burt)", "Sand Canyon 4 - Enemy 6 (Babut)", "Sand Canyon 4 - Maxim Tomato (Pacto)"], "music": 18}, {"name": "Sand Canyon 4 - 3", "level": 3, "stage": 4, "room": 3, "pointer": 3412361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Joe", "Mony", "Blipper"], "default_exits": [{"room": 4, "unkn1": 115, "unkn2": 6, "x": 776, "y": 120, "name": "Sand Canyon 4 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 29, "unkn2": 8, "x": 72, "y": 88, "name": "Sand Canyon 4 - 3 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 105, "unkn2": 14, "x": 104, "y": 216, "name": "Sand Canyon 4 - 3 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 115, "unkn2": 20, "x": 776, "y": 248, "name": "Sand Canyon 4 - 3 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 64, "unkn2": 21, "x": 408, "y": 232, "name": "Sand Canyon 4 - 3 Exit 4", "access_rule": []}], "entity_load": [[73, 16], [20, 16], [91, 16], [14, 23], [21, 16]], "locations": ["Sand Canyon 4 - Enemy 7 (Bobin)", "Sand Canyon 4 - Enemy 8 (Joe)", "Sand Canyon 4 - Enemy 9 (Mony)", "Sand Canyon 4 - Enemy 10 (Blipper)", "Sand Canyon 4 - Star 12", "Sand Canyon 4 - Star 13", "Sand Canyon 4 - Star 14", "Sand Canyon 4 - Star 15"], "music": 18}, {"name": "Sand Canyon 4 - 4", "level": 3, "stage": 4, "room": 4, "pointer": 3307804, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 60, "unkn2": 6, "x": 88, "y": 104, "name": "Sand Canyon 4 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 60, "unkn2": 16, "x": 88, "y": 360, "name": "Sand Canyon 4 - 4 Exit 1", "access_rule": []}], "entity_load": [[21, 16], [20, 16], [91, 16], [73, 16]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 5", "level": 3, "stage": 4, "room": 5, "pointer": 2955407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 16, "unkn2": 13, "x": 88, "y": 232, "name": "Sand Canyon 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Sand Canyon 4 - Miniboss 1 (Haboki)"], "music": 4}, {"name": "Sand Canyon 4 - 6", "level": 3, "stage": 4, "room": 6, "pointer": 3094851, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 6, "x": 56, "y": 56, "name": "Sand Canyon 4 - 6 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 14, "x": 56, "y": 104, "name": "Sand Canyon 4 - 6 Exit 1", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 22, "x": 56, "y": 152, "name": "Sand Canyon 4 - 6 Exit 2", "access_rule": []}], "entity_load": [[17, 19], [4, 23], [5, 23]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 7", "level": 3, "stage": 4, "room": 7, "pointer": 3483428, "animal_pointers": [], "consumables": [{"idx": 25, "pointer": 200, "x": 344, "y": 144, "etype": 22, "vtype": 0, "name": "Sand Canyon 4 - 1-Up (Clean)"}, {"idx": 26, "pointer": 336, "x": 1656, "y": 144, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Needle)"}], "consumables_pointer": 128, "enemies": ["Togezo", "Rocky", "Bobo"], "default_exits": [{"room": 8, "unkn1": 266, "unkn2": 9, "x": 56, "y": 152, "name": "Sand Canyon 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [3, 16], [14, 23], [5, 16], [2, 16], [18, 16], [0, 22], [2, 22]], "locations": ["Sand Canyon 4 - Enemy 11 (Togezo)", "Sand Canyon 4 - Enemy 12 (Rocky)", "Sand Canyon 4 - Enemy 13 (Bobo)", "Sand Canyon 4 - Star 16", "Sand Canyon 4 - Star 17", "Sand Canyon 4 - Star 18", "Sand Canyon 4 - Star 19", "Sand Canyon 4 - Star 20", "Sand Canyon 4 - Star 21", "Sand Canyon 4 - Star 22", "Sand Canyon 4 - Star 23", "Sand Canyon 4 - 1-Up (Clean)", "Sand Canyon 4 - Maxim Tomato (Needle)"], "music": 18}, {"name": "Sand Canyon 4 - 8", "level": 3, "stage": 4, "room": 8, "pointer": 3002086, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[17, 19], [42, 19]], "locations": ["Sand Canyon 4 - Donbe & Hikari"], "music": 8}, {"name": "Sand Canyon 4 - 9", "level": 3, "stage": 4, "room": 9, "pointer": 2885774, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 4 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 0", "level": 3, "stage": 5, "room": 0, "pointer": 3662486, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 450, "x": 2256, "y": 232, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Falling Block)"}], "consumables_pointer": 208, "enemies": ["Wapod", "Dogon", "Tick"], "default_exits": [{"room": 3, "unkn1": 151, "unkn2": 15, "x": 184, "y": 56, "name": "Sand Canyon 5 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 83, "unkn2": 16, "x": 72, "y": 120, "name": "Sand Canyon 5 - 0 Exit 1", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [0, 22], [14, 23], [90, 16], [88, 16]], "locations": ["Sand Canyon 5 - Enemy 1 (Wapod)", "Sand Canyon 5 - Enemy 2 (Dogon)", "Sand Canyon 5 - Enemy 3 (Tick)", "Sand Canyon 5 - Star 1", "Sand Canyon 5 - Star 2", "Sand Canyon 5 - Star 3", "Sand Canyon 5 - Star 4", "Sand Canyon 5 - Star 5", "Sand Canyon 5 - Star 6", "Sand Canyon 5 - Star 7", "Sand Canyon 5 - Star 8", "Sand Canyon 5 - Star 9", "Sand Canyon 5 - Star 10", "Sand Canyon 5 - 1-Up (Falling Block)"], "music": 13}, {"name": "Sand Canyon 5 - 1", "level": 3, "stage": 5, "room": 1, "pointer": 3052622, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "Bobo", "Chilly", "Sparky", "Togezo"], "default_exits": [{"room": 9, "unkn1": 6, "unkn2": 9, "x": 216, "y": 1128, "name": "Sand Canyon 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [6, 16], [3, 16], [8, 16], [18, 16]], "locations": ["Sand Canyon 5 - Enemy 4 (Rocky)", "Sand Canyon 5 - Enemy 5 (Bobo)", "Sand Canyon 5 - Enemy 6 (Chilly)", "Sand Canyon 5 - Enemy 7 (Sparky)", "Sand Canyon 5 - Enemy 8 (Togezo)"], "music": 13}, {"name": "Sand Canyon 5 - 2", "level": 3, "stage": 5, "room": 2, "pointer": 3057544, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 3, "unkn2": 7, "x": 1320, "y": 264, "name": "Sand Canyon 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 1"], "music": 40}, {"name": "Sand Canyon 5 - 3", "level": 3, "stage": 5, "room": 3, "pointer": 3419011, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 192, "x": 56, "y": 648, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 2)"}, {"idx": 14, "pointer": 200, "x": 56, "y": 664, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 3)"}, {"idx": 15, "pointer": 208, "x": 56, "y": 632, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 1)"}, {"idx": 12, "pointer": 368, "x": 320, "y": 264, "etype": 22, "vtype": 2, "name": "Sand Canyon 5 - Maxim Tomato (Pit)"}], "consumables_pointer": 304, "enemies": ["Bronto Burt", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 66, "x": 88, "y": 88, "name": "Sand Canyon 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [30, 16], [2, 16], [0, 22], [2, 22], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 9 (Bronto Burt)", "Sand Canyon 5 - Enemy 10 (Sasuke)", "Sand Canyon 5 - Star 11", "Sand Canyon 5 - Star 12", "Sand Canyon 5 - Star 13", "Sand Canyon 5 - Star 14", "Sand Canyon 5 - Star 15", "Sand Canyon 5 - Star 16", "Sand Canyon 5 - Star 17", "Sand Canyon 5 - 1-Up (Ice 2)", "Sand Canyon 5 - 1-Up (Ice 3)", "Sand Canyon 5 - 1-Up (Ice 1)", "Sand Canyon 5 - Maxim Tomato (Pit)"], "music": 13}, {"name": "Sand Canyon 5 - 4", "level": 3, "stage": 5, "room": 4, "pointer": 3644149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro", "Galbo", "Nidoo"], "default_exits": [{"room": 5, "unkn1": 76, "unkn2": 9, "x": 88, "y": 120, "name": "Sand Canyon 5 - 4 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 116, "unkn2": 14, "x": 200, "y": 1256, "name": "Sand Canyon 5 - 4 Exit 1", "access_rule": []}], "entity_load": [[54, 16], [26, 16], [28, 16], [25, 16], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 11 (Oro)", "Sand Canyon 5 - Enemy 12 (Galbo)", "Sand Canyon 5 - Enemy 13 (Nidoo)", "Sand Canyon 5 - Star 18"], "music": 13}, {"name": "Sand Canyon 5 - 5", "level": 3, "stage": 5, "room": 5, "pointer": 3044100, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 7, "x": 1240, "y": 152, "name": "Sand Canyon 5 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 2"], "music": 39}, {"name": "Sand Canyon 5 - 6", "level": 3, "stage": 5, "room": 6, "pointer": 3373481, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 25, "unkn2": 5, "x": 56, "y": 152, "name": "Sand Canyon 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [31, 16], [89, 16], [6, 16]], "locations": ["Sand Canyon 5 - Enemy 14 (Propeller)"], "music": 13}, {"name": "Sand Canyon 5 - 7", "level": 3, "stage": 5, "room": 7, "pointer": 2964028, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[18, 19], [42, 19]], "locations": ["Sand Canyon 5 - Nyupun"], "music": 8}, {"name": "Sand Canyon 5 - 8", "level": 3, "stage": 5, "room": 8, "pointer": 2890112, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 5 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 9", "level": 3, "stage": 5, "room": 9, "pointer": 3647264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "KeKe", "Kabu"], "default_exits": [{"room": 6, "unkn1": 12, "unkn2": 6, "x": 72, "y": 760, "name": "Sand Canyon 5 - 9 Exit 0", "access_rule": ["Cutter"]}, {"room": 1, "unkn1": 12, "unkn2": 70, "x": 120, "y": 152, "name": "Sand Canyon 5 - 9 Exit 1", "access_rule": []}], "entity_load": [[27, 16], [61, 16], [4, 22], [14, 23], [51, 16], [19, 16]], "locations": ["Sand Canyon 5 - Enemy 15 (Sir Kibble)", "Sand Canyon 5 - Enemy 16 (KeKe)", "Sand Canyon 5 - Enemy 17 (Kabu)", "Sand Canyon 5 - Star 19", "Sand Canyon 5 - Star 20", "Sand Canyon 5 - Star 21", "Sand Canyon 5 - Star 22", "Sand Canyon 5 - Star 23", "Sand Canyon 5 - Star 24", "Sand Canyon 5 - Star 25", "Sand Canyon 5 - Star 26", "Sand Canyon 5 - Star 27", "Sand Canyon 5 - Star 28", "Sand Canyon 5 - Star 29", "Sand Canyon 5 - Star 30", "Sand Canyon 5 - Star 31", "Sand Canyon 5 - Star 32", "Sand Canyon 5 - Star 33", "Sand Canyon 5 - Star 34", "Sand Canyon 5 - Star 35", "Sand Canyon 5 - Star 36", "Sand Canyon 5 - Star 37", "Sand Canyon 5 - Star 38", "Sand Canyon 5 - Star 39", "Sand Canyon 5 - Star 40"], "music": 13}, {"name": "Sand Canyon 6 - 0", "level": 3, "stage": 6, "room": 0, "pointer": 3314761, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Doka", "Cappy", "Pteran"], "default_exits": [{"room": 2, "unkn1": 132, "unkn2": 16, "x": 56, "y": 136, "name": "Sand Canyon 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [35, 16], [39, 16], [12, 16]], "locations": ["Sand Canyon 6 - Enemy 1 (Sparky)", "Sand Canyon 6 - Enemy 2 (Doka)", "Sand Canyon 6 - Enemy 3 (Cappy)", "Sand Canyon 6 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Sand Canyon 6 - 1", "level": 3, "stage": 6, "room": 1, "pointer": 2976913, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 24, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 1", "Sand Canyon 6 - Animal 2", "Sand Canyon 6 - Animal 3"], "music": 39}, {"name": "Sand Canyon 6 - 2", "level": 3, "stage": 6, "room": 2, "pointer": 2978757, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 55, "unkn2": 6, "x": 104, "y": 104, "name": "Sand Canyon 6 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 3", "level": 3, "stage": 6, "room": 3, "pointer": 3178082, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 3 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 3 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 3 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 3 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 3 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 3 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 4", "level": 3, "stage": 6, "room": 4, "pointer": 3181563, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 4 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 4 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 4 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 4 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 4 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 4 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 5", "level": 3, "stage": 6, "room": 5, "pointer": 3177209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 5 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 5 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 5 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 5 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 5 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 5 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 6", "level": 3, "stage": 6, "room": 6, "pointer": 3183291, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 6 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 6 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 6 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 6 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 6 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 6 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 7", "level": 3, "stage": 6, "room": 7, "pointer": 3175453, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 7 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 7 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 7 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 7 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 7 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 7 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 8", "level": 3, "stage": 6, "room": 8, "pointer": 3179826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 8 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 8 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 8 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 8 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 8 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 8 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 9", "level": 3, "stage": 6, "room": 9, "pointer": 3176334, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 9 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 9 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 9 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 9 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 9 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 9 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 10", "level": 3, "stage": 6, "room": 10, "pointer": 3178954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 10 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 10 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 10 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 10 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 10 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 10 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 11", "level": 3, "stage": 6, "room": 11, "pointer": 2989149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 37, "unkn2": 6, "x": 88, "y": 264, "name": "Sand Canyon 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[59, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 12", "level": 3, "stage": 6, "room": 12, "pointer": 3015947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 8, "x": 440, "y": 264, "name": "Sand Canyon 6 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 86, "unkn2": 8, "x": 72, "y": 104, "name": "Sand Canyon 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[64, 16], [59, 16], [55, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 13", "level": 3, "stage": 6, "room": 13, "pointer": 2976539, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 55, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 6 - 13 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 14", "level": 3, "stage": 6, "room": 14, "pointer": 3030336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 5, "unkn2": 9, "x": 200, "y": 152, "name": "Sand Canyon 6 - 14 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 35, "unkn2": 9, "x": 152, "y": 392, "name": "Sand Canyon 6 - 14 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 15", "level": 3, "stage": 6, "room": 15, "pointer": 2972361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 13, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 16", "level": 3, "stage": 6, "room": 16, "pointer": 2953186, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 16 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 16 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 17", "level": 3, "stage": 6, "room": 17, "pointer": 2953633, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 17 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 17 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 18", "level": 3, "stage": 6, "room": 18, "pointer": 2991707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 14, "unkn2": 9, "x": 184, "y": 312, "name": "Sand Canyon 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 19", "level": 3, "stage": 6, "room": 19, "pointer": 2974651, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 5, "unkn2": 9, "x": 376, "y": 392, "name": "Sand Canyon 6 - 19 Exit 0", "access_rule": []}, {"room": 20, "unkn1": 35, "unkn2": 9, "x": 88, "y": 152, "name": "Sand Canyon 6 - 19 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 20", "level": 3, "stage": 6, "room": 20, "pointer": 2969638, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 4, "unkn2": 9, "x": 552, "y": 152, "name": "Sand Canyon 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 21", "level": 3, "stage": 6, "room": 21, "pointer": 2976163, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 9, "unkn2": 13, "x": 296, "y": 216, "name": "Sand Canyon 6 - 21 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 4", "Sand Canyon 6 - Animal 5", "Sand Canyon 6 - Animal 6"], "music": 40}, {"name": "Sand Canyon 6 - 22", "level": 3, "stage": 6, "room": 22, "pointer": 2950938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 38, "unkn1": 14, "unkn2": 8, "x": 168, "y": 376, "name": "Sand Canyon 6 - 22 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 9, "unkn2": 13, "x": 376, "y": 216, "name": "Sand Canyon 6 - 22 Exit 1", "access_rule": []}, {"room": 21, "unkn1": 19, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 22 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 23", "level": 3, "stage": 6, "room": 23, "pointer": 3311993, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 43, "unkn1": 145, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 24", "level": 3, "stage": 6, "room": 24, "pointer": 3079078, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 39, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 24 Exit 0", "access_rule": []}, {"room": 25, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 24 Exit 1", "access_rule": []}, {"room": 39, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 24 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 25", "level": 3, "stage": 6, "room": 25, "pointer": 3065898, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 25 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 25 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 25 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 26", "level": 3, "stage": 6, "room": 26, "pointer": 3063347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 26 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 26 Exit 1", "access_rule": []}, {"room": 27, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 26 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 27", "level": 3, "stage": 6, "room": 27, "pointer": 3066916, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 28, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 27 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 27 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 27 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 28", "level": 3, "stage": 6, "room": 28, "pointer": 3067425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 28 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 11, "unkn2": 8, "x": 184, "y": 344, "name": "Sand Canyon 6 - 28 Exit 1", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 28 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 29", "level": 3, "stage": 6, "room": 29, "pointer": 2950032, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 30, "unkn1": 11, "unkn2": 8, "x": 168, "y": 136, "name": "Sand Canyon 6 - 29 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 30", "level": 3, "stage": 6, "room": 30, "pointer": 2986500, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 10, "unkn2": 44, "x": 136, "y": 152, "name": "Sand Canyon 6 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 31", "level": 3, "stage": 6, "room": 31, "pointer": 3070930, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 31 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 648, "name": "Sand Canyon 6 - 31 Exit 1", "access_rule": []}, {"room": 32, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 31 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 32", "level": 3, "stage": 6, "room": 32, "pointer": 3054817, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Parasol)", "Bukiset (Cutter)"], "default_exits": [{"room": 33, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 32 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 536, "name": "Sand Canyon 6 - 32 Exit 1", "access_rule": []}, {"room": 33, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 32 Exit 2", "access_rule": []}], "entity_load": [[81, 16], [83, 16]], "locations": ["Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))"], "music": 14}, {"name": "Sand Canyon 6 - 33", "level": 3, "stage": 6, "room": 33, "pointer": 3053173, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Clean)", "Bukiset (Spark)"], "default_exits": [{"room": 34, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 33 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 440, "name": "Sand Canyon 6 - 33 Exit 1", "access_rule": []}, {"room": 34, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 33 Exit 2", "access_rule": []}], "entity_load": [[80, 16], [82, 16]], "locations": ["Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))"], "music": 14}, {"name": "Sand Canyon 6 - 34", "level": 3, "stage": 6, "room": 34, "pointer": 3053721, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)"], "default_exits": [{"room": 35, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 34 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 344, "name": "Sand Canyon 6 - 34 Exit 1", "access_rule": []}, {"room": 35, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 34 Exit 2", "access_rule": []}], "entity_load": [[79, 16], [78, 16]], "locations": ["Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))"], "music": 14}, {"name": "Sand Canyon 6 - 35", "level": 3, "stage": 6, "room": 35, "pointer": 3054269, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)"], "default_exits": [{"room": 37, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 35 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 248, "name": "Sand Canyon 6 - 35 Exit 1", "access_rule": []}, {"room": 37, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 35 Exit 2", "access_rule": []}], "entity_load": [[77, 16], [76, 16]], "locations": ["Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))"], "music": 14}, {"name": "Sand Canyon 6 - 36", "level": 3, "stage": 6, "room": 36, "pointer": 2986164, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 10, "unkn2": 44, "x": 392, "y": 152, "name": "Sand Canyon 6 - 36 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 37", "level": 3, "stage": 6, "room": 37, "pointer": 3074377, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 152, "name": "Sand Canyon 6 - 37 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 38", "level": 3, "stage": 6, "room": 38, "pointer": 2971589, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 10, "unkn2": 5, "x": 264, "y": 440, "name": "Sand Canyon 6 - 38 Exit 0", "access_rule": []}, {"room": 22, "unkn1": 10, "unkn2": 23, "x": 248, "y": 136, "name": "Sand Canyon 6 - 38 Exit 1", "access_rule": []}], "entity_load": [[76, 16], [77, 16], [78, 16], [79, 16], [80, 16], [81, 16], [82, 16], [83, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 39", "level": 3, "stage": 6, "room": 39, "pointer": 3063858, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 40, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 39 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 39 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 39 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 40", "level": 3, "stage": 6, "room": 40, "pointer": 3064368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 40 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 40 Exit 1", "access_rule": []}, {"room": 41, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 40 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 41", "level": 3, "stage": 6, "room": 41, "pointer": 3064878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 42, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 41 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 41 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 41 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 42", "level": 3, "stage": 6, "room": 42, "pointer": 3068939, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 42 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 42 Exit 1", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Sand Canyon 6 - Enemy 13 (Nidoo)"], "music": 14}, {"name": "Sand Canyon 6 - 43", "level": 3, "stage": 6, "room": 43, "pointer": 2988495, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 44, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 6 - 43 Exit 0", "access_rule": []}], "entity_load": [[19, 19], [42, 19]], "locations": ["Sand Canyon 6 - Professor Hector & R.O.B"], "music": 8}, {"name": "Sand Canyon 6 - 44", "level": 3, "stage": 6, "room": 44, "pointer": 2886979, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 6 - Complete"], "music": 5}, {"name": "Sand Canyon Boss - 0", "level": 3, "stage": 7, "room": 0, "pointer": 2991389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[6, 18]], "locations": ["Sand Canyon - Boss (Pon & Con) Purified", "Level 3 Boss - Defeated", "Level 3 Boss - Purified"], "music": 2}, {"name": "Cloudy Park 1 - 0", "level": 4, "stage": 1, "room": 0, "pointer": 3172795, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "KeKe", "Cappy"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 5, "x": 56, "y": 152, "name": "Cloudy Park 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [12, 16], [51, 16], [1, 23], [0, 23]], "locations": ["Cloudy Park 1 - Enemy 1 (Waddle Dee)", "Cloudy Park 1 - Enemy 2 (KeKe)", "Cloudy Park 1 - Enemy 3 (Cappy)"], "music": 17}, {"name": "Cloudy Park 1 - 1", "level": 4, "stage": 1, "room": 1, "pointer": 3078163, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 88, "y": 424, "name": "Cloudy Park 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 1"], "music": 39}, {"name": "Cloudy Park 1 - 2", "level": 4, "stage": 1, "room": 2, "pointer": 3285882, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Togezo"], "default_exits": [{"room": 3, "unkn1": 95, "unkn2": 8, "x": 40, "y": 104, "name": "Cloudy Park 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [4, 16], [18, 16], [6, 23]], "locations": ["Cloudy Park 1 - Enemy 4 (Yaban)", "Cloudy Park 1 - Enemy 5 (Togezo)"], "music": 17}, {"name": "Cloudy Park 1 - 3", "level": 4, "stage": 1, "room": 3, "pointer": 3062831, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 15, "unkn2": 6, "x": 56, "y": 264, "name": "Cloudy Park 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 2"], "music": 39}, {"name": "Cloudy Park 1 - 4", "level": 4, "stage": 1, "room": 4, "pointer": 3396729, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 92, "unkn2": 16, "x": 56, "y": 152, "name": "Cloudy Park 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [0, 16], [14, 23], [68, 16], [26, 16], [4, 22]], "locations": ["Cloudy Park 1 - Enemy 6 (Galbo)", "Cloudy Park 1 - Star 1"], "music": 17}, {"name": "Cloudy Park 1 - 5", "level": 4, "stage": 1, "room": 5, "pointer": 3038805, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 6, "unkn2": 5, "x": 2344, "y": 232, "name": "Cloudy Park 1 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 3", "Cloudy Park 1 - Animal 4"], "music": 39}, {"name": "Cloudy Park 1 - 6", "level": 4, "stage": 1, "room": 6, "pointer": 3535736, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Como"], "default_exits": [{"room": 8, "unkn1": 5, "unkn2": 8, "x": 72, "y": 104, "name": "Cloudy Park 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [14, 23], [0, 16], [41, 16], [8, 16]], "locations": ["Cloudy Park 1 - Enemy 7 (Sparky)", "Cloudy Park 1 - Enemy 8 (Como)", "Cloudy Park 1 - Star 2"], "music": 17}, {"name": "Cloudy Park 1 - 7", "level": 4, "stage": 1, "room": 7, "pointer": 2954080, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 6, "x": 88, "y": 104, "name": "Cloudy Park 1 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 5"], "music": 39}, {"name": "Cloudy Park 1 - 8", "level": 4, "stage": 1, "room": 8, "pointer": 3465407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt"], "default_exits": [{"room": 12, "unkn1": 181, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 1 - 8 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [2, 16], [51, 16], [1, 23], [14, 23]], "locations": ["Cloudy Park 1 - Enemy 9 (Bronto Burt)", "Cloudy Park 1 - Star 3", "Cloudy Park 1 - Star 4", "Cloudy Park 1 - Star 5", "Cloudy Park 1 - Star 6", "Cloudy Park 1 - Star 7", "Cloudy Park 1 - Star 8", "Cloudy Park 1 - Star 9", "Cloudy Park 1 - Star 10", "Cloudy Park 1 - Star 11"], "music": 17}, {"name": "Cloudy Park 1 - 9", "level": 4, "stage": 1, "room": 9, "pointer": 3078621, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 56, "y": 264, "name": "Cloudy Park 1 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 6"], "music": 39}, {"name": "Cloudy Park 1 - 10", "level": 4, "stage": 1, "room": 10, "pointer": 3281366, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Sir Kibble"], "default_exits": [{"room": 9, "unkn1": 99, "unkn2": 8, "x": 56, "y": 152, "name": "Cloudy Park 1 - 10 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [24, 16], [27, 16], [4, 23]], "locations": ["Cloudy Park 1 - Enemy 10 (Gabon)", "Cloudy Park 1 - Enemy 11 (Sir Kibble)"], "music": 17}, {"name": "Cloudy Park 1 - 11", "level": 4, "stage": 1, "room": 11, "pointer": 3519608, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 192, "x": 216, "y": 600, "etype": 22, "vtype": 0, "name": "Cloudy Park 1 - 1-Up (Shotzo)"}, {"idx": 18, "pointer": 456, "x": 856, "y": 408, "etype": 22, "vtype": 2, "name": "Cloudy Park 1 - Maxim Tomato (Mariel)"}], "consumables_pointer": 352, "enemies": ["Mariel", "Nruff"], "default_exits": [{"room": 5, "unkn1": 64, "unkn2": 6, "x": 104, "y": 216, "name": "Cloudy Park 1 - 11 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [27, 16], [15, 16], [45, 16], [14, 23], [2, 22], [0, 22], [6, 22]], "locations": ["Cloudy Park 1 - Enemy 12 (Mariel)", "Cloudy Park 1 - Enemy 13 (Nruff)", "Cloudy Park 1 - Star 12", "Cloudy Park 1 - Star 13", "Cloudy Park 1 - Star 14", "Cloudy Park 1 - Star 15", "Cloudy Park 1 - Star 16", "Cloudy Park 1 - Star 17", "Cloudy Park 1 - Star 18", "Cloudy Park 1 - Star 19", "Cloudy Park 1 - Star 20", "Cloudy Park 1 - Star 21", "Cloudy Park 1 - Star 22", "Cloudy Park 1 - Star 23", "Cloudy Park 1 - 1-Up (Shotzo)", "Cloudy Park 1 - Maxim Tomato (Mariel)"], "music": 17}, {"name": "Cloudy Park 1 - 12", "level": 4, "stage": 1, "room": 12, "pointer": 2958914, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 1 - 12 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [42, 19]], "locations": ["Cloudy Park 1 - Hibanamodoki"], "music": 8}, {"name": "Cloudy Park 1 - 13", "level": 4, "stage": 1, "room": 13, "pointer": 2886015, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 1 - Complete"], "music": 5}, {"name": "Cloudy Park 2 - 0", "level": 4, "stage": 2, "room": 0, "pointer": 3142443, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly", "Sasuke"], "default_exits": [{"room": 6, "unkn1": 96, "unkn2": 7, "x": 56, "y": 88, "name": "Cloudy Park 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16], [30, 16], [6, 16], [14, 23]], "locations": ["Cloudy Park 2 - Enemy 1 (Chilly)", "Cloudy Park 2 - Enemy 2 (Sasuke)", "Cloudy Park 2 - Star 1", "Cloudy Park 2 - Star 2", "Cloudy Park 2 - Star 3", "Cloudy Park 2 - Star 4", "Cloudy Park 2 - Star 5", "Cloudy Park 2 - Star 6"], "music": 19}, {"name": "Cloudy Park 2 - 1", "level": 4, "stage": 2, "room": 1, "pointer": 3235925, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Broom Hatter"], "default_exits": [{"room": 2, "unkn1": 146, "unkn2": 5, "x": 88, "y": 88, "name": "Cloudy Park 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [8, 16], [11, 16]], "locations": ["Cloudy Park 2 - Enemy 3 (Waddle Dee)", "Cloudy Park 2 - Enemy 4 (Sparky)", "Cloudy Park 2 - Enemy 5 (Broom Hatter)", "Cloudy Park 2 - Star 7", "Cloudy Park 2 - Star 8", "Cloudy Park 2 - Star 9", "Cloudy Park 2 - Star 10", "Cloudy Park 2 - Star 11", "Cloudy Park 2 - Star 12", "Cloudy Park 2 - Star 13", "Cloudy Park 2 - Star 14", "Cloudy Park 2 - Star 15"], "music": 19}, {"name": "Cloudy Park 2 - 2", "level": 4, "stage": 2, "room": 2, "pointer": 3297758, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Pteran"], "default_exits": [{"room": 3, "unkn1": 147, "unkn2": 8, "x": 72, "y": 136, "name": "Cloudy Park 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[27, 16], [39, 16], [1, 23]], "locations": ["Cloudy Park 2 - Enemy 6 (Sir Kibble)", "Cloudy Park 2 - Enemy 7 (Pteran)"], "music": 19}, {"name": "Cloudy Park 2 - 3", "level": 4, "stage": 2, "room": 3, "pointer": 3341087, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Dogon"], "default_exits": [{"room": 4, "unkn1": 145, "unkn2": 12, "x": 72, "y": 136, "name": "Cloudy Park 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[4, 16], [14, 23], [90, 16], [89, 16]], "locations": ["Cloudy Park 2 - Enemy 8 (Propeller)", "Cloudy Park 2 - Enemy 9 (Dogon)", "Cloudy Park 2 - Star 16", "Cloudy Park 2 - Star 17", "Cloudy Park 2 - Star 18", "Cloudy Park 2 - Star 19", "Cloudy Park 2 - Star 20", "Cloudy Park 2 - Star 21", "Cloudy Park 2 - Star 22", "Cloudy Park 2 - Star 23", "Cloudy Park 2 - Star 24", "Cloudy Park 2 - Star 25", "Cloudy Park 2 - Star 26", "Cloudy Park 2 - Star 27", "Cloudy Park 2 - Star 28", "Cloudy Park 2 - Star 29", "Cloudy Park 2 - Star 30", "Cloudy Park 2 - Star 31", "Cloudy Park 2 - Star 32", "Cloudy Park 2 - Star 33", "Cloudy Park 2 - Star 34", "Cloudy Park 2 - Star 35", "Cloudy Park 2 - Star 36", "Cloudy Park 2 - Star 37"], "music": 19}, {"name": "Cloudy Park 2 - 4", "level": 4, "stage": 2, "room": 4, "pointer": 3457404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Oro", "Bronto Burt", "Rocky"], "default_exits": [{"room": 5, "unkn1": 165, "unkn2": 5, "x": 72, "y": 104, "name": "Cloudy Park 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [3, 16], [14, 23], [18, 16], [25, 16]], "locations": ["Cloudy Park 2 - Enemy 10 (Togezo)", "Cloudy Park 2 - Enemy 11 (Oro)", "Cloudy Park 2 - Enemy 12 (Bronto Burt)", "Cloudy Park 2 - Enemy 13 (Rocky)", "Cloudy Park 2 - Star 38", "Cloudy Park 2 - Star 39", "Cloudy Park 2 - Star 40", "Cloudy Park 2 - Star 41", "Cloudy Park 2 - Star 42", "Cloudy Park 2 - Star 43", "Cloudy Park 2 - Star 44", "Cloudy Park 2 - Star 45", "Cloudy Park 2 - Star 46", "Cloudy Park 2 - Star 47"], "music": 19}, {"name": "Cloudy Park 2 - 5", "level": 4, "stage": 2, "room": 5, "pointer": 3273878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Kapar"], "default_exits": [{"room": 7, "unkn1": 96, "unkn2": 8, "x": 56, "y": 88, "name": "Cloudy Park 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [62, 16], [26, 16], [67, 16]], "locations": ["Cloudy Park 2 - Enemy 14 (Galbo)", "Cloudy Park 2 - Enemy 15 (Kapar)", "Cloudy Park 2 - Star 48", "Cloudy Park 2 - Star 49", "Cloudy Park 2 - Star 50", "Cloudy Park 2 - Star 51", "Cloudy Park 2 - Star 52", "Cloudy Park 2 - Star 53", "Cloudy Park 2 - Star 54"], "music": 19}, {"name": "Cloudy Park 2 - 6", "level": 4, "stage": 2, "room": 6, "pointer": 2984453, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 25, "unkn2": 5, "x": 72, "y": 152, "name": "Cloudy Park 2 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 2 - Animal 1", "Cloudy Park 2 - Animal 2", "Cloudy Park 2 - Animal 3"], "music": 38}, {"name": "Cloudy Park 2 - 7", "level": 4, "stage": 2, "room": 7, "pointer": 2985482, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 5, "x": 40, "y": 88, "name": "Cloudy Park 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[22, 19]], "locations": [], "music": 19}, {"name": "Cloudy Park 2 - 8", "level": 4, "stage": 2, "room": 8, "pointer": 2990753, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[22, 19], [42, 19]], "locations": ["Cloudy Park 2 - Piyo & Keko"], "music": 8}, {"name": "Cloudy Park 2 - 9", "level": 4, "stage": 2, "room": 9, "pointer": 2889630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 2 - Complete"], "music": 5}, {"name": "Cloudy Park 3 - 0", "level": 4, "stage": 3, "room": 0, "pointer": 3100859, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Mopoo", "Poppy Bros Jr."], "default_exits": [{"room": 2, "unkn1": 145, "unkn2": 8, "x": 56, "y": 136, "name": "Cloudy Park 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [74, 16], [47, 16], [7, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 1 (Bronto Burt)", "Cloudy Park 3 - Enemy 2 (Mopoo)", "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)", "Cloudy Park 3 - Star 1", "Cloudy Park 3 - Star 2", "Cloudy Park 3 - Star 3", "Cloudy Park 3 - Star 4", "Cloudy Park 3 - Star 5", "Cloudy Park 3 - Star 6", "Cloudy Park 3 - Star 7"], "music": 15}, {"name": "Cloudy Park 3 - 1", "level": 4, "stage": 3, "room": 1, "pointer": 3209719, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como"], "default_exits": [{"room": 5, "unkn1": 13, "unkn2": 14, "x": 56, "y": 152, "name": "Cloudy Park 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [4, 22], [41, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 4 (Como)", "Cloudy Park 3 - Star 8", "Cloudy Park 3 - Star 9"], "music": 15}, {"name": "Cloudy Park 3 - 2", "level": 4, "stage": 3, "room": 2, "pointer": 3216185, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Bobin", "Loud", "Kapar"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 6, "x": 216, "y": 1064, "name": "Cloudy Park 3 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 24, "unkn2": 14, "x": 104, "y": 152, "name": "Cloudy Park 3 - 2 Exit 1", "access_rule": []}], "entity_load": [[67, 16], [40, 16], [73, 16], [14, 23], [16, 16]], "locations": ["Cloudy Park 3 - Enemy 5 (Glunk)", "Cloudy Park 3 - Enemy 6 (Bobin)", "Cloudy Park 3 - Enemy 7 (Loud)", "Cloudy Park 3 - Enemy 8 (Kapar)", "Cloudy Park 3 - Star 10", "Cloudy Park 3 - Star 11", "Cloudy Park 3 - Star 12", "Cloudy Park 3 - Star 13", "Cloudy Park 3 - Star 14", "Cloudy Park 3 - Star 15", "Cloudy Park 3 - Star 16"], "music": 15}, {"name": "Cloudy Park 3 - 3", "level": 4, "stage": 3, "room": 3, "pointer": 2994208, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 5, "unkn2": 9, "x": 408, "y": 232, "name": "Cloudy Park 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 3 - Animal 1", "Cloudy Park 3 - Animal 2", "Cloudy Park 3 - Animal 3"], "music": 40}, {"name": "Cloudy Park 3 - 4", "level": 4, "stage": 3, "room": 4, "pointer": 3229151, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Batamon", "Bouncy"], "default_exits": [{"room": 6, "unkn1": 156, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 126, "unkn2": 9, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 1", "access_rule": []}], "entity_load": [[7, 16], [26, 16], [14, 23], [13, 16], [68, 16]], "locations": ["Cloudy Park 3 - Enemy 9 (Galbo)", "Cloudy Park 3 - Enemy 10 (Batamon)", "Cloudy Park 3 - Enemy 11 (Bouncy)", "Cloudy Park 3 - Star 17", "Cloudy Park 3 - Star 18", "Cloudy Park 3 - Star 19", "Cloudy Park 3 - Star 20", "Cloudy Park 3 - Star 21", "Cloudy Park 3 - Star 22"], "music": 15}, {"name": "Cloudy Park 3 - 5", "level": 4, "stage": 3, "room": 5, "pointer": 2969244, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": [], "music": 31}, {"name": "Cloudy Park 3 - 6", "level": 4, "stage": 3, "room": 6, "pointer": 4128530, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": ["Cloudy Park 3 - Mr. Ball"], "music": 8}, {"name": "Cloudy Park 3 - 7", "level": 4, "stage": 3, "room": 7, "pointer": 2885051, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 3 - Complete"], "music": 5}, {"name": "Cloudy Park 4 - 0", "level": 4, "stage": 4, "room": 0, "pointer": 3072905, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[4, 23], [1, 23], [0, 23], [31, 16]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 1", "level": 4, "stage": 4, "room": 1, "pointer": 3074863, "animal_pointers": [208, 224], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 21, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 4 - Animal 1", "Cloudy Park 4 - Animal 2"], "music": 38}, {"name": "Cloudy Park 4 - 2", "level": 4, "stage": 4, "room": 2, "pointer": 3309209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Como", "Wapod", "Cappy"], "default_exits": [{"room": 3, "unkn1": 145, "unkn2": 9, "x": 104, "y": 152, "name": "Cloudy Park 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [24, 16], [12, 16], [14, 23], [41, 16], [4, 22]], "locations": ["Cloudy Park 4 - Enemy 1 (Gabon)", "Cloudy Park 4 - Enemy 2 (Como)", "Cloudy Park 4 - Enemy 3 (Wapod)", "Cloudy Park 4 - Enemy 4 (Cappy)", "Cloudy Park 4 - Star 1", "Cloudy Park 4 - Star 2", "Cloudy Park 4 - Star 3", "Cloudy Park 4 - Star 4", "Cloudy Park 4 - Star 5", "Cloudy Park 4 - Star 6", "Cloudy Park 4 - Star 7", "Cloudy Park 4 - Star 8", "Cloudy Park 4 - Star 9", "Cloudy Park 4 - Star 10", "Cloudy Park 4 - Star 11", "Cloudy Park 4 - Star 12"], "music": 21}, {"name": "Cloudy Park 4 - 3", "level": 4, "stage": 4, "room": 3, "pointer": 3296291, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 776, "x": 1880, "y": 152, "etype": 22, "vtype": 0, "name": "Cloudy Park 4 - 1-Up (Windy)"}, {"idx": 34, "pointer": 912, "x": 2160, "y": 152, "etype": 22, "vtype": 2, "name": "Cloudy Park 4 - Maxim Tomato (Windy)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Togezo"], "default_exits": [{"room": 5, "unkn1": 144, "unkn2": 9, "x": 56, "y": 136, "name": "Cloudy Park 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[18, 16], [8, 16], [31, 16], [14, 23], [4, 22], [4, 16], [0, 22], [2, 22]], "locations": ["Cloudy Park 4 - Enemy 5 (Sparky)", "Cloudy Park 4 - Enemy 6 (Togezo)", "Cloudy Park 4 - Star 13", "Cloudy Park 4 - Star 14", "Cloudy Park 4 - Star 15", "Cloudy Park 4 - Star 16", "Cloudy Park 4 - Star 17", "Cloudy Park 4 - Star 18", "Cloudy Park 4 - Star 19", "Cloudy Park 4 - Star 20", "Cloudy Park 4 - Star 21", "Cloudy Park 4 - Star 22", "Cloudy Park 4 - Star 23", "Cloudy Park 4 - Star 24", "Cloudy Park 4 - Star 25", "Cloudy Park 4 - Star 26", "Cloudy Park 4 - Star 27", "Cloudy Park 4 - Star 28", "Cloudy Park 4 - Star 29", "Cloudy Park 4 - Star 30", "Cloudy Park 4 - 1-Up (Windy)", "Cloudy Park 4 - Maxim Tomato (Windy)"], "music": 21}, {"name": "Cloudy Park 4 - 4", "level": 4, "stage": 4, "room": 4, "pointer": 3330996, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "KeKe", "Bouncy"], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 15, "x": 72, "y": 152, "name": "Cloudy Park 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [51, 16], [17, 16], [14, 23], [2, 16]], "locations": ["Cloudy Park 4 - Enemy 7 (Bronto Burt)", "Cloudy Park 4 - Enemy 8 (KeKe)", "Cloudy Park 4 - Enemy 9 (Bouncy)", "Cloudy Park 4 - Star 31", "Cloudy Park 4 - Star 32", "Cloudy Park 4 - Star 33", "Cloudy Park 4 - Star 34", "Cloudy Park 4 - Star 35", "Cloudy Park 4 - Star 36", "Cloudy Park 4 - Star 37", "Cloudy Park 4 - Star 38"], "music": 21}, {"name": "Cloudy Park 4 - 5", "level": 4, "stage": 4, "room": 5, "pointer": 3332300, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Mariel"], "default_exits": [{"room": 4, "unkn1": 21, "unkn2": 51, "x": 2328, "y": 120, "name": "Cloudy Park 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [46, 16], [27, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 10 (Sir Kibble)", "Cloudy Park 4 - Enemy 11 (Mariel)", "Cloudy Park 4 - Star 39", "Cloudy Park 4 - Star 40", "Cloudy Park 4 - Star 41", "Cloudy Park 4 - Star 42", "Cloudy Park 4 - Star 43"], "music": 21}, {"name": "Cloudy Park 4 - 6", "level": 4, "stage": 4, "room": 6, "pointer": 3253310, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu", "Wappa"], "default_exits": [{"room": 9, "unkn1": 3, "unkn2": 6, "x": 72, "y": 152, "name": "Cloudy Park 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [31, 16], [19, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 12 (Kabu)", "Cloudy Park 4 - Enemy 13 (Wappa)", "Cloudy Park 4 - Star 44", "Cloudy Park 4 - Star 45", "Cloudy Park 4 - Star 46", "Cloudy Park 4 - Star 47", "Cloudy Park 4 - Star 48", "Cloudy Park 4 - Star 49", "Cloudy Park 4 - Star 50"], "music": 21}, {"name": "Cloudy Park 4 - 7", "level": 4, "stage": 4, "room": 7, "pointer": 2967658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 12, "unkn2": 9, "x": 152, "y": 120, "name": "Cloudy Park 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Cloudy Park 4 - Miniboss 1 (Jumper Shoot)"], "music": 4}, {"name": "Cloudy Park 4 - 8", "level": 4, "stage": 4, "room": 8, "pointer": 2981644, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 344, "y": 680, "name": "Cloudy Park 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[24, 19]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 9", "level": 4, "stage": 4, "room": 9, "pointer": 3008001, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[24, 19], [42, 19]], "locations": ["Cloudy Park 4 - Mikarin & Kagami Mocchi"], "music": 8}, {"name": "Cloudy Park 4 - 10", "level": 4, "stage": 4, "room": 10, "pointer": 2888184, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 4 - Complete"], "music": 5}, {"name": "Cloudy Park 5 - 0", "level": 4, "stage": 5, "room": 0, "pointer": 3192630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Sir Kibble", "Cappy", "Wappa"], "default_exits": [{"room": 1, "unkn1": 146, "unkn2": 6, "x": 168, "y": 616, "name": "Cloudy Park 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [27, 16], [44, 16], [12, 16], [14, 23]], "locations": ["Cloudy Park 5 - Enemy 1 (Yaban)", "Cloudy Park 5 - Enemy 2 (Sir Kibble)", "Cloudy Park 5 - Enemy 3 (Cappy)", "Cloudy Park 5 - Enemy 4 (Wappa)", "Cloudy Park 5 - Star 1", "Cloudy Park 5 - Star 2"], "music": 17}, {"name": "Cloudy Park 5 - 1", "level": 4, "stage": 5, "room": 1, "pointer": 3050956, "animal_pointers": [], "consumables": [{"idx": 5, "pointer": 264, "x": 480, "y": 720, "etype": 22, "vtype": 2, "name": "Cloudy Park 5 - Maxim Tomato (Pillars)"}], "consumables_pointer": 288, "enemies": ["Galbo", "Bronto Burt", "KeKe"], "default_exits": [{"room": 2, "unkn1": 32, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [51, 16], [26, 16], [14, 23], [2, 22]], "locations": ["Cloudy Park 5 - Enemy 5 (Galbo)", "Cloudy Park 5 - Enemy 6 (Bronto Burt)", "Cloudy Park 5 - Enemy 7 (KeKe)", "Cloudy Park 5 - Star 3", "Cloudy Park 5 - Star 4", "Cloudy Park 5 - Star 5", "Cloudy Park 5 - Maxim Tomato (Pillars)"], "music": 17}, {"name": "Cloudy Park 5 - 2", "level": 4, "stage": 5, "room": 2, "pointer": 3604194, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 17, "unkn2": 9, "x": 72, "y": 88, "name": "Cloudy Park 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 5 - Animal 1", "Cloudy Park 5 - Animal 2"], "music": 40}, {"name": "Cloudy Park 5 - 3", "level": 4, "stage": 5, "room": 3, "pointer": 3131242, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Klinko"], "default_exits": [{"room": 4, "unkn1": 98, "unkn2": 5, "x": 72, "y": 120, "name": "Cloudy Park 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [4, 16], [42, 16], [4, 23]], "locations": ["Cloudy Park 5 - Enemy 8 (Propeller)", "Cloudy Park 5 - Enemy 9 (Klinko)"], "music": 17}, {"name": "Cloudy Park 5 - 4", "level": 4, "stage": 5, "room": 4, "pointer": 2990116, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 23, "unkn2": 7, "x": 216, "y": 744, "name": "Cloudy Park 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[88, 16]], "locations": ["Cloudy Park 5 - Enemy 10 (Wapod)"], "music": 17}, {"name": "Cloudy Park 5 - 5", "level": 4, "stage": 5, "room": 5, "pointer": 2975410, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 4, "x": 104, "y": 296, "name": "Cloudy Park 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [2, 16]], "locations": ["Cloudy Park 5 - Star 6"], "music": 17}, {"name": "Cloudy Park 5 - 6", "level": 4, "stage": 5, "room": 6, "pointer": 3173683, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 7, "unkn1": 115, "unkn2": 6, "x": 56, "y": 136, "name": "Cloudy Park 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [1, 23], [39, 16], [70, 16]], "locations": ["Cloudy Park 5 - Enemy 11 (Pteran)"], "music": 17}, {"name": "Cloudy Park 5 - 7", "level": 4, "stage": 5, "room": 7, "pointer": 2992340, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[25, 19], [42, 19]], "locations": ["Cloudy Park 5 - Pick"], "music": 8}, {"name": "Cloudy Park 5 - 8", "level": 4, "stage": 5, "room": 8, "pointer": 2891558, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 5 - Complete"], "music": 5}, {"name": "Cloudy Park 6 - 0", "level": 4, "stage": 6, "room": 0, "pointer": 3269847, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": ["Cloudy Park 6 - Star 1"], "music": 11}, {"name": "Cloudy Park 6 - 1", "level": 4, "stage": 6, "room": 1, "pointer": 3252248, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 3, "unkn2": 25, "x": 72, "y": 72, "name": "Cloudy Park 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [55, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 2", "level": 4, "stage": 6, "room": 2, "pointer": 3028494, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 0, "unkn1": 4, "unkn2": 9, "x": 1032, "y": 152, "name": "Cloudy Park 6 - 2 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 13, "unkn2": 9, "x": 56, "y": 72, "name": "Cloudy Park 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 1 (Madoo)", "Cloudy Park 6 - Star 2", "Cloudy Park 6 - Star 3", "Cloudy Park 6 - Star 4", "Cloudy Park 6 - Star 5"], "music": 11}, {"name": "Cloudy Park 6 - 3", "level": 4, "stage": 6, "room": 3, "pointer": 3131911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 3 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 3 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 3 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 3 Exit 3", "access_rule": []}, {"room": 10, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 3 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 4", "level": 4, "stage": 6, "room": 4, "pointer": 3115416, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick", "Como"], "default_exits": [{"room": 8, "unkn1": 20, "unkn2": 4, "x": 72, "y": 488, "name": "Cloudy Park 6 - 4 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 4 Exit 1", "access_rule": []}, {"room": 11, "unkn1": 8, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 12, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 4 Exit 3", "access_rule": []}, {"room": 11, "unkn1": 16, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 4 Exit 4", "access_rule": []}, {"room": 11, "unkn1": 20, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 4 Exit 5", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [41, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 2 (Tick)", "Cloudy Park 6 - Enemy 3 (Como)", "Cloudy Park 6 - Star 6", "Cloudy Park 6 - Star 7", "Cloudy Park 6 - Star 8"], "music": 11}, {"name": "Cloudy Park 6 - 5", "level": 4, "stage": 6, "room": 5, "pointer": 3245809, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 15, "unkn1": 65, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16], [14, 23], [4, 22]], "locations": ["Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)", "Cloudy Park 6 - Star 9", "Cloudy Park 6 - Star 10", "Cloudy Park 6 - Star 11", "Cloudy Park 6 - Star 12", "Cloudy Park 6 - Star 13"], "music": 11}, {"name": "Cloudy Park 6 - 6", "level": 4, "stage": 6, "room": 6, "pointer": 3237044, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 56, "unkn2": 9, "x": 72, "y": 136, "name": "Cloudy Park 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[89, 16]], "locations": ["Cloudy Park 6 - Enemy 7 (Propeller)"], "music": 11}, {"name": "Cloudy Park 6 - 7", "level": 4, "stage": 6, "room": 7, "pointer": 3262705, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo"], "default_exits": [{"room": 13, "unkn1": 12, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 57, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 64, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 6 - 7 Exit 2", "access_rule": []}], "entity_load": [[74, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 8 (Mopoo)", "Cloudy Park 6 - Star 14", "Cloudy Park 6 - Star 15", "Cloudy Park 6 - Star 16", "Cloudy Park 6 - Star 17"], "music": 11}, {"name": "Cloudy Park 6 - 8", "level": 4, "stage": 6, "room": 8, "pointer": 3027259, "animal_pointers": [], "consumables": [{"idx": 22, "pointer": 312, "x": 224, "y": 256, "etype": 22, "vtype": 0, "name": "Cloudy Park 6 - 1-Up (Cutter)"}], "consumables_pointer": 304, "enemies": ["Bukiset (Burning)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Cutter)"], "default_exits": [{"room": 12, "unkn1": 13, "unkn2": 4, "x": 88, "y": 152, "name": "Cloudy Park 6 - 8 Exit 0", "access_rule": []}], "entity_load": [[78, 16], [80, 16], [76, 16], [79, 16], [83, 16], [14, 23], [4, 22], [0, 22]], "locations": ["Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", "Cloudy Park 6 - Star 18", "Cloudy Park 6 - Star 19", "Cloudy Park 6 - Star 20", "Cloudy Park 6 - Star 21", "Cloudy Park 6 - Star 22", "Cloudy Park 6 - Star 23", "Cloudy Park 6 - Star 24", "Cloudy Park 6 - Star 25", "Cloudy Park 6 - Star 26", "Cloudy Park 6 - Star 27", "Cloudy Park 6 - Star 28", "Cloudy Park 6 - Star 29", "Cloudy Park 6 - 1-Up (Cutter)"], "music": 11}, {"name": "Cloudy Park 6 - 9", "level": 4, "stage": 6, "room": 9, "pointer": 3089504, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 35, "unkn2": 7, "x": 72, "y": 72, "name": "Cloudy Park 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[41, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 10", "level": 4, "stage": 6, "room": 10, "pointer": 3132579, "animal_pointers": [242, 250, 258], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 20, "unkn2": 4, "x": 72, "y": 152, "name": "Cloudy Park 6 - 10 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 4, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 10 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 10 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 10 Exit 3", "access_rule": []}, {"room": 3, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 10 Exit 4", "access_rule": []}, {"room": 3, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 10 Exit 5", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 6 - Animal 1", "Cloudy Park 6 - Animal 2", "Cloudy Park 6 - Animal 3"], "music": 40}, {"name": "Cloudy Park 6 - 11", "level": 4, "stage": 6, "room": 11, "pointer": 3017866, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 11 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 8, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 11 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 12, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 11 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 16, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 11 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 20, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 11 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 12", "level": 4, "stage": 6, "room": 12, "pointer": 3036404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 9, "x": 200, "y": 72, "name": "Cloudy Park 6 - 12 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 13, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": ["Cloudy Park 6 - Star 30", "Cloudy Park 6 - Star 31", "Cloudy Park 6 - Star 32", "Cloudy Park 6 - Star 33"], "music": 11}, {"name": "Cloudy Park 6 - 13", "level": 4, "stage": 6, "room": 13, "pointer": 2965251, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 216, "y": 136, "name": "Cloudy Park 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[26, 19]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 14", "level": 4, "stage": 6, "room": 14, "pointer": 3077236, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 936, "y": 136, "name": "Cloudy Park 6 - 14 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 15", "level": 4, "stage": 6, "room": 15, "pointer": 3061794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[26, 19], [42, 19]], "locations": ["Cloudy Park 6 - HB-007"], "music": 8}, {"name": "Cloudy Park 6 - 16", "level": 4, "stage": 6, "room": 16, "pointer": 2888907, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 6 - Complete"], "music": 5}, {"name": "Cloudy Park Boss - 0", "level": 4, "stage": 7, "room": 0, "pointer": 2998682, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[3, 18]], "locations": ["Cloudy Park - Boss (Ado) Purified", "Level 4 Boss - Defeated", "Level 4 Boss - Purified"], "music": 2}, {"name": "Iceberg 1 - 0", "level": 5, "stage": 1, "room": 0, "pointer": 3363111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Klinko", "KeKe"], "default_exits": [{"room": 1, "unkn1": 104, "unkn2": 8, "x": 312, "y": 1384, "name": "Iceberg 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [0, 16], [51, 16]], "locations": ["Iceberg 1 - Enemy 1 (Waddle Dee)", "Iceberg 1 - Enemy 2 (Klinko)", "Iceberg 1 - Enemy 3 (KeKe)"], "music": 18}, {"name": "Iceberg 1 - 1", "level": 5, "stage": 1, "room": 1, "pointer": 3596524, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Galbo", "Rocky"], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 8, "x": 72, "y": 344, "name": "Iceberg 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [41, 16], [26, 16], [14, 23], [4, 22], [6, 23]], "locations": ["Iceberg 1 - Enemy 4 (Como)", "Iceberg 1 - Enemy 5 (Galbo)", "Iceberg 1 - Enemy 6 (Rocky)", "Iceberg 1 - Star 1", "Iceberg 1 - Star 2", "Iceberg 1 - Star 3", "Iceberg 1 - Star 4", "Iceberg 1 - Star 5", "Iceberg 1 - Star 6"], "music": 18}, {"name": "Iceberg 1 - 2", "level": 5, "stage": 1, "room": 2, "pointer": 3288880, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 3, "unkn1": 49, "unkn2": 9, "x": 184, "y": 152, "name": "Iceberg 1 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 94, "unkn2": 21, "x": 120, "y": 168, "name": "Iceberg 1 - 2 Exit 1", "access_rule": []}], "entity_load": [[28, 19], [46, 16], [47, 16], [17, 16], [67, 16]], "locations": ["Iceberg 1 - Enemy 7 (Kapar)"], "music": 18}, {"name": "Iceberg 1 - 3", "level": 5, "stage": 1, "room": 3, "pointer": 3068439, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 9, "x": 808, "y": 152, "name": "Iceberg 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 1 - Animal 1", "Iceberg 1 - Animal 2"], "music": 38}, {"name": "Iceberg 1 - 4", "level": 5, "stage": 1, "room": 4, "pointer": 3233681, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo", "Babut", "Wappa"], "default_exits": [{"room": 6, "unkn1": 74, "unkn2": 4, "x": 56, "y": 152, "name": "Iceberg 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [43, 16], [74, 16]], "locations": ["Iceberg 1 - Enemy 8 (Mopoo)", "Iceberg 1 - Enemy 9 (Babut)", "Iceberg 1 - Enemy 10 (Wappa)"], "music": 18}, {"name": "Iceberg 1 - 5", "level": 5, "stage": 1, "room": 5, "pointer": 3406133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Chilly", "Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 196, "unkn2": 9, "x": 72, "y": 744, "name": "Iceberg 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [7, 16], [2, 16], [0, 16]], "locations": ["Iceberg 1 - Enemy 11 (Bronto Burt)", "Iceberg 1 - Enemy 12 (Chilly)", "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)"], "music": 18}, {"name": "Iceberg 1 - 6", "level": 5, "stage": 1, "room": 6, "pointer": 2985823, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 19], [42, 19]], "locations": ["Iceberg 1 - Kogoesou"], "music": 8}, {"name": "Iceberg 1 - 7", "level": 5, "stage": 1, "room": 7, "pointer": 2892040, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 1 - Complete"], "music": 5}, {"name": "Iceberg 2 - 0", "level": 5, "stage": 2, "room": 0, "pointer": 3106800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Nruff"], "default_exits": [{"room": 1, "unkn1": 113, "unkn2": 36, "x": 88, "y": 152, "name": "Iceberg 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [24, 16]], "locations": ["Iceberg 2 - Enemy 1 (Gabon)", "Iceberg 2 - Enemy 2 (Nruff)"], "music": 20}, {"name": "Iceberg 2 - 1", "level": 5, "stage": 2, "room": 1, "pointer": 3334841, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Chilly", "Pteran"], "default_exits": [{"room": 2, "unkn1": 109, "unkn2": 20, "x": 88, "y": 72, "name": "Iceberg 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [0, 16], [4, 16], [39, 16]], "locations": ["Iceberg 2 - Enemy 3 (Waddle Dee)", "Iceberg 2 - Enemy 4 (Chilly)", "Iceberg 2 - Enemy 5 (Pteran)"], "music": 20}, {"name": "Iceberg 2 - 2", "level": 5, "stage": 2, "room": 2, "pointer": 3473408, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Galbo", "Babut", "Magoo"], "default_exits": [{"room": 6, "unkn1": 102, "unkn2": 5, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 24, "unkn2": 18, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 37, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 55, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 3", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 4", "access_rule": []}], "entity_load": [[53, 16], [26, 16], [43, 16], [14, 23], [16, 16]], "locations": ["Iceberg 2 - Enemy 6 (Glunk)", "Iceberg 2 - Enemy 7 (Galbo)", "Iceberg 2 - Enemy 8 (Babut)", "Iceberg 2 - Enemy 9 (Magoo)", "Iceberg 2 - Star 1", "Iceberg 2 - Star 2"], "music": 20}, {"name": "Iceberg 2 - 3", "level": 5, "stage": 2, "room": 3, "pointer": 3037006, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 616, "y": 424, "name": "Iceberg 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": ["Iceberg 2 - Star 3"], "music": 20}, {"name": "Iceberg 2 - 4", "level": 5, "stage": 2, "room": 4, "pointer": 3035198, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 904, "y": 424, "name": "Iceberg 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": ["Iceberg 2 - Star 4", "Iceberg 2 - Star 5"], "music": 20}, {"name": "Iceberg 2 - 5", "level": 5, "stage": 2, "room": 5, "pointer": 3128551, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 424, "name": "Iceberg 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": ["Iceberg 2 - Star 6", "Iceberg 2 - Star 7", "Iceberg 2 - Star 8"], "music": 20}, {"name": "Iceberg 2 - 6", "level": 5, "stage": 2, "room": 6, "pointer": 3270857, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Nidoo", "Oro"], "default_exits": [{"room": 7, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Iceberg 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [4, 22], [89, 16], [28, 16], [25, 16]], "locations": ["Iceberg 2 - Enemy 10 (Propeller)", "Iceberg 2 - Enemy 11 (Nidoo)", "Iceberg 2 - Enemy 12 (Oro)"], "music": 20}, {"name": "Iceberg 2 - 7", "level": 5, "stage": 2, "room": 7, "pointer": 3212501, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Klinko", "Bronto Burt"], "default_exits": [{"room": 8, "unkn1": 124, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [14, 23], [2, 16], [4, 23]], "locations": ["Iceberg 2 - Enemy 13 (Klinko)", "Iceberg 2 - Enemy 14 (Bronto Burt)", "Iceberg 2 - Star 9", "Iceberg 2 - Star 10", "Iceberg 2 - Star 11", "Iceberg 2 - Star 12", "Iceberg 2 - Star 13", "Iceberg 2 - Star 14", "Iceberg 2 - Star 15", "Iceberg 2 - Star 16", "Iceberg 2 - Star 17", "Iceberg 2 - Star 18", "Iceberg 2 - Star 19"], "music": 20}, {"name": "Iceberg 2 - 8", "level": 5, "stage": 2, "room": 8, "pointer": 2994515, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [42, 19]], "locations": ["Iceberg 2 - Samus"], "music": 8}, {"name": "Iceberg 2 - 9", "level": 5, "stage": 2, "room": 9, "pointer": 3058084, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 9, "x": 408, "y": 296, "name": "Iceberg 2 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 2 - Animal 1", "Iceberg 2 - Animal 2"], "music": 39}, {"name": "Iceberg 2 - 10", "level": 5, "stage": 2, "room": 10, "pointer": 2887220, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 2 - Complete"], "music": 5}, {"name": "Iceberg 3 - 0", "level": 5, "stage": 3, "room": 0, "pointer": 3455346, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori", "Bouncy", "Chilly", "Pteran"], "default_exits": [{"room": 1, "unkn1": 98, "unkn2": 6, "x": 200, "y": 232, "name": "Iceberg 3 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 217, "unkn2": 7, "x": 40, "y": 120, "name": "Iceberg 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[60, 16], [6, 16], [39, 16], [13, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 1 (Corori)", "Iceberg 3 - Enemy 2 (Bouncy)", "Iceberg 3 - Enemy 3 (Chilly)", "Iceberg 3 - Enemy 4 (Pteran)", "Iceberg 3 - Star 1", "Iceberg 3 - Star 2"], "music": 14}, {"name": "Iceberg 3 - 1", "level": 5, "stage": 3, "room": 1, "pointer": 3019769, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 11, "unkn2": 14, "x": 1592, "y": 104, "name": "Iceberg 3 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 1", "Iceberg 3 - Animal 2", "Iceberg 3 - Animal 3"], "music": 38}, {"name": "Iceberg 3 - 2", "level": 5, "stage": 3, "room": 2, "pointer": 3618121, "animal_pointers": [], "consumables": [{"idx": 2, "pointer": 352, "x": 1776, "y": 104, "etype": 22, "vtype": 2, "name": "Iceberg 3 - Maxim Tomato (Ceiling)"}], "consumables_pointer": 128, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 196, "unkn2": 11, "x": 72, "y": 152, "name": "Iceberg 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[2, 22], [71, 16], [57, 16], [21, 16], [67, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 5 (Raft Waddle Dee)", "Iceberg 3 - Enemy 6 (Kapar)", "Iceberg 3 - Enemy 7 (Blipper)", "Iceberg 3 - Star 3", "Iceberg 3 - Maxim Tomato (Ceiling)"], "music": 14}, {"name": "Iceberg 3 - 3", "level": 5, "stage": 3, "room": 3, "pointer": 3650368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 116, "unkn2": 11, "x": 40, "y": 152, "name": "Iceberg 3 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 63, "unkn2": 13, "x": 184, "y": 136, "name": "Iceberg 3 - 3 Exit 1", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [4, 22], [6, 16], [88, 16]], "locations": ["Iceberg 3 - Enemy 8 (Wapod)", "Iceberg 3 - Star 4", "Iceberg 3 - Star 5", "Iceberg 3 - Star 6", "Iceberg 3 - Star 7", "Iceberg 3 - Star 8", "Iceberg 3 - Star 9", "Iceberg 3 - Star 10"], "music": 14}, {"name": "Iceberg 3 - 4", "level": 5, "stage": 3, "room": 4, "pointer": 3038208, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 10, "unkn2": 8, "x": 1032, "y": 216, "name": "Iceberg 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 4", "Iceberg 3 - Animal 5"], "music": 39}, {"name": "Iceberg 3 - 5", "level": 5, "stage": 3, "room": 5, "pointer": 3013938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": [], "music": 31}, {"name": "Iceberg 3 - 6", "level": 5, "stage": 3, "room": 6, "pointer": 3624789, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Icicle"], "default_exits": [{"room": 7, "unkn1": 211, "unkn2": 7, "x": 40, "y": 152, "name": "Iceberg 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [16, 16], [14, 23], [36, 16], [4, 22]], "locations": ["Iceberg 3 - Enemy 9 (Glunk)", "Iceberg 3 - Enemy 10 (Icicle)", "Iceberg 3 - Star 11", "Iceberg 3 - Star 12", "Iceberg 3 - Star 13", "Iceberg 3 - Star 14", "Iceberg 3 - Star 15", "Iceberg 3 - Star 16", "Iceberg 3 - Star 17", "Iceberg 3 - Star 18", "Iceberg 3 - Star 19", "Iceberg 3 - Star 20", "Iceberg 3 - Star 21"], "music": 14}, {"name": "Iceberg 3 - 7", "level": 5, "stage": 3, "room": 7, "pointer": 2989472, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 7 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": ["Iceberg 3 - Chef Kawasaki"], "music": 8}, {"name": "Iceberg 3 - 8", "level": 5, "stage": 3, "room": 8, "pointer": 2889871, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 3 - Complete"], "music": 5}, {"name": "Iceberg 4 - 0", "level": 5, "stage": 4, "room": 0, "pointer": 3274879, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo", "Klinko", "Chilly"], "default_exits": [{"room": 1, "unkn1": 111, "unkn2": 8, "x": 72, "y": 104, "name": "Iceberg 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [2, 16], [26, 16]], "locations": ["Iceberg 4 - Enemy 1 (Bronto Burt)", "Iceberg 4 - Enemy 2 (Galbo)", "Iceberg 4 - Enemy 3 (Klinko)", "Iceberg 4 - Enemy 4 (Chilly)"], "music": 19}, {"name": "Iceberg 4 - 1", "level": 5, "stage": 4, "room": 1, "pointer": 3371780, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Babut", "Wappa"], "default_exits": [{"room": 2, "unkn1": 60, "unkn2": 36, "x": 216, "y": 88, "name": "Iceberg 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [4, 22], [44, 16]], "locations": ["Iceberg 4 - Enemy 5 (Babut)", "Iceberg 4 - Enemy 6 (Wappa)"], "music": 19}, {"name": "Iceberg 4 - 2", "level": 5, "stage": 4, "room": 2, "pointer": 3284378, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 8, "unkn2": 39, "x": 168, "y": 152, "name": "Iceberg 4 - 2 Exit 0", "access_rule": ["Burning"]}, {"room": 3, "unkn1": 13, "unkn2": 39, "x": 88, "y": 136, "name": "Iceberg 4 - 2 Exit 1", "access_rule": []}, {"room": 17, "unkn1": 18, "unkn2": 39, "x": 120, "y": 152, "name": "Iceberg 4 - 2 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 3", "level": 5, "stage": 4, "room": 3, "pointer": 3162957, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 44, "unkn2": 8, "x": 216, "y": 104, "name": "Iceberg 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[69, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 4", "level": 5, "stage": 4, "room": 4, "pointer": 3261679, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Icicle"], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 42, "x": 104, "y": 840, "name": "Iceberg 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[36, 16]], "locations": ["Iceberg 4 - Enemy 7 (Icicle)"], "music": 19}, {"name": "Iceberg 4 - 5", "level": 5, "stage": 4, "room": 5, "pointer": 3217398, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori"], "default_exits": [{"room": 6, "unkn1": 19, "unkn2": 5, "x": 72, "y": 120, "name": "Iceberg 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[60, 16], [44, 16], [4, 22]], "locations": ["Iceberg 4 - Enemy 8 (Corori)"], "music": 19}, {"name": "Iceberg 4 - 6", "level": 5, "stage": 4, "room": 6, "pointer": 3108265, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 61, "unkn2": 7, "x": 456, "y": 72, "name": "Iceberg 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 7", "level": 5, "stage": 4, "room": 7, "pointer": 3346202, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 39, "unkn2": 6, "x": 168, "y": 104, "name": "Iceberg 4 - 7 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 4, "unkn2": 21, "x": 88, "y": 168, "name": "Iceberg 4 - 7 Exit 1", "access_rule": ["Burning"]}, {"room": 13, "unkn1": 21, "unkn2": 21, "x": 280, "y": 168, "name": "Iceberg 4 - 7 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[14, 23], [4, 22], [4, 23]], "locations": ["Iceberg 4 - Star 1", "Iceberg 4 - Star 2"], "music": 19}, {"name": "Iceberg 4 - 8", "level": 5, "stage": 4, "room": 8, "pointer": 3055911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 5, "x": 648, "y": 104, "name": "Iceberg 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 9", "level": 5, "stage": 4, "room": 9, "pointer": 3056457, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 9, "x": 136, "y": 136, "name": "Iceberg 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 4 - Miniboss 1 (Yuki)"], "music": 4}, {"name": "Iceberg 4 - 10", "level": 5, "stage": 4, "room": 10, "pointer": 3257516, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 8, "unkn2": 37, "x": 88, "y": 40, "name": "Iceberg 4 - 10 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 15, "unkn2": 37, "x": 200, "y": 40, "name": "Iceberg 4 - 10 Exit 1", "access_rule": []}], "entity_load": [[31, 19]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 11", "level": 5, "stage": 4, "room": 11, "pointer": 3083322, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon"], "default_exits": [{"room": 12, "unkn1": 46, "unkn2": 8, "x": 88, "y": 120, "name": "Iceberg 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[24, 16]], "locations": ["Iceberg 4 - Enemy 9 (Gabon)"], "music": 19}, {"name": "Iceberg 4 - 12", "level": 5, "stage": 4, "room": 12, "pointer": 3147724, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu"], "default_exits": [{"room": 18, "unkn1": 64, "unkn2": 7, "x": 72, "y": 456, "name": "Iceberg 4 - 12 Exit 0", "access_rule": []}], "entity_load": [[19, 16], [61, 16]], "locations": ["Iceberg 4 - Enemy 10 (Kabu)"], "music": 19}, {"name": "Iceberg 4 - 13", "level": 5, "stage": 4, "room": 13, "pointer": 3370077, "animal_pointers": [232, 240, 248], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 31, "unkn2": 4, "x": 216, "y": 120, "name": "Iceberg 4 - 13 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 46, "unkn2": 10, "x": 72, "y": 88, "name": "Iceberg 4 - 13 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 57, "unkn2": 10, "x": 312, "y": 88, "name": "Iceberg 4 - 13 Exit 2", "access_rule": []}, {"room": 14, "unkn1": 28, "unkn2": 21, "x": 152, "y": 136, "name": "Iceberg 4 - 13 Exit 3", "access_rule": []}, {"room": 14, "unkn1": 34, "unkn2": 21, "x": 280, "y": 136, "name": "Iceberg 4 - 13 Exit 4", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 1", "Iceberg 4 - Animal 2", "Iceberg 4 - Animal 3"], "music": 19}, {"name": "Iceberg 4 - 14", "level": 5, "stage": 4, "room": 14, "pointer": 3057002, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Broom Hatter", "Sasuke"], "default_exits": [{"room": 15, "unkn1": 4, "unkn2": 8, "x": 88, "y": 360, "name": "Iceberg 4 - 14 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 10, "unkn2": 8, "x": 440, "y": 344, "name": "Iceberg 4 - 14 Exit 1", "access_rule": []}, {"room": 13, "unkn1": 16, "unkn2": 8, "x": 568, "y": 344, "name": "Iceberg 4 - 14 Exit 2", "access_rule": []}, {"room": 15, "unkn1": 22, "unkn2": 8, "x": 344, "y": 360, "name": "Iceberg 4 - 14 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [30, 16]], "locations": ["Iceberg 4 - Enemy 11 (Broom Hatter)", "Iceberg 4 - Enemy 12 (Sasuke)"], "music": 19}, {"name": "Iceberg 4 - 15", "level": 5, "stage": 4, "room": 15, "pointer": 3116124, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 6, "x": 520, "y": 72, "name": "Iceberg 4 - 15 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 4, "unkn2": 22, "x": 88, "y": 136, "name": "Iceberg 4 - 15 Exit 1", "access_rule": []}, {"room": 14, "unkn1": 22, "unkn2": 22, "x": 344, "y": 136, "name": "Iceberg 4 - 15 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 16", "level": 5, "stage": 4, "room": 16, "pointer": 3069937, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 9, "x": 152, "y": 632, "name": "Iceberg 4 - 16 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 4"], "music": 38}, {"name": "Iceberg 4 - 17", "level": 5, "stage": 4, "room": 17, "pointer": 3072413, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 6, "unkn2": 9, "x": 280, "y": 632, "name": "Iceberg 4 - 17 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 5"], "music": 38}, {"name": "Iceberg 4 - 18", "level": 5, "stage": 4, "room": 18, "pointer": 3404593, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 19, "unkn1": 94, "unkn2": 12, "x": 72, "y": 152, "name": "Iceberg 4 - 18 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [43, 16], [30, 16], [15, 16]], "locations": ["Iceberg 4 - Enemy 13 (Nruff)", "Iceberg 4 - Star 3"], "music": 19}, {"name": "Iceberg 4 - 19", "level": 5, "stage": 4, "room": 19, "pointer": 3075826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 4 - 19 Exit 0", "access_rule": []}], "entity_load": [[31, 19], [42, 19]], "locations": ["Iceberg 4 - Name"], "music": 8}, {"name": "Iceberg 4 - 20", "level": 5, "stage": 4, "room": 20, "pointer": 2887943, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 4 - Complete"], "music": 5}, {"name": "Iceberg 5 - 0", "level": 5, "stage": 5, "room": 0, "pointer": 3316135, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 30, "unkn1": 75, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[79, 16], [76, 16], [81, 16], [78, 16], [77, 16], [82, 16], [80, 16], [83, 16]], "locations": ["Iceberg 5 - Enemy 1 (Bukiset (Burning))", "Iceberg 5 - Enemy 2 (Bukiset (Stone))", "Iceberg 5 - Enemy 3 (Bukiset (Ice))", "Iceberg 5 - Enemy 4 (Bukiset (Needle))", "Iceberg 5 - Enemy 5 (Bukiset (Clean))", "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", "Iceberg 5 - Enemy 7 (Bukiset (Spark))", "Iceberg 5 - Enemy 8 (Bukiset (Cutter))"], "music": 16}, {"name": "Iceberg 5 - 1", "level": 5, "stage": 5, "room": 1, "pointer": 3037607, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 72, "y": 104, "name": "Iceberg 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 2", "level": 5, "stage": 5, "room": 2, "pointer": 3103842, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk"], "default_exits": [{"room": 25, "unkn1": 27, "unkn2": 6, "x": 72, "y": 200, "name": "Iceberg 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[16, 16]], "locations": ["Iceberg 5 - Enemy 9 (Glunk)"], "music": 16}, {"name": "Iceberg 5 - 3", "level": 5, "stage": 5, "room": 3, "pointer": 3135899, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 4, "unkn1": 20, "unkn2": 7, "x": 72, "y": 88, "name": "Iceberg 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 10 (Wapod)", "Iceberg 5 - Star 1", "Iceberg 5 - Star 2"], "music": 16}, {"name": "Iceberg 5 - 4", "level": 5, "stage": 5, "room": 4, "pointer": 3180695, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 26, "unkn2": 5, "x": 56, "y": 104, "name": "Iceberg 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 11 (Tick)", "Iceberg 5 - Star 3", "Iceberg 5 - Star 4", "Iceberg 5 - Star 5", "Iceberg 5 - Star 6", "Iceberg 5 - Star 7", "Iceberg 5 - Star 8"], "music": 16}, {"name": "Iceberg 5 - 5", "level": 5, "stage": 5, "room": 5, "pointer": 3106064, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 24, "unkn1": 14, "unkn2": 6, "x": 168, "y": 152, "name": "Iceberg 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[58, 16], [14, 23], [4, 22]], "locations": ["Iceberg 5 - Enemy 12 (Madoo)", "Iceberg 5 - Star 9", "Iceberg 5 - Star 10", "Iceberg 5 - Star 11", "Iceberg 5 - Star 12", "Iceberg 5 - Star 13", "Iceberg 5 - Star 14"], "music": 16}, {"name": "Iceberg 5 - 6", "level": 5, "stage": 5, "room": 6, "pointer": 3276800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 59, "unkn2": 12, "x": 72, "y": 120, "name": "Iceberg 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[55, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 7", "level": 5, "stage": 5, "room": 7, "pointer": 3104585, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 25, "unkn2": 7, "x": 72, "y": 136, "name": "Iceberg 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 8", "level": 5, "stage": 5, "room": 8, "pointer": 3195121, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 35, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 8 Exit 0", "access_rule": []}], "entity_load": [[4, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 9", "level": 5, "stage": 5, "room": 9, "pointer": 3087198, "animal_pointers": [], "consumables": [{"idx": 16, "pointer": 200, "x": 256, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Boulder)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 28, "unkn1": 20, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [54, 16]], "locations": ["Iceberg 5 - 1-Up (Boulder)"], "music": 16}, {"name": "Iceberg 5 - 10", "level": 5, "stage": 5, "room": 10, "pointer": 3321612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 45, "unkn2": 15, "x": 72, "y": 120, "name": "Iceberg 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 11", "level": 5, "stage": 5, "room": 11, "pointer": 3139178, "animal_pointers": [], "consumables": [{"idx": 17, "pointer": 192, "x": 152, "y": 168, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Floor)"}], "consumables_pointer": 176, "enemies": ["Yaban"], "default_exits": [{"room": 12, "unkn1": 17, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 11 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [0, 22]], "locations": ["Iceberg 5 - Enemy 13 (Yaban)", "Iceberg 5 - 1-Up (Floor)"], "music": 16}, {"name": "Iceberg 5 - 12", "level": 5, "stage": 5, "room": 12, "pointer": 3118231, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 7, "x": 72, "y": 104, "name": "Iceberg 5 - 12 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 14 (Propeller)", "Iceberg 5 - Star 15", "Iceberg 5 - Star 16", "Iceberg 5 - Star 17", "Iceberg 5 - Star 18", "Iceberg 5 - Star 19", "Iceberg 5 - Star 20"], "music": 16}, {"name": "Iceberg 5 - 13", "level": 5, "stage": 5, "room": 13, "pointer": 3021658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 27, "unkn1": 16, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 13 Exit 0", "access_rule": []}], "entity_load": [[45, 16]], "locations": ["Iceberg 5 - Enemy 15 (Mariel)"], "music": 16}, {"name": "Iceberg 5 - 14", "level": 5, "stage": 5, "room": 14, "pointer": 3025398, "animal_pointers": [], "consumables": [{"idx": 24, "pointer": 200, "x": 208, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Peloo)"}], "consumables_pointer": 176, "enemies": [], "default_exits": [{"room": 15, "unkn1": 13, "unkn2": 9, "x": 72, "y": 216, "name": "Iceberg 5 - 14 Exit 0", "access_rule": []}], "entity_load": [[64, 16], [0, 22]], "locations": ["Iceberg 5 - 1-Up (Peloo)"], "music": 16}, {"name": "Iceberg 5 - 15", "level": 5, "stage": 5, "room": 15, "pointer": 3167445, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 13, "x": 72, "y": 152, "name": "Iceberg 5 - 15 Exit 0", "access_rule": []}], "entity_load": [[39, 16]], "locations": ["Iceberg 5 - Enemy 16 (Pteran)"], "music": 16}, {"name": "Iceberg 5 - 16", "level": 5, "stage": 5, "room": 16, "pointer": 3033990, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 33, "unkn1": 36, "unkn2": 9, "x": 168, "y": 152, "name": "Iceberg 5 - 16 Exit 0", "access_rule": []}], "entity_load": [[68, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 17", "level": 5, "stage": 5, "room": 17, "pointer": 3100111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 40, "unkn2": 7, "x": 72, "y": 200, "name": "Iceberg 5 - 17 Exit 0", "access_rule": []}], "entity_load": [[52, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 18", "level": 5, "stage": 5, "room": 18, "pointer": 3030947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 17, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 18 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": ["Iceberg 5 - Enemy 17 (Galbo)"], "music": 16}, {"name": "Iceberg 5 - 19", "level": 5, "stage": 5, "room": 19, "pointer": 3105326, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe"], "default_exits": [{"room": 21, "unkn1": 13, "unkn2": 4, "x": 72, "y": 152, "name": "Iceberg 5 - 19 Exit 0", "access_rule": []}], "entity_load": [[51, 16]], "locations": ["Iceberg 5 - Enemy 18 (KeKe)"], "music": 16}, {"name": "Iceberg 5 - 20", "level": 5, "stage": 5, "room": 20, "pointer": 3118928, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 19, "unkn1": 13, "unkn2": 6, "x": 72, "y": 264, "name": "Iceberg 5 - 20 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 5 - Enemy 19 (Nidoo)"], "music": 16}, {"name": "Iceberg 5 - 21", "level": 5, "stage": 5, "room": 21, "pointer": 3202517, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 22, "unkn1": 29, "unkn2": 9, "x": 72, "y": 72, "name": "Iceberg 5 - 21 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16]], "locations": ["Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", "Iceberg 5 - Enemy 22 (Bouncy Drawing)"], "music": 16}, {"name": "Iceberg 5 - 22", "level": 5, "stage": 5, "room": 22, "pointer": 3014656, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Joe"], "default_exits": [{"room": 23, "unkn1": 13, "unkn2": 4, "x": 72, "y": 104, "name": "Iceberg 5 - 22 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 23 (Joe)", "Iceberg 5 - Star 21", "Iceberg 5 - Star 22", "Iceberg 5 - Star 23", "Iceberg 5 - Star 24", "Iceberg 5 - Star 25"], "music": 16}, {"name": "Iceberg 5 - 23", "level": 5, "stage": 5, "room": 23, "pointer": 3166550, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 34, "unkn1": 27, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 23 Exit 0", "access_rule": []}], "entity_load": [[67, 16]], "locations": ["Iceberg 5 - Enemy 24 (Kapar)"], "music": 16}, {"name": "Iceberg 5 - 24", "level": 5, "stage": 5, "room": 24, "pointer": 3029110, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gansan"], "default_exits": [{"room": 31, "unkn1": 10, "unkn2": 4, "x": 72, "y": 88, "name": "Iceberg 5 - 24 Exit 0", "access_rule": []}], "entity_load": [[75, 16]], "locations": ["Iceberg 5 - Enemy 25 (Gansan)"], "music": 16}, {"name": "Iceberg 5 - 25", "level": 5, "stage": 5, "room": 25, "pointer": 3156420, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sasuke"], "default_exits": [{"room": 3, "unkn1": 25, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 25 Exit 0", "access_rule": []}], "entity_load": [[30, 16]], "locations": ["Iceberg 5 - Enemy 26 (Sasuke)"], "music": 16}, {"name": "Iceberg 5 - 26", "level": 5, "stage": 5, "room": 26, "pointer": 3127877, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo"], "default_exits": [{"room": 8, "unkn1": 24, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 5 - 26 Exit 0", "access_rule": []}], "entity_load": [[18, 16]], "locations": ["Iceberg 5 - Enemy 27 (Togezo)"], "music": 16}, {"name": "Iceberg 5 - 27", "level": 5, "stage": 5, "room": 27, "pointer": 3256471, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Bobin"], "default_exits": [{"room": 14, "unkn1": 26, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 27 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [73, 16]], "locations": ["Iceberg 5 - Enemy 28 (Sparky)", "Iceberg 5 - Enemy 29 (Bobin)"], "music": 16}, {"name": "Iceberg 5 - 28", "level": 5, "stage": 5, "room": 28, "pointer": 3029723, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly"], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 248, "name": "Iceberg 5 - 28 Exit 0", "access_rule": []}], "entity_load": [[6, 16]], "locations": ["Iceberg 5 - Enemy 30 (Chilly)"], "music": 16}, {"name": "Iceberg 5 - 29", "level": 5, "stage": 5, "room": 29, "pointer": 3526568, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 29 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [14, 23]], "locations": ["Iceberg 5 - Star 26", "Iceberg 5 - Star 27", "Iceberg 5 - Star 28", "Iceberg 5 - Star 29", "Iceberg 5 - Star 30", "Iceberg 5 - Star 31", "Iceberg 5 - Star 32"], "music": 16}, {"name": "Iceberg 5 - 30", "level": 5, "stage": 5, "room": 30, "pointer": 3022285, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 13, "unkn2": 5, "x": 88, "y": 104, "name": "Iceberg 5 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 1", "Iceberg 5 - Animal 2"], "music": 40}, {"name": "Iceberg 5 - 31", "level": 5, "stage": 5, "room": 31, "pointer": 3026019, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 72, "y": 200, "name": "Iceberg 5 - 31 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 3", "Iceberg 5 - Animal 4"], "music": 40}, {"name": "Iceberg 5 - 32", "level": 5, "stage": 5, "room": 32, "pointer": 3039996, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 32 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 5", "Iceberg 5 - Animal 6"], "music": 40}, {"name": "Iceberg 5 - 33", "level": 5, "stage": 5, "room": 33, "pointer": 3015302, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 33 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 7", "Iceberg 5 - Animal 8"], "music": 40}, {"name": "Iceberg 5 - 34", "level": 5, "stage": 5, "room": 34, "pointer": 3185868, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 35, "unkn1": 35, "unkn2": 9, "x": 200, "y": 328, "name": "Iceberg 5 - 34 Exit 0", "access_rule": []}], "entity_load": [[72, 16], [4, 22], [14, 23]], "locations": ["Iceberg 5 - Enemy 31 (Peran)", "Iceberg 5 - Star 33", "Iceberg 5 - Star 34"], "music": 16}, {"name": "Iceberg 5 - 35", "level": 5, "stage": 5, "room": 35, "pointer": 3865635, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 12, "unkn2": 7, "x": 168, "y": 1384, "name": "Iceberg 5 - 35 Exit 0", "access_rule": []}], "entity_load": [[17, 16], [4, 22]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 36", "level": 5, "stage": 5, "room": 36, "pointer": 3024154, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 37, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 5 - 36 Exit 0", "access_rule": []}], "entity_load": [[32, 19], [42, 19]], "locations": ["Iceberg 5 - Shiro"], "music": 8}, {"name": "Iceberg 5 - 37", "level": 5, "stage": 5, "room": 37, "pointer": 2890594, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 5 - Complete"], "music": 5}, {"name": "Iceberg 6 - 0", "level": 5, "stage": 6, "room": 0, "pointer": 3385305, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 28, "x": 136, "y": 184, "name": "Iceberg 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 12, "unkn2": 28, "x": 248, "y": 184, "name": "Iceberg 6 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 18, "unkn2": 28, "x": 360, "y": 184, "name": "Iceberg 6 - 0 Exit 2", "access_rule": []}], "entity_load": [[15, 16]], "locations": ["Iceberg 6 - Enemy 1 (Nruff)"], "music": 12}, {"name": "Iceberg 6 - 1", "level": 5, "stage": 6, "room": 1, "pointer": 3197599, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 1 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 1", "Iceberg 6 - Animal 2", "Iceberg 6 - Animal 3"], "music": 12}, {"name": "Iceberg 6 - 2", "level": 5, "stage": 6, "room": 2, "pointer": 3097113, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 2 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 3", "level": 5, "stage": 6, "room": 3, "pointer": 3198422, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 3 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 3 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 3 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 4", "Iceberg 6 - Animal 5", "Iceberg 6 - Animal 6"], "music": 12}, {"name": "Iceberg 6 - 4", "level": 5, "stage": 6, "room": 4, "pointer": 3210507, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 4 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 5", "level": 5, "stage": 6, "room": 5, "pointer": 3196776, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 212, "x": 136, "y": 120, "etype": 22, "vtype": 2, "name": "Iceberg 6 - Maxim Tomato (Left)"}, {"idx": 1, "pointer": 220, "x": 248, "y": 120, "etype": 22, "vtype": 0, "name": "Iceberg 6 - 1-Up (Middle)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 4, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 5 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 5 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 5 Exit 2", "access_rule": []}], "entity_load": [[2, 22], [0, 22], [14, 23]], "locations": ["Iceberg 6 - Star 1", "Iceberg 6 - Maxim Tomato (Left)", "Iceberg 6 - 1-Up (Middle)"], "music": 12}, {"name": "Iceberg 6 - 6", "level": 5, "stage": 6, "room": 6, "pointer": 3208130, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 7, "unkn1": 9, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 6 - Enemy 2 (Nidoo)"], "music": 12}, {"name": "Iceberg 6 - 7", "level": 5, "stage": 6, "room": 7, "pointer": 3124478, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky"], "default_exits": [{"room": 8, "unkn1": 17, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[8, 16]], "locations": ["Iceberg 6 - Enemy 3 (Sparky)"], "music": 12}, {"name": "Iceberg 6 - 8", "level": 5, "stage": 6, "room": 8, "pointer": 3110431, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 8 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 14, "unkn2": 5, "x": 296, "y": 136, "name": "Iceberg 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 9", "level": 5, "stage": 6, "room": 9, "pointer": 3139832, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[2, 27]], "locations": ["Iceberg 6 - Miniboss 1 (Blocky)"], "music": 12}, {"name": "Iceberg 6 - 10", "level": 5, "stage": 6, "room": 10, "pointer": 3119624, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 11", "level": 5, "stage": 6, "room": 11, "pointer": 3141139, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 12, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Iceberg 6 - Miniboss 2 (Jumper Shoot)"], "music": 12}, {"name": "Iceberg 6 - 12", "level": 5, "stage": 6, "room": 12, "pointer": 3123788, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 12 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 13", "level": 5, "stage": 6, "room": 13, "pointer": 3143741, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 6 - Miniboss 3 (Yuki)"], "music": 12}, {"name": "Iceberg 6 - 14", "level": 5, "stage": 6, "room": 14, "pointer": 3120319, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 14 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 15", "level": 5, "stage": 6, "room": 15, "pointer": 3135238, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 16, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[27, 16]], "locations": ["Iceberg 6 - Enemy 4 (Sir Kibble)"], "music": 12}, {"name": "Iceberg 6 - 16", "level": 5, "stage": 6, "room": 16, "pointer": 3123096, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 16 Exit 0", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 17", "level": 5, "stage": 6, "room": 17, "pointer": 3144389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 17 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Iceberg 6 - Miniboss 4 (Haboki)"], "music": 12}, {"name": "Iceberg 6 - 18", "level": 5, "stage": 6, "room": 18, "pointer": 3121014, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 19", "level": 5, "stage": 6, "room": 19, "pointer": 3017228, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 19 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Iceberg 6 - Miniboss 5 (Boboo)"], "music": 12}, {"name": "Iceberg 6 - 20", "level": 5, "stage": 6, "room": 20, "pointer": 3121709, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 21, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 21", "level": 5, "stage": 6, "room": 21, "pointer": 3145036, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 21 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Iceberg 6 - Miniboss 6 (Captain Stitch)"], "music": 12}, {"name": "Iceberg 6 - 22", "level": 5, "stage": 6, "room": 22, "pointer": 3116830, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 7, "unkn2": 5, "x": 136, "y": 152, "name": "Iceberg 6 - 22 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 23", "level": 5, "stage": 6, "room": 23, "pointer": 3045263, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 24, "unkn1": 17, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [42, 19]], "locations": ["Iceberg 6 - Angel"], "music": 8}, {"name": "Iceberg 6 - 24", "level": 5, "stage": 6, "room": 24, "pointer": 2889389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 6 - Complete"], "music": 5}, {"name": "Iceberg Boss - 0", "level": 5, "stage": 7, "room": 0, "pointer": 2980207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[8, 18]], "locations": ["Iceberg - Boss (Dedede) Purified", "Level 5 Boss - Defeated", "Level 5 Boss - Purified"], "music": 7}] \ No newline at end of file From 44800513638c2f1fd1685bf3fc4f7289397335fb Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 12 Feb 2024 02:08:29 -0600 Subject: [PATCH 154/165] Update setup_en.md --- worlds/kdl3/docs/setup_en.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/worlds/kdl3/docs/setup_en.md b/worlds/kdl3/docs/setup_en.md index dfd4c335f5e8..a13a0f1a74cf 100644 --- a/worlds/kdl3/docs/setup_en.md +++ b/worlds/kdl3/docs/setup_en.md @@ -2,7 +2,7 @@ ## Required Software -- [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases). Make sure to check the box for `SNI Client - Kirby's Dream Land 3 Patch Setup` +- [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases). - Hardware or software capable of loading and playing SNES ROM files - An emulator capable of connecting to SNI with ROM access. Any one of the following will work: - snes9x-emunwa from: [snes9x-emunwa Releases Page](https://github.com/Skarsnik/snes9x-emunwa/releases) @@ -16,9 +16,9 @@ ## Installation Procedures -1. Download and install SNIClient from the link above, making sure to install the most recent version. +1. Download and install Archipelago from the link above, making sure to install the most recent version. **The installer file is located in the assets section at the bottom of the version information**. - - During setup, you will be asked to locate your base ROM file. This is your Kirby's Dream Land 3 ROM file. + - During generation/patching, you will be asked to locate your base ROM file. This is your Kirby's Dream Land 3 ROM file. 2. If you are using an emulator, you should assign your SNI-compatible emulator as your default program for launching ROM files. @@ -102,9 +102,9 @@ the lua you are using in your file explorer and copy the `socket.dll` to the bas 5. Select the `Connector.lua` file you downloaded above - Look in the Archipelago folder for `/SNI/lua/Connector.lua` -##### bsnes-plus-nwa +##### bsnes-plus-nwa and snes9x-nwa -This should automatically connect to SNI. If this is its first time launching, you may be prompted to allow it to +These should automatically connect to SNI. If this is the first time launching, you may be prompted to allow it to communicate through the Windows Firewall. #### With hardware From 146a8813f913fb2f58d51e84d874e554f4dc8b50 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 15 Feb 2024 02:32:18 -0600 Subject: [PATCH 155/165] fix entrance rules not accounting for animal/ability access --- worlds/kdl3/data/Rooms.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/data/Rooms.json b/worlds/kdl3/data/Rooms.json index 4ebe8c86a2ae..47fe76534c30 100644 --- a/worlds/kdl3/data/Rooms.json +++ b/worlds/kdl3/data/Rooms.json @@ -1 +1 @@ -[{"name": "Grass Land 1 - 0", "level": 1, "stage": 1, "room": 0, "pointer": 3434257, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sir Kibble", "Cappy"], "default_exits": [{"room": 1, "unkn1": 205, "unkn2": 8, "x": 72, "y": 200, "name": "Grass Land 1 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 87, "unkn2": 9, "x": 104, "y": 152, "name": "Grass Land 1 - 0 Exit 1", "access_rule": []}], "entity_load": [[0, 16], [1, 23], [0, 23], [14, 23], [27, 16], [12, 16], [4, 22]], "locations": ["Grass Land 1 - Enemy 1 (Waddle Dee)", "Grass Land 1 - Enemy 2 (Sir Kibble)", "Grass Land 1 - Enemy 3 (Cappy)", "Grass Land 1 - Star 1", "Grass Land 1 - Star 2", "Grass Land 1 - Star 3", "Grass Land 1 - Star 4", "Grass Land 1 - Star 5", "Grass Land 1 - Star 6", "Grass Land 1 - Star 7", "Grass Land 1 - Star 8", "Grass Land 1 - Star 9", "Grass Land 1 - Star 10"], "music": 20}, {"name": "Grass Land 1 - 1", "level": 1, "stage": 1, "room": 1, "pointer": 3368373, "animal_pointers": [], "consumables": [{"idx": 14, "pointer": 264, "x": 928, "y": 160, "etype": 22, "vtype": 0, "name": "Grass Land 1 - 1-Up (Parasol)"}, {"idx": 15, "pointer": 312, "x": 1456, "y": 176, "etype": 22, "vtype": 2, "name": "Grass Land 1 - Maxim Tomato (Spark)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Bronto Burt", "Sasuke"], "default_exits": [{"room": 3, "unkn1": 143, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [30, 16], [12, 16], [14, 23], [8, 16], [0, 22], [2, 22]], "locations": ["Grass Land 1 - Enemy 4 (Sparky)", "Grass Land 1 - Enemy 5 (Bronto Burt)", "Grass Land 1 - Enemy 6 (Sasuke)", "Grass Land 1 - Star 11", "Grass Land 1 - Star 12", "Grass Land 1 - Star 13", "Grass Land 1 - Star 14", "Grass Land 1 - Star 15", "Grass Land 1 - 1-Up (Parasol)", "Grass Land 1 - Maxim Tomato (Spark)"], "music": 20}, {"name": "Grass Land 1 - 2", "level": 1, "stage": 1, "room": 2, "pointer": 2960650, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 1416, "y": 152, "name": "Grass Land 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 1 - Animal 1", "Grass Land 1 - Animal 2"], "music": 38}, {"name": "Grass Land 1 - 3", "level": 1, "stage": 1, "room": 3, "pointer": 3478442, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 179, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [7, 16], [0, 23], [6, 22], [14, 23], [8, 16], [1, 23]], "locations": ["Grass Land 1 - Enemy 7 (Poppy Bros Jr.)", "Grass Land 1 - Star 16", "Grass Land 1 - Star 17", "Grass Land 1 - Star 18", "Grass Land 1 - Star 19", "Grass Land 1 - Star 20", "Grass Land 1 - Star 21", "Grass Land 1 - Star 22", "Grass Land 1 - Star 23"], "music": 20}, {"name": "Grass Land 1 - 4", "level": 1, "stage": 1, "room": 4, "pointer": 2978390, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [42, 19]], "locations": ["Grass Land 1 - Tulip"], "music": 8}, {"name": "Grass Land 1 - 5", "level": 1, "stage": 1, "room": 5, "pointer": 2890835, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 1 - Complete"], "music": 5}, {"name": "Grass Land 2 - 0", "level": 1, "stage": 2, "room": 0, "pointer": 3293347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "KeKe", "Bobo", "Poppy Bros Jr."], "default_exits": [{"room": 1, "unkn1": 112, "unkn2": 9, "x": 72, "y": 152, "name": "Grass Land 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [7, 16], [5, 16], [4, 22], [51, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 1 (Rocky)", "Grass Land 2 - Enemy 2 (KeKe)", "Grass Land 2 - Enemy 3 (Bobo)", "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)", "Grass Land 2 - Star 1", "Grass Land 2 - Star 2", "Grass Land 2 - Star 3", "Grass Land 2 - Star 4", "Grass Land 2 - Star 5", "Grass Land 2 - Star 6", "Grass Land 2 - Star 7", "Grass Land 2 - Star 8", "Grass Land 2 - Star 9", "Grass Land 2 - Star 10"], "music": 11}, {"name": "Grass Land 2 - 1", "level": 1, "stage": 2, "room": 1, "pointer": 3059685, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 9, "x": 56, "y": 136, "name": "Grass Land 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 2 - Animal 1", "Grass Land 2 - Animal 2"], "music": 39}, {"name": "Grass Land 2 - 2", "level": 1, "stage": 2, "room": 2, "pointer": 3432109, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Popon Ball", "Bouncy"], "default_exits": [{"room": 4, "unkn1": 133, "unkn2": 11, "x": 72, "y": 200, "name": "Grass Land 2 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 52, "unkn2": 12, "x": 56, "y": 152, "name": "Grass Land 2 - 2 Exit 1", "access_rule": []}], "entity_load": [[13, 16], [50, 16], [4, 22], [3, 16], [0, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 5 (Waddle Dee)", "Grass Land 2 - Enemy 6 (Popon Ball)", "Grass Land 2 - Enemy 7 (Bouncy)", "Grass Land 2 - Star 11", "Grass Land 2 - Star 12", "Grass Land 2 - Star 13"], "music": 11}, {"name": "Grass Land 2 - 3", "level": 1, "stage": 2, "room": 3, "pointer": 2970029, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 2, "unkn2": 9, "x": 840, "y": 168, "name": "Grass Land 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 19]], "locations": [], "music": 11}, {"name": "Grass Land 2 - 4", "level": 1, "stage": 2, "room": 4, "pointer": 3578022, "animal_pointers": [], "consumables": [{"idx": 20, "pointer": 272, "x": 992, "y": 192, "etype": 22, "vtype": 0, "name": "Grass Land 2 - 1-Up (Needle)"}], "consumables_pointer": 352, "enemies": ["Tick", "Bronto Burt", "Nruff"], "default_exits": [{"room": 5, "unkn1": 154, "unkn2": 12, "x": 72, "y": 152, "name": "Grass Land 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [5, 16], [2, 16], [48, 16], [14, 23], [0, 22]], "locations": ["Grass Land 2 - Enemy 8 (Tick)", "Grass Land 2 - Enemy 9 (Bronto Burt)", "Grass Land 2 - Enemy 10 (Nruff)", "Grass Land 2 - Star 14", "Grass Land 2 - Star 15", "Grass Land 2 - Star 16", "Grass Land 2 - Star 17", "Grass Land 2 - Star 18", "Grass Land 2 - Star 19", "Grass Land 2 - Star 20", "Grass Land 2 - Star 21", "Grass Land 2 - 1-Up (Needle)"], "music": 11}, {"name": "Grass Land 2 - 5", "level": 1, "stage": 2, "room": 5, "pointer": 2966057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 19], [42, 19]], "locations": ["Grass Land 2 - Muchimuchi"], "music": 8}, {"name": "Grass Land 2 - 6", "level": 1, "stage": 2, "room": 6, "pointer": 2887461, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 2 - Complete"], "music": 5}, {"name": "Grass Land 3 - 0", "level": 1, "stage": 3, "room": 0, "pointer": 3149707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Rocky", "Nruff"], "default_exits": [{"room": 1, "unkn1": 107, "unkn2": 7, "x": 72, "y": 840, "name": "Grass Land 3 - 0 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 46, "unkn2": 9, "x": 152, "y": 152, "name": "Grass Land 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [14, 23], [15, 16], [0, 16], [8, 16]], "locations": ["Grass Land 3 - Enemy 1 (Sparky)", "Grass Land 3 - Enemy 2 (Rocky)", "Grass Land 3 - Enemy 3 (Nruff)", "Grass Land 3 - Star 1", "Grass Land 3 - Star 2", "Grass Land 3 - Star 3", "Grass Land 3 - Star 4", "Grass Land 3 - Star 5", "Grass Land 3 - Star 6", "Grass Land 3 - Star 7", "Grass Land 3 - Star 8", "Grass Land 3 - Star 9", "Grass Land 3 - Star 10"], "music": 19}, {"name": "Grass Land 3 - 1", "level": 1, "stage": 3, "room": 1, "pointer": 3204939, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 360, "x": 208, "y": 344, "etype": 22, "vtype": 0, "name": "Grass Land 3 - 1-Up (Climb)"}, {"idx": 11, "pointer": 376, "x": 224, "y": 568, "etype": 22, "vtype": 2, "name": "Grass Land 3 - Maxim Tomato (Climb)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [6, 23], [2, 22], [5, 23], [14, 23], [1, 23], [0, 23], [31, 16]], "locations": ["Grass Land 3 - Star 11", "Grass Land 3 - Star 12", "Grass Land 3 - Star 13", "Grass Land 3 - Star 14", "Grass Land 3 - Star 15", "Grass Land 3 - Star 16", "Grass Land 3 - 1-Up (Climb)", "Grass Land 3 - Maxim Tomato (Climb)"], "music": 19}, {"name": "Grass Land 3 - 2", "level": 1, "stage": 3, "room": 2, "pointer": 3200066, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 55, "x": 56, "y": 152, "name": "Grass Land 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [14, 23]], "locations": ["Grass Land 3 - Star 17", "Grass Land 3 - Star 18", "Grass Land 3 - Star 19", "Grass Land 3 - Star 20", "Grass Land 3 - Star 21", "Grass Land 3 - Star 22", "Grass Land 3 - Star 23", "Grass Land 3 - Star 24", "Grass Land 3 - Star 25", "Grass Land 3 - Star 26"], "music": 19}, {"name": "Grass Land 3 - 3", "level": 1, "stage": 3, "room": 3, "pointer": 2959784, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 15, "unkn2": 9, "x": 56, "y": 120, "name": "Grass Land 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 31}, {"name": "Grass Land 3 - 4", "level": 1, "stage": 3, "room": 4, "pointer": 2979121, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 8, "unkn2": 9, "x": 760, "y": 152, "name": "Grass Land 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 3 - Animal 1", "Grass Land 3 - Animal 2"], "music": 40}, {"name": "Grass Land 3 - 5", "level": 1, "stage": 3, "room": 5, "pointer": 2997811, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 8}, {"name": "Grass Land 3 - 6", "level": 1, "stage": 3, "room": 6, "pointer": 3084876, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bouncy"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [14, 16], [1, 23], [59, 16], [14, 23]], "locations": ["Grass Land 3 - Pitcherman", "Grass Land 3 - Enemy 4 (Bouncy)", "Grass Land 3 - Star 27", "Grass Land 3 - Star 28", "Grass Land 3 - Star 29", "Grass Land 3 - Star 30", "Grass Land 3 - Star 31"], "music": 19}, {"name": "Grass Land 3 - 7", "level": 1, "stage": 3, "room": 7, "pointer": 2891317, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 3 - Complete"], "music": 5}, {"name": "Grass Land 4 - 0", "level": 1, "stage": 4, "room": 0, "pointer": 3471284, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Babut", "Rocky"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 13, "x": 72, "y": 136, "name": "Grass Land 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [14, 23], [40, 16], [61, 16], [4, 22]], "locations": ["Grass Land 4 - Enemy 1 (Loud)", "Grass Land 4 - Enemy 2 (Babut)", "Grass Land 4 - Enemy 3 (Rocky)", "Grass Land 4 - Star 1", "Grass Land 4 - Star 2", "Grass Land 4 - Star 3", "Grass Land 4 - Star 4", "Grass Land 4 - Star 5", "Grass Land 4 - Star 6", "Grass Land 4 - Star 7", "Grass Land 4 - Star 8", "Grass Land 4 - Star 9"], "music": 10}, {"name": "Grass Land 4 - 1", "level": 1, "stage": 4, "room": 1, "pointer": 3436401, "animal_pointers": [], "consumables": [{"idx": 12, "pointer": 290, "x": 1008, "y": 144, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Zebon Right)"}], "consumables_pointer": 368, "enemies": ["Kapar"], "default_exits": [{"room": 5, "unkn1": 58, "unkn2": 5, "x": 184, "y": 312, "name": "Grass Land 4 - 1 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 42, "unkn2": 18, "x": 168, "y": 88, "name": "Grass Land 4 - 1 Exit 1", "access_rule": []}], "entity_load": [[43, 16], [10, 23], [6, 22], [14, 23], [2, 22], [67, 16]], "locations": ["Grass Land 4 - Enemy 4 (Kapar)", "Grass Land 4 - Star 10", "Grass Land 4 - Maxim Tomato (Zebon Right)"], "music": 10}, {"name": "Grass Land 4 - 2", "level": 1, "stage": 4, "room": 2, "pointer": 3039401, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 4, "x": 56, "y": 72, "name": "Grass Land 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": [], "music": 9}, {"name": "Grass Land 4 - 3", "level": 1, "stage": 4, "room": 3, "pointer": 3722714, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 280, "x": 856, "y": 224, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Gordo)"}, {"idx": 22, "pointer": 480, "x": 1352, "y": 112, "etype": 22, "vtype": 0, "name": "Grass Land 4 - 1-Up (Gordo)"}], "consumables_pointer": 288, "enemies": ["Glunk", "Oro"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 5, "x": 72, "y": 200, "name": "Grass Land 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [55, 16], [16, 16], [25, 16], [14, 23], [0, 22], [2, 22], [4, 22]], "locations": ["Grass Land 4 - Enemy 5 (Glunk)", "Grass Land 4 - Enemy 6 (Oro)", "Grass Land 4 - Star 11", "Grass Land 4 - Star 12", "Grass Land 4 - Star 13", "Grass Land 4 - Star 14", "Grass Land 4 - Star 15", "Grass Land 4 - Star 16", "Grass Land 4 - Star 17", "Grass Land 4 - Star 18", "Grass Land 4 - Star 19", "Grass Land 4 - Star 20", "Grass Land 4 - Star 21", "Grass Land 4 - Star 22", "Grass Land 4 - Star 23", "Grass Land 4 - Star 24", "Grass Land 4 - Star 25", "Grass Land 4 - Star 26", "Grass Land 4 - Maxim Tomato (Gordo)", "Grass Land 4 - 1-Up (Gordo)"], "music": 10}, {"name": "Grass Land 4 - 4", "level": 1, "stage": 4, "room": 4, "pointer": 3304980, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 208, "x": 488, "y": 64, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Cliff)"}], "consumables_pointer": 160, "enemies": [], "default_exits": [{"room": 8, "unkn1": 94, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [2, 22], [54, 16], [1, 16], [40, 16], [14, 23]], "locations": ["Grass Land 4 - Star 27", "Grass Land 4 - Maxim Tomato (Cliff)"], "music": 10}, {"name": "Grass Land 4 - 5", "level": 1, "stage": 4, "room": 5, "pointer": 3498127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 2, "unkn1": 61, "unkn2": 13, "x": 56, "y": 72, "name": "Grass Land 4 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 61, "unkn2": 18, "x": 56, "y": 200, "name": "Grass Land 4 - 5 Exit 1", "access_rule": []}], "entity_load": [[72, 16], [43, 16], [4, 22], [14, 23], [10, 23], [3, 16]], "locations": ["Grass Land 4 - Enemy 7 (Peran)", "Grass Land 4 - Star 28", "Grass Land 4 - Star 29", "Grass Land 4 - Star 30", "Grass Land 4 - Star 31", "Grass Land 4 - Star 32", "Grass Land 4 - Star 33", "Grass Land 4 - Star 34", "Grass Land 4 - Star 35", "Grass Land 4 - Star 36", "Grass Land 4 - Star 37"], "music": 10}, {"name": "Grass Land 4 - 6", "level": 1, "stage": 4, "room": 6, "pointer": 3160191, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 28, "unkn2": 4, "x": 72, "y": 376, "name": "Grass Land 4 - 6 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 28, "unkn2": 12, "x": 72, "y": 440, "name": "Grass Land 4 - 6 Exit 1", "access_rule": []}], "entity_load": [[3, 19], [6, 23]], "locations": [], "music": 10}, {"name": "Grass Land 4 - 7", "level": 1, "stage": 4, "room": 7, "pointer": 3035801, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 12, "x": 56, "y": 200, "name": "Grass Land 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Grass Land 4 - Miniboss 1 (Boboo)"], "music": 4}, {"name": "Grass Land 4 - 8", "level": 1, "stage": 4, "room": 8, "pointer": 2989794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[3, 19], [42, 19]], "locations": ["Grass Land 4 - Chao & Goku"], "music": 8}, {"name": "Grass Land 4 - 9", "level": 1, "stage": 4, "room": 9, "pointer": 3043518, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 9, "unkn2": 5, "x": 696, "y": 296, "name": "Grass Land 4 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 4 - Animal 1", "Grass Land 4 - Animal 2"], "music": 38}, {"name": "Grass Land 4 - 10", "level": 1, "stage": 4, "room": 10, "pointer": 2888425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 4 - Complete"], "music": 5}, {"name": "Grass Land 5 - 0", "level": 1, "stage": 5, "room": 0, "pointer": 3303565, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 1, "unkn1": 120, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [4, 22], [14, 23], [6, 23], [11, 16], [89, 16]], "locations": ["Grass Land 5 - Enemy 1 (Propeller)", "Grass Land 5 - Enemy 2 (Broom Hatter)", "Grass Land 5 - Enemy 3 (Bouncy)", "Grass Land 5 - Star 1", "Grass Land 5 - Star 2", "Grass Land 5 - Star 3", "Grass Land 5 - Star 4", "Grass Land 5 - Star 5", "Grass Land 5 - Star 6", "Grass Land 5 - Star 7", "Grass Land 5 - Star 8"], "music": 11}, {"name": "Grass Land 5 - 1", "level": 1, "stage": 5, "room": 1, "pointer": 3048718, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 3, "unkn1": 18, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 21, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 36, "unkn2": 9, "x": 56, "y": 88, "name": "Grass Land 5 - 1 Exit 2", "access_rule": []}], "entity_load": [[27, 16], [14, 23]], "locations": ["Grass Land 5 - Enemy 4 (Sir Kibble)", "Grass Land 5 - Star 9", "Grass Land 5 - Star 10"], "music": 11}, {"name": "Grass Land 5 - 2", "level": 1, "stage": 5, "room": 2, "pointer": 3327019, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sasuke", "Nruff"], "default_exits": [{"room": 7, "unkn1": 121, "unkn2": 6, "x": 56, "y": 72, "name": "Grass Land 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [4, 22], [30, 16], [15, 16], [1, 16]], "locations": ["Grass Land 5 - Enemy 5 (Waddle Dee)", "Grass Land 5 - Enemy 6 (Sasuke)", "Grass Land 5 - Enemy 7 (Nruff)", "Grass Land 5 - Star 11", "Grass Land 5 - Star 12", "Grass Land 5 - Star 13", "Grass Land 5 - Star 14", "Grass Land 5 - Star 15", "Grass Land 5 - Star 16"], "music": 11}, {"name": "Grass Land 5 - 3", "level": 1, "stage": 5, "room": 3, "pointer": 2966459, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 312, "y": 72, "name": "Grass Land 5 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 1", "Grass Land 5 - Animal 2"], "music": 38}, {"name": "Grass Land 5 - 4", "level": 1, "stage": 5, "room": 4, "pointer": 2973509, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 360, "y": 72, "name": "Grass Land 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 3", "Grass Land 5 - Animal 4"], "music": 38}, {"name": "Grass Land 5 - 5", "level": 1, "stage": 5, "room": 5, "pointer": 2962351, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[4, 19], [42, 19]], "locations": ["Grass Land 5 - Mine"], "music": 8}, {"name": "Grass Land 5 - 6", "level": 1, "stage": 5, "room": 6, "pointer": 2886738, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 5 - Complete"], "music": 5}, {"name": "Grass Land 5 - 7", "level": 1, "stage": 5, "room": 7, "pointer": 3255423, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [4, 22], [14, 23]], "locations": ["Grass Land 5 - Enemy 8 (Tick)", "Grass Land 5 - Star 17", "Grass Land 5 - Star 18", "Grass Land 5 - Star 19", "Grass Land 5 - Star 20", "Grass Land 5 - Star 21", "Grass Land 5 - Star 22", "Grass Land 5 - Star 23", "Grass Land 5 - Star 24", "Grass Land 5 - Star 25", "Grass Land 5 - Star 26", "Grass Land 5 - Star 27", "Grass Land 5 - Star 28", "Grass Land 5 - Star 29"], "music": 11}, {"name": "Grass Land 6 - 0", "level": 1, "stage": 6, "room": 0, "pointer": 3376872, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Togezo", "Bronto Burt", "Cappy"], "default_exits": [{"room": 6, "unkn1": 51, "unkn2": 9, "x": 216, "y": 152, "name": "Grass Land 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 96, "unkn2": 9, "x": 216, "y": 1144, "name": "Grass Land 6 - 0 Exit 1", "access_rule": []}], "entity_load": [[12, 16], [18, 16], [2, 16], [41, 16], [4, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 1 (Como)", "Grass Land 6 - Enemy 2 (Togezo)", "Grass Land 6 - Enemy 3 (Bronto Burt)", "Grass Land 6 - Enemy 4 (Cappy)", "Grass Land 6 - Star 1", "Grass Land 6 - Star 2", "Grass Land 6 - Star 3", "Grass Land 6 - Star 4", "Grass Land 6 - Star 5", "Grass Land 6 - Star 6", "Grass Land 6 - Star 7", "Grass Land 6 - Star 8", "Grass Land 6 - Star 9"], "music": 20}, {"name": "Grass Land 6 - 1", "level": 1, "stage": 6, "room": 1, "pointer": 3395125, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 192, "x": 104, "y": 1144, "etype": 22, "vtype": 0, "name": "Grass Land 6 - 1-Up (Tower)"}], "consumables_pointer": 256, "enemies": ["Bobo", "Mariel"], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 5, "x": 72, "y": 88, "name": "Grass Land 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [5, 19], [45, 16], [0, 22], [4, 22], [14, 23], [55, 16]], "locations": ["Grass Land 6 - Enemy 5 (Bobo)", "Grass Land 6 - Enemy 6 (Mariel)", "Grass Land 6 - Star 10", "Grass Land 6 - Star 11", "Grass Land 6 - Star 12", "Grass Land 6 - Star 13", "Grass Land 6 - Star 14", "Grass Land 6 - 1-Up (Tower)"], "music": 20}, {"name": "Grass Land 6 - 2", "level": 1, "stage": 6, "room": 2, "pointer": 3375177, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter"], "default_exits": [{"room": 3, "unkn1": 93, "unkn2": 6, "x": 200, "y": 152, "name": "Grass Land 6 - 2 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 49, "unkn2": 7, "x": 216, "y": 104, "name": "Grass Land 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[11, 16], [45, 16], [41, 16], [4, 22], [32, 16], [14, 23]], "locations": ["Grass Land 6 - Enemy 7 (Yaban)", "Grass Land 6 - Enemy 8 (Broom Hatter)", "Grass Land 6 - Star 15", "Grass Land 6 - Star 16"], "music": 20}, {"name": "Grass Land 6 - 3", "level": 1, "stage": 6, "room": 3, "pointer": 3322977, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Apolo", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 52, "x": 72, "y": 104, "name": "Grass Land 6 - 3 Exit 0", "access_rule": []}], "entity_load": [[41, 16], [49, 16], [30, 16], [14, 23], [4, 22]], "locations": ["Grass Land 6 - Enemy 9 (Apolo)", "Grass Land 6 - Enemy 10 (Sasuke)", "Grass Land 6 - Star 17", "Grass Land 6 - Star 18", "Grass Land 6 - Star 19", "Grass Land 6 - Star 20", "Grass Land 6 - Star 21", "Grass Land 6 - Star 22", "Grass Land 6 - Star 23", "Grass Land 6 - Star 24", "Grass Land 6 - Star 25"], "music": 20}, {"name": "Grass Land 6 - 4", "level": 1, "stage": 6, "room": 4, "pointer": 3490819, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 192, "x": 40, "y": 104, "etype": 22, "vtype": 1, "name": "Grass Land 6 - 1-Up (Falling)"}], "consumables_pointer": 176, "enemies": ["Rocky"], "default_exits": [{"room": 5, "unkn1": 145, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [4, 22], [49, 16], [61, 16], [3, 16], [1, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 11 (Rocky)", "Grass Land 6 - Star 26", "Grass Land 6 - Star 27", "Grass Land 6 - Star 28", "Grass Land 6 - Star 29", "Grass Land 6 - 1-Up (Falling)"], "music": 20}, {"name": "Grass Land 6 - 5", "level": 1, "stage": 6, "room": 5, "pointer": 3076769, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 19], [42, 19]], "locations": ["Grass Land 6 - Pierre"], "music": 8}, {"name": "Grass Land 6 - 6", "level": 1, "stage": 6, "room": 6, "pointer": 3047576, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 9, "x": 840, "y": 152, "name": "Grass Land 6 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 1", "Grass Land 6 - Animal 2"], "music": 39}, {"name": "Grass Land 6 - 7", "level": 1, "stage": 6, "room": 7, "pointer": 3022909, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 808, "y": 120, "name": "Grass Land 6 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 3", "Grass Land 6 - Animal 4"], "music": 38}, {"name": "Grass Land 6 - 8", "level": 1, "stage": 6, "room": 8, "pointer": 2884569, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 6 - Complete"], "music": 5}, {"name": "Grass Land Boss - 0", "level": 1, "stage": 7, "room": 0, "pointer": 2984105, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[0, 18]], "locations": ["Grass Land - Boss (Whispy Woods) Purified", "Level 1 Boss - Defeated", "Level 1 Boss - Purified"], "music": 2}, {"name": "Ripple Field 1 - 0", "level": 2, "stage": 1, "room": 0, "pointer": 3279855, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Glunk", "Broom Hatter", "Cappy"], "default_exits": [{"room": 2, "unkn1": 102, "unkn2": 8, "x": 56, "y": 152, "name": "Ripple Field 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[16, 16], [0, 16], [12, 16], [11, 16], [14, 23]], "locations": ["Ripple Field 1 - Enemy 1 (Waddle Dee)", "Ripple Field 1 - Enemy 2 (Glunk)", "Ripple Field 1 - Enemy 3 (Broom Hatter)", "Ripple Field 1 - Enemy 4 (Cappy)", "Ripple Field 1 - Star 1", "Ripple Field 1 - Star 2", "Ripple Field 1 - Star 3", "Ripple Field 1 - Star 4", "Ripple Field 1 - Star 5", "Ripple Field 1 - Star 6"], "music": 15}, {"name": "Ripple Field 1 - 1", "level": 2, "stage": 1, "room": 1, "pointer": 3588688, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 11, "x": 40, "y": 232, "name": "Ripple Field 1 - 1 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 108, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 138, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [2, 16], [3, 16], [7, 16]], "locations": ["Ripple Field 1 - Enemy 5 (Bronto Burt)", "Ripple Field 1 - Enemy 6 (Rocky)", "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 1 - 2", "level": 2, "stage": 1, "room": 2, "pointer": 2955848, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 18, "unkn2": 9, "x": 56, "y": 168, "name": "Ripple Field 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 1 - Animal 1", "Ripple Field 1 - Animal 2"], "music": 40}, {"name": "Ripple Field 1 - 3", "level": 2, "stage": 1, "room": 3, "pointer": 3558828, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin"], "default_exits": [{"room": 4, "unkn1": 171, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[73, 16], [6, 22], [14, 23], [4, 22], [0, 16], [10, 23]], "locations": ["Ripple Field 1 - Enemy 8 (Bobin)", "Ripple Field 1 - Star 7", "Ripple Field 1 - Star 8", "Ripple Field 1 - Star 9", "Ripple Field 1 - Star 10", "Ripple Field 1 - Star 11", "Ripple Field 1 - Star 12", "Ripple Field 1 - Star 13", "Ripple Field 1 - Star 14", "Ripple Field 1 - Star 15", "Ripple Field 1 - Star 16"], "music": 15}, {"name": "Ripple Field 1 - 4", "level": 2, "stage": 1, "room": 4, "pointer": 2974271, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [42, 19]], "locations": ["Ripple Field 1 - Kamuribana"], "music": 8}, {"name": "Ripple Field 1 - 5", "level": 2, "stage": 1, "room": 5, "pointer": 3051513, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 264, "name": "Ripple Field 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": ["Ripple Field 1 - Star 17", "Ripple Field 1 - Star 18"], "music": 15}, {"name": "Ripple Field 1 - 6", "level": 2, "stage": 1, "room": 6, "pointer": 3049838, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1752, "y": 264, "name": "Ripple Field 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": ["Ripple Field 1 - Star 19"], "music": 15}, {"name": "Ripple Field 1 - 7", "level": 2, "stage": 1, "room": 7, "pointer": 3066407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 2232, "y": 264, "name": "Ripple Field 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[7, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 8", "level": 2, "stage": 1, "room": 8, "pointer": 2889148, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 1 - Complete"], "music": 5}, {"name": "Ripple Field 2 - 0", "level": 2, "stage": 2, "room": 0, "pointer": 3342336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Coconut", "Blipper", "Sasuke"], "default_exits": [{"room": 1, "unkn1": 103, "unkn2": 15, "x": 56, "y": 104, "name": "Ripple Field 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[5, 22], [34, 16], [30, 16], [21, 16], [14, 23], [4, 22], [18, 16]], "locations": ["Ripple Field 2 - Enemy 1 (Togezo)", "Ripple Field 2 - Enemy 2 (Coconut)", "Ripple Field 2 - Enemy 3 (Blipper)", "Ripple Field 2 - Enemy 4 (Sasuke)", "Ripple Field 2 - Star 1", "Ripple Field 2 - Star 2", "Ripple Field 2 - Star 3", "Ripple Field 2 - Star 4"], "music": 10}, {"name": "Ripple Field 2 - 1", "level": 2, "stage": 2, "room": 1, "pointer": 3084099, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 23, "unkn2": 8, "x": 72, "y": 248, "name": "Ripple Field 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 1", "Ripple Field 2 - Animal 2"], "music": 39}, {"name": "Ripple Field 2 - 2", "level": 2, "stage": 2, "room": 2, "pointer": 3451207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 4, "unkn1": 31, "unkn2": 5, "x": 72, "y": 152, "name": "Ripple Field 2 - 2 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 96, "unkn2": 6, "x": 56, "y": 152, "name": "Ripple Field 2 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 56, "unkn2": 17, "x": 136, "y": 264, "name": "Ripple Field 2 - 2 Exit 2", "access_rule": []}], "entity_load": [[29, 16], [47, 16], [1, 16], [46, 16], [14, 23]], "locations": ["Ripple Field 2 - Enemy 5 (Kany)", "Ripple Field 2 - Star 5", "Ripple Field 2 - Star 6", "Ripple Field 2 - Star 7", "Ripple Field 2 - Star 8"], "music": 10}, {"name": "Ripple Field 2 - 3", "level": 2, "stage": 2, "room": 3, "pointer": 3674327, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 480, "x": 1384, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 2 - Maxim Tomato (Currents)"}, {"idx": 10, "pointer": 520, "x": 1456, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 2 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Glunk"], "default_exits": [{"room": 2, "unkn1": 134, "unkn2": 5, "x": 40, "y": 136, "name": "Ripple Field 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [14, 23], [16, 16], [21, 16], [4, 22]], "locations": ["Ripple Field 2 - Enemy 6 (Glunk)", "Ripple Field 2 - Star 9", "Ripple Field 2 - Star 10", "Ripple Field 2 - Star 11", "Ripple Field 2 - Star 12", "Ripple Field 2 - Star 13", "Ripple Field 2 - Star 14", "Ripple Field 2 - Star 15", "Ripple Field 2 - Star 16", "Ripple Field 2 - Star 17", "Ripple Field 2 - Maxim Tomato (Currents)", "Ripple Field 2 - 1-Up (Currents)"], "music": 10}, {"name": "Ripple Field 2 - 4", "level": 2, "stage": 2, "room": 4, "pointer": 2972744, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 3, "unkn2": 9, "x": 520, "y": 88, "name": "Ripple Field 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[8, 19]], "locations": [], "music": 10}, {"name": "Ripple Field 2 - 5", "level": 2, "stage": 2, "room": 5, "pointer": 3109710, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 16, "x": 1048, "y": 280, "name": "Ripple Field 2 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 3", "Ripple Field 2 - Animal 4"], "music": 38}, {"name": "Ripple Field 2 - 6", "level": 2, "stage": 2, "room": 6, "pointer": 2973127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[8, 19], [42, 19]], "locations": ["Ripple Field 2 - Bakasa"], "music": 8}, {"name": "Ripple Field 2 - 7", "level": 2, "stage": 2, "room": 7, "pointer": 2890353, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 2 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 0", "level": 2, "stage": 3, "room": 0, "pointer": 3517254, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 105, "unkn2": 8, "x": 40, "y": 104, "name": "Ripple Field 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[21, 16], [57, 16], [62, 16], [67, 16], [4, 22], [14, 23]], "locations": ["Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", "Ripple Field 3 - Enemy 2 (Kapar)", "Ripple Field 3 - Enemy 3 (Blipper)", "Ripple Field 3 - Star 1", "Ripple Field 3 - Star 2", "Ripple Field 3 - Star 3", "Ripple Field 3 - Star 4"], "music": 18}, {"name": "Ripple Field 3 - 1", "level": 2, "stage": 3, "room": 1, "pointer": 3604480, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 320, "x": 832, "y": 152, "etype": 22, "vtype": 2, "name": "Ripple Field 3 - Maxim Tomato (Cove)"}, {"idx": 13, "pointer": 424, "x": 1128, "y": 384, "etype": 22, "vtype": 0, "name": "Ripple Field 3 - 1-Up (Cutter/Spark)"}], "consumables_pointer": 160, "enemies": ["Sparky", "Glunk", "Joe"], "default_exits": [{"room": 7, "unkn1": 80, "unkn2": 24, "x": 104, "y": 328, "name": "Ripple Field 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[13, 23], [14, 23], [91, 16], [16, 16], [2, 22], [8, 16], [0, 22]], "locations": ["Ripple Field 3 - Enemy 4 (Sparky)", "Ripple Field 3 - Enemy 5 (Glunk)", "Ripple Field 3 - Enemy 6 (Joe)", "Ripple Field 3 - Star 5", "Ripple Field 3 - Star 6", "Ripple Field 3 - Star 7", "Ripple Field 3 - Star 8", "Ripple Field 3 - Star 9", "Ripple Field 3 - Star 10", "Ripple Field 3 - Star 11", "Ripple Field 3 - Maxim Tomato (Cove)", "Ripple Field 3 - 1-Up (Cutter/Spark)"], "music": 18}, {"name": "Ripple Field 3 - 2", "level": 2, "stage": 3, "room": 2, "pointer": 3715428, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobo"], "default_exits": [{"room": 4, "unkn1": 118, "unkn2": 9, "x": 56, "y": 152, "name": "Ripple Field 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [21, 16], [4, 22], [46, 16], [47, 16], [5, 16], [14, 23]], "locations": ["Ripple Field 3 - Enemy 7 (Bobo)", "Ripple Field 3 - Star 12", "Ripple Field 3 - Star 13", "Ripple Field 3 - Star 14", "Ripple Field 3 - Star 15", "Ripple Field 3 - Star 16", "Ripple Field 3 - Star 17", "Ripple Field 3 - Star 18", "Ripple Field 3 - Star 19", "Ripple Field 3 - Star 20", "Ripple Field 3 - Star 21"], "music": 18}, {"name": "Ripple Field 3 - 3", "level": 2, "stage": 3, "room": 3, "pointer": 3071919, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 15, "unkn2": 6, "x": 56, "y": 104, "name": "Ripple Field 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 3 - Animal 1", "Ripple Field 3 - Animal 2"], "music": 39}, {"name": "Ripple Field 3 - 4", "level": 2, "stage": 3, "room": 4, "pointer": 2970810, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": ["Ripple Field 3 - Elieel"], "music": 8}, {"name": "Ripple Field 3 - 5", "level": 2, "stage": 3, "room": 5, "pointer": 2987502, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 232, "y": 88, "name": "Ripple Field 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": [], "music": 31}, {"name": "Ripple Field 3 - 6", "level": 2, "stage": 3, "room": 6, "pointer": 2888666, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 3 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 7", "level": 2, "stage": 3, "room": 7, "pointer": 3161120, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 3, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 3 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 11, "unkn2": 20, "x": 56, "y": 216, "name": "Ripple Field 3 - 7 Exit 1", "access_rule": []}], "entity_load": [[57, 16]], "locations": [], "music": 18}, {"name": "Ripple Field 4 - 0", "level": 2, "stage": 4, "room": 0, "pointer": 3082540, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Stone)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Mony"], "default_exits": [{"room": 6, "unkn1": 4, "unkn2": 16, "x": 72, "y": 232, "name": "Ripple Field 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [79, 16], [80, 16], [81, 16], [4, 22], [20, 16], [77, 16]], "locations": ["Ripple Field 4 - Enemy 1 (Bukiset (Stone))", "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", "Ripple Field 4 - Enemy 5 (Mony)", "Ripple Field 4 - Star 1", "Ripple Field 4 - Star 2", "Ripple Field 4 - Star 3", "Ripple Field 4 - Star 4", "Ripple Field 4 - Star 5"], "music": 15}, {"name": "Ripple Field 4 - 1", "level": 2, "stage": 4, "room": 1, "pointer": 2964846, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 72, "y": 88, "name": "Ripple Field 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Ripple Field 4 - Miniboss 1 (Captain Stitch)"], "music": 4}, {"name": "Ripple Field 4 - 2", "level": 2, "stage": 4, "room": 2, "pointer": 3018503, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)"], "default_exits": [{"room": 11, "unkn1": 25, "unkn2": 5, "x": 56, "y": 88, "name": "Ripple Field 4 - 2 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 25, "unkn2": 15, "x": 56, "y": 216, "name": "Ripple Field 4 - 2 Exit 1", "access_rule": []}], "entity_load": [[10, 19], [76, 16]], "locations": ["Ripple Field 4 - Enemy 6 (Bukiset (Burning))"], "music": 15}, {"name": "Ripple Field 4 - 3", "level": 2, "stage": 4, "room": 3, "pointer": 2988166, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[10, 19], [42, 19]], "locations": ["Ripple Field 4 - Toad & Little Toad"], "music": 8}, {"name": "Ripple Field 4 - 4", "level": 2, "stage": 4, "room": 4, "pointer": 2885533, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 4 - Complete"], "music": 5}, {"name": "Ripple Field 4 - 5", "level": 2, "stage": 4, "room": 5, "pointer": 3042349, "animal_pointers": [222, 230, 238], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 5, "x": 360, "y": 120, "name": "Ripple Field 4 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 488, "y": 120, "name": "Ripple Field 4 - 5 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 16, "unkn2": 5, "x": 104, "y": 88, "name": "Ripple Field 4 - 5 Exit 2", "access_rule": []}, {"room": 6, "unkn1": 10, "unkn2": 11, "x": 440, "y": 216, "name": "Ripple Field 4 - 5 Exit 3", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 4 - Animal 1", "Ripple Field 4 - Animal 2", "Ripple Field 4 - Animal 3"], "music": 40}, {"name": "Ripple Field 4 - 6", "level": 2, "stage": 4, "room": 6, "pointer": 3234805, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Blipper"], "default_exits": [{"room": 5, "unkn1": 21, "unkn2": 7, "x": 104, "y": 88, "name": "Ripple Field 4 - 6 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 31, "unkn2": 7, "x": 232, "y": 88, "name": "Ripple Field 4 - 6 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 26, "unkn2": 13, "x": 184, "y": 184, "name": "Ripple Field 4 - 6 Exit 2", "access_rule": []}, {"room": 12, "unkn1": 48, "unkn2": 15, "x": 88, "y": 216, "name": "Ripple Field 4 - 6 Exit 3", "access_rule": []}], "entity_load": [[73, 16], [14, 23], [21, 16], [13, 23]], "locations": ["Ripple Field 4 - Enemy 7 (Bobin)", "Ripple Field 4 - Enemy 8 (Blipper)", "Ripple Field 4 - Star 6", "Ripple Field 4 - Star 7"], "music": 15}, {"name": "Ripple Field 4 - 7", "level": 2, "stage": 4, "room": 7, "pointer": 3155468, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 6, "x": 104, "y": 136, "name": "Ripple Field 4 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 18, "unkn2": 9, "x": 72, "y": 248, "name": "Ripple Field 4 - 7 Exit 1", "access_rule": []}], "entity_load": [[14, 23], [1, 16], [0, 23]], "locations": ["Ripple Field 4 - Star 8", "Ripple Field 4 - Star 9", "Ripple Field 4 - Star 10", "Ripple Field 4 - Star 11", "Ripple Field 4 - Star 12", "Ripple Field 4 - Star 13", "Ripple Field 4 - Star 14", "Ripple Field 4 - Star 15", "Ripple Field 4 - Star 16", "Ripple Field 4 - Star 17", "Ripple Field 4 - Star 18", "Ripple Field 4 - Star 19", "Ripple Field 4 - Star 20", "Ripple Field 4 - Star 21"], "music": 15}, {"name": "Ripple Field 4 - 8", "level": 2, "stage": 4, "room": 8, "pointer": 3350031, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Oro"], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 22, "x": 184, "y": 440, "name": "Ripple Field 4 - 8 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 34, "unkn2": 22, "x": 296, "y": 440, "name": "Ripple Field 4 - 8 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 16, "unkn2": 72, "x": 168, "y": 152, "name": "Ripple Field 4 - 8 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 23, "unkn2": 72, "x": 120, "y": 152, "name": "Ripple Field 4 - 8 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [68, 16], [14, 23], [25, 16], [6, 23]], "locations": ["Ripple Field 4 - Enemy 9 (Como)", "Ripple Field 4 - Enemy 10 (Oro)", "Ripple Field 4 - Star 22", "Ripple Field 4 - Star 23", "Ripple Field 4 - Star 24", "Ripple Field 4 - Star 25", "Ripple Field 4 - Star 26", "Ripple Field 4 - Star 27", "Ripple Field 4 - Star 28"], "music": 15}, {"name": "Ripple Field 4 - 9", "level": 2, "stage": 4, "room": 9, "pointer": 3050397, "animal_pointers": [], "consumables": [{"idx": 29, "pointer": 200, "x": 88, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Stone)"}], "consumables_pointer": 176, "enemies": ["Gansan"], "default_exits": [{"room": 8, "unkn1": 11, "unkn2": 9, "x": 264, "y": 1144, "name": "Ripple Field 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[75, 16], [2, 22]], "locations": ["Ripple Field 4 - Enemy 11 (Gansan)", "Ripple Field 4 - Maxim Tomato (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 10", "level": 2, "stage": 4, "room": 10, "pointer": 3052069, "animal_pointers": [], "consumables": [{"idx": 30, "pointer": 192, "x": 200, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 4 - 1-Up (Stone)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 8, "unkn1": 6, "unkn2": 9, "x": 376, "y": 1144, "name": "Ripple Field 4 - 10 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [75, 16]], "locations": ["Ripple Field 4 - 1-Up (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 11", "level": 2, "stage": 4, "room": 11, "pointer": 3386974, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Kapar", "Squishy"], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 13, "x": 72, "y": 152, "name": "Ripple Field 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[22, 16], [67, 16], [14, 23], [62, 16], [0, 16]], "locations": ["Ripple Field 4 - Enemy 12 (Waddle Dee)", "Ripple Field 4 - Enemy 13 (Kapar)", "Ripple Field 4 - Enemy 14 (Squishy)", "Ripple Field 4 - Star 29", "Ripple Field 4 - Star 30", "Ripple Field 4 - Star 31", "Ripple Field 4 - Star 32", "Ripple Field 4 - Star 33", "Ripple Field 4 - Star 34", "Ripple Field 4 - Star 35", "Ripple Field 4 - Star 36", "Ripple Field 4 - Star 37", "Ripple Field 4 - Star 38", "Ripple Field 4 - Star 39", "Ripple Field 4 - Star 40", "Ripple Field 4 - Star 41", "Ripple Field 4 - Star 42", "Ripple Field 4 - Star 43"], "music": 15}, {"name": "Ripple Field 4 - 12", "level": 2, "stage": 4, "room": 12, "pointer": 3168339, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 8, "unkn1": 67, "unkn2": 7, "x": 88, "y": 1224, "name": "Ripple Field 4 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 75, "unkn2": 7, "x": 88, "y": 136, "name": "Ripple Field 4 - 12 Exit 1", "access_rule": []}], "entity_load": [[59, 16], [13, 23], [28, 16]], "locations": ["Ripple Field 4 - Enemy 15 (Nidoo)"], "music": 15}, {"name": "Ripple Field 4 - 13", "level": 2, "stage": 4, "room": 13, "pointer": 2958478, "animal_pointers": [], "consumables": [{"idx": 54, "pointer": 264, "x": 216, "y": 136, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Dark)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 12, "unkn1": 4, "unkn2": 8, "x": 1192, "y": 120, "name": "Ripple Field 4 - 13 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [2, 22], [59, 16]], "locations": ["Ripple Field 4 - Star 44", "Ripple Field 4 - Star 45", "Ripple Field 4 - Star 46", "Ripple Field 4 - Star 47", "Ripple Field 4 - Star 48", "Ripple Field 4 - Star 49", "Ripple Field 4 - Star 50", "Ripple Field 4 - Star 51", "Ripple Field 4 - Maxim Tomato (Dark)"], "music": 15}, {"name": "Ripple Field 5 - 0", "level": 2, "stage": 5, "room": 0, "pointer": 3240369, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 9, "unkn2": 43, "x": 88, "y": 344, "name": "Ripple Field 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": ["Ripple Field 5 - Star 1", "Ripple Field 5 - Star 2", "Ripple Field 5 - Star 3", "Ripple Field 5 - Star 4", "Ripple Field 5 - Star 5", "Ripple Field 5 - Star 6"], "music": 16}, {"name": "Ripple Field 5 - 1", "level": 2, "stage": 5, "room": 1, "pointer": 3547528, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 4, "x": 184, "y": 344, "name": "Ripple Field 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23]], "locations": ["Ripple Field 5 - Star 7", "Ripple Field 5 - Star 8", "Ripple Field 5 - Star 9", "Ripple Field 5 - Star 10", "Ripple Field 5 - Star 11", "Ripple Field 5 - Star 12", "Ripple Field 5 - Star 13", "Ripple Field 5 - Star 14", "Ripple Field 5 - Star 15", "Ripple Field 5 - Star 16", "Ripple Field 5 - Star 17"], "music": 16}, {"name": "Ripple Field 5 - 2", "level": 2, "stage": 5, "room": 2, "pointer": 3611327, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Joe"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 21, "x": 56, "y": 184, "name": "Ripple Field 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 1 (Glunk)", "Ripple Field 5 - Enemy 2 (Joe)", "Ripple Field 5 - Star 18", "Ripple Field 5 - Star 19", "Ripple Field 5 - Star 20", "Ripple Field 5 - Star 21", "Ripple Field 5 - Star 22", "Ripple Field 5 - Star 23", "Ripple Field 5 - Star 24", "Ripple Field 5 - Star 25", "Ripple Field 5 - Star 26", "Ripple Field 5 - Star 27", "Ripple Field 5 - Star 28", "Ripple Field 5 - Star 29", "Ripple Field 5 - Star 30", "Ripple Field 5 - Star 31"], "music": 16}, {"name": "Ripple Field 5 - 3", "level": 2, "stage": 5, "room": 3, "pointer": 3926157, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 1258, "x": 1488, "y": 192, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Currents)"}, {"idx": 31, "pointer": 1290, "x": 1520, "y": 192, "etype": 22, "vtype": 0, "name": "Ripple Field 5 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Bobin", "Mony", "Squishy"], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 38, "x": 152, "y": 152, "name": "Ripple Field 5 - 3 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 95, "unkn2": 38, "x": 248, "y": 1064, "name": "Ripple Field 5 - 3 Exit 1", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [6, 22], [14, 23], [1, 16], [73, 16], [22, 16], [20, 16]], "locations": ["Ripple Field 5 - Enemy 3 (Bobin)", "Ripple Field 5 - Enemy 4 (Mony)", "Ripple Field 5 - Enemy 5 (Squishy)", "Ripple Field 5 - Star 32", "Ripple Field 5 - Star 33", "Ripple Field 5 - Star 34", "Ripple Field 5 - Star 35", "Ripple Field 5 - Star 36", "Ripple Field 5 - Star 37", "Ripple Field 5 - Maxim Tomato (Currents)", "Ripple Field 5 - 1-Up (Currents)"], "music": 16}, {"name": "Ripple Field 5 - 4", "level": 2, "stage": 5, "room": 4, "pointer": 3026639, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 4, "x": 232, "y": 152, "name": "Ripple Field 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 1"], "music": 40}, {"name": "Ripple Field 5 - 5", "level": 2, "stage": 5, "room": 5, "pointer": 3207333, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 56, "y": 72, "name": "Ripple Field 5 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 9, "x": 120, "y": 552, "name": "Ripple Field 5 - 5 Exit 1", "access_rule": ["Kine"]}], "entity_load": [[14, 23]], "locations": ["Ripple Field 5 - Star 38", "Ripple Field 5 - Star 39", "Ripple Field 5 - Star 40", "Ripple Field 5 - Star 41", "Ripple Field 5 - Star 42"], "music": 16}, {"name": "Ripple Field 5 - 6", "level": 2, "stage": 5, "room": 6, "pointer": 3485896, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 9, "unkn1": 121, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [22, 16], [14, 23], [13, 16], [11, 16], [32, 16]], "locations": ["Ripple Field 5 - Enemy 6 (Yaban)", "Ripple Field 5 - Enemy 7 (Broom Hatter)", "Ripple Field 5 - Enemy 8 (Bouncy)", "Ripple Field 5 - Star 43", "Ripple Field 5 - Star 44", "Ripple Field 5 - Star 45"], "music": 16}, {"name": "Ripple Field 5 - 7", "level": 2, "stage": 5, "room": 7, "pointer": 3752698, "animal_pointers": [], "consumables": [{"idx": 53, "pointer": 418, "x": 1512, "y": 608, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Exit)"}], "consumables_pointer": 352, "enemies": ["Sparky", "Rocky", "Babut"], "default_exits": [{"room": 10, "unkn1": 45, "unkn2": 31, "x": 152, "y": 152, "name": "Ripple Field 5 - 7 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 94, "unkn2": 40, "x": 88, "y": 200, "name": "Ripple Field 5 - 7 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [8, 16], [22, 16], [14, 23], [2, 22]], "locations": ["Ripple Field 5 - Enemy 9 (Sparky)", "Ripple Field 5 - Enemy 10 (Rocky)", "Ripple Field 5 - Enemy 11 (Babut)", "Ripple Field 5 - Star 46", "Ripple Field 5 - Star 47", "Ripple Field 5 - Star 48", "Ripple Field 5 - Star 49", "Ripple Field 5 - Maxim Tomato (Exit)"], "music": 16}, {"name": "Ripple Field 5 - 8", "level": 2, "stage": 5, "room": 8, "pointer": 3044682, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 8, "unkn2": 9, "x": 88, "y": 616, "name": "Ripple Field 5 - 8 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 2"], "music": 39}, {"name": "Ripple Field 5 - 9", "level": 2, "stage": 5, "room": 9, "pointer": 2963193, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[11, 19], [42, 19]], "locations": ["Ripple Field 5 - Mama Pitch"], "music": 8}, {"name": "Ripple Field 5 - 10", "level": 2, "stage": 5, "room": 10, "pointer": 3042934, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 8, "unkn2": 9, "x": 712, "y": 504, "name": "Ripple Field 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 12 (Galbo)", "Ripple Field 5 - Star 50", "Ripple Field 5 - Star 51"], "music": 16}, {"name": "Ripple Field 5 - 11", "level": 2, "stage": 5, "room": 11, "pointer": 2886256, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 5 - Complete"], "music": 5}, {"name": "Ripple Field 6 - 0", "level": 2, "stage": 6, "room": 0, "pointer": 2949576, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 1, "unkn1": 56, "unkn2": 7, "x": 40, "y": 152, "name": "Ripple Field 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[29, 16], [13, 23]], "locations": ["Ripple Field 6 - Enemy 1 (Kany)"], "music": 15}, {"name": "Ripple Field 6 - 1", "level": 2, "stage": 6, "room": 1, "pointer": 2971200, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 23, "unkn2": 9, "x": 56, "y": 264, "name": "Ripple Field 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 1", "Ripple Field 6 - Animal 2", "Ripple Field 6 - Animal 3"], "music": 38}, {"name": "Ripple Field 6 - 2", "level": 2, "stage": 6, "room": 2, "pointer": 3637749, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 95, "unkn2": 9, "x": 104, "y": 872, "name": "Ripple Field 6 - 2 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 50, "unkn2": 22, "x": 184, "y": 88, "name": "Ripple Field 6 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 45, "unkn2": 26, "x": 88, "y": 88, "name": "Ripple Field 6 - 2 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 55, "unkn2": 26, "x": 248, "y": 88, "name": "Ripple Field 6 - 2 Exit 3", "access_rule": []}], "entity_load": [[52, 16], [13, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 3", "level": 2, "stage": 6, "room": 3, "pointer": 3092564, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 5, "x": 744, "y": 424, "name": "Ripple Field 6 - 3 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 16, "unkn2": 5, "x": 872, "y": 424, "name": "Ripple Field 6 - 3 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 4", "level": 2, "stage": 6, "room": 4, "pointer": 3133247, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 5, "x": 824, "y": 360, "name": "Ripple Field 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[12, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 5", "level": 2, "stage": 6, "room": 5, "pointer": 3507762, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 76, "unkn2": 4, "x": 680, "y": 72, "name": "Ripple Field 6 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 6, "x": 440, "y": 104, "name": "Ripple Field 6 - 5 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 10, "x": 440, "y": 168, "name": "Ripple Field 6 - 5 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 88, "unkn2": 10, "x": 104, "y": 152, "name": "Ripple Field 6 - 5 Exit 3", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 12, "x": 200, "y": 200, "name": "Ripple Field 6 - 5 Exit 4", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 12, "x": 680, "y": 200, "name": "Ripple Field 6 - 5 Exit 5", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 16, "x": 680, "y": 264, "name": "Ripple Field 6 - 5 Exit 6", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 6", "level": 2, "stage": 6, "room": 6, "pointer": 3211264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 10, "x": 72, "y": 168, "name": "Ripple Field 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 7", "level": 2, "stage": 6, "room": 7, "pointer": 3586039, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Kapar", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 5, "unkn1": 134, "unkn2": 16, "x": 72, "y": 168, "name": "Ripple Field 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [3, 16], [67, 16], [51, 16], [7, 16]], "locations": ["Ripple Field 6 - Enemy 2 (KeKe)", "Ripple Field 6 - Enemy 3 (Kapar)", "Ripple Field 6 - Enemy 4 (Rocky)", "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)", "Ripple Field 6 - Star 1", "Ripple Field 6 - Star 2", "Ripple Field 6 - Star 3", "Ripple Field 6 - Star 4", "Ripple Field 6 - Star 5", "Ripple Field 6 - Star 6", "Ripple Field 6 - Star 7", "Ripple Field 6 - Star 8", "Ripple Field 6 - Star 9", "Ripple Field 6 - Star 10", "Ripple Field 6 - Star 11", "Ripple Field 6 - Star 12", "Ripple Field 6 - Star 13", "Ripple Field 6 - Star 14"], "music": 15}, {"name": "Ripple Field 6 - 8", "level": 2, "stage": 6, "room": 8, "pointer": 3621483, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Coconut", "Sasuke", "Nruff"], "default_exits": [{"room": 10, "unkn1": 70, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 6 - 8 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 26, "unkn2": 54, "x": 72, "y": 152, "name": "Ripple Field 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[89, 16], [15, 16], [30, 16], [34, 16], [14, 23]], "locations": ["Ripple Field 6 - Enemy 6 (Propeller)", "Ripple Field 6 - Enemy 7 (Coconut)", "Ripple Field 6 - Enemy 8 (Sasuke)", "Ripple Field 6 - Enemy 9 (Nruff)", "Ripple Field 6 - Star 15", "Ripple Field 6 - Star 16", "Ripple Field 6 - Star 17", "Ripple Field 6 - Star 18", "Ripple Field 6 - Star 19", "Ripple Field 6 - Star 20", "Ripple Field 6 - Star 21", "Ripple Field 6 - Star 22", "Ripple Field 6 - Star 23"], "music": 15}, {"name": "Ripple Field 6 - 9", "level": 2, "stage": 6, "room": 9, "pointer": 2954523, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 3, "unkn2": 9, "x": 408, "y": 872, "name": "Ripple Field 6 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 4"], "music": 39}, {"name": "Ripple Field 6 - 10", "level": 2, "stage": 6, "room": 10, "pointer": 3069438, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[12, 19], [42, 19]], "locations": ["Ripple Field 6 - HB-002"], "music": 8}, {"name": "Ripple Field 6 - 11", "level": 2, "stage": 6, "room": 11, "pointer": 2886497, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 6 - Complete"], "music": 5}, {"name": "Ripple Field Boss - 0", "level": 2, "stage": 7, "room": 0, "pointer": 3157370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[7, 18]], "locations": ["Ripple Field - Boss (Acro) Purified", "Level 2 Boss - Defeated", "Level 2 Boss - Purified"], "music": 2}, {"name": "Sand Canyon 1 - 0", "level": 3, "stage": 1, "room": 0, "pointer": 3524267, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo"], "default_exits": [{"room": 5, "unkn1": 196, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [1, 16], [26, 16], [2, 16]], "locations": ["Sand Canyon 1 - Enemy 1 (Bronto Burt)", "Sand Canyon 1 - Enemy 2 (Galbo)"], "music": 13}, {"name": "Sand Canyon 1 - 1", "level": 3, "stage": 1, "room": 1, "pointer": 3163860, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 34, "unkn2": 5, "x": 104, "y": 408, "name": "Sand Canyon 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 1 - Animal 1", "Sand Canyon 1 - Animal 2"], "music": 38}, {"name": "Sand Canyon 1 - 2", "level": 3, "stage": 1, "room": 2, "pointer": 3512532, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro"], "default_exits": [{"room": 3, "unkn1": 73, "unkn2": 6, "x": 56, "y": 120, "name": "Sand Canyon 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [26, 16], [25, 16], [4, 22], [14, 23], [1, 23], [0, 23], [4, 23]], "locations": ["Sand Canyon 1 - Enemy 3 (Oro)", "Sand Canyon 1 - Star 1", "Sand Canyon 1 - Star 2", "Sand Canyon 1 - Star 3", "Sand Canyon 1 - Star 4"], "music": 13}, {"name": "Sand Canyon 1 - 3", "level": 3, "stage": 1, "room": 3, "pointer": 3719146, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Propeller", "Gansan", "Babut"], "default_exits": [{"room": 4, "unkn1": 25, "unkn2": 73, "x": 72, "y": 280, "name": "Sand Canyon 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [75, 16], [43, 16], [8, 16]], "locations": ["Sand Canyon 1 - Enemy 4 (Sparky)", "Sand Canyon 1 - Enemy 5 (Propeller)", "Sand Canyon 1 - Enemy 6 (Gansan)", "Sand Canyon 1 - Enemy 7 (Babut)"], "music": 13}, {"name": "Sand Canyon 1 - 4", "level": 3, "stage": 1, "room": 4, "pointer": 3421212, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Dogon", "Bouncy", "Pteran"], "default_exits": [{"room": 7, "unkn1": 196, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[90, 16], [13, 16], [40, 16], [14, 23], [39, 16]], "locations": ["Sand Canyon 1 - Enemy 8 (Loud)", "Sand Canyon 1 - Enemy 9 (Dogon)", "Sand Canyon 1 - Enemy 10 (Bouncy)", "Sand Canyon 1 - Enemy 11 (Pteran)", "Sand Canyon 1 - Star 5", "Sand Canyon 1 - Star 6", "Sand Canyon 1 - Star 7", "Sand Canyon 1 - Star 8", "Sand Canyon 1 - Star 9", "Sand Canyon 1 - Star 10"], "music": 13}, {"name": "Sand Canyon 1 - 5", "level": 3, "stage": 1, "room": 5, "pointer": 3203325, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Polof"], "default_exits": [{"room": 6, "unkn1": 32, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 1 - 5 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 46, "unkn2": 9, "x": 56, "y": 344, "name": "Sand Canyon 1 - 5 Exit 1", "access_rule": []}], "entity_load": [[9, 16]], "locations": ["Sand Canyon 1 - Enemy 12 (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 6", "level": 3, "stage": 1, "room": 6, "pointer": 3138524, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 248, "x": 168, "y": 104, "etype": 22, "vtype": 0, "name": "Sand Canyon 1 - 1-Up (Polof)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 5, "unkn1": 5, "unkn2": 9, "x": 536, "y": 152, "name": "Sand Canyon 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [0, 22]], "locations": ["Sand Canyon 1 - Star 11", "Sand Canyon 1 - Star 12", "Sand Canyon 1 - Star 13", "Sand Canyon 1 - Star 14", "Sand Canyon 1 - Star 15", "Sand Canyon 1 - Star 16", "Sand Canyon 1 - Star 17", "Sand Canyon 1 - Star 18", "Sand Canyon 1 - Star 19", "Sand Canyon 1 - Star 20", "Sand Canyon 1 - Star 21", "Sand Canyon 1 - Star 22", "Sand Canyon 1 - 1-Up (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 7", "level": 3, "stage": 1, "room": 7, "pointer": 2988822, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [42, 19]], "locations": ["Sand Canyon 1 - Geromuzudake"], "music": 8}, {"name": "Sand Canyon 1 - 8", "level": 3, "stage": 1, "room": 8, "pointer": 2885292, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 1 - Complete"], "music": 5}, {"name": "Sand Canyon 2 - 0", "level": 3, "stage": 2, "room": 0, "pointer": 3668370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Doka", "Boten"], "default_exits": [{"room": 1, "unkn1": 178, "unkn2": 8, "x": 184, "y": 104, "name": "Sand Canyon 2 - 0 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 244, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 2 - 0 Exit 1", "access_rule": []}], "entity_load": [[35, 16], [33, 16], [14, 23], [51, 16], [47, 16], [46, 16]], "locations": ["Sand Canyon 2 - Enemy 1 (KeKe)", "Sand Canyon 2 - Enemy 2 (Doka)", "Sand Canyon 2 - Enemy 3 (Boten)", "Sand Canyon 2 - Star 1", "Sand Canyon 2 - Star 2", "Sand Canyon 2 - Star 3", "Sand Canyon 2 - Star 4", "Sand Canyon 2 - Star 5", "Sand Canyon 2 - Star 6", "Sand Canyon 2 - Star 7", "Sand Canyon 2 - Star 8", "Sand Canyon 2 - Star 9", "Sand Canyon 2 - Star 10", "Sand Canyon 2 - Star 11"], "music": 21}, {"name": "Sand Canyon 2 - 1", "level": 3, "stage": 2, "room": 1, "pointer": 2952738, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 10, "unkn2": 6, "x": 2872, "y": 136, "name": "Sand Canyon 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 2 - Animal 1", "Sand Canyon 2 - Animal 2"], "music": 40}, {"name": "Sand Canyon 2 - 2", "level": 3, "stage": 2, "room": 2, "pointer": 3531156, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 9, "unkn1": 45, "unkn2": 60, "x": 88, "y": 184, "name": "Sand Canyon 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[6, 23], [89, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 4 (Propeller)", "Sand Canyon 2 - Star 12", "Sand Canyon 2 - Star 13", "Sand Canyon 2 - Star 14", "Sand Canyon 2 - Star 15", "Sand Canyon 2 - Star 16", "Sand Canyon 2 - Star 17"], "music": 21}, {"name": "Sand Canyon 2 - 3", "level": 3, "stage": 2, "room": 3, "pointer": 3263731, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Sasuke", "Como"], "default_exits": [{"room": 4, "unkn1": 63, "unkn2": 5, "x": 88, "y": 184, "name": "Sand Canyon 2 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 68, "unkn2": 5, "x": 184, "y": 184, "name": "Sand Canyon 2 - 3 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 73, "unkn2": 5, "x": 248, "y": 184, "name": "Sand Canyon 2 - 3 Exit 2", "access_rule": []}, {"room": 5, "unkn1": 130, "unkn2": 9, "x": 72, "y": 312, "name": "Sand Canyon 2 - 3 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [8, 16], [30, 16], [0, 16]], "locations": ["Sand Canyon 2 - Enemy 5 (Waddle Dee)", "Sand Canyon 2 - Enemy 6 (Sparky)", "Sand Canyon 2 - Enemy 7 (Sasuke)", "Sand Canyon 2 - Enemy 8 (Como)"], "music": 21}, {"name": "Sand Canyon 2 - 4", "level": 3, "stage": 2, "room": 4, "pointer": 3076300, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 228, "x": 168, "y": 72, "etype": 22, "vtype": 0, "name": "Sand Canyon 2 - 1-Up (Enclave)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 5, "unkn2": 11, "x": 1016, "y": 88, "name": "Sand Canyon 2 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 10, "unkn2": 11, "x": 1112, "y": 88, "name": "Sand Canyon 2 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 11, "x": 1176, "y": 88, "name": "Sand Canyon 2 - 4 Exit 2", "access_rule": []}], "entity_load": [[14, 23], [0, 22], [4, 22]], "locations": ["Sand Canyon 2 - Star 18", "Sand Canyon 2 - Star 19", "Sand Canyon 2 - 1-Up (Enclave)"], "music": 21}, {"name": "Sand Canyon 2 - 5", "level": 3, "stage": 2, "room": 5, "pointer": 3302133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 6, "unkn1": 63, "unkn2": 15, "x": 120, "y": 216, "name": "Sand Canyon 2 - 5 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 71, "unkn2": 18, "x": 152, "y": 136, "name": "Sand Canyon 2 - 5 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 130, "unkn2": 19, "x": 72, "y": 952, "name": "Sand Canyon 2 - 5 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 56, "unkn2": 23, "x": 88, "y": 216, "name": "Sand Canyon 2 - 5 Exit 3", "access_rule": []}], "entity_load": [[80, 16], [78, 16], [81, 16], [83, 16], [79, 16], [82, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))", "Sand Canyon 2 - Star 20", "Sand Canyon 2 - Star 21", "Sand Canyon 2 - Star 22", "Sand Canyon 2 - Star 23", "Sand Canyon 2 - Star 24", "Sand Canyon 2 - Star 25", "Sand Canyon 2 - Star 26", "Sand Canyon 2 - Star 27", "Sand Canyon 2 - Star 28", "Sand Canyon 2 - Star 29", "Sand Canyon 2 - Star 30", "Sand Canyon 2 - Star 31", "Sand Canyon 2 - Star 32", "Sand Canyon 2 - Star 33"], "music": 21}, {"name": "Sand Canyon 2 - 6", "level": 3, "stage": 2, "room": 6, "pointer": 3800612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 5, "unkn1": 17, "unkn2": 13, "x": 1144, "y": 248, "name": "Sand Canyon 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 15 (Nidoo)", "Sand Canyon 2 - Star 34"], "music": 21}, {"name": "Sand Canyon 2 - 7", "level": 3, "stage": 2, "room": 7, "pointer": 3073888, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 15, "unkn2": 8, "x": 1016, "y": 296, "name": "Sand Canyon 2 - 7 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 5, "unkn2": 13, "x": 904, "y": 376, "name": "Sand Canyon 2 - 7 Exit 1", "access_rule": []}], "entity_load": [[15, 19]], "locations": [], "music": 21}, {"name": "Sand Canyon 2 - 8", "level": 3, "stage": 2, "room": 8, "pointer": 3061270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 5, "unkn1": 19, "unkn2": 13, "x": 1256, "y": 376, "name": "Sand Canyon 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 16 (Mariel)", "Sand Canyon 2 - Star 35"], "music": 21}, {"name": "Sand Canyon 2 - 9", "level": 3, "stage": 2, "room": 9, "pointer": 3453286, "animal_pointers": [], "consumables": [{"idx": 51, "pointer": 240, "x": 1408, "y": 216, "etype": 22, "vtype": 2, "name": "Sand Canyon 2 - Maxim Tomato (Underwater)"}], "consumables_pointer": 128, "enemies": ["Yaban", "Wapod", "Squishy", "Pteran"], "default_exits": [{"room": 10, "unkn1": 246, "unkn2": 10, "x": 56, "y": 152, "name": "Sand Canyon 2 - 9 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [22, 16], [2, 22], [39, 16], [88, 16], [32, 16]], "locations": ["Sand Canyon 2 - Enemy 17 (Yaban)", "Sand Canyon 2 - Enemy 18 (Wapod)", "Sand Canyon 2 - Enemy 19 (Squishy)", "Sand Canyon 2 - Enemy 20 (Pteran)", "Sand Canyon 2 - Star 36", "Sand Canyon 2 - Star 37", "Sand Canyon 2 - Star 38", "Sand Canyon 2 - Star 39", "Sand Canyon 2 - Star 40", "Sand Canyon 2 - Star 41", "Sand Canyon 2 - Star 42", "Sand Canyon 2 - Star 43", "Sand Canyon 2 - Star 44", "Sand Canyon 2 - Star 45", "Sand Canyon 2 - Star 46", "Sand Canyon 2 - Star 47", "Sand Canyon 2 - Star 48", "Sand Canyon 2 - Maxim Tomato (Underwater)"], "music": 21}, {"name": "Sand Canyon 2 - 10", "level": 3, "stage": 2, "room": 10, "pointer": 2994821, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 2 - 10 Exit 0", "access_rule": []}], "entity_load": [[15, 19], [42, 19]], "locations": ["Sand Canyon 2 - Auntie"], "music": 8}, {"name": "Sand Canyon 2 - 11", "level": 3, "stage": 2, "room": 11, "pointer": 2891799, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 2 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 0", "level": 3, "stage": 3, "room": 0, "pointer": 3544676, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Broom Hatter", "Rocky", "Gabon"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 57, "x": 104, "y": 152, "name": "Sand Canyon 3 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 11, "unkn2": 57, "x": 200, "y": 152, "name": "Sand Canyon 3 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 16, "unkn2": 57, "x": 296, "y": 152, "name": "Sand Canyon 3 - 0 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 23, "unkn2": 109, "x": 104, "y": 72, "name": "Sand Canyon 3 - 0 Exit 3", "access_rule": []}], "entity_load": [[24, 16], [3, 16], [11, 16], [27, 16]], "locations": ["Sand Canyon 3 - Enemy 1 (Sir Kibble)", "Sand Canyon 3 - Enemy 2 (Broom Hatter)", "Sand Canyon 3 - Enemy 3 (Rocky)", "Sand Canyon 3 - Enemy 4 (Gabon)"], "music": 16}, {"name": "Sand Canyon 3 - 1", "level": 3, "stage": 3, "room": 1, "pointer": 2965655, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 88, "y": 920, "name": "Sand Canyon 3 - 1 Exit 0", "access_rule": []}, {"room": 0, "unkn1": 11, "unkn2": 9, "x": 168, "y": 920, "name": "Sand Canyon 3 - 1 Exit 1", "access_rule": []}, {"room": 0, "unkn1": 17, "unkn2": 9, "x": 248, "y": 920, "name": "Sand Canyon 3 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 3 - Animal 1", "Sand Canyon 3 - Animal 2", "Sand Canyon 3 - Animal 3"], "music": 39}, {"name": "Sand Canyon 3 - 2", "level": 3, "stage": 3, "room": 2, "pointer": 3726270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 3, "unkn1": 184, "unkn2": 20, "x": 104, "y": 232, "name": "Sand Canyon 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[63, 16], [55, 16], [14, 23], [4, 23], [29, 16]], "locations": ["Sand Canyon 3 - Enemy 5 (Kany)", "Sand Canyon 3 - Star 1", "Sand Canyon 3 - Star 2", "Sand Canyon 3 - Star 3", "Sand Canyon 3 - Star 4", "Sand Canyon 3 - Star 5", "Sand Canyon 3 - Star 6"], "music": 16}, {"name": "Sand Canyon 3 - 3", "level": 3, "stage": 3, "room": 3, "pointer": 3416806, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 8, "unkn1": 130, "unkn2": 14, "x": 40, "y": 152, "name": "Sand Canyon 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [6, 23], [5, 23]], "locations": ["Sand Canyon 3 - Enemy 6 (Galbo)"], "music": 16}, {"name": "Sand Canyon 3 - 4", "level": 3, "stage": 3, "room": 4, "pointer": 3564419, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Sasuke"], "default_exits": [{"room": 5, "unkn1": 135, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[68, 16], [30, 16], [14, 23], [89, 16], [24, 16]], "locations": ["Sand Canyon 3 - Enemy 7 (Propeller)", "Sand Canyon 3 - Enemy 8 (Sasuke)", "Sand Canyon 3 - Star 7", "Sand Canyon 3 - Star 8", "Sand Canyon 3 - Star 9", "Sand Canyon 3 - Star 10"], "music": 16}, {"name": "Sand Canyon 3 - 5", "level": 3, "stage": 3, "room": 5, "pointer": 2973891, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": ["Sand Canyon 3 - Caramello"], "music": 8}, {"name": "Sand Canyon 3 - 6", "level": 3, "stage": 3, "room": 6, "pointer": 3247969, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod", "Bobo", "Babut", "Magoo"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 8, "x": 88, "y": 424, "name": "Sand Canyon 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[53, 16], [88, 16], [46, 16], [47, 16], [5, 16], [43, 16]], "locations": ["Sand Canyon 3 - Enemy 9 (Wapod)", "Sand Canyon 3 - Enemy 10 (Bobo)", "Sand Canyon 3 - Enemy 11 (Babut)", "Sand Canyon 3 - Enemy 12 (Magoo)"], "music": 16}, {"name": "Sand Canyon 3 - 7", "level": 3, "stage": 3, "room": 7, "pointer": 2887702, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 3 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 8", "level": 3, "stage": 3, "room": 8, "pointer": 2968057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 104, "y": 120, "name": "Sand Canyon 3 - 8 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": [], "music": 31}, {"name": "Sand Canyon 4 - 0", "level": 3, "stage": 4, "room": 0, "pointer": 3521954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Popon Ball", "Mariel", "Chilly"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 8, "x": 216, "y": 88, "name": "Sand Canyon 4 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 199, "unkn2": 15, "x": 104, "y": 88, "name": "Sand Canyon 4 - 0 Exit 1", "access_rule": []}], "entity_load": [[6, 16], [45, 16], [6, 23], [50, 16], [14, 23]], "locations": ["Sand Canyon 4 - Enemy 1 (Popon Ball)", "Sand Canyon 4 - Enemy 2 (Mariel)", "Sand Canyon 4 - Enemy 3 (Chilly)", "Sand Canyon 4 - Star 1", "Sand Canyon 4 - Star 2", "Sand Canyon 4 - Star 3", "Sand Canyon 4 - Star 4", "Sand Canyon 4 - Star 5", "Sand Canyon 4 - Star 6", "Sand Canyon 4 - Star 7", "Sand Canyon 4 - Star 8", "Sand Canyon 4 - Star 9", "Sand Canyon 4 - Star 10", "Sand Canyon 4 - Star 11"], "music": 18}, {"name": "Sand Canyon 4 - 1", "level": 3, "stage": 4, "room": 1, "pointer": 2956289, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 5, "x": 1544, "y": 136, "name": "Sand Canyon 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 4 - Animal 1", "Sand Canyon 4 - Animal 2", "Sand Canyon 4 - Animal 3"], "music": 39}, {"name": "Sand Canyon 4 - 2", "level": 3, "stage": 4, "room": 2, "pointer": 3505360, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 328, "x": 2024, "y": 72, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Pacto)"}], "consumables_pointer": 160, "enemies": ["Tick", "Bronto Burt", "Babut"], "default_exits": [{"room": 3, "unkn1": 149, "unkn2": 14, "x": 88, "y": 216, "name": "Sand Canyon 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [2, 22], [43, 16], [2, 16], [48, 16]], "locations": ["Sand Canyon 4 - Enemy 4 (Tick)", "Sand Canyon 4 - Enemy 5 (Bronto Burt)", "Sand Canyon 4 - Enemy 6 (Babut)", "Sand Canyon 4 - Maxim Tomato (Pacto)"], "music": 18}, {"name": "Sand Canyon 4 - 3", "level": 3, "stage": 4, "room": 3, "pointer": 3412361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Joe", "Mony", "Blipper"], "default_exits": [{"room": 4, "unkn1": 115, "unkn2": 6, "x": 776, "y": 120, "name": "Sand Canyon 4 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 29, "unkn2": 8, "x": 72, "y": 88, "name": "Sand Canyon 4 - 3 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 105, "unkn2": 14, "x": 104, "y": 216, "name": "Sand Canyon 4 - 3 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 115, "unkn2": 20, "x": 776, "y": 248, "name": "Sand Canyon 4 - 3 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 64, "unkn2": 21, "x": 408, "y": 232, "name": "Sand Canyon 4 - 3 Exit 4", "access_rule": []}], "entity_load": [[73, 16], [20, 16], [91, 16], [14, 23], [21, 16]], "locations": ["Sand Canyon 4 - Enemy 7 (Bobin)", "Sand Canyon 4 - Enemy 8 (Joe)", "Sand Canyon 4 - Enemy 9 (Mony)", "Sand Canyon 4 - Enemy 10 (Blipper)", "Sand Canyon 4 - Star 12", "Sand Canyon 4 - Star 13", "Sand Canyon 4 - Star 14", "Sand Canyon 4 - Star 15"], "music": 18}, {"name": "Sand Canyon 4 - 4", "level": 3, "stage": 4, "room": 4, "pointer": 3307804, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 60, "unkn2": 6, "x": 88, "y": 104, "name": "Sand Canyon 4 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 60, "unkn2": 16, "x": 88, "y": 360, "name": "Sand Canyon 4 - 4 Exit 1", "access_rule": []}], "entity_load": [[21, 16], [20, 16], [91, 16], [73, 16]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 5", "level": 3, "stage": 4, "room": 5, "pointer": 2955407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 16, "unkn2": 13, "x": 88, "y": 232, "name": "Sand Canyon 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Sand Canyon 4 - Miniboss 1 (Haboki)"], "music": 4}, {"name": "Sand Canyon 4 - 6", "level": 3, "stage": 4, "room": 6, "pointer": 3094851, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 6, "x": 56, "y": 56, "name": "Sand Canyon 4 - 6 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 14, "x": 56, "y": 104, "name": "Sand Canyon 4 - 6 Exit 1", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 22, "x": 56, "y": 152, "name": "Sand Canyon 4 - 6 Exit 2", "access_rule": []}], "entity_load": [[17, 19], [4, 23], [5, 23]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 7", "level": 3, "stage": 4, "room": 7, "pointer": 3483428, "animal_pointers": [], "consumables": [{"idx": 25, "pointer": 200, "x": 344, "y": 144, "etype": 22, "vtype": 0, "name": "Sand Canyon 4 - 1-Up (Clean)"}, {"idx": 26, "pointer": 336, "x": 1656, "y": 144, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Needle)"}], "consumables_pointer": 128, "enemies": ["Togezo", "Rocky", "Bobo"], "default_exits": [{"room": 8, "unkn1": 266, "unkn2": 9, "x": 56, "y": 152, "name": "Sand Canyon 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [3, 16], [14, 23], [5, 16], [2, 16], [18, 16], [0, 22], [2, 22]], "locations": ["Sand Canyon 4 - Enemy 11 (Togezo)", "Sand Canyon 4 - Enemy 12 (Rocky)", "Sand Canyon 4 - Enemy 13 (Bobo)", "Sand Canyon 4 - Star 16", "Sand Canyon 4 - Star 17", "Sand Canyon 4 - Star 18", "Sand Canyon 4 - Star 19", "Sand Canyon 4 - Star 20", "Sand Canyon 4 - Star 21", "Sand Canyon 4 - Star 22", "Sand Canyon 4 - Star 23", "Sand Canyon 4 - 1-Up (Clean)", "Sand Canyon 4 - Maxim Tomato (Needle)"], "music": 18}, {"name": "Sand Canyon 4 - 8", "level": 3, "stage": 4, "room": 8, "pointer": 3002086, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[17, 19], [42, 19]], "locations": ["Sand Canyon 4 - Donbe & Hikari"], "music": 8}, {"name": "Sand Canyon 4 - 9", "level": 3, "stage": 4, "room": 9, "pointer": 2885774, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 4 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 0", "level": 3, "stage": 5, "room": 0, "pointer": 3662486, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 450, "x": 2256, "y": 232, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Falling Block)"}], "consumables_pointer": 208, "enemies": ["Wapod", "Dogon", "Tick"], "default_exits": [{"room": 3, "unkn1": 151, "unkn2": 15, "x": 184, "y": 56, "name": "Sand Canyon 5 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 83, "unkn2": 16, "x": 72, "y": 120, "name": "Sand Canyon 5 - 0 Exit 1", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [0, 22], [14, 23], [90, 16], [88, 16]], "locations": ["Sand Canyon 5 - Enemy 1 (Wapod)", "Sand Canyon 5 - Enemy 2 (Dogon)", "Sand Canyon 5 - Enemy 3 (Tick)", "Sand Canyon 5 - Star 1", "Sand Canyon 5 - Star 2", "Sand Canyon 5 - Star 3", "Sand Canyon 5 - Star 4", "Sand Canyon 5 - Star 5", "Sand Canyon 5 - Star 6", "Sand Canyon 5 - Star 7", "Sand Canyon 5 - Star 8", "Sand Canyon 5 - Star 9", "Sand Canyon 5 - Star 10", "Sand Canyon 5 - 1-Up (Falling Block)"], "music": 13}, {"name": "Sand Canyon 5 - 1", "level": 3, "stage": 5, "room": 1, "pointer": 3052622, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "Bobo", "Chilly", "Sparky", "Togezo"], "default_exits": [{"room": 9, "unkn1": 6, "unkn2": 9, "x": 216, "y": 1128, "name": "Sand Canyon 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [6, 16], [3, 16], [8, 16], [18, 16]], "locations": ["Sand Canyon 5 - Enemy 4 (Rocky)", "Sand Canyon 5 - Enemy 5 (Bobo)", "Sand Canyon 5 - Enemy 6 (Chilly)", "Sand Canyon 5 - Enemy 7 (Sparky)", "Sand Canyon 5 - Enemy 8 (Togezo)"], "music": 13}, {"name": "Sand Canyon 5 - 2", "level": 3, "stage": 5, "room": 2, "pointer": 3057544, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 3, "unkn2": 7, "x": 1320, "y": 264, "name": "Sand Canyon 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 1"], "music": 40}, {"name": "Sand Canyon 5 - 3", "level": 3, "stage": 5, "room": 3, "pointer": 3419011, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 192, "x": 56, "y": 648, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 2)"}, {"idx": 14, "pointer": 200, "x": 56, "y": 664, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 3)"}, {"idx": 15, "pointer": 208, "x": 56, "y": 632, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 1)"}, {"idx": 12, "pointer": 368, "x": 320, "y": 264, "etype": 22, "vtype": 2, "name": "Sand Canyon 5 - Maxim Tomato (Pit)"}], "consumables_pointer": 304, "enemies": ["Bronto Burt", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 66, "x": 88, "y": 88, "name": "Sand Canyon 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [30, 16], [2, 16], [0, 22], [2, 22], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 9 (Bronto Burt)", "Sand Canyon 5 - Enemy 10 (Sasuke)", "Sand Canyon 5 - Star 11", "Sand Canyon 5 - Star 12", "Sand Canyon 5 - Star 13", "Sand Canyon 5 - Star 14", "Sand Canyon 5 - Star 15", "Sand Canyon 5 - Star 16", "Sand Canyon 5 - Star 17", "Sand Canyon 5 - 1-Up (Ice 2)", "Sand Canyon 5 - 1-Up (Ice 3)", "Sand Canyon 5 - 1-Up (Ice 1)", "Sand Canyon 5 - Maxim Tomato (Pit)"], "music": 13}, {"name": "Sand Canyon 5 - 4", "level": 3, "stage": 5, "room": 4, "pointer": 3644149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro", "Galbo", "Nidoo"], "default_exits": [{"room": 5, "unkn1": 76, "unkn2": 9, "x": 88, "y": 120, "name": "Sand Canyon 5 - 4 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 116, "unkn2": 14, "x": 200, "y": 1256, "name": "Sand Canyon 5 - 4 Exit 1", "access_rule": []}], "entity_load": [[54, 16], [26, 16], [28, 16], [25, 16], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 11 (Oro)", "Sand Canyon 5 - Enemy 12 (Galbo)", "Sand Canyon 5 - Enemy 13 (Nidoo)", "Sand Canyon 5 - Star 18"], "music": 13}, {"name": "Sand Canyon 5 - 5", "level": 3, "stage": 5, "room": 5, "pointer": 3044100, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 7, "x": 1240, "y": 152, "name": "Sand Canyon 5 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 2"], "music": 39}, {"name": "Sand Canyon 5 - 6", "level": 3, "stage": 5, "room": 6, "pointer": 3373481, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 25, "unkn2": 5, "x": 56, "y": 152, "name": "Sand Canyon 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [31, 16], [89, 16], [6, 16]], "locations": ["Sand Canyon 5 - Enemy 14 (Propeller)"], "music": 13}, {"name": "Sand Canyon 5 - 7", "level": 3, "stage": 5, "room": 7, "pointer": 2964028, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[18, 19], [42, 19]], "locations": ["Sand Canyon 5 - Nyupun"], "music": 8}, {"name": "Sand Canyon 5 - 8", "level": 3, "stage": 5, "room": 8, "pointer": 2890112, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 5 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 9", "level": 3, "stage": 5, "room": 9, "pointer": 3647264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "KeKe", "Kabu"], "default_exits": [{"room": 6, "unkn1": 12, "unkn2": 6, "x": 72, "y": 760, "name": "Sand Canyon 5 - 9 Exit 0", "access_rule": ["Cutter"]}, {"room": 1, "unkn1": 12, "unkn2": 70, "x": 120, "y": 152, "name": "Sand Canyon 5 - 9 Exit 1", "access_rule": []}], "entity_load": [[27, 16], [61, 16], [4, 22], [14, 23], [51, 16], [19, 16]], "locations": ["Sand Canyon 5 - Enemy 15 (Sir Kibble)", "Sand Canyon 5 - Enemy 16 (KeKe)", "Sand Canyon 5 - Enemy 17 (Kabu)", "Sand Canyon 5 - Star 19", "Sand Canyon 5 - Star 20", "Sand Canyon 5 - Star 21", "Sand Canyon 5 - Star 22", "Sand Canyon 5 - Star 23", "Sand Canyon 5 - Star 24", "Sand Canyon 5 - Star 25", "Sand Canyon 5 - Star 26", "Sand Canyon 5 - Star 27", "Sand Canyon 5 - Star 28", "Sand Canyon 5 - Star 29", "Sand Canyon 5 - Star 30", "Sand Canyon 5 - Star 31", "Sand Canyon 5 - Star 32", "Sand Canyon 5 - Star 33", "Sand Canyon 5 - Star 34", "Sand Canyon 5 - Star 35", "Sand Canyon 5 - Star 36", "Sand Canyon 5 - Star 37", "Sand Canyon 5 - Star 38", "Sand Canyon 5 - Star 39", "Sand Canyon 5 - Star 40"], "music": 13}, {"name": "Sand Canyon 6 - 0", "level": 3, "stage": 6, "room": 0, "pointer": 3314761, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Doka", "Cappy", "Pteran"], "default_exits": [{"room": 2, "unkn1": 132, "unkn2": 16, "x": 56, "y": 136, "name": "Sand Canyon 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [35, 16], [39, 16], [12, 16]], "locations": ["Sand Canyon 6 - Enemy 1 (Sparky)", "Sand Canyon 6 - Enemy 2 (Doka)", "Sand Canyon 6 - Enemy 3 (Cappy)", "Sand Canyon 6 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Sand Canyon 6 - 1", "level": 3, "stage": 6, "room": 1, "pointer": 2976913, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 24, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 1", "Sand Canyon 6 - Animal 2", "Sand Canyon 6 - Animal 3"], "music": 39}, {"name": "Sand Canyon 6 - 2", "level": 3, "stage": 6, "room": 2, "pointer": 2978757, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 55, "unkn2": 6, "x": 104, "y": 104, "name": "Sand Canyon 6 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 3", "level": 3, "stage": 6, "room": 3, "pointer": 3178082, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 3 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 3 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 3 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 3 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 3 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 3 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 4", "level": 3, "stage": 6, "room": 4, "pointer": 3181563, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 4 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 4 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 4 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 4 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 4 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 4 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 5", "level": 3, "stage": 6, "room": 5, "pointer": 3177209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 5 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 5 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 5 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 5 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 5 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 5 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 6", "level": 3, "stage": 6, "room": 6, "pointer": 3183291, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 6 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 6 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 6 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 6 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 6 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 6 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 7", "level": 3, "stage": 6, "room": 7, "pointer": 3175453, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 7 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 7 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 7 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 7 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 7 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 7 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 8", "level": 3, "stage": 6, "room": 8, "pointer": 3179826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 8 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 8 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 8 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 8 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 8 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 8 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 9", "level": 3, "stage": 6, "room": 9, "pointer": 3176334, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 9 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 9 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 9 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 9 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 9 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 9 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 10", "level": 3, "stage": 6, "room": 10, "pointer": 3178954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 10 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 10 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 10 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 10 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 10 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 10 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 11", "level": 3, "stage": 6, "room": 11, "pointer": 2989149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 37, "unkn2": 6, "x": 88, "y": 264, "name": "Sand Canyon 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[59, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 12", "level": 3, "stage": 6, "room": 12, "pointer": 3015947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 8, "x": 440, "y": 264, "name": "Sand Canyon 6 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 86, "unkn2": 8, "x": 72, "y": 104, "name": "Sand Canyon 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[64, 16], [59, 16], [55, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 13", "level": 3, "stage": 6, "room": 13, "pointer": 2976539, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 55, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 6 - 13 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 14", "level": 3, "stage": 6, "room": 14, "pointer": 3030336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 5, "unkn2": 9, "x": 200, "y": 152, "name": "Sand Canyon 6 - 14 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 35, "unkn2": 9, "x": 152, "y": 392, "name": "Sand Canyon 6 - 14 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 15", "level": 3, "stage": 6, "room": 15, "pointer": 2972361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 13, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 16", "level": 3, "stage": 6, "room": 16, "pointer": 2953186, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 16 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 16 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 17", "level": 3, "stage": 6, "room": 17, "pointer": 2953633, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 17 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 17 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 18", "level": 3, "stage": 6, "room": 18, "pointer": 2991707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 14, "unkn2": 9, "x": 184, "y": 312, "name": "Sand Canyon 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 19", "level": 3, "stage": 6, "room": 19, "pointer": 2974651, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 5, "unkn2": 9, "x": 376, "y": 392, "name": "Sand Canyon 6 - 19 Exit 0", "access_rule": []}, {"room": 20, "unkn1": 35, "unkn2": 9, "x": 88, "y": 152, "name": "Sand Canyon 6 - 19 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 20", "level": 3, "stage": 6, "room": 20, "pointer": 2969638, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 4, "unkn2": 9, "x": 552, "y": 152, "name": "Sand Canyon 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 21", "level": 3, "stage": 6, "room": 21, "pointer": 2976163, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 9, "unkn2": 13, "x": 296, "y": 216, "name": "Sand Canyon 6 - 21 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 4", "Sand Canyon 6 - Animal 5", "Sand Canyon 6 - Animal 6"], "music": 40}, {"name": "Sand Canyon 6 - 22", "level": 3, "stage": 6, "room": 22, "pointer": 2950938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 38, "unkn1": 14, "unkn2": 8, "x": 168, "y": 376, "name": "Sand Canyon 6 - 22 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 9, "unkn2": 13, "x": 376, "y": 216, "name": "Sand Canyon 6 - 22 Exit 1", "access_rule": []}, {"room": 21, "unkn1": 19, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 22 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 23", "level": 3, "stage": 6, "room": 23, "pointer": 3311993, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 43, "unkn1": 145, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 24", "level": 3, "stage": 6, "room": 24, "pointer": 3079078, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 39, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 24 Exit 0", "access_rule": []}, {"room": 25, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 24 Exit 1", "access_rule": []}, {"room": 39, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 24 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 25", "level": 3, "stage": 6, "room": 25, "pointer": 3065898, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 25 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 25 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 25 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 26", "level": 3, "stage": 6, "room": 26, "pointer": 3063347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 26 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 26 Exit 1", "access_rule": []}, {"room": 27, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 26 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 27", "level": 3, "stage": 6, "room": 27, "pointer": 3066916, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 28, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 27 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 27 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 27 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 28", "level": 3, "stage": 6, "room": 28, "pointer": 3067425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 28 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 11, "unkn2": 8, "x": 184, "y": 344, "name": "Sand Canyon 6 - 28 Exit 1", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 28 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 29", "level": 3, "stage": 6, "room": 29, "pointer": 2950032, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 30, "unkn1": 11, "unkn2": 8, "x": 168, "y": 136, "name": "Sand Canyon 6 - 29 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 30", "level": 3, "stage": 6, "room": 30, "pointer": 2986500, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 10, "unkn2": 44, "x": 136, "y": 152, "name": "Sand Canyon 6 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 31", "level": 3, "stage": 6, "room": 31, "pointer": 3070930, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 31 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 648, "name": "Sand Canyon 6 - 31 Exit 1", "access_rule": []}, {"room": 32, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 31 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 32", "level": 3, "stage": 6, "room": 32, "pointer": 3054817, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Parasol)", "Bukiset (Cutter)"], "default_exits": [{"room": 33, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 32 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 536, "name": "Sand Canyon 6 - 32 Exit 1", "access_rule": []}, {"room": 33, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 32 Exit 2", "access_rule": []}], "entity_load": [[81, 16], [83, 16]], "locations": ["Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))"], "music": 14}, {"name": "Sand Canyon 6 - 33", "level": 3, "stage": 6, "room": 33, "pointer": 3053173, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Clean)", "Bukiset (Spark)"], "default_exits": [{"room": 34, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 33 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 440, "name": "Sand Canyon 6 - 33 Exit 1", "access_rule": []}, {"room": 34, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 33 Exit 2", "access_rule": []}], "entity_load": [[80, 16], [82, 16]], "locations": ["Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))"], "music": 14}, {"name": "Sand Canyon 6 - 34", "level": 3, "stage": 6, "room": 34, "pointer": 3053721, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)"], "default_exits": [{"room": 35, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 34 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 344, "name": "Sand Canyon 6 - 34 Exit 1", "access_rule": []}, {"room": 35, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 34 Exit 2", "access_rule": []}], "entity_load": [[79, 16], [78, 16]], "locations": ["Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))"], "music": 14}, {"name": "Sand Canyon 6 - 35", "level": 3, "stage": 6, "room": 35, "pointer": 3054269, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)"], "default_exits": [{"room": 37, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 35 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 248, "name": "Sand Canyon 6 - 35 Exit 1", "access_rule": []}, {"room": 37, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 35 Exit 2", "access_rule": []}], "entity_load": [[77, 16], [76, 16]], "locations": ["Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))"], "music": 14}, {"name": "Sand Canyon 6 - 36", "level": 3, "stage": 6, "room": 36, "pointer": 2986164, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 10, "unkn2": 44, "x": 392, "y": 152, "name": "Sand Canyon 6 - 36 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 37", "level": 3, "stage": 6, "room": 37, "pointer": 3074377, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 152, "name": "Sand Canyon 6 - 37 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 38", "level": 3, "stage": 6, "room": 38, "pointer": 2971589, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 10, "unkn2": 5, "x": 264, "y": 440, "name": "Sand Canyon 6 - 38 Exit 0", "access_rule": []}, {"room": 22, "unkn1": 10, "unkn2": 23, "x": 248, "y": 136, "name": "Sand Canyon 6 - 38 Exit 1", "access_rule": []}], "entity_load": [[76, 16], [77, 16], [78, 16], [79, 16], [80, 16], [81, 16], [82, 16], [83, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 39", "level": 3, "stage": 6, "room": 39, "pointer": 3063858, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 40, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 39 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 39 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 39 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 40", "level": 3, "stage": 6, "room": 40, "pointer": 3064368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 40 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 40 Exit 1", "access_rule": []}, {"room": 41, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 40 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 41", "level": 3, "stage": 6, "room": 41, "pointer": 3064878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 42, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 41 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 41 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 41 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 42", "level": 3, "stage": 6, "room": 42, "pointer": 3068939, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 42 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 42 Exit 1", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Sand Canyon 6 - Enemy 13 (Nidoo)"], "music": 14}, {"name": "Sand Canyon 6 - 43", "level": 3, "stage": 6, "room": 43, "pointer": 2988495, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 44, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 6 - 43 Exit 0", "access_rule": []}], "entity_load": [[19, 19], [42, 19]], "locations": ["Sand Canyon 6 - Professor Hector & R.O.B"], "music": 8}, {"name": "Sand Canyon 6 - 44", "level": 3, "stage": 6, "room": 44, "pointer": 2886979, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 6 - Complete"], "music": 5}, {"name": "Sand Canyon Boss - 0", "level": 3, "stage": 7, "room": 0, "pointer": 2991389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[6, 18]], "locations": ["Sand Canyon - Boss (Pon & Con) Purified", "Level 3 Boss - Defeated", "Level 3 Boss - Purified"], "music": 2}, {"name": "Cloudy Park 1 - 0", "level": 4, "stage": 1, "room": 0, "pointer": 3172795, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "KeKe", "Cappy"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 5, "x": 56, "y": 152, "name": "Cloudy Park 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [12, 16], [51, 16], [1, 23], [0, 23]], "locations": ["Cloudy Park 1 - Enemy 1 (Waddle Dee)", "Cloudy Park 1 - Enemy 2 (KeKe)", "Cloudy Park 1 - Enemy 3 (Cappy)"], "music": 17}, {"name": "Cloudy Park 1 - 1", "level": 4, "stage": 1, "room": 1, "pointer": 3078163, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 88, "y": 424, "name": "Cloudy Park 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 1"], "music": 39}, {"name": "Cloudy Park 1 - 2", "level": 4, "stage": 1, "room": 2, "pointer": 3285882, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Togezo"], "default_exits": [{"room": 3, "unkn1": 95, "unkn2": 8, "x": 40, "y": 104, "name": "Cloudy Park 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [4, 16], [18, 16], [6, 23]], "locations": ["Cloudy Park 1 - Enemy 4 (Yaban)", "Cloudy Park 1 - Enemy 5 (Togezo)"], "music": 17}, {"name": "Cloudy Park 1 - 3", "level": 4, "stage": 1, "room": 3, "pointer": 3062831, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 15, "unkn2": 6, "x": 56, "y": 264, "name": "Cloudy Park 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 2"], "music": 39}, {"name": "Cloudy Park 1 - 4", "level": 4, "stage": 1, "room": 4, "pointer": 3396729, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 92, "unkn2": 16, "x": 56, "y": 152, "name": "Cloudy Park 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [0, 16], [14, 23], [68, 16], [26, 16], [4, 22]], "locations": ["Cloudy Park 1 - Enemy 6 (Galbo)", "Cloudy Park 1 - Star 1"], "music": 17}, {"name": "Cloudy Park 1 - 5", "level": 4, "stage": 1, "room": 5, "pointer": 3038805, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 6, "unkn2": 5, "x": 2344, "y": 232, "name": "Cloudy Park 1 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 3", "Cloudy Park 1 - Animal 4"], "music": 39}, {"name": "Cloudy Park 1 - 6", "level": 4, "stage": 1, "room": 6, "pointer": 3535736, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Como"], "default_exits": [{"room": 8, "unkn1": 5, "unkn2": 8, "x": 72, "y": 104, "name": "Cloudy Park 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [14, 23], [0, 16], [41, 16], [8, 16]], "locations": ["Cloudy Park 1 - Enemy 7 (Sparky)", "Cloudy Park 1 - Enemy 8 (Como)", "Cloudy Park 1 - Star 2"], "music": 17}, {"name": "Cloudy Park 1 - 7", "level": 4, "stage": 1, "room": 7, "pointer": 2954080, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 6, "x": 88, "y": 104, "name": "Cloudy Park 1 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 5"], "music": 39}, {"name": "Cloudy Park 1 - 8", "level": 4, "stage": 1, "room": 8, "pointer": 3465407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt"], "default_exits": [{"room": 12, "unkn1": 181, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 1 - 8 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [2, 16], [51, 16], [1, 23], [14, 23]], "locations": ["Cloudy Park 1 - Enemy 9 (Bronto Burt)", "Cloudy Park 1 - Star 3", "Cloudy Park 1 - Star 4", "Cloudy Park 1 - Star 5", "Cloudy Park 1 - Star 6", "Cloudy Park 1 - Star 7", "Cloudy Park 1 - Star 8", "Cloudy Park 1 - Star 9", "Cloudy Park 1 - Star 10", "Cloudy Park 1 - Star 11"], "music": 17}, {"name": "Cloudy Park 1 - 9", "level": 4, "stage": 1, "room": 9, "pointer": 3078621, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 56, "y": 264, "name": "Cloudy Park 1 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 6"], "music": 39}, {"name": "Cloudy Park 1 - 10", "level": 4, "stage": 1, "room": 10, "pointer": 3281366, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Sir Kibble"], "default_exits": [{"room": 9, "unkn1": 99, "unkn2": 8, "x": 56, "y": 152, "name": "Cloudy Park 1 - 10 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [24, 16], [27, 16], [4, 23]], "locations": ["Cloudy Park 1 - Enemy 10 (Gabon)", "Cloudy Park 1 - Enemy 11 (Sir Kibble)"], "music": 17}, {"name": "Cloudy Park 1 - 11", "level": 4, "stage": 1, "room": 11, "pointer": 3519608, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 192, "x": 216, "y": 600, "etype": 22, "vtype": 0, "name": "Cloudy Park 1 - 1-Up (Shotzo)"}, {"idx": 18, "pointer": 456, "x": 856, "y": 408, "etype": 22, "vtype": 2, "name": "Cloudy Park 1 - Maxim Tomato (Mariel)"}], "consumables_pointer": 352, "enemies": ["Mariel", "Nruff"], "default_exits": [{"room": 5, "unkn1": 64, "unkn2": 6, "x": 104, "y": 216, "name": "Cloudy Park 1 - 11 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [27, 16], [15, 16], [45, 16], [14, 23], [2, 22], [0, 22], [6, 22]], "locations": ["Cloudy Park 1 - Enemy 12 (Mariel)", "Cloudy Park 1 - Enemy 13 (Nruff)", "Cloudy Park 1 - Star 12", "Cloudy Park 1 - Star 13", "Cloudy Park 1 - Star 14", "Cloudy Park 1 - Star 15", "Cloudy Park 1 - Star 16", "Cloudy Park 1 - Star 17", "Cloudy Park 1 - Star 18", "Cloudy Park 1 - Star 19", "Cloudy Park 1 - Star 20", "Cloudy Park 1 - Star 21", "Cloudy Park 1 - Star 22", "Cloudy Park 1 - Star 23", "Cloudy Park 1 - 1-Up (Shotzo)", "Cloudy Park 1 - Maxim Tomato (Mariel)"], "music": 17}, {"name": "Cloudy Park 1 - 12", "level": 4, "stage": 1, "room": 12, "pointer": 2958914, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 1 - 12 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [42, 19]], "locations": ["Cloudy Park 1 - Hibanamodoki"], "music": 8}, {"name": "Cloudy Park 1 - 13", "level": 4, "stage": 1, "room": 13, "pointer": 2886015, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 1 - Complete"], "music": 5}, {"name": "Cloudy Park 2 - 0", "level": 4, "stage": 2, "room": 0, "pointer": 3142443, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly", "Sasuke"], "default_exits": [{"room": 6, "unkn1": 96, "unkn2": 7, "x": 56, "y": 88, "name": "Cloudy Park 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16], [30, 16], [6, 16], [14, 23]], "locations": ["Cloudy Park 2 - Enemy 1 (Chilly)", "Cloudy Park 2 - Enemy 2 (Sasuke)", "Cloudy Park 2 - Star 1", "Cloudy Park 2 - Star 2", "Cloudy Park 2 - Star 3", "Cloudy Park 2 - Star 4", "Cloudy Park 2 - Star 5", "Cloudy Park 2 - Star 6"], "music": 19}, {"name": "Cloudy Park 2 - 1", "level": 4, "stage": 2, "room": 1, "pointer": 3235925, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Broom Hatter"], "default_exits": [{"room": 2, "unkn1": 146, "unkn2": 5, "x": 88, "y": 88, "name": "Cloudy Park 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [8, 16], [11, 16]], "locations": ["Cloudy Park 2 - Enemy 3 (Waddle Dee)", "Cloudy Park 2 - Enemy 4 (Sparky)", "Cloudy Park 2 - Enemy 5 (Broom Hatter)", "Cloudy Park 2 - Star 7", "Cloudy Park 2 - Star 8", "Cloudy Park 2 - Star 9", "Cloudy Park 2 - Star 10", "Cloudy Park 2 - Star 11", "Cloudy Park 2 - Star 12", "Cloudy Park 2 - Star 13", "Cloudy Park 2 - Star 14", "Cloudy Park 2 - Star 15"], "music": 19}, {"name": "Cloudy Park 2 - 2", "level": 4, "stage": 2, "room": 2, "pointer": 3297758, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Pteran"], "default_exits": [{"room": 3, "unkn1": 147, "unkn2": 8, "x": 72, "y": 136, "name": "Cloudy Park 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[27, 16], [39, 16], [1, 23]], "locations": ["Cloudy Park 2 - Enemy 6 (Sir Kibble)", "Cloudy Park 2 - Enemy 7 (Pteran)"], "music": 19}, {"name": "Cloudy Park 2 - 3", "level": 4, "stage": 2, "room": 3, "pointer": 3341087, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Dogon"], "default_exits": [{"room": 4, "unkn1": 145, "unkn2": 12, "x": 72, "y": 136, "name": "Cloudy Park 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[4, 16], [14, 23], [90, 16], [89, 16]], "locations": ["Cloudy Park 2 - Enemy 8 (Propeller)", "Cloudy Park 2 - Enemy 9 (Dogon)", "Cloudy Park 2 - Star 16", "Cloudy Park 2 - Star 17", "Cloudy Park 2 - Star 18", "Cloudy Park 2 - Star 19", "Cloudy Park 2 - Star 20", "Cloudy Park 2 - Star 21", "Cloudy Park 2 - Star 22", "Cloudy Park 2 - Star 23", "Cloudy Park 2 - Star 24", "Cloudy Park 2 - Star 25", "Cloudy Park 2 - Star 26", "Cloudy Park 2 - Star 27", "Cloudy Park 2 - Star 28", "Cloudy Park 2 - Star 29", "Cloudy Park 2 - Star 30", "Cloudy Park 2 - Star 31", "Cloudy Park 2 - Star 32", "Cloudy Park 2 - Star 33", "Cloudy Park 2 - Star 34", "Cloudy Park 2 - Star 35", "Cloudy Park 2 - Star 36", "Cloudy Park 2 - Star 37"], "music": 19}, {"name": "Cloudy Park 2 - 4", "level": 4, "stage": 2, "room": 4, "pointer": 3457404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Oro", "Bronto Burt", "Rocky"], "default_exits": [{"room": 5, "unkn1": 165, "unkn2": 5, "x": 72, "y": 104, "name": "Cloudy Park 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [3, 16], [14, 23], [18, 16], [25, 16]], "locations": ["Cloudy Park 2 - Enemy 10 (Togezo)", "Cloudy Park 2 - Enemy 11 (Oro)", "Cloudy Park 2 - Enemy 12 (Bronto Burt)", "Cloudy Park 2 - Enemy 13 (Rocky)", "Cloudy Park 2 - Star 38", "Cloudy Park 2 - Star 39", "Cloudy Park 2 - Star 40", "Cloudy Park 2 - Star 41", "Cloudy Park 2 - Star 42", "Cloudy Park 2 - Star 43", "Cloudy Park 2 - Star 44", "Cloudy Park 2 - Star 45", "Cloudy Park 2 - Star 46", "Cloudy Park 2 - Star 47"], "music": 19}, {"name": "Cloudy Park 2 - 5", "level": 4, "stage": 2, "room": 5, "pointer": 3273878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Kapar"], "default_exits": [{"room": 7, "unkn1": 96, "unkn2": 8, "x": 56, "y": 88, "name": "Cloudy Park 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [62, 16], [26, 16], [67, 16]], "locations": ["Cloudy Park 2 - Enemy 14 (Galbo)", "Cloudy Park 2 - Enemy 15 (Kapar)", "Cloudy Park 2 - Star 48", "Cloudy Park 2 - Star 49", "Cloudy Park 2 - Star 50", "Cloudy Park 2 - Star 51", "Cloudy Park 2 - Star 52", "Cloudy Park 2 - Star 53", "Cloudy Park 2 - Star 54"], "music": 19}, {"name": "Cloudy Park 2 - 6", "level": 4, "stage": 2, "room": 6, "pointer": 2984453, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 25, "unkn2": 5, "x": 72, "y": 152, "name": "Cloudy Park 2 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 2 - Animal 1", "Cloudy Park 2 - Animal 2", "Cloudy Park 2 - Animal 3"], "music": 38}, {"name": "Cloudy Park 2 - 7", "level": 4, "stage": 2, "room": 7, "pointer": 2985482, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 5, "x": 40, "y": 88, "name": "Cloudy Park 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[22, 19]], "locations": [], "music": 19}, {"name": "Cloudy Park 2 - 8", "level": 4, "stage": 2, "room": 8, "pointer": 2990753, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[22, 19], [42, 19]], "locations": ["Cloudy Park 2 - Piyo & Keko"], "music": 8}, {"name": "Cloudy Park 2 - 9", "level": 4, "stage": 2, "room": 9, "pointer": 2889630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 2 - Complete"], "music": 5}, {"name": "Cloudy Park 3 - 0", "level": 4, "stage": 3, "room": 0, "pointer": 3100859, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Mopoo", "Poppy Bros Jr."], "default_exits": [{"room": 2, "unkn1": 145, "unkn2": 8, "x": 56, "y": 136, "name": "Cloudy Park 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [74, 16], [47, 16], [7, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 1 (Bronto Burt)", "Cloudy Park 3 - Enemy 2 (Mopoo)", "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)", "Cloudy Park 3 - Star 1", "Cloudy Park 3 - Star 2", "Cloudy Park 3 - Star 3", "Cloudy Park 3 - Star 4", "Cloudy Park 3 - Star 5", "Cloudy Park 3 - Star 6", "Cloudy Park 3 - Star 7"], "music": 15}, {"name": "Cloudy Park 3 - 1", "level": 4, "stage": 3, "room": 1, "pointer": 3209719, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como"], "default_exits": [{"room": 5, "unkn1": 13, "unkn2": 14, "x": 56, "y": 152, "name": "Cloudy Park 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [4, 22], [41, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 4 (Como)", "Cloudy Park 3 - Star 8", "Cloudy Park 3 - Star 9"], "music": 15}, {"name": "Cloudy Park 3 - 2", "level": 4, "stage": 3, "room": 2, "pointer": 3216185, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Bobin", "Loud", "Kapar"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 6, "x": 216, "y": 1064, "name": "Cloudy Park 3 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 24, "unkn2": 14, "x": 104, "y": 152, "name": "Cloudy Park 3 - 2 Exit 1", "access_rule": []}], "entity_load": [[67, 16], [40, 16], [73, 16], [14, 23], [16, 16]], "locations": ["Cloudy Park 3 - Enemy 5 (Glunk)", "Cloudy Park 3 - Enemy 6 (Bobin)", "Cloudy Park 3 - Enemy 7 (Loud)", "Cloudy Park 3 - Enemy 8 (Kapar)", "Cloudy Park 3 - Star 10", "Cloudy Park 3 - Star 11", "Cloudy Park 3 - Star 12", "Cloudy Park 3 - Star 13", "Cloudy Park 3 - Star 14", "Cloudy Park 3 - Star 15", "Cloudy Park 3 - Star 16"], "music": 15}, {"name": "Cloudy Park 3 - 3", "level": 4, "stage": 3, "room": 3, "pointer": 2994208, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 5, "unkn2": 9, "x": 408, "y": 232, "name": "Cloudy Park 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 3 - Animal 1", "Cloudy Park 3 - Animal 2", "Cloudy Park 3 - Animal 3"], "music": 40}, {"name": "Cloudy Park 3 - 4", "level": 4, "stage": 3, "room": 4, "pointer": 3229151, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Batamon", "Bouncy"], "default_exits": [{"room": 6, "unkn1": 156, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 126, "unkn2": 9, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 1", "access_rule": []}], "entity_load": [[7, 16], [26, 16], [14, 23], [13, 16], [68, 16]], "locations": ["Cloudy Park 3 - Enemy 9 (Galbo)", "Cloudy Park 3 - Enemy 10 (Batamon)", "Cloudy Park 3 - Enemy 11 (Bouncy)", "Cloudy Park 3 - Star 17", "Cloudy Park 3 - Star 18", "Cloudy Park 3 - Star 19", "Cloudy Park 3 - Star 20", "Cloudy Park 3 - Star 21", "Cloudy Park 3 - Star 22"], "music": 15}, {"name": "Cloudy Park 3 - 5", "level": 4, "stage": 3, "room": 5, "pointer": 2969244, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": [], "music": 31}, {"name": "Cloudy Park 3 - 6", "level": 4, "stage": 3, "room": 6, "pointer": 4128530, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": ["Cloudy Park 3 - Mr. Ball"], "music": 8}, {"name": "Cloudy Park 3 - 7", "level": 4, "stage": 3, "room": 7, "pointer": 2885051, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 3 - Complete"], "music": 5}, {"name": "Cloudy Park 4 - 0", "level": 4, "stage": 4, "room": 0, "pointer": 3072905, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[4, 23], [1, 23], [0, 23], [31, 16]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 1", "level": 4, "stage": 4, "room": 1, "pointer": 3074863, "animal_pointers": [208, 224], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 21, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 4 - Animal 1", "Cloudy Park 4 - Animal 2"], "music": 38}, {"name": "Cloudy Park 4 - 2", "level": 4, "stage": 4, "room": 2, "pointer": 3309209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Como", "Wapod", "Cappy"], "default_exits": [{"room": 3, "unkn1": 145, "unkn2": 9, "x": 104, "y": 152, "name": "Cloudy Park 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [24, 16], [12, 16], [14, 23], [41, 16], [4, 22]], "locations": ["Cloudy Park 4 - Enemy 1 (Gabon)", "Cloudy Park 4 - Enemy 2 (Como)", "Cloudy Park 4 - Enemy 3 (Wapod)", "Cloudy Park 4 - Enemy 4 (Cappy)", "Cloudy Park 4 - Star 1", "Cloudy Park 4 - Star 2", "Cloudy Park 4 - Star 3", "Cloudy Park 4 - Star 4", "Cloudy Park 4 - Star 5", "Cloudy Park 4 - Star 6", "Cloudy Park 4 - Star 7", "Cloudy Park 4 - Star 8", "Cloudy Park 4 - Star 9", "Cloudy Park 4 - Star 10", "Cloudy Park 4 - Star 11", "Cloudy Park 4 - Star 12"], "music": 21}, {"name": "Cloudy Park 4 - 3", "level": 4, "stage": 4, "room": 3, "pointer": 3296291, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 776, "x": 1880, "y": 152, "etype": 22, "vtype": 0, "name": "Cloudy Park 4 - 1-Up (Windy)"}, {"idx": 34, "pointer": 912, "x": 2160, "y": 152, "etype": 22, "vtype": 2, "name": "Cloudy Park 4 - Maxim Tomato (Windy)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Togezo"], "default_exits": [{"room": 5, "unkn1": 144, "unkn2": 9, "x": 56, "y": 136, "name": "Cloudy Park 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[18, 16], [8, 16], [31, 16], [14, 23], [4, 22], [4, 16], [0, 22], [2, 22]], "locations": ["Cloudy Park 4 - Enemy 5 (Sparky)", "Cloudy Park 4 - Enemy 6 (Togezo)", "Cloudy Park 4 - Star 13", "Cloudy Park 4 - Star 14", "Cloudy Park 4 - Star 15", "Cloudy Park 4 - Star 16", "Cloudy Park 4 - Star 17", "Cloudy Park 4 - Star 18", "Cloudy Park 4 - Star 19", "Cloudy Park 4 - Star 20", "Cloudy Park 4 - Star 21", "Cloudy Park 4 - Star 22", "Cloudy Park 4 - Star 23", "Cloudy Park 4 - Star 24", "Cloudy Park 4 - Star 25", "Cloudy Park 4 - Star 26", "Cloudy Park 4 - Star 27", "Cloudy Park 4 - Star 28", "Cloudy Park 4 - Star 29", "Cloudy Park 4 - Star 30", "Cloudy Park 4 - 1-Up (Windy)", "Cloudy Park 4 - Maxim Tomato (Windy)"], "music": 21}, {"name": "Cloudy Park 4 - 4", "level": 4, "stage": 4, "room": 4, "pointer": 3330996, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "KeKe", "Bouncy"], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 15, "x": 72, "y": 152, "name": "Cloudy Park 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [51, 16], [17, 16], [14, 23], [2, 16]], "locations": ["Cloudy Park 4 - Enemy 7 (Bronto Burt)", "Cloudy Park 4 - Enemy 8 (KeKe)", "Cloudy Park 4 - Enemy 9 (Bouncy)", "Cloudy Park 4 - Star 31", "Cloudy Park 4 - Star 32", "Cloudy Park 4 - Star 33", "Cloudy Park 4 - Star 34", "Cloudy Park 4 - Star 35", "Cloudy Park 4 - Star 36", "Cloudy Park 4 - Star 37", "Cloudy Park 4 - Star 38"], "music": 21}, {"name": "Cloudy Park 4 - 5", "level": 4, "stage": 4, "room": 5, "pointer": 3332300, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Mariel"], "default_exits": [{"room": 4, "unkn1": 21, "unkn2": 51, "x": 2328, "y": 120, "name": "Cloudy Park 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [46, 16], [27, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 10 (Sir Kibble)", "Cloudy Park 4 - Enemy 11 (Mariel)", "Cloudy Park 4 - Star 39", "Cloudy Park 4 - Star 40", "Cloudy Park 4 - Star 41", "Cloudy Park 4 - Star 42", "Cloudy Park 4 - Star 43"], "music": 21}, {"name": "Cloudy Park 4 - 6", "level": 4, "stage": 4, "room": 6, "pointer": 3253310, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu", "Wappa"], "default_exits": [{"room": 9, "unkn1": 3, "unkn2": 6, "x": 72, "y": 152, "name": "Cloudy Park 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [31, 16], [19, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 12 (Kabu)", "Cloudy Park 4 - Enemy 13 (Wappa)", "Cloudy Park 4 - Star 44", "Cloudy Park 4 - Star 45", "Cloudy Park 4 - Star 46", "Cloudy Park 4 - Star 47", "Cloudy Park 4 - Star 48", "Cloudy Park 4 - Star 49", "Cloudy Park 4 - Star 50"], "music": 21}, {"name": "Cloudy Park 4 - 7", "level": 4, "stage": 4, "room": 7, "pointer": 2967658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 12, "unkn2": 9, "x": 152, "y": 120, "name": "Cloudy Park 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Cloudy Park 4 - Miniboss 1 (Jumper Shoot)"], "music": 4}, {"name": "Cloudy Park 4 - 8", "level": 4, "stage": 4, "room": 8, "pointer": 2981644, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 344, "y": 680, "name": "Cloudy Park 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[24, 19]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 9", "level": 4, "stage": 4, "room": 9, "pointer": 3008001, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[24, 19], [42, 19]], "locations": ["Cloudy Park 4 - Mikarin & Kagami Mocchi"], "music": 8}, {"name": "Cloudy Park 4 - 10", "level": 4, "stage": 4, "room": 10, "pointer": 2888184, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 4 - Complete"], "music": 5}, {"name": "Cloudy Park 5 - 0", "level": 4, "stage": 5, "room": 0, "pointer": 3192630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Sir Kibble", "Cappy", "Wappa"], "default_exits": [{"room": 1, "unkn1": 146, "unkn2": 6, "x": 168, "y": 616, "name": "Cloudy Park 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [27, 16], [44, 16], [12, 16], [14, 23]], "locations": ["Cloudy Park 5 - Enemy 1 (Yaban)", "Cloudy Park 5 - Enemy 2 (Sir Kibble)", "Cloudy Park 5 - Enemy 3 (Cappy)", "Cloudy Park 5 - Enemy 4 (Wappa)", "Cloudy Park 5 - Star 1", "Cloudy Park 5 - Star 2"], "music": 17}, {"name": "Cloudy Park 5 - 1", "level": 4, "stage": 5, "room": 1, "pointer": 3050956, "animal_pointers": [], "consumables": [{"idx": 5, "pointer": 264, "x": 480, "y": 720, "etype": 22, "vtype": 2, "name": "Cloudy Park 5 - Maxim Tomato (Pillars)"}], "consumables_pointer": 288, "enemies": ["Galbo", "Bronto Burt", "KeKe"], "default_exits": [{"room": 2, "unkn1": 32, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [51, 16], [26, 16], [14, 23], [2, 22]], "locations": ["Cloudy Park 5 - Enemy 5 (Galbo)", "Cloudy Park 5 - Enemy 6 (Bronto Burt)", "Cloudy Park 5 - Enemy 7 (KeKe)", "Cloudy Park 5 - Star 3", "Cloudy Park 5 - Star 4", "Cloudy Park 5 - Star 5", "Cloudy Park 5 - Maxim Tomato (Pillars)"], "music": 17}, {"name": "Cloudy Park 5 - 2", "level": 4, "stage": 5, "room": 2, "pointer": 3604194, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 17, "unkn2": 9, "x": 72, "y": 88, "name": "Cloudy Park 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 5 - Animal 1", "Cloudy Park 5 - Animal 2"], "music": 40}, {"name": "Cloudy Park 5 - 3", "level": 4, "stage": 5, "room": 3, "pointer": 3131242, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Klinko"], "default_exits": [{"room": 4, "unkn1": 98, "unkn2": 5, "x": 72, "y": 120, "name": "Cloudy Park 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [4, 16], [42, 16], [4, 23]], "locations": ["Cloudy Park 5 - Enemy 8 (Propeller)", "Cloudy Park 5 - Enemy 9 (Klinko)"], "music": 17}, {"name": "Cloudy Park 5 - 4", "level": 4, "stage": 5, "room": 4, "pointer": 2990116, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 23, "unkn2": 7, "x": 216, "y": 744, "name": "Cloudy Park 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[88, 16]], "locations": ["Cloudy Park 5 - Enemy 10 (Wapod)"], "music": 17}, {"name": "Cloudy Park 5 - 5", "level": 4, "stage": 5, "room": 5, "pointer": 2975410, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 4, "x": 104, "y": 296, "name": "Cloudy Park 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [2, 16]], "locations": ["Cloudy Park 5 - Star 6"], "music": 17}, {"name": "Cloudy Park 5 - 6", "level": 4, "stage": 5, "room": 6, "pointer": 3173683, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 7, "unkn1": 115, "unkn2": 6, "x": 56, "y": 136, "name": "Cloudy Park 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [1, 23], [39, 16], [70, 16]], "locations": ["Cloudy Park 5 - Enemy 11 (Pteran)"], "music": 17}, {"name": "Cloudy Park 5 - 7", "level": 4, "stage": 5, "room": 7, "pointer": 2992340, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[25, 19], [42, 19]], "locations": ["Cloudy Park 5 - Pick"], "music": 8}, {"name": "Cloudy Park 5 - 8", "level": 4, "stage": 5, "room": 8, "pointer": 2891558, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 5 - Complete"], "music": 5}, {"name": "Cloudy Park 6 - 0", "level": 4, "stage": 6, "room": 0, "pointer": 3269847, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": ["Cloudy Park 6 - Star 1"], "music": 11}, {"name": "Cloudy Park 6 - 1", "level": 4, "stage": 6, "room": 1, "pointer": 3252248, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 3, "unkn2": 25, "x": 72, "y": 72, "name": "Cloudy Park 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [55, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 2", "level": 4, "stage": 6, "room": 2, "pointer": 3028494, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 0, "unkn1": 4, "unkn2": 9, "x": 1032, "y": 152, "name": "Cloudy Park 6 - 2 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 13, "unkn2": 9, "x": 56, "y": 72, "name": "Cloudy Park 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 1 (Madoo)", "Cloudy Park 6 - Star 2", "Cloudy Park 6 - Star 3", "Cloudy Park 6 - Star 4", "Cloudy Park 6 - Star 5"], "music": 11}, {"name": "Cloudy Park 6 - 3", "level": 4, "stage": 6, "room": 3, "pointer": 3131911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 3 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 3 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 3 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 3 Exit 3", "access_rule": []}, {"room": 10, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 3 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 4", "level": 4, "stage": 6, "room": 4, "pointer": 3115416, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick", "Como"], "default_exits": [{"room": 8, "unkn1": 20, "unkn2": 4, "x": 72, "y": 488, "name": "Cloudy Park 6 - 4 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 4 Exit 1", "access_rule": []}, {"room": 11, "unkn1": 8, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 12, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 4 Exit 3", "access_rule": []}, {"room": 11, "unkn1": 16, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 4 Exit 4", "access_rule": []}, {"room": 11, "unkn1": 20, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 4 Exit 5", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [41, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 2 (Tick)", "Cloudy Park 6 - Enemy 3 (Como)", "Cloudy Park 6 - Star 6", "Cloudy Park 6 - Star 7", "Cloudy Park 6 - Star 8"], "music": 11}, {"name": "Cloudy Park 6 - 5", "level": 4, "stage": 6, "room": 5, "pointer": 3245809, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 15, "unkn1": 65, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16], [14, 23], [4, 22]], "locations": ["Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)", "Cloudy Park 6 - Star 9", "Cloudy Park 6 - Star 10", "Cloudy Park 6 - Star 11", "Cloudy Park 6 - Star 12", "Cloudy Park 6 - Star 13"], "music": 11}, {"name": "Cloudy Park 6 - 6", "level": 4, "stage": 6, "room": 6, "pointer": 3237044, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 56, "unkn2": 9, "x": 72, "y": 136, "name": "Cloudy Park 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[89, 16]], "locations": ["Cloudy Park 6 - Enemy 7 (Propeller)"], "music": 11}, {"name": "Cloudy Park 6 - 7", "level": 4, "stage": 6, "room": 7, "pointer": 3262705, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo"], "default_exits": [{"room": 13, "unkn1": 12, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 57, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 64, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 6 - 7 Exit 2", "access_rule": []}], "entity_load": [[74, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 8 (Mopoo)", "Cloudy Park 6 - Star 14", "Cloudy Park 6 - Star 15", "Cloudy Park 6 - Star 16", "Cloudy Park 6 - Star 17"], "music": 11}, {"name": "Cloudy Park 6 - 8", "level": 4, "stage": 6, "room": 8, "pointer": 3027259, "animal_pointers": [], "consumables": [{"idx": 22, "pointer": 312, "x": 224, "y": 256, "etype": 22, "vtype": 0, "name": "Cloudy Park 6 - 1-Up (Cutter)"}], "consumables_pointer": 304, "enemies": ["Bukiset (Burning)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Cutter)"], "default_exits": [{"room": 12, "unkn1": 13, "unkn2": 4, "x": 88, "y": 152, "name": "Cloudy Park 6 - 8 Exit 0", "access_rule": []}], "entity_load": [[78, 16], [80, 16], [76, 16], [79, 16], [83, 16], [14, 23], [4, 22], [0, 22]], "locations": ["Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", "Cloudy Park 6 - Star 18", "Cloudy Park 6 - Star 19", "Cloudy Park 6 - Star 20", "Cloudy Park 6 - Star 21", "Cloudy Park 6 - Star 22", "Cloudy Park 6 - Star 23", "Cloudy Park 6 - Star 24", "Cloudy Park 6 - Star 25", "Cloudy Park 6 - Star 26", "Cloudy Park 6 - Star 27", "Cloudy Park 6 - Star 28", "Cloudy Park 6 - Star 29", "Cloudy Park 6 - 1-Up (Cutter)"], "music": 11}, {"name": "Cloudy Park 6 - 9", "level": 4, "stage": 6, "room": 9, "pointer": 3089504, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 35, "unkn2": 7, "x": 72, "y": 72, "name": "Cloudy Park 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[41, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 10", "level": 4, "stage": 6, "room": 10, "pointer": 3132579, "animal_pointers": [242, 250, 258], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 20, "unkn2": 4, "x": 72, "y": 152, "name": "Cloudy Park 6 - 10 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 4, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 10 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 10 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 10 Exit 3", "access_rule": []}, {"room": 3, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 10 Exit 4", "access_rule": []}, {"room": 3, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 10 Exit 5", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 6 - Animal 1", "Cloudy Park 6 - Animal 2", "Cloudy Park 6 - Animal 3"], "music": 40}, {"name": "Cloudy Park 6 - 11", "level": 4, "stage": 6, "room": 11, "pointer": 3017866, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 11 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 8, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 11 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 12, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 11 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 16, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 11 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 20, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 11 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 12", "level": 4, "stage": 6, "room": 12, "pointer": 3036404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 9, "x": 200, "y": 72, "name": "Cloudy Park 6 - 12 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 13, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": ["Cloudy Park 6 - Star 30", "Cloudy Park 6 - Star 31", "Cloudy Park 6 - Star 32", "Cloudy Park 6 - Star 33"], "music": 11}, {"name": "Cloudy Park 6 - 13", "level": 4, "stage": 6, "room": 13, "pointer": 2965251, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 216, "y": 136, "name": "Cloudy Park 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[26, 19]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 14", "level": 4, "stage": 6, "room": 14, "pointer": 3077236, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 936, "y": 136, "name": "Cloudy Park 6 - 14 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 15", "level": 4, "stage": 6, "room": 15, "pointer": 3061794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[26, 19], [42, 19]], "locations": ["Cloudy Park 6 - HB-007"], "music": 8}, {"name": "Cloudy Park 6 - 16", "level": 4, "stage": 6, "room": 16, "pointer": 2888907, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 6 - Complete"], "music": 5}, {"name": "Cloudy Park Boss - 0", "level": 4, "stage": 7, "room": 0, "pointer": 2998682, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[3, 18]], "locations": ["Cloudy Park - Boss (Ado) Purified", "Level 4 Boss - Defeated", "Level 4 Boss - Purified"], "music": 2}, {"name": "Iceberg 1 - 0", "level": 5, "stage": 1, "room": 0, "pointer": 3363111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Klinko", "KeKe"], "default_exits": [{"room": 1, "unkn1": 104, "unkn2": 8, "x": 312, "y": 1384, "name": "Iceberg 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [0, 16], [51, 16]], "locations": ["Iceberg 1 - Enemy 1 (Waddle Dee)", "Iceberg 1 - Enemy 2 (Klinko)", "Iceberg 1 - Enemy 3 (KeKe)"], "music": 18}, {"name": "Iceberg 1 - 1", "level": 5, "stage": 1, "room": 1, "pointer": 3596524, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Galbo", "Rocky"], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 8, "x": 72, "y": 344, "name": "Iceberg 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [41, 16], [26, 16], [14, 23], [4, 22], [6, 23]], "locations": ["Iceberg 1 - Enemy 4 (Como)", "Iceberg 1 - Enemy 5 (Galbo)", "Iceberg 1 - Enemy 6 (Rocky)", "Iceberg 1 - Star 1", "Iceberg 1 - Star 2", "Iceberg 1 - Star 3", "Iceberg 1 - Star 4", "Iceberg 1 - Star 5", "Iceberg 1 - Star 6"], "music": 18}, {"name": "Iceberg 1 - 2", "level": 5, "stage": 1, "room": 2, "pointer": 3288880, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 3, "unkn1": 49, "unkn2": 9, "x": 184, "y": 152, "name": "Iceberg 1 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 94, "unkn2": 21, "x": 120, "y": 168, "name": "Iceberg 1 - 2 Exit 1", "access_rule": []}], "entity_load": [[28, 19], [46, 16], [47, 16], [17, 16], [67, 16]], "locations": ["Iceberg 1 - Enemy 7 (Kapar)"], "music": 18}, {"name": "Iceberg 1 - 3", "level": 5, "stage": 1, "room": 3, "pointer": 3068439, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 9, "x": 808, "y": 152, "name": "Iceberg 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 1 - Animal 1", "Iceberg 1 - Animal 2"], "music": 38}, {"name": "Iceberg 1 - 4", "level": 5, "stage": 1, "room": 4, "pointer": 3233681, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo", "Babut", "Wappa"], "default_exits": [{"room": 6, "unkn1": 74, "unkn2": 4, "x": 56, "y": 152, "name": "Iceberg 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [43, 16], [74, 16]], "locations": ["Iceberg 1 - Enemy 8 (Mopoo)", "Iceberg 1 - Enemy 9 (Babut)", "Iceberg 1 - Enemy 10 (Wappa)"], "music": 18}, {"name": "Iceberg 1 - 5", "level": 5, "stage": 1, "room": 5, "pointer": 3406133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Chilly", "Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 196, "unkn2": 9, "x": 72, "y": 744, "name": "Iceberg 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [7, 16], [2, 16], [0, 16]], "locations": ["Iceberg 1 - Enemy 11 (Bronto Burt)", "Iceberg 1 - Enemy 12 (Chilly)", "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)"], "music": 18}, {"name": "Iceberg 1 - 6", "level": 5, "stage": 1, "room": 6, "pointer": 2985823, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 19], [42, 19]], "locations": ["Iceberg 1 - Kogoesou"], "music": 8}, {"name": "Iceberg 1 - 7", "level": 5, "stage": 1, "room": 7, "pointer": 2892040, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 1 - Complete"], "music": 5}, {"name": "Iceberg 2 - 0", "level": 5, "stage": 2, "room": 0, "pointer": 3106800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Nruff"], "default_exits": [{"room": 1, "unkn1": 113, "unkn2": 36, "x": 88, "y": 152, "name": "Iceberg 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [24, 16]], "locations": ["Iceberg 2 - Enemy 1 (Gabon)", "Iceberg 2 - Enemy 2 (Nruff)"], "music": 20}, {"name": "Iceberg 2 - 1", "level": 5, "stage": 2, "room": 1, "pointer": 3334841, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Chilly", "Pteran"], "default_exits": [{"room": 2, "unkn1": 109, "unkn2": 20, "x": 88, "y": 72, "name": "Iceberg 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [0, 16], [4, 16], [39, 16]], "locations": ["Iceberg 2 - Enemy 3 (Waddle Dee)", "Iceberg 2 - Enemy 4 (Chilly)", "Iceberg 2 - Enemy 5 (Pteran)"], "music": 20}, {"name": "Iceberg 2 - 2", "level": 5, "stage": 2, "room": 2, "pointer": 3473408, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Galbo", "Babut", "Magoo"], "default_exits": [{"room": 6, "unkn1": 102, "unkn2": 5, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 24, "unkn2": 18, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 37, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 55, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 3", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 4", "access_rule": []}], "entity_load": [[53, 16], [26, 16], [43, 16], [14, 23], [16, 16]], "locations": ["Iceberg 2 - Enemy 6 (Glunk)", "Iceberg 2 - Enemy 7 (Galbo)", "Iceberg 2 - Enemy 8 (Babut)", "Iceberg 2 - Enemy 9 (Magoo)", "Iceberg 2 - Star 1", "Iceberg 2 - Star 2"], "music": 20}, {"name": "Iceberg 2 - 3", "level": 5, "stage": 2, "room": 3, "pointer": 3037006, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 616, "y": 424, "name": "Iceberg 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": ["Iceberg 2 - Star 3"], "music": 20}, {"name": "Iceberg 2 - 4", "level": 5, "stage": 2, "room": 4, "pointer": 3035198, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 904, "y": 424, "name": "Iceberg 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": ["Iceberg 2 - Star 4", "Iceberg 2 - Star 5"], "music": 20}, {"name": "Iceberg 2 - 5", "level": 5, "stage": 2, "room": 5, "pointer": 3128551, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 424, "name": "Iceberg 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": ["Iceberg 2 - Star 6", "Iceberg 2 - Star 7", "Iceberg 2 - Star 8"], "music": 20}, {"name": "Iceberg 2 - 6", "level": 5, "stage": 2, "room": 6, "pointer": 3270857, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Nidoo", "Oro"], "default_exits": [{"room": 7, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Iceberg 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [4, 22], [89, 16], [28, 16], [25, 16]], "locations": ["Iceberg 2 - Enemy 10 (Propeller)", "Iceberg 2 - Enemy 11 (Nidoo)", "Iceberg 2 - Enemy 12 (Oro)"], "music": 20}, {"name": "Iceberg 2 - 7", "level": 5, "stage": 2, "room": 7, "pointer": 3212501, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Klinko", "Bronto Burt"], "default_exits": [{"room": 8, "unkn1": 124, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [14, 23], [2, 16], [4, 23]], "locations": ["Iceberg 2 - Enemy 13 (Klinko)", "Iceberg 2 - Enemy 14 (Bronto Burt)", "Iceberg 2 - Star 9", "Iceberg 2 - Star 10", "Iceberg 2 - Star 11", "Iceberg 2 - Star 12", "Iceberg 2 - Star 13", "Iceberg 2 - Star 14", "Iceberg 2 - Star 15", "Iceberg 2 - Star 16", "Iceberg 2 - Star 17", "Iceberg 2 - Star 18", "Iceberg 2 - Star 19"], "music": 20}, {"name": "Iceberg 2 - 8", "level": 5, "stage": 2, "room": 8, "pointer": 2994515, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [42, 19]], "locations": ["Iceberg 2 - Samus"], "music": 8}, {"name": "Iceberg 2 - 9", "level": 5, "stage": 2, "room": 9, "pointer": 3058084, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 9, "x": 408, "y": 296, "name": "Iceberg 2 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 2 - Animal 1", "Iceberg 2 - Animal 2"], "music": 39}, {"name": "Iceberg 2 - 10", "level": 5, "stage": 2, "room": 10, "pointer": 2887220, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 2 - Complete"], "music": 5}, {"name": "Iceberg 3 - 0", "level": 5, "stage": 3, "room": 0, "pointer": 3455346, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori", "Bouncy", "Chilly", "Pteran"], "default_exits": [{"room": 1, "unkn1": 98, "unkn2": 6, "x": 200, "y": 232, "name": "Iceberg 3 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 217, "unkn2": 7, "x": 40, "y": 120, "name": "Iceberg 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[60, 16], [6, 16], [39, 16], [13, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 1 (Corori)", "Iceberg 3 - Enemy 2 (Bouncy)", "Iceberg 3 - Enemy 3 (Chilly)", "Iceberg 3 - Enemy 4 (Pteran)", "Iceberg 3 - Star 1", "Iceberg 3 - Star 2"], "music": 14}, {"name": "Iceberg 3 - 1", "level": 5, "stage": 3, "room": 1, "pointer": 3019769, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 11, "unkn2": 14, "x": 1592, "y": 104, "name": "Iceberg 3 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 1", "Iceberg 3 - Animal 2", "Iceberg 3 - Animal 3"], "music": 38}, {"name": "Iceberg 3 - 2", "level": 5, "stage": 3, "room": 2, "pointer": 3618121, "animal_pointers": [], "consumables": [{"idx": 2, "pointer": 352, "x": 1776, "y": 104, "etype": 22, "vtype": 2, "name": "Iceberg 3 - Maxim Tomato (Ceiling)"}], "consumables_pointer": 128, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 196, "unkn2": 11, "x": 72, "y": 152, "name": "Iceberg 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[2, 22], [71, 16], [57, 16], [21, 16], [67, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 5 (Raft Waddle Dee)", "Iceberg 3 - Enemy 6 (Kapar)", "Iceberg 3 - Enemy 7 (Blipper)", "Iceberg 3 - Star 3", "Iceberg 3 - Maxim Tomato (Ceiling)"], "music": 14}, {"name": "Iceberg 3 - 3", "level": 5, "stage": 3, "room": 3, "pointer": 3650368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 116, "unkn2": 11, "x": 40, "y": 152, "name": "Iceberg 3 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 63, "unkn2": 13, "x": 184, "y": 136, "name": "Iceberg 3 - 3 Exit 1", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [4, 22], [6, 16], [88, 16]], "locations": ["Iceberg 3 - Enemy 8 (Wapod)", "Iceberg 3 - Star 4", "Iceberg 3 - Star 5", "Iceberg 3 - Star 6", "Iceberg 3 - Star 7", "Iceberg 3 - Star 8", "Iceberg 3 - Star 9", "Iceberg 3 - Star 10"], "music": 14}, {"name": "Iceberg 3 - 4", "level": 5, "stage": 3, "room": 4, "pointer": 3038208, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 10, "unkn2": 8, "x": 1032, "y": 216, "name": "Iceberg 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 4", "Iceberg 3 - Animal 5"], "music": 39}, {"name": "Iceberg 3 - 5", "level": 5, "stage": 3, "room": 5, "pointer": 3013938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": [], "music": 31}, {"name": "Iceberg 3 - 6", "level": 5, "stage": 3, "room": 6, "pointer": 3624789, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Icicle"], "default_exits": [{"room": 7, "unkn1": 211, "unkn2": 7, "x": 40, "y": 152, "name": "Iceberg 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [16, 16], [14, 23], [36, 16], [4, 22]], "locations": ["Iceberg 3 - Enemy 9 (Glunk)", "Iceberg 3 - Enemy 10 (Icicle)", "Iceberg 3 - Star 11", "Iceberg 3 - Star 12", "Iceberg 3 - Star 13", "Iceberg 3 - Star 14", "Iceberg 3 - Star 15", "Iceberg 3 - Star 16", "Iceberg 3 - Star 17", "Iceberg 3 - Star 18", "Iceberg 3 - Star 19", "Iceberg 3 - Star 20", "Iceberg 3 - Star 21"], "music": 14}, {"name": "Iceberg 3 - 7", "level": 5, "stage": 3, "room": 7, "pointer": 2989472, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 7 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": ["Iceberg 3 - Chef Kawasaki"], "music": 8}, {"name": "Iceberg 3 - 8", "level": 5, "stage": 3, "room": 8, "pointer": 2889871, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 3 - Complete"], "music": 5}, {"name": "Iceberg 4 - 0", "level": 5, "stage": 4, "room": 0, "pointer": 3274879, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo", "Klinko", "Chilly"], "default_exits": [{"room": 1, "unkn1": 111, "unkn2": 8, "x": 72, "y": 104, "name": "Iceberg 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [2, 16], [26, 16]], "locations": ["Iceberg 4 - Enemy 1 (Bronto Burt)", "Iceberg 4 - Enemy 2 (Galbo)", "Iceberg 4 - Enemy 3 (Klinko)", "Iceberg 4 - Enemy 4 (Chilly)"], "music": 19}, {"name": "Iceberg 4 - 1", "level": 5, "stage": 4, "room": 1, "pointer": 3371780, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Babut", "Wappa"], "default_exits": [{"room": 2, "unkn1": 60, "unkn2": 36, "x": 216, "y": 88, "name": "Iceberg 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [4, 22], [44, 16]], "locations": ["Iceberg 4 - Enemy 5 (Babut)", "Iceberg 4 - Enemy 6 (Wappa)"], "music": 19}, {"name": "Iceberg 4 - 2", "level": 5, "stage": 4, "room": 2, "pointer": 3284378, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 8, "unkn2": 39, "x": 168, "y": 152, "name": "Iceberg 4 - 2 Exit 0", "access_rule": ["Burning"]}, {"room": 3, "unkn1": 13, "unkn2": 39, "x": 88, "y": 136, "name": "Iceberg 4 - 2 Exit 1", "access_rule": []}, {"room": 17, "unkn1": 18, "unkn2": 39, "x": 120, "y": 152, "name": "Iceberg 4 - 2 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 3", "level": 5, "stage": 4, "room": 3, "pointer": 3162957, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 44, "unkn2": 8, "x": 216, "y": 104, "name": "Iceberg 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[69, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 4", "level": 5, "stage": 4, "room": 4, "pointer": 3261679, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Icicle"], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 42, "x": 104, "y": 840, "name": "Iceberg 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[36, 16]], "locations": ["Iceberg 4 - Enemy 7 (Icicle)"], "music": 19}, {"name": "Iceberg 4 - 5", "level": 5, "stage": 4, "room": 5, "pointer": 3217398, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori"], "default_exits": [{"room": 6, "unkn1": 19, "unkn2": 5, "x": 72, "y": 120, "name": "Iceberg 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[60, 16], [44, 16], [4, 22]], "locations": ["Iceberg 4 - Enemy 8 (Corori)"], "music": 19}, {"name": "Iceberg 4 - 6", "level": 5, "stage": 4, "room": 6, "pointer": 3108265, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 61, "unkn2": 7, "x": 456, "y": 72, "name": "Iceberg 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 7", "level": 5, "stage": 4, "room": 7, "pointer": 3346202, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 39, "unkn2": 6, "x": 168, "y": 104, "name": "Iceberg 4 - 7 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 4, "unkn2": 21, "x": 88, "y": 168, "name": "Iceberg 4 - 7 Exit 1", "access_rule": ["Burning"]}, {"room": 13, "unkn1": 21, "unkn2": 21, "x": 280, "y": 168, "name": "Iceberg 4 - 7 Exit 2", "access_rule": ["Burning"]}], "entity_load": [[14, 23], [4, 22], [4, 23]], "locations": ["Iceberg 4 - Star 1", "Iceberg 4 - Star 2"], "music": 19}, {"name": "Iceberg 4 - 8", "level": 5, "stage": 4, "room": 8, "pointer": 3055911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 5, "x": 648, "y": 104, "name": "Iceberg 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 9", "level": 5, "stage": 4, "room": 9, "pointer": 3056457, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 9, "x": 136, "y": 136, "name": "Iceberg 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 4 - Miniboss 1 (Yuki)"], "music": 4}, {"name": "Iceberg 4 - 10", "level": 5, "stage": 4, "room": 10, "pointer": 3257516, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 8, "unkn2": 37, "x": 88, "y": 40, "name": "Iceberg 4 - 10 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 15, "unkn2": 37, "x": 200, "y": 40, "name": "Iceberg 4 - 10 Exit 1", "access_rule": []}], "entity_load": [[31, 19]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 11", "level": 5, "stage": 4, "room": 11, "pointer": 3083322, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon"], "default_exits": [{"room": 12, "unkn1": 46, "unkn2": 8, "x": 88, "y": 120, "name": "Iceberg 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[24, 16]], "locations": ["Iceberg 4 - Enemy 9 (Gabon)"], "music": 19}, {"name": "Iceberg 4 - 12", "level": 5, "stage": 4, "room": 12, "pointer": 3147724, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu"], "default_exits": [{"room": 18, "unkn1": 64, "unkn2": 7, "x": 72, "y": 456, "name": "Iceberg 4 - 12 Exit 0", "access_rule": []}], "entity_load": [[19, 16], [61, 16]], "locations": ["Iceberg 4 - Enemy 10 (Kabu)"], "music": 19}, {"name": "Iceberg 4 - 13", "level": 5, "stage": 4, "room": 13, "pointer": 3370077, "animal_pointers": [232, 240, 248], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 31, "unkn2": 4, "x": 216, "y": 120, "name": "Iceberg 4 - 13 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 46, "unkn2": 10, "x": 72, "y": 88, "name": "Iceberg 4 - 13 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 57, "unkn2": 10, "x": 312, "y": 88, "name": "Iceberg 4 - 13 Exit 2", "access_rule": []}, {"room": 14, "unkn1": 28, "unkn2": 21, "x": 152, "y": 136, "name": "Iceberg 4 - 13 Exit 3", "access_rule": []}, {"room": 14, "unkn1": 34, "unkn2": 21, "x": 280, "y": 136, "name": "Iceberg 4 - 13 Exit 4", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 1", "Iceberg 4 - Animal 2", "Iceberg 4 - Animal 3"], "music": 19}, {"name": "Iceberg 4 - 14", "level": 5, "stage": 4, "room": 14, "pointer": 3057002, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Broom Hatter", "Sasuke"], "default_exits": [{"room": 15, "unkn1": 4, "unkn2": 8, "x": 88, "y": 360, "name": "Iceberg 4 - 14 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 10, "unkn2": 8, "x": 440, "y": 344, "name": "Iceberg 4 - 14 Exit 1", "access_rule": []}, {"room": 13, "unkn1": 16, "unkn2": 8, "x": 568, "y": 344, "name": "Iceberg 4 - 14 Exit 2", "access_rule": []}, {"room": 15, "unkn1": 22, "unkn2": 8, "x": 344, "y": 360, "name": "Iceberg 4 - 14 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [30, 16]], "locations": ["Iceberg 4 - Enemy 11 (Broom Hatter)", "Iceberg 4 - Enemy 12 (Sasuke)"], "music": 19}, {"name": "Iceberg 4 - 15", "level": 5, "stage": 4, "room": 15, "pointer": 3116124, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 6, "x": 520, "y": 72, "name": "Iceberg 4 - 15 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 4, "unkn2": 22, "x": 88, "y": 136, "name": "Iceberg 4 - 15 Exit 1", "access_rule": []}, {"room": 14, "unkn1": 22, "unkn2": 22, "x": 344, "y": 136, "name": "Iceberg 4 - 15 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 16", "level": 5, "stage": 4, "room": 16, "pointer": 3069937, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 9, "x": 152, "y": 632, "name": "Iceberg 4 - 16 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 4"], "music": 38}, {"name": "Iceberg 4 - 17", "level": 5, "stage": 4, "room": 17, "pointer": 3072413, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 6, "unkn2": 9, "x": 280, "y": 632, "name": "Iceberg 4 - 17 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 5"], "music": 38}, {"name": "Iceberg 4 - 18", "level": 5, "stage": 4, "room": 18, "pointer": 3404593, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 19, "unkn1": 94, "unkn2": 12, "x": 72, "y": 152, "name": "Iceberg 4 - 18 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [43, 16], [30, 16], [15, 16]], "locations": ["Iceberg 4 - Enemy 13 (Nruff)", "Iceberg 4 - Star 3"], "music": 19}, {"name": "Iceberg 4 - 19", "level": 5, "stage": 4, "room": 19, "pointer": 3075826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 4 - 19 Exit 0", "access_rule": []}], "entity_load": [[31, 19], [42, 19]], "locations": ["Iceberg 4 - Name"], "music": 8}, {"name": "Iceberg 4 - 20", "level": 5, "stage": 4, "room": 20, "pointer": 2887943, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 4 - Complete"], "music": 5}, {"name": "Iceberg 5 - 0", "level": 5, "stage": 5, "room": 0, "pointer": 3316135, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 30, "unkn1": 75, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[79, 16], [76, 16], [81, 16], [78, 16], [77, 16], [82, 16], [80, 16], [83, 16]], "locations": ["Iceberg 5 - Enemy 1 (Bukiset (Burning))", "Iceberg 5 - Enemy 2 (Bukiset (Stone))", "Iceberg 5 - Enemy 3 (Bukiset (Ice))", "Iceberg 5 - Enemy 4 (Bukiset (Needle))", "Iceberg 5 - Enemy 5 (Bukiset (Clean))", "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", "Iceberg 5 - Enemy 7 (Bukiset (Spark))", "Iceberg 5 - Enemy 8 (Bukiset (Cutter))"], "music": 16}, {"name": "Iceberg 5 - 1", "level": 5, "stage": 5, "room": 1, "pointer": 3037607, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 72, "y": 104, "name": "Iceberg 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 2", "level": 5, "stage": 5, "room": 2, "pointer": 3103842, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk"], "default_exits": [{"room": 25, "unkn1": 27, "unkn2": 6, "x": 72, "y": 200, "name": "Iceberg 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[16, 16]], "locations": ["Iceberg 5 - Enemy 9 (Glunk)"], "music": 16}, {"name": "Iceberg 5 - 3", "level": 5, "stage": 5, "room": 3, "pointer": 3135899, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 4, "unkn1": 20, "unkn2": 7, "x": 72, "y": 88, "name": "Iceberg 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 10 (Wapod)", "Iceberg 5 - Star 1", "Iceberg 5 - Star 2"], "music": 16}, {"name": "Iceberg 5 - 4", "level": 5, "stage": 5, "room": 4, "pointer": 3180695, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 26, "unkn2": 5, "x": 56, "y": 104, "name": "Iceberg 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 11 (Tick)", "Iceberg 5 - Star 3", "Iceberg 5 - Star 4", "Iceberg 5 - Star 5", "Iceberg 5 - Star 6", "Iceberg 5 - Star 7", "Iceberg 5 - Star 8"], "music": 16}, {"name": "Iceberg 5 - 5", "level": 5, "stage": 5, "room": 5, "pointer": 3106064, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 24, "unkn1": 14, "unkn2": 6, "x": 168, "y": 152, "name": "Iceberg 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[58, 16], [14, 23], [4, 22]], "locations": ["Iceberg 5 - Enemy 12 (Madoo)", "Iceberg 5 - Star 9", "Iceberg 5 - Star 10", "Iceberg 5 - Star 11", "Iceberg 5 - Star 12", "Iceberg 5 - Star 13", "Iceberg 5 - Star 14"], "music": 16}, {"name": "Iceberg 5 - 6", "level": 5, "stage": 5, "room": 6, "pointer": 3276800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 59, "unkn2": 12, "x": 72, "y": 120, "name": "Iceberg 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[55, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 7", "level": 5, "stage": 5, "room": 7, "pointer": 3104585, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 25, "unkn2": 7, "x": 72, "y": 136, "name": "Iceberg 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 8", "level": 5, "stage": 5, "room": 8, "pointer": 3195121, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 35, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 8 Exit 0", "access_rule": []}], "entity_load": [[4, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 9", "level": 5, "stage": 5, "room": 9, "pointer": 3087198, "animal_pointers": [], "consumables": [{"idx": 16, "pointer": 200, "x": 256, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Boulder)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 28, "unkn1": 20, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [54, 16]], "locations": ["Iceberg 5 - 1-Up (Boulder)"], "music": 16}, {"name": "Iceberg 5 - 10", "level": 5, "stage": 5, "room": 10, "pointer": 3321612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 45, "unkn2": 15, "x": 72, "y": 120, "name": "Iceberg 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 11", "level": 5, "stage": 5, "room": 11, "pointer": 3139178, "animal_pointers": [], "consumables": [{"idx": 17, "pointer": 192, "x": 152, "y": 168, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Floor)"}], "consumables_pointer": 176, "enemies": ["Yaban"], "default_exits": [{"room": 12, "unkn1": 17, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 11 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [0, 22]], "locations": ["Iceberg 5 - Enemy 13 (Yaban)", "Iceberg 5 - 1-Up (Floor)"], "music": 16}, {"name": "Iceberg 5 - 12", "level": 5, "stage": 5, "room": 12, "pointer": 3118231, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 7, "x": 72, "y": 104, "name": "Iceberg 5 - 12 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 14 (Propeller)", "Iceberg 5 - Star 15", "Iceberg 5 - Star 16", "Iceberg 5 - Star 17", "Iceberg 5 - Star 18", "Iceberg 5 - Star 19", "Iceberg 5 - Star 20"], "music": 16}, {"name": "Iceberg 5 - 13", "level": 5, "stage": 5, "room": 13, "pointer": 3021658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 27, "unkn1": 16, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 13 Exit 0", "access_rule": []}], "entity_load": [[45, 16]], "locations": ["Iceberg 5 - Enemy 15 (Mariel)"], "music": 16}, {"name": "Iceberg 5 - 14", "level": 5, "stage": 5, "room": 14, "pointer": 3025398, "animal_pointers": [], "consumables": [{"idx": 24, "pointer": 200, "x": 208, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Peloo)"}], "consumables_pointer": 176, "enemies": [], "default_exits": [{"room": 15, "unkn1": 13, "unkn2": 9, "x": 72, "y": 216, "name": "Iceberg 5 - 14 Exit 0", "access_rule": []}], "entity_load": [[64, 16], [0, 22]], "locations": ["Iceberg 5 - 1-Up (Peloo)"], "music": 16}, {"name": "Iceberg 5 - 15", "level": 5, "stage": 5, "room": 15, "pointer": 3167445, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 13, "x": 72, "y": 152, "name": "Iceberg 5 - 15 Exit 0", "access_rule": []}], "entity_load": [[39, 16]], "locations": ["Iceberg 5 - Enemy 16 (Pteran)"], "music": 16}, {"name": "Iceberg 5 - 16", "level": 5, "stage": 5, "room": 16, "pointer": 3033990, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 33, "unkn1": 36, "unkn2": 9, "x": 168, "y": 152, "name": "Iceberg 5 - 16 Exit 0", "access_rule": []}], "entity_load": [[68, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 17", "level": 5, "stage": 5, "room": 17, "pointer": 3100111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 40, "unkn2": 7, "x": 72, "y": 200, "name": "Iceberg 5 - 17 Exit 0", "access_rule": []}], "entity_load": [[52, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 18", "level": 5, "stage": 5, "room": 18, "pointer": 3030947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 17, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 18 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": ["Iceberg 5 - Enemy 17 (Galbo)"], "music": 16}, {"name": "Iceberg 5 - 19", "level": 5, "stage": 5, "room": 19, "pointer": 3105326, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe"], "default_exits": [{"room": 21, "unkn1": 13, "unkn2": 4, "x": 72, "y": 152, "name": "Iceberg 5 - 19 Exit 0", "access_rule": []}], "entity_load": [[51, 16]], "locations": ["Iceberg 5 - Enemy 18 (KeKe)"], "music": 16}, {"name": "Iceberg 5 - 20", "level": 5, "stage": 5, "room": 20, "pointer": 3118928, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 19, "unkn1": 13, "unkn2": 6, "x": 72, "y": 264, "name": "Iceberg 5 - 20 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 5 - Enemy 19 (Nidoo)"], "music": 16}, {"name": "Iceberg 5 - 21", "level": 5, "stage": 5, "room": 21, "pointer": 3202517, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 22, "unkn1": 29, "unkn2": 9, "x": 72, "y": 72, "name": "Iceberg 5 - 21 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16]], "locations": ["Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", "Iceberg 5 - Enemy 22 (Bouncy Drawing)"], "music": 16}, {"name": "Iceberg 5 - 22", "level": 5, "stage": 5, "room": 22, "pointer": 3014656, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Joe"], "default_exits": [{"room": 23, "unkn1": 13, "unkn2": 4, "x": 72, "y": 104, "name": "Iceberg 5 - 22 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 23 (Joe)", "Iceberg 5 - Star 21", "Iceberg 5 - Star 22", "Iceberg 5 - Star 23", "Iceberg 5 - Star 24", "Iceberg 5 - Star 25"], "music": 16}, {"name": "Iceberg 5 - 23", "level": 5, "stage": 5, "room": 23, "pointer": 3166550, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 34, "unkn1": 27, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 23 Exit 0", "access_rule": []}], "entity_load": [[67, 16]], "locations": ["Iceberg 5 - Enemy 24 (Kapar)"], "music": 16}, {"name": "Iceberg 5 - 24", "level": 5, "stage": 5, "room": 24, "pointer": 3029110, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gansan"], "default_exits": [{"room": 31, "unkn1": 10, "unkn2": 4, "x": 72, "y": 88, "name": "Iceberg 5 - 24 Exit 0", "access_rule": []}], "entity_load": [[75, 16]], "locations": ["Iceberg 5 - Enemy 25 (Gansan)"], "music": 16}, {"name": "Iceberg 5 - 25", "level": 5, "stage": 5, "room": 25, "pointer": 3156420, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sasuke"], "default_exits": [{"room": 3, "unkn1": 25, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 25 Exit 0", "access_rule": []}], "entity_load": [[30, 16]], "locations": ["Iceberg 5 - Enemy 26 (Sasuke)"], "music": 16}, {"name": "Iceberg 5 - 26", "level": 5, "stage": 5, "room": 26, "pointer": 3127877, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo"], "default_exits": [{"room": 8, "unkn1": 24, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 5 - 26 Exit 0", "access_rule": []}], "entity_load": [[18, 16]], "locations": ["Iceberg 5 - Enemy 27 (Togezo)"], "music": 16}, {"name": "Iceberg 5 - 27", "level": 5, "stage": 5, "room": 27, "pointer": 3256471, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Bobin"], "default_exits": [{"room": 14, "unkn1": 26, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 27 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [73, 16]], "locations": ["Iceberg 5 - Enemy 28 (Sparky)", "Iceberg 5 - Enemy 29 (Bobin)"], "music": 16}, {"name": "Iceberg 5 - 28", "level": 5, "stage": 5, "room": 28, "pointer": 3029723, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly"], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 248, "name": "Iceberg 5 - 28 Exit 0", "access_rule": []}], "entity_load": [[6, 16]], "locations": ["Iceberg 5 - Enemy 30 (Chilly)"], "music": 16}, {"name": "Iceberg 5 - 29", "level": 5, "stage": 5, "room": 29, "pointer": 3526568, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 29 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [14, 23]], "locations": ["Iceberg 5 - Star 26", "Iceberg 5 - Star 27", "Iceberg 5 - Star 28", "Iceberg 5 - Star 29", "Iceberg 5 - Star 30", "Iceberg 5 - Star 31", "Iceberg 5 - Star 32"], "music": 16}, {"name": "Iceberg 5 - 30", "level": 5, "stage": 5, "room": 30, "pointer": 3022285, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 13, "unkn2": 5, "x": 88, "y": 104, "name": "Iceberg 5 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 1", "Iceberg 5 - Animal 2"], "music": 40}, {"name": "Iceberg 5 - 31", "level": 5, "stage": 5, "room": 31, "pointer": 3026019, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 72, "y": 200, "name": "Iceberg 5 - 31 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 3", "Iceberg 5 - Animal 4"], "music": 40}, {"name": "Iceberg 5 - 32", "level": 5, "stage": 5, "room": 32, "pointer": 3039996, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 32 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 5", "Iceberg 5 - Animal 6"], "music": 40}, {"name": "Iceberg 5 - 33", "level": 5, "stage": 5, "room": 33, "pointer": 3015302, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 33 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 7", "Iceberg 5 - Animal 8"], "music": 40}, {"name": "Iceberg 5 - 34", "level": 5, "stage": 5, "room": 34, "pointer": 3185868, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 35, "unkn1": 35, "unkn2": 9, "x": 200, "y": 328, "name": "Iceberg 5 - 34 Exit 0", "access_rule": []}], "entity_load": [[72, 16], [4, 22], [14, 23]], "locations": ["Iceberg 5 - Enemy 31 (Peran)", "Iceberg 5 - Star 33", "Iceberg 5 - Star 34"], "music": 16}, {"name": "Iceberg 5 - 35", "level": 5, "stage": 5, "room": 35, "pointer": 3865635, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 12, "unkn2": 7, "x": 168, "y": 1384, "name": "Iceberg 5 - 35 Exit 0", "access_rule": []}], "entity_load": [[17, 16], [4, 22]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 36", "level": 5, "stage": 5, "room": 36, "pointer": 3024154, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 37, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 5 - 36 Exit 0", "access_rule": []}], "entity_load": [[32, 19], [42, 19]], "locations": ["Iceberg 5 - Shiro"], "music": 8}, {"name": "Iceberg 5 - 37", "level": 5, "stage": 5, "room": 37, "pointer": 2890594, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 5 - Complete"], "music": 5}, {"name": "Iceberg 6 - 0", "level": 5, "stage": 6, "room": 0, "pointer": 3385305, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 28, "x": 136, "y": 184, "name": "Iceberg 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 12, "unkn2": 28, "x": 248, "y": 184, "name": "Iceberg 6 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 18, "unkn2": 28, "x": 360, "y": 184, "name": "Iceberg 6 - 0 Exit 2", "access_rule": []}], "entity_load": [[15, 16]], "locations": ["Iceberg 6 - Enemy 1 (Nruff)"], "music": 12}, {"name": "Iceberg 6 - 1", "level": 5, "stage": 6, "room": 1, "pointer": 3197599, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 1 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 1", "Iceberg 6 - Animal 2", "Iceberg 6 - Animal 3"], "music": 12}, {"name": "Iceberg 6 - 2", "level": 5, "stage": 6, "room": 2, "pointer": 3097113, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 2 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 3", "level": 5, "stage": 6, "room": 3, "pointer": 3198422, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 3 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 3 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 3 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 4", "Iceberg 6 - Animal 5", "Iceberg 6 - Animal 6"], "music": 12}, {"name": "Iceberg 6 - 4", "level": 5, "stage": 6, "room": 4, "pointer": 3210507, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 4 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 5", "level": 5, "stage": 6, "room": 5, "pointer": 3196776, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 212, "x": 136, "y": 120, "etype": 22, "vtype": 2, "name": "Iceberg 6 - Maxim Tomato (Left)"}, {"idx": 1, "pointer": 220, "x": 248, "y": 120, "etype": 22, "vtype": 0, "name": "Iceberg 6 - 1-Up (Middle)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 4, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 5 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 5 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 5 Exit 2", "access_rule": []}], "entity_load": [[2, 22], [0, 22], [14, 23]], "locations": ["Iceberg 6 - Star 1", "Iceberg 6 - Maxim Tomato (Left)", "Iceberg 6 - 1-Up (Middle)"], "music": 12}, {"name": "Iceberg 6 - 6", "level": 5, "stage": 6, "room": 6, "pointer": 3208130, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 7, "unkn1": 9, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 6 - Enemy 2 (Nidoo)"], "music": 12}, {"name": "Iceberg 6 - 7", "level": 5, "stage": 6, "room": 7, "pointer": 3124478, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky"], "default_exits": [{"room": 8, "unkn1": 17, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[8, 16]], "locations": ["Iceberg 6 - Enemy 3 (Sparky)"], "music": 12}, {"name": "Iceberg 6 - 8", "level": 5, "stage": 6, "room": 8, "pointer": 3110431, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 8 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 14, "unkn2": 5, "x": 296, "y": 136, "name": "Iceberg 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 9", "level": 5, "stage": 6, "room": 9, "pointer": 3139832, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[2, 27]], "locations": ["Iceberg 6 - Miniboss 1 (Blocky)"], "music": 12}, {"name": "Iceberg 6 - 10", "level": 5, "stage": 6, "room": 10, "pointer": 3119624, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 11", "level": 5, "stage": 6, "room": 11, "pointer": 3141139, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 12, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Iceberg 6 - Miniboss 2 (Jumper Shoot)"], "music": 12}, {"name": "Iceberg 6 - 12", "level": 5, "stage": 6, "room": 12, "pointer": 3123788, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 12 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 13", "level": 5, "stage": 6, "room": 13, "pointer": 3143741, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 6 - Miniboss 3 (Yuki)"], "music": 12}, {"name": "Iceberg 6 - 14", "level": 5, "stage": 6, "room": 14, "pointer": 3120319, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 14 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 15", "level": 5, "stage": 6, "room": 15, "pointer": 3135238, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 16, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[27, 16]], "locations": ["Iceberg 6 - Enemy 4 (Sir Kibble)"], "music": 12}, {"name": "Iceberg 6 - 16", "level": 5, "stage": 6, "room": 16, "pointer": 3123096, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 16 Exit 0", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 17", "level": 5, "stage": 6, "room": 17, "pointer": 3144389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 17 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Iceberg 6 - Miniboss 4 (Haboki)"], "music": 12}, {"name": "Iceberg 6 - 18", "level": 5, "stage": 6, "room": 18, "pointer": 3121014, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 19", "level": 5, "stage": 6, "room": 19, "pointer": 3017228, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 19 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Iceberg 6 - Miniboss 5 (Boboo)"], "music": 12}, {"name": "Iceberg 6 - 20", "level": 5, "stage": 6, "room": 20, "pointer": 3121709, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 21, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 21", "level": 5, "stage": 6, "room": 21, "pointer": 3145036, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 21 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Iceberg 6 - Miniboss 6 (Captain Stitch)"], "music": 12}, {"name": "Iceberg 6 - 22", "level": 5, "stage": 6, "room": 22, "pointer": 3116830, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 7, "unkn2": 5, "x": 136, "y": 152, "name": "Iceberg 6 - 22 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 23", "level": 5, "stage": 6, "room": 23, "pointer": 3045263, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 24, "unkn1": 17, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [42, 19]], "locations": ["Iceberg 6 - Angel"], "music": 8}, {"name": "Iceberg 6 - 24", "level": 5, "stage": 6, "room": 24, "pointer": 2889389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 6 - Complete"], "music": 5}, {"name": "Iceberg Boss - 0", "level": 5, "stage": 7, "room": 0, "pointer": 2980207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[8, 18]], "locations": ["Iceberg - Boss (Dedede) Purified", "Level 5 Boss - Defeated", "Level 5 Boss - Purified"], "music": 7}] \ No newline at end of file +[{"name": "Grass Land 1 - 0", "level": 1, "stage": 1, "room": 0, "pointer": 3434257, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sir Kibble", "Cappy"], "default_exits": [{"room": 1, "unkn1": 205, "unkn2": 8, "x": 72, "y": 200, "name": "Grass Land 1 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 87, "unkn2": 9, "x": 104, "y": 152, "name": "Grass Land 1 - 0 Exit 1", "access_rule": []}], "entity_load": [[0, 16], [1, 23], [0, 23], [14, 23], [27, 16], [12, 16], [4, 22]], "locations": ["Grass Land 1 - Enemy 1 (Waddle Dee)", "Grass Land 1 - Enemy 2 (Sir Kibble)", "Grass Land 1 - Enemy 3 (Cappy)", "Grass Land 1 - Star 1", "Grass Land 1 - Star 2", "Grass Land 1 - Star 3", "Grass Land 1 - Star 4", "Grass Land 1 - Star 5", "Grass Land 1 - Star 6", "Grass Land 1 - Star 7", "Grass Land 1 - Star 8", "Grass Land 1 - Star 9", "Grass Land 1 - Star 10"], "music": 20}, {"name": "Grass Land 1 - 1", "level": 1, "stage": 1, "room": 1, "pointer": 3368373, "animal_pointers": [], "consumables": [{"idx": 14, "pointer": 264, "x": 928, "y": 160, "etype": 22, "vtype": 0, "name": "Grass Land 1 - 1-Up (Parasol)"}, {"idx": 15, "pointer": 312, "x": 1456, "y": 176, "etype": 22, "vtype": 2, "name": "Grass Land 1 - Maxim Tomato (Spark)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Bronto Burt", "Sasuke"], "default_exits": [{"room": 3, "unkn1": 143, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [30, 16], [12, 16], [14, 23], [8, 16], [0, 22], [2, 22]], "locations": ["Grass Land 1 - Enemy 4 (Sparky)", "Grass Land 1 - Enemy 5 (Bronto Burt)", "Grass Land 1 - Enemy 6 (Sasuke)", "Grass Land 1 - Star 11", "Grass Land 1 - Star 12", "Grass Land 1 - Star 13", "Grass Land 1 - Star 14", "Grass Land 1 - Star 15", "Grass Land 1 - 1-Up (Parasol)", "Grass Land 1 - Maxim Tomato (Spark)"], "music": 20}, {"name": "Grass Land 1 - 2", "level": 1, "stage": 1, "room": 2, "pointer": 2960650, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 1416, "y": 152, "name": "Grass Land 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 1 - Animal 1", "Grass Land 1 - Animal 2"], "music": 38}, {"name": "Grass Land 1 - 3", "level": 1, "stage": 1, "room": 3, "pointer": 3478442, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 179, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [7, 16], [0, 23], [6, 22], [14, 23], [8, 16], [1, 23]], "locations": ["Grass Land 1 - Enemy 7 (Poppy Bros Jr.)", "Grass Land 1 - Star 16", "Grass Land 1 - Star 17", "Grass Land 1 - Star 18", "Grass Land 1 - Star 19", "Grass Land 1 - Star 20", "Grass Land 1 - Star 21", "Grass Land 1 - Star 22", "Grass Land 1 - Star 23"], "music": 20}, {"name": "Grass Land 1 - 4", "level": 1, "stage": 1, "room": 4, "pointer": 2978390, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[0, 19], [42, 19]], "locations": ["Grass Land 1 - Tulip"], "music": 8}, {"name": "Grass Land 1 - 5", "level": 1, "stage": 1, "room": 5, "pointer": 2890835, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 1 - Complete"], "music": 5}, {"name": "Grass Land 2 - 0", "level": 1, "stage": 2, "room": 0, "pointer": 3293347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "KeKe", "Bobo", "Poppy Bros Jr."], "default_exits": [{"room": 1, "unkn1": 112, "unkn2": 9, "x": 72, "y": 152, "name": "Grass Land 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [7, 16], [5, 16], [4, 22], [51, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 1 (Rocky)", "Grass Land 2 - Enemy 2 (KeKe)", "Grass Land 2 - Enemy 3 (Bobo)", "Grass Land 2 - Enemy 4 (Poppy Bros Jr.)", "Grass Land 2 - Star 1", "Grass Land 2 - Star 2", "Grass Land 2 - Star 3", "Grass Land 2 - Star 4", "Grass Land 2 - Star 5", "Grass Land 2 - Star 6", "Grass Land 2 - Star 7", "Grass Land 2 - Star 8", "Grass Land 2 - Star 9", "Grass Land 2 - Star 10"], "music": 11}, {"name": "Grass Land 2 - 1", "level": 1, "stage": 2, "room": 1, "pointer": 3059685, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 9, "x": 56, "y": 136, "name": "Grass Land 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 2 - Animal 1", "Grass Land 2 - Animal 2"], "music": 39}, {"name": "Grass Land 2 - 2", "level": 1, "stage": 2, "room": 2, "pointer": 3432109, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Popon Ball", "Bouncy"], "default_exits": [{"room": 4, "unkn1": 133, "unkn2": 11, "x": 72, "y": 200, "name": "Grass Land 2 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 52, "unkn2": 12, "x": 56, "y": 152, "name": "Grass Land 2 - 2 Exit 1", "access_rule": []}], "entity_load": [[13, 16], [50, 16], [4, 22], [3, 16], [0, 16], [14, 23]], "locations": ["Grass Land 2 - Enemy 5 (Waddle Dee)", "Grass Land 2 - Enemy 6 (Popon Ball)", "Grass Land 2 - Enemy 7 (Bouncy)", "Grass Land 2 - Star 11", "Grass Land 2 - Star 12", "Grass Land 2 - Star 13"], "music": 11}, {"name": "Grass Land 2 - 3", "level": 1, "stage": 2, "room": 3, "pointer": 2970029, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 2, "unkn2": 9, "x": 840, "y": 168, "name": "Grass Land 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 19]], "locations": [], "music": 11}, {"name": "Grass Land 2 - 4", "level": 1, "stage": 2, "room": 4, "pointer": 3578022, "animal_pointers": [], "consumables": [{"idx": 20, "pointer": 272, "x": 992, "y": 192, "etype": 22, "vtype": 0, "name": "Grass Land 2 - 1-Up (Needle)"}], "consumables_pointer": 352, "enemies": ["Tick", "Bronto Burt", "Nruff"], "default_exits": [{"room": 5, "unkn1": 154, "unkn2": 12, "x": 72, "y": 152, "name": "Grass Land 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [5, 16], [2, 16], [48, 16], [14, 23], [0, 22]], "locations": ["Grass Land 2 - Enemy 8 (Tick)", "Grass Land 2 - Enemy 9 (Bronto Burt)", "Grass Land 2 - Enemy 10 (Nruff)", "Grass Land 2 - Star 14", "Grass Land 2 - Star 15", "Grass Land 2 - Star 16", "Grass Land 2 - Star 17", "Grass Land 2 - Star 18", "Grass Land 2 - Star 19", "Grass Land 2 - Star 20", "Grass Land 2 - Star 21", "Grass Land 2 - 1-Up (Needle)"], "music": 11}, {"name": "Grass Land 2 - 5", "level": 1, "stage": 2, "room": 5, "pointer": 2966057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 19], [42, 19]], "locations": ["Grass Land 2 - Muchimuchi"], "music": 8}, {"name": "Grass Land 2 - 6", "level": 1, "stage": 2, "room": 6, "pointer": 2887461, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 2 - Complete"], "music": 5}, {"name": "Grass Land 3 - 0", "level": 1, "stage": 3, "room": 0, "pointer": 3149707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Rocky", "Nruff"], "default_exits": [{"room": 1, "unkn1": 107, "unkn2": 7, "x": 72, "y": 840, "name": "Grass Land 3 - 0 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 46, "unkn2": 9, "x": 152, "y": 152, "name": "Grass Land 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [14, 23], [15, 16], [0, 16], [8, 16]], "locations": ["Grass Land 3 - Enemy 1 (Sparky)", "Grass Land 3 - Enemy 2 (Rocky)", "Grass Land 3 - Enemy 3 (Nruff)", "Grass Land 3 - Star 1", "Grass Land 3 - Star 2", "Grass Land 3 - Star 3", "Grass Land 3 - Star 4", "Grass Land 3 - Star 5", "Grass Land 3 - Star 6", "Grass Land 3 - Star 7", "Grass Land 3 - Star 8", "Grass Land 3 - Star 9", "Grass Land 3 - Star 10"], "music": 19}, {"name": "Grass Land 3 - 1", "level": 1, "stage": 3, "room": 1, "pointer": 3204939, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 360, "x": 208, "y": 344, "etype": 22, "vtype": 0, "name": "Grass Land 3 - 1-Up (Climb)"}, {"idx": 11, "pointer": 376, "x": 224, "y": 568, "etype": 22, "vtype": 2, "name": "Grass Land 3 - Maxim Tomato (Climb)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [6, 23], [2, 22], [5, 23], [14, 23], [1, 23], [0, 23], [31, 16]], "locations": ["Grass Land 3 - Star 11", "Grass Land 3 - Star 12", "Grass Land 3 - Star 13", "Grass Land 3 - Star 14", "Grass Land 3 - Star 15", "Grass Land 3 - Star 16", "Grass Land 3 - 1-Up (Climb)", "Grass Land 3 - Maxim Tomato (Climb)"], "music": 19}, {"name": "Grass Land 3 - 2", "level": 1, "stage": 3, "room": 2, "pointer": 3200066, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 55, "x": 56, "y": 152, "name": "Grass Land 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [14, 23]], "locations": ["Grass Land 3 - Star 17", "Grass Land 3 - Star 18", "Grass Land 3 - Star 19", "Grass Land 3 - Star 20", "Grass Land 3 - Star 21", "Grass Land 3 - Star 22", "Grass Land 3 - Star 23", "Grass Land 3 - Star 24", "Grass Land 3 - Star 25", "Grass Land 3 - Star 26"], "music": 19}, {"name": "Grass Land 3 - 3", "level": 1, "stage": 3, "room": 3, "pointer": 2959784, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 15, "unkn2": 9, "x": 56, "y": 120, "name": "Grass Land 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 31}, {"name": "Grass Land 3 - 4", "level": 1, "stage": 3, "room": 4, "pointer": 2979121, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 8, "unkn2": 9, "x": 760, "y": 152, "name": "Grass Land 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 3 - Animal 1", "Grass Land 3 - Animal 2"], "music": 40}, {"name": "Grass Land 3 - 5", "level": 1, "stage": 3, "room": 5, "pointer": 2997811, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[2, 19]], "locations": [], "music": 8}, {"name": "Grass Land 3 - 6", "level": 1, "stage": 3, "room": 6, "pointer": 3084876, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bouncy"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [14, 16], [1, 23], [59, 16], [14, 23]], "locations": ["Grass Land 3 - Pitcherman", "Grass Land 3 - Enemy 4 (Bouncy)", "Grass Land 3 - Star 27", "Grass Land 3 - Star 28", "Grass Land 3 - Star 29", "Grass Land 3 - Star 30", "Grass Land 3 - Star 31"], "music": 19}, {"name": "Grass Land 3 - 7", "level": 1, "stage": 3, "room": 7, "pointer": 2891317, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 3 - Complete"], "music": 5}, {"name": "Grass Land 4 - 0", "level": 1, "stage": 4, "room": 0, "pointer": 3471284, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Babut", "Rocky"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 13, "x": 72, "y": 136, "name": "Grass Land 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [14, 23], [40, 16], [61, 16], [4, 22]], "locations": ["Grass Land 4 - Enemy 1 (Loud)", "Grass Land 4 - Enemy 2 (Babut)", "Grass Land 4 - Enemy 3 (Rocky)", "Grass Land 4 - Star 1", "Grass Land 4 - Star 2", "Grass Land 4 - Star 3", "Grass Land 4 - Star 4", "Grass Land 4 - Star 5", "Grass Land 4 - Star 6", "Grass Land 4 - Star 7", "Grass Land 4 - Star 8", "Grass Land 4 - Star 9"], "music": 10}, {"name": "Grass Land 4 - 1", "level": 1, "stage": 4, "room": 1, "pointer": 3436401, "animal_pointers": [], "consumables": [{"idx": 12, "pointer": 290, "x": 1008, "y": 144, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Zebon Right)"}], "consumables_pointer": 368, "enemies": ["Kapar"], "default_exits": [{"room": 5, "unkn1": 58, "unkn2": 5, "x": 184, "y": 312, "name": "Grass Land 4 - 1 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 42, "unkn2": 18, "x": 168, "y": 88, "name": "Grass Land 4 - 1 Exit 1", "access_rule": []}], "entity_load": [[43, 16], [10, 23], [6, 22], [14, 23], [2, 22], [67, 16]], "locations": ["Grass Land 4 - Enemy 4 (Kapar)", "Grass Land 4 - Star 10", "Grass Land 4 - Maxim Tomato (Zebon Right)"], "music": 10}, {"name": "Grass Land 4 - 2", "level": 1, "stage": 4, "room": 2, "pointer": 3039401, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 4, "x": 56, "y": 72, "name": "Grass Land 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": [], "music": 9}, {"name": "Grass Land 4 - 3", "level": 1, "stage": 4, "room": 3, "pointer": 3722714, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 280, "x": 856, "y": 224, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Gordo)"}, {"idx": 22, "pointer": 480, "x": 1352, "y": 112, "etype": 22, "vtype": 0, "name": "Grass Land 4 - 1-Up (Gordo)"}], "consumables_pointer": 288, "enemies": ["Glunk", "Oro"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 5, "x": 72, "y": 200, "name": "Grass Land 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [55, 16], [16, 16], [25, 16], [14, 23], [0, 22], [2, 22], [4, 22]], "locations": ["Grass Land 4 - Enemy 5 (Glunk)", "Grass Land 4 - Enemy 6 (Oro)", "Grass Land 4 - Star 11", "Grass Land 4 - Star 12", "Grass Land 4 - Star 13", "Grass Land 4 - Star 14", "Grass Land 4 - Star 15", "Grass Land 4 - Star 16", "Grass Land 4 - Star 17", "Grass Land 4 - Star 18", "Grass Land 4 - Star 19", "Grass Land 4 - Star 20", "Grass Land 4 - Star 21", "Grass Land 4 - Star 22", "Grass Land 4 - Star 23", "Grass Land 4 - Star 24", "Grass Land 4 - Star 25", "Grass Land 4 - Star 26", "Grass Land 4 - Maxim Tomato (Gordo)", "Grass Land 4 - 1-Up (Gordo)"], "music": 10}, {"name": "Grass Land 4 - 4", "level": 1, "stage": 4, "room": 4, "pointer": 3304980, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 208, "x": 488, "y": 64, "etype": 22, "vtype": 2, "name": "Grass Land 4 - Maxim Tomato (Cliff)"}], "consumables_pointer": 160, "enemies": [], "default_exits": [{"room": 8, "unkn1": 94, "unkn2": 9, "x": 40, "y": 152, "name": "Grass Land 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [2, 22], [54, 16], [1, 16], [40, 16], [14, 23]], "locations": ["Grass Land 4 - Star 27", "Grass Land 4 - Maxim Tomato (Cliff)"], "music": 10}, {"name": "Grass Land 4 - 5", "level": 1, "stage": 4, "room": 5, "pointer": 3498127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 2, "unkn1": 61, "unkn2": 13, "x": 56, "y": 72, "name": "Grass Land 4 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 61, "unkn2": 18, "x": 56, "y": 200, "name": "Grass Land 4 - 5 Exit 1", "access_rule": ["Stone", "Stone Ability"]}], "entity_load": [[72, 16], [43, 16], [4, 22], [14, 23], [10, 23], [3, 16]], "locations": ["Grass Land 4 - Enemy 7 (Peran)", "Grass Land 4 - Star 28", "Grass Land 4 - Star 29", "Grass Land 4 - Star 30", "Grass Land 4 - Star 31", "Grass Land 4 - Star 32", "Grass Land 4 - Star 33", "Grass Land 4 - Star 34", "Grass Land 4 - Star 35", "Grass Land 4 - Star 36", "Grass Land 4 - Star 37"], "music": 10}, {"name": "Grass Land 4 - 6", "level": 1, "stage": 4, "room": 6, "pointer": 3160191, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 28, "unkn2": 4, "x": 72, "y": 376, "name": "Grass Land 4 - 6 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 28, "unkn2": 12, "x": 72, "y": 440, "name": "Grass Land 4 - 6 Exit 1", "access_rule": []}], "entity_load": [[3, 19], [6, 23]], "locations": [], "music": 10}, {"name": "Grass Land 4 - 7", "level": 1, "stage": 4, "room": 7, "pointer": 3035801, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 12, "x": 56, "y": 200, "name": "Grass Land 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Grass Land 4 - Miniboss 1 (Boboo)"], "music": 4}, {"name": "Grass Land 4 - 8", "level": 1, "stage": 4, "room": 8, "pointer": 2989794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[3, 19], [42, 19]], "locations": ["Grass Land 4 - Chao & Goku"], "music": 8}, {"name": "Grass Land 4 - 9", "level": 1, "stage": 4, "room": 9, "pointer": 3043518, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 9, "unkn2": 5, "x": 696, "y": 296, "name": "Grass Land 4 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 4 - Animal 1", "Grass Land 4 - Animal 2"], "music": 38}, {"name": "Grass Land 4 - 10", "level": 1, "stage": 4, "room": 10, "pointer": 2888425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 4 - Complete"], "music": 5}, {"name": "Grass Land 5 - 0", "level": 1, "stage": 5, "room": 0, "pointer": 3303565, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 1, "unkn1": 120, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [4, 22], [14, 23], [6, 23], [11, 16], [89, 16]], "locations": ["Grass Land 5 - Enemy 1 (Propeller)", "Grass Land 5 - Enemy 2 (Broom Hatter)", "Grass Land 5 - Enemy 3 (Bouncy)", "Grass Land 5 - Star 1", "Grass Land 5 - Star 2", "Grass Land 5 - Star 3", "Grass Land 5 - Star 4", "Grass Land 5 - Star 5", "Grass Land 5 - Star 6", "Grass Land 5 - Star 7", "Grass Land 5 - Star 8"], "music": 11}, {"name": "Grass Land 5 - 1", "level": 1, "stage": 5, "room": 1, "pointer": 3048718, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 3, "unkn1": 18, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 21, "unkn2": 4, "x": 184, "y": 152, "name": "Grass Land 5 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 36, "unkn2": 9, "x": 56, "y": 88, "name": "Grass Land 5 - 1 Exit 2", "access_rule": []}], "entity_load": [[27, 16], [14, 23]], "locations": ["Grass Land 5 - Enemy 4 (Sir Kibble)", "Grass Land 5 - Star 9", "Grass Land 5 - Star 10"], "music": 11}, {"name": "Grass Land 5 - 2", "level": 1, "stage": 5, "room": 2, "pointer": 3327019, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sasuke", "Nruff"], "default_exits": [{"room": 7, "unkn1": 121, "unkn2": 6, "x": 56, "y": 72, "name": "Grass Land 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [4, 22], [30, 16], [15, 16], [1, 16]], "locations": ["Grass Land 5 - Enemy 5 (Waddle Dee)", "Grass Land 5 - Enemy 6 (Sasuke)", "Grass Land 5 - Enemy 7 (Nruff)", "Grass Land 5 - Star 11", "Grass Land 5 - Star 12", "Grass Land 5 - Star 13", "Grass Land 5 - Star 14", "Grass Land 5 - Star 15", "Grass Land 5 - Star 16"], "music": 11}, {"name": "Grass Land 5 - 3", "level": 1, "stage": 5, "room": 3, "pointer": 2966459, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 312, "y": 72, "name": "Grass Land 5 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 1", "Grass Land 5 - Animal 2"], "music": 38}, {"name": "Grass Land 5 - 4", "level": 1, "stage": 5, "room": 4, "pointer": 2973509, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 10, "unkn2": 9, "x": 360, "y": 72, "name": "Grass Land 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 5 - Animal 3", "Grass Land 5 - Animal 4"], "music": 38}, {"name": "Grass Land 5 - 5", "level": 1, "stage": 5, "room": 5, "pointer": 2962351, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[4, 19], [42, 19]], "locations": ["Grass Land 5 - Mine"], "music": 8}, {"name": "Grass Land 5 - 6", "level": 1, "stage": 5, "room": 6, "pointer": 2886738, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 5 - Complete"], "music": 5}, {"name": "Grass Land 5 - 7", "level": 1, "stage": 5, "room": 7, "pointer": 3255423, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 96, "unkn2": 9, "x": 56, "y": 152, "name": "Grass Land 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [4, 22], [14, 23]], "locations": ["Grass Land 5 - Enemy 8 (Tick)", "Grass Land 5 - Star 17", "Grass Land 5 - Star 18", "Grass Land 5 - Star 19", "Grass Land 5 - Star 20", "Grass Land 5 - Star 21", "Grass Land 5 - Star 22", "Grass Land 5 - Star 23", "Grass Land 5 - Star 24", "Grass Land 5 - Star 25", "Grass Land 5 - Star 26", "Grass Land 5 - Star 27", "Grass Land 5 - Star 28", "Grass Land 5 - Star 29"], "music": 11}, {"name": "Grass Land 6 - 0", "level": 1, "stage": 6, "room": 0, "pointer": 3376872, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Togezo", "Bronto Burt", "Cappy"], "default_exits": [{"room": 6, "unkn1": 51, "unkn2": 9, "x": 216, "y": 152, "name": "Grass Land 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 96, "unkn2": 9, "x": 216, "y": 1144, "name": "Grass Land 6 - 0 Exit 1", "access_rule": []}], "entity_load": [[12, 16], [18, 16], [2, 16], [41, 16], [4, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 1 (Como)", "Grass Land 6 - Enemy 2 (Togezo)", "Grass Land 6 - Enemy 3 (Bronto Burt)", "Grass Land 6 - Enemy 4 (Cappy)", "Grass Land 6 - Star 1", "Grass Land 6 - Star 2", "Grass Land 6 - Star 3", "Grass Land 6 - Star 4", "Grass Land 6 - Star 5", "Grass Land 6 - Star 6", "Grass Land 6 - Star 7", "Grass Land 6 - Star 8", "Grass Land 6 - Star 9"], "music": 20}, {"name": "Grass Land 6 - 1", "level": 1, "stage": 6, "room": 1, "pointer": 3395125, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 192, "x": 104, "y": 1144, "etype": 22, "vtype": 0, "name": "Grass Land 6 - 1-Up (Tower)"}], "consumables_pointer": 256, "enemies": ["Bobo", "Mariel"], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 5, "x": 72, "y": 88, "name": "Grass Land 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [5, 19], [45, 16], [0, 22], [4, 22], [14, 23], [55, 16]], "locations": ["Grass Land 6 - Enemy 5 (Bobo)", "Grass Land 6 - Enemy 6 (Mariel)", "Grass Land 6 - Star 10", "Grass Land 6 - Star 11", "Grass Land 6 - Star 12", "Grass Land 6 - Star 13", "Grass Land 6 - Star 14", "Grass Land 6 - 1-Up (Tower)"], "music": 20}, {"name": "Grass Land 6 - 2", "level": 1, "stage": 6, "room": 2, "pointer": 3375177, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter"], "default_exits": [{"room": 3, "unkn1": 93, "unkn2": 6, "x": 200, "y": 152, "name": "Grass Land 6 - 2 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 49, "unkn2": 7, "x": 216, "y": 104, "name": "Grass Land 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[11, 16], [45, 16], [41, 16], [4, 22], [32, 16], [14, 23]], "locations": ["Grass Land 6 - Enemy 7 (Yaban)", "Grass Land 6 - Enemy 8 (Broom Hatter)", "Grass Land 6 - Star 15", "Grass Land 6 - Star 16"], "music": 20}, {"name": "Grass Land 6 - 3", "level": 1, "stage": 6, "room": 3, "pointer": 3322977, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Apolo", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 52, "x": 72, "y": 104, "name": "Grass Land 6 - 3 Exit 0", "access_rule": []}], "entity_load": [[41, 16], [49, 16], [30, 16], [14, 23], [4, 22]], "locations": ["Grass Land 6 - Enemy 9 (Apolo)", "Grass Land 6 - Enemy 10 (Sasuke)", "Grass Land 6 - Star 17", "Grass Land 6 - Star 18", "Grass Land 6 - Star 19", "Grass Land 6 - Star 20", "Grass Land 6 - Star 21", "Grass Land 6 - Star 22", "Grass Land 6 - Star 23", "Grass Land 6 - Star 24", "Grass Land 6 - Star 25"], "music": 20}, {"name": "Grass Land 6 - 4", "level": 1, "stage": 6, "room": 4, "pointer": 3490819, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 192, "x": 40, "y": 104, "etype": 22, "vtype": 1, "name": "Grass Land 6 - 1-Up (Falling)"}], "consumables_pointer": 176, "enemies": ["Rocky"], "default_exits": [{"room": 5, "unkn1": 145, "unkn2": 6, "x": 56, "y": 152, "name": "Grass Land 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [4, 22], [49, 16], [61, 16], [3, 16], [1, 22], [14, 23]], "locations": ["Grass Land 6 - Enemy 11 (Rocky)", "Grass Land 6 - Star 26", "Grass Land 6 - Star 27", "Grass Land 6 - Star 28", "Grass Land 6 - Star 29", "Grass Land 6 - 1-Up (Falling)"], "music": 20}, {"name": "Grass Land 6 - 5", "level": 1, "stage": 6, "room": 5, "pointer": 3076769, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Grass Land 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 19], [42, 19]], "locations": ["Grass Land 6 - Pierre"], "music": 8}, {"name": "Grass Land 6 - 6", "level": 1, "stage": 6, "room": 6, "pointer": 3047576, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 9, "x": 840, "y": 152, "name": "Grass Land 6 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 1", "Grass Land 6 - Animal 2"], "music": 39}, {"name": "Grass Land 6 - 7", "level": 1, "stage": 6, "room": 7, "pointer": 3022909, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 808, "y": 120, "name": "Grass Land 6 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Grass Land 6 - Animal 3", "Grass Land 6 - Animal 4"], "music": 38}, {"name": "Grass Land 6 - 8", "level": 1, "stage": 6, "room": 8, "pointer": 2884569, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Grass Land 6 - Complete"], "music": 5}, {"name": "Grass Land Boss - 0", "level": 1, "stage": 7, "room": 0, "pointer": 2984105, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[0, 18]], "locations": ["Grass Land - Boss (Whispy Woods) Purified", "Level 1 Boss - Defeated", "Level 1 Boss - Purified"], "music": 2}, {"name": "Ripple Field 1 - 0", "level": 2, "stage": 1, "room": 0, "pointer": 3279855, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Glunk", "Broom Hatter", "Cappy"], "default_exits": [{"room": 2, "unkn1": 102, "unkn2": 8, "x": 56, "y": 152, "name": "Ripple Field 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[16, 16], [0, 16], [12, 16], [11, 16], [14, 23]], "locations": ["Ripple Field 1 - Enemy 1 (Waddle Dee)", "Ripple Field 1 - Enemy 2 (Glunk)", "Ripple Field 1 - Enemy 3 (Broom Hatter)", "Ripple Field 1 - Enemy 4 (Cappy)", "Ripple Field 1 - Star 1", "Ripple Field 1 - Star 2", "Ripple Field 1 - Star 3", "Ripple Field 1 - Star 4", "Ripple Field 1 - Star 5", "Ripple Field 1 - Star 6"], "music": 15}, {"name": "Ripple Field 1 - 1", "level": 2, "stage": 1, "room": 1, "pointer": 3588688, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 11, "x": 40, "y": 232, "name": "Ripple Field 1 - 1 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 108, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 138, "unkn2": 16, "x": 200, "y": 184, "name": "Ripple Field 1 - 1 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [2, 16], [3, 16], [7, 16]], "locations": ["Ripple Field 1 - Enemy 5 (Bronto Burt)", "Ripple Field 1 - Enemy 6 (Rocky)", "Ripple Field 1 - Enemy 7 (Poppy Bros Jr.)"], "music": 15}, {"name": "Ripple Field 1 - 2", "level": 2, "stage": 1, "room": 2, "pointer": 2955848, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 18, "unkn2": 9, "x": 56, "y": 168, "name": "Ripple Field 1 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 1 - Animal 1", "Ripple Field 1 - Animal 2"], "music": 40}, {"name": "Ripple Field 1 - 3", "level": 2, "stage": 1, "room": 3, "pointer": 3558828, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin"], "default_exits": [{"room": 4, "unkn1": 171, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[73, 16], [6, 22], [14, 23], [4, 22], [0, 16], [10, 23]], "locations": ["Ripple Field 1 - Enemy 8 (Bobin)", "Ripple Field 1 - Star 7", "Ripple Field 1 - Star 8", "Ripple Field 1 - Star 9", "Ripple Field 1 - Star 10", "Ripple Field 1 - Star 11", "Ripple Field 1 - Star 12", "Ripple Field 1 - Star 13", "Ripple Field 1 - Star 14", "Ripple Field 1 - Star 15", "Ripple Field 1 - Star 16"], "music": 15}, {"name": "Ripple Field 1 - 4", "level": 2, "stage": 1, "room": 4, "pointer": 2974271, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [42, 19]], "locations": ["Ripple Field 1 - Kamuribana"], "music": 8}, {"name": "Ripple Field 1 - 5", "level": 2, "stage": 1, "room": 5, "pointer": 3051513, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 264, "name": "Ripple Field 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": ["Ripple Field 1 - Star 17", "Ripple Field 1 - Star 18"], "music": 15}, {"name": "Ripple Field 1 - 6", "level": 2, "stage": 1, "room": 6, "pointer": 3049838, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 1752, "y": 264, "name": "Ripple Field 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[7, 19], [14, 23]], "locations": ["Ripple Field 1 - Star 19"], "music": 15}, {"name": "Ripple Field 1 - 7", "level": 2, "stage": 1, "room": 7, "pointer": 3066407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 11, "x": 2232, "y": 264, "name": "Ripple Field 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[7, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 1 - 8", "level": 2, "stage": 1, "room": 8, "pointer": 2889148, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 1 - Complete"], "music": 5}, {"name": "Ripple Field 2 - 0", "level": 2, "stage": 2, "room": 0, "pointer": 3342336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Coconut", "Blipper", "Sasuke"], "default_exits": [{"room": 1, "unkn1": 103, "unkn2": 15, "x": 56, "y": 104, "name": "Ripple Field 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[5, 22], [34, 16], [30, 16], [21, 16], [14, 23], [4, 22], [18, 16]], "locations": ["Ripple Field 2 - Enemy 1 (Togezo)", "Ripple Field 2 - Enemy 2 (Coconut)", "Ripple Field 2 - Enemy 3 (Blipper)", "Ripple Field 2 - Enemy 4 (Sasuke)", "Ripple Field 2 - Star 1", "Ripple Field 2 - Star 2", "Ripple Field 2 - Star 3", "Ripple Field 2 - Star 4"], "music": 10}, {"name": "Ripple Field 2 - 1", "level": 2, "stage": 2, "room": 1, "pointer": 3084099, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 23, "unkn2": 8, "x": 72, "y": 248, "name": "Ripple Field 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 1", "Ripple Field 2 - Animal 2"], "music": 39}, {"name": "Ripple Field 2 - 2", "level": 2, "stage": 2, "room": 2, "pointer": 3451207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 4, "unkn1": 31, "unkn2": 5, "x": 72, "y": 152, "name": "Ripple Field 2 - 2 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 96, "unkn2": 6, "x": 56, "y": 152, "name": "Ripple Field 2 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 56, "unkn2": 17, "x": 136, "y": 264, "name": "Ripple Field 2 - 2 Exit 2", "access_rule": []}], "entity_load": [[29, 16], [47, 16], [1, 16], [46, 16], [14, 23]], "locations": ["Ripple Field 2 - Enemy 5 (Kany)", "Ripple Field 2 - Star 5", "Ripple Field 2 - Star 6", "Ripple Field 2 - Star 7", "Ripple Field 2 - Star 8"], "music": 10}, {"name": "Ripple Field 2 - 3", "level": 2, "stage": 2, "room": 3, "pointer": 3674327, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 480, "x": 1384, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 2 - Maxim Tomato (Currents)"}, {"idx": 10, "pointer": 520, "x": 1456, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 2 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Glunk"], "default_exits": [{"room": 2, "unkn1": 134, "unkn2": 5, "x": 40, "y": 136, "name": "Ripple Field 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [14, 23], [16, 16], [21, 16], [4, 22]], "locations": ["Ripple Field 2 - Enemy 6 (Glunk)", "Ripple Field 2 - Star 9", "Ripple Field 2 - Star 10", "Ripple Field 2 - Star 11", "Ripple Field 2 - Star 12", "Ripple Field 2 - Star 13", "Ripple Field 2 - Star 14", "Ripple Field 2 - Star 15", "Ripple Field 2 - Star 16", "Ripple Field 2 - Star 17", "Ripple Field 2 - Maxim Tomato (Currents)", "Ripple Field 2 - 1-Up (Currents)"], "music": 10}, {"name": "Ripple Field 2 - 4", "level": 2, "stage": 2, "room": 4, "pointer": 2972744, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 3, "unkn2": 9, "x": 520, "y": 88, "name": "Ripple Field 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[8, 19]], "locations": [], "music": 10}, {"name": "Ripple Field 2 - 5", "level": 2, "stage": 2, "room": 5, "pointer": 3109710, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 16, "unkn2": 16, "x": 1048, "y": 280, "name": "Ripple Field 2 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 2 - Animal 3", "Ripple Field 2 - Animal 4"], "music": 38}, {"name": "Ripple Field 2 - 6", "level": 2, "stage": 2, "room": 6, "pointer": 2973127, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[8, 19], [42, 19]], "locations": ["Ripple Field 2 - Bakasa"], "music": 8}, {"name": "Ripple Field 2 - 7", "level": 2, "stage": 2, "room": 7, "pointer": 2890353, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 2 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 0", "level": 2, "stage": 3, "room": 0, "pointer": 3517254, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 105, "unkn2": 8, "x": 40, "y": 104, "name": "Ripple Field 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[21, 16], [57, 16], [62, 16], [67, 16], [4, 22], [14, 23]], "locations": ["Ripple Field 3 - Enemy 1 (Raft Waddle Dee)", "Ripple Field 3 - Enemy 2 (Kapar)", "Ripple Field 3 - Enemy 3 (Blipper)", "Ripple Field 3 - Star 1", "Ripple Field 3 - Star 2", "Ripple Field 3 - Star 3", "Ripple Field 3 - Star 4"], "music": 18}, {"name": "Ripple Field 3 - 1", "level": 2, "stage": 3, "room": 1, "pointer": 3604480, "animal_pointers": [], "consumables": [{"idx": 10, "pointer": 320, "x": 832, "y": 152, "etype": 22, "vtype": 2, "name": "Ripple Field 3 - Maxim Tomato (Cove)"}, {"idx": 13, "pointer": 424, "x": 1128, "y": 384, "etype": 22, "vtype": 0, "name": "Ripple Field 3 - 1-Up (Cutter/Spark)"}], "consumables_pointer": 160, "enemies": ["Sparky", "Glunk", "Joe"], "default_exits": [{"room": 7, "unkn1": 80, "unkn2": 24, "x": 104, "y": 328, "name": "Ripple Field 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[13, 23], [14, 23], [91, 16], [16, 16], [2, 22], [8, 16], [0, 22]], "locations": ["Ripple Field 3 - Enemy 4 (Sparky)", "Ripple Field 3 - Enemy 5 (Glunk)", "Ripple Field 3 - Enemy 6 (Joe)", "Ripple Field 3 - Star 5", "Ripple Field 3 - Star 6", "Ripple Field 3 - Star 7", "Ripple Field 3 - Star 8", "Ripple Field 3 - Star 9", "Ripple Field 3 - Star 10", "Ripple Field 3 - Star 11", "Ripple Field 3 - Maxim Tomato (Cove)", "Ripple Field 3 - 1-Up (Cutter/Spark)"], "music": 18}, {"name": "Ripple Field 3 - 2", "level": 2, "stage": 3, "room": 2, "pointer": 3715428, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobo"], "default_exits": [{"room": 4, "unkn1": 118, "unkn2": 9, "x": 56, "y": 152, "name": "Ripple Field 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [21, 16], [4, 22], [46, 16], [47, 16], [5, 16], [14, 23]], "locations": ["Ripple Field 3 - Enemy 7 (Bobo)", "Ripple Field 3 - Star 12", "Ripple Field 3 - Star 13", "Ripple Field 3 - Star 14", "Ripple Field 3 - Star 15", "Ripple Field 3 - Star 16", "Ripple Field 3 - Star 17", "Ripple Field 3 - Star 18", "Ripple Field 3 - Star 19", "Ripple Field 3 - Star 20", "Ripple Field 3 - Star 21"], "music": 18}, {"name": "Ripple Field 3 - 3", "level": 2, "stage": 3, "room": 3, "pointer": 3071919, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 15, "unkn2": 6, "x": 56, "y": 104, "name": "Ripple Field 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 3 - Animal 1", "Ripple Field 3 - Animal 2"], "music": 39}, {"name": "Ripple Field 3 - 4", "level": 2, "stage": 3, "room": 4, "pointer": 2970810, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": ["Ripple Field 3 - Elieel"], "music": 8}, {"name": "Ripple Field 3 - 5", "level": 2, "stage": 3, "room": 5, "pointer": 2987502, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 15, "unkn2": 9, "x": 232, "y": 88, "name": "Ripple Field 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[9, 19]], "locations": [], "music": 31}, {"name": "Ripple Field 3 - 6", "level": 2, "stage": 3, "room": 6, "pointer": 2888666, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 3 - Complete"], "music": 5}, {"name": "Ripple Field 3 - 7", "level": 2, "stage": 3, "room": 7, "pointer": 3161120, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 3, "unkn2": 5, "x": 40, "y": 152, "name": "Ripple Field 3 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 11, "unkn2": 20, "x": 56, "y": 216, "name": "Ripple Field 3 - 7 Exit 1", "access_rule": []}], "entity_load": [[57, 16]], "locations": [], "music": 18}, {"name": "Ripple Field 4 - 0", "level": 2, "stage": 4, "room": 0, "pointer": 3082540, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Stone)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Mony"], "default_exits": [{"room": 6, "unkn1": 4, "unkn2": 16, "x": 72, "y": 232, "name": "Ripple Field 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [79, 16], [80, 16], [81, 16], [4, 22], [20, 16], [77, 16]], "locations": ["Ripple Field 4 - Enemy 1 (Bukiset (Stone))", "Ripple Field 4 - Enemy 2 (Bukiset (Needle))", "Ripple Field 4 - Enemy 3 (Bukiset (Clean))", "Ripple Field 4 - Enemy 4 (Bukiset (Parasol))", "Ripple Field 4 - Enemy 5 (Mony)", "Ripple Field 4 - Star 1", "Ripple Field 4 - Star 2", "Ripple Field 4 - Star 3", "Ripple Field 4 - Star 4", "Ripple Field 4 - Star 5"], "music": 15}, {"name": "Ripple Field 4 - 1", "level": 2, "stage": 4, "room": 1, "pointer": 2964846, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 72, "y": 88, "name": "Ripple Field 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Ripple Field 4 - Miniboss 1 (Captain Stitch)"], "music": 4}, {"name": "Ripple Field 4 - 2", "level": 2, "stage": 4, "room": 2, "pointer": 3018503, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)"], "default_exits": [{"room": 11, "unkn1": 25, "unkn2": 5, "x": 56, "y": 88, "name": "Ripple Field 4 - 2 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 25, "unkn2": 15, "x": 56, "y": 216, "name": "Ripple Field 4 - 2 Exit 1", "access_rule": []}], "entity_load": [[10, 19], [76, 16]], "locations": ["Ripple Field 4 - Enemy 6 (Bukiset (Burning))"], "music": 15}, {"name": "Ripple Field 4 - 3", "level": 2, "stage": 4, "room": 3, "pointer": 2988166, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[10, 19], [42, 19]], "locations": ["Ripple Field 4 - Toad & Little Toad"], "music": 8}, {"name": "Ripple Field 4 - 4", "level": 2, "stage": 4, "room": 4, "pointer": 2885533, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 4 - Complete"], "music": 5}, {"name": "Ripple Field 4 - 5", "level": 2, "stage": 4, "room": 5, "pointer": 3042349, "animal_pointers": [222, 230, 238], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 5, "x": 360, "y": 120, "name": "Ripple Field 4 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 488, "y": 120, "name": "Ripple Field 4 - 5 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 16, "unkn2": 5, "x": 104, "y": 88, "name": "Ripple Field 4 - 5 Exit 2", "access_rule": []}, {"room": 6, "unkn1": 10, "unkn2": 11, "x": 440, "y": 216, "name": "Ripple Field 4 - 5 Exit 3", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 4 - Animal 1", "Ripple Field 4 - Animal 2", "Ripple Field 4 - Animal 3"], "music": 40}, {"name": "Ripple Field 4 - 6", "level": 2, "stage": 4, "room": 6, "pointer": 3234805, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Blipper"], "default_exits": [{"room": 5, "unkn1": 21, "unkn2": 7, "x": 104, "y": 88, "name": "Ripple Field 4 - 6 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 31, "unkn2": 7, "x": 232, "y": 88, "name": "Ripple Field 4 - 6 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 26, "unkn2": 13, "x": 184, "y": 184, "name": "Ripple Field 4 - 6 Exit 2", "access_rule": []}, {"room": 12, "unkn1": 48, "unkn2": 15, "x": 88, "y": 216, "name": "Ripple Field 4 - 6 Exit 3", "access_rule": []}], "entity_load": [[73, 16], [14, 23], [21, 16], [13, 23]], "locations": ["Ripple Field 4 - Enemy 7 (Bobin)", "Ripple Field 4 - Enemy 8 (Blipper)", "Ripple Field 4 - Star 6", "Ripple Field 4 - Star 7"], "music": 15}, {"name": "Ripple Field 4 - 7", "level": 2, "stage": 4, "room": 7, "pointer": 3155468, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 11, "unkn2": 6, "x": 104, "y": 136, "name": "Ripple Field 4 - 7 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 18, "unkn2": 9, "x": 72, "y": 248, "name": "Ripple Field 4 - 7 Exit 1", "access_rule": []}], "entity_load": [[14, 23], [1, 16], [0, 23]], "locations": ["Ripple Field 4 - Star 8", "Ripple Field 4 - Star 9", "Ripple Field 4 - Star 10", "Ripple Field 4 - Star 11", "Ripple Field 4 - Star 12", "Ripple Field 4 - Star 13", "Ripple Field 4 - Star 14", "Ripple Field 4 - Star 15", "Ripple Field 4 - Star 16", "Ripple Field 4 - Star 17", "Ripple Field 4 - Star 18", "Ripple Field 4 - Star 19", "Ripple Field 4 - Star 20", "Ripple Field 4 - Star 21"], "music": 15}, {"name": "Ripple Field 4 - 8", "level": 2, "stage": 4, "room": 8, "pointer": 3350031, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Oro"], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 22, "x": 184, "y": 440, "name": "Ripple Field 4 - 8 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 34, "unkn2": 22, "x": 296, "y": 440, "name": "Ripple Field 4 - 8 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 16, "unkn2": 72, "x": 168, "y": 152, "name": "Ripple Field 4 - 8 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 23, "unkn2": 72, "x": 120, "y": 152, "name": "Ripple Field 4 - 8 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [68, 16], [14, 23], [25, 16], [6, 23]], "locations": ["Ripple Field 4 - Enemy 9 (Como)", "Ripple Field 4 - Enemy 10 (Oro)", "Ripple Field 4 - Star 22", "Ripple Field 4 - Star 23", "Ripple Field 4 - Star 24", "Ripple Field 4 - Star 25", "Ripple Field 4 - Star 26", "Ripple Field 4 - Star 27", "Ripple Field 4 - Star 28"], "music": 15}, {"name": "Ripple Field 4 - 9", "level": 2, "stage": 4, "room": 9, "pointer": 3050397, "animal_pointers": [], "consumables": [{"idx": 29, "pointer": 200, "x": 88, "y": 200, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Stone)"}], "consumables_pointer": 176, "enemies": ["Gansan"], "default_exits": [{"room": 8, "unkn1": 11, "unkn2": 9, "x": 264, "y": 1144, "name": "Ripple Field 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[75, 16], [2, 22]], "locations": ["Ripple Field 4 - Enemy 11 (Gansan)", "Ripple Field 4 - Maxim Tomato (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 10", "level": 2, "stage": 4, "room": 10, "pointer": 3052069, "animal_pointers": [], "consumables": [{"idx": 30, "pointer": 192, "x": 200, "y": 200, "etype": 22, "vtype": 0, "name": "Ripple Field 4 - 1-Up (Stone)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 8, "unkn1": 6, "unkn2": 9, "x": 376, "y": 1144, "name": "Ripple Field 4 - 10 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [75, 16]], "locations": ["Ripple Field 4 - 1-Up (Stone)"], "music": 15}, {"name": "Ripple Field 4 - 11", "level": 2, "stage": 4, "room": 11, "pointer": 3386974, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Kapar", "Squishy"], "default_exits": [{"room": 3, "unkn1": 146, "unkn2": 13, "x": 72, "y": 152, "name": "Ripple Field 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[22, 16], [67, 16], [14, 23], [62, 16], [0, 16]], "locations": ["Ripple Field 4 - Enemy 12 (Waddle Dee)", "Ripple Field 4 - Enemy 13 (Kapar)", "Ripple Field 4 - Enemy 14 (Squishy)", "Ripple Field 4 - Star 29", "Ripple Field 4 - Star 30", "Ripple Field 4 - Star 31", "Ripple Field 4 - Star 32", "Ripple Field 4 - Star 33", "Ripple Field 4 - Star 34", "Ripple Field 4 - Star 35", "Ripple Field 4 - Star 36", "Ripple Field 4 - Star 37", "Ripple Field 4 - Star 38", "Ripple Field 4 - Star 39", "Ripple Field 4 - Star 40", "Ripple Field 4 - Star 41", "Ripple Field 4 - Star 42", "Ripple Field 4 - Star 43"], "music": 15}, {"name": "Ripple Field 4 - 12", "level": 2, "stage": 4, "room": 12, "pointer": 3168339, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 8, "unkn1": 67, "unkn2": 7, "x": 88, "y": 1224, "name": "Ripple Field 4 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 75, "unkn2": 7, "x": 88, "y": 136, "name": "Ripple Field 4 - 12 Exit 1", "access_rule": []}], "entity_load": [[59, 16], [13, 23], [28, 16]], "locations": ["Ripple Field 4 - Enemy 15 (Nidoo)"], "music": 15}, {"name": "Ripple Field 4 - 13", "level": 2, "stage": 4, "room": 13, "pointer": 2958478, "animal_pointers": [], "consumables": [{"idx": 54, "pointer": 264, "x": 216, "y": 136, "etype": 22, "vtype": 2, "name": "Ripple Field 4 - Maxim Tomato (Dark)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 12, "unkn1": 4, "unkn2": 8, "x": 1192, "y": 120, "name": "Ripple Field 4 - 13 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [2, 22], [59, 16]], "locations": ["Ripple Field 4 - Star 44", "Ripple Field 4 - Star 45", "Ripple Field 4 - Star 46", "Ripple Field 4 - Star 47", "Ripple Field 4 - Star 48", "Ripple Field 4 - Star 49", "Ripple Field 4 - Star 50", "Ripple Field 4 - Star 51", "Ripple Field 4 - Maxim Tomato (Dark)"], "music": 15}, {"name": "Ripple Field 5 - 0", "level": 2, "stage": 5, "room": 0, "pointer": 3240369, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 9, "unkn2": 43, "x": 88, "y": 344, "name": "Ripple Field 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": ["Ripple Field 5 - Star 1", "Ripple Field 5 - Star 2", "Ripple Field 5 - Star 3", "Ripple Field 5 - Star 4", "Ripple Field 5 - Star 5", "Ripple Field 5 - Star 6"], "music": 16}, {"name": "Ripple Field 5 - 1", "level": 2, "stage": 5, "room": 1, "pointer": 3547528, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 4, "x": 184, "y": 344, "name": "Ripple Field 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23]], "locations": ["Ripple Field 5 - Star 7", "Ripple Field 5 - Star 8", "Ripple Field 5 - Star 9", "Ripple Field 5 - Star 10", "Ripple Field 5 - Star 11", "Ripple Field 5 - Star 12", "Ripple Field 5 - Star 13", "Ripple Field 5 - Star 14", "Ripple Field 5 - Star 15", "Ripple Field 5 - Star 16", "Ripple Field 5 - Star 17"], "music": 16}, {"name": "Ripple Field 5 - 2", "level": 2, "stage": 5, "room": 2, "pointer": 3611327, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Joe"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 21, "x": 56, "y": 184, "name": "Ripple Field 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [16, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 1 (Glunk)", "Ripple Field 5 - Enemy 2 (Joe)", "Ripple Field 5 - Star 18", "Ripple Field 5 - Star 19", "Ripple Field 5 - Star 20", "Ripple Field 5 - Star 21", "Ripple Field 5 - Star 22", "Ripple Field 5 - Star 23", "Ripple Field 5 - Star 24", "Ripple Field 5 - Star 25", "Ripple Field 5 - Star 26", "Ripple Field 5 - Star 27", "Ripple Field 5 - Star 28", "Ripple Field 5 - Star 29", "Ripple Field 5 - Star 30", "Ripple Field 5 - Star 31"], "music": 16}, {"name": "Ripple Field 5 - 3", "level": 2, "stage": 5, "room": 3, "pointer": 3926157, "animal_pointers": [], "consumables": [{"idx": 32, "pointer": 1258, "x": 1488, "y": 192, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Currents)"}, {"idx": 31, "pointer": 1290, "x": 1520, "y": 192, "etype": 22, "vtype": 0, "name": "Ripple Field 5 - 1-Up (Currents)"}], "consumables_pointer": 128, "enemies": ["Bobin", "Mony", "Squishy"], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 38, "x": 152, "y": 152, "name": "Ripple Field 5 - 3 Exit 0", "access_rule": ["Kine", "Kine Spawn"]}, {"room": 1, "unkn1": 95, "unkn2": 38, "x": 248, "y": 1064, "name": "Ripple Field 5 - 3 Exit 1", "access_rule": []}], "entity_load": [[0, 22], [2, 22], [6, 22], [14, 23], [1, 16], [73, 16], [22, 16], [20, 16]], "locations": ["Ripple Field 5 - Enemy 3 (Bobin)", "Ripple Field 5 - Enemy 4 (Mony)", "Ripple Field 5 - Enemy 5 (Squishy)", "Ripple Field 5 - Star 32", "Ripple Field 5 - Star 33", "Ripple Field 5 - Star 34", "Ripple Field 5 - Star 35", "Ripple Field 5 - Star 36", "Ripple Field 5 - Star 37", "Ripple Field 5 - Maxim Tomato (Currents)", "Ripple Field 5 - 1-Up (Currents)"], "music": 16}, {"name": "Ripple Field 5 - 4", "level": 2, "stage": 5, "room": 4, "pointer": 3026639, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 14, "unkn2": 4, "x": 232, "y": 152, "name": "Ripple Field 5 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 1"], "music": 40}, {"name": "Ripple Field 5 - 5", "level": 2, "stage": 5, "room": 5, "pointer": 3207333, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 56, "y": 72, "name": "Ripple Field 5 - 5 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 9, "x": 120, "y": 552, "name": "Ripple Field 5 - 5 Exit 1", "access_rule": ["Kine", "Kine Spawn"]}], "entity_load": [[14, 23]], "locations": ["Ripple Field 5 - Star 38", "Ripple Field 5 - Star 39", "Ripple Field 5 - Star 40", "Ripple Field 5 - Star 41", "Ripple Field 5 - Star 42"], "music": 16}, {"name": "Ripple Field 5 - 6", "level": 2, "stage": 5, "room": 6, "pointer": 3485896, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Broom Hatter", "Bouncy"], "default_exits": [{"room": 9, "unkn1": 121, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [22, 16], [14, 23], [13, 16], [11, 16], [32, 16]], "locations": ["Ripple Field 5 - Enemy 6 (Yaban)", "Ripple Field 5 - Enemy 7 (Broom Hatter)", "Ripple Field 5 - Enemy 8 (Bouncy)", "Ripple Field 5 - Star 43", "Ripple Field 5 - Star 44", "Ripple Field 5 - Star 45"], "music": 16}, {"name": "Ripple Field 5 - 7", "level": 2, "stage": 5, "room": 7, "pointer": 3752698, "animal_pointers": [], "consumables": [{"idx": 53, "pointer": 418, "x": 1512, "y": 608, "etype": 22, "vtype": 2, "name": "Ripple Field 5 - Maxim Tomato (Exit)"}], "consumables_pointer": 352, "enemies": ["Sparky", "Rocky", "Babut"], "default_exits": [{"room": 10, "unkn1": 45, "unkn2": 31, "x": 152, "y": 152, "name": "Ripple Field 5 - 7 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 94, "unkn2": 40, "x": 88, "y": 200, "name": "Ripple Field 5 - 7 Exit 1", "access_rule": []}], "entity_load": [[3, 16], [43, 16], [8, 16], [22, 16], [14, 23], [2, 22]], "locations": ["Ripple Field 5 - Enemy 9 (Sparky)", "Ripple Field 5 - Enemy 10 (Rocky)", "Ripple Field 5 - Enemy 11 (Babut)", "Ripple Field 5 - Star 46", "Ripple Field 5 - Star 47", "Ripple Field 5 - Star 48", "Ripple Field 5 - Star 49", "Ripple Field 5 - Maxim Tomato (Exit)"], "music": 16}, {"name": "Ripple Field 5 - 8", "level": 2, "stage": 5, "room": 8, "pointer": 3044682, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 8, "unkn2": 9, "x": 88, "y": 616, "name": "Ripple Field 5 - 8 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 5 - Animal 2"], "music": 39}, {"name": "Ripple Field 5 - 9", "level": 2, "stage": 5, "room": 9, "pointer": 2963193, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[11, 19], [42, 19]], "locations": ["Ripple Field 5 - Mama Pitch"], "music": 8}, {"name": "Ripple Field 5 - 10", "level": 2, "stage": 5, "room": 10, "pointer": 3042934, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 8, "unkn2": 9, "x": 712, "y": 504, "name": "Ripple Field 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [14, 23]], "locations": ["Ripple Field 5 - Enemy 12 (Galbo)", "Ripple Field 5 - Star 50", "Ripple Field 5 - Star 51"], "music": 16}, {"name": "Ripple Field 5 - 11", "level": 2, "stage": 5, "room": 11, "pointer": 2886256, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 5 - Complete"], "music": 5}, {"name": "Ripple Field 6 - 0", "level": 2, "stage": 6, "room": 0, "pointer": 2949576, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 1, "unkn1": 56, "unkn2": 7, "x": 40, "y": 152, "name": "Ripple Field 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[29, 16], [13, 23]], "locations": ["Ripple Field 6 - Enemy 1 (Kany)"], "music": 15}, {"name": "Ripple Field 6 - 1", "level": 2, "stage": 6, "room": 1, "pointer": 2971200, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 23, "unkn2": 9, "x": 56, "y": 264, "name": "Ripple Field 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 1", "Ripple Field 6 - Animal 2", "Ripple Field 6 - Animal 3"], "music": 38}, {"name": "Ripple Field 6 - 2", "level": 2, "stage": 6, "room": 2, "pointer": 3637749, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 95, "unkn2": 9, "x": 104, "y": 872, "name": "Ripple Field 6 - 2 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 50, "unkn2": 22, "x": 184, "y": 88, "name": "Ripple Field 6 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 45, "unkn2": 26, "x": 88, "y": 88, "name": "Ripple Field 6 - 2 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 55, "unkn2": 26, "x": 248, "y": 88, "name": "Ripple Field 6 - 2 Exit 3", "access_rule": []}], "entity_load": [[52, 16], [13, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 3", "level": 2, "stage": 6, "room": 3, "pointer": 3092564, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 5, "x": 744, "y": 424, "name": "Ripple Field 6 - 3 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 16, "unkn2": 5, "x": 872, "y": 424, "name": "Ripple Field 6 - 3 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 4", "level": 2, "stage": 6, "room": 4, "pointer": 3133247, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 5, "x": 824, "y": 360, "name": "Ripple Field 6 - 4 Exit 0", "access_rule": []}], "entity_load": [[12, 19]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 5", "level": 2, "stage": 6, "room": 5, "pointer": 3507762, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 76, "unkn2": 4, "x": 680, "y": 72, "name": "Ripple Field 6 - 5 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 6, "x": 440, "y": 104, "name": "Ripple Field 6 - 5 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 49, "unkn2": 10, "x": 440, "y": 168, "name": "Ripple Field 6 - 5 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 88, "unkn2": 10, "x": 104, "y": 152, "name": "Ripple Field 6 - 5 Exit 3", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 12, "x": 200, "y": 200, "name": "Ripple Field 6 - 5 Exit 4", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 12, "x": 680, "y": 200, "name": "Ripple Field 6 - 5 Exit 5", "access_rule": []}, {"room": 6, "unkn1": 76, "unkn2": 16, "x": 680, "y": 264, "name": "Ripple Field 6 - 5 Exit 6", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 6", "level": 2, "stage": 6, "room": 6, "pointer": 3211264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 10, "x": 72, "y": 168, "name": "Ripple Field 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 23]], "locations": [], "music": 15}, {"name": "Ripple Field 6 - 7", "level": 2, "stage": 6, "room": 7, "pointer": 3586039, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Kapar", "Rocky", "Poppy Bros Jr."], "default_exits": [{"room": 5, "unkn1": 134, "unkn2": 16, "x": 72, "y": 168, "name": "Ripple Field 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [3, 16], [67, 16], [51, 16], [7, 16]], "locations": ["Ripple Field 6 - Enemy 2 (KeKe)", "Ripple Field 6 - Enemy 3 (Kapar)", "Ripple Field 6 - Enemy 4 (Rocky)", "Ripple Field 6 - Enemy 5 (Poppy Bros Jr.)", "Ripple Field 6 - Star 1", "Ripple Field 6 - Star 2", "Ripple Field 6 - Star 3", "Ripple Field 6 - Star 4", "Ripple Field 6 - Star 5", "Ripple Field 6 - Star 6", "Ripple Field 6 - Star 7", "Ripple Field 6 - Star 8", "Ripple Field 6 - Star 9", "Ripple Field 6 - Star 10", "Ripple Field 6 - Star 11", "Ripple Field 6 - Star 12", "Ripple Field 6 - Star 13", "Ripple Field 6 - Star 14"], "music": 15}, {"name": "Ripple Field 6 - 8", "level": 2, "stage": 6, "room": 8, "pointer": 3621483, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Coconut", "Sasuke", "Nruff"], "default_exits": [{"room": 10, "unkn1": 70, "unkn2": 11, "x": 56, "y": 152, "name": "Ripple Field 6 - 8 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 26, "unkn2": 54, "x": 72, "y": 152, "name": "Ripple Field 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[89, 16], [15, 16], [30, 16], [34, 16], [14, 23]], "locations": ["Ripple Field 6 - Enemy 6 (Propeller)", "Ripple Field 6 - Enemy 7 (Coconut)", "Ripple Field 6 - Enemy 8 (Sasuke)", "Ripple Field 6 - Enemy 9 (Nruff)", "Ripple Field 6 - Star 15", "Ripple Field 6 - Star 16", "Ripple Field 6 - Star 17", "Ripple Field 6 - Star 18", "Ripple Field 6 - Star 19", "Ripple Field 6 - Star 20", "Ripple Field 6 - Star 21", "Ripple Field 6 - Star 22", "Ripple Field 6 - Star 23"], "music": 15}, {"name": "Ripple Field 6 - 9", "level": 2, "stage": 6, "room": 9, "pointer": 2954523, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 3, "unkn2": 9, "x": 408, "y": 872, "name": "Ripple Field 6 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Ripple Field 6 - Animal 4"], "music": 39}, {"name": "Ripple Field 6 - 10", "level": 2, "stage": 6, "room": 10, "pointer": 3069438, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Ripple Field 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[12, 19], [42, 19]], "locations": ["Ripple Field 6 - HB-002"], "music": 8}, {"name": "Ripple Field 6 - 11", "level": 2, "stage": 6, "room": 11, "pointer": 2886497, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Ripple Field 6 - Complete"], "music": 5}, {"name": "Ripple Field Boss - 0", "level": 2, "stage": 7, "room": 0, "pointer": 3157370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[7, 18]], "locations": ["Ripple Field - Boss (Acro) Purified", "Level 2 Boss - Defeated", "Level 2 Boss - Purified"], "music": 2}, {"name": "Sand Canyon 1 - 0", "level": 3, "stage": 1, "room": 0, "pointer": 3524267, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo"], "default_exits": [{"room": 5, "unkn1": 196, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [1, 16], [26, 16], [2, 16]], "locations": ["Sand Canyon 1 - Enemy 1 (Bronto Burt)", "Sand Canyon 1 - Enemy 2 (Galbo)"], "music": 13}, {"name": "Sand Canyon 1 - 1", "level": 3, "stage": 1, "room": 1, "pointer": 3163860, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 34, "unkn2": 5, "x": 104, "y": 408, "name": "Sand Canyon 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 1 - Animal 1", "Sand Canyon 1 - Animal 2"], "music": 38}, {"name": "Sand Canyon 1 - 2", "level": 3, "stage": 1, "room": 2, "pointer": 3512532, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro"], "default_exits": [{"room": 3, "unkn1": 73, "unkn2": 6, "x": 56, "y": 120, "name": "Sand Canyon 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [26, 16], [25, 16], [4, 22], [14, 23], [1, 23], [0, 23], [4, 23]], "locations": ["Sand Canyon 1 - Enemy 3 (Oro)", "Sand Canyon 1 - Star 1", "Sand Canyon 1 - Star 2", "Sand Canyon 1 - Star 3", "Sand Canyon 1 - Star 4"], "music": 13}, {"name": "Sand Canyon 1 - 3", "level": 3, "stage": 1, "room": 3, "pointer": 3719146, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Propeller", "Gansan", "Babut"], "default_exits": [{"room": 4, "unkn1": 25, "unkn2": 73, "x": 72, "y": 280, "name": "Sand Canyon 1 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [75, 16], [43, 16], [8, 16]], "locations": ["Sand Canyon 1 - Enemy 4 (Sparky)", "Sand Canyon 1 - Enemy 5 (Propeller)", "Sand Canyon 1 - Enemy 6 (Gansan)", "Sand Canyon 1 - Enemy 7 (Babut)"], "music": 13}, {"name": "Sand Canyon 1 - 4", "level": 3, "stage": 1, "room": 4, "pointer": 3421212, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Loud", "Dogon", "Bouncy", "Pteran"], "default_exits": [{"room": 7, "unkn1": 196, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[90, 16], [13, 16], [40, 16], [14, 23], [39, 16]], "locations": ["Sand Canyon 1 - Enemy 8 (Loud)", "Sand Canyon 1 - Enemy 9 (Dogon)", "Sand Canyon 1 - Enemy 10 (Bouncy)", "Sand Canyon 1 - Enemy 11 (Pteran)", "Sand Canyon 1 - Star 5", "Sand Canyon 1 - Star 6", "Sand Canyon 1 - Star 7", "Sand Canyon 1 - Star 8", "Sand Canyon 1 - Star 9", "Sand Canyon 1 - Star 10"], "music": 13}, {"name": "Sand Canyon 1 - 5", "level": 3, "stage": 1, "room": 5, "pointer": 3203325, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Polof"], "default_exits": [{"room": 6, "unkn1": 32, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 1 - 5 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 46, "unkn2": 9, "x": 56, "y": 344, "name": "Sand Canyon 1 - 5 Exit 1", "access_rule": []}], "entity_load": [[9, 16]], "locations": ["Sand Canyon 1 - Enemy 12 (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 6", "level": 3, "stage": 1, "room": 6, "pointer": 3138524, "animal_pointers": [], "consumables": [{"idx": 23, "pointer": 248, "x": 168, "y": 104, "etype": 22, "vtype": 0, "name": "Sand Canyon 1 - 1-Up (Polof)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 5, "unkn1": 5, "unkn2": 9, "x": 536, "y": 152, "name": "Sand Canyon 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [0, 22]], "locations": ["Sand Canyon 1 - Star 11", "Sand Canyon 1 - Star 12", "Sand Canyon 1 - Star 13", "Sand Canyon 1 - Star 14", "Sand Canyon 1 - Star 15", "Sand Canyon 1 - Star 16", "Sand Canyon 1 - Star 17", "Sand Canyon 1 - Star 18", "Sand Canyon 1 - Star 19", "Sand Canyon 1 - Star 20", "Sand Canyon 1 - Star 21", "Sand Canyon 1 - Star 22", "Sand Canyon 1 - 1-Up (Polof)"], "music": 13}, {"name": "Sand Canyon 1 - 7", "level": 3, "stage": 1, "room": 7, "pointer": 2988822, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 1 - 7 Exit 0", "access_rule": []}], "entity_load": [[14, 19], [42, 19]], "locations": ["Sand Canyon 1 - Geromuzudake"], "music": 8}, {"name": "Sand Canyon 1 - 8", "level": 3, "stage": 1, "room": 8, "pointer": 2885292, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 1 - Complete"], "music": 5}, {"name": "Sand Canyon 2 - 0", "level": 3, "stage": 2, "room": 0, "pointer": 3668370, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe", "Doka", "Boten"], "default_exits": [{"room": 1, "unkn1": 178, "unkn2": 8, "x": 184, "y": 104, "name": "Sand Canyon 2 - 0 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 244, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 2 - 0 Exit 1", "access_rule": []}], "entity_load": [[35, 16], [33, 16], [14, 23], [51, 16], [47, 16], [46, 16]], "locations": ["Sand Canyon 2 - Enemy 1 (KeKe)", "Sand Canyon 2 - Enemy 2 (Doka)", "Sand Canyon 2 - Enemy 3 (Boten)", "Sand Canyon 2 - Star 1", "Sand Canyon 2 - Star 2", "Sand Canyon 2 - Star 3", "Sand Canyon 2 - Star 4", "Sand Canyon 2 - Star 5", "Sand Canyon 2 - Star 6", "Sand Canyon 2 - Star 7", "Sand Canyon 2 - Star 8", "Sand Canyon 2 - Star 9", "Sand Canyon 2 - Star 10", "Sand Canyon 2 - Star 11"], "music": 21}, {"name": "Sand Canyon 2 - 1", "level": 3, "stage": 2, "room": 1, "pointer": 2952738, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 10, "unkn2": 6, "x": 2872, "y": 136, "name": "Sand Canyon 2 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 2 - Animal 1", "Sand Canyon 2 - Animal 2"], "music": 40}, {"name": "Sand Canyon 2 - 2", "level": 3, "stage": 2, "room": 2, "pointer": 3531156, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 9, "unkn1": 45, "unkn2": 60, "x": 88, "y": 184, "name": "Sand Canyon 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[6, 23], [89, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 4 (Propeller)", "Sand Canyon 2 - Star 12", "Sand Canyon 2 - Star 13", "Sand Canyon 2 - Star 14", "Sand Canyon 2 - Star 15", "Sand Canyon 2 - Star 16", "Sand Canyon 2 - Star 17"], "music": 21}, {"name": "Sand Canyon 2 - 3", "level": 3, "stage": 2, "room": 3, "pointer": 3263731, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Sasuke", "Como"], "default_exits": [{"room": 4, "unkn1": 63, "unkn2": 5, "x": 88, "y": 184, "name": "Sand Canyon 2 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 68, "unkn2": 5, "x": 184, "y": 184, "name": "Sand Canyon 2 - 3 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 73, "unkn2": 5, "x": 248, "y": 184, "name": "Sand Canyon 2 - 3 Exit 2", "access_rule": []}, {"room": 5, "unkn1": 130, "unkn2": 9, "x": 72, "y": 312, "name": "Sand Canyon 2 - 3 Exit 3", "access_rule": []}], "entity_load": [[41, 16], [8, 16], [30, 16], [0, 16]], "locations": ["Sand Canyon 2 - Enemy 5 (Waddle Dee)", "Sand Canyon 2 - Enemy 6 (Sparky)", "Sand Canyon 2 - Enemy 7 (Sasuke)", "Sand Canyon 2 - Enemy 8 (Como)"], "music": 21}, {"name": "Sand Canyon 2 - 4", "level": 3, "stage": 2, "room": 4, "pointer": 3076300, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 228, "x": 168, "y": 72, "etype": 22, "vtype": 0, "name": "Sand Canyon 2 - 1-Up (Enclave)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 3, "unkn1": 5, "unkn2": 11, "x": 1016, "y": 88, "name": "Sand Canyon 2 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 10, "unkn2": 11, "x": 1112, "y": 88, "name": "Sand Canyon 2 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 11, "x": 1176, "y": 88, "name": "Sand Canyon 2 - 4 Exit 2", "access_rule": []}], "entity_load": [[14, 23], [0, 22], [4, 22]], "locations": ["Sand Canyon 2 - Star 18", "Sand Canyon 2 - Star 19", "Sand Canyon 2 - 1-Up (Enclave)"], "music": 21}, {"name": "Sand Canyon 2 - 5", "level": 3, "stage": 2, "room": 5, "pointer": 3302133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 6, "unkn1": 63, "unkn2": 15, "x": 120, "y": 216, "name": "Sand Canyon 2 - 5 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 71, "unkn2": 18, "x": 152, "y": 136, "name": "Sand Canyon 2 - 5 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 130, "unkn2": 19, "x": 72, "y": 952, "name": "Sand Canyon 2 - 5 Exit 2", "access_rule": []}, {"room": 7, "unkn1": 56, "unkn2": 23, "x": 88, "y": 216, "name": "Sand Canyon 2 - 5 Exit 3", "access_rule": []}], "entity_load": [[80, 16], [78, 16], [81, 16], [83, 16], [79, 16], [82, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 2 - Enemy 10 (Bukiset (Needle))", "Sand Canyon 2 - Enemy 11 (Bukiset (Clean))", "Sand Canyon 2 - Enemy 12 (Bukiset (Parasol))", "Sand Canyon 2 - Enemy 13 (Bukiset (Spark))", "Sand Canyon 2 - Enemy 14 (Bukiset (Cutter))", "Sand Canyon 2 - Star 20", "Sand Canyon 2 - Star 21", "Sand Canyon 2 - Star 22", "Sand Canyon 2 - Star 23", "Sand Canyon 2 - Star 24", "Sand Canyon 2 - Star 25", "Sand Canyon 2 - Star 26", "Sand Canyon 2 - Star 27", "Sand Canyon 2 - Star 28", "Sand Canyon 2 - Star 29", "Sand Canyon 2 - Star 30", "Sand Canyon 2 - Star 31", "Sand Canyon 2 - Star 32", "Sand Canyon 2 - Star 33"], "music": 21}, {"name": "Sand Canyon 2 - 6", "level": 3, "stage": 2, "room": 6, "pointer": 3800612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 5, "unkn1": 17, "unkn2": 13, "x": 1144, "y": 248, "name": "Sand Canyon 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 15 (Nidoo)", "Sand Canyon 2 - Star 34"], "music": 21}, {"name": "Sand Canyon 2 - 7", "level": 3, "stage": 2, "room": 7, "pointer": 3073888, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 15, "unkn2": 8, "x": 1016, "y": 296, "name": "Sand Canyon 2 - 7 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 5, "unkn2": 13, "x": 904, "y": 376, "name": "Sand Canyon 2 - 7 Exit 1", "access_rule": []}], "entity_load": [[15, 19]], "locations": [], "music": 21}, {"name": "Sand Canyon 2 - 8", "level": 3, "stage": 2, "room": 8, "pointer": 3061270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 5, "unkn1": 19, "unkn2": 13, "x": 1256, "y": 376, "name": "Sand Canyon 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [14, 23]], "locations": ["Sand Canyon 2 - Enemy 16 (Mariel)", "Sand Canyon 2 - Star 35"], "music": 21}, {"name": "Sand Canyon 2 - 9", "level": 3, "stage": 2, "room": 9, "pointer": 3453286, "animal_pointers": [], "consumables": [{"idx": 51, "pointer": 240, "x": 1408, "y": 216, "etype": 22, "vtype": 2, "name": "Sand Canyon 2 - Maxim Tomato (Underwater)"}], "consumables_pointer": 128, "enemies": ["Yaban", "Wapod", "Squishy", "Pteran"], "default_exits": [{"room": 10, "unkn1": 246, "unkn2": 10, "x": 56, "y": 152, "name": "Sand Canyon 2 - 9 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [22, 16], [2, 22], [39, 16], [88, 16], [32, 16]], "locations": ["Sand Canyon 2 - Enemy 17 (Yaban)", "Sand Canyon 2 - Enemy 18 (Wapod)", "Sand Canyon 2 - Enemy 19 (Squishy)", "Sand Canyon 2 - Enemy 20 (Pteran)", "Sand Canyon 2 - Star 36", "Sand Canyon 2 - Star 37", "Sand Canyon 2 - Star 38", "Sand Canyon 2 - Star 39", "Sand Canyon 2 - Star 40", "Sand Canyon 2 - Star 41", "Sand Canyon 2 - Star 42", "Sand Canyon 2 - Star 43", "Sand Canyon 2 - Star 44", "Sand Canyon 2 - Star 45", "Sand Canyon 2 - Star 46", "Sand Canyon 2 - Star 47", "Sand Canyon 2 - Star 48", "Sand Canyon 2 - Maxim Tomato (Underwater)"], "music": 21}, {"name": "Sand Canyon 2 - 10", "level": 3, "stage": 2, "room": 10, "pointer": 2994821, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 2 - 10 Exit 0", "access_rule": []}], "entity_load": [[15, 19], [42, 19]], "locations": ["Sand Canyon 2 - Auntie"], "music": 8}, {"name": "Sand Canyon 2 - 11", "level": 3, "stage": 2, "room": 11, "pointer": 2891799, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 2 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 0", "level": 3, "stage": 3, "room": 0, "pointer": 3544676, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Broom Hatter", "Rocky", "Gabon"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 57, "x": 104, "y": 152, "name": "Sand Canyon 3 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 11, "unkn2": 57, "x": 200, "y": 152, "name": "Sand Canyon 3 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 16, "unkn2": 57, "x": 296, "y": 152, "name": "Sand Canyon 3 - 0 Exit 2", "access_rule": []}, {"room": 2, "unkn1": 23, "unkn2": 109, "x": 104, "y": 72, "name": "Sand Canyon 3 - 0 Exit 3", "access_rule": []}], "entity_load": [[24, 16], [3, 16], [11, 16], [27, 16]], "locations": ["Sand Canyon 3 - Enemy 1 (Sir Kibble)", "Sand Canyon 3 - Enemy 2 (Broom Hatter)", "Sand Canyon 3 - Enemy 3 (Rocky)", "Sand Canyon 3 - Enemy 4 (Gabon)"], "music": 16}, {"name": "Sand Canyon 3 - 1", "level": 3, "stage": 3, "room": 1, "pointer": 2965655, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 5, "unkn2": 9, "x": 88, "y": 920, "name": "Sand Canyon 3 - 1 Exit 0", "access_rule": []}, {"room": 0, "unkn1": 11, "unkn2": 9, "x": 168, "y": 920, "name": "Sand Canyon 3 - 1 Exit 1", "access_rule": []}, {"room": 0, "unkn1": 17, "unkn2": 9, "x": 248, "y": 920, "name": "Sand Canyon 3 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 3 - Animal 1", "Sand Canyon 3 - Animal 2", "Sand Canyon 3 - Animal 3"], "music": 39}, {"name": "Sand Canyon 3 - 2", "level": 3, "stage": 3, "room": 2, "pointer": 3726270, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kany"], "default_exits": [{"room": 3, "unkn1": 184, "unkn2": 20, "x": 104, "y": 232, "name": "Sand Canyon 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[63, 16], [55, 16], [14, 23], [4, 23], [29, 16]], "locations": ["Sand Canyon 3 - Enemy 5 (Kany)", "Sand Canyon 3 - Star 1", "Sand Canyon 3 - Star 2", "Sand Canyon 3 - Star 3", "Sand Canyon 3 - Star 4", "Sand Canyon 3 - Star 5", "Sand Canyon 3 - Star 6"], "music": 16}, {"name": "Sand Canyon 3 - 3", "level": 3, "stage": 3, "room": 3, "pointer": 3416806, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 8, "unkn1": 130, "unkn2": 14, "x": 40, "y": 152, "name": "Sand Canyon 3 - 3 Exit 0", "access_rule": []}], "entity_load": [[26, 16], [6, 23], [5, 23]], "locations": ["Sand Canyon 3 - Enemy 6 (Galbo)"], "music": 16}, {"name": "Sand Canyon 3 - 4", "level": 3, "stage": 3, "room": 4, "pointer": 3564419, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Sasuke"], "default_exits": [{"room": 5, "unkn1": 135, "unkn2": 11, "x": 56, "y": 152, "name": "Sand Canyon 3 - 4 Exit 0", "access_rule": []}], "entity_load": [[68, 16], [30, 16], [14, 23], [89, 16], [24, 16]], "locations": ["Sand Canyon 3 - Enemy 7 (Propeller)", "Sand Canyon 3 - Enemy 8 (Sasuke)", "Sand Canyon 3 - Star 7", "Sand Canyon 3 - Star 8", "Sand Canyon 3 - Star 9", "Sand Canyon 3 - Star 10"], "music": 16}, {"name": "Sand Canyon 3 - 5", "level": 3, "stage": 3, "room": 5, "pointer": 2973891, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": ["Sand Canyon 3 - Caramello"], "music": 8}, {"name": "Sand Canyon 3 - 6", "level": 3, "stage": 3, "room": 6, "pointer": 3247969, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod", "Bobo", "Babut", "Magoo"], "default_exits": [{"room": 4, "unkn1": 95, "unkn2": 8, "x": 88, "y": 424, "name": "Sand Canyon 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[53, 16], [88, 16], [46, 16], [47, 16], [5, 16], [43, 16]], "locations": ["Sand Canyon 3 - Enemy 9 (Wapod)", "Sand Canyon 3 - Enemy 10 (Bobo)", "Sand Canyon 3 - Enemy 11 (Babut)", "Sand Canyon 3 - Enemy 12 (Magoo)"], "music": 16}, {"name": "Sand Canyon 3 - 7", "level": 3, "stage": 3, "room": 7, "pointer": 2887702, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 3 - Complete"], "music": 5}, {"name": "Sand Canyon 3 - 8", "level": 3, "stage": 3, "room": 8, "pointer": 2968057, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 14, "unkn2": 9, "x": 104, "y": 120, "name": "Sand Canyon 3 - 8 Exit 0", "access_rule": []}], "entity_load": [[16, 19]], "locations": [], "music": 31}, {"name": "Sand Canyon 4 - 0", "level": 3, "stage": 4, "room": 0, "pointer": 3521954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Popon Ball", "Mariel", "Chilly"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 8, "x": 216, "y": 88, "name": "Sand Canyon 4 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 199, "unkn2": 15, "x": 104, "y": 88, "name": "Sand Canyon 4 - 0 Exit 1", "access_rule": []}], "entity_load": [[6, 16], [45, 16], [6, 23], [50, 16], [14, 23]], "locations": ["Sand Canyon 4 - Enemy 1 (Popon Ball)", "Sand Canyon 4 - Enemy 2 (Mariel)", "Sand Canyon 4 - Enemy 3 (Chilly)", "Sand Canyon 4 - Star 1", "Sand Canyon 4 - Star 2", "Sand Canyon 4 - Star 3", "Sand Canyon 4 - Star 4", "Sand Canyon 4 - Star 5", "Sand Canyon 4 - Star 6", "Sand Canyon 4 - Star 7", "Sand Canyon 4 - Star 8", "Sand Canyon 4 - Star 9", "Sand Canyon 4 - Star 10", "Sand Canyon 4 - Star 11"], "music": 18}, {"name": "Sand Canyon 4 - 1", "level": 3, "stage": 4, "room": 1, "pointer": 2956289, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 12, "unkn2": 5, "x": 1544, "y": 136, "name": "Sand Canyon 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 4 - Animal 1", "Sand Canyon 4 - Animal 2", "Sand Canyon 4 - Animal 3"], "music": 39}, {"name": "Sand Canyon 4 - 2", "level": 3, "stage": 4, "room": 2, "pointer": 3505360, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 328, "x": 2024, "y": 72, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Pacto)"}], "consumables_pointer": 160, "enemies": ["Tick", "Bronto Burt", "Babut"], "default_exits": [{"room": 3, "unkn1": 149, "unkn2": 14, "x": 88, "y": 216, "name": "Sand Canyon 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [2, 22], [43, 16], [2, 16], [48, 16]], "locations": ["Sand Canyon 4 - Enemy 4 (Tick)", "Sand Canyon 4 - Enemy 5 (Bronto Burt)", "Sand Canyon 4 - Enemy 6 (Babut)", "Sand Canyon 4 - Maxim Tomato (Pacto)"], "music": 18}, {"name": "Sand Canyon 4 - 3", "level": 3, "stage": 4, "room": 3, "pointer": 3412361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bobin", "Joe", "Mony", "Blipper"], "default_exits": [{"room": 4, "unkn1": 115, "unkn2": 6, "x": 776, "y": 120, "name": "Sand Canyon 4 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 29, "unkn2": 8, "x": 72, "y": 88, "name": "Sand Canyon 4 - 3 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 105, "unkn2": 14, "x": 104, "y": 216, "name": "Sand Canyon 4 - 3 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 115, "unkn2": 20, "x": 776, "y": 248, "name": "Sand Canyon 4 - 3 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 64, "unkn2": 21, "x": 408, "y": 232, "name": "Sand Canyon 4 - 3 Exit 4", "access_rule": []}], "entity_load": [[73, 16], [20, 16], [91, 16], [14, 23], [21, 16]], "locations": ["Sand Canyon 4 - Enemy 7 (Bobin)", "Sand Canyon 4 - Enemy 8 (Joe)", "Sand Canyon 4 - Enemy 9 (Mony)", "Sand Canyon 4 - Enemy 10 (Blipper)", "Sand Canyon 4 - Star 12", "Sand Canyon 4 - Star 13", "Sand Canyon 4 - Star 14", "Sand Canyon 4 - Star 15"], "music": 18}, {"name": "Sand Canyon 4 - 4", "level": 3, "stage": 4, "room": 4, "pointer": 3307804, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 60, "unkn2": 6, "x": 88, "y": 104, "name": "Sand Canyon 4 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 60, "unkn2": 16, "x": 88, "y": 360, "name": "Sand Canyon 4 - 4 Exit 1", "access_rule": []}], "entity_load": [[21, 16], [20, 16], [91, 16], [73, 16]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 5", "level": 3, "stage": 4, "room": 5, "pointer": 2955407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 16, "unkn2": 13, "x": 88, "y": 232, "name": "Sand Canyon 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Sand Canyon 4 - Miniboss 1 (Haboki)"], "music": 4}, {"name": "Sand Canyon 4 - 6", "level": 3, "stage": 4, "room": 6, "pointer": 3094851, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 24, "unkn2": 6, "x": 56, "y": 56, "name": "Sand Canyon 4 - 6 Exit 0", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 14, "x": 56, "y": 104, "name": "Sand Canyon 4 - 6 Exit 1", "access_rule": []}, {"room": 7, "unkn1": 24, "unkn2": 22, "x": 56, "y": 152, "name": "Sand Canyon 4 - 6 Exit 2", "access_rule": []}], "entity_load": [[17, 19], [4, 23], [5, 23]], "locations": [], "music": 18}, {"name": "Sand Canyon 4 - 7", "level": 3, "stage": 4, "room": 7, "pointer": 3483428, "animal_pointers": [], "consumables": [{"idx": 25, "pointer": 200, "x": 344, "y": 144, "etype": 22, "vtype": 0, "name": "Sand Canyon 4 - 1-Up (Clean)"}, {"idx": 26, "pointer": 336, "x": 1656, "y": 144, "etype": 22, "vtype": 2, "name": "Sand Canyon 4 - Maxim Tomato (Needle)"}], "consumables_pointer": 128, "enemies": ["Togezo", "Rocky", "Bobo"], "default_exits": [{"room": 8, "unkn1": 266, "unkn2": 9, "x": 56, "y": 152, "name": "Sand Canyon 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[6, 22], [3, 16], [14, 23], [5, 16], [2, 16], [18, 16], [0, 22], [2, 22]], "locations": ["Sand Canyon 4 - Enemy 11 (Togezo)", "Sand Canyon 4 - Enemy 12 (Rocky)", "Sand Canyon 4 - Enemy 13 (Bobo)", "Sand Canyon 4 - Star 16", "Sand Canyon 4 - Star 17", "Sand Canyon 4 - Star 18", "Sand Canyon 4 - Star 19", "Sand Canyon 4 - Star 20", "Sand Canyon 4 - Star 21", "Sand Canyon 4 - Star 22", "Sand Canyon 4 - Star 23", "Sand Canyon 4 - 1-Up (Clean)", "Sand Canyon 4 - Maxim Tomato (Needle)"], "music": 18}, {"name": "Sand Canyon 4 - 8", "level": 3, "stage": 4, "room": 8, "pointer": 3002086, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[17, 19], [42, 19]], "locations": ["Sand Canyon 4 - Donbe & Hikari"], "music": 8}, {"name": "Sand Canyon 4 - 9", "level": 3, "stage": 4, "room": 9, "pointer": 2885774, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 4 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 0", "level": 3, "stage": 5, "room": 0, "pointer": 3662486, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 450, "x": 2256, "y": 232, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Falling Block)"}], "consumables_pointer": 208, "enemies": ["Wapod", "Dogon", "Tick"], "default_exits": [{"room": 3, "unkn1": 151, "unkn2": 15, "x": 184, "y": 56, "name": "Sand Canyon 5 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 83, "unkn2": 16, "x": 72, "y": 120, "name": "Sand Canyon 5 - 0 Exit 1", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [0, 22], [14, 23], [90, 16], [88, 16]], "locations": ["Sand Canyon 5 - Enemy 1 (Wapod)", "Sand Canyon 5 - Enemy 2 (Dogon)", "Sand Canyon 5 - Enemy 3 (Tick)", "Sand Canyon 5 - Star 1", "Sand Canyon 5 - Star 2", "Sand Canyon 5 - Star 3", "Sand Canyon 5 - Star 4", "Sand Canyon 5 - Star 5", "Sand Canyon 5 - Star 6", "Sand Canyon 5 - Star 7", "Sand Canyon 5 - Star 8", "Sand Canyon 5 - Star 9", "Sand Canyon 5 - Star 10", "Sand Canyon 5 - 1-Up (Falling Block)"], "music": 13}, {"name": "Sand Canyon 5 - 1", "level": 3, "stage": 5, "room": 1, "pointer": 3052622, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Rocky", "Bobo", "Chilly", "Sparky", "Togezo"], "default_exits": [{"room": 9, "unkn1": 6, "unkn2": 9, "x": 216, "y": 1128, "name": "Sand Canyon 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[5, 16], [6, 16], [3, 16], [8, 16], [18, 16]], "locations": ["Sand Canyon 5 - Enemy 4 (Rocky)", "Sand Canyon 5 - Enemy 5 (Bobo)", "Sand Canyon 5 - Enemy 6 (Chilly)", "Sand Canyon 5 - Enemy 7 (Sparky)", "Sand Canyon 5 - Enemy 8 (Togezo)"], "music": 13}, {"name": "Sand Canyon 5 - 2", "level": 3, "stage": 5, "room": 2, "pointer": 3057544, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 3, "unkn2": 7, "x": 1320, "y": 264, "name": "Sand Canyon 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 1"], "music": 40}, {"name": "Sand Canyon 5 - 3", "level": 3, "stage": 5, "room": 3, "pointer": 3419011, "animal_pointers": [], "consumables": [{"idx": 11, "pointer": 192, "x": 56, "y": 648, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 2)"}, {"idx": 14, "pointer": 200, "x": 56, "y": 664, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 3)"}, {"idx": 15, "pointer": 208, "x": 56, "y": 632, "etype": 22, "vtype": 0, "name": "Sand Canyon 5 - 1-Up (Ice 1)"}, {"idx": 12, "pointer": 368, "x": 320, "y": 264, "etype": 22, "vtype": 2, "name": "Sand Canyon 5 - Maxim Tomato (Pit)"}], "consumables_pointer": 304, "enemies": ["Bronto Burt", "Sasuke"], "default_exits": [{"room": 4, "unkn1": 12, "unkn2": 66, "x": 88, "y": 88, "name": "Sand Canyon 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [30, 16], [2, 16], [0, 22], [2, 22], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 9 (Bronto Burt)", "Sand Canyon 5 - Enemy 10 (Sasuke)", "Sand Canyon 5 - Star 11", "Sand Canyon 5 - Star 12", "Sand Canyon 5 - Star 13", "Sand Canyon 5 - Star 14", "Sand Canyon 5 - Star 15", "Sand Canyon 5 - Star 16", "Sand Canyon 5 - Star 17", "Sand Canyon 5 - 1-Up (Ice 2)", "Sand Canyon 5 - 1-Up (Ice 3)", "Sand Canyon 5 - 1-Up (Ice 1)", "Sand Canyon 5 - Maxim Tomato (Pit)"], "music": 13}, {"name": "Sand Canyon 5 - 4", "level": 3, "stage": 5, "room": 4, "pointer": 3644149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Oro", "Galbo", "Nidoo"], "default_exits": [{"room": 5, "unkn1": 76, "unkn2": 9, "x": 88, "y": 120, "name": "Sand Canyon 5 - 4 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 116, "unkn2": 14, "x": 200, "y": 1256, "name": "Sand Canyon 5 - 4 Exit 1", "access_rule": []}], "entity_load": [[54, 16], [26, 16], [28, 16], [25, 16], [14, 23]], "locations": ["Sand Canyon 5 - Enemy 11 (Oro)", "Sand Canyon 5 - Enemy 12 (Galbo)", "Sand Canyon 5 - Enemy 13 (Nidoo)", "Sand Canyon 5 - Star 18"], "music": 13}, {"name": "Sand Canyon 5 - 5", "level": 3, "stage": 5, "room": 5, "pointer": 3044100, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 7, "x": 1240, "y": 152, "name": "Sand Canyon 5 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 5 - Animal 2"], "music": 39}, {"name": "Sand Canyon 5 - 6", "level": 3, "stage": 5, "room": 6, "pointer": 3373481, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 25, "unkn2": 5, "x": 56, "y": 152, "name": "Sand Canyon 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [31, 16], [89, 16], [6, 16]], "locations": ["Sand Canyon 5 - Enemy 14 (Propeller)"], "music": 13}, {"name": "Sand Canyon 5 - 7", "level": 3, "stage": 5, "room": 7, "pointer": 2964028, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[18, 19], [42, 19]], "locations": ["Sand Canyon 5 - Nyupun"], "music": 8}, {"name": "Sand Canyon 5 - 8", "level": 3, "stage": 5, "room": 8, "pointer": 2890112, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 5 - Complete"], "music": 5}, {"name": "Sand Canyon 5 - 9", "level": 3, "stage": 5, "room": 9, "pointer": 3647264, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "KeKe", "Kabu"], "default_exits": [{"room": 6, "unkn1": 12, "unkn2": 6, "x": 72, "y": 760, "name": "Sand Canyon 5 - 9 Exit 0", "access_rule": ["Cutter", "Cutter Ability"]}, {"room": 1, "unkn1": 12, "unkn2": 70, "x": 120, "y": 152, "name": "Sand Canyon 5 - 9 Exit 1", "access_rule": []}], "entity_load": [[27, 16], [61, 16], [4, 22], [14, 23], [51, 16], [19, 16]], "locations": ["Sand Canyon 5 - Enemy 15 (Sir Kibble)", "Sand Canyon 5 - Enemy 16 (KeKe)", "Sand Canyon 5 - Enemy 17 (Kabu)", "Sand Canyon 5 - Star 19", "Sand Canyon 5 - Star 20", "Sand Canyon 5 - Star 21", "Sand Canyon 5 - Star 22", "Sand Canyon 5 - Star 23", "Sand Canyon 5 - Star 24", "Sand Canyon 5 - Star 25", "Sand Canyon 5 - Star 26", "Sand Canyon 5 - Star 27", "Sand Canyon 5 - Star 28", "Sand Canyon 5 - Star 29", "Sand Canyon 5 - Star 30", "Sand Canyon 5 - Star 31", "Sand Canyon 5 - Star 32", "Sand Canyon 5 - Star 33", "Sand Canyon 5 - Star 34", "Sand Canyon 5 - Star 35", "Sand Canyon 5 - Star 36", "Sand Canyon 5 - Star 37", "Sand Canyon 5 - Star 38", "Sand Canyon 5 - Star 39", "Sand Canyon 5 - Star 40"], "music": 13}, {"name": "Sand Canyon 6 - 0", "level": 3, "stage": 6, "room": 0, "pointer": 3314761, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Doka", "Cappy", "Pteran"], "default_exits": [{"room": 2, "unkn1": 132, "unkn2": 16, "x": 56, "y": 136, "name": "Sand Canyon 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [35, 16], [39, 16], [12, 16]], "locations": ["Sand Canyon 6 - Enemy 1 (Sparky)", "Sand Canyon 6 - Enemy 2 (Doka)", "Sand Canyon 6 - Enemy 3 (Cappy)", "Sand Canyon 6 - Enemy 4 (Pteran)"], "music": 14}, {"name": "Sand Canyon 6 - 1", "level": 3, "stage": 6, "room": 1, "pointer": 2976913, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 24, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 1", "Sand Canyon 6 - Animal 2", "Sand Canyon 6 - Animal 3"], "music": 39}, {"name": "Sand Canyon 6 - 2", "level": 3, "stage": 6, "room": 2, "pointer": 2978757, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 55, "unkn2": 6, "x": 104, "y": 104, "name": "Sand Canyon 6 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 3", "level": 3, "stage": 6, "room": 3, "pointer": 3178082, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 3 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 3 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 3 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 3 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 3 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 3 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 3 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 4", "level": 3, "stage": 6, "room": 4, "pointer": 3181563, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 4 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 4 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 4 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 4 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 4 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 4 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 5", "level": 3, "stage": 6, "room": 5, "pointer": 3177209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 5 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 5 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 5 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 5 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 5 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 5 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 5 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 6", "level": 3, "stage": 6, "room": 6, "pointer": 3183291, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 6 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 6 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 6 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 6 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 6 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 6 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 6 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 7", "level": 3, "stage": 6, "room": 7, "pointer": 3175453, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 7 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 7 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 7 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 7 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 7 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 7 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 7 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 8", "level": 3, "stage": 6, "room": 8, "pointer": 3179826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 8 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 8 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 8 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 8 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 8 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 8 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 8 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 9", "level": 3, "stage": 6, "room": 9, "pointer": 3176334, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 9 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 9 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 9 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 9 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 9 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 9 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 9 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 10", "level": 3, "stage": 6, "room": 10, "pointer": 3178954, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 16, "unkn2": 4, "x": 184, "y": 712, "name": "Sand Canyon 6 - 10 Exit 0", "access_rule": []}, {"room": 24, "unkn1": 8, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 1", "access_rule": []}, {"room": 31, "unkn1": 24, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 10 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 16, "x": 600, "y": 104, "name": "Sand Canyon 6 - 10 Exit 3", "access_rule": []}, {"room": 12, "unkn1": 28, "unkn2": 16, "x": 88, "y": 136, "name": "Sand Canyon 6 - 10 Exit 4", "access_rule": []}, {"room": 14, "unkn1": 8, "unkn2": 24, "x": 552, "y": 152, "name": "Sand Canyon 6 - 10 Exit 5", "access_rule": []}, {"room": 19, "unkn1": 24, "unkn2": 24, "x": 104, "y": 152, "name": "Sand Canyon 6 - 10 Exit 6", "access_rule": []}, {"room": 38, "unkn1": 16, "unkn2": 28, "x": 168, "y": 88, "name": "Sand Canyon 6 - 10 Exit 7", "access_rule": []}], "entity_load": [[10, 23]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 11", "level": 3, "stage": 6, "room": 11, "pointer": 2989149, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 37, "unkn2": 6, "x": 88, "y": 264, "name": "Sand Canyon 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[59, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 12", "level": 3, "stage": 6, "room": 12, "pointer": 3015947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 8, "x": 440, "y": 264, "name": "Sand Canyon 6 - 12 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 86, "unkn2": 8, "x": 72, "y": 104, "name": "Sand Canyon 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[64, 16], [59, 16], [55, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 13", "level": 3, "stage": 6, "room": 13, "pointer": 2976539, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 55, "unkn2": 8, "x": 56, "y": 152, "name": "Sand Canyon 6 - 13 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 14", "level": 3, "stage": 6, "room": 14, "pointer": 3030336, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 5, "unkn2": 9, "x": 200, "y": 152, "name": "Sand Canyon 6 - 14 Exit 0", "access_rule": []}, {"room": 8, "unkn1": 35, "unkn2": 9, "x": 152, "y": 392, "name": "Sand Canyon 6 - 14 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 15", "level": 3, "stage": 6, "room": 15, "pointer": 2972361, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 13, "unkn2": 9, "x": 104, "y": 152, "name": "Sand Canyon 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 16", "level": 3, "stage": 6, "room": 16, "pointer": 2953186, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 16 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 16 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 17", "level": 3, "stage": 6, "room": 17, "pointer": 2953633, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 19, "x": 248, "y": 152, "name": "Sand Canyon 6 - 17 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 10, "unkn2": 44, "x": 264, "y": 88, "name": "Sand Canyon 6 - 17 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 18", "level": 3, "stage": 6, "room": 18, "pointer": 2991707, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 14, "unkn2": 9, "x": 184, "y": 312, "name": "Sand Canyon 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 19", "level": 3, "stage": 6, "room": 19, "pointer": 2974651, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 5, "unkn2": 9, "x": 376, "y": 392, "name": "Sand Canyon 6 - 19 Exit 0", "access_rule": []}, {"room": 20, "unkn1": 35, "unkn2": 9, "x": 88, "y": 152, "name": "Sand Canyon 6 - 19 Exit 1", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 20", "level": 3, "stage": 6, "room": 20, "pointer": 2969638, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 4, "unkn2": 9, "x": 552, "y": 152, "name": "Sand Canyon 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 21", "level": 3, "stage": 6, "room": 21, "pointer": 2976163, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 9, "unkn2": 13, "x": 296, "y": 216, "name": "Sand Canyon 6 - 21 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Sand Canyon 6 - Animal 4", "Sand Canyon 6 - Animal 5", "Sand Canyon 6 - Animal 6"], "music": 40}, {"name": "Sand Canyon 6 - 22", "level": 3, "stage": 6, "room": 22, "pointer": 2950938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 38, "unkn1": 14, "unkn2": 8, "x": 168, "y": 376, "name": "Sand Canyon 6 - 22 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 9, "unkn2": 13, "x": 376, "y": 216, "name": "Sand Canyon 6 - 22 Exit 1", "access_rule": []}, {"room": 21, "unkn1": 19, "unkn2": 13, "x": 168, "y": 216, "name": "Sand Canyon 6 - 22 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 23", "level": 3, "stage": 6, "room": 23, "pointer": 3311993, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 43, "unkn1": 145, "unkn2": 7, "x": 72, "y": 152, "name": "Sand Canyon 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 24", "level": 3, "stage": 6, "room": 24, "pointer": 3079078, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 39, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 24 Exit 0", "access_rule": []}, {"room": 25, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 24 Exit 1", "access_rule": []}, {"room": 39, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 24 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 25", "level": 3, "stage": 6, "room": 25, "pointer": 3065898, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 25 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 25 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 25 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 26", "level": 3, "stage": 6, "room": 26, "pointer": 3063347, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 26 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 26 Exit 1", "access_rule": []}, {"room": 27, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 26 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 27", "level": 3, "stage": 6, "room": 27, "pointer": 3066916, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 28, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 27 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 27 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 27 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 28", "level": 3, "stage": 6, "room": 28, "pointer": 3067425, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 28 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 11, "unkn2": 8, "x": 184, "y": 344, "name": "Sand Canyon 6 - 28 Exit 1", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 28 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 29", "level": 3, "stage": 6, "room": 29, "pointer": 2950032, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 30, "unkn1": 11, "unkn2": 8, "x": 168, "y": 136, "name": "Sand Canyon 6 - 29 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 30", "level": 3, "stage": 6, "room": 30, "pointer": 2986500, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 10, "unkn2": 44, "x": 136, "y": 152, "name": "Sand Canyon 6 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 31", "level": 3, "stage": 6, "room": 31, "pointer": 3070930, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 31 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 648, "name": "Sand Canyon 6 - 31 Exit 1", "access_rule": []}, {"room": 32, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 31 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 32", "level": 3, "stage": 6, "room": 32, "pointer": 3054817, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Parasol)", "Bukiset (Cutter)"], "default_exits": [{"room": 33, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 32 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 536, "name": "Sand Canyon 6 - 32 Exit 1", "access_rule": []}, {"room": 33, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 32 Exit 2", "access_rule": []}], "entity_load": [[81, 16], [83, 16]], "locations": ["Sand Canyon 6 - Enemy 5 (Bukiset (Parasol))", "Sand Canyon 6 - Enemy 6 (Bukiset (Cutter))"], "music": 14}, {"name": "Sand Canyon 6 - 33", "level": 3, "stage": 6, "room": 33, "pointer": 3053173, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Clean)", "Bukiset (Spark)"], "default_exits": [{"room": 34, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 33 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 440, "name": "Sand Canyon 6 - 33 Exit 1", "access_rule": []}, {"room": 34, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 33 Exit 2", "access_rule": []}], "entity_load": [[80, 16], [82, 16]], "locations": ["Sand Canyon 6 - Enemy 7 (Bukiset (Clean))", "Sand Canyon 6 - Enemy 8 (Bukiset (Spark))"], "music": 14}, {"name": "Sand Canyon 6 - 34", "level": 3, "stage": 6, "room": 34, "pointer": 3053721, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Ice)", "Bukiset (Needle)"], "default_exits": [{"room": 35, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 34 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 344, "name": "Sand Canyon 6 - 34 Exit 1", "access_rule": []}, {"room": 35, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 34 Exit 2", "access_rule": []}], "entity_load": [[79, 16], [78, 16]], "locations": ["Sand Canyon 6 - Enemy 9 (Bukiset (Ice))", "Sand Canyon 6 - Enemy 10 (Bukiset (Needle))"], "music": 14}, {"name": "Sand Canyon 6 - 35", "level": 3, "stage": 6, "room": 35, "pointer": 3054269, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)"], "default_exits": [{"room": 37, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 35 Exit 0", "access_rule": []}, {"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 248, "name": "Sand Canyon 6 - 35 Exit 1", "access_rule": []}, {"room": 37, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 35 Exit 2", "access_rule": []}], "entity_load": [[77, 16], [76, 16]], "locations": ["Sand Canyon 6 - Enemy 11 (Bukiset (Burning))", "Sand Canyon 6 - Enemy 12 (Bukiset (Stone))"], "music": 14}, {"name": "Sand Canyon 6 - 36", "level": 3, "stage": 6, "room": 36, "pointer": 2986164, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 10, "unkn2": 44, "x": 392, "y": 152, "name": "Sand Canyon 6 - 36 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 37", "level": 3, "stage": 6, "room": 37, "pointer": 3074377, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 11, "unkn2": 8, "x": 168, "y": 152, "name": "Sand Canyon 6 - 37 Exit 0", "access_rule": []}], "entity_load": [[19, 19]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 38", "level": 3, "stage": 6, "room": 38, "pointer": 2971589, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 10, "unkn2": 5, "x": 264, "y": 440, "name": "Sand Canyon 6 - 38 Exit 0", "access_rule": []}, {"room": 22, "unkn1": 10, "unkn2": 23, "x": 248, "y": 136, "name": "Sand Canyon 6 - 38 Exit 1", "access_rule": []}], "entity_load": [[76, 16], [77, 16], [78, 16], [79, 16], [80, 16], [81, 16], [82, 16], [83, 16]], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 39", "level": 3, "stage": 6, "room": 39, "pointer": 3063858, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 40, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 39 Exit 0", "access_rule": []}, {"room": 40, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 39 Exit 1", "access_rule": []}, {"room": 40, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 39 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 40", "level": 3, "stage": 6, "room": 40, "pointer": 3064368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 41, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 40 Exit 0", "access_rule": []}, {"room": 41, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 40 Exit 1", "access_rule": []}, {"room": 41, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 40 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 41", "level": 3, "stage": 6, "room": 41, "pointer": 3064878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 42, "unkn1": 7, "unkn2": 8, "x": 120, "y": 328, "name": "Sand Canyon 6 - 41 Exit 0", "access_rule": []}, {"room": 42, "unkn1": 11, "unkn2": 8, "x": 184, "y": 328, "name": "Sand Canyon 6 - 41 Exit 1", "access_rule": []}, {"room": 42, "unkn1": 15, "unkn2": 8, "x": 248, "y": 328, "name": "Sand Canyon 6 - 41 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 14}, {"name": "Sand Canyon 6 - 42", "level": 3, "stage": 6, "room": 42, "pointer": 3068939, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 29, "unkn1": 7, "unkn2": 8, "x": 120, "y": 344, "name": "Sand Canyon 6 - 42 Exit 0", "access_rule": []}, {"room": 29, "unkn1": 15, "unkn2": 8, "x": 248, "y": 344, "name": "Sand Canyon 6 - 42 Exit 1", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Sand Canyon 6 - Enemy 13 (Nidoo)"], "music": 14}, {"name": "Sand Canyon 6 - 43", "level": 3, "stage": 6, "room": 43, "pointer": 2988495, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 44, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Sand Canyon 6 - 43 Exit 0", "access_rule": []}], "entity_load": [[19, 19], [42, 19]], "locations": ["Sand Canyon 6 - Professor Hector & R.O.B"], "music": 8}, {"name": "Sand Canyon 6 - 44", "level": 3, "stage": 6, "room": 44, "pointer": 2886979, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Sand Canyon 6 - Complete"], "music": 5}, {"name": "Sand Canyon Boss - 0", "level": 3, "stage": 7, "room": 0, "pointer": 2991389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[6, 18]], "locations": ["Sand Canyon - Boss (Pon & Con) Purified", "Level 3 Boss - Defeated", "Level 3 Boss - Purified"], "music": 2}, {"name": "Cloudy Park 1 - 0", "level": 4, "stage": 1, "room": 0, "pointer": 3172795, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "KeKe", "Cappy"], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 5, "x": 56, "y": 152, "name": "Cloudy Park 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [12, 16], [51, 16], [1, 23], [0, 23]], "locations": ["Cloudy Park 1 - Enemy 1 (Waddle Dee)", "Cloudy Park 1 - Enemy 2 (KeKe)", "Cloudy Park 1 - Enemy 3 (Cappy)"], "music": 17}, {"name": "Cloudy Park 1 - 1", "level": 4, "stage": 1, "room": 1, "pointer": 3078163, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 14, "unkn2": 8, "x": 88, "y": 424, "name": "Cloudy Park 1 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 1"], "music": 39}, {"name": "Cloudy Park 1 - 2", "level": 4, "stage": 1, "room": 2, "pointer": 3285882, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Togezo"], "default_exits": [{"room": 3, "unkn1": 95, "unkn2": 8, "x": 40, "y": 104, "name": "Cloudy Park 1 - 2 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [4, 16], [18, 16], [6, 23]], "locations": ["Cloudy Park 1 - Enemy 4 (Yaban)", "Cloudy Park 1 - Enemy 5 (Togezo)"], "music": 17}, {"name": "Cloudy Park 1 - 3", "level": 4, "stage": 1, "room": 3, "pointer": 3062831, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 15, "unkn2": 6, "x": 56, "y": 264, "name": "Cloudy Park 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 2"], "music": 39}, {"name": "Cloudy Park 1 - 4", "level": 4, "stage": 1, "room": 4, "pointer": 3396729, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 7, "unkn1": 92, "unkn2": 16, "x": 56, "y": 152, "name": "Cloudy Park 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [0, 16], [14, 23], [68, 16], [26, 16], [4, 22]], "locations": ["Cloudy Park 1 - Enemy 6 (Galbo)", "Cloudy Park 1 - Star 1"], "music": 17}, {"name": "Cloudy Park 1 - 5", "level": 4, "stage": 1, "room": 5, "pointer": 3038805, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 6, "unkn2": 5, "x": 2344, "y": 232, "name": "Cloudy Park 1 - 5 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 3", "Cloudy Park 1 - Animal 4"], "music": 39}, {"name": "Cloudy Park 1 - 6", "level": 4, "stage": 1, "room": 6, "pointer": 3535736, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Como"], "default_exits": [{"room": 8, "unkn1": 5, "unkn2": 8, "x": 72, "y": 104, "name": "Cloudy Park 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[54, 16], [14, 23], [0, 16], [41, 16], [8, 16]], "locations": ["Cloudy Park 1 - Enemy 7 (Sparky)", "Cloudy Park 1 - Enemy 8 (Como)", "Cloudy Park 1 - Star 2"], "music": 17}, {"name": "Cloudy Park 1 - 7", "level": 4, "stage": 1, "room": 7, "pointer": 2954080, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 14, "unkn2": 6, "x": 88, "y": 104, "name": "Cloudy Park 1 - 7 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 5"], "music": 39}, {"name": "Cloudy Park 1 - 8", "level": 4, "stage": 1, "room": 8, "pointer": 3465407, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt"], "default_exits": [{"room": 12, "unkn1": 181, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 1 - 8 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [2, 16], [51, 16], [1, 23], [14, 23]], "locations": ["Cloudy Park 1 - Enemy 9 (Bronto Burt)", "Cloudy Park 1 - Star 3", "Cloudy Park 1 - Star 4", "Cloudy Park 1 - Star 5", "Cloudy Park 1 - Star 6", "Cloudy Park 1 - Star 7", "Cloudy Park 1 - Star 8", "Cloudy Park 1 - Star 9", "Cloudy Park 1 - Star 10", "Cloudy Park 1 - Star 11"], "music": 17}, {"name": "Cloudy Park 1 - 9", "level": 4, "stage": 1, "room": 9, "pointer": 3078621, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 56, "y": 264, "name": "Cloudy Park 1 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 1 - Animal 6"], "music": 39}, {"name": "Cloudy Park 1 - 10", "level": 4, "stage": 1, "room": 10, "pointer": 3281366, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Sir Kibble"], "default_exits": [{"room": 9, "unkn1": 99, "unkn2": 8, "x": 56, "y": 152, "name": "Cloudy Park 1 - 10 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [24, 16], [27, 16], [4, 23]], "locations": ["Cloudy Park 1 - Enemy 10 (Gabon)", "Cloudy Park 1 - Enemy 11 (Sir Kibble)"], "music": 17}, {"name": "Cloudy Park 1 - 11", "level": 4, "stage": 1, "room": 11, "pointer": 3519608, "animal_pointers": [], "consumables": [{"idx": 19, "pointer": 192, "x": 216, "y": 600, "etype": 22, "vtype": 0, "name": "Cloudy Park 1 - 1-Up (Shotzo)"}, {"idx": 18, "pointer": 456, "x": 856, "y": 408, "etype": 22, "vtype": 2, "name": "Cloudy Park 1 - Maxim Tomato (Mariel)"}], "consumables_pointer": 352, "enemies": ["Mariel", "Nruff"], "default_exits": [{"room": 5, "unkn1": 64, "unkn2": 6, "x": 104, "y": 216, "name": "Cloudy Park 1 - 11 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [27, 16], [15, 16], [45, 16], [14, 23], [2, 22], [0, 22], [6, 22]], "locations": ["Cloudy Park 1 - Enemy 12 (Mariel)", "Cloudy Park 1 - Enemy 13 (Nruff)", "Cloudy Park 1 - Star 12", "Cloudy Park 1 - Star 13", "Cloudy Park 1 - Star 14", "Cloudy Park 1 - Star 15", "Cloudy Park 1 - Star 16", "Cloudy Park 1 - Star 17", "Cloudy Park 1 - Star 18", "Cloudy Park 1 - Star 19", "Cloudy Park 1 - Star 20", "Cloudy Park 1 - Star 21", "Cloudy Park 1 - Star 22", "Cloudy Park 1 - Star 23", "Cloudy Park 1 - 1-Up (Shotzo)", "Cloudy Park 1 - Maxim Tomato (Mariel)"], "music": 17}, {"name": "Cloudy Park 1 - 12", "level": 4, "stage": 1, "room": 12, "pointer": 2958914, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 1 - 12 Exit 0", "access_rule": []}], "entity_load": [[21, 19], [42, 19]], "locations": ["Cloudy Park 1 - Hibanamodoki"], "music": 8}, {"name": "Cloudy Park 1 - 13", "level": 4, "stage": 1, "room": 13, "pointer": 2886015, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 1 - Complete"], "music": 5}, {"name": "Cloudy Park 2 - 0", "level": 4, "stage": 2, "room": 0, "pointer": 3142443, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly", "Sasuke"], "default_exits": [{"room": 6, "unkn1": 96, "unkn2": 7, "x": 56, "y": 88, "name": "Cloudy Park 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16], [30, 16], [6, 16], [14, 23]], "locations": ["Cloudy Park 2 - Enemy 1 (Chilly)", "Cloudy Park 2 - Enemy 2 (Sasuke)", "Cloudy Park 2 - Star 1", "Cloudy Park 2 - Star 2", "Cloudy Park 2 - Star 3", "Cloudy Park 2 - Star 4", "Cloudy Park 2 - Star 5", "Cloudy Park 2 - Star 6"], "music": 19}, {"name": "Cloudy Park 2 - 1", "level": 4, "stage": 2, "room": 1, "pointer": 3235925, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Sparky", "Broom Hatter"], "default_exits": [{"room": 2, "unkn1": 146, "unkn2": 5, "x": 88, "y": 88, "name": "Cloudy Park 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[0, 16], [14, 23], [8, 16], [11, 16]], "locations": ["Cloudy Park 2 - Enemy 3 (Waddle Dee)", "Cloudy Park 2 - Enemy 4 (Sparky)", "Cloudy Park 2 - Enemy 5 (Broom Hatter)", "Cloudy Park 2 - Star 7", "Cloudy Park 2 - Star 8", "Cloudy Park 2 - Star 9", "Cloudy Park 2 - Star 10", "Cloudy Park 2 - Star 11", "Cloudy Park 2 - Star 12", "Cloudy Park 2 - Star 13", "Cloudy Park 2 - Star 14", "Cloudy Park 2 - Star 15"], "music": 19}, {"name": "Cloudy Park 2 - 2", "level": 4, "stage": 2, "room": 2, "pointer": 3297758, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Pteran"], "default_exits": [{"room": 3, "unkn1": 147, "unkn2": 8, "x": 72, "y": 136, "name": "Cloudy Park 2 - 2 Exit 0", "access_rule": []}], "entity_load": [[27, 16], [39, 16], [1, 23]], "locations": ["Cloudy Park 2 - Enemy 6 (Sir Kibble)", "Cloudy Park 2 - Enemy 7 (Pteran)"], "music": 19}, {"name": "Cloudy Park 2 - 3", "level": 4, "stage": 2, "room": 3, "pointer": 3341087, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Dogon"], "default_exits": [{"room": 4, "unkn1": 145, "unkn2": 12, "x": 72, "y": 136, "name": "Cloudy Park 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[4, 16], [14, 23], [90, 16], [89, 16]], "locations": ["Cloudy Park 2 - Enemy 8 (Propeller)", "Cloudy Park 2 - Enemy 9 (Dogon)", "Cloudy Park 2 - Star 16", "Cloudy Park 2 - Star 17", "Cloudy Park 2 - Star 18", "Cloudy Park 2 - Star 19", "Cloudy Park 2 - Star 20", "Cloudy Park 2 - Star 21", "Cloudy Park 2 - Star 22", "Cloudy Park 2 - Star 23", "Cloudy Park 2 - Star 24", "Cloudy Park 2 - Star 25", "Cloudy Park 2 - Star 26", "Cloudy Park 2 - Star 27", "Cloudy Park 2 - Star 28", "Cloudy Park 2 - Star 29", "Cloudy Park 2 - Star 30", "Cloudy Park 2 - Star 31", "Cloudy Park 2 - Star 32", "Cloudy Park 2 - Star 33", "Cloudy Park 2 - Star 34", "Cloudy Park 2 - Star 35", "Cloudy Park 2 - Star 36", "Cloudy Park 2 - Star 37"], "music": 19}, {"name": "Cloudy Park 2 - 4", "level": 4, "stage": 2, "room": 4, "pointer": 3457404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo", "Oro", "Bronto Burt", "Rocky"], "default_exits": [{"room": 5, "unkn1": 165, "unkn2": 5, "x": 72, "y": 104, "name": "Cloudy Park 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [3, 16], [14, 23], [18, 16], [25, 16]], "locations": ["Cloudy Park 2 - Enemy 10 (Togezo)", "Cloudy Park 2 - Enemy 11 (Oro)", "Cloudy Park 2 - Enemy 12 (Bronto Burt)", "Cloudy Park 2 - Enemy 13 (Rocky)", "Cloudy Park 2 - Star 38", "Cloudy Park 2 - Star 39", "Cloudy Park 2 - Star 40", "Cloudy Park 2 - Star 41", "Cloudy Park 2 - Star 42", "Cloudy Park 2 - Star 43", "Cloudy Park 2 - Star 44", "Cloudy Park 2 - Star 45", "Cloudy Park 2 - Star 46", "Cloudy Park 2 - Star 47"], "music": 19}, {"name": "Cloudy Park 2 - 5", "level": 4, "stage": 2, "room": 5, "pointer": 3273878, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Kapar"], "default_exits": [{"room": 7, "unkn1": 96, "unkn2": 8, "x": 56, "y": 88, "name": "Cloudy Park 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [62, 16], [26, 16], [67, 16]], "locations": ["Cloudy Park 2 - Enemy 14 (Galbo)", "Cloudy Park 2 - Enemy 15 (Kapar)", "Cloudy Park 2 - Star 48", "Cloudy Park 2 - Star 49", "Cloudy Park 2 - Star 50", "Cloudy Park 2 - Star 51", "Cloudy Park 2 - Star 52", "Cloudy Park 2 - Star 53", "Cloudy Park 2 - Star 54"], "music": 19}, {"name": "Cloudy Park 2 - 6", "level": 4, "stage": 2, "room": 6, "pointer": 2984453, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 25, "unkn2": 5, "x": 72, "y": 152, "name": "Cloudy Park 2 - 6 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 2 - Animal 1", "Cloudy Park 2 - Animal 2", "Cloudy Park 2 - Animal 3"], "music": 38}, {"name": "Cloudy Park 2 - 7", "level": 4, "stage": 2, "room": 7, "pointer": 2985482, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 5, "x": 40, "y": 88, "name": "Cloudy Park 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[22, 19]], "locations": [], "music": 19}, {"name": "Cloudy Park 2 - 8", "level": 4, "stage": 2, "room": 8, "pointer": 2990753, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[22, 19], [42, 19]], "locations": ["Cloudy Park 2 - Piyo & Keko"], "music": 8}, {"name": "Cloudy Park 2 - 9", "level": 4, "stage": 2, "room": 9, "pointer": 2889630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 2 - Complete"], "music": 5}, {"name": "Cloudy Park 3 - 0", "level": 4, "stage": 3, "room": 0, "pointer": 3100859, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Mopoo", "Poppy Bros Jr."], "default_exits": [{"room": 2, "unkn1": 145, "unkn2": 8, "x": 56, "y": 136, "name": "Cloudy Park 3 - 0 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [74, 16], [47, 16], [7, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 1 (Bronto Burt)", "Cloudy Park 3 - Enemy 2 (Mopoo)", "Cloudy Park 3 - Enemy 3 (Poppy Bros Jr.)", "Cloudy Park 3 - Star 1", "Cloudy Park 3 - Star 2", "Cloudy Park 3 - Star 3", "Cloudy Park 3 - Star 4", "Cloudy Park 3 - Star 5", "Cloudy Park 3 - Star 6", "Cloudy Park 3 - Star 7"], "music": 15}, {"name": "Cloudy Park 3 - 1", "level": 4, "stage": 3, "room": 1, "pointer": 3209719, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como"], "default_exits": [{"room": 5, "unkn1": 13, "unkn2": 14, "x": 56, "y": 152, "name": "Cloudy Park 3 - 1 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [4, 22], [41, 16], [14, 23]], "locations": ["Cloudy Park 3 - Enemy 4 (Como)", "Cloudy Park 3 - Star 8", "Cloudy Park 3 - Star 9"], "music": 15}, {"name": "Cloudy Park 3 - 2", "level": 4, "stage": 3, "room": 2, "pointer": 3216185, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Bobin", "Loud", "Kapar"], "default_exits": [{"room": 1, "unkn1": 145, "unkn2": 6, "x": 216, "y": 1064, "name": "Cloudy Park 3 - 2 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 24, "unkn2": 14, "x": 104, "y": 152, "name": "Cloudy Park 3 - 2 Exit 1", "access_rule": []}], "entity_load": [[67, 16], [40, 16], [73, 16], [14, 23], [16, 16]], "locations": ["Cloudy Park 3 - Enemy 5 (Glunk)", "Cloudy Park 3 - Enemy 6 (Bobin)", "Cloudy Park 3 - Enemy 7 (Loud)", "Cloudy Park 3 - Enemy 8 (Kapar)", "Cloudy Park 3 - Star 10", "Cloudy Park 3 - Star 11", "Cloudy Park 3 - Star 12", "Cloudy Park 3 - Star 13", "Cloudy Park 3 - Star 14", "Cloudy Park 3 - Star 15", "Cloudy Park 3 - Star 16"], "music": 15}, {"name": "Cloudy Park 3 - 3", "level": 4, "stage": 3, "room": 3, "pointer": 2994208, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 5, "unkn2": 9, "x": 408, "y": 232, "name": "Cloudy Park 3 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 3 - Animal 1", "Cloudy Park 3 - Animal 2", "Cloudy Park 3 - Animal 3"], "music": 40}, {"name": "Cloudy Park 3 - 4", "level": 4, "stage": 3, "room": 4, "pointer": 3229151, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo", "Batamon", "Bouncy"], "default_exits": [{"room": 6, "unkn1": 156, "unkn2": 6, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 126, "unkn2": 9, "x": 56, "y": 152, "name": "Cloudy Park 3 - 4 Exit 1", "access_rule": []}], "entity_load": [[7, 16], [26, 16], [14, 23], [13, 16], [68, 16]], "locations": ["Cloudy Park 3 - Enemy 9 (Galbo)", "Cloudy Park 3 - Enemy 10 (Batamon)", "Cloudy Park 3 - Enemy 11 (Bouncy)", "Cloudy Park 3 - Star 17", "Cloudy Park 3 - Star 18", "Cloudy Park 3 - Star 19", "Cloudy Park 3 - Star 20", "Cloudy Park 3 - Star 21", "Cloudy Park 3 - Star 22"], "music": 15}, {"name": "Cloudy Park 3 - 5", "level": 4, "stage": 3, "room": 5, "pointer": 2969244, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 14, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": [], "music": 31}, {"name": "Cloudy Park 3 - 6", "level": 4, "stage": 3, "room": 6, "pointer": 4128530, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[23, 19]], "locations": ["Cloudy Park 3 - Mr. Ball"], "music": 8}, {"name": "Cloudy Park 3 - 7", "level": 4, "stage": 3, "room": 7, "pointer": 2885051, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 3 - Complete"], "music": 5}, {"name": "Cloudy Park 4 - 0", "level": 4, "stage": 4, "room": 0, "pointer": 3072905, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 95, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[4, 23], [1, 23], [0, 23], [31, 16]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 1", "level": 4, "stage": 4, "room": 1, "pointer": 3074863, "animal_pointers": [208, 224], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 21, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 4 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 4 - Animal 1", "Cloudy Park 4 - Animal 2"], "music": 38}, {"name": "Cloudy Park 4 - 2", "level": 4, "stage": 4, "room": 2, "pointer": 3309209, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Como", "Wapod", "Cappy"], "default_exits": [{"room": 3, "unkn1": 145, "unkn2": 9, "x": 104, "y": 152, "name": "Cloudy Park 4 - 2 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [24, 16], [12, 16], [14, 23], [41, 16], [4, 22]], "locations": ["Cloudy Park 4 - Enemy 1 (Gabon)", "Cloudy Park 4 - Enemy 2 (Como)", "Cloudy Park 4 - Enemy 3 (Wapod)", "Cloudy Park 4 - Enemy 4 (Cappy)", "Cloudy Park 4 - Star 1", "Cloudy Park 4 - Star 2", "Cloudy Park 4 - Star 3", "Cloudy Park 4 - Star 4", "Cloudy Park 4 - Star 5", "Cloudy Park 4 - Star 6", "Cloudy Park 4 - Star 7", "Cloudy Park 4 - Star 8", "Cloudy Park 4 - Star 9", "Cloudy Park 4 - Star 10", "Cloudy Park 4 - Star 11", "Cloudy Park 4 - Star 12"], "music": 21}, {"name": "Cloudy Park 4 - 3", "level": 4, "stage": 4, "room": 3, "pointer": 3296291, "animal_pointers": [], "consumables": [{"idx": 33, "pointer": 776, "x": 1880, "y": 152, "etype": 22, "vtype": 0, "name": "Cloudy Park 4 - 1-Up (Windy)"}, {"idx": 34, "pointer": 912, "x": 2160, "y": 152, "etype": 22, "vtype": 2, "name": "Cloudy Park 4 - Maxim Tomato (Windy)"}], "consumables_pointer": 304, "enemies": ["Sparky", "Togezo"], "default_exits": [{"room": 5, "unkn1": 144, "unkn2": 9, "x": 56, "y": 136, "name": "Cloudy Park 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[18, 16], [8, 16], [31, 16], [14, 23], [4, 22], [4, 16], [0, 22], [2, 22]], "locations": ["Cloudy Park 4 - Enemy 5 (Sparky)", "Cloudy Park 4 - Enemy 6 (Togezo)", "Cloudy Park 4 - Star 13", "Cloudy Park 4 - Star 14", "Cloudy Park 4 - Star 15", "Cloudy Park 4 - Star 16", "Cloudy Park 4 - Star 17", "Cloudy Park 4 - Star 18", "Cloudy Park 4 - Star 19", "Cloudy Park 4 - Star 20", "Cloudy Park 4 - Star 21", "Cloudy Park 4 - Star 22", "Cloudy Park 4 - Star 23", "Cloudy Park 4 - Star 24", "Cloudy Park 4 - Star 25", "Cloudy Park 4 - Star 26", "Cloudy Park 4 - Star 27", "Cloudy Park 4 - Star 28", "Cloudy Park 4 - Star 29", "Cloudy Park 4 - Star 30", "Cloudy Park 4 - 1-Up (Windy)", "Cloudy Park 4 - Maxim Tomato (Windy)"], "music": 21}, {"name": "Cloudy Park 4 - 4", "level": 4, "stage": 4, "room": 4, "pointer": 3330996, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "KeKe", "Bouncy"], "default_exits": [{"room": 7, "unkn1": 4, "unkn2": 15, "x": 72, "y": 152, "name": "Cloudy Park 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[13, 16], [51, 16], [17, 16], [14, 23], [2, 16]], "locations": ["Cloudy Park 4 - Enemy 7 (Bronto Burt)", "Cloudy Park 4 - Enemy 8 (KeKe)", "Cloudy Park 4 - Enemy 9 (Bouncy)", "Cloudy Park 4 - Star 31", "Cloudy Park 4 - Star 32", "Cloudy Park 4 - Star 33", "Cloudy Park 4 - Star 34", "Cloudy Park 4 - Star 35", "Cloudy Park 4 - Star 36", "Cloudy Park 4 - Star 37", "Cloudy Park 4 - Star 38"], "music": 21}, {"name": "Cloudy Park 4 - 5", "level": 4, "stage": 4, "room": 5, "pointer": 3332300, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble", "Mariel"], "default_exits": [{"room": 4, "unkn1": 21, "unkn2": 51, "x": 2328, "y": 120, "name": "Cloudy Park 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[45, 16], [46, 16], [27, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 10 (Sir Kibble)", "Cloudy Park 4 - Enemy 11 (Mariel)", "Cloudy Park 4 - Star 39", "Cloudy Park 4 - Star 40", "Cloudy Park 4 - Star 41", "Cloudy Park 4 - Star 42", "Cloudy Park 4 - Star 43"], "music": 21}, {"name": "Cloudy Park 4 - 6", "level": 4, "stage": 4, "room": 6, "pointer": 3253310, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu", "Wappa"], "default_exits": [{"room": 9, "unkn1": 3, "unkn2": 6, "x": 72, "y": 152, "name": "Cloudy Park 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [31, 16], [19, 16], [14, 23]], "locations": ["Cloudy Park 4 - Enemy 12 (Kabu)", "Cloudy Park 4 - Enemy 13 (Wappa)", "Cloudy Park 4 - Star 44", "Cloudy Park 4 - Star 45", "Cloudy Park 4 - Star 46", "Cloudy Park 4 - Star 47", "Cloudy Park 4 - Star 48", "Cloudy Park 4 - Star 49", "Cloudy Park 4 - Star 50"], "music": 21}, {"name": "Cloudy Park 4 - 7", "level": 4, "stage": 4, "room": 7, "pointer": 2967658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 12, "unkn2": 9, "x": 152, "y": 120, "name": "Cloudy Park 4 - 7 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Cloudy Park 4 - Miniboss 1 (Jumper Shoot)"], "music": 4}, {"name": "Cloudy Park 4 - 8", "level": 4, "stage": 4, "room": 8, "pointer": 2981644, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 344, "y": 680, "name": "Cloudy Park 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[24, 19]], "locations": [], "music": 21}, {"name": "Cloudy Park 4 - 9", "level": 4, "stage": 4, "room": 9, "pointer": 3008001, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[24, 19], [42, 19]], "locations": ["Cloudy Park 4 - Mikarin & Kagami Mocchi"], "music": 8}, {"name": "Cloudy Park 4 - 10", "level": 4, "stage": 4, "room": 10, "pointer": 2888184, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 4 - Complete"], "music": 5}, {"name": "Cloudy Park 5 - 0", "level": 4, "stage": 5, "room": 0, "pointer": 3192630, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Yaban", "Sir Kibble", "Cappy", "Wappa"], "default_exits": [{"room": 1, "unkn1": 146, "unkn2": 6, "x": 168, "y": 616, "name": "Cloudy Park 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [27, 16], [44, 16], [12, 16], [14, 23]], "locations": ["Cloudy Park 5 - Enemy 1 (Yaban)", "Cloudy Park 5 - Enemy 2 (Sir Kibble)", "Cloudy Park 5 - Enemy 3 (Cappy)", "Cloudy Park 5 - Enemy 4 (Wappa)", "Cloudy Park 5 - Star 1", "Cloudy Park 5 - Star 2"], "music": 17}, {"name": "Cloudy Park 5 - 1", "level": 4, "stage": 5, "room": 1, "pointer": 3050956, "animal_pointers": [], "consumables": [{"idx": 5, "pointer": 264, "x": 480, "y": 720, "etype": 22, "vtype": 2, "name": "Cloudy Park 5 - Maxim Tomato (Pillars)"}], "consumables_pointer": 288, "enemies": ["Galbo", "Bronto Burt", "KeKe"], "default_exits": [{"room": 2, "unkn1": 32, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [51, 16], [26, 16], [14, 23], [2, 22]], "locations": ["Cloudy Park 5 - Enemy 5 (Galbo)", "Cloudy Park 5 - Enemy 6 (Bronto Burt)", "Cloudy Park 5 - Enemy 7 (KeKe)", "Cloudy Park 5 - Star 3", "Cloudy Park 5 - Star 4", "Cloudy Park 5 - Star 5", "Cloudy Park 5 - Maxim Tomato (Pillars)"], "music": 17}, {"name": "Cloudy Park 5 - 2", "level": 4, "stage": 5, "room": 2, "pointer": 3604194, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 17, "unkn2": 9, "x": 72, "y": 88, "name": "Cloudy Park 5 - 2 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 5 - Animal 1", "Cloudy Park 5 - Animal 2"], "music": 40}, {"name": "Cloudy Park 5 - 3", "level": 4, "stage": 5, "room": 3, "pointer": 3131242, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Klinko"], "default_exits": [{"room": 4, "unkn1": 98, "unkn2": 5, "x": 72, "y": 120, "name": "Cloudy Park 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [4, 16], [42, 16], [4, 23]], "locations": ["Cloudy Park 5 - Enemy 8 (Propeller)", "Cloudy Park 5 - Enemy 9 (Klinko)"], "music": 17}, {"name": "Cloudy Park 5 - 4", "level": 4, "stage": 5, "room": 4, "pointer": 2990116, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 23, "unkn2": 7, "x": 216, "y": 744, "name": "Cloudy Park 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[88, 16]], "locations": ["Cloudy Park 5 - Enemy 10 (Wapod)"], "music": 17}, {"name": "Cloudy Park 5 - 5", "level": 4, "stage": 5, "room": 5, "pointer": 2975410, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 5, "unkn2": 4, "x": 104, "y": 296, "name": "Cloudy Park 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [2, 16]], "locations": ["Cloudy Park 5 - Star 6"], "music": 17}, {"name": "Cloudy Park 5 - 6", "level": 4, "stage": 5, "room": 6, "pointer": 3173683, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 7, "unkn1": 115, "unkn2": 6, "x": 56, "y": 136, "name": "Cloudy Park 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[2, 16], [1, 23], [39, 16], [70, 16]], "locations": ["Cloudy Park 5 - Enemy 11 (Pteran)"], "music": 17}, {"name": "Cloudy Park 5 - 7", "level": 4, "stage": 5, "room": 7, "pointer": 2992340, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 14, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[25, 19], [42, 19]], "locations": ["Cloudy Park 5 - Pick"], "music": 8}, {"name": "Cloudy Park 5 - 8", "level": 4, "stage": 5, "room": 8, "pointer": 2891558, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 5 - Complete"], "music": 5}, {"name": "Cloudy Park 6 - 0", "level": 4, "stage": 6, "room": 0, "pointer": 3269847, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 0 Exit 0", "access_rule": []}], "entity_load": [[14, 23]], "locations": ["Cloudy Park 6 - Star 1"], "music": 11}, {"name": "Cloudy Park 6 - 1", "level": 4, "stage": 6, "room": 1, "pointer": 3252248, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 3, "unkn2": 25, "x": 72, "y": 72, "name": "Cloudy Park 6 - 1 Exit 0", "access_rule": []}], "entity_load": [[14, 16], [55, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 2", "level": 4, "stage": 6, "room": 2, "pointer": 3028494, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 0, "unkn1": 4, "unkn2": 9, "x": 1032, "y": 152, "name": "Cloudy Park 6 - 2 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 13, "unkn2": 9, "x": 56, "y": 72, "name": "Cloudy Park 6 - 2 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 1 (Madoo)", "Cloudy Park 6 - Star 2", "Cloudy Park 6 - Star 3", "Cloudy Park 6 - Star 4", "Cloudy Park 6 - Star 5"], "music": 11}, {"name": "Cloudy Park 6 - 3", "level": 4, "stage": 6, "room": 3, "pointer": 3131911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 3 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 3 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 3 Exit 2", "access_rule": []}, {"room": 10, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 3 Exit 3", "access_rule": []}, {"room": 10, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 3 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 4", "level": 4, "stage": 6, "room": 4, "pointer": 3115416, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick", "Como"], "default_exits": [{"room": 8, "unkn1": 20, "unkn2": 4, "x": 72, "y": 488, "name": "Cloudy Park 6 - 4 Exit 0", "access_rule": []}, {"room": 11, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 4 Exit 1", "access_rule": []}, {"room": 11, "unkn1": 8, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 4 Exit 2", "access_rule": []}, {"room": 11, "unkn1": 12, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 4 Exit 3", "access_rule": []}, {"room": 11, "unkn1": 16, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 4 Exit 4", "access_rule": []}, {"room": 11, "unkn1": 20, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 4 Exit 5", "access_rule": []}], "entity_load": [[55, 16], [48, 16], [41, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 2 (Tick)", "Cloudy Park 6 - Enemy 3 (Como)", "Cloudy Park 6 - Star 6", "Cloudy Park 6 - Star 7", "Cloudy Park 6 - Star 8"], "music": 11}, {"name": "Cloudy Park 6 - 5", "level": 4, "stage": 6, "room": 5, "pointer": 3245809, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 15, "unkn1": 65, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 5 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16], [14, 23], [4, 22]], "locations": ["Cloudy Park 6 - Enemy 4 (Waddle Dee Drawing)", "Cloudy Park 6 - Enemy 5 (Bronto Burt Drawing)", "Cloudy Park 6 - Enemy 6 (Bouncy Drawing)", "Cloudy Park 6 - Star 9", "Cloudy Park 6 - Star 10", "Cloudy Park 6 - Star 11", "Cloudy Park 6 - Star 12", "Cloudy Park 6 - Star 13"], "music": 11}, {"name": "Cloudy Park 6 - 6", "level": 4, "stage": 6, "room": 6, "pointer": 3237044, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 7, "unkn1": 56, "unkn2": 9, "x": 72, "y": 136, "name": "Cloudy Park 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[89, 16]], "locations": ["Cloudy Park 6 - Enemy 7 (Propeller)"], "music": 11}, {"name": "Cloudy Park 6 - 7", "level": 4, "stage": 6, "room": 7, "pointer": 3262705, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo"], "default_exits": [{"room": 13, "unkn1": 12, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 57, "unkn2": 8, "x": 184, "y": 216, "name": "Cloudy Park 6 - 7 Exit 1", "access_rule": []}, {"room": 9, "unkn1": 64, "unkn2": 8, "x": 72, "y": 120, "name": "Cloudy Park 6 - 7 Exit 2", "access_rule": []}], "entity_load": [[74, 16], [14, 23]], "locations": ["Cloudy Park 6 - Enemy 8 (Mopoo)", "Cloudy Park 6 - Star 14", "Cloudy Park 6 - Star 15", "Cloudy Park 6 - Star 16", "Cloudy Park 6 - Star 17"], "music": 11}, {"name": "Cloudy Park 6 - 8", "level": 4, "stage": 6, "room": 8, "pointer": 3027259, "animal_pointers": [], "consumables": [{"idx": 22, "pointer": 312, "x": 224, "y": 256, "etype": 22, "vtype": 0, "name": "Cloudy Park 6 - 1-Up (Cutter)"}], "consumables_pointer": 304, "enemies": ["Bukiset (Burning)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Cutter)"], "default_exits": [{"room": 12, "unkn1": 13, "unkn2": 4, "x": 88, "y": 152, "name": "Cloudy Park 6 - 8 Exit 0", "access_rule": []}], "entity_load": [[78, 16], [80, 16], [76, 16], [79, 16], [83, 16], [14, 23], [4, 22], [0, 22]], "locations": ["Cloudy Park 6 - Enemy 9 (Bukiset (Burning))", "Cloudy Park 6 - Enemy 10 (Bukiset (Ice))", "Cloudy Park 6 - Enemy 11 (Bukiset (Needle))", "Cloudy Park 6 - Enemy 12 (Bukiset (Clean))", "Cloudy Park 6 - Enemy 13 (Bukiset (Cutter))", "Cloudy Park 6 - Star 18", "Cloudy Park 6 - Star 19", "Cloudy Park 6 - Star 20", "Cloudy Park 6 - Star 21", "Cloudy Park 6 - Star 22", "Cloudy Park 6 - Star 23", "Cloudy Park 6 - Star 24", "Cloudy Park 6 - Star 25", "Cloudy Park 6 - Star 26", "Cloudy Park 6 - Star 27", "Cloudy Park 6 - Star 28", "Cloudy Park 6 - Star 29", "Cloudy Park 6 - 1-Up (Cutter)"], "music": 11}, {"name": "Cloudy Park 6 - 9", "level": 4, "stage": 6, "room": 9, "pointer": 3089504, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 35, "unkn2": 7, "x": 72, "y": 72, "name": "Cloudy Park 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[41, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 10", "level": 4, "stage": 6, "room": 10, "pointer": 3132579, "animal_pointers": [242, 250, 258], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 20, "unkn2": 4, "x": 72, "y": 152, "name": "Cloudy Park 6 - 10 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 4, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 10 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 8, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 10 Exit 2", "access_rule": []}, {"room": 3, "unkn1": 12, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 10 Exit 3", "access_rule": []}, {"room": 3, "unkn1": 16, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 10 Exit 4", "access_rule": []}, {"room": 3, "unkn1": 20, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 10 Exit 5", "access_rule": []}], "entity_load": [], "locations": ["Cloudy Park 6 - Animal 1", "Cloudy Park 6 - Animal 2", "Cloudy Park 6 - Animal 3"], "music": 40}, {"name": "Cloudy Park 6 - 11", "level": 4, "stage": 6, "room": 11, "pointer": 3017866, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 4, "unkn2": 9, "x": 72, "y": 152, "name": "Cloudy Park 6 - 11 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 8, "unkn2": 9, "x": 264, "y": 152, "name": "Cloudy Park 6 - 11 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 12, "unkn2": 9, "x": 136, "y": 152, "name": "Cloudy Park 6 - 11 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 16, "unkn2": 9, "x": 328, "y": 152, "name": "Cloudy Park 6 - 11 Exit 3", "access_rule": []}, {"room": 4, "unkn1": 20, "unkn2": 9, "x": 200, "y": 152, "name": "Cloudy Park 6 - 11 Exit 4", "access_rule": []}], "entity_load": [[58, 16]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 12", "level": 4, "stage": 6, "room": 12, "pointer": 3036404, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 4, "unkn2": 9, "x": 200, "y": 72, "name": "Cloudy Park 6 - 12 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 13, "unkn2": 9, "x": 88, "y": 152, "name": "Cloudy Park 6 - 12 Exit 1", "access_rule": []}], "entity_load": [[58, 16], [14, 23]], "locations": ["Cloudy Park 6 - Star 30", "Cloudy Park 6 - Star 31", "Cloudy Park 6 - Star 32", "Cloudy Park 6 - Star 33"], "music": 11}, {"name": "Cloudy Park 6 - 13", "level": 4, "stage": 6, "room": 13, "pointer": 2965251, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 216, "y": 136, "name": "Cloudy Park 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[26, 19]], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 14", "level": 4, "stage": 6, "room": 14, "pointer": 3077236, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 13, "x": 936, "y": 136, "name": "Cloudy Park 6 - 14 Exit 0", "access_rule": []}], "entity_load": [], "locations": [], "music": 11}, {"name": "Cloudy Park 6 - 15", "level": 4, "stage": 6, "room": 15, "pointer": 3061794, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Cloudy Park 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[26, 19], [42, 19]], "locations": ["Cloudy Park 6 - HB-007"], "music": 8}, {"name": "Cloudy Park 6 - 16", "level": 4, "stage": 6, "room": 16, "pointer": 2888907, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Cloudy Park 6 - Complete"], "music": 5}, {"name": "Cloudy Park Boss - 0", "level": 4, "stage": 7, "room": 0, "pointer": 2998682, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[3, 18]], "locations": ["Cloudy Park - Boss (Ado) Purified", "Level 4 Boss - Defeated", "Level 4 Boss - Purified"], "music": 2}, {"name": "Iceberg 1 - 0", "level": 5, "stage": 1, "room": 0, "pointer": 3363111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Klinko", "KeKe"], "default_exits": [{"room": 1, "unkn1": 104, "unkn2": 8, "x": 312, "y": 1384, "name": "Iceberg 1 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [0, 16], [51, 16]], "locations": ["Iceberg 1 - Enemy 1 (Waddle Dee)", "Iceberg 1 - Enemy 2 (Klinko)", "Iceberg 1 - Enemy 3 (KeKe)"], "music": 18}, {"name": "Iceberg 1 - 1", "level": 5, "stage": 1, "room": 1, "pointer": 3596524, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Como", "Galbo", "Rocky"], "default_exits": [{"room": 2, "unkn1": 20, "unkn2": 8, "x": 72, "y": 344, "name": "Iceberg 1 - 1 Exit 0", "access_rule": []}], "entity_load": [[3, 16], [41, 16], [26, 16], [14, 23], [4, 22], [6, 23]], "locations": ["Iceberg 1 - Enemy 4 (Como)", "Iceberg 1 - Enemy 5 (Galbo)", "Iceberg 1 - Enemy 6 (Rocky)", "Iceberg 1 - Star 1", "Iceberg 1 - Star 2", "Iceberg 1 - Star 3", "Iceberg 1 - Star 4", "Iceberg 1 - Star 5", "Iceberg 1 - Star 6"], "music": 18}, {"name": "Iceberg 1 - 2", "level": 5, "stage": 1, "room": 2, "pointer": 3288880, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 3, "unkn1": 49, "unkn2": 9, "x": 184, "y": 152, "name": "Iceberg 1 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 94, "unkn2": 21, "x": 120, "y": 168, "name": "Iceberg 1 - 2 Exit 1", "access_rule": []}], "entity_load": [[28, 19], [46, 16], [47, 16], [17, 16], [67, 16]], "locations": ["Iceberg 1 - Enemy 7 (Kapar)"], "music": 18}, {"name": "Iceberg 1 - 3", "level": 5, "stage": 1, "room": 3, "pointer": 3068439, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 10, "unkn2": 9, "x": 808, "y": 152, "name": "Iceberg 1 - 3 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 1 - Animal 1", "Iceberg 1 - Animal 2"], "music": 38}, {"name": "Iceberg 1 - 4", "level": 5, "stage": 1, "room": 4, "pointer": 3233681, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mopoo", "Babut", "Wappa"], "default_exits": [{"room": 6, "unkn1": 74, "unkn2": 4, "x": 56, "y": 152, "name": "Iceberg 1 - 4 Exit 0", "access_rule": []}], "entity_load": [[44, 16], [43, 16], [74, 16]], "locations": ["Iceberg 1 - Enemy 8 (Mopoo)", "Iceberg 1 - Enemy 9 (Babut)", "Iceberg 1 - Enemy 10 (Wappa)"], "music": 18}, {"name": "Iceberg 1 - 5", "level": 5, "stage": 1, "room": 5, "pointer": 3406133, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Chilly", "Poppy Bros Jr."], "default_exits": [{"room": 4, "unkn1": 196, "unkn2": 9, "x": 72, "y": 744, "name": "Iceberg 1 - 5 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [7, 16], [2, 16], [0, 16]], "locations": ["Iceberg 1 - Enemy 11 (Bronto Burt)", "Iceberg 1 - Enemy 12 (Chilly)", "Iceberg 1 - Enemy 13 (Poppy Bros Jr.)"], "music": 18}, {"name": "Iceberg 1 - 6", "level": 5, "stage": 1, "room": 6, "pointer": 2985823, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 1 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 19], [42, 19]], "locations": ["Iceberg 1 - Kogoesou"], "music": 8}, {"name": "Iceberg 1 - 7", "level": 5, "stage": 1, "room": 7, "pointer": 2892040, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 1 - Complete"], "music": 5}, {"name": "Iceberg 2 - 0", "level": 5, "stage": 2, "room": 0, "pointer": 3106800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon", "Nruff"], "default_exits": [{"room": 1, "unkn1": 113, "unkn2": 36, "x": 88, "y": 152, "name": "Iceberg 2 - 0 Exit 0", "access_rule": []}], "entity_load": [[15, 16], [0, 16], [24, 16]], "locations": ["Iceberg 2 - Enemy 1 (Gabon)", "Iceberg 2 - Enemy 2 (Nruff)"], "music": 20}, {"name": "Iceberg 2 - 1", "level": 5, "stage": 2, "room": 1, "pointer": 3334841, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee", "Chilly", "Pteran"], "default_exits": [{"room": 2, "unkn1": 109, "unkn2": 20, "x": 88, "y": 72, "name": "Iceberg 2 - 1 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [0, 16], [4, 16], [39, 16]], "locations": ["Iceberg 2 - Enemy 3 (Waddle Dee)", "Iceberg 2 - Enemy 4 (Chilly)", "Iceberg 2 - Enemy 5 (Pteran)"], "music": 20}, {"name": "Iceberg 2 - 2", "level": 5, "stage": 2, "room": 2, "pointer": 3473408, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Galbo", "Babut", "Magoo"], "default_exits": [{"room": 6, "unkn1": 102, "unkn2": 5, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 24, "unkn2": 18, "x": 88, "y": 152, "name": "Iceberg 2 - 2 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 37, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 2", "access_rule": []}, {"room": 4, "unkn1": 55, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 3", "access_rule": []}, {"room": 5, "unkn1": 73, "unkn2": 26, "x": 200, "y": 184, "name": "Iceberg 2 - 2 Exit 4", "access_rule": []}], "entity_load": [[53, 16], [26, 16], [43, 16], [14, 23], [16, 16]], "locations": ["Iceberg 2 - Enemy 6 (Glunk)", "Iceberg 2 - Enemy 7 (Galbo)", "Iceberg 2 - Enemy 8 (Babut)", "Iceberg 2 - Enemy 9 (Magoo)", "Iceberg 2 - Star 1", "Iceberg 2 - Star 2"], "music": 20}, {"name": "Iceberg 2 - 3", "level": 5, "stage": 2, "room": 3, "pointer": 3037006, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 616, "y": 424, "name": "Iceberg 2 - 3 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": ["Iceberg 2 - Star 3"], "music": 20}, {"name": "Iceberg 2 - 4", "level": 5, "stage": 2, "room": 4, "pointer": 3035198, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 904, "y": 424, "name": "Iceberg 2 - 4 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": ["Iceberg 2 - Star 4", "Iceberg 2 - Star 5"], "music": 20}, {"name": "Iceberg 2 - 5", "level": 5, "stage": 2, "room": 5, "pointer": 3128551, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 11, "x": 1192, "y": 424, "name": "Iceberg 2 - 5 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [14, 23]], "locations": ["Iceberg 2 - Star 6", "Iceberg 2 - Star 7", "Iceberg 2 - Star 8"], "music": 20}, {"name": "Iceberg 2 - 6", "level": 5, "stage": 2, "room": 6, "pointer": 3270857, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller", "Nidoo", "Oro"], "default_exits": [{"room": 7, "unkn1": 65, "unkn2": 9, "x": 88, "y": 152, "name": "Iceberg 2 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16], [4, 22], [89, 16], [28, 16], [25, 16]], "locations": ["Iceberg 2 - Enemy 10 (Propeller)", "Iceberg 2 - Enemy 11 (Nidoo)", "Iceberg 2 - Enemy 12 (Oro)"], "music": 20}, {"name": "Iceberg 2 - 7", "level": 5, "stage": 2, "room": 7, "pointer": 3212501, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Klinko", "Bronto Burt"], "default_exits": [{"room": 8, "unkn1": 124, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 2 - 7 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [14, 23], [2, 16], [4, 23]], "locations": ["Iceberg 2 - Enemy 13 (Klinko)", "Iceberg 2 - Enemy 14 (Bronto Burt)", "Iceberg 2 - Star 9", "Iceberg 2 - Star 10", "Iceberg 2 - Star 11", "Iceberg 2 - Star 12", "Iceberg 2 - Star 13", "Iceberg 2 - Star 14", "Iceberg 2 - Star 15", "Iceberg 2 - Star 16", "Iceberg 2 - Star 17", "Iceberg 2 - Star 18", "Iceberg 2 - Star 19"], "music": 20}, {"name": "Iceberg 2 - 8", "level": 5, "stage": 2, "room": 8, "pointer": 2994515, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 2 - 8 Exit 0", "access_rule": []}], "entity_load": [[29, 19], [42, 19]], "locations": ["Iceberg 2 - Samus"], "music": 8}, {"name": "Iceberg 2 - 9", "level": 5, "stage": 2, "room": 9, "pointer": 3058084, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 4, "unkn2": 9, "x": 408, "y": 296, "name": "Iceberg 2 - 9 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 2 - Animal 1", "Iceberg 2 - Animal 2"], "music": 39}, {"name": "Iceberg 2 - 10", "level": 5, "stage": 2, "room": 10, "pointer": 2887220, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 2 - Complete"], "music": 5}, {"name": "Iceberg 3 - 0", "level": 5, "stage": 3, "room": 0, "pointer": 3455346, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori", "Bouncy", "Chilly", "Pteran"], "default_exits": [{"room": 1, "unkn1": 98, "unkn2": 6, "x": 200, "y": 232, "name": "Iceberg 3 - 0 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 217, "unkn2": 7, "x": 40, "y": 120, "name": "Iceberg 3 - 0 Exit 1", "access_rule": []}], "entity_load": [[60, 16], [6, 16], [39, 16], [13, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 1 (Corori)", "Iceberg 3 - Enemy 2 (Bouncy)", "Iceberg 3 - Enemy 3 (Chilly)", "Iceberg 3 - Enemy 4 (Pteran)", "Iceberg 3 - Star 1", "Iceberg 3 - Star 2"], "music": 14}, {"name": "Iceberg 3 - 1", "level": 5, "stage": 3, "room": 1, "pointer": 3019769, "animal_pointers": [192, 200, 208], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 0, "unkn1": 11, "unkn2": 14, "x": 1592, "y": 104, "name": "Iceberg 3 - 1 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 1", "Iceberg 3 - Animal 2", "Iceberg 3 - Animal 3"], "music": 38}, {"name": "Iceberg 3 - 2", "level": 5, "stage": 3, "room": 2, "pointer": 3618121, "animal_pointers": [], "consumables": [{"idx": 2, "pointer": 352, "x": 1776, "y": 104, "etype": 22, "vtype": 2, "name": "Iceberg 3 - Maxim Tomato (Ceiling)"}], "consumables_pointer": 128, "enemies": ["Raft Waddle Dee", "Kapar", "Blipper"], "default_exits": [{"room": 3, "unkn1": 196, "unkn2": 11, "x": 72, "y": 152, "name": "Iceberg 3 - 2 Exit 0", "access_rule": []}], "entity_load": [[2, 22], [71, 16], [57, 16], [21, 16], [67, 16], [14, 23]], "locations": ["Iceberg 3 - Enemy 5 (Raft Waddle Dee)", "Iceberg 3 - Enemy 6 (Kapar)", "Iceberg 3 - Enemy 7 (Blipper)", "Iceberg 3 - Star 3", "Iceberg 3 - Maxim Tomato (Ceiling)"], "music": 14}, {"name": "Iceberg 3 - 3", "level": 5, "stage": 3, "room": 3, "pointer": 3650368, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 5, "unkn1": 116, "unkn2": 11, "x": 40, "y": 152, "name": "Iceberg 3 - 3 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 63, "unkn2": 13, "x": 184, "y": 136, "name": "Iceberg 3 - 3 Exit 1", "access_rule": []}], "entity_load": [[1, 16], [14, 23], [4, 22], [6, 16], [88, 16]], "locations": ["Iceberg 3 - Enemy 8 (Wapod)", "Iceberg 3 - Star 4", "Iceberg 3 - Star 5", "Iceberg 3 - Star 6", "Iceberg 3 - Star 7", "Iceberg 3 - Star 8", "Iceberg 3 - Star 9", "Iceberg 3 - Star 10"], "music": 14}, {"name": "Iceberg 3 - 4", "level": 5, "stage": 3, "room": 4, "pointer": 3038208, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 10, "unkn2": 8, "x": 1032, "y": 216, "name": "Iceberg 3 - 4 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 3 - Animal 4", "Iceberg 3 - Animal 5"], "music": 39}, {"name": "Iceberg 3 - 5", "level": 5, "stage": 3, "room": 5, "pointer": 3013938, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 5 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": [], "music": 31}, {"name": "Iceberg 3 - 6", "level": 5, "stage": 3, "room": 6, "pointer": 3624789, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk", "Icicle"], "default_exits": [{"room": 7, "unkn1": 211, "unkn2": 7, "x": 40, "y": 152, "name": "Iceberg 3 - 6 Exit 0", "access_rule": []}], "entity_load": [[6, 16], [16, 16], [14, 23], [36, 16], [4, 22]], "locations": ["Iceberg 3 - Enemy 9 (Glunk)", "Iceberg 3 - Enemy 10 (Icicle)", "Iceberg 3 - Star 11", "Iceberg 3 - Star 12", "Iceberg 3 - Star 13", "Iceberg 3 - Star 14", "Iceberg 3 - Star 15", "Iceberg 3 - Star 16", "Iceberg 3 - Star 17", "Iceberg 3 - Star 18", "Iceberg 3 - Star 19", "Iceberg 3 - Star 20", "Iceberg 3 - Star 21"], "music": 14}, {"name": "Iceberg 3 - 7", "level": 5, "stage": 3, "room": 7, "pointer": 2989472, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 15, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 3 - 7 Exit 0", "access_rule": []}], "entity_load": [[30, 19]], "locations": ["Iceberg 3 - Chef Kawasaki"], "music": 8}, {"name": "Iceberg 3 - 8", "level": 5, "stage": 3, "room": 8, "pointer": 2889871, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 3 - Complete"], "music": 5}, {"name": "Iceberg 4 - 0", "level": 5, "stage": 4, "room": 0, "pointer": 3274879, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bronto Burt", "Galbo", "Klinko", "Chilly"], "default_exits": [{"room": 1, "unkn1": 111, "unkn2": 8, "x": 72, "y": 104, "name": "Iceberg 4 - 0 Exit 0", "access_rule": []}], "entity_load": [[42, 16], [6, 16], [2, 16], [26, 16]], "locations": ["Iceberg 4 - Enemy 1 (Bronto Burt)", "Iceberg 4 - Enemy 2 (Galbo)", "Iceberg 4 - Enemy 3 (Klinko)", "Iceberg 4 - Enemy 4 (Chilly)"], "music": 19}, {"name": "Iceberg 4 - 1", "level": 5, "stage": 4, "room": 1, "pointer": 3371780, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Babut", "Wappa"], "default_exits": [{"room": 2, "unkn1": 60, "unkn2": 36, "x": 216, "y": 88, "name": "Iceberg 4 - 1 Exit 0", "access_rule": []}], "entity_load": [[43, 16], [4, 22], [44, 16]], "locations": ["Iceberg 4 - Enemy 5 (Babut)", "Iceberg 4 - Enemy 6 (Wappa)"], "music": 19}, {"name": "Iceberg 4 - 2", "level": 5, "stage": 4, "room": 2, "pointer": 3284378, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 16, "unkn1": 8, "unkn2": 39, "x": 168, "y": 152, "name": "Iceberg 4 - 2 Exit 0", "access_rule": ["Burning", "Burning Ability"]}, {"room": 3, "unkn1": 13, "unkn2": 39, "x": 88, "y": 136, "name": "Iceberg 4 - 2 Exit 1", "access_rule": []}, {"room": 17, "unkn1": 18, "unkn2": 39, "x": 120, "y": 152, "name": "Iceberg 4 - 2 Exit 2", "access_rule": ["Burning", "Burning Ability"]}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 3", "level": 5, "stage": 4, "room": 3, "pointer": 3162957, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 4, "unkn1": 44, "unkn2": 8, "x": 216, "y": 104, "name": "Iceberg 4 - 3 Exit 0", "access_rule": []}], "entity_load": [[69, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 4", "level": 5, "stage": 4, "room": 4, "pointer": 3261679, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Icicle"], "default_exits": [{"room": 5, "unkn1": 4, "unkn2": 42, "x": 104, "y": 840, "name": "Iceberg 4 - 4 Exit 0", "access_rule": []}], "entity_load": [[36, 16]], "locations": ["Iceberg 4 - Enemy 7 (Icicle)"], "music": 19}, {"name": "Iceberg 4 - 5", "level": 5, "stage": 4, "room": 5, "pointer": 3217398, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Corori"], "default_exits": [{"room": 6, "unkn1": 19, "unkn2": 5, "x": 72, "y": 120, "name": "Iceberg 4 - 5 Exit 0", "access_rule": []}], "entity_load": [[60, 16], [44, 16], [4, 22]], "locations": ["Iceberg 4 - Enemy 8 (Corori)"], "music": 19}, {"name": "Iceberg 4 - 6", "level": 5, "stage": 4, "room": 6, "pointer": 3108265, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 61, "unkn2": 7, "x": 456, "y": 72, "name": "Iceberg 4 - 6 Exit 0", "access_rule": []}], "entity_load": [[62, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 7", "level": 5, "stage": 4, "room": 7, "pointer": 3346202, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 8, "unkn1": 39, "unkn2": 6, "x": 168, "y": 104, "name": "Iceberg 4 - 7 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 4, "unkn2": 21, "x": 88, "y": 168, "name": "Iceberg 4 - 7 Exit 1", "access_rule": ["Burning", "Burning Ability"]}, {"room": 13, "unkn1": 21, "unkn2": 21, "x": 280, "y": 168, "name": "Iceberg 4 - 7 Exit 2", "access_rule": ["Burning", "Burning Ability"]}], "entity_load": [[14, 23], [4, 22], [4, 23]], "locations": ["Iceberg 4 - Star 1", "Iceberg 4 - Star 2"], "music": 19}, {"name": "Iceberg 4 - 8", "level": 5, "stage": 4, "room": 8, "pointer": 3055911, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 10, "unkn2": 5, "x": 648, "y": 104, "name": "Iceberg 4 - 8 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 9", "level": 5, "stage": 4, "room": 9, "pointer": 3056457, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 9, "x": 136, "y": 136, "name": "Iceberg 4 - 9 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 4 - Miniboss 1 (Yuki)"], "music": 4}, {"name": "Iceberg 4 - 10", "level": 5, "stage": 4, "room": 10, "pointer": 3257516, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 8, "unkn2": 37, "x": 88, "y": 40, "name": "Iceberg 4 - 10 Exit 0", "access_rule": []}, {"room": 9, "unkn1": 15, "unkn2": 37, "x": 200, "y": 40, "name": "Iceberg 4 - 10 Exit 1", "access_rule": []}], "entity_load": [[31, 19]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 11", "level": 5, "stage": 4, "room": 11, "pointer": 3083322, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gabon"], "default_exits": [{"room": 12, "unkn1": 46, "unkn2": 8, "x": 88, "y": 120, "name": "Iceberg 4 - 11 Exit 0", "access_rule": []}], "entity_load": [[24, 16]], "locations": ["Iceberg 4 - Enemy 9 (Gabon)"], "music": 19}, {"name": "Iceberg 4 - 12", "level": 5, "stage": 4, "room": 12, "pointer": 3147724, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kabu"], "default_exits": [{"room": 18, "unkn1": 64, "unkn2": 7, "x": 72, "y": 456, "name": "Iceberg 4 - 12 Exit 0", "access_rule": []}], "entity_load": [[19, 16], [61, 16]], "locations": ["Iceberg 4 - Enemy 10 (Kabu)"], "music": 19}, {"name": "Iceberg 4 - 13", "level": 5, "stage": 4, "room": 13, "pointer": 3370077, "animal_pointers": [232, 240, 248], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 31, "unkn2": 4, "x": 216, "y": 120, "name": "Iceberg 4 - 13 Exit 0", "access_rule": []}, {"room": 10, "unkn1": 46, "unkn2": 10, "x": 72, "y": 88, "name": "Iceberg 4 - 13 Exit 1", "access_rule": []}, {"room": 10, "unkn1": 57, "unkn2": 10, "x": 312, "y": 88, "name": "Iceberg 4 - 13 Exit 2", "access_rule": []}, {"room": 14, "unkn1": 28, "unkn2": 21, "x": 152, "y": 136, "name": "Iceberg 4 - 13 Exit 3", "access_rule": []}, {"room": 14, "unkn1": 34, "unkn2": 21, "x": 280, "y": 136, "name": "Iceberg 4 - 13 Exit 4", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 1", "Iceberg 4 - Animal 2", "Iceberg 4 - Animal 3"], "music": 19}, {"name": "Iceberg 4 - 14", "level": 5, "stage": 4, "room": 14, "pointer": 3057002, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Broom Hatter", "Sasuke"], "default_exits": [{"room": 15, "unkn1": 4, "unkn2": 8, "x": 88, "y": 360, "name": "Iceberg 4 - 14 Exit 0", "access_rule": []}, {"room": 13, "unkn1": 10, "unkn2": 8, "x": 440, "y": 344, "name": "Iceberg 4 - 14 Exit 1", "access_rule": []}, {"room": 13, "unkn1": 16, "unkn2": 8, "x": 568, "y": 344, "name": "Iceberg 4 - 14 Exit 2", "access_rule": []}, {"room": 15, "unkn1": 22, "unkn2": 8, "x": 344, "y": 360, "name": "Iceberg 4 - 14 Exit 3", "access_rule": []}], "entity_load": [[11, 16], [30, 16]], "locations": ["Iceberg 4 - Enemy 11 (Broom Hatter)", "Iceberg 4 - Enemy 12 (Sasuke)"], "music": 19}, {"name": "Iceberg 4 - 15", "level": 5, "stage": 4, "room": 15, "pointer": 3116124, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 6, "x": 520, "y": 72, "name": "Iceberg 4 - 15 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 4, "unkn2": 22, "x": 88, "y": 136, "name": "Iceberg 4 - 15 Exit 1", "access_rule": []}, {"room": 14, "unkn1": 22, "unkn2": 22, "x": 344, "y": 136, "name": "Iceberg 4 - 15 Exit 2", "access_rule": []}], "entity_load": [[4, 22]], "locations": [], "music": 19}, {"name": "Iceberg 4 - 16", "level": 5, "stage": 4, "room": 16, "pointer": 3069937, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 11, "unkn2": 9, "x": 152, "y": 632, "name": "Iceberg 4 - 16 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 4"], "music": 38}, {"name": "Iceberg 4 - 17", "level": 5, "stage": 4, "room": 17, "pointer": 3072413, "animal_pointers": [192], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 6, "unkn2": 9, "x": 280, "y": 632, "name": "Iceberg 4 - 17 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 4 - Animal 5"], "music": 38}, {"name": "Iceberg 4 - 18", "level": 5, "stage": 4, "room": 18, "pointer": 3404593, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 19, "unkn1": 94, "unkn2": 12, "x": 72, "y": 152, "name": "Iceberg 4 - 18 Exit 0", "access_rule": []}], "entity_load": [[14, 23], [43, 16], [30, 16], [15, 16]], "locations": ["Iceberg 4 - Enemy 13 (Nruff)", "Iceberg 4 - Star 3"], "music": 19}, {"name": "Iceberg 4 - 19", "level": 5, "stage": 4, "room": 19, "pointer": 3075826, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 14, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 4 - 19 Exit 0", "access_rule": []}], "entity_load": [[31, 19], [42, 19]], "locations": ["Iceberg 4 - Name"], "music": 8}, {"name": "Iceberg 4 - 20", "level": 5, "stage": 4, "room": 20, "pointer": 2887943, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 4 - Complete"], "music": 5}, {"name": "Iceberg 5 - 0", "level": 5, "stage": 5, "room": 0, "pointer": 3316135, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Bukiset (Burning)", "Bukiset (Stone)", "Bukiset (Ice)", "Bukiset (Needle)", "Bukiset (Clean)", "Bukiset (Parasol)", "Bukiset (Spark)", "Bukiset (Cutter)"], "default_exits": [{"room": 30, "unkn1": 75, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 0 Exit 0", "access_rule": []}], "entity_load": [[79, 16], [76, 16], [81, 16], [78, 16], [77, 16], [82, 16], [80, 16], [83, 16]], "locations": ["Iceberg 5 - Enemy 1 (Bukiset (Burning))", "Iceberg 5 - Enemy 2 (Bukiset (Stone))", "Iceberg 5 - Enemy 3 (Bukiset (Ice))", "Iceberg 5 - Enemy 4 (Bukiset (Needle))", "Iceberg 5 - Enemy 5 (Bukiset (Clean))", "Iceberg 5 - Enemy 6 (Bukiset (Parasol))", "Iceberg 5 - Enemy 7 (Bukiset (Spark))", "Iceberg 5 - Enemy 8 (Bukiset (Cutter))"], "music": 16}, {"name": "Iceberg 5 - 1", "level": 5, "stage": 5, "room": 1, "pointer": 3037607, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 12, "unkn2": 6, "x": 72, "y": 104, "name": "Iceberg 5 - 1 Exit 0", "access_rule": []}], "entity_load": [[1, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 2", "level": 5, "stage": 5, "room": 2, "pointer": 3103842, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Glunk"], "default_exits": [{"room": 25, "unkn1": 27, "unkn2": 6, "x": 72, "y": 200, "name": "Iceberg 5 - 2 Exit 0", "access_rule": []}], "entity_load": [[16, 16]], "locations": ["Iceberg 5 - Enemy 9 (Glunk)"], "music": 16}, {"name": "Iceberg 5 - 3", "level": 5, "stage": 5, "room": 3, "pointer": 3135899, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Wapod"], "default_exits": [{"room": 4, "unkn1": 20, "unkn2": 7, "x": 72, "y": 88, "name": "Iceberg 5 - 3 Exit 0", "access_rule": []}], "entity_load": [[88, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 10 (Wapod)", "Iceberg 5 - Star 1", "Iceberg 5 - Star 2"], "music": 16}, {"name": "Iceberg 5 - 4", "level": 5, "stage": 5, "room": 4, "pointer": 3180695, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Tick"], "default_exits": [{"room": 5, "unkn1": 26, "unkn2": 5, "x": 56, "y": 104, "name": "Iceberg 5 - 4 Exit 0", "access_rule": []}], "entity_load": [[48, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 11 (Tick)", "Iceberg 5 - Star 3", "Iceberg 5 - Star 4", "Iceberg 5 - Star 5", "Iceberg 5 - Star 6", "Iceberg 5 - Star 7", "Iceberg 5 - Star 8"], "music": 16}, {"name": "Iceberg 5 - 5", "level": 5, "stage": 5, "room": 5, "pointer": 3106064, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Madoo"], "default_exits": [{"room": 24, "unkn1": 14, "unkn2": 6, "x": 168, "y": 152, "name": "Iceberg 5 - 5 Exit 0", "access_rule": []}], "entity_load": [[58, 16], [14, 23], [4, 22]], "locations": ["Iceberg 5 - Enemy 12 (Madoo)", "Iceberg 5 - Star 9", "Iceberg 5 - Star 10", "Iceberg 5 - Star 11", "Iceberg 5 - Star 12", "Iceberg 5 - Star 13", "Iceberg 5 - Star 14"], "music": 16}, {"name": "Iceberg 5 - 6", "level": 5, "stage": 5, "room": 6, "pointer": 3276800, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 7, "unkn1": 59, "unkn2": 12, "x": 72, "y": 120, "name": "Iceberg 5 - 6 Exit 0", "access_rule": []}], "entity_load": [[55, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 7", "level": 5, "stage": 5, "room": 7, "pointer": 3104585, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 26, "unkn1": 25, "unkn2": 7, "x": 72, "y": 136, "name": "Iceberg 5 - 7 Exit 0", "access_rule": []}], "entity_load": [[23, 16], [7, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 8", "level": 5, "stage": 5, "room": 8, "pointer": 3195121, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 35, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 8 Exit 0", "access_rule": []}], "entity_load": [[4, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 9", "level": 5, "stage": 5, "room": 9, "pointer": 3087198, "animal_pointers": [], "consumables": [{"idx": 16, "pointer": 200, "x": 256, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Boulder)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 28, "unkn1": 20, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 9 Exit 0", "access_rule": []}], "entity_load": [[0, 22], [54, 16]], "locations": ["Iceberg 5 - 1-Up (Boulder)"], "music": 16}, {"name": "Iceberg 5 - 10", "level": 5, "stage": 5, "room": 10, "pointer": 3321612, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 32, "unkn1": 45, "unkn2": 15, "x": 72, "y": 120, "name": "Iceberg 5 - 10 Exit 0", "access_rule": []}], "entity_load": [[14, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 11", "level": 5, "stage": 5, "room": 11, "pointer": 3139178, "animal_pointers": [], "consumables": [{"idx": 17, "pointer": 192, "x": 152, "y": 168, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Floor)"}], "consumables_pointer": 176, "enemies": ["Yaban"], "default_exits": [{"room": 12, "unkn1": 17, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 11 Exit 0", "access_rule": []}], "entity_load": [[32, 16], [0, 22]], "locations": ["Iceberg 5 - Enemy 13 (Yaban)", "Iceberg 5 - 1-Up (Floor)"], "music": 16}, {"name": "Iceberg 5 - 12", "level": 5, "stage": 5, "room": 12, "pointer": 3118231, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Propeller"], "default_exits": [{"room": 13, "unkn1": 13, "unkn2": 7, "x": 72, "y": 104, "name": "Iceberg 5 - 12 Exit 0", "access_rule": []}], "entity_load": [[89, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 14 (Propeller)", "Iceberg 5 - Star 15", "Iceberg 5 - Star 16", "Iceberg 5 - Star 17", "Iceberg 5 - Star 18", "Iceberg 5 - Star 19", "Iceberg 5 - Star 20"], "music": 16}, {"name": "Iceberg 5 - 13", "level": 5, "stage": 5, "room": 13, "pointer": 3021658, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Mariel"], "default_exits": [{"room": 27, "unkn1": 16, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 13 Exit 0", "access_rule": []}], "entity_load": [[45, 16]], "locations": ["Iceberg 5 - Enemy 15 (Mariel)"], "music": 16}, {"name": "Iceberg 5 - 14", "level": 5, "stage": 5, "room": 14, "pointer": 3025398, "animal_pointers": [], "consumables": [{"idx": 24, "pointer": 200, "x": 208, "y": 88, "etype": 22, "vtype": 0, "name": "Iceberg 5 - 1-Up (Peloo)"}], "consumables_pointer": 176, "enemies": [], "default_exits": [{"room": 15, "unkn1": 13, "unkn2": 9, "x": 72, "y": 216, "name": "Iceberg 5 - 14 Exit 0", "access_rule": []}], "entity_load": [[64, 16], [0, 22]], "locations": ["Iceberg 5 - 1-Up (Peloo)"], "music": 16}, {"name": "Iceberg 5 - 15", "level": 5, "stage": 5, "room": 15, "pointer": 3167445, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Pteran"], "default_exits": [{"room": 16, "unkn1": 13, "unkn2": 13, "x": 72, "y": 152, "name": "Iceberg 5 - 15 Exit 0", "access_rule": []}], "entity_load": [[39, 16]], "locations": ["Iceberg 5 - Enemy 16 (Pteran)"], "music": 16}, {"name": "Iceberg 5 - 16", "level": 5, "stage": 5, "room": 16, "pointer": 3033990, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 33, "unkn1": 36, "unkn2": 9, "x": 168, "y": 152, "name": "Iceberg 5 - 16 Exit 0", "access_rule": []}], "entity_load": [[68, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 17", "level": 5, "stage": 5, "room": 17, "pointer": 3100111, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 40, "unkn2": 7, "x": 72, "y": 200, "name": "Iceberg 5 - 17 Exit 0", "access_rule": []}], "entity_load": [[52, 16]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 18", "level": 5, "stage": 5, "room": 18, "pointer": 3030947, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Galbo"], "default_exits": [{"room": 17, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 18 Exit 0", "access_rule": []}], "entity_load": [[26, 16]], "locations": ["Iceberg 5 - Enemy 17 (Galbo)"], "music": 16}, {"name": "Iceberg 5 - 19", "level": 5, "stage": 5, "room": 19, "pointer": 3105326, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["KeKe"], "default_exits": [{"room": 21, "unkn1": 13, "unkn2": 4, "x": 72, "y": 152, "name": "Iceberg 5 - 19 Exit 0", "access_rule": []}], "entity_load": [[51, 16]], "locations": ["Iceberg 5 - Enemy 18 (KeKe)"], "music": 16}, {"name": "Iceberg 5 - 20", "level": 5, "stage": 5, "room": 20, "pointer": 3118928, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 19, "unkn1": 13, "unkn2": 6, "x": 72, "y": 264, "name": "Iceberg 5 - 20 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 5 - Enemy 19 (Nidoo)"], "music": 16}, {"name": "Iceberg 5 - 21", "level": 5, "stage": 5, "room": 21, "pointer": 3202517, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Waddle Dee Drawing", "Bronto Burt Drawing", "Bouncy Drawing"], "default_exits": [{"room": 22, "unkn1": 29, "unkn2": 9, "x": 72, "y": 72, "name": "Iceberg 5 - 21 Exit 0", "access_rule": []}], "entity_load": [[84, 16], [85, 16], [86, 16]], "locations": ["Iceberg 5 - Enemy 20 (Waddle Dee Drawing)", "Iceberg 5 - Enemy 21 (Bronto Burt Drawing)", "Iceberg 5 - Enemy 22 (Bouncy Drawing)"], "music": 16}, {"name": "Iceberg 5 - 22", "level": 5, "stage": 5, "room": 22, "pointer": 3014656, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Joe"], "default_exits": [{"room": 23, "unkn1": 13, "unkn2": 4, "x": 72, "y": 104, "name": "Iceberg 5 - 22 Exit 0", "access_rule": []}], "entity_load": [[91, 16], [14, 23]], "locations": ["Iceberg 5 - Enemy 23 (Joe)", "Iceberg 5 - Star 21", "Iceberg 5 - Star 22", "Iceberg 5 - Star 23", "Iceberg 5 - Star 24", "Iceberg 5 - Star 25"], "music": 16}, {"name": "Iceberg 5 - 23", "level": 5, "stage": 5, "room": 23, "pointer": 3166550, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Kapar"], "default_exits": [{"room": 34, "unkn1": 27, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 23 Exit 0", "access_rule": []}], "entity_load": [[67, 16]], "locations": ["Iceberg 5 - Enemy 24 (Kapar)"], "music": 16}, {"name": "Iceberg 5 - 24", "level": 5, "stage": 5, "room": 24, "pointer": 3029110, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Gansan"], "default_exits": [{"room": 31, "unkn1": 10, "unkn2": 4, "x": 72, "y": 88, "name": "Iceberg 5 - 24 Exit 0", "access_rule": []}], "entity_load": [[75, 16]], "locations": ["Iceberg 5 - Enemy 25 (Gansan)"], "music": 16}, {"name": "Iceberg 5 - 25", "level": 5, "stage": 5, "room": 25, "pointer": 3156420, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sasuke"], "default_exits": [{"room": 3, "unkn1": 25, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 25 Exit 0", "access_rule": []}], "entity_load": [[30, 16]], "locations": ["Iceberg 5 - Enemy 26 (Sasuke)"], "music": 16}, {"name": "Iceberg 5 - 26", "level": 5, "stage": 5, "room": 26, "pointer": 3127877, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Togezo"], "default_exits": [{"room": 8, "unkn1": 24, "unkn2": 8, "x": 72, "y": 152, "name": "Iceberg 5 - 26 Exit 0", "access_rule": []}], "entity_load": [[18, 16]], "locations": ["Iceberg 5 - Enemy 27 (Togezo)"], "music": 16}, {"name": "Iceberg 5 - 27", "level": 5, "stage": 5, "room": 27, "pointer": 3256471, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky", "Bobin"], "default_exits": [{"room": 14, "unkn1": 26, "unkn2": 9, "x": 72, "y": 152, "name": "Iceberg 5 - 27 Exit 0", "access_rule": []}], "entity_load": [[8, 16], [73, 16]], "locations": ["Iceberg 5 - Enemy 28 (Sparky)", "Iceberg 5 - Enemy 29 (Bobin)"], "music": 16}, {"name": "Iceberg 5 - 28", "level": 5, "stage": 5, "room": 28, "pointer": 3029723, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Chilly"], "default_exits": [{"room": 10, "unkn1": 13, "unkn2": 9, "x": 72, "y": 248, "name": "Iceberg 5 - 28 Exit 0", "access_rule": []}], "entity_load": [[6, 16]], "locations": ["Iceberg 5 - Enemy 30 (Chilly)"], "music": 16}, {"name": "Iceberg 5 - 29", "level": 5, "stage": 5, "room": 29, "pointer": 3526568, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 36, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 29 Exit 0", "access_rule": []}], "entity_load": [[10, 23], [31, 16], [14, 23]], "locations": ["Iceberg 5 - Star 26", "Iceberg 5 - Star 27", "Iceberg 5 - Star 28", "Iceberg 5 - Star 29", "Iceberg 5 - Star 30", "Iceberg 5 - Star 31", "Iceberg 5 - Star 32"], "music": 16}, {"name": "Iceberg 5 - 30", "level": 5, "stage": 5, "room": 30, "pointer": 3022285, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 1, "unkn1": 13, "unkn2": 5, "x": 88, "y": 104, "name": "Iceberg 5 - 30 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 1", "Iceberg 5 - Animal 2"], "music": 40}, {"name": "Iceberg 5 - 31", "level": 5, "stage": 5, "room": 31, "pointer": 3026019, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 13, "unkn2": 9, "x": 72, "y": 200, "name": "Iceberg 5 - 31 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 3", "Iceberg 5 - Animal 4"], "music": 40}, {"name": "Iceberg 5 - 32", "level": 5, "stage": 5, "room": 32, "pointer": 3039996, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 13, "unkn2": 7, "x": 72, "y": 120, "name": "Iceberg 5 - 32 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 5", "Iceberg 5 - Animal 6"], "music": 40}, {"name": "Iceberg 5 - 33", "level": 5, "stage": 5, "room": 33, "pointer": 3015302, "animal_pointers": [192, 200], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 10, "unkn2": 6, "x": 72, "y": 152, "name": "Iceberg 5 - 33 Exit 0", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 5 - Animal 7", "Iceberg 5 - Animal 8"], "music": 40}, {"name": "Iceberg 5 - 34", "level": 5, "stage": 5, "room": 34, "pointer": 3185868, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Peran"], "default_exits": [{"room": 35, "unkn1": 35, "unkn2": 9, "x": 200, "y": 328, "name": "Iceberg 5 - 34 Exit 0", "access_rule": []}], "entity_load": [[72, 16], [4, 22], [14, 23]], "locations": ["Iceberg 5 - Enemy 31 (Peran)", "Iceberg 5 - Star 33", "Iceberg 5 - Star 34"], "music": 16}, {"name": "Iceberg 5 - 35", "level": 5, "stage": 5, "room": 35, "pointer": 3865635, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 29, "unkn1": 12, "unkn2": 7, "x": 168, "y": 1384, "name": "Iceberg 5 - 35 Exit 0", "access_rule": []}], "entity_load": [[17, 16], [4, 22]], "locations": [], "music": 16}, {"name": "Iceberg 5 - 36", "level": 5, "stage": 5, "room": 36, "pointer": 3024154, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 37, "unkn1": 13, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 5 - 36 Exit 0", "access_rule": []}], "entity_load": [[32, 19], [42, 19]], "locations": ["Iceberg 5 - Shiro"], "music": 8}, {"name": "Iceberg 5 - 37", "level": 5, "stage": 5, "room": 37, "pointer": 2890594, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 5 - Complete"], "music": 5}, {"name": "Iceberg 6 - 0", "level": 5, "stage": 6, "room": 0, "pointer": 3385305, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nruff"], "default_exits": [{"room": 1, "unkn1": 6, "unkn2": 28, "x": 136, "y": 184, "name": "Iceberg 6 - 0 Exit 0", "access_rule": []}, {"room": 1, "unkn1": 12, "unkn2": 28, "x": 248, "y": 184, "name": "Iceberg 6 - 0 Exit 1", "access_rule": []}, {"room": 1, "unkn1": 18, "unkn2": 28, "x": 360, "y": 184, "name": "Iceberg 6 - 0 Exit 2", "access_rule": []}], "entity_load": [[15, 16]], "locations": ["Iceberg 6 - Enemy 1 (Nruff)"], "music": 12}, {"name": "Iceberg 6 - 1", "level": 5, "stage": 6, "room": 1, "pointer": 3197599, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 2, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 1 Exit 0", "access_rule": []}, {"room": 2, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 1 Exit 1", "access_rule": []}, {"room": 2, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 1 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 1", "Iceberg 6 - Animal 2", "Iceberg 6 - Animal 3"], "music": 12}, {"name": "Iceberg 6 - 2", "level": 5, "stage": 6, "room": 2, "pointer": 3097113, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 5, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 2 Exit 0", "access_rule": []}, {"room": 5, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 2 Exit 1", "access_rule": []}, {"room": 5, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 2 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 3", "level": 5, "stage": 6, "room": 3, "pointer": 3198422, "animal_pointers": [212, 220, 228], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 6, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 3 Exit 0", "access_rule": []}, {"room": 6, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 3 Exit 1", "access_rule": []}, {"room": 6, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 3 Exit 2", "access_rule": []}], "entity_load": [], "locations": ["Iceberg 6 - Animal 4", "Iceberg 6 - Animal 5", "Iceberg 6 - Animal 6"], "music": 12}, {"name": "Iceberg 6 - 4", "level": 5, "stage": 6, "room": 4, "pointer": 3210507, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 3, "unkn1": 9, "unkn2": 5, "x": 136, "y": 184, "name": "Iceberg 6 - 4 Exit 0", "access_rule": []}, {"room": 3, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 4 Exit 1", "access_rule": []}, {"room": 3, "unkn1": 21, "unkn2": 5, "x": 360, "y": 184, "name": "Iceberg 6 - 4 Exit 2", "access_rule": []}], "entity_load": [], "locations": [], "music": 12}, {"name": "Iceberg 6 - 5", "level": 5, "stage": 6, "room": 5, "pointer": 3196776, "animal_pointers": [], "consumables": [{"idx": 0, "pointer": 212, "x": 136, "y": 120, "etype": 22, "vtype": 2, "name": "Iceberg 6 - Maxim Tomato (Left)"}, {"idx": 1, "pointer": 220, "x": 248, "y": 120, "etype": 22, "vtype": 0, "name": "Iceberg 6 - 1-Up (Middle)"}], "consumables_pointer": 128, "enemies": [], "default_exits": [{"room": 4, "unkn1": 8, "unkn2": 5, "x": 152, "y": 184, "name": "Iceberg 6 - 5 Exit 0", "access_rule": []}, {"room": 4, "unkn1": 15, "unkn2": 5, "x": 248, "y": 184, "name": "Iceberg 6 - 5 Exit 1", "access_rule": []}, {"room": 4, "unkn1": 22, "unkn2": 5, "x": 344, "y": 184, "name": "Iceberg 6 - 5 Exit 2", "access_rule": []}], "entity_load": [[2, 22], [0, 22], [14, 23]], "locations": ["Iceberg 6 - Star 1", "Iceberg 6 - Maxim Tomato (Left)", "Iceberg 6 - 1-Up (Middle)"], "music": 12}, {"name": "Iceberg 6 - 6", "level": 5, "stage": 6, "room": 6, "pointer": 3208130, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Nidoo"], "default_exits": [{"room": 7, "unkn1": 9, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 6 Exit 0", "access_rule": []}], "entity_load": [[28, 16]], "locations": ["Iceberg 6 - Enemy 2 (Nidoo)"], "music": 12}, {"name": "Iceberg 6 - 7", "level": 5, "stage": 6, "room": 7, "pointer": 3124478, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sparky"], "default_exits": [{"room": 8, "unkn1": 17, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 7 Exit 0", "access_rule": []}], "entity_load": [[8, 16]], "locations": ["Iceberg 6 - Enemy 3 (Sparky)"], "music": 12}, {"name": "Iceberg 6 - 8", "level": 5, "stage": 6, "room": 8, "pointer": 3110431, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 9, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 8 Exit 0", "access_rule": []}, {"room": 14, "unkn1": 14, "unkn2": 5, "x": 296, "y": 136, "name": "Iceberg 6 - 8 Exit 1", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 9", "level": 5, "stage": 6, "room": 9, "pointer": 3139832, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 10, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 9 Exit 0", "access_rule": []}], "entity_load": [[2, 27]], "locations": ["Iceberg 6 - Miniboss 1 (Blocky)"], "music": 12}, {"name": "Iceberg 6 - 10", "level": 5, "stage": 6, "room": 10, "pointer": 3119624, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 11, "unkn1": 7, "unkn2": 5, "x": 152, "y": 168, "name": "Iceberg 6 - 10 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 11", "level": 5, "stage": 6, "room": 11, "pointer": 3141139, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 12, "unkn1": 16, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 11 Exit 0", "access_rule": []}], "entity_load": [[3, 27]], "locations": ["Iceberg 6 - Miniboss 2 (Jumper Shoot)"], "music": 12}, {"name": "Iceberg 6 - 12", "level": 5, "stage": 6, "room": 12, "pointer": 3123788, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 13, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 12 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 13", "level": 5, "stage": 6, "room": 13, "pointer": 3143741, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 14, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 13 Exit 0", "access_rule": []}], "entity_load": [[1, 27]], "locations": ["Iceberg 6 - Miniboss 3 (Yuki)"], "music": 12}, {"name": "Iceberg 6 - 14", "level": 5, "stage": 6, "room": 14, "pointer": 3120319, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 15, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 14 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 15", "level": 5, "stage": 6, "room": 15, "pointer": 3135238, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": ["Sir Kibble"], "default_exits": [{"room": 16, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 15 Exit 0", "access_rule": []}], "entity_load": [[27, 16]], "locations": ["Iceberg 6 - Enemy 4 (Sir Kibble)"], "music": 12}, {"name": "Iceberg 6 - 16", "level": 5, "stage": 6, "room": 16, "pointer": 3123096, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 17, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 16 Exit 0", "access_rule": []}], "entity_load": [[4, 22], [33, 19]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 17", "level": 5, "stage": 6, "room": 17, "pointer": 3144389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 18, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 17 Exit 0", "access_rule": []}], "entity_load": [[5, 27]], "locations": ["Iceberg 6 - Miniboss 4 (Haboki)"], "music": 12}, {"name": "Iceberg 6 - 18", "level": 5, "stage": 6, "room": 18, "pointer": 3121014, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 19, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 18 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 19", "level": 5, "stage": 6, "room": 19, "pointer": 3017228, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 20, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 19 Exit 0", "access_rule": []}], "entity_load": [[4, 27]], "locations": ["Iceberg 6 - Miniboss 5 (Boboo)"], "music": 12}, {"name": "Iceberg 6 - 20", "level": 5, "stage": 6, "room": 20, "pointer": 3121709, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 21, "unkn1": 7, "unkn2": 5, "x": 136, "y": 168, "name": "Iceberg 6 - 20 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 21", "level": 5, "stage": 6, "room": 21, "pointer": 3145036, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 22, "unkn1": 15, "unkn2": 10, "x": 296, "y": 136, "name": "Iceberg 6 - 21 Exit 0", "access_rule": []}], "entity_load": [[0, 27]], "locations": ["Iceberg 6 - Miniboss 6 (Captain Stitch)"], "music": 12}, {"name": "Iceberg 6 - 22", "level": 5, "stage": 6, "room": 22, "pointer": 3116830, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 23, "unkn1": 7, "unkn2": 5, "x": 136, "y": 152, "name": "Iceberg 6 - 22 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [4, 22]], "locations": [], "music": 12}, {"name": "Iceberg 6 - 23", "level": 5, "stage": 6, "room": 23, "pointer": 3045263, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [{"room": 24, "unkn1": 17, "unkn2": 9, "x": 72, "y": 120, "name": "Iceberg 6 - 23 Exit 0", "access_rule": []}], "entity_load": [[33, 19], [42, 19]], "locations": ["Iceberg 6 - Angel"], "music": 8}, {"name": "Iceberg 6 - 24", "level": 5, "stage": 6, "room": 24, "pointer": 2889389, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[38, 19]], "locations": ["Iceberg 6 - Complete"], "music": 5}, {"name": "Iceberg Boss - 0", "level": 5, "stage": 7, "room": 0, "pointer": 2980207, "animal_pointers": [], "consumables": [], "consumables_pointer": 0, "enemies": [], "default_exits": [], "entity_load": [[8, 18]], "locations": ["Iceberg - Boss (Dedede) Purified", "Level 5 Boss - Defeated", "Level 5 Boss - Purified"], "music": 7}] \ No newline at end of file From 9ccd420c877a06f1ff6c6c78f915880194278218 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 21 Feb 2024 00:50:08 -0600 Subject: [PATCH 156/165] update to gifting API version 2 --- worlds/kdl3/Client.py | 8 ++-- worlds/kdl3/Gifting.py | 87 +++++++++++++++++------------------------- 2 files changed, 38 insertions(+), 57 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 9b249e5bcafd..63a6e82b4d38 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -175,7 +175,7 @@ async def pop_gift(self, ctx): if "Candy" in traits or "Invincible" in traits: # apply invincibility candy self.item_queue.append(0x43) - elif "Tomato" in traits or "tomato" in gift["Name"].lower(): + elif "Tomato" in traits or "tomato" in gift["ItemName"].lower(): # apply maxim tomato # only want tomatos here, no other vegetable is that good self.item_queue.append(0x42) @@ -183,7 +183,7 @@ async def pop_gift(self, ctx): # Apply 1-Up self.item_queue.append(0x41) elif "Currency" in traits or "Star" in traits: - value = gift["Item"]["Value"] + value = gift["ItemValue"] if value >= 50000: self.item_queue.append(0x46) elif value >= 30000: @@ -247,8 +247,7 @@ async def pick_gift_recipient(self, ctx, gift): "Receiver": ctx.player_names[most_applicable_slot], "SenderTeam": ctx.team, "ReceiverTeam": ctx.team, # for the moment - "IsRefund": False, - "GiftValue": gift_base["Item"]["Value"] * gift_base["Item"]["Amount"] + "IsRefund": False } # print(item) await update_object(ctx, f"Giftbox;{ctx.team};{most_applicable_slot}", { @@ -274,6 +273,7 @@ async def game_watcher(self, ctx) -> None: self.motherbox_key = f"Giftboxes;{ctx.team}" enable_gifting = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x01) await initialize_giftboxes(ctx, self.giftbox_key, self.motherbox_key, bool(enable_gifting[0])) + self.initialize_gifting = True # can't check debug anymore, without going and copying the value. might be important later. if self.levels is None: self.levels = dict() diff --git a/worlds/kdl3/Gifting.py b/worlds/kdl3/Gifting.py index a1c7dd238580..8ccba7ec1ae6 100644 --- a/worlds/kdl3/Gifting.py +++ b/worlds/kdl3/Gifting.py @@ -33,10 +33,10 @@ async def pop_object(ctx, key: str, value: str): async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_open: bool): ctx.set_notify(motherbox_key, giftbox_key) await update_object(ctx, f"Giftboxes;{ctx.team}", {f"{ctx.slot}": - { + { "IsOpen": is_open, **kdl3_gifting_options - }}) + }}) ctx.gifting = is_open @@ -46,16 +46,15 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope "Consumable", "Food", "Drink", "Candy", "Tomato", "Invincible", "Life", "Heal", "Health", "Trap", "Goo", "Gel", "Slow", "Slowness", "Eject", "Removal" - ] + ], + "MinimumGiftVersion": 2, } kdl3_gifts = { 1: { - "Item": { - "Name": "1-Up", - "Amount": 1, - "Value": 400000 - }, + "ItemName": "1-Up", + "Amount": 1, + "ItemValue": 400000, "Traits": [ { "Trait": "Consumable", @@ -70,11 +69,9 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope ] }, 2: { - "Item": { - "Name": "Maxim Tomato", - "Amount": 1, - "Value": 500000 - }, + "ItemName": "Maxim Tomato", + "Amount": 1, + "ItemValue": 500000, "Traits": [ { "Trait": "Consumable", @@ -104,11 +101,9 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope ] }, 3: { - "Item": { - "Name": "Energy Drink", - "Amount": 1, - "Value": 100000 - }, + "ItemName": "Energy Drink", + "Amount": 1, + "ItemValue": 100000, "Traits": [ { "Trait": "Consumable", @@ -128,11 +123,9 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope ] }, 5: { - "Item": { - "Name": "Small Star Piece", - "Amount": 1, - "Value": 10000 - }, + "ItemName": "Small Star Piece", + "Amount": 1, + "ItemValue": 10000, "Traits": [ { "Trait": "Currency", @@ -152,11 +145,9 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope ] }, 6: { - "Item": { - "Name": "Medium Star Piece", - "Amount": 1, - "Value": 30000 - }, + "ItemName": "Medium Star Piece", + "Amount": 1, + "ItemValue": 30000, "Traits": [ { "Trait": "Currency", @@ -176,11 +167,9 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope ] }, 7: { - "Item": { - "Name": "Large Star Piece", - "Amount": 1, - "Value": 50000 - }, + "ItemName": "Large Star Piece", + "Amount": 1, + "ItemValue": 50000, "Traits": [ { "Trait": "Currency", @@ -203,11 +192,9 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope kdl3_trap_gifts = { 0: { - "Item": { - "Name": "Gooey Bag", - "Amount": 1, - "Value": 10000 - }, + "ItemName": "Gooey Bag", + "Amount": 1, + "ItemValue": 10000, "Traits": [ { "Trait": "Trap", @@ -227,11 +214,9 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope ] }, 1: { - "Item": { - "Name": "Slowness", - "Amount": 1, - "Value": 10000 - }, + "ItemName": "Slowness", + "Amount": 1, + "ItemValue": 10000, "Traits": [ { "Trait": "Trap", @@ -251,11 +236,9 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope ] }, 2: { - "Item": { - "Name": "Eject Ability", - "Amount": 1, - "Value": 10000 - }, + "ItemName": "Eject Ability", + "Amount": 1, + "ItemValue": 10000, "Traits": [ { "Trait": "Trap", @@ -275,11 +258,9 @@ async def initialize_giftboxes(ctx, giftbox_key: str, motherbox_key: str, is_ope ] }, 3: { - "Item": { - "Name": "Bad Meal", - "Amount": 1, - "Value": 10000 - }, + "ItemName": "Bad Meal", + "Amount": 1, + "ItemValue": 10000, "Traits": [ { "Trait": "Trap", From 6fb82588c55beb0a42cf9acbef568ceb72872451 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Wed, 21 Feb 2024 01:08:00 -0600 Subject: [PATCH 157/165] world cleanup --- worlds/kdl3/Client.py | 6 +-- worlds/kdl3/ClientAddrs.py | 2 +- worlds/kdl3/Compression.py | 18 ++++---- worlds/kdl3/Options.py | 4 +- worlds/kdl3/Regions.py | 8 ++-- worlds/kdl3/Rom.py | 90 +++++++++++++++++++------------------- worlds/kdl3/Room.py | 3 +- worlds/kdl3/__init__.py | 7 +-- 8 files changed, 67 insertions(+), 71 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 63a6e82b4d38..9603a8b5687c 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -239,10 +239,10 @@ async def pick_gift_recipient(self, ctx, gift): # only send to ourselves if no one else will take it most_applicable_slot = int(slot) # print(most_applicable, most_applicable_slot) - UUID = uuid.uuid4().hex + item_uuid = uuid.uuid4().hex item = { **gift_base, - "ID": UUID, + "ID": item_uuid, "Sender": ctx.player_names[ctx.slot], "Receiver": ctx.player_names[most_applicable_slot], "SenderTeam": ctx.team, @@ -251,7 +251,7 @@ async def pick_gift_recipient(self, ctx, gift): } # print(item) await update_object(ctx, f"Giftbox;{ctx.team};{most_applicable_slot}", { - UUID: item, + item_uuid: item, }) async def game_watcher(self, ctx) -> None: diff --git a/worlds/kdl3/ClientAddrs.py b/worlds/kdl3/ClientAddrs.py index af5fd8b33a8c..1f5475741b3b 100644 --- a/worlds/kdl3/ClientAddrs.py +++ b/worlds/kdl3/ClientAddrs.py @@ -813,4 +813,4 @@ 0x7706fd: 1831, 0x7706fe: 1832, 0x7706ff: 1858, -} \ No newline at end of file +} diff --git a/worlds/kdl3/Compression.py b/worlds/kdl3/Compression.py index 04dc2c1d697d..ec5461fbec75 100644 --- a/worlds/kdl3/Compression.py +++ b/worlds/kdl3/Compression.py @@ -5,23 +5,23 @@ def hal_decompress(comp: bytes) -> bytes: """ inpos = 0 - input = 0 + inval = 0 output = bytearray() - while input != 0xFF: + while inval != 0xFF: remaining = 65536 - inpos if remaining < 1: return bytes() - input = comp[inpos] + inval = comp[inpos] inpos += 1 - if input == 0xFF: + if inval == 0xFF: break - if (input & 0xE0) == 0xE0: - command = (input >> 2) & 0x07 - length = (((input & 0x03) << 8) | comp[inpos]) + 1 + if (inval & 0xE0) == 0xE0: + command = (inval >> 2) & 0x07 + length = (((inval & 0x03) << 8) | comp[inpos]) + 1 inpos += 1 else: - command = input >> 5 - length = (input & 0x1F) + 1 + command = inval >> 5 + length = (inval & 0x1F) + 1 if (command == 2 and ((len(output) + 2*length) > 65536)) or (len(output) + length) > 65536: return bytes() if command == 0: diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index cae8eea1ac3f..3f66dfaa29ff 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -1,9 +1,8 @@ import random from dataclasses import dataclass -from Options import Option, DeathLink, Choice, Toggle, OptionDict, Range, PlandoBosses, DefaultOnToggle, \ +from Options import DeathLink, Choice, Toggle, OptionDict, Range, PlandoBosses, DefaultOnToggle, \ PerGameCommonOptions -import typing from .Names import LocationName @@ -399,6 +398,7 @@ class Gifting(Toggle): """ display_name = "Gifting" + @dataclass class KDL3Options(PerGameCommonOptions): death_link: DeathLink diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index ea46b06c4908..a2d0e66186dd 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -1,4 +1,4 @@ -import json +import orjson import os import typing from pkgutil import get_data @@ -22,6 +22,7 @@ } first_stage_blacklist = { + # We want to confirm that the first stage can be completed without any items 0x77000B, # 2-5 needs Kine 0x770011, # 3-5 needs Cutter 0x77001C, # 5-4 needs Burning @@ -38,7 +39,7 @@ def generate_valid_level(level, stage, possible_stages, slot_random): def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing.Dict[int, Region]): level_names = {LocationName.level_names[level]: level for level in LocationName.level_names} - room_data = json.loads(get_data(__name__, os.path.join("data", "Rooms.json"))) + room_data = orjson.loads(get_data(__name__, os.path.join("data", "Rooms.json"))) rooms: typing.Dict[str, KDL3Room] = dict() for room_entry in room_data: room = KDL3Room(room_entry["name"], world.player, world.multiworld, None, room_entry["level"], @@ -48,7 +49,8 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else None for location in room_entry["locations"] if (not any([x in location for x in ["1-Up", "Maxim"]]) or - world.options.consumables.value) and (not "Star" in location or world.options.starsanity.value)}, + world.options.consumables.value) and ("Star" not in location + or world.options.starsanity.value)}, KDL3Location) rooms[room.name] = room for location in room.locations: diff --git a/worlds/kdl3/Rom.py b/worlds/kdl3/Rom.py index 991f264f1cdb..5a846ab8be5e 100644 --- a/worlds/kdl3/Rom.py +++ b/worlds/kdl3/Rom.py @@ -1,15 +1,13 @@ import typing from pkgutil import get_data -from random import Random import Utils -from typing import Optional, Dict, List, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING import hashlib import os import struct import settings -from BaseClasses import MultiWorld from worlds.Files import APDeltaPatch from .Aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette, gooey_target_palettes, \ get_gooey_palette @@ -335,7 +333,7 @@ def write_heart_star_sprites(rom: RomData): rom.write_bytes(0x3F0EBF, [0x00, 0xD0, 0x39]) -def write_consumable_sprites(rom: RomData, consumables, stars): +def write_consumable_sprites(rom: RomData, consumables: bool, stars: bool): compressed = rom.read_bytes(consumable_address, consumable_size) decompressed = hal_decompress(compressed) patched = bytearray(decompressed) @@ -385,9 +383,7 @@ def patch(self, target: str): rom.write_to_file(target) -def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomData, heart_stars_required: int, - boss_requirements: Dict[int, int], shuffled_levels: Dict[int, List[int]], bb_boss_enabled: List[bool], - copy_abilities: Dict[str, str], slot_random: Random): +def patch_rom(world: "KDL3World", rom: RomData): rom.apply_patch(get_data(__name__, os.path.join("data", "kdl3_basepatch.bsdiff4"))) tiles = get_data(__name__, os.path.join("data", "APPauseIcons.dat")) rom.write_bytes(0x3F000, tiles) @@ -417,12 +413,12 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD if world.options.music_shuffle > 0: if world.options.music_shuffle == 1: shuffled_music = music_choices.copy() - slot_random.shuffle(shuffled_music) + world.random.shuffle(shuffled_music) music_map = dict(zip(music_choices, shuffled_music)) # Avoid putting star twinkle in the pool - music_map[5] = slot_random.choice(music_choices) + music_map[5] = world.random.choice(music_choices) # Heart Star music doesn't work on regular stages - music_map[8] = slot_random.choice(music_choices) + music_map[8] = world.random.choice(music_choices) for room in rooms: room.music = music_map[room.music] for room in room_pointers: @@ -439,17 +435,17 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD rom.write_byte(0x4A38D, music_map[0x1D]) elif world.options.music_shuffle == 2: for room in rooms: - room.music = slot_random.choice(music_choices) + room.music = world.random.choice(music_choices) for room in room_pointers: - rom.write_byte(room + 2, slot_random.choice(music_choices)) + rom.write_byte(room + 2, world.random.choice(music_choices)) for i in range(5): # level themes - rom.write_byte(0x133F2 + i, slot_random.choice(music_choices)) + rom.write_byte(0x133F2 + i, world.random.choice(music_choices)) # Zero - rom.write_byte(0x9AE79, slot_random.choice(music_choices)) + rom.write_byte(0x9AE79, world.random.choice(music_choices)) # Heart Star success and fail - rom.write_byte(0x4A388, slot_random.choice(music_choices)) - rom.write_byte(0x4A38D, slot_random.choice(music_choices)) + rom.write_byte(0x4A388, world.random.choice(music_choices)) + rom.write_byte(0x4A38D, world.random.choice(music_choices)) for room in rooms: room.patch(rom) @@ -469,9 +465,10 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD rom.write_bytes(0x2C8217, [0xFF, 0x1E, ]) # boss requirements - rom.write_bytes(0x3D000, struct.pack("HHHHH", boss_requirements[0], boss_requirements[1], boss_requirements[2], - boss_requirements[3], boss_requirements[4])) - rom.write_bytes(0x3D00A, struct.pack("H", heart_stars_required if world.options.goal_speed == 1 else 0xFFFF)) + rom.write_bytes(0x3D000, struct.pack("HHHHH", world.boss_requirements[0], world.boss_requirements[1], + world.boss_requirements[2], world.boss_requirements[3], + world.boss_requirements[4])) + rom.write_bytes(0x3D00A, struct.pack("H", world.required_heart_stars if world.options.goal_speed == 1 else 0xFFFF)) rom.write_byte(0x3D00C, world.options.goal_speed.value) rom.write_byte(0x3D00E, world.options.open_world.value) rom.write_byte(0x3D010, world.options.death_link.value) @@ -484,59 +481,60 @@ def patch_rom(world: "KDL3World", multiworld: MultiWorld, player: int, rom: RomD rom.write_byte(0x3D01E, world.options.strict_bosses.value) # don't write gifting for solo game, since there's no one to send anything to - for level in shuffled_levels: - for i in range(len(shuffled_levels[level])): + for level in world.player_levels: + for i in range(len(world.player_levels[level])): rom.write_bytes(0x3F002E + ((level - 1) * 14) + (i * 2), - struct.pack("H", level_pointers[shuffled_levels[level][i]])) + struct.pack("H", level_pointers[world.player_levels[level][i]])) rom.write_bytes(0x3D020 + (level - 1) * 14 + (i * 2), - struct.pack("H", shuffled_levels[level][i] & 0x00FFFF)) + struct.pack("H", world.player_levels[level][i] & 0x00FFFF)) if (i == 0) or (i > 0 and i % 6 != 0): rom.write_bytes(0x3D080 + (level - 1) * 12 + (i * 2), - struct.pack("H", (shuffled_levels[level][i] & 0x00FFFF) % 6)) + struct.pack("H", (world.player_levels[level][i] & 0x00FFFF) % 6)) for i in range(6): - if bb_boss_enabled[i]: + if world.boss_butch_bosses[i]: rom.write_bytes(0x3F0000 + (level_pointers[0x770200 + i]), struct.pack("I", bb_bosses[0x770200 + i])) # copy ability shuffle if world.options.copy_ability_randomization.value > 0: - for enemy in copy_abilities: + for enemy in world.copy_abilities: if enemy in miniboss_remap: rom.write_bytes(0xB417E + (miniboss_remap[enemy] << 1), - struct.pack("H", ability_remap[copy_abilities[enemy]])) + struct.pack("H", ability_remap[world.copy_abilities[enemy]])) else: rom.write_bytes(0xB3CAC + (enemy_remap[enemy] << 1), - struct.pack("H", ability_remap[copy_abilities[enemy]])) + struct.pack("H", ability_remap[world.copy_abilities[enemy]])) # following only needs done on non-door rando # incredibly lucky this follows the same order (including 5E == star block) - rom.write_byte(0x2F77EA, 0x5E + (ability_remap[copy_abilities["Sparky"]] << 1)) - rom.write_byte(0x2F7811, 0x5E + (ability_remap[copy_abilities["Sparky"]] << 1)) - rom.write_byte(0x2F9BC4, 0x5E + (ability_remap[copy_abilities["Blocky"]] << 1)) - rom.write_byte(0x2F9BEB, 0x5E + (ability_remap[copy_abilities["Blocky"]] << 1)) - rom.write_byte(0x2FAC06, 0x5E + (ability_remap[copy_abilities["Jumper Shoot"]] << 1)) - rom.write_byte(0x2FAC2D, 0x5E + (ability_remap[copy_abilities["Jumper Shoot"]] << 1)) - rom.write_byte(0x2F9E7B, 0x5E + (ability_remap[copy_abilities["Yuki"]] << 1)) - rom.write_byte(0x2F9EA2, 0x5E + (ability_remap[copy_abilities["Yuki"]] << 1)) - rom.write_byte(0x2FA951, 0x5E + (ability_remap[copy_abilities["Sir Kibble"]] << 1)) - rom.write_byte(0x2FA978, 0x5E + (ability_remap[copy_abilities["Sir Kibble"]] << 1)) - rom.write_byte(0x2FA132, 0x5E + (ability_remap[copy_abilities["Haboki"]] << 1)) - rom.write_byte(0x2FA159, 0x5E + (ability_remap[copy_abilities["Haboki"]] << 1)) - rom.write_byte(0x2FA3E8, 0x5E + (ability_remap[copy_abilities["Boboo"]] << 1)) - rom.write_byte(0x2FA40F, 0x5E + (ability_remap[copy_abilities["Boboo"]] << 1)) - rom.write_byte(0x2F90E2, 0x5E + (ability_remap[copy_abilities["Captain Stitch"]] << 1)) - rom.write_byte(0x2F9109, 0x5E + (ability_remap[copy_abilities["Captain Stitch"]] << 1)) + rom.write_byte(0x2F77EA, 0x5E + (ability_remap[world.copy_abilities["Sparky"]] << 1)) + rom.write_byte(0x2F7811, 0x5E + (ability_remap[world.copy_abilities["Sparky"]] << 1)) + rom.write_byte(0x2F9BC4, 0x5E + (ability_remap[world.copy_abilities["Blocky"]] << 1)) + rom.write_byte(0x2F9BEB, 0x5E + (ability_remap[world.copy_abilities["Blocky"]] << 1)) + rom.write_byte(0x2FAC06, 0x5E + (ability_remap[world.copy_abilities["Jumper Shoot"]] << 1)) + rom.write_byte(0x2FAC2D, 0x5E + (ability_remap[world.copy_abilities["Jumper Shoot"]] << 1)) + rom.write_byte(0x2F9E7B, 0x5E + (ability_remap[world.copy_abilities["Yuki"]] << 1)) + rom.write_byte(0x2F9EA2, 0x5E + (ability_remap[world.copy_abilities["Yuki"]] << 1)) + rom.write_byte(0x2FA951, 0x5E + (ability_remap[world.copy_abilities["Sir Kibble"]] << 1)) + rom.write_byte(0x2FA978, 0x5E + (ability_remap[world.copy_abilities["Sir Kibble"]] << 1)) + rom.write_byte(0x2FA132, 0x5E + (ability_remap[world.copy_abilities["Haboki"]] << 1)) + rom.write_byte(0x2FA159, 0x5E + (ability_remap[world.copy_abilities["Haboki"]] << 1)) + rom.write_byte(0x2FA3E8, 0x5E + (ability_remap[world.copy_abilities["Boboo"]] << 1)) + rom.write_byte(0x2FA40F, 0x5E + (ability_remap[world.copy_abilities["Boboo"]] << 1)) + rom.write_byte(0x2F90E2, 0x5E + (ability_remap[world.copy_abilities["Captain Stitch"]] << 1)) + rom.write_byte(0x2F9109, 0x5E + (ability_remap[world.copy_abilities["Captain Stitch"]] << 1)) if world.options.copy_ability_randomization == 2: for enemy in enemy_remap: # we just won't include it for minibosses - rom.write_bytes(0xB3E40 + (enemy_remap[enemy] << 1), struct.pack("h", slot_random.randint(-1, 2))) + rom.write_bytes(0xB3E40 + (enemy_remap[enemy] << 1), struct.pack("h", world.random.randint(-1, 2))) # write jumping goal rom.write_bytes(0x94F8, struct.pack("H", world.options.jumping_target)) rom.write_bytes(0x944E, struct.pack("H", world.options.jumping_target)) from Utils import __version__ - rom.name = bytearray(f'KDL3{__version__.replace(".", "")[0:3]}_{player}_{multiworld.seed:11}\0', 'utf8')[:21] + rom.name = bytearray( + f'KDL3{__version__.replace(".", "")[0:3]}_{world.player}_{world.multiworld.seed:11}\0', 'utf8')[:21] rom.name.extend([0] * (21 - len(rom.name))) rom.write_bytes(0x3C000, rom.name) rom.write_byte(0x3C020, world.options.game_language.value) diff --git a/worlds/kdl3/Room.py b/worlds/kdl3/Room.py index 43ffe675d3a8..256955b924ab 100644 --- a/worlds/kdl3/Room.py +++ b/worlds/kdl3/Room.py @@ -80,7 +80,8 @@ def patch(self, rom: "RomData"): self.entity_load.append([2, 22]) if load_len < len(self.entity_load): rom.write_bytes(self.pointer + 88 + (load_len * 2), bytes(self.entity_load[load_len])) - rom.write_bytes(self.pointer + 104 + (load_len * 2), bytes(struct.pack("H", self.consumable_pointer))) + rom.write_bytes(self.pointer + 104 + (load_len * 2), + bytes(struct.pack("H", self.consumable_pointer))) if is_progression: if [1, 22] in self.entity_load: vtype = 1 diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index ad3120e29d33..9e717e744f61 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -268,12 +268,7 @@ def generate_output(self, output_directory: str): player = self.player rom = RomData(get_base_rom_path()) - patch_rom(self, self.multiworld, self.player, rom, self.required_heart_stars, - self.boss_requirements, - self.player_levels, - self.boss_butch_bosses, - self.copy_abilities, - self.random) + patch_rom(self, rom) rom_path = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") rom.write_to_file(rom_path) From 54cce421e7f23993ba182883c6d8242d186caf76 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sat, 24 Feb 2024 22:00:50 -0600 Subject: [PATCH 158/165] fix rare test failure, spoiler cleanup --- worlds/kdl3/Locations.py | 2 + worlds/kdl3/Regions.py | 12 +++-- worlds/kdl3/__init__.py | 47 +++++++++++++++++--- worlds/kdl3/test/TestShuffles.py | 75 ++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 9 deletions(-) diff --git a/worlds/kdl3/Locations.py b/worlds/kdl3/Locations.py index ec0a636b3ec2..f4a993bda13a 100644 --- a/worlds/kdl3/Locations.py +++ b/worlds/kdl3/Locations.py @@ -13,6 +13,8 @@ class KDL3Location(Location): def __init__(self, player: int, name: str, address: typing.Optional[int], parent: typing.Union[Region, None]): super().__init__(player, name, address, parent) self.event = not address + if self.event: + self.show_in_spoiler = False stage_locations = { diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index a2d0e66186dd..a7b468e24f9b 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -94,13 +94,17 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing for level in world.player_levels: for stage in range(6): proper_stage = world.player_levels[level][stage] + stage_name = world.multiworld.get_location(world.location_id_to_name[proper_stage], + world.player).name.replace(" - Complete", "") + stage_regions = [rooms[room] for room in rooms if stage_name in rooms[room].name] + for region in stage_regions: + region.level = level + region.stage = stage if world.options.open_world or stage == 0: level_regions[level].add_exits([first_rooms[proper_stage].name]) else: - previous_stage = first_rooms[world.player_levels[level][stage - 1]] - world.multiworld.get_location(f"{level_names[previous_stage.level]} {previous_stage.stage}" - f" - Complete", world.player) \ - .parent_region.add_exits([first_rooms[proper_stage].name]) + world.multiworld.get_location(world.location_id_to_name[world.player_levels[level][stage-1]], + world.player).parent_region.add_exits([first_rooms[proper_stage].name]) else: level_regions[level].add_exits([first_rooms[0x770200 + level - 1].name]) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 9e717e744f61..8bdfe4c30811 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -113,7 +113,19 @@ def get_trap_item_name(self) -> str: self.options.slow_trap_weight.value, self.options.ability_trap_weight.value])[0] - def generate_early(self) -> None: + def get_restrictive_copy_ability_placement(self, copy_ability: str, enemies_to_set: typing.List[str], + level: int, stage: int): + valid_rooms = [room for room in self.rooms if (room.level < level) + or (room.level == level and room.stage < stage)] # leave out the stage in question to avoid edge + valid_enemies = set() + for room in valid_rooms: + valid_enemies.update(room.enemies) + placed_enemies = [enemy for enemy in valid_enemies if enemy not in enemies_to_set] + if any([self.copy_abilities[enemy] == copy_ability for enemy in placed_enemies]): + return None # a valid enemy got placed by a more restrictive placement + return self.random.choice(sorted([enemy for enemy in valid_enemies if enemy not in placed_enemies])) + + def pre_fill(self) -> None: if self.options.copy_ability_randomization: # randomize copy abilities valid_abilities = list(copy_ability_access_table.keys()) @@ -132,12 +144,22 @@ def generate_early(self) -> None: chosen_ability = self.random.choice(abilities) self.copy_abilities[chosen_enemy] = chosen_ability enemies_to_set.remove(chosen_enemy) + # two less restrictive ones, we need to ensure Cutter and Burning appear before their required stages + sand_canyon_5 = next(room for room in self.rooms if room.name == "Sand Canyon 5 - 9") + cutter_enemy = self.get_restrictive_copy_ability_placement("Cutter Ability", enemies_to_set, + sand_canyon_5.level, sand_canyon_5.stage) + if cutter_enemy: + self.copy_abilities[cutter_enemy] = "Cutter Ability" + enemies_to_set.remove(cutter_enemy) + iceberg_4 = next(room for room in self.rooms if room.name == "Iceberg 4 - 7") + burning_enemy = self.get_restrictive_copy_ability_placement("Burning Ability", enemies_to_set, + iceberg_4.level, iceberg_4.stage) + if burning_enemy: + self.copy_abilities[burning_enemy] = "Burning Ability" + enemies_to_set.remove(burning_enemy) # place remaining for enemy in enemies_to_set: - self.copy_abilities[enemy] = self.random \ - .choice(valid_abilities) - - def pre_fill(self) -> None: + self.copy_abilities[enemy] = self.random.choice(valid_abilities) for enemy in enemy_mapping: self.multiworld.get_location(enemy, self.player) \ .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) @@ -299,6 +321,21 @@ def write_spoiler(self, spoiler_handle: TextIO) -> None: for level in LocationName.level_names: for stage, i in zip(self.player_levels[LocationName.level_names[level]], range(1, 7)): spoiler_handle.write(f"{level} {i}: {location_table[stage].replace(' - Complete', '')}\n") + if self.options.animal_randomization: + spoiler_handle.write(f"\nAnimal Friends ({self.multiworld.get_player_name(self.player)}):\n") + for level in self.player_levels: + for stage in range(6): + rooms = [room for room in self.rooms if room.level == level and room.stage == stage] + animals = [] + for room in rooms: + animals.extend([location.item.name.replace(" Spawn", "") + for location in room.locations if "Animal" in location.name]) + spoiler_handle.write(f"{location_table[self.player_levels[level][stage]].replace(' - Complete','')}" + f": {', '.join(animals)}\n") + if self.options.copy_ability_randomization: + spoiler_handle.write(f"\nCopy Abilities ({self.multiworld.get_player_name(self.player)}):\n") + for enemy in self.copy_abilities: + spoiler_handle.write(f"{enemy}: {self.copy_abilities[enemy].replace('No Ability', 'None').replace(' Ability', '')}\n") def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): if self.stage_shuffle_enabled: diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/TestShuffles.py index a8240ffbe7f8..2e943a70fbf4 100644 --- a/worlds/kdl3/test/TestShuffles.py +++ b/worlds/kdl3/test/TestShuffles.py @@ -40,6 +40,26 @@ def testBurning(self): self.collect_by_name(["Cutter", "Kine", "Heart Star"]) self.assertBeatable(False) + def testCutterAndBurning(self): + rooms = self.multiworld.worlds[1].rooms + copy_abilities = self.multiworld.worlds[1].copy_abilities + sand_canyon_5 = next(room for room in rooms if room.name == "Sand Canyon 5 - 9") + valid_rooms = [room for room in rooms if (room.level < sand_canyon_5.level) + or (room.level == sand_canyon_5.level and room.stage < sand_canyon_5.stage)] + for room in valid_rooms: + if any([copy_abilities[enemy] == "Cutter Ability" for enemy in room.enemies]): + break + else: + self.fail("Could not reach Cutter Ability before Sand Canyon 5!") + iceberg_4 = next(room for room in rooms if room.name == "Iceberg 4 - 7") + valid_rooms = [room for room in rooms if (room.level < iceberg_4.level) + or (room.level == iceberg_4.level and room.stage < iceberg_4.stage)] + for room in valid_rooms: + if any([copy_abilities[enemy] == "Burning Ability" for enemy in room.enemies]): + break + else: + self.fail("Could not reach Burning Ability before Iceberg 4!") + def testValidAbilitiesForROB(self): # there exists a subset of 4-7 abilities that will allow us access to ROB heart star on default settings self.collect_by_name(["Heart Star", "Kine", "Coo"]) # we will guaranteed need Coo, Kine, and Heart Stars to reach @@ -163,3 +183,58 @@ def testLockedAnimals(self): self.assertTrue(self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") self.assertTrue(self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") self.assertTrue(self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) + + def testCutterAndBurning(self): + rooms = self.multiworld.worlds[1].rooms + copy_abilities = self.multiworld.worlds[1].copy_abilities + sand_canyon_5 = next(room for room in rooms if room.name == "Sand Canyon 5 - 9") + valid_rooms = [room for room in rooms if (room.level < sand_canyon_5.level) + or (room.level == sand_canyon_5.level and room.stage < sand_canyon_5.stage)] + for room in valid_rooms: + if any([copy_abilities[enemy] == "Cutter Ability" for enemy in room.enemies]): + break + else: + self.fail("Could not reach Cutter Ability before Sand Canyon 5!") + iceberg_4 = next(room for room in rooms if room.name == "Iceberg 4 - 7") + valid_rooms = [room for room in rooms if (room.level < iceberg_4.level) + or (room.level == iceberg_4.level and room.stage < iceberg_4.stage)] + for room in valid_rooms: + if any([copy_abilities[enemy] == "Burning Ability" for enemy in room.enemies]): + break + else: + self.fail("Could not reach Burning Ability before Iceberg 4!") + + def testValidAbilitiesForROB(self): + # there exists a subset of 4-7 abilities that will allow us access to ROB heart star on default settings + self.collect_by_name(["Heart Star", "Kine", "Coo"]) # we will guaranteed need Coo, Kine, and Heart Stars to reach + # first we need to identify our bukiset requirements + groups = [ + ({"Parasol Ability", "Cutter Ability"}, {'Bukiset (Parasol)', 'Bukiset (Cutter)'}), + ({"Spark Ability", "Clean Ability"}, {'Bukiset (Spark)', 'Bukiset (Clean)'}), + ({"Ice Ability", "Needle Ability"}, {'Bukiset (Ice)', 'Bukiset (Needle)'}), + ({"Stone Ability", "Burning Ability"}, {'Bukiset (Stone)', 'Bukiset (Burning)'}), + ] + copy_abilities = self.multiworld.worlds[1].copy_abilities + required_abilities: List[Tuple[str]] = [] + for abilities, bukisets in groups: + potential_abilities: List[str] = list() + for bukiset in bukisets: + if copy_abilities[bukiset] in abilities: + potential_abilities.append(copy_abilities[bukiset]) + required_abilities.append(tuple(potential_abilities)) + collected_abilities = list() + for group in required_abilities: + self.assertFalse(len(group) == 0, str(self.multiworld.seed)) + collected_abilities.append(group[0]) + self.collect_by_name([ability.replace(" Ability", "") for ability in collected_abilities]) + if "Parasol Ability" not in collected_abilities or "Stone Ability" not in collected_abilities: + # required for non-Bukiset related portions + self.collect_by_name(["Parasol", "Stone"]) + + if "Cutter Ability" not in collected_abilities: + # we can't actually reach 3-6 without Cutter + self.assertFalse(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), str(self.multiworld.seed)) + self.collect_by_name(["Cutter"]) + + self.assertTrue(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), + ''.join(str(self.multiworld.seed)).join(collected_abilities)) \ No newline at end of file From e1e41b20d12be56214d51347cd0af14e884ec6ed Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 25 Feb 2024 13:44:33 -0600 Subject: [PATCH 159/165] fix stars not working when consumables are disabled --- worlds/kdl3/Client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index 9603a8b5687c..ec60ed4b26a6 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -285,7 +285,7 @@ async def game_watcher(self, ctx) -> None: consumables = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) self.consumables = consumables[0] == 0x01 if self.stars is None: - stars = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) + stars = await snes_read(ctx, KDL3_STARS_FLAG, 1) self.stars = stars[0] == 0x01 is_demo = await snes_read(ctx, KDL3_IS_DEMO, 1) # 1 - recording a demo, 2 - playing back recorded, 3+ is a demo From e6ea365e762f619b6e4fae4c934b70ccac335608 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 26 Feb 2024 01:01:05 -0600 Subject: [PATCH 160/165] block game watcher until slot exists, re-add plando link --- worlds/generic/docs/plando_en.md | 5 ++++- worlds/kdl3/Client.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/worlds/generic/docs/plando_en.md b/worlds/generic/docs/plando_en.md index 1348f6c72c5c..a38eed3cfa2b 100644 --- a/worlds/generic/docs/plando_en.md +++ b/worlds/generic/docs/plando_en.md @@ -162,7 +162,10 @@ into any locations within the game slots named BobsSlaytheSpire and BobsRogueLeg ## Boss Plando This is currently only supported by A Link to the Past and Kirby's Dream Land 3. Boss plando allows a player to place a -given boss within an arena. Boss plando takes in a list of instructions for placing bosses, separated by a semicolon `;`. +given boss within an arena. More specific information for boss plando in A Link to the Past can be found in +its [plando guide](/tutorial/A%20Link%20to%20the%20Past/plando/en). + +Boss plando takes in a list of instructions for placing bosses, separated by a semicolon `;`. There are three types of placement: direct, full, and shuffle. * Direct placement takes both an arena and a boss, and places the boss into that arena. * `Eastern Palace-Trinexx` diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index ec60ed4b26a6..3fef0429004d 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -266,7 +266,7 @@ async def game_watcher(self, ctx) -> None: ninten = await snes_read(ctx, KDL3_NINTEN, 6) if ninten != b"ninten": return - if not ctx.server: + if not ctx.slot: return if not self.initialize_gifting: self.giftbox_key = f"Giftbox;{ctx.team};{ctx.slot}" From 21cf675edc6c50bdcfb77201b6571cd9ef56e6fd Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 26 Feb 2024 13:21:51 -0600 Subject: [PATCH 161/165] Update worlds/kdl3/Aesthetics.py Co-authored-by: Aaron Wagener --- worlds/kdl3/Aesthetics.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index 2c6720637bed..61ec8b233c63 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -400,13 +400,9 @@ def get_kirby_palette(world): palette = world.options.kirby_flavor_preset.value - if palette in kirby_flavor_presets: - return kirby_flavor_presets[palette] - elif palette == KirbyFlavorPreset.option_custom: - return world.options.kirby_flavor.value - else: - return None - +if palette == KirbyFlavorPreset.option_custom: + return world.options.kirby_flavor.value +return kirby_flavor_presets.get(palette, None) def get_gooey_palette(world): palette = world.options.gooey_flavor_preset.value From 60ac369388ce93cb013ac4d6a358b1d30770cb58 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 26 Feb 2024 13:25:44 -0600 Subject: [PATCH 162/165] Update worlds/kdl3/Options.py Co-authored-by: Aaron Wagener --- worlds/kdl3/Options.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index 3f66dfaa29ff..a9b601a7bdd5 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -22,11 +22,9 @@ class Goal(Choice): @classmethod def get_option_name(cls, value: int) -> str: - if cls.auto_display_name and value == 2: + if value == 2: return cls.name_lookup[value].upper() - else: - return cls.name_lookup[value].title().replace("_", " ") - + return super().get_option_name(value) class GoalSpeed(Choice): """ From b64872990d6120f5b1c5cee51dcbd1ffac5182f1 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 26 Feb 2024 16:01:22 -0600 Subject: [PATCH 163/165] Apply suggestions from code review Co-authored-by: Aaron Wagener --- worlds/kdl3/Items.py | 5 ++--- worlds/kdl3/Regions.py | 13 ++++--------- worlds/kdl3/__init__.py | 6 +++--- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index 3958a93032f0..7dbdf3d9feef 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -98,8 +98,7 @@ class KDL3Item(Item): } item_names = { - "Copy Ability": {name for name in copy_ability_table.keys()}, - "Animal Friend": {name for name in animal_friend_table.keys()} -} + "Copy Ability": set(copy_ability_table), + "Animal Friend": set(animal_friend_table), lookup_name_to_id: typing.Dict[str, int] = {item_name: data.code for item_name, data in item_table.items() if data.code} diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index a7b468e24f9b..ce1588a11182 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -58,7 +58,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing add_item_rule(location, lambda item: item.name in { "Rick Spawn", "Kine Spawn", "Coo Spawn", "Nago Spawn", "ChuChu Spawn", "Pitch Spawn" }) - world.rooms = [rooms[room] for room in rooms] + world.rooms = list(rooms.values()) world.multiworld.regions.extend(world.rooms) first_rooms: typing.Dict[int, KDL3Room] = dict() @@ -70,8 +70,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing raise NotImplementedError() else: - for name in rooms: - room = rooms[name] + for name, room in rooms.items(): if room.room == 0: if room.stage == 7: first_rooms[0x770200 + room.level - 1] = room @@ -87,7 +86,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing exits ) if world.options.open_world: - if any(["Complete" in location.name for location in room.locations]): + if any("Complete" in location.name for location in room.locations): room.add_locations({f"{level_names[room.level]} {room.stage} - Stage Completion": None}, KDL3Location) @@ -118,11 +117,7 @@ def generate_valid_levels(world: "KDL3World", enforce_world: bool, enforce_patte 5: [None for _ in range(7)] } - possible_stages = list() - for level in default_levels: - for stage in range(6): - possible_stages.append(default_levels[level][stage]) - + possible_stages = [default_levels[level][stage] for level in default_levels for stage in range(6)] if world.multiworld.plando_connections[world.player]: for connection in world.multiworld.plando_connections[world.player]: try: diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 8bdfe4c30811..e9f588bb73d1 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -145,7 +145,7 @@ def pre_fill(self) -> None: self.copy_abilities[chosen_enemy] = chosen_ability enemies_to_set.remove(chosen_enemy) # two less restrictive ones, we need to ensure Cutter and Burning appear before their required stages - sand_canyon_5 = next(room for room in self.rooms if room.name == "Sand Canyon 5 - 9") + sand_canyon_5 = self.get_region("Sand Canyon 5 - 9") cutter_enemy = self.get_restrictive_copy_ability_placement("Cutter Ability", enemies_to_set, sand_canyon_5.level, sand_canyon_5.stage) if cutter_enemy: @@ -215,8 +215,8 @@ def create_items(self) -> None: weights=list(star_item_weights.values()))[0]) for _ in range(767)]) total_heart_stars = self.options.total_heart_stars - required_heart_stars = max(math.floor(total_heart_stars * required_percentage), - 5) # ensure at least 1 heart star required per world + # ensure at least 1 heart star required per world + required_heart_stars = max(int(total_heart_stars * required_percentage), 5) filler_items = total_heart_stars - required_heart_stars filler_amount = math.floor(filler_items * (self.options.filler_percentage / 100.0)) trap_amount = math.floor(filler_amount * (self.options.trap_percentage / 100.0)) From 834b09811ab6142bc95fa493b3453d402ce6deed Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 26 Feb 2024 16:05:46 -0600 Subject: [PATCH 164/165] further changes from code review --- worlds/generic/docs/plando_en.md | 4 - worlds/kdl3/Aesthetics.py | 14 +- worlds/kdl3/Locations.py | 3 +- worlds/kdl3/Options.py | 1 + worlds/kdl3/Presets.py | 2 +- worlds/kdl3/Regions.py | 19 ++- worlds/kdl3/Rules.py | 147 +++++++++--------- worlds/kdl3/__init__.py | 34 ++-- .../kdl3/test/{TestGoal.py => test_goal.py} | 10 +- .../{TestLocations.py => test_locations.py} | 4 +- .../{TestShuffles.py => test_shuffles.py} | 59 +++---- 11 files changed, 147 insertions(+), 150 deletions(-) rename worlds/kdl3/test/{TestGoal.py => test_goal.py} (94%) rename worlds/kdl3/test/{TestLocations.py => test_locations.py} (98%) rename worlds/kdl3/test/{TestShuffles.py => test_shuffles.py} (87%) diff --git a/worlds/generic/docs/plando_en.md b/worlds/generic/docs/plando_en.md index a38eed3cfa2b..d6a09cf4e610 100644 --- a/worlds/generic/docs/plando_en.md +++ b/worlds/generic/docs/plando_en.md @@ -183,10 +183,6 @@ A Link to the Past: Turtle Rock-Trinexx;basic: 1 # Place as many Arrghus as possible, then let the rest be random Arrghus;chaos: 1 - # Ensure that GT bottom is Kholdstare, then place Trinexx - # into as many arenas as possible, then fill the rest with Kholdstare - # Any remaining arenas will have their vanilla bosses placed - Ganons Tower Bottom-Kholdstare;Trinexx;Kholdstare: 1 Kirby's Dream Land 3: boss_shuffle: diff --git a/worlds/kdl3/Aesthetics.py b/worlds/kdl3/Aesthetics.py index 61ec8b233c63..8c7363908f52 100644 --- a/worlds/kdl3/Aesthetics.py +++ b/worlds/kdl3/Aesthetics.py @@ -400,18 +400,16 @@ def get_kirby_palette(world): palette = world.options.kirby_flavor_preset.value -if palette == KirbyFlavorPreset.option_custom: - return world.options.kirby_flavor.value -return kirby_flavor_presets.get(palette, None) + if palette == KirbyFlavorPreset.option_custom: + return world.options.kirby_flavor.value + return kirby_flavor_presets.get(palette, None) + def get_gooey_palette(world): palette = world.options.gooey_flavor_preset.value - if palette in gooey_flavor_presets: - return gooey_flavor_presets[palette] - elif palette == GooeyFlavorPreset.option_custom: + if palette == GooeyFlavorPreset.option_custom: return world.options.gooey_flavor.value - else: - return None + return gooey_flavor_presets.get(palette, None) def rgb888_to_bgr555(red, green, blue) -> bytes: diff --git a/worlds/kdl3/Locations.py b/worlds/kdl3/Locations.py index f4a993bda13a..4d039a13497c 100644 --- a/worlds/kdl3/Locations.py +++ b/worlds/kdl3/Locations.py @@ -12,8 +12,7 @@ class KDL3Location(Location): def __init__(self, player: int, name: str, address: typing.Optional[int], parent: typing.Union[Region, None]): super().__init__(player, name, address, parent) - self.event = not address - if self.event: + if not address: self.show_in_spoiler = False diff --git a/worlds/kdl3/Options.py b/worlds/kdl3/Options.py index a9b601a7bdd5..336bd33bc583 100644 --- a/worlds/kdl3/Options.py +++ b/worlds/kdl3/Options.py @@ -279,6 +279,7 @@ class KirbyFlavorPreset(Choice): @classmethod def from_text(cls, text: str) -> Choice: + text = text.lower() if text == "random": choice_list = list(cls.name_lookup) choice_list.remove(14) diff --git a/worlds/kdl3/Presets.py b/worlds/kdl3/Presets.py index 9ed5e241a5f8..d3a7146ded5f 100644 --- a/worlds/kdl3/Presets.py +++ b/worlds/kdl3/Presets.py @@ -52,5 +52,5 @@ kdl3_options_presets: Dict[str, Dict[str, Any]] = { "All Random": all_random, - "Beginner": beginner + "Beginner": beginner, } diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index ce1588a11182..ed0d86586615 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -48,7 +48,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing room_entry["entity_load"], room_entry["consumables"], room_entry["consumables_pointer"]) room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else None for location in room_entry["locations"] - if (not any([x in location for x in ["1-Up", "Maxim"]]) or + if (not any(x in location for x in ["1-Up", "Maxim"]) or world.options.consumables.value) and ("Star" not in location or world.options.starsanity.value)}, KDL3Location) @@ -104,17 +104,16 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing else: world.multiworld.get_location(world.location_id_to_name[world.player_levels[level][stage-1]], world.player).parent_region.add_exits([first_rooms[proper_stage].name]) - else: - level_regions[level].add_exits([first_rooms[0x770200 + level - 1].name]) + level_regions[level].add_exits([first_rooms[0x770200 + level - 1].name]) def generate_valid_levels(world: "KDL3World", enforce_world: bool, enforce_pattern: bool) -> dict: levels: typing.Dict[int, typing.List[typing.Optional[int]]] = { - 1: [None for _ in range(7)], - 2: [None for _ in range(7)], - 3: [None for _ in range(7)], - 4: [None for _ in range(7)], - 5: [None for _ in range(7)] + 1: [None] * 7, + 2: [None] * 7, + 3: [None] * 7, + 4: [None] * 7, + 5: [None] * 7, } possible_stages = [default_levels[level][stage] for level in default_levels for stage in range(6)] @@ -171,10 +170,10 @@ def generate_valid_levels(world: "KDL3World", enforce_world: bool, enforce_patte plando_bosses.append(LocationName.boss_names[option]) if boss_shuffle > 0: - if boss_shuffle == 2: + if boss_shuffle == BossShuffle.option_full: possible_bosses = [default_levels[world.random.randint(1, 5)][6] for _ in range(5 - len(plando_bosses))] - elif boss_shuffle == 3: + elif boss_shuffle == BossShuffle.option_singularity: boss = world.random.randint(1, 5) possible_bosses = [default_levels[boss][6] for _ in range(5 - len(plando_bosses))] else: diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 36e0824c07cd..81ad8f1f1fc0 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -1,6 +1,7 @@ from worlds.generic.Rules import set_rule, add_rule from .Names import LocationName, EnemyAbilities from .Locations import location_table +from .Options import GoalSpeed import typing if typing.TYPE_CHECKING: @@ -111,186 +112,186 @@ def can_fix_angel_wings(state: "CollectionState", player: int, copy_abilities: t def set_rules(world: "KDL3World") -> None: # Level 1 - add_rule(world.multiworld.get_location(LocationName.grass_land_muchi, world.player), + set_rule(world.multiworld.get_location(LocationName.grass_land_muchi, world.player), lambda state: can_reach_chuchu(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.grass_land_chao, world.player), + set_rule(world.multiworld.get_location(LocationName.grass_land_chao, world.player), lambda state: can_reach_stone(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.grass_land_mine, world.player), + set_rule(world.multiworld.get_location(LocationName.grass_land_mine, world.player), lambda state: can_reach_kine(state, world.player)) # Level 2 - add_rule(world.multiworld.get_location(LocationName.ripple_field_5, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_5, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_kamuribana, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_kamuribana, world.player), lambda state: can_reach_pitch(state, world.player) and can_reach_clean(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_bakasa, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_bakasa, world.player), lambda state: can_reach_kine(state, world.player) and can_reach_parasol(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_toad, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_toad, world.player), lambda state: can_reach_needle(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_mama_pitch, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_mama_pitch, world.player), lambda state: (can_reach_pitch(state, world.player) and can_reach_kine(state, world.player) and can_reach_burning(state, world.player) and can_reach_stone(state, world.player))) # Level 3 - add_rule(world.multiworld.get_location(LocationName.sand_canyon_5, world.player), + set_rule(world.multiworld.get_location(LocationName.sand_canyon_5, world.player), lambda state: can_reach_cutter(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.sand_canyon_auntie, world.player), + set_rule(world.multiworld.get_location(LocationName.sand_canyon_auntie, world.player), lambda state: can_reach_clean(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.sand_canyon_nyupun, world.player), + set_rule(world.multiworld.get_location(LocationName.sand_canyon_nyupun, world.player), lambda state: can_reach_chuchu(state, world.player) and can_reach_cutter(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.sand_canyon_rob, world.player), + set_rule(world.multiworld.get_location(LocationName.sand_canyon_rob, world.player), lambda state: can_assemble_rob(state, world.player, world.copy_abilities) ) # Level 4 - add_rule(world.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, world.player), + set_rule(world.multiworld.get_location(LocationName.cloudy_park_hibanamodoki, world.player), lambda state: can_reach_coo(state, world.player) and can_reach_clean(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.cloudy_park_piyokeko, world.player), + set_rule(world.multiworld.get_location(LocationName.cloudy_park_piyokeko, world.player), lambda state: can_reach_needle(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.cloudy_park_mikarin, world.player), + set_rule(world.multiworld.get_location(LocationName.cloudy_park_mikarin, world.player), lambda state: can_reach_coo(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.cloudy_park_pick, world.player), + set_rule(world.multiworld.get_location(LocationName.cloudy_park_pick, world.player), lambda state: can_reach_rick(state, world.player)) # Level 5 - add_rule(world.multiworld.get_location(LocationName.iceberg_4, world.player), + set_rule(world.multiworld.get_location(LocationName.iceberg_4, world.player), lambda state: can_reach_burning(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.iceberg_kogoesou, world.player), + set_rule(world.multiworld.get_location(LocationName.iceberg_kogoesou, world.player), lambda state: can_reach_burning(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.iceberg_samus, world.player), + set_rule(world.multiworld.get_location(LocationName.iceberg_samus, world.player), lambda state: can_reach_ice(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.iceberg_name, world.player), + set_rule(world.multiworld.get_location(LocationName.iceberg_name, world.player), lambda state: (can_reach_coo(state, world.player) and can_reach_burning(state, world.player) and can_reach_chuchu(state, world.player))) # ChuChu is guaranteed here, but we use this for consistency - add_rule(world.multiworld.get_location(LocationName.iceberg_shiro, world.player), + set_rule(world.multiworld.get_location(LocationName.iceberg_shiro, world.player), lambda state: can_reach_nago(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.iceberg_angel, world.player), + set_rule(world.multiworld.get_location(LocationName.iceberg_angel, world.player), lambda state: can_fix_angel_wings(state, world.player, world.copy_abilities)) # Consumables if world.options.consumables: - add_rule(world.multiworld.get_location(LocationName.grass_land_1_u1, world.player), + set_rule(world.multiworld.get_location(LocationName.grass_land_1_u1, world.player), lambda state: can_reach_parasol(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.grass_land_1_m1, world.player), + set_rule(world.multiworld.get_location(LocationName.grass_land_1_m1, world.player), lambda state: can_reach_spark(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.grass_land_2_u1, world.player), + set_rule(world.multiworld.get_location(LocationName.grass_land_2_u1, world.player), lambda state: can_reach_needle(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_2_u1, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_2_u1, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_2_m1, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_2_m1, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_3_u1, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_3_u1, world.player), lambda state: can_reach_cutter(state, world.player) or can_reach_spark(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_4_u1, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_4_u1, world.player), lambda state: can_reach_stone(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_4_m2, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_4_m2, world.player), lambda state: can_reach_stone(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_5_m1, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_5_m1, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ripple_field_5_u1, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_5_u1, world.player), lambda state: (can_reach_kine(state, world.player) and can_reach_burning(state, world.player) and can_reach_stone(state, world.player))) - add_rule(world.multiworld.get_location(LocationName.ripple_field_5_m2, world.player), + set_rule(world.multiworld.get_location(LocationName.ripple_field_5_m2, world.player), lambda state: (can_reach_kine(state, world.player) and can_reach_burning(state, world.player) and can_reach_stone(state, world.player))) - add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_u1, world.player), + set_rule(world.multiworld.get_location(LocationName.sand_canyon_4_u1, world.player), lambda state: can_reach_clean(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.sand_canyon_4_m2, world.player), + set_rule(world.multiworld.get_location(LocationName.sand_canyon_4_m2, world.player), lambda state: can_reach_needle(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u2, world.player), + set_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u2, world.player), lambda state: can_reach_ice(state, world.player) and (can_reach_rick(state, world.player) or can_reach_coo(state, world.player))) - add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u3, world.player), + set_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u3, world.player), lambda state: can_reach_ice(state, world.player) and (can_reach_rick(state, world.player) or can_reach_coo(state, world.player))) - add_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u4, world.player), + set_rule(world.multiworld.get_location(LocationName.sand_canyon_5_u4, world.player), lambda state: can_reach_ice(state, world.player) and (can_reach_rick(state, world.player) or can_reach_coo(state, world.player))) - add_rule(world.multiworld.get_location(LocationName.cloudy_park_6_u1, world.player), + set_rule(world.multiworld.get_location(LocationName.cloudy_park_6_u1, world.player), lambda state: can_reach_cutter(state, world.player)) if world.options.starsanity: # ranges are our friend for i in range(7, 11): - add_rule(world.multiworld.get_location(f"Grass Land 1 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Grass Land 1 - Star {i}", world.player), lambda state: can_reach_cutter(state, world.player)) for i in range(11, 14): - add_rule(world.multiworld.get_location(f"Grass Land 1 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Grass Land 1 - Star {i}", world.player), lambda state: can_reach_parasol(state, world.player)) for i in [1, 3, 4, 9, 10]: - add_rule(world.multiworld.get_location(f"Grass Land 2 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Grass Land 2 - Star {i}", world.player), lambda state: can_reach_stone(state, world.player)) - add_rule(world.multiworld.get_location("Grass Land 2 - Star 2", world.player), + set_rule(world.multiworld.get_location("Grass Land 2 - Star 2", world.player), lambda state: can_reach_burning(state, world.player)) - add_rule(world.multiworld.get_location("Ripple Field 2 - Star 17", world.player), + set_rule(world.multiworld.get_location("Ripple Field 2 - Star 17", world.player), lambda state: can_reach_kine(state, world.player)) for i in range(41, 43): # any star past this point also needs kine, but so does the exit - add_rule(world.multiworld.get_location(f"Ripple Field 5 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Ripple Field 5 - Star {i}", world.player), lambda state: can_reach_kine(state, world.player)) for i in range(46, 49): # also requires kine, but only for access from the prior room - add_rule(world.multiworld.get_location(f"Ripple Field 5 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Ripple Field 5 - Star {i}", world.player), lambda state: can_reach_burning(state, world.player) and can_reach_stone(state, world.player)) for i in range(12, 18): - add_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), lambda state: can_reach_ice(state, world.player) and (can_reach_rick(state, world.player) or can_reach_coo(state, world.player))) for i in range(21, 23): - add_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), lambda state: can_reach_chuchu(state, world.player)) for r in [range(19, 21), range(23, 31)]: for i in r: - add_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), lambda state: can_reach_clean(state, world.player)) for i in range(31, 41): - add_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), lambda state: can_reach_burning(state, world.player)) for r in [range(1, 31), range(44, 51)]: for i in r: - add_rule(world.multiworld.get_location(f"Cloudy Park 4 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Cloudy Park 4 - Star {i}", world.player), lambda state: can_reach_clean(state, world.player)) for i in [18, *list(range(20, 25))]: - add_rule(world.multiworld.get_location(f"Cloudy Park 6 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Cloudy Park 6 - Star {i}", world.player), lambda state: can_reach_ice(state, world.player)) for i in [19, *list(range(25, 30))]: - add_rule(world.multiworld.get_location(f"Cloudy Park 6 - Star {i}", world.player), + set_rule(world.multiworld.get_location(f"Cloudy Park 6 - Star {i}", world.player), lambda state: can_reach_ice(state, world.player)) # copy ability access edge cases # Kirby cannot eat enemies fully submerged in water. Vast majority of cases, the enemy can be brought to the surface # and eaten by inhaling while falling on top of them - add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_2_E3, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_2_E3, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_3_E6, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_3_E6, world.player), lambda state: can_reach_kine(state, world.player)) # Ripple Field 4 E5, E7, and E8 are doable, but too strict to leave in logic - add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E5, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E5, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E7, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E7, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E8, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_4_E8, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E1, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E1, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E2, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E2, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E3, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E3, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E4, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Ripple_Field_5_E4, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E7, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E7, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E8, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E8, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E9, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E9, world.player), lambda state: can_reach_kine(state, world.player)) - add_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E10, world.player), + set_rule(world.multiworld.get_location(EnemyAbilities.Sand_Canyon_4_E10, world.player), lambda state: can_reach_kine(state, world.player)) for boss_flag, purification, i in zip(["Level 1 Boss - Purified", "Level 2 Boss - Purified", @@ -313,19 +314,19 @@ def set_rules(world: "KDL3World") -> None: world.options.ow_boss_requirement.value, world.player_levels))) - if world.options.strict_bosses: - for level in range(2, 6): - add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), - lambda state, i=level: state.has(f"Level {i - 1} Boss Purified", world.player)) - set_rule(world.multiworld.get_entrance("To Level 6", world.player), lambda state: state.has("Heart Star", world.player, world.required_heart_stars)) for level in range(2, 6): - add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), + set_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), lambda state, i=level: state.has(f"Level {i - 1} Boss Defeated", world.player)) - if world.options.goal_speed == 0: + if world.options.strict_bosses: + for level in range(2, 6): + add_rule(world.multiworld.get_entrance(f"To Level {level}", world.player), + lambda state, i=level: state.has(f"Level {i - 1} Boss Purified", world.player)) + + if world.options.goal_speed == GoalSpeed.option_normal: add_rule(world.multiworld.get_entrance("To Level 6", world.player), lambda state: state.has_all(["Level 1 Boss Purified", "Level 2 Boss Purified", "Level 3 Boss Purified", "Level 4 Boss Purified", "Level 5 Boss Purified"], world.player)) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index e9f588bb73d1..66c9b17b84f4 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -66,7 +66,6 @@ class KDL3World(World): item_name_to_id = {item: item_table[item].code for item in item_table} location_name_to_id = {location_table[location]: location for location in location_table} item_name_groups = item_names - data_version = 1 web = KDL3WebWorld() settings: typing.ClassVar[KDL3Settings] @@ -121,7 +120,7 @@ def get_restrictive_copy_ability_placement(self, copy_ability: str, enemies_to_s for room in valid_rooms: valid_enemies.update(room.enemies) placed_enemies = [enemy for enemy in valid_enemies if enemy not in enemies_to_set] - if any([self.copy_abilities[enemy] == copy_ability for enemy in placed_enemies]): + if any(self.copy_abilities[enemy] == copy_ability for enemy in placed_enemies): return None # a valid enemy got placed by a more restrictive placement return self.random.choice(sorted([enemy for enemy in valid_enemies if enemy not in placed_enemies])) @@ -146,12 +145,16 @@ def pre_fill(self) -> None: enemies_to_set.remove(chosen_enemy) # two less restrictive ones, we need to ensure Cutter and Burning appear before their required stages sand_canyon_5 = self.get_region("Sand Canyon 5 - 9") + # this is primarily for typing, but if this ever hits it's fine to crash + assert isinstance(sand_canyon_5, KDL3Room) cutter_enemy = self.get_restrictive_copy_ability_placement("Cutter Ability", enemies_to_set, sand_canyon_5.level, sand_canyon_5.stage) if cutter_enemy: self.copy_abilities[cutter_enemy] = "Cutter Ability" enemies_to_set.remove(cutter_enemy) - iceberg_4 = next(room for room in self.rooms if room.name == "Iceberg 4 - 7") + iceberg_4 = self.get_region("Iceberg 4 - 7") + # this is primarily for typing, but if this ever hits it's fine to crash + assert isinstance(iceberg_4, KDL3Room) burning_enemy = self.get_restrictive_copy_ability_placement("Burning Ability", enemies_to_set, iceberg_4.level, iceberg_4.stage) if burning_enemy: @@ -211,9 +214,10 @@ def create_items(self) -> None: remaining_items -= len(star_locations) if self.options.starsanity: # star fill, keep consumable pool locked to consumable and fill 767 stars specifically - itempool.extend([self.create_item(self.random.choices(list(star_item_weights.keys()), - weights=list(star_item_weights.values()))[0]) - for _ in range(767)]) + star_items = list(star_item_weights.keys()) + star_weights = list(star_item_weights.values()) + itempool.extend([self.create_item(item) for item in self.random.choices(star_items, weights=star_weights, + k=767)]) total_heart_stars = self.options.total_heart_stars # ensure at least 1 heart star required per world required_heart_stars = max(int(total_heart_stars * required_percentage), 5) @@ -274,21 +278,15 @@ def generate_basic(self) -> None: KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) # this can technically be done at any point before generate_output - self.boss_butch_bosses.extend([None for _ in range(6)]) if self.options.allow_bb: - for i in range(6): - if self.options.allow_bb == 1: - self.boss_butch_bosses[i] = self.random.choice( - [True, False]) - else: - self.boss_butch_bosses[i] = True + if self.options.allow_bb == self.options.allow_bb.option_enforced: + self.boss_butch_bosses = [True for _ in range(6)] + else: + self.boss_butch_bosses = [self.random.choice([True, False]) for _ in range(6)] def generate_output(self, output_directory: str): rom_path = "" try: - world = self.multiworld - player = self.player - rom = RomData(get_base_rom_path()) patch_rom(self, rom) @@ -296,8 +294,8 @@ def generate_output(self, output_directory: str): rom.write_to_file(rom_path) self.rom_name = rom.name - patch = KDL3DeltaPatch(os.path.splitext(rom_path)[0] + KDL3DeltaPatch.patch_file_ending, player=player, - player_name=world.player_name[player], patched_path=rom_path) + patch = KDL3DeltaPatch(os.path.splitext(rom_path)[0] + KDL3DeltaPatch.patch_file_ending, player=self.player, + player_name=self.multiworld.player_name[self.player], patched_path=rom_path) patch.write() except Exception: raise diff --git a/worlds/kdl3/test/TestGoal.py b/worlds/kdl3/test/test_goal.py similarity index 94% rename from worlds/kdl3/test/TestGoal.py rename to worlds/kdl3/test/test_goal.py index af5bc6bd1a1b..ce53642a9716 100644 --- a/worlds/kdl3/test/TestGoal.py +++ b/worlds/kdl3/test/test_goal.py @@ -10,7 +10,7 @@ class TestFastGoal(KDL3TestBase): "filler_percentage": 0, } - def testGoal(self): + def test_goal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) @@ -35,7 +35,7 @@ class TestNormalGoal(KDL3TestBase): "filler_percentage": 0, } - def testGoal(self): + def test_goal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) @@ -51,14 +51,14 @@ def testGoal(self): self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) - def testKine(self): + def test_kine(self): self.collect_by_name(["Cutter", "Burning", "Heart Star"]) self.assertBeatable(False) - def testCutter(self): + def test_cutter(self): self.collect_by_name(["Kine", "Burning", "Heart Star"]) self.assertBeatable(False) - def testBurning(self): + def test_burning(self): self.collect_by_name(["Cutter", "Kine", "Heart Star"]) self.assertBeatable(False) diff --git a/worlds/kdl3/test/TestLocations.py b/worlds/kdl3/test/test_locations.py similarity index 98% rename from worlds/kdl3/test/TestLocations.py rename to worlds/kdl3/test/test_locations.py index 90a7f34e6eea..543f0d83926d 100644 --- a/worlds/kdl3/test/TestLocations.py +++ b/worlds/kdl3/test/test_locations.py @@ -12,7 +12,7 @@ class TestLocations(KDL3TestBase): # these ensure we can always reach all stages physically } - def testSimpleHeartStars(self): + def test_simple_heart_stars(self): self.run_location_test(LocationName.grass_land_muchi, ["ChuChu"]) self.run_location_test(LocationName.grass_land_chao, ["Stone"]) self.run_location_test(LocationName.grass_land_mine, ["Kine"]) @@ -58,7 +58,7 @@ class TestShiro(KDL3TestBase): "plando_options": "connections" } - def testShiro(self): + def test_shiro(self): self.assertFalse(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed)) self.collect_by_name("Nago") self.assertFalse(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed)) diff --git a/worlds/kdl3/test/TestShuffles.py b/worlds/kdl3/test/test_shuffles.py similarity index 87% rename from worlds/kdl3/test/TestShuffles.py rename to worlds/kdl3/test/test_shuffles.py index 2e943a70fbf4..d676b641b056 100644 --- a/worlds/kdl3/test/TestShuffles.py +++ b/worlds/kdl3/test/test_shuffles.py @@ -1,5 +1,6 @@ from typing import List, Tuple from . import KDL3TestBase +from ..Room import KDL3Room class TestCopyAbilityShuffle(KDL3TestBase): @@ -12,7 +13,7 @@ class TestCopyAbilityShuffle(KDL3TestBase): "copy_ability_randomization": "enabled", } - def testGoal(self): + def test_goal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) @@ -28,39 +29,41 @@ def testGoal(self): self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) - def testKine(self): + def test_kine(self): self.collect_by_name(["Cutter", "Burning", "Heart Star"]) self.assertBeatable(False) - def testCutter(self): + def test_cutter(self): self.collect_by_name(["Kine", "Burning", "Heart Star"]) self.assertBeatable(False) - def testBurning(self): + def test_burning(self): self.collect_by_name(["Cutter", "Kine", "Heart Star"]) self.assertBeatable(False) - def testCutterAndBurning(self): + def test_cutter_and_burning_reachable(self): rooms = self.multiworld.worlds[1].rooms copy_abilities = self.multiworld.worlds[1].copy_abilities - sand_canyon_5 = next(room for room in rooms if room.name == "Sand Canyon 5 - 9") + sand_canyon_5 = self.multiworld.get_region("Sand Canyon 5 - 9", 1) + assert isinstance(sand_canyon_5, KDL3Room) valid_rooms = [room for room in rooms if (room.level < sand_canyon_5.level) or (room.level == sand_canyon_5.level and room.stage < sand_canyon_5.stage)] for room in valid_rooms: - if any([copy_abilities[enemy] == "Cutter Ability" for enemy in room.enemies]): + if any(copy_abilities[enemy] == "Cutter Ability" for enemy in room.enemies): break else: self.fail("Could not reach Cutter Ability before Sand Canyon 5!") - iceberg_4 = next(room for room in rooms if room.name == "Iceberg 4 - 7") + iceberg_4 = self.multiworld.get_region("Iceberg 4 - 7", 1) + assert isinstance(iceberg_4, KDL3Room) valid_rooms = [room for room in rooms if (room.level < iceberg_4.level) or (room.level == iceberg_4.level and room.stage < iceberg_4.stage)] for room in valid_rooms: - if any([copy_abilities[enemy] == "Burning Ability" for enemy in room.enemies]): + if any(copy_abilities[enemy] == "Burning Ability" for enemy in room.enemies): break else: self.fail("Could not reach Burning Ability before Iceberg 4!") - def testValidAbilitiesForROB(self): + def test_valid_abilities_for_ROB(self): # there exists a subset of 4-7 abilities that will allow us access to ROB heart star on default settings self.collect_by_name(["Heart Star", "Kine", "Coo"]) # we will guaranteed need Coo, Kine, and Heart Stars to reach # first we need to identify our bukiset requirements @@ -106,7 +109,7 @@ class TestAnimalShuffle(KDL3TestBase): "animal_randomization": "full", } - def testGoal(self): + def test_goal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) @@ -122,19 +125,19 @@ def testGoal(self): self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) - def testKine(self): + def test_kine(self): self.collect_by_name(["Cutter", "Burning", "Heart Star"]) self.assertBeatable(False) - def testCutter(self): + def test_cutter(self): self.collect_by_name(["Kine", "Burning", "Heart Star"]) self.assertBeatable(False) - def testBurning(self): + def test_burning(self): self.collect_by_name(["Cutter", "Kine", "Heart Star"]) self.assertBeatable(False) - def testLockedAnimals(self): + def test_locked_animals(self): self.assertTrue(self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") self.assertTrue(self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") self.assertTrue(self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) @@ -151,7 +154,7 @@ class TestAllShuffle(KDL3TestBase): "copy_ability_randomization": "enabled", } - def testGoal(self): + def test_goal(self): self.assertBeatable(False) heart_stars = self.get_items_by_name("Heart Star") self.collect(heart_stars[0:14]) @@ -167,44 +170,46 @@ def testGoal(self): self.assertEqual(self.count("Heart Star"), 30, str(self.multiworld.seed)) self.assertBeatable(True) - def testKine(self): + def test_kine(self): self.collect_by_name(["Cutter", "Burning", "Heart Star"]) self.assertBeatable(False) - def testCutter(self): + def test_cutter(self): self.collect_by_name(["Kine", "Burning", "Heart Star"]) self.assertBeatable(False) - def testBurning(self): + def test_burning(self): self.collect_by_name(["Cutter", "Kine", "Heart Star"]) self.assertBeatable(False) - def testLockedAnimals(self): + def test_locked_animals(self): self.assertTrue(self.multiworld.get_location("Ripple Field 5 - Animal 2", 1).item.name == "Pitch Spawn") self.assertTrue(self.multiworld.get_location("Iceberg 4 - Animal 1", 1).item.name == "ChuChu Spawn") self.assertTrue(self.multiworld.get_location("Sand Canyon 6 - Animal 1", 1).item.name in {"Kine Spawn", "Coo Spawn"}) - def testCutterAndBurning(self): + def test_cutter_and_burning_reachable(self): rooms = self.multiworld.worlds[1].rooms copy_abilities = self.multiworld.worlds[1].copy_abilities - sand_canyon_5 = next(room for room in rooms if room.name == "Sand Canyon 5 - 9") + sand_canyon_5 = self.multiworld.get_region("Sand Canyon 5 - 9", 1) + assert isinstance(sand_canyon_5, KDL3Room) valid_rooms = [room for room in rooms if (room.level < sand_canyon_5.level) or (room.level == sand_canyon_5.level and room.stage < sand_canyon_5.stage)] for room in valid_rooms: - if any([copy_abilities[enemy] == "Cutter Ability" for enemy in room.enemies]): + if any(copy_abilities[enemy] == "Cutter Ability" for enemy in room.enemies): break else: self.fail("Could not reach Cutter Ability before Sand Canyon 5!") - iceberg_4 = next(room for room in rooms if room.name == "Iceberg 4 - 7") + iceberg_4 = self.multiworld.get_region("Iceberg 4 - 7", 1) + assert isinstance(iceberg_4, KDL3Room) valid_rooms = [room for room in rooms if (room.level < iceberg_4.level) or (room.level == iceberg_4.level and room.stage < iceberg_4.stage)] for room in valid_rooms: - if any([copy_abilities[enemy] == "Burning Ability" for enemy in room.enemies]): + if any(copy_abilities[enemy] == "Burning Ability" for enemy in room.enemies): break else: self.fail("Could not reach Burning Ability before Iceberg 4!") - def testValidAbilitiesForROB(self): + def test_valid_abilities_for_ROB(self): # there exists a subset of 4-7 abilities that will allow us access to ROB heart star on default settings self.collect_by_name(["Heart Star", "Kine", "Coo"]) # we will guaranteed need Coo, Kine, and Heart Stars to reach # first we need to identify our bukiset requirements @@ -237,4 +242,4 @@ def testValidAbilitiesForROB(self): self.collect_by_name(["Cutter"]) self.assertTrue(self.can_reach_location("Sand Canyon 6 - Professor Hector & R.O.B"), - ''.join(str(self.multiworld.seed)).join(collected_abilities)) \ No newline at end of file + ''.join(str(self.multiworld.seed)).join(collected_abilities)) From 2cb2f7656d594b17d76ce4d54c8ea380cee974e5 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 26 Feb 2024 16:05:52 -0600 Subject: [PATCH 165/165] Update Items.py --- worlds/kdl3/Items.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/kdl3/Items.py b/worlds/kdl3/Items.py index 7dbdf3d9feef..66c7f8fee323 100644 --- a/worlds/kdl3/Items.py +++ b/worlds/kdl3/Items.py @@ -100,5 +100,6 @@ class KDL3Item(Item): item_names = { "Copy Ability": set(copy_ability_table), "Animal Friend": set(animal_friend_table), +} lookup_name_to_id: typing.Dict[str, int] = {item_name: data.code for item_name, data in item_table.items() if data.code}