From 55c70a5ba8b6f24d28f477c47bf125448c6757c4 Mon Sep 17 00:00:00 2001 From: PinkSwitch <52474902+PinkSwitch@users.noreply.github.com> Date: Fri, 19 Dec 2025 07:52:27 -0600 Subject: [PATCH] EarthBound: Implement New Game (#5159) * Add the world * doc update * docs * Fix Blast/Missile not clearing Reflect * Update worlds/earthbound/__init__.py Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> * Update worlds/earthbound/__init__.py remove unused import Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> * Update worlds/earthbound/__init__.py Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> * Update worlds/earthbound/modules/dungeon_er.py make bool optional Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> * Update worlds/earthbound/modules/boss_shuffle.py typing update Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> * Update worlds/earthbound/modules/boss_shuffle.py Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> * Filter events out of item name to id * we call it a glorp * Update worlds/earthbound/Regions.py Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> * Update worlds/earthbound/__init__.py Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> * Update worlds/earthbound/Items.py Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> * Update worlds/earthbound/Regions.py Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> * Fix missing optional import * hint stuff * -Fix Apple Kid text being wrong -Fix Slimy Pile text being wrong * -Fix some sprite corruption if PSI was used when an enemy loaded another enemy -Fixed a visible artifact tile during some cutscenes * Update ver * Update docs * Fix some money scripting issues * Add argument to PSI fakeout attack * Updated monkey caves shop description * Remove closing markdown from doc * Add new flavors * Make flavors actually work * Update platforms * Fix common gear getting duplicated * Split region initialization * Condense checks for start inventory + some other junk * Fix some item groups - change receiver phone to warp pad * wow that one was really bad :glorp: * blah * Fix cutoff option text * switch start inventory concatenation to itertools * Fix sky runner scripting bug - added some new comm suggestions * Fix crash when generating with spoiler_only * Fix happy-happy teleport not unlocking after beating carpainter * Hint man hints can now use CreateHint packets to create hints in other games * Adjust some filler rarity * Update world to use CreateHints and deprecate old method * Fix epilogue skip being offset * Rearrange a couple regions * Fix tendapants getting deleted in battle * update doc * i got scared and forgot i had multiple none checks and am worried about this triggering but tested and it works * Fix mostly typing errors from silvris * More type checks * More typing * Typema * Type * Fix enemy levels overwriting music * Fix gihugic blunder * Fix Lumine Hall enabling OSS * del world * Rel 4.2.7 * Remove some debug logs * Fix vanilla bug with weird ambush detection * Fix Starman Junior having an unscaled Freeze * Change shop scaling * Fix shops using the wrong thankful script * Update some bosses in boss shuffle * Loc group adjustment * Update some boss shuffle stuff | Fix Enemizer attacks getting overwritten by Shuffle data | Fix flunkies not updating and still being used with enemizer * Get rid of some debug stuff * Get boss shuffle running, dont merge * Fix json and get boss shuffle no plando back up * Fix Magicant Boost not initializing to Ness if party count = 4 * Fix belch shop using wrong logic * Don't re-send goal status * EBitem * remove : * idk if this is whatvi wanted * All client messagesnow only send when relevant instead of constantly * Patch up the rest of boss plando * Fix Giygas being not excluded from enemizer * Fix epilogue again * adjust the sphere scaling name * add the things * Fix Ness being placed onto monotoli when monotoli was in sea of eden * Fix prefill properly * Fix boss shuffle on vanilla slots. * rename this, apparently * Update archipelago.json --------- Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> --- README.md | 1 + docs/CODEOWNERS | 3 + inno_setup.iss | 5 + worlds/earthbound/Client.py | 516 + worlds/earthbound/Items.py | 337 + worlds/earthbound/Locations.py | 594 + worlds/earthbound/Options.py | 625 + worlds/earthbound/Regions.py | 279 + worlds/earthbound/Rom.py | 848 + worlds/earthbound/Rules.py | 128 + worlds/earthbound/__init__.py | 609 + worlds/earthbound/archipelago.json | 4 + worlds/earthbound/docs/en_EarthBound.md | 124 + worlds/earthbound/docs/setup_en.md | 128 + worlds/earthbound/game_data/__init__.py | 0 worlds/earthbound/game_data/battle_bg_data.py | 329 + worlds/earthbound/game_data/local_data.py | 1406 ++ .../game_data/palettes_organized.py | 11066 +++++++++ .../game_data/static_location_data.py | 1407 ++ worlds/earthbound/game_data/text_data.py | 297 + worlds/earthbound/gifting/__init__.py | 0 worlds/earthbound/gifting/gift_tags.py | 606 + worlds/earthbound/gifting/trait_parser.py | 454 + worlds/earthbound/modules/__init__.py | 0 worlds/earthbound/modules/area_scaling.py | 603 + worlds/earthbound/modules/boss_shuffle.py | 411 + worlds/earthbound/modules/dungeon_er.py | 212 + .../earthbound/modules/enemizer/__init__.py | 0 .../modules/enemizer/enemy_attributes.py | 1024 + .../enemizer/randomize_enemy_attacks.py | 236 + .../enemizer/randomize_enemy_attributes.py | 143 + .../modules/enemizer/randomize_enemy_stats.py | 68 + worlds/earthbound/modules/enemy_data.py | 1320 ++ worlds/earthbound/modules/enemy_shuffler.py | 1372 ++ worlds/earthbound/modules/equipamizer.py | 994 + worlds/earthbound/modules/flavor_data.py | 328 + worlds/earthbound/modules/hint_data.py | 365 + worlds/earthbound/modules/music_rando.py | 305 + worlds/earthbound/modules/palette_shuffle.py | 52 + worlds/earthbound/modules/psi_shuffle.py | 515 + worlds/earthbound/modules/shopsanity.py | 449 + worlds/earthbound/setup_game.py | 501 + .../src/earthbound_basepatch.bsdiff4 | Bin 0 -> 52812 bytes worlds/earthbound/src/eb.asm | 18902 ++++++++++++++++ .../new psi animations/PSI Blast Alpha.gif | Bin 0 -> 8856 bytes .../src/new psi animations/PSI Blast Beta.gif | Bin 0 -> 9697 bytes .../new psi animations/PSI Blast Gamma.gif | Bin 0 -> 9921 bytes .../new psi animations/PSI Blast Omega.gif | Bin 0 -> 10280 bytes .../new psi animations/PSI Missile Alpha.gif | Bin 0 -> 4344 bytes .../new psi animations/PSI Missile Gamma.gif | Bin 0 -> 8509 bytes .../new psi animations/PSI Missile Omega.gif | Bin 0 -> 13793 bytes .../new psi animations/PSI Missile beta.gif | Bin 0 -> 8216 bytes worlds/earthbound/test/__init__.py | 6 + worlds/earthbound/test/test_access.py | 66 + 54 files changed, 47638 insertions(+) create mode 100644 worlds/earthbound/Client.py create mode 100644 worlds/earthbound/Items.py create mode 100644 worlds/earthbound/Locations.py create mode 100644 worlds/earthbound/Options.py create mode 100644 worlds/earthbound/Regions.py create mode 100644 worlds/earthbound/Rom.py create mode 100644 worlds/earthbound/Rules.py create mode 100644 worlds/earthbound/__init__.py create mode 100644 worlds/earthbound/archipelago.json create mode 100644 worlds/earthbound/docs/en_EarthBound.md create mode 100644 worlds/earthbound/docs/setup_en.md create mode 100644 worlds/earthbound/game_data/__init__.py create mode 100644 worlds/earthbound/game_data/battle_bg_data.py create mode 100644 worlds/earthbound/game_data/local_data.py create mode 100644 worlds/earthbound/game_data/palettes_organized.py create mode 100644 worlds/earthbound/game_data/static_location_data.py create mode 100644 worlds/earthbound/game_data/text_data.py create mode 100644 worlds/earthbound/gifting/__init__.py create mode 100644 worlds/earthbound/gifting/gift_tags.py create mode 100644 worlds/earthbound/gifting/trait_parser.py create mode 100644 worlds/earthbound/modules/__init__.py create mode 100644 worlds/earthbound/modules/area_scaling.py create mode 100644 worlds/earthbound/modules/boss_shuffle.py create mode 100644 worlds/earthbound/modules/dungeon_er.py create mode 100644 worlds/earthbound/modules/enemizer/__init__.py create mode 100644 worlds/earthbound/modules/enemizer/enemy_attributes.py create mode 100644 worlds/earthbound/modules/enemizer/randomize_enemy_attacks.py create mode 100644 worlds/earthbound/modules/enemizer/randomize_enemy_attributes.py create mode 100644 worlds/earthbound/modules/enemizer/randomize_enemy_stats.py create mode 100644 worlds/earthbound/modules/enemy_data.py create mode 100644 worlds/earthbound/modules/enemy_shuffler.py create mode 100644 worlds/earthbound/modules/equipamizer.py create mode 100644 worlds/earthbound/modules/flavor_data.py create mode 100644 worlds/earthbound/modules/hint_data.py create mode 100644 worlds/earthbound/modules/music_rando.py create mode 100644 worlds/earthbound/modules/palette_shuffle.py create mode 100644 worlds/earthbound/modules/psi_shuffle.py create mode 100644 worlds/earthbound/modules/shopsanity.py create mode 100644 worlds/earthbound/setup_game.py create mode 100644 worlds/earthbound/src/earthbound_basepatch.bsdiff4 create mode 100644 worlds/earthbound/src/eb.asm create mode 100644 worlds/earthbound/src/new psi animations/PSI Blast Alpha.gif create mode 100644 worlds/earthbound/src/new psi animations/PSI Blast Beta.gif create mode 100644 worlds/earthbound/src/new psi animations/PSI Blast Gamma.gif create mode 100644 worlds/earthbound/src/new psi animations/PSI Blast Omega.gif create mode 100644 worlds/earthbound/src/new psi animations/PSI Missile Alpha.gif create mode 100644 worlds/earthbound/src/new psi animations/PSI Missile Gamma.gif create mode 100644 worlds/earthbound/src/new psi animations/PSI Missile Omega.gif create mode 100644 worlds/earthbound/src/new psi animations/PSI Missile beta.gif create mode 100644 worlds/earthbound/test/__init__.py create mode 100644 worlds/earthbound/test/test_access.py diff --git a/README.md b/README.md index af574ed248..efa18bc1ef 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,7 @@ Currently, the following games are supported: * Choo-Choo Charles * APQuest * Satisfactory +* EarthBound For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 3d052cb7cd..0e368386c5 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -70,6 +70,9 @@ # DOOM II /worlds/doom_ii/ @Daivuk @KScl +# EarthBound +/worlds/earthbound/ @PinkSwitch + # Factorio /worlds/factorio/ @Berserker66 diff --git a/inno_setup.iss b/inno_setup.iss index 1891cf83d0..c396224c56 100644 --- a/inno_setup.iss +++ b/inno_setup.iss @@ -208,6 +208,11 @@ Root: HKCR; Subkey: "{#MyAppName}apcivvipatch"; ValueData: " Root: HKCR; Subkey: "{#MyAppName}apcivvipatch\DefaultIcon"; ValueData: "{app}\ArchipelagoLauncher.exe,0"; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}apcivvipatch\shell\open\command"; ValueData: """{app}\ArchipelagoLauncher.exe"" ""%1"""; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: ".apeb"; ValueData: "{#MyAppName}ebpatch"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}ebpatch"; ValueData: "Archipelago EarthBound Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}ebpatch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}ebpatch\shell\open\command"; ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1"""; ValueType: string; ValueName: ""; + Root: HKCR; Subkey: ".archipelago"; ValueData: "{#MyAppName}multidata"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}multidata"; ValueData: "Archipelago Server Data"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}multidata\DefaultIcon"; ValueData: "{app}\ArchipelagoServer.exe,0"; ValueType: string; ValueName: ""; diff --git a/worlds/earthbound/Client.py b/worlds/earthbound/Client.py new file mode 100644 index 0000000000..5bd76d3e8a --- /dev/null +++ b/worlds/earthbound/Client.py @@ -0,0 +1,516 @@ +import logging +import struct +import typing +import time +import uuid +from struct import pack +from .game_data.local_data import client_specials, world_version, hint_bits, item_id_table, money_id_table +from .game_data.text_data import text_encoder +from .gifting.gift_tags import gift_properties +from .gifting.trait_parser import wanted_traits, trait_interpreter, gift_exclusions + +from NetUtils import ClientStatus, color +from worlds.AutoSNIClient import SNIClient + +if typing.TYPE_CHECKING: + from SNIClient import SNIContext +else: + SNIContext = typing.Any + +snes_logger = logging.getLogger("SNES") + +ROM_START = 0x000000 +WRAM_START = 0xF50000 +WRAM_SIZE = 0x20000 +SRAM_START = 0xE00000 + +EB_ROMHASH_START = 0x00FFC0 +WORLD_VERSION = 0x3FF0A0 +ROMHASH_SIZE = 0x15 + +ITEM_MODE = ROM_START + 0x04FD76 + +ITEMQUEUE_HIGH = WRAM_START + 0xB576 +ITEM_RECEIVED = WRAM_START + 0xB570 +SPECIAL_RECEIVED = WRAM_START + 0xB572 +MONEY_RECIVED = WRAM_START + 0xB5F1 +SAVE_FILE = WRAM_START + 0xB4A1 +GIYGAS_CLEAR = WRAM_START + 0x9C11 +GAME_CLEAR = WRAM_START + 0x9C85 +OPEN_WINDOW = WRAM_START + 0x8958 +MELODY_TABLE = WRAM_START + 0x9C1E +EARTH_POWER_FLAG = WRAM_START + 0x9C82 +CUR_SCENE = WRAM_START + 0x97B8 +IS_IN_BATTLE = WRAM_START + 0x9643 +DEATHLINK_ENABLED = ROM_START + 0x04FD74 +DEATHLINK_TYPE = ROM_START + 0x04FD75 +IS_CURRENTLY_DEAD = WRAM_START + 0xB582 +GOT_DEATH_FROM_SERVER = WRAM_START + 0xB583 +PLAYER_JUST_DIED_SEND_DEATHLINK = WRAM_START + 0xB584 +IS_ABLE_TO_RECEIVE_DEATHLINKS = WRAM_START + 0xB585 +CHAR_COUNT = WRAM_START + 0x98A4 +OSS_FLAG = WRAM_START + 0x5D98 +HINT_SCOUNT_IDS = ROM_START + 0x310250 +SCOUTED_HINT_FLAGS = WRAM_START + 0xB621 +MONEY_IN_BANK = WRAM_START + 0x9835 +IS_ENERGYLINK_ENABLED = ROM_START + 0x04FD78 +already_tried_to_connect = False + + +class EarthBoundClient(SNIClient): + game = "EarthBound" + patch_suffix = ".apeb" + most_recent_connect: str = "" + client_version: str = world_version + hint_list: list[int] = [] + hinted_shop_locations: list[int] = [] + + async def deathlink_kill_player(self, ctx: "SNIContext") -> None: + from SNIClient import DeathState, snes_buffered_write, snes_flush_writes, snes_read + battle_hp = { + 1: WRAM_START + 0x9FBF, + 2: WRAM_START + 0xA00D, + 3: WRAM_START + 0xA05B, + 4: WRAM_START + 0xA0A9, + } + + active_hp = { + 1: WRAM_START + 0x9A15, + 2: WRAM_START + 0x9A74, + 3: WRAM_START + 0x9AD3, + 4: WRAM_START + 0x9B32, + } + + scrolling_hp = { + 1: WRAM_START + 0x9A13, + 2: WRAM_START + 0x9A72, + 3: WRAM_START + 0x9AD1, + 4: WRAM_START + 0x9B30, + } + + deathlink_mode = await snes_read(ctx, DEATHLINK_TYPE, 1) + oss_flag = await snes_read(ctx, OSS_FLAG, 1) + is_currently_dead = await snes_read(ctx, IS_CURRENTLY_DEAD, 1) + can_receive_deathlinks = await snes_read(ctx, IS_ABLE_TO_RECEIVE_DEATHLINKS, 1) + is_in_battle = await snes_read(ctx, IS_IN_BATTLE, 1) + char_count = await snes_read(ctx, CHAR_COUNT, 1) + snes_buffered_write(ctx, GOT_DEATH_FROM_SERVER, bytes([0x01])) + text_open = await snes_read(ctx, OPEN_WINDOW, 1) + + if text_open is None: #Catch None reads from client jank???????? + return + + if is_currently_dead[0] != 0x00 or can_receive_deathlinks[0] == 0x00: + return + + # If suppression is set and we're not in a battle dont do deathlinks + if oss_flag[0] != 0x00 and is_in_battle[0] == 0x00: + return + + # Prevent overworld deaths while a menu is open + if not is_in_battle[0] and text_open[0] != 0xFF: + return + + for i in range(char_count[0]): + w_cur_char = WRAM_START + 0x986F + i + current_char = await snes_read(ctx, w_cur_char, 1) + snes_buffered_write(ctx, active_hp[current_char[0]], bytes([0x00, 0x00])) + snes_buffered_write(ctx, battle_hp[i + 1], bytes([0x00, 0x00])) + if deathlink_mode[0] == 0 or is_in_battle[0] == 0: + # This should be the check for instant or mercy. Write the value, call it here + snes_buffered_write(ctx, scrolling_hp[current_char[0]], bytes([0x00, 0x00])) + await snes_flush_writes(ctx) + ctx.death_state = DeathState.dead + ctx.last_death_link = time.time() + + def on_package(self, ctx, cmd: str, args: dict[str, typing.Any]) -> None: + super().on_package(ctx, cmd, args) + + if cmd == "Connected": + self.slot_data = args.get("slot_data", None) + + async def validate_rom(self, ctx: "SNIContext") -> bool: + from SNIClient import snes_read + + rom_name = await snes_read(ctx, EB_ROMHASH_START, ROMHASH_SIZE) + apworld_version = await snes_read(ctx, WORLD_VERSION, 16) + + item_handling = await snes_read(ctx, ITEM_MODE, 1) + if rom_name is None or rom_name[:6] != b"MOM2AP": + return False + + apworld_version = apworld_version.decode("utf-8").strip("\x00") + if apworld_version != self.most_recent_connect and apworld_version != self.client_version: + ctx.gui_error("Bad Version", f"EarthBound APWorld version {self.client_version} does not match generated version {apworld_version}") + self.most_recent_connect = apworld_version + return False + + ctx.game = self.game + if item_handling[0] == 0x00: + ctx.items_handling = 0b001 + else: + ctx.items_handling = 0b111 + ctx.rom = rom_name + + death_link = await snes_read(ctx, DEATHLINK_ENABLED, 1) + if death_link: + await ctx.update_death_link(bool(death_link[0] & 0b1)) + return True + + async def game_watcher(self, ctx: "SNIContext") -> None: + from SNIClient import snes_buffered_write, snes_flush_writes, snes_read, snes_write + giygas_clear = await snes_read(ctx, GIYGAS_CLEAR, 0x1) + game_clear = await snes_read(ctx, GAME_CLEAR, 0x1) + item_received = await snes_read(ctx, ITEM_RECEIVED, 0x1) + special_received = await snes_read(ctx, SPECIAL_RECEIVED, 0x1) + money_received = await snes_read(ctx, MONEY_RECIVED, 0x2) + save_num = await snes_read(ctx, SAVE_FILE, 0x1) + text_open = await snes_read(ctx, OPEN_WINDOW, 1) + melody_table = await snes_read(ctx, MELODY_TABLE, 2) + earth_power_absorbed = await snes_read(ctx, EARTH_POWER_FLAG, 1) + cur_script = await snes_read(ctx, CUR_SCENE, 1) + rom = await snes_read(ctx, EB_ROMHASH_START, ROMHASH_SIZE) + scouted_hint_flags = await snes_read(ctx, SCOUTED_HINT_FLAGS, 1) + gift_target = await snes_read(ctx, WRAM_START + 0xB5E7, 2) + outbound_gifts = await snes_read(ctx, WRAM_START + 0x31D0, 1) + shop_scout = await snes_read(ctx, WRAM_START + 0x0770, 1) + shop_scouts_enabled = await snes_read(ctx, ROM_START + 0x04FD77, 1) + outgoing_energy = await snes_read(ctx, MONEY_IN_BANK, 4) + if rom != ctx.rom: + ctx.rom = None + return + + if giygas_clear[0] & 0x01 == 0x01: # Are we in the epilogue + return + + if save_num[0] == 0x00: # If on the title screen + return + + if ctx.slot is None: + return + + if outgoing_energy is None: #None Catcher + return + + + if f"GiftBoxes;{ctx.team}" not in ctx.stored_data: + await ctx.send_msgs([{ + "cmd": "SetNotify", + "keys": [f"GiftBoxes;{ctx.team}"] + }]) + + # GIFTING DATA + if f"GiftBox;{ctx.team};{ctx.slot}" not in ctx.stored_data: + local_giftbox = { + str(ctx.slot): { + "is_open": True, + "accepts_any_gift": False, + "desired_traits": wanted_traits, + "minimum_gift_data_version": 2, + "maximum_gift_data_version": 3}} + await ctx.send_msgs([{ + "cmd": "Set", + "key": f"GiftBoxes;{ctx.team}", + "want_reply": False, + "default": {}, + "operations": [{"operation": "update", "value": local_giftbox}] + }]) + + await ctx.send_msgs([{ + "cmd": "Get", + "keys": [f"GiftBox;{ctx.team};{ctx.slot}"] + }]) + + await ctx.send_msgs([{ + "cmd": "SetNotify", + "keys": [f"GiftBox;{ctx.team};{ctx.slot}", f"GiftBoxes;{ctx.team}"] + }]) + + inbox = ctx.stored_data.get(f"GiftBox;{ctx.team};{ctx.slot}") + motherbox = ctx.stored_data.get(f"GiftBoxes;{ctx.team}") + if inbox: + gift_item_name = "None" + key, gift = next(iter(inbox.items())) + if "item_name" in gift or "ItemName" in gift: + gift_item_name = gift.get("item_name", gift.get("ItemName")) + if gift_item_name in item_id_table and gift_item_name not in gift_exclusions: + # If the name matches an EB item, convert it to one (even if not coming from EB) + item = item_id_table[gift_item_name] + else: + item = trait_interpreter(gift) + + inbox_queue = await snes_read(ctx, WRAM_START + 0x3200, 1) + # Pause if the receiver queue is full + if not inbox_queue[0]: + await snes_write(ctx, [(WRAM_START + 0x3200, bytes([item]))]) + inbox.pop(key) + await ctx.send_msgs([{ + "cmd": "Set", + "key": f"GiftBox;{ctx.team};{ctx.slot}", + "want_reply": False, + "default": {}, + "operations": [{"operation": "pop", "value": key}] + }]) + + # We're in the Gift selection menu. This should write the selected player's name into RAM + # for parsing. + # TODO; CHECK A SETNOTIFY HERE + gift_target = int.from_bytes(gift_target, byteorder="little") + + # Giftbox checking for the gift menu UI + if gift_target != 0x00 and motherbox is not None: + gift_recipient = str(gift_target) + recip_name = ctx.player_names[gift_target] + recip_name = get_alias(recip_name, ctx.slot_info[gift_target].name) + recip_name = text_encoder(recip_name, 20) + if gift_recipient in motherbox: + if "IsOpen" in motherbox[gift_recipient]: + motherbox[gift_recipient]["is_open"] = motherbox[gift_recipient].pop("IsOpen") + + if gift_recipient in motherbox and motherbox[gift_recipient]["is_open"]: + recip_name.extend(text_encoder(" (Open)", 20)) + else: + recip_name.extend(text_encoder(" (Closed)", 20)) + recip_name.append(0x00) + await snes_write(ctx, [(WRAM_START + 0xFF80, recip_name)]) + await snes_write(ctx, [(WRAM_START + 0xB5E7, bytes([0x00, 0x00]))]) + await snes_write(ctx, [(WRAM_START + 0xB573, bytes([0x00, 0x00]))]) + + gift_flag_byte = await snes_read(ctx, WRAM_START + 0xB622, 1) + gift_flag_byte = gift_flag_byte[0] | 0x04 + await snes_write(ctx, [(WRAM_START + 0xB622, bytes([gift_flag_byte]))]) + + if outbound_gifts[0] != 0x00 and motherbox is not None: + gift_buffer = await snes_read(ctx, WRAM_START + 0x31D1, 3) + gift_item_id = gift_buffer[0] + gift = gift_properties[gift_item_id] + recipient = struct.unpack("H", gift_buffer[-2:]) + if str(recipient[0]) in motherbox: + # Check if the player's box is open, refund if not + if "IsOpen" in motherbox[str(recipient[0])]: + # Does the recipient 0 thing work if > 255? Will need some testing. + motherbox[str(recipient[0])]["is_open"] = motherbox[str(recipient[0])].pop("IsOpen") + + if "AcceptsAnyGift" in motherbox[str(recipient[0])]: + motherbox[str(recipient[0])]["accepts_any_gift"] = motherbox[str(recipient[0])].pop("AcceptsAnyGift") + + if "DesiredTraits" in motherbox[str(recipient[0])]: + motherbox[str(recipient[0])]["desired_traits"] = motherbox[str(recipient[0])].pop("DesiredTraits") + + if "Trait" in motherbox[str(recipient[0])]["desired_traits"]: + motherbox[str(recipient[0])]["desired_traits"]["trait"] = motherbox[str(recipient[0])]["desired_traits"].pop("Trait") + + if str(recipient[0]) in motherbox and motherbox[str(recipient[0])]["is_open"] and (any( + motherbox[str(recipient[0])]["accepts_any_gift"] or + trait["trait"] in motherbox[str(recipient[0])]["desired_traits"] for trait in gift.traits)): + was_refunded = False + recipient = recipient[0] + else: + was_refunded = True + recipient = ctx.slot + guid = str(uuid.uuid4()) + outgoing_gift = { + guid: { + "id": guid, + "item_name": gift.name, + "amount": 1, + "item_value": gift.value, + "traits": gift.traits, + "sender_slot": ctx.slot, + "receiver_slot": recipient, + "sender_team": ctx.team, + "receiver_team": ctx.team, # ??? Should be Receive slot team? + "is_refund": was_refunded}} + + await ctx.send_msgs([{ + "cmd": "Set", + "key": f"GiftBox;{ctx.team};{recipient}", # Receiver team here too + "want_reply": True, + "default": {}, + "operations": [{"operation": "update", "value": outgoing_gift}] + }]) + + gift_queue = await snes_read(ctx, WRAM_START + 0x31D4, 0x21) + # shuffle the entire queue down 3 bytes + outbox_full_byte = await snes_read(ctx, WRAM_START + 0xB622, 1) + + await snes_write(ctx, [(WRAM_START + 0x31D1, gift_queue)]) + await snes_write(ctx, [(WRAM_START + 0x31D0, bytes([outbound_gifts[0] - 1]))]) + outbox_full_byte = outbox_full_byte[0] & ~0x08 + await snes_write(ctx, [(WRAM_START + 0xB622, bytes([outbox_full_byte]))]) + + if (game_clear[0] & 0x01 == 0x01) and not ctx.finished_game: # Goal should ignore the item queue and textbox check + await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) + ctx.finished_game = True + + for i in range(6): + if scouted_hint_flags[0] & hint_bits[i]: + if i not in self.hint_list: + scoutable_hint = await snes_read(ctx, HINT_SCOUNT_IDS + (i * 3), 3) + if not scoutable_hint[2]: + scoutable_hint = (int.from_bytes(scoutable_hint[:2], byteorder="little") + 0xEB0000) + self.hint_list.append(i) + await ctx.send_msgs([{"cmd": "CreateHints", "locations": [scoutable_hint], "player": ctx.player}]) + else: + hint = self.slot_data['hint_man_hints'][i] + await ctx.send_msgs([{"cmd": "CreateHints", "locations": [hint[0]], "player": hint[1]}]) + self.hint_list.append(i) + + if shop_scout[0] and shop_scouts_enabled[0]: + shop_slots = [] + for i in range(7): + slot_id = (0xEB0FF9 + (shop_scout[0] * 7) + i) + if slot_id in ctx.server_locations and slot_id not in self.hinted_shop_locations: + shop_slots.append(slot_id) + + if shop_slots: + if shop_scouts_enabled[0] == 2: + await ctx.send_msgs([{"cmd": "CreateHints", "locations": shop_slots, "player": ctx.slot}]) + await snes_write(ctx, [(WRAM_START + 0x0770, bytes([0x00]))]) + else: + prog_shops = [] + await ctx.send_msgs([{"cmd": "LocationScouts", "locations": shop_slots, "create_as_hint": 0}]) + for location in shop_slots: + if location in ctx.locations_info: + self.hinted_shop_locations.append(location) + if ctx.locations_info[location].flags & 0x01: + prog_shops.append(location) + if prog_shops: + await ctx.send_msgs([{"cmd": "CreateHints", "locations": prog_shops, "player": ctx.slot}]) + + melody_data = f"{ctx.team}_{ctx.slot}_melody_status" + earth_power_data = f"{ctx.team}_{ctx.slot}_earthpower" + current_melodies = int.from_bytes(melody_table, "little") + earth_power_state = int.from_bytes(earth_power_absorbed, "little") + + if melody_data not in ctx.stored_data or (ctx.stored_data[melody_data] != current_melodies) or (ctx.stored_data[earth_power_data] != earth_power_state): + await ctx.send_msgs([{ + "cmd": "Set", + "key": melody_data, + "default": None, + "want_reply": True, + "operations": [{"operation": "replace", "value": int.from_bytes(melody_table, "little")}]}, + { + "cmd": "Set", + "key": earth_power_data, + "default": None, + "want_reply": True, + "operations": [{"operation": "replace", "value": int.from_bytes(earth_power_absorbed, "little")}] + }]) + + # death link handling goes here + if "DeathLink" in ctx.tags and ctx.last_death_link + 1 < time.time(): + send_deathlink = await snes_read(ctx, PLAYER_JUST_DIED_SEND_DEATHLINK, 1) + currently_dead = send_deathlink[0] != 0x00 + if send_deathlink[0] != 0x00: + snes_buffered_write(ctx, PLAYER_JUST_DIED_SEND_DEATHLINK, bytes([0x00])) + await ctx.handle_deathlink_state(currently_dead) + + new_checks = [] + from .game_data.local_data import check_table + + location_ram_data = await snes_read(ctx, WRAM_START + 0x9C00, 0x88) + shop_location_flags = await snes_read(ctx, WRAM_START + 0xB721, 0x41) + for loc_id, loc_data in check_table.items(): + if loc_id not in ctx.locations_checked: + if loc_id >= 0xEB1000: + data = shop_location_flags[loc_data[0]] + else: + data = location_ram_data[loc_data[0]] + masked_data = data & (1 << loc_data[1]) + bit_set = masked_data != 0 + invert_bit = ((len(loc_data) >= 3) and loc_data[2]) + if bit_set != invert_bit and loc_id in ctx.server_locations: + if text_open[0] == 0xFF or shop_scout[0]: # Don't check locations while in a textbox + new_checks.append(loc_id) + + for new_check_id in new_checks: + ctx.locations_checked.add(new_check_id) + location = ctx.location_names.lookup_in_slot(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]}]) + await snes_write(ctx, [(WRAM_START + 0x0770, bytes([0]))]) + + if item_received[0] or special_received[0] != 0x00 or money_received[0] != 0x00: # If processing any item from the server + return + + is_energylink_enabled = await snes_read(ctx, IS_ENERGYLINK_ENABLED, 1) + is_requesting_energy = await snes_read(ctx, WRAM_START + 0x0790, 1) + energy_withdrawal = await snes_read(ctx, WRAM_START + 0x0796, 4) + ctx.set_notify(f"EnergyLink{ctx.team}") + energy = ctx.stored_data.get(f"EnergyLink{ctx.team}", 0) + exchange_rate = 1000000 + if is_energylink_enabled[0]: + + deposited_energy = int.from_bytes(outgoing_energy, byteorder="little") + if deposited_energy: + deposited_energy *= exchange_rate + await snes_write(ctx, [(MONEY_IN_BANK, (0x00).to_bytes(4, byteorder="little"))]) + await ctx.send_msgs([{ + "cmd": "Set", "key": f"EnergyLink{ctx.team}", "slot": ctx.slot, "operations": + [{"operation": "add", "value": deposited_energy}, + {"operation": "max", "value": 0}]}]) + + if is_requesting_energy[0] and energy: # This is just to pull the current number for a display. + energy //= exchange_rate + if energy > 9999999: + energy = 9999999 + cap_flag = await snes_read(ctx, WRAM_START + 0xB623, 1) + cap_flag = int.from_bytes(cap_flag) + cap_flag |= 0x20 + await snes_write(ctx, [(WRAM_START + 0xB623, cap_flag.to_bytes(1, byteorder="little"))]) + + await snes_write(ctx, [(WRAM_START + 0x0792, int(energy).to_bytes(4, byteorder="little"))]) + await snes_write(ctx, [(WRAM_START + 0x0790, (0x00).to_bytes(1, byteorder="little"))]) + + if any(energy_withdrawal) and energy: + withdrawal = int.from_bytes(energy_withdrawal, byteorder="little") + withdrawal *= exchange_rate + energy = ctx.stored_data.get(f"EnergyLink{ctx.team}", 0) # Refresh the value + + if withdrawal > energy: + energy_success = 2 + withdrawal = energy + else: + energy_success = 1 + + await snes_write(ctx, [(WRAM_START + 0x97D0, (withdrawal // exchange_rate).to_bytes(4, byteorder="little"))]) + await snes_write(ctx, [(WRAM_START + 0x0796, (0x00).to_bytes(4, byteorder="little"))]) + await ctx.send_msgs([{ + "cmd": "Set", "key": f"EnergyLink{ctx.team}", "slot": ctx.slot, "operations": + [{"operation": "add", "value": (withdrawal * -1)}, + {"operation": "max", "value": 0}]}]) + await snes_write(ctx, [(WRAM_START + 0x079A, energy_success.to_bytes(1, byteorder="little"))]) # Signal the game to continue + + if cur_script[0]: # Stop items during cutscenes + return + + recv_count = await snes_read(ctx, ITEMQUEUE_HIGH, 2) + recv_index = struct.unpack("H", recv_count)[0] + if recv_index < len(ctx.items_received): + item = ctx.items_received[recv_index] + item_id = (item.item - 0xEB0000) + recv_index += 1 + logging.info('Received %s from %s (%s) (%d/%d in list)' % ( + color(ctx.item_names.lookup_in_slot(item.item), "red", "bold"), + color(ctx.player_names[item.player], 'yellow'), + ctx.location_names.lookup_in_slot(item.location, item.player), recv_index, len(ctx.items_received))) + + snes_buffered_write(ctx, ITEMQUEUE_HIGH, pack("H", recv_index)) + if item_id <= 0xFD: + snes_buffered_write(ctx, WRAM_START + 0xB570, bytes([item_id])) + elif item_id in money_id_table: + snes_buffered_write(ctx, WRAM_START + 0xB5F1, bytes([list(money_id_table).index(item_id) + 1])) + else: + snes_buffered_write(ctx, WRAM_START + 0xB572, bytes([client_specials[item_id]])) + + await snes_flush_writes(ctx) + + +def get_alias(alias: str, slot_name: str) -> str: + try: + index = alias.index(f" ({slot_name}") + except ValueError: + return alias + return alias[:index] diff --git a/worlds/earthbound/Items.py b/worlds/earthbound/Items.py new file mode 100644 index 0000000000..ed57aced11 --- /dev/null +++ b/worlds/earthbound/Items.py @@ -0,0 +1,337 @@ +from typing import Dict, Set, NamedTuple, Optional +from BaseClasses import ItemClassification + + +class ItemData(NamedTuple): + category: str + code: Optional[int] + classification: ItemClassification + amount: int = 1 + + +item_table: Dict[str, ItemData] = { + "Franklin Badge": ItemData("Key Items", 0xEB0001, ItemClassification.progression), + "Teddy Bear": ItemData("Characters", 0xEB0002, ItemClassification.filler, 0), + "Super Plush Bear": ItemData("Characters", 0xEB0003, ItemClassification.useful, 0), + + "Broken Machine": ItemData("Broken Items", 0xEB0004, ItemClassification.useful, 0), + "Broken Gadget": ItemData("Jeff Weapons", 0xEB0005, ItemClassification.useful, 0), + "Broken Air Gun": ItemData("Jeff Weapons", 0xEB0006, ItemClassification.filler, 0), + "Broken Spray Can": ItemData("Broken Items", 0xEB0007, ItemClassification.filler, 0), + "Broken Laser": ItemData("Jeff Weapons", 0xEB0008, ItemClassification.useful, 0), + "Broken Iron": ItemData("Broken Items", 0xEB0009, ItemClassification.filler, 0), + "Broken Pipe": ItemData("Broken Items", 0xEB000A, ItemClassification.useful, 0), + "Broken Cannon": ItemData("Jeff Weapons", 0xEB000B, ItemClassification.useful, 0), + "Broken Tube": ItemData("Broken Items", 0xEB000C, ItemClassification.useful, 0), + "Broken Bazooka": ItemData("Broken Items", 0xEB000D, ItemClassification.useful, 0), + "Broken Trumpet": ItemData("Broken Items", 0xEB000E, ItemClassification.filler, 0), + "Broken Harmonica": ItemData("Jeff Weapons", 0xEB000F, ItemClassification.useful, 0), + "Broken Antenna": ItemData("Jeff Weapons", 0xEB0010, ItemClassification.useful, 0), + + "Cracked Bat": ItemData("Ness Weapons", 0xEB0011, ItemClassification.filler, 0), + "Tee Ball Bat": ItemData("Ness Weapons", 0xEB0012, ItemClassification.filler, 0), + "Sand Lot Bat": ItemData("Ness Weapons", 0xEB0013, ItemClassification.filler, 0), + "Minor League Bat": ItemData("Ness Weapons", 0xEB0014, ItemClassification.filler, 0), + "Mr. Baseball Bat": ItemData("Ness Weapons", 0xEB0015, ItemClassification.useful, 0), + "Big League Bat": ItemData("Ness Weapons", 0xEB00D5, ItemClassification.useful, 0), + "Hall of Fame Bat": ItemData("Ness Weapons", 0xEB0017, ItemClassification.useful, 0), + "Magicant Bat": ItemData("Ness Weapons", 0xEB0018, ItemClassification.useful), + "Legendary Bat": ItemData("Ness Weapons", 0xEB0019, ItemClassification.useful), + "Gutsy Bat": ItemData("Ness Weapons", 0xEB001A, ItemClassification.useful, 0), + "Casey Bat": ItemData("Ness Weapons", 0xEB001B, ItemClassification.filler, 0), + + "Fry Pan": ItemData("Paula Weapons", 0xEB001C, ItemClassification.filler, 0), + "Thick Fry Pan": ItemData("Paula Weapons", 0xEB001D, ItemClassification.filler, 0), + "Deluxe Fry Pan": ItemData("Paula Weapons", 0xEB001E, ItemClassification.filler, 0), + "Chef's Fry Pan": ItemData("Paula Weapons", 0xEB001F, ItemClassification.useful, 0), + "French Fry Pan": ItemData("Paula Weapons", 0xEB0020, ItemClassification.useful, 0), + "Magic Fry Pan": ItemData("Paula Weapons", 0xEB0021, ItemClassification.useful, 0), + "Holy Fry Pan": ItemData("Paula Weapons", 0xEB0022, ItemClassification.useful, 0), + + "Sword of Kings": ItemData("Poo Weapons", 0xEB0023, ItemClassification.useful, 0), + + "Pop Gun": ItemData("Jeff Weapons", 0xEB0024, ItemClassification.filler), + "Stun Gun": ItemData("Jeff Weapons", 0xEB0025, ItemClassification.filler), + "Toy Air Gun": ItemData("Jeff Weapons", 0xEB0026, ItemClassification.filler, 0), + "Magnum Air Gun": ItemData("Jeff Weapons", 0xEB0027, ItemClassification.filler, 0), + "Zip Gun": ItemData("Jeff Weapons", 0xEB0028, ItemClassification.filler, 0), + "Laser Gun": ItemData("Jeff Weapons", 0xEB0029, ItemClassification.filler, 0), + "Hyper Beam": ItemData("Jeff Weapons", 0xEB002A, ItemClassification.useful, 0), + "Crusher Beam": ItemData("Jeff Weapons", 0xEB002B, ItemClassification.useful, 0), + "Spectrum Beam": ItemData("Jeff Weapons", 0xEB002C, ItemClassification.useful, 0), + "Death Ray": ItemData("Jeff Weapons", 0xEB002D, ItemClassification.useful), + "Baddest Beam": ItemData("Jeff Weapons", 0xEB002E, ItemClassification.useful, 0), + "Moon Beam Gun": ItemData("Jeff Weapons", 0xEB002F, ItemClassification.useful), + "Gaia Beam": ItemData("Jeff Weapons", 0xEB0030, ItemClassification.useful, 0), + + "Yo-yo": ItemData("Alt Weapons", 0xEB0031, ItemClassification.filler, 0), + "Slingshot": ItemData("Alt Weapons", 0xEB0032, ItemClassification.filler, 0), + "Bionic Slingshot": ItemData("Alt Weapons", 0xEB0033, ItemClassification.filler, 0), + "Trick Yo-yo": ItemData("Alt Weapons", 0xEB0034, ItemClassification.filler, 0), + "Combat Yo-yo": ItemData("Alt Weapons", 0xEB0035, ItemClassification.filler, 0), + + "Travel Charm": ItemData("Body Equipment", 0xEB0036, ItemClassification.filler), + "Great Charm": ItemData("Body Equipment", 0xEB0037, ItemClassification.filler), + "Crystal Charm": ItemData("Body Equipment", 0xEB0038, ItemClassification.filler, 0), + "Rabbit's Foot": ItemData("Body Equipment", 0xEB0039, ItemClassification.useful), + "Flame Pendant": ItemData("Body Equipment", 0xEB003A, ItemClassification.useful), + "Rain Pendant": ItemData("Body Equipment", 0xEB003B, ItemClassification.useful), + "Night Pendant": ItemData("Body Equipment", 0xEB003C, ItemClassification.useful), + "Sea Pendant": ItemData("Body Equipment", 0xEB003D, ItemClassification.useful), + "Star Pendant": ItemData("Body Equipment", 0xEB003E, ItemClassification.useful, 0), + "Cloak of Kings": ItemData("Poo Equipment", 0xEB003F, ItemClassification.useful), + + "Cheap Bracelet": ItemData("Arm Equipment", 0xEB0040, ItemClassification.filler, 0), + "Copper Bracelet": ItemData("Arm Equipment", 0xEB0041, ItemClassification.filler, 0), + "Silver Bracelet": ItemData("Arm Equipment", 0xEB0042, ItemClassification.filler, 0), + "Gold Bracelet": ItemData("Arm Equipment", 0xEB0043, ItemClassification.filler, 0), + "Platinum Band": ItemData("Arm Equipment", 0xEB00D8, ItemClassification.useful), + "Diamond Band": ItemData("Arm Equipment", 0xEB00D9, ItemClassification.useful), + "Pixie's Bracelet": ItemData("Arm Equipment", 0xEB0046, ItemClassification.useful), + "Cherub's Band": ItemData("Arm Equipment", 0xEB0047, ItemClassification.useful), + "Goddess Band": ItemData("Arm Equipment", 0xEB0048, ItemClassification.useful), + "Bracer of Kings": ItemData("Poo Equipment", 0xEB0049, ItemClassification.useful), + + "Baseball Cap": ItemData("Other Equipment", 0xEB004A, ItemClassification.filler, 0), + "Holmes Hat": ItemData("Other Equipment", 0xEB004B, ItemClassification.filler, 0), + "Mr. Baseball Cap": ItemData("Other Equipment", 0xEB004C, ItemClassification.filler, 0), + "Hard Hat": ItemData("Other Equipment", 0xEB004D, ItemClassification.filler, 0), + "Ribbon": ItemData("Ribbons", 0xEB004E, ItemClassification.filler, 0), + "Red Ribbon": ItemData("Ribbons", 0xEB004F, ItemClassification.filler, 0), + "Goddess Ribbon": ItemData("Ribbons", 0xEB0050, ItemClassification.useful, 0), + "Coin of Slumber": ItemData("Other Equipment", 0xEB0051, ItemClassification.useful), + "Coin of Defense": ItemData("Other Equipment", 0xEB0052, ItemClassification.useful, 0), + "Lucky Coin": ItemData("Other Equipment", 0xEB0053, ItemClassification.useful, 0), + "Talisman Coin": ItemData("Other Equipment", 0xEB0054, ItemClassification.useful, 0), + "Shiny Coin": ItemData("Other Equipment", 0xEB0055, ItemClassification.useful, 0), + "Souvenir Coin": ItemData("Other Equipment", 0xEB0056, ItemClassification.useful), + "Diadem of Kings": ItemData("Poo Equipment", 0xEB0057, ItemClassification.useful), + + "Cookie": ItemData("Food", 0xEB0058, ItemClassification.filler, 0), + "Bag of Fries": ItemData("Food", 0xEB0059, ItemClassification.filler, 0), + "Hamburger": ItemData("Food", 0xEB005A, ItemClassification.filler, 0), + "Boiled Egg": ItemData("Food", 0xEB005B, ItemClassification.filler, 0), + "Fresh Egg": ItemData("Food", 0xEB005C, ItemClassification.filler, 0), + "Picnic Lunch": ItemData("Food", 0xEB005D, ItemClassification.filler, 0), + "Pasta di Summers": ItemData("Food", 0xEB005E, ItemClassification.filler, 0), + "Pizza": ItemData("Food", 0xEB005F, ItemClassification.filler, 0), + "Chef's Special": ItemData("Food", 0xEB0060, ItemClassification.filler, 0), + "Large Pizza": ItemData("Food", 0xEB0061, ItemClassification.filler, 0), + "PSI Caramel": ItemData("Food", 0xEB0062, ItemClassification.useful, 0), + "Magic Truffle": ItemData("Food", 0xEB0063, ItemClassification.useful, 0), + "Brain Food Lunch": ItemData("Food", 0xEB0064, ItemClassification.useful, 0), + "Rock Candy": ItemData("Food", 0xEB0065, ItemClassification.useful, 0), + "Croissant": ItemData("Food", 0xEB0066, ItemClassification.filler, 0), + "Bread Roll": ItemData("Food", 0xEB0067, ItemClassification.filler, 0), + + "Pak of Bubble Gum": ItemData("Key Items", 0xEB0068, ItemClassification.progression), + "Jar of Fly Honey": ItemData("Key Items", 0xEB0069, ItemClassification.progression), + + "Can of Fruit Juice": ItemData("Food", 0xEB006A, ItemClassification.filler, 0), + "Royal Iced Tea": ItemData("Food", 0xEB006B, ItemClassification.filler, 0), + "Protein Drink": ItemData("Food", 0xEB006C, ItemClassification.filler, 0), + "Kraken Soup": ItemData("Food", 0xEB006D, ItemClassification.filler, 0), + "Bottle of Water": ItemData("Food", 0xEB006E, ItemClassification.filler, 0), + "Cold Remedy": ItemData("Status Heal", 0xEB006F, ItemClassification.filler, 0), + "Vial of Serum": ItemData("Status Heal", 0xEB0070, ItemClassification.filler, 0), + "IQ Capsule": ItemData("Food", 0xEB0071, ItemClassification.useful, 0), + "Guts Capsule": ItemData("Food", 0xEB0072, ItemClassification.useful, 0), + "Speed Capsule": ItemData("Food", 0xEB0073, ItemClassification.useful, 0), + "Vital Capsule": ItemData("Food", 0xEB0074, ItemClassification.useful, 0), + "Luck Capsule": ItemData("Food", 0xEB0075, ItemClassification.useful, 0), + "Ketchup Packet": ItemData("Condiments", 0xEB0076, ItemClassification.filler, 0), + "Sugar Packet": ItemData("Condiments", 0xEB0077, ItemClassification.filler, 0), + "Tin of Cocoa": ItemData("Condiments", 0xEB0078, ItemClassification.filler, 0), + "Carton of Cream": ItemData("Condiments", 0xEB0079, ItemClassification.filler, 0), + "Sprig of Parsley": ItemData("Condiments", 0xEB007A, ItemClassification.filler, 0), + "Jar of Hot Sauce": ItemData("Condiments", 0xEB007B, ItemClassification.filler, 0), + "Salt Packet": ItemData("Condiments", 0xEB007C, ItemClassification.filler, 0), + "Tiny Key": ItemData("Key Items", 0xEB007D, ItemClassification.progression), # Progressive Gun + "Jar of Delisauce": ItemData("Condiments", 0xEB007E, ItemClassification.useful, 0), + "Wet Towel": ItemData("Status Heal", 0xEB007F, ItemClassification.filler, 0), + "Refreshing Herb": ItemData("Status Heal", 0xEB0080, ItemClassification.useful, 0), + "Secret Herb": ItemData("Status Heal", 0xEB0081, ItemClassification.useful, 0), + "Horn of Life": ItemData("Status Heal", 0xEB0082, ItemClassification.useful, 0), + + "Counter-PSI Unit": ItemData("Jeff Items", 0xEB0083, ItemClassification.useful, 0), + "Shield Killer": ItemData("Jeff Items", 0xEB0084, ItemClassification.useful, 0), + "Bazooka": ItemData("Jeff Items", 0xEB0085, ItemClassification.useful, 0), + "Heavy Bazooka": ItemData("Jeff Items", 0xEB0086, ItemClassification.useful, 0), + "HP-Sucker": ItemData("Jeff Items", 0xEB0087, ItemClassification.useful), + "Hungry HP-Sucker": ItemData("Jeff Items", 0xEB0088, ItemClassification.useful, 0), + "Xterminator Spray": ItemData("Battle Items", 0xEB0089, ItemClassification.useful, 0), + "Slime Generator": ItemData("Jeff Items", 0xEB008A, ItemClassification.useful, 0), + "Yogurt Dispenser": ItemData("Key Items", 0xEB008B, ItemClassification.progression), + + "Ruler": ItemData("Battle Items", 0xEB008C, ItemClassification.filler, 0), + "Snake Bag": ItemData("Battle Items", 0xEB008D, ItemClassification.filler, 0), + "Mummy Wrap": ItemData("Battle Items", 0xEB008E, ItemClassification.filler, 0), + "Protractor": ItemData("Battle Items", 0xEB008F, ItemClassification.filler, 0), + "Bottle Rocket": ItemData("Jeff Items", 0xEB0090, ItemClassification.filler, 0), + "Big Bottle Rocket": ItemData("Jeff Items", 0xEB0091, ItemClassification.useful, 0), + "Multi Bottle Rocket": ItemData("Jeff Items", 0xEB0092, ItemClassification.useful, 0), + "Bomb": ItemData("Battle Items", 0xEB0093, ItemClassification.filler, 0), + "Super Bomb": ItemData("Battle Items", 0xEB0094, ItemClassification.useful, 0), + "Insecticide Spray": ItemData("Battle Items", 0xEB0095, ItemClassification.filler, 0), + "Rust Promoter": ItemData("Battle Items", 0xEB0096, ItemClassification.filler, 0), + "Rust Promoter DX": ItemData("Battle Items", 0xEB0097, ItemClassification.useful, 0), + "Pair of Dirty Socks": ItemData("Battle Items", 0xEB0098, ItemClassification.filler, 0), + "Stag Beetle": ItemData("Battle Items", 0xEB0099, ItemClassification.filler, 0), + "Toothbrush": ItemData("Battle Items", 0xEB009A, ItemClassification.filler, 0), + "Handbag Strap": ItemData("Battle Items", 0xEB009B, ItemClassification.filler, 0), + "Pharaoh's Curse": ItemData("Battle Items", 0xEB009C, ItemClassification.filler, 0), + "Defense Shower": ItemData("Battle Items", 0xEB009D, ItemClassification.useful, 0), + + "UFO Engine": ItemData("Key Items", 0xEB009E, ItemClassification.progression), + "Sudden Guts Pill": ItemData("Battle Items", 0xEB009F, ItemClassification.useful, 0), + "Bag of Dragonite": ItemData("Battle Items", 0xEB00A0, ItemClassification.useful, 0), + "Defense Spray": ItemData("Battle Items", 0xEB00A1, ItemClassification.filler, 0), + + "Piggy Nose": ItemData("Key Items", 0xEB00A2, ItemClassification.progression), + "For Sale Sign": ItemData("Field Items", 0xEB00A3, ItemClassification.filler), + "Shyness Book": ItemData("Key Items", 0xEB00A4, ItemClassification.progression), + "Picture Postcard": ItemData("Field Items", 0xEB00A5, ItemClassification.filler, 0), + "King Banana": ItemData("Key Items", 0xEB00A6, ItemClassification.progression), + "Letter For Tony": ItemData("Key Items", 0xEB00A7, ItemClassification.progression), + "Chick": ItemData("Field Items", 0xEB00A8, ItemClassification.filler, 0), + "Chicken": ItemData("Field Items", 0xEB00A9, ItemClassification.filler, 0), + "Key to the Shack": ItemData("Key Items", 0xEB00AA, ItemClassification.progression), + "Key to the Cabin": ItemData("Key Items", 0xEB00AB, ItemClassification.progression), + "Bad Key Machine": ItemData("Key Items", 0xEB00AC, ItemClassification.progression), + # "Archipelago Item": ItemData("Key Items", 0xEB00AD, ItemClassification.progression, 0), + "Zombie Paper": ItemData("Key Items", 0xEB00AE, ItemClassification.progression), + "Hawk Eye": ItemData("Key Items", 0xEB00AF, ItemClassification.progression), + "Bicycle": ItemData("Key Items", 0xEB00B0, ItemClassification.useful), + "ATM Card": ItemData("Key Items", 0xEB00B1, ItemClassification.progression, 0), + "Show Ticket": ItemData("Key Items", 0xEB00B2, ItemClassification.filler, 0), + "Tenda Lavapants": ItemData("Key Items", 0xEB00B3, ItemClassification.progression), # Progressive Bat + "Wad of Bills": ItemData("Key Items", 0xEB00B4, ItemClassification.progression), + "Warp Pad": ItemData("Key Items", 0xEB00B5, ItemClassification.progression, 0), + "Diamond": ItemData("Key Items", 0xEB00B6, ItemClassification.progression), + "Signed Banana": ItemData("Key Items", 0xEB00B7, ItemClassification.progression), + "Pencil Eraser": ItemData("Key Items", 0xEB00B8, ItemClassification.progression), + "Hieroglyph Copy": ItemData("Key Items", 0xEB00B9, ItemClassification.progression), + "Meteotite": ItemData("Field Items", 0xEB00BA, ItemClassification.useful, 0), + "Contact Lens": ItemData("Key Items", 0xEB00BB, ItemClassification.progression), + + "Hand-Aid": ItemData("Food", 0xEB00BC, ItemClassification.useful), + "Trout Yogurt": ItemData("Food", 0xEB00BD, ItemClassification.filler, 0), + "Banana": ItemData("Food", 0xEB00BE, ItemClassification.filler, 0), + "Calorie Stick": ItemData("Food", 0xEB00BF, ItemClassification.filler, 0), + "Key to the Tower": ItemData("Key Items", 0xEB00C0, ItemClassification.progression), + "Meteorite Piece": ItemData("Key Items", 0xEB00C1, ItemClassification.progression), + + "Earth Pendant": ItemData("Body Equipment", 0xEB00C2, ItemClassification.useful, 0), + "Neutralizer": ItemData("Jeff Items", 0xEB00C3, ItemClassification.useful), + "Sound Stone": ItemData("Key Items", 0xEB00C4, ItemClassification.progression, 0), + "Exit Mouse": ItemData("Key Items", 0xEB00C5, ItemClassification.useful, 0), + + "Gelato de Resort": ItemData("Food", 0xEB00C6, ItemClassification.filler, 0), + "Snake": ItemData("Battle Items", 0xEB00C7, ItemClassification.filler, 0), + "Viper": ItemData("Battle Items", 0xEB00C8, ItemClassification.filler, 0), + "Brain Stone": ItemData("Battle Items", 0xEB00C9, ItemClassification.filler), + "Police Badge": ItemData("Key Items", 0xEB00CA, ItemClassification.progression), + "Mining Permit": ItemData("Key Items", 0xEB00CB, ItemClassification.progression), + "Suporma": ItemData("Field Items", 0xEB00CC, ItemClassification.trap), + "Key to the Locker": ItemData("Key Items", 0xEB00CD, ItemClassification.progression), + "Insignificant Item": ItemData("Key Items", 0xEB00CE, ItemClassification.progression), + "Magic Tart": ItemData("Food", 0xEB00CF, ItemClassification.useful, 0), + "Tiny Ruby": ItemData("Key Items", 0xEB00D0, ItemClassification.progression), + "Monkey's Love": ItemData("Battle Items", 0xEB00D1, ItemClassification.useful), + "Eraser Eraser": ItemData("Key Items", 0xEB00D2, ItemClassification.progression), + "Tendakraut": ItemData("Key Items", 0xEB00D3, ItemClassification.progression), + + "T-Rex's Bat": ItemData("Ness Weapons", 0xEB00D4, ItemClassification.useful, 0), + # "Big League Bat": ItemData("Ness Weapons", 0xEB0016, ItemClassification.useful, 0), Summers copy + "Ultimate Bat": ItemData("Ness Weapons", 0xEB00D6, ItemClassification.useful, 0), + "Double Beam": ItemData("Jeff Weapons", 0xEB00D7, ItemClassification.useful, 0), + # "Platinum Band": ItemData("Arm Equipment", 0xEB00D8, ItemClassification.useful, 0), Summers copy + # "Diamond Band": ItemData("Arm Equipment", 0xEB00D9, ItemClassification.useful, 0), Summers Copy + "Defense Ribbon": ItemData("Ribbons", 0xEB00DA, ItemClassification.useful, 0), + "Talisman Ribbon": ItemData("Ribbons", 0xEB00DB, ItemClassification.useful), + "Saturn Ribbon": ItemData("Ribbons", 0xEB00DC, ItemClassification.useful), + "Coin of Silence": ItemData("Other Equipment", 0xEB00DD, ItemClassification.useful, 0), + "Charm Coin": ItemData("Other Equipment", 0xEB00DE, ItemClassification.useful, 0), + + "Cup of Noodles": ItemData("Food", 0xEB00DF, ItemClassification.filler, 0), + "Repel Sandwich": ItemData("Food", 0xEB00E0, ItemClassification.useful, 0), + "Repel Superwich": ItemData("Food", 0xEB00E1, ItemClassification.useful, 0), + "Lucky Sandwich": ItemData("Food", 0xEB00E2, ItemClassification.useful, 0), + "Progressive Bat": ItemData("Progressive Equipment", 0xEB00E3, ItemClassification.useful, 0), + "Progressive Fry Pan": ItemData("Progressive Equipment", 0xEB00E4, ItemClassification.useful, 0), + "Progressive Gun": ItemData("Progressive Equipment", 0xEB00E5, ItemClassification.useful, 0), + "Progressive Bracelet": ItemData("Progressive Equipment", 0xEB00E6, ItemClassification.useful, 0), + "Progressive Other": ItemData("Progressive Equipment", 0xEB00E7, ItemClassification.useful, 0), + + "Cup of Coffee": ItemData("Food", 0xEB00E8, ItemClassification.filler, 0), + "Double Burger": ItemData("Food", 0xEB00E9, ItemClassification.filler, 0), + "Peanut Cheese Bar": ItemData("Food", 0xEB00EA, ItemClassification.filler, 0), + "Piggy Jelly": ItemData("Food", 0xEB00EB, ItemClassification.filler, 0), + "Bowl of Rice Gruel": ItemData("Food", 0xEB00EC, ItemClassification.filler, 0), + "Bean Croquette": ItemData("Food", 0xEB00ED, ItemClassification.filler, 0), + "Molokheiya Soup": ItemData("Food", 0xEB00EE, ItemClassification.filler, 0), + "Plain Roll": ItemData("Food", 0xEB00EF, ItemClassification.filler, 0), + "Kabob": ItemData("Food", 0xEB00F0, ItemClassification.filler, 0), + "Plain Yogurt": ItemData("Food", 0xEB00F1, ItemClassification.filler, 0), + "Beef Jerky": ItemData("Food", 0xEB00F2, ItemClassification.filler, 0), + "Mammoth Burger": ItemData("Food", 0xEB00F3, ItemClassification.filler, 0), + "Spicy Jerky": ItemData("Food", 0xEB00F4, ItemClassification.filler, 0), + "Luxury Jerky": ItemData("Food", 0xEB00F5, ItemClassification.filler, 0), + "Bottle of DXwater": ItemData("Food", 0xEB00F6, ItemClassification.useful, 0), + "Magic Pudding": ItemData("Food", 0xEB00F7, ItemClassification.useful, 0), + + "Non-Stick Frypan": ItemData("Paula Weapons", 0xEB00F8, ItemClassification.useful, 0), + "Mr. Saturn Coin": ItemData("Other Equipment", 0xEB00F9, ItemClassification.useful), + "Meteornium": ItemData("Field Items", 0xEB00FA, ItemClassification.useful, 0), + "Popsicle": ItemData("Food", 0xEB00FB, ItemClassification.filler, 0), + "Cup of Lifenoodles": ItemData("Status Heal", 0xEB00FC, ItemClassification.useful, 0), + "Carrot Key": ItemData("Key Items", 0xEB00FD, ItemClassification.progression), + + "Onett Teleport": ItemData("PSI", 0xEB00FE, ItemClassification.progression), + "Twoson Teleport": ItemData("PSI", 0xEB00FF, ItemClassification.progression), + "Happy-Happy Village Teleport": ItemData("PSI", 0xEB0100, ItemClassification.progression), + "Threed Teleport": ItemData("PSI", 0xEB0101, ItemClassification.progression), + "Saturn Valley Teleport": ItemData("PSI", 0xEB0102, ItemClassification.progression), + "Dusty Dunes Teleport": ItemData("PSI", 0xEB0103, ItemClassification.progression), + "Fourside Teleport": ItemData("PSI", 0xEB0104, ItemClassification.progression), + "Winters Teleport": ItemData("PSI", 0xEB0105, ItemClassification.progression), + "Summers Teleport": ItemData("PSI", 0xEB0106, ItemClassification.progression), + "Scaraba Teleport": ItemData("PSI", 0xEB0107, ItemClassification.progression), + "Dalaam Teleport": ItemData("PSI", 0xEB0108, ItemClassification.progression), + "Deep Darkness Teleport": ItemData("PSI", 0xEB0109, ItemClassification.progression), + "Tenda Village Teleport": ItemData("PSI", 0xEB010A, ItemClassification.progression), + "Lost Underworld Teleport": ItemData("PSI", 0xEB010B, ItemClassification.progression), + "Progressive Poo PSI": ItemData("PSI", 0xEB010C, ItemClassification.useful, 2), + "Magicant Teleport": ItemData("PSI", 0xEB010D, ItemClassification.progression), + + "Paula": ItemData("Characters", 0xEB010E, ItemClassification.progression), + "Jeff": ItemData("Characters", 0xEB010F, ItemClassification.progression), + "Poo": ItemData("Characters", 0xEB0110, ItemClassification.progression), + "Flying Man": ItemData("Characters", 0xEB0111, ItemClassification.useful), + "Ness": ItemData("Characters", 0xEB0112, ItemClassification.progression), + "Photograph": ItemData("Photos", 0xEB0113, ItemClassification.trap, 0), + + "$10": ItemData("Money", 0xEB0114, ItemClassification.filler, 0), + "$100": ItemData("Money", 0xEB0115, ItemClassification.filler, 0), + "$1000": ItemData("Money", 0xEB0116, ItemClassification.useful, 0), + + 'Threed Tunnels Clear': ItemData('Events', None, ItemClassification.progression, 0), + 'Submarine to Deep Darkness': ItemData('Events', None, ItemClassification.progression, 0), + 'Melody': ItemData('Events', None, ItemClassification.progression, 0), + 'Saved Earth': ItemData('Events', None, ItemClassification.progression, 0), + "Power of the Earth": ItemData("Events", None, ItemClassification.progression, 0), + "Alternate Goal": ItemData("Events", None, ItemClassification.useful, 0), + "Valley Bridge Repair": ItemData("Events", None, ItemClassification.progression, 0), + "Magicant Unlock": ItemData("Events", None, ItemClassification.progression, 0), + "ATM Access": ItemData("Events", None, ItemClassification.progression, 0) +} + + +def get_item_names_per_category() -> Dict[str, Set[str]]: + categories: Dict[str, Set[str]] = {} + + for name, data in item_table.items(): + if data.category != "Events": + categories.setdefault(data.category, set()).add(name) + + return categories diff --git a/worlds/earthbound/Locations.py b/worlds/earthbound/Locations.py new file mode 100644 index 0000000000..8b5e5f78cd --- /dev/null +++ b/worlds/earthbound/Locations.py @@ -0,0 +1,594 @@ +from typing import List, Optional, NamedTuple, TYPE_CHECKING +from .Options import MagicantMode, ShopRandomizer + +if TYPE_CHECKING: + from . import EarthBoundWorld + + +class LocationData(NamedTuple): + region: str + name: str + code: Optional[int] + + +def get_locations(world: "EarthBoundWorld") -> List[LocationData]: + + location_table: List[LocationData] = [ + LocationData("Northern Onett", "Onett - Tracy Gift", 0xEB0000), + LocationData("Northern Onett", "Onett - Tracy's Room Present", 0xEB0001), + LocationData("Northern Onett", "Onett - Hilltop Present", 0xEB0002), + LocationData("Northern Onett", "Onett - Meteor Item", 0xEB0003), + LocationData("Northern Onett", "Onett - Buzz Buzz", 0xEB0004), + LocationData("Northern Onett", "Onett - Mani Mani Statue", 0xEB0005), + LocationData("Onett", "Onett - Library Counter", 0xEB0006), + LocationData("Onett", "Onett - Library Bookshelf", 0xEB0007), + LocationData("Onett", "Onett - Burger Shop Trashcan", 0xEB0008), + LocationData("Onett", "Onett - Treehouse Guy", 0xEB0009), + LocationData("Onett", "Onett - South Road Present", 0xEB000A), + LocationData("Onett", "Onett - Hotel Trashcan", 0xEB000B), + LocationData("Onett", "Onett - Arcade Trashcan", 0xEB000C), + LocationData("Onett", "Onett - Mayor Pirkle", 0xEB000D), + LocationData("Onett", "Onett - Traveling Entertainer", 0xEB000E), + LocationData("Giant Step", "Giant Step - First Cave Present", 0xEB000F), + LocationData("Giant Step", "Giant Step - Floor 2 Cave Present", 0xEB0010), + LocationData("Giant Step", "Giant Step - Floor 3 Present", 0xEB0011), + LocationData("Twoson", "Twoson - Bike Shop Rental", 0xEB0012), + LocationData("Twoson", "Twoson - Antique Shop", 0xEB0013), + LocationData("Twoson", "Twoson - Paula's Room Present", 0xEB0014), + LocationData("Twoson", "Twoson - Apple Kid Trashcan", 0xEB0015), + LocationData("Twoson", "Twoson - South of Town Present", 0xEB0016), + LocationData("Twoson", "Twoson - Orange Kid Donation", 0xEB0017), + LocationData("Twoson", "Twoson - Apple Kid Invention", 0xEB0018), + LocationData("Twoson", "Twoson - Apple Kid's Mouse", 0xEB0019), + LocationData("Twoson", "Twoson - Paula's Mother", 0xEB001A), + LocationData("Everdred's House", "Twoson - Everdred Meeting", 0xEB001B), + LocationData("Twoson", "Twoson - Insignificant Location", 0xEB001C), + LocationData("Peaceful Rest Valley", "Peaceful Rest Valley - Split Hill Present", 0xEB001D), + LocationData("Peaceful Rest Valley", "Peaceful Rest Valley - Hill Nook Present", 0xEB001E), + LocationData("Peaceful Rest Valley", "Peaceful Rest Valley - South of Bridge Present", 0xEB001F), + LocationData("Peaceful Rest Valley", "Peaceful Rest Valley - Dead End Present", 0xEB0020), + LocationData("Peaceful Rest Valley", "Peaceful Rest Valley - River Overlook Present", 0xEB0021), + LocationData("Peaceful Rest Valley", "Peaceful Rest Valley - North Side Present", 0xEB0022), + LocationData("Happy-Happy Village", "Happy-Happy Village - Donation Lady", 0xEB0023), + LocationData("Happy-Happy HQ", "Happy-Happy Village - Right HQ Present", 0xEB0024), + LocationData("Happy-Happy HQ", "Happy-Happy Village - Left HQ Present", 0xEB0025), + LocationData("Happy-Happy Village", "Happy-Happy Village - Prisoner Item", 0xEB0026), + LocationData("Happy-Happy Village", "Happy-Happy Village - Prisoner", 0xEB0027), + LocationData("Happy-Happy HQ", "Happy-Happy Village - Defeat Carpainter", 0xEB0028), + LocationData("Lilliput Steps", "Lilliput Steps - Southwest Pool Present", 0xEB0029), + LocationData("Lilliput Steps", "Lilliput Steps - East Cliff Present", 0xEB002A), + LocationData("Lilliput Steps", "Lilliput Steps - North Stream Present", 0xEB002B), + LocationData("Boogey Tent", "Threed - Boogey Tent Trashcan", 0xEB002C), + LocationData("Threed", "Threed - Cemetery Trashcan", 0xEB002D), + LocationData("Threed", "Threed - Downtown Trashcan", 0xEB002E), + LocationData("Threed", "Threed - East Side Trashcan", 0xEB002F), + LocationData("Threed", "Threed - Northeast Shack Trashcan", 0xEB0030), + LocationData("Threed", "Threed - Hospital Drawer", 0xEB0031), + LocationData("Threed", "Threed - Zombie Prisoner", 0xEB0032), + LocationData("Threed Underground", "Threed Underground - Left Coffin", 0xEB0033), + LocationData("Threed Underground", "Threed Underground - Right Coffin", 0xEB0034), + LocationData("Grapefruit Falls", "Grapefruit Falls - South Present", 0xEB0035), + LocationData("Grapefruit Falls", "Grapefruit Falls - North Present", 0xEB0036), + LocationData("Grapefruit Falls", "Grapefruit Falls - Saturn Cave Present", 0xEB0037), + LocationData("Saturn Valley", "Saturn Valley - Ladder Present", 0xEB0038), + LocationData("Saturn Valley", "Saturn Valley - Trashcan #1", 0xEB0039), + LocationData("Saturn Valley", "Saturn Valley - Trashcan #2", 0xEB003A), + LocationData("Saturn Valley", "Saturn Valley - Trashcan #3", 0xEB003B), + LocationData("Upper Saturn Valley", "Saturn Valley - Saturn Coffee", 0xEB003C), + LocationData("Saturn Valley", "Saturn Valley - Post Belch Gift #1", 0xEB003D), + LocationData("Saturn Valley", "Saturn Valley - Post Belch Gift #2", 0xEB003E), + LocationData("Saturn Valley", "Saturn Valley - Post Belch Gift #3", 0xEB003F), + LocationData("Milky Well", "Milky Well - Cavern Present", 0xEB0040), + LocationData("Belch's Factory", "Belch's Factory - Top Right Room Trashcan", 0xEB0041), + LocationData("Belch's Factory", "Belch's Factory - Pit Room Trashcan #1", 0xEB0042), + LocationData("Belch's Factory", "Belch's Factory - Pit Room Trashcan #2", 0xEB0043), + LocationData("Belch's Factory", "Belch's Factory - Balcony Room Trashcan #1", 0xEB0044), + LocationData("Belch's Factory", "Belch's Factory - Balcony Room Trashcan #2", 0xEB0045), + LocationData("Belch's Factory", "Belch's Factory - Balcony Room Trashcan #3", 0xEB0046), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Northwest Corner Present", 0xEB0047), + LocationData("Dusty Dunes Desert", "Dusty Dunes - South Side Present", 0xEB0048), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Surrounding Rocks Present", 0xEB0049), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Black Sesame Present", 0xEB004A), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Oasis Present", 0xEB004B), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Northeast Corner Present", 0xEB004C), + LocationData("Dusty Dunes Desert", "Dusty Dunes - North Central Present", 0xEB004D), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Shining Spot", 0xEB004E), + LocationData("Dusty Dunes Desert", "Dusty Dunes - East Peninsula Present", 0xEB004F), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Mine Reward", 0xEB0050), + LocationData("Snow Wood Boarding School", "Snow Wood - Many Present Room Present #1", 0xEB0051), + LocationData("Snow Wood Boarding School", "Snow Wood - Many Present Room Present #2", 0xEB0052), + LocationData("Snow Wood Boarding School", "Snow Wood - Many Present Room Present #3", 0xEB0053), + LocationData("Snow Wood Boarding School", "Snow Wood - Many Present Room Present #4", 0xEB0054), + LocationData("Snow Wood Boarding School", "Snow Wood - Many Present Room Present #5", 0xEB0055), + LocationData("Snow Wood Boarding School", "Snow Wood - Many Present Room Present #6", 0xEB0056), + LocationData("Snow Wood Boarding School", "Snow Wood - Many Present Room Present #7", 0xEB0057), + LocationData("Scaraba", "Scaraba - Snake Bag Salesman", 0xEB0058), + LocationData("Snow Wood Boarding School", "Snow Wood - Upper Right Locker", 0xEB0059), + LocationData("Snow Wood Boarding School", "Snow Wood - Upper Left Locker", 0xEB005A), + LocationData("Snow Wood Boarding School", "Snow Wood - Bottom Right Locker", 0xEB005B), + LocationData("Snow Wood Boarding School", "Snow Wood - Bottom Left Locker", 0xEB005C), + LocationData("Snow Wood Boarding School", "Snow Wood - Maxwell Item", 0xEB005D), + LocationData("Snow Wood Boarding School", "Snow Wood - Bedroom", 0xEB005E), + LocationData("Winters", "Winters - Drugstore Saleswoman", 0xEB005F), + LocationData("Brickroad Maze", "Brick Road Maze - Top Path Present", 0xEB0060), + LocationData("Brickroad Maze", "Brick Road Maze - Guarded Present", 0xEB0061), + LocationData("Brickroad Maze", "Brick Road Maze - Out of the Way Present", 0xEB0062), + LocationData("Brickroad Maze", "Brick Road Maze - Alcove Present", 0xEB0063), + LocationData("Brickroad Maze", "Brick Road Maze - Near Exit Present", 0xEB0064), + LocationData("Rainy Circle", "Rainy Circle - Isolated Present", 0xEB0065), + LocationData("Rainy Circle", "Rainy Circle - East Cliff Present", 0xEB0066), + LocationData("Rainy Circle", "Rainy Circle - Near Ropes Present", 0xEB0067), + LocationData("Andonuts Lab Area", "Andonuts Lab - Present", 0xEB0068), + LocationData("Andonuts Lab Area", "Andonuts Lab - Mouse", 0xEB0069), + LocationData("Stonehenge Base", "Stonehenge - Purple Maze Present", 0xEB006A), + LocationData("Stonehenge Base", "Stonehenge - Dead End Present", 0xEB006B), + LocationData("Stonehenge Base", "Stonehenge - Near End of the Maze Present", 0xEB006C), + LocationData("Stonehenge Base", "Stonehenge - Bridge Room East Balcony Present", 0xEB006D), + LocationData("Stonehenge Base", "Stonehenge - Bridge Room Lower Present", 0xEB006E), + LocationData("Stonehenge Base", "Stonehenge - Flashing Room Right Path Present", 0xEB006F), + LocationData("Stonehenge Base", "Stonehenge - Flashing Room Center Present", 0xEB0070), + LocationData("Stonehenge Base", "Stonehenge - Flashing Room Upper Present", 0xEB0071), + LocationData("Stonehenge Base", "Stonehenge - Kidnapped Mr. Saturn", 0xEB0072), + LocationData("Stonehenge Base", "Stonehenge - Tony Item", 0xEB0073), + LocationData("Gold Mine", "Gold Mine - Mouse Crossroad Present #1", 0xEB0074), + LocationData("Gold Mine", "Gold Mine - Mouse Crossroad Present #2", 0xEB0075), + LocationData("Gold Mine", "Gold Mine - B1F Lonely Mole Present", 0xEB0076), + LocationData("Gold Mine", "Gold Mine - South Hall Present", 0xEB0077), + LocationData("Gold Mine", "Gold Mine - South Corner Present", 0xEB0078), + LocationData("Gold Mine", "Gold Mine - South Mole Present #1", 0xEB0079), + LocationData("Gold Mine", "Gold Mine - South Mole Present #2", 0xEB007A), + LocationData("Gold Mine", "Gold Mine - North Crossroad Detour Present", 0xEB007B), + LocationData("Gold Mine", "Gold Mine - North Mole Present", 0xEB007C), + LocationData("Gold Mine", "Gold Mine - West Mole Present", 0xEB007D), + LocationData("Gold Mine", "Gold Mine - B1F Isolated Present", 0xEB007E), + LocationData("Gold Mine", "Gold Mine - West Crossroad Detour Present", 0xEB007F), + LocationData("Gold Mine", "Gold Mine - B1F Junction Present", 0xEB0080), + LocationData("Gold Mine", "Gold Mine - B1F Junction Mole Present", 0xEB0081), + LocationData("Monkey Caves", "Monkey Caves - 1F Right Chest", 0xEB00F1), + LocationData("Monkey Caves", "Monkey Caves - 1F Left Chest", 0xEB00F2), + LocationData("Monkey Caves", "Monkey Caves - West 2F Left Chest", 0xEB00F3), + LocationData("Monkey Caves", "Monkey Caves - West 2F Right Chest #1", 0xEB00F4), + LocationData("Monkey Caves", "Monkey Caves - West 2F Right Chest #2", 0xEB00F5), + LocationData("Monkey Caves", "Monkey Caves - East 2F Left Chest", 0xEB00F6), + LocationData("Monkey Caves", "Monkey Caves - East 2F Right Chest", 0xEB00F7), + LocationData("Monkey Caves", "Monkey Caves - East West 3F Right Chest #1", 0xEB00F8), + LocationData("Monkey Caves", "Monkey Caves - East West 3F Right Chest #2", 0xEB00F9), + LocationData("Monkey Caves", "Monkey Caves - West End Chest", 0xEB0082), + LocationData("Monkey Caves", "Monkey Caves - West End Trashcan", 0xEB0083), + LocationData("Monkey Caves", "Monkey Caves - East End Chest", 0xEB0084), + LocationData("Monkey Caves", "Monkey Caves - East End Trashcan", 0xEB0085), + LocationData("Monkey Caves", "Monkey Caves - Bow Monkey Gift", 0xEB0086), + LocationData("Monkey Caves", "Monkey Caves - Talah Rama Chest #1", 0xEB0087), + LocationData("Monkey Caves", "Monkey Caves - Talah Rama Chest #2", 0xEB0088), + LocationData("Monkey Caves", "Monkey Caves - Talah Rama Gift", 0xEB0089), + LocationData("Monkey Caves", "Monkey Caves - Monkey Power", 0xEB008A), + LocationData("Fourside", "Fourside - Venus Gift", 0xEB008B), + LocationData("Moonside", "Fourside - Post-Moonside Delivery", 0xEB008C), + LocationData("Fourside", "Fourside - Bakery 2F Gift", 0xEB008D), + LocationData("Moonside", "Moonside - Two Trees Present", 0xEB008E), + LocationData("Moonside", "Moonside - East Island Present", 0xEB008F), + LocationData("Moonside", "Moonside - Businessman Present", 0xEB0090), + LocationData("Moonside", "Moonside - West Island Present", 0xEB0091), + LocationData("Moonside", "Moonside - Hospital Present", 0xEB0092), + LocationData("Fourside Dept. Store", "Fourside - Department Store Blackout", 0xEB0093), + LocationData("Magnet Hill", "Magnet Hill - West Entrance Trashcan", 0xEB0094), + LocationData("Magnet Hill", "Magnet Hill - First Room Free Door Trashcan", 0xEB0095), + LocationData("Magnet Hill", "Magnet Hill - First Room Barrel Door Trashcan", 0xEB0096), + LocationData("Magnet Hill", "Magnet Hill - Second Room Dead End Trashcan", 0xEB0097), + LocationData("Magnet Hill", "Magnet Hill - Final Room Door Trashcan", 0xEB0098), + LocationData("Magnet Hill", "Fourside - Magnet Hill Chest", 0xEB0099), + LocationData("Monotoli Building", "Monotoli Building - One Table Present", 0xEB009A), + LocationData("Monotoli Building", "Monotoli Building - Two Table Present", 0xEB009B), + LocationData("Monotoli Building", "Monotoli Building - Electra Gift", 0xEB009C), + LocationData("Monotoli Building", "Monotoli Building - Monotoli Gift", 0xEB009D), + LocationData("Monotoli Building", "Monotoli Building - Monotoli Character", 0xEB009E), + LocationData("Summers Museum", "Summers - Museum Item", 0xEB009F), + LocationData("Summers", "Summers - Magic Cake", 0xEB00A0), + LocationData("Dalaam", "Dalaam - Throne Room Chest #1", 0xEB00A1), + LocationData("Dalaam", "Dalaam - Throne Room Chest #2", 0xEB00A2), + LocationData("Dalaam", "Dalaam - Throne Room Chest #3", 0xEB00A3), + LocationData("Dalaam", "Dalaam - Trial of Mu", 0xEB00A4), + LocationData("Dalaam", "Dalaam - Restaurant Chest #1", 0xEB00A5), + LocationData("Dalaam", "Dalaam - Restaurant Chest #2", 0xEB00A6), + LocationData("Dalaam", "Dalaam - Do Do Guy's House Chest", 0xEB00A7), + LocationData("Dalaam", "Dalaam - Upper House Chest", 0xEB00A8), + LocationData("Dalaam", "Dalaam - Throne Character", 0xEB00A9), + LocationData("Ness's Mind", "Poo - Starting Item", 0xEB00AA), + LocationData("Pink Cloud", "Pink Cloud - Three Holes Present", 0xEB00AB), + LocationData("Pink Cloud", "Pink Cloud - Left Hole Present", 0xEB00AC), + LocationData("Pink Cloud", "Pink Cloud - Ground Floor Present", 0xEB00AD), + LocationData("Pyramid", "Pyramid - Anteroom Sarcophagus", 0xEB00AE), + LocationData("Pyramid", "Pyramid - Northwest Door Sarcophagus", 0xEB00AF), + LocationData("Pyramid", "Pyramid - Hallway Sarcophagus #1", 0xEB00B0), + LocationData("Pyramid", "Pyramid - Hallway Sarcophagus #2", 0xEB00B1), + LocationData("Pyramid", "Pyramid - Switch Room Sarcophagus", 0xEB00B2), + LocationData("Pyramid", "Pyramid - Pedestal Item", 0xEB00B3), + LocationData("Pyramid", "Pyramid - Way Out Sarcophagus", 0xEB00B4), + LocationData("Southern Scaraba", "Scaraba - Star Master", 0xEB00B5), + LocationData("Southern Scaraba", "Scaraba - Key Holder", 0xEB00B6), + LocationData("Dungeon Man", "Dungeon Man - 1F Dead End Present", 0xEB00B7), + LocationData("Dungeon Man", "Dungeon Man - 1F Long Walk Present", 0xEB00B8), + LocationData("Dungeon Man", "Dungeon Man - 1F Disappointing Present", 0xEB00B9), + LocationData("Dungeon Man", "Dungeon Man - 1F Opinion Present", 0xEB00BA), + LocationData("Dungeon Man", "Dungeon Man - 1F No Sign Present", 0xEB00BB), + LocationData("Dungeon Man", "Dungeon Man - 2F Unnecessary Billboard Present", 0xEB00BC), + LocationData("Dungeon Man", "Dungeon Man - 2F Dungeon Exploration Present", 0xEB00BD), + LocationData("Dungeon Man", "Dungeon Man - 2F South Ledge Present", 0xEB00BE), + LocationData("Dungeon Man", "Dungeon Man - 2F North Alcove Present", 0xEB00BF), + LocationData("Dungeon Man", "Dungeon Man - 3F Present", 0xEB00C0), + LocationData("Dungeon Man", "Dungeon Man - 2F Hole Present", 0xEB00C1), + LocationData("Dungeon Man", "Dungeon Man - 1F Exit Ledge Present", 0xEB00C2), + LocationData("Deep Darkness", "Deep Darkness - Teleporting Monkey", 0xEB00C3), + LocationData("Deep Darkness", "Deep Darkness - Crest of Darkness Present", 0xEB00C4), + LocationData("Deep Darkness Darkness", "Deep Darkness - Helicopter Present", 0xEB00C5), + LocationData("Deep Darkness Darkness", "Deep Darkness - Yellow Bird Present", 0xEB00C6), + LocationData("Deep Darkness Darkness", "Deep Darkness - Swamp Present", 0xEB00C7), + LocationData("Deep Darkness Darkness", "Deep Darkness - Corner Present", 0xEB00C8), + LocationData("Deep Darkness Darkness", "Deep Darkness - Alcove Present", 0xEB00C9), + LocationData("Deep Darkness Darkness", "Deep Darkness - North Alcove Truffle", 0xEB00CA), + LocationData("Deep Darkness Darkness", "Deep Darkness - Near Land Truffle", 0xEB00CB), + LocationData("Deep Darkness Darkness", "Deep Darkness - Present Truffle", 0xEB00CC), + LocationData("Deep Darkness Darkness", "Deep Darkness - Village Truffle", 0xEB00CD), + LocationData("Deep Darkness Darkness", "Deep Darkness - Entrance Truffle", 0xEB00CE), + LocationData("Deep Darkness Darkness", "Deep Darkness - Barf Character", 0xEB00CF), + LocationData("Tenda Village", "Tenda Village - Trashcan", 0xEB00D0), + LocationData("Tenda Village", "Tenda Village - Tenda Tea", 0xEB00D1), + LocationData("Tenda Village", "Tenda Village - Tenda Gift", 0xEB00D2), + LocationData("Tenda Village", "Tenda Village - Tenda Gift #2", 0xEB00D3), + LocationData("Lumine Hall", "Lumine Hall - B1F Non-Talkative Rock Present", 0xEB00D4), + LocationData("Lumine Hall", "Lumine Hall - 1F North Path Present", 0xEB00D5), + LocationData("Lumine Hall", "Lumine Hall - B1F Thankful Rock Corner Present", 0xEB00D6), + LocationData("Lumine Hall", "Lumine Hall - B1F Thankful Rock Junction Present", 0xEB00D7), + LocationData("Lumine Hall", "Lumine Hall - 1F Above Belly Button Present", 0xEB00D8), + LocationData("Lumine Hall", "Lumine Hall - B1F Belly Button Present", 0xEB00D9), + LocationData("Lumine Hall", "Lumine Hall - 1F Near Exit Present", 0xEB00DA), + LocationData("Lumine Hall", "Lumine Hall - 1F Dead End Present", 0xEB00DB), + LocationData("Lumine Hall", "Lumine Hall - B1F West Alcove Present", 0xEB00DC), + LocationData("Lost Underworld", "Lost Underworld - Talking Rock", 0xEB00DD), + LocationData("Lost Underworld", "Lost Underworld - East Present", 0xEB00DE), + LocationData("Lost Underworld", "Lost Underworld - Northeast Present", 0xEB00DF), + LocationData("Lost Underworld", "Lost Underworld - Northeast of Tenda Tribe Present", 0xEB00E0), + LocationData("Lost Underworld", "Lost Underworld - Southwest of Tenda Tribe Present", 0xEB00E1), + LocationData("Lost Underworld", "Lost Underworld - Evacuation Present", 0xEB00E2), + LocationData("Fire Spring", "Fire Spring - 1st Cave Present", 0xEB00E3), + LocationData("Fire Spring", "Fire Spring - East Corner Present", 0xEB00E4), + LocationData("Fire Spring", "Fire Spring - Volcano Present", 0xEB00E5), + LocationData("Fire Spring", "Fire Spring - Lone Cave Present", 0xEB00E6), + LocationData("Fire Spring", "Fire Spring - Upper Volcano Present", 0xEB00E7), + LocationData("Cave of the Present", "Cave of the Present - Star Master", 0xEB00EE), + LocationData("Cave of the Present", "Cave of the Present - Broken Phase Distorter", 0xEB00EF), + + LocationData("Happy-Happy HQ", "Carpainter Defeated", None), + LocationData("Belch's Factory", "Belch Defeated", None), + LocationData("Dungeon Man", "Dungeon Man Submarine", None), + LocationData("Giant Step", "Giant Step Sanctuary", None), + LocationData("Lilliput Steps", "Lilliput Steps Sanctuary", None), + LocationData("Milky Well", "Milky Well Sanctuary", None), + LocationData("Rainy Circle", "Rainy Circle Sanctuary", None), + LocationData("Magnet Hill", "Magnet Hill Sanctuary", None), + LocationData("Pink Cloud", "Pink Cloud Sanctuary", None), + LocationData("Lumine Hall", "Lumine Hall Sanctuary", None), + LocationData("Fire Spring", "Fire Spring Sanctuary", None), + LocationData("Ness's Mind", "Sanctuary Goal", None), + LocationData("Global ATM Access", "Any ATM", None) + ] + + if world.options.giygas_required: + location_table += [ + LocationData("Cave of the Past", "Cave of the Past - Present", 0xEB00F0), + LocationData("Endgame", "Giygas", None), + ] + + if world.options.alternate_sanctuary_goal: + location_table += [ + LocationData("Ness's Mind", "+2 Sanctuaries", None) + ] + + if world.options.magicant_mode in range(1, 3): + location_table += [ + LocationData("Sea of Eden", "Magicant - Ness's Nightmare", None), + ] + + if not world.options.magicant_mode: + location_table += [ + LocationData("Sea of Eden", "Magicant - Ness's Nightmare", 0xEB00ED), + ] + + if world.options.magicant_mode < MagicantMode.option_alternate_goal: + location_table += [ + LocationData("Magicant", "Magicant - Ness's Gift", 0xEB00E8), + LocationData("Magicant", "Magicant - Present Near Ness", 0xEB00E9), + LocationData("Magicant", "Magicant - Lonely Present", 0xEB00EA), + LocationData("Magicant", "Magicant - North Present", 0xEB00EB), + LocationData("Magicant", "Magicant - Hills Present", 0xEB00EC), + LocationData("Magicant", "Magicant - Town Present", 0xEB00FA) + ] + if world.options.magicant_mode == MagicantMode.option_alternate_goal: + location_table += [ + LocationData("Ness's Mind", "+1 Sanctuary", None) + ] + + if world.options.shop_randomizer == ShopRandomizer.option_shopsanity: + location_table += [ + LocationData("Onett", "Onett Drugstore - Right Counter Slot 1", 0xeb1000), + LocationData("Onett", "Onett Drugstore - Right Counter Slot 2", 0xeb1001), + LocationData("Onett", "Onett Drugstore - Right Counter Slot 3", 0xeb1002), + LocationData("Onett", "Onett Drugstore - Right Counter Slot 4", 0xeb1003), + LocationData("Onett", "Onett Drugstore - Right Counter Slot 5", 0xeb1004), + LocationData("Onett", "Onett Drugstore - Left Counter", 0xeb1007), + LocationData("Summers", "Summers - Beach Cart", 0xeb100e), + LocationData("Onett", "Onett Burger Shop - Slot 1", 0xeb1015), + LocationData("Onett", "Onett Burger Shop - Slot 2", 0xeb1016), + LocationData("Onett", "Onett Burger Shop - Slot 3", 0xeb1017), + LocationData("Onett", "Onett Burger Shop - Slot 4", 0xeb1018), + LocationData("Onett", "Onett Bakery - Slot 1", 0xeb101c), + LocationData("Onett", "Onett Bakery - Slot 2", 0xeb101d), + LocationData("Onett", "Onett Bakery - Slot 3", 0xeb101e), + LocationData("Onett", "Onett Bakery - Slot 4", 0xeb101f), + LocationData("Twoson", "Twoson Department Store Burger Shop - Slot 1", 0xeb1023), + LocationData("Twoson", "Twoson Department Store Burger Shop - Slot 2", 0xeb1024), + LocationData("Twoson", "Twoson Department Store Burger Shop - Slot 3", 0xeb1025), + LocationData("Twoson", "Twoson Department Store Burger Shop - Slot 4", 0xeb1026), + LocationData("Twoson", "Twoson Department Store Bakery - Slot 1", 0xeb102a), + LocationData("Twoson", "Twoson Department Store Bakery - Slot 2", 0xeb102b), + LocationData("Twoson", "Twoson Department Store Bakery - Slot 3", 0xeb102c), + LocationData("Twoson", "Twoson Department Store Bakery - Slot 4", 0xeb102d), + LocationData("Twoson", "Twoson Department Store Top Floor - Right Counter Slot 1", 0xeb1031), + LocationData("Twoson", "Twoson Department Store Top Floor - Right Counter Slot 2", 0xeb1032), + LocationData("Twoson", "Twoson Department Store Top Floor - Right Counter Slot 3", 0xeb1033), + LocationData("Twoson", "Twoson Department Store Top Floor - Right Counter Slot 4", 0xeb1034), + LocationData("Twoson", "Twoson Department Store Top Floor - Right Counter Slot 5", 0xeb1035), + LocationData("Twoson", "Twoson Department Store Top Floor - Right Counter Slot 6", 0xeb1036), + LocationData("Twoson", "Twoson Department Store Top Floor - Left Counter Slot 1", 0xeb1038), + LocationData("Twoson", "Twoson Department Store Top Floor - Left Counter Slot 2", 0xeb1039), + LocationData("Summers", "Summers - Magic Cake Cart Shop Slot", 0xeb103f), + LocationData("Twoson", "Burglin Park Junk Shop - Slot 1", 0xeb1046), + LocationData("Twoson", "Burglin Park Junk Shop - Slot 2", 0xeb1047), + LocationData("Twoson", "Burglin Park Junk Shop - Slot 3", 0xeb1048), + LocationData("Twoson", "Burglin Park Junk Shop - Slot 4", 0xeb1049), + LocationData("Twoson", "Burglin Park Junk Shop - Slot 5", 0xeb104a), + LocationData("Twoson", "Burglin Park Junk Shop - Slot 6", 0xeb104b), + LocationData("Twoson", "Burglin Park Bread Stand - Slot 1", 0xeb105b), + LocationData("Twoson", "Burglin Park Bread Stand - Slot 2", 0xeb105c), + LocationData("Twoson", "Burglin Park Bread Stand - Slot 3", 0xeb105d), + LocationData("Twoson", "Burglin Park Bread Stand - Slot 4", 0xeb105e), + LocationData("Twoson", "Burglin Park Bread Stand - Slot 5", 0xeb105f), + LocationData("Twoson", "Burglin Park Bread Stand - Slot 6", 0xeb1060), + LocationData("Twoson", "Burglin Park - Banana Stand", 0xeb1062), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Right Counter Slot 1", 0xeb1069), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Right Counter Slot 2", 0xeb106a), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Right Counter Slot 3", 0xeb106b), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Right Counter Slot 4", 0xeb106c), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Right Counter Slot 5", 0xeb106d), + LocationData("Threed", "Threed Drugstore - Right Counter Slot 1", 0xeb1070), + LocationData("Threed", "Threed Drugstore - Right Counter Slot 2", 0xeb1071), + LocationData("Threed", "Threed Drugstore - Right Counter Slot 3", 0xeb1072), + LocationData("Threed", "Threed Drugstore - Right Counter Slot 4", 0xeb1073), + LocationData("Threed", "Threed Drugstore - Right Counter Slot 5", 0xeb1074), + LocationData("Threed", "Threed Drugstore - Left Counter Slot 1", 0xeb1077), + LocationData("Threed", "Threed Drugstore - Left Counter Slot 2", 0xeb1078), + LocationData("Threed", "Threed Drugstore - Left Counter Slot 3", 0xeb1079), + LocationData("Threed", "Threed Drugstore - Left Counter Slot 4", 0xeb107a), + LocationData("Threed", "Threed Drugstore - Left Counter Slot 5", 0xeb107b), + LocationData("Threed", "Threed - Arms Dealer Slot 1", 0xeb107e), + LocationData("Threed", "Threed - Arms Dealer Slot 2", 0xeb107f), + LocationData("Threed", "Threed - Arms Dealer Slot 3", 0xeb1080), + LocationData("Threed", "Threed - Arms Dealer Slot 4", 0xeb1081), + LocationData("Threed", "Threed Bakery - Slot 1", 0xeb1085), + LocationData("Threed", "Threed Bakery - Slot 2", 0xeb1086), + LocationData("Threed", "Threed Bakery - Slot 3", 0xeb1087), + LocationData("Threed", "Threed Bakery - Slot 4", 0xeb1088), + LocationData("Threed", "Threed Bakery - Slot 5", 0xeb1089), + LocationData("Threed", "Threed Bakery - Slot 6", 0xeb108a), + LocationData("Threed", "Threed Bakery - Slot 7", 0xeb108b), + LocationData("Scaraba", "Scaraba - Expensive Water Guy", 0xeb108c), + LocationData("Winters", "Winters Drugstore - Slot 1", 0xeb1093), + LocationData("Winters", "Winters Drugstore - Slot 2", 0xeb1094), + LocationData("Winters", "Winters Drugstore - Slot 3", 0xeb1095), + LocationData("Winters", "Winters Drugstore - Slot 4", 0xeb1096), + LocationData("Winters", "Winters Drugstore - Slot 5", 0xeb1097), + LocationData("Winters", "Winters Drugstore - Slot 6", 0xeb1098), + LocationData("Winters", "Winters Drugstore - Slot 7", 0xeb1099), + LocationData("Saturn Valley", "Saturn Valley Shop - Center Saturn Slot 1", 0xeb109a), + LocationData("Saturn Valley", "Saturn Valley Shop - Center Saturn Slot 2", 0xeb109b), + LocationData("Saturn Valley", "Saturn Valley Shop - Center Saturn Slot 3", 0xeb109c), + LocationData("Saturn Valley", "Saturn Valley Shop - Center Saturn Slot 4", 0xeb109d), + LocationData("Saturn Valley", "Saturn Valley Shop - Center Saturn Slot 5", 0xeb109e), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Counter Slot 1", 0xeb10a1), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Counter Slot 2", 0xeb10a2), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Counter Slot 3", 0xeb10a3), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Counter Slot 4", 0xeb10a4), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Counter Slot 5", 0xeb10a5), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Arms Dealer Slot 1", 0xeb10a8), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Arms Dealer Slot 2", 0xeb10a9), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Arms Dealer Slot 3", 0xeb10aa), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Arms Dealer Slot 4", 0xeb10ab), + LocationData("Fourside", "Fourside Bakery - Slot 1", 0xeb10af), + LocationData("Fourside", "Fourside Bakery - Slot 2", 0xeb10b0), + LocationData("Fourside", "Fourside Bakery - Slot 3", 0xeb10b1), + LocationData("Fourside", "Fourside Bakery - Slot 4", 0xeb10b2), + LocationData("Fourside", "Fourside Bakery - Slot 5", 0xeb10b3), + LocationData("Fourside", "Fourside Bakery - Slot 6", 0xeb10b4), + LocationData("Fourside", "Fourside Department Store - Tool Shop Slot 1", 0xeb10b6), + LocationData("Fourside", "Fourside Department Store - Tool Shop Slot 2", 0xeb10b7), + LocationData("Fourside", "Fourside Department Store - Tool Shop Slot 3", 0xeb10b8), + LocationData("Fourside", "Fourside Department Store - Tool Shop Slot 4", 0xeb10b9), + LocationData("Fourside", "Fourside Department Store - Tool Shop Slot 5", 0xeb10ba), + LocationData("Fourside", "Fourside Department Store - Tool Shop Slot 6", 0xeb10bb), + LocationData("Fourside", "Fourside Department Store - Tool Shop Slot 7", 0xeb10bc), + LocationData("Fourside", "Fourside Department Store - Shop Shop Slot 1", 0xeb10bd), + LocationData("Fourside", "Fourside Department Store - Shop Shop Slot 2", 0xeb10be), + LocationData("Fourside", "Fourside Department Store - Shop Shop Slot 3", 0xeb10bf), + LocationData("Fourside", "Fourside Department Store - Shop Shop Slot 4", 0xeb10c0), + LocationData("Fourside", "Fourside Department Store - Food Shop Slot 1", 0xeb10c4), + LocationData("Fourside", "Fourside Department Store - Food Shop Slot 2", 0xeb10c5), + LocationData("Fourside", "Fourside Department Store - Food Shop Slot 3", 0xeb10c6), + LocationData("Fourside", "Fourside Department Store - Food Shop Slot 4", 0xeb10c7), + LocationData("Fourside", "Fourside Department Store - Food Shop Slot 5", 0xeb10c8), + LocationData("Fourside", "Fourside Department Store - 2F Cart Slot 1", 0xeb10cb), + LocationData("Fourside", "Fourside Department Store - 2F Cart Slot 2", 0xeb10cc), + LocationData("Fourside", "Fourside Department Store - 2F Cart Slot 3", 0xeb10cd), + LocationData("Fourside", "Fourside Department Store - 2F Cart Slot 4", 0xeb10ce), + LocationData("Fourside", "Fourside Department Store - 2F Cart Slot 5", 0xeb10cf), + LocationData("Fourside", "Fourside Department Store - 2F Cart Slot 6", 0xeb10d0), + LocationData("Fourside", "Fourside Department Store - 2F Cart Slot 7", 0xeb10d1), + LocationData("Fourside", "Fourside Department Store - Toys Shop Slot 1", 0xeb10d2), + LocationData("Fourside", "Fourside Department Store - Toys Shop Slot 2", 0xeb10d3), + LocationData("Fourside", "Fourside Department Store - Toys Shop Slot 3", 0xeb10d4), + LocationData("Fourside", "Fourside Department Store - Toys Shop Slot 4", 0xeb10d5), + LocationData("Fourside", "Fourside Department Store - Toys Shop Slot 5", 0xeb10d6), + LocationData("Fourside", "Fourside Department Store - Toys Shop Slot 6", 0xeb10d7), + LocationData("Fourside", "Fourside Department Store - Sports Shop Slot 1", 0xeb10d9), + LocationData("Fourside", "Fourside Department Store - Sports Shop Slot 2", 0xeb10da), + LocationData("Fourside", "Fourside Department Store - Sports Shop Slot 3", 0xeb10db), + LocationData("Fourside", "Fourside Department Store - Sports Shop Slot 4", 0xeb10dc), + LocationData("Fourside", "Fourside Department Store - Burger Shop Slot 1", 0xeb10e0), + LocationData("Fourside", "Fourside Department Store - Burger Shop Slot 2", 0xeb10e1), + LocationData("Fourside", "Fourside Department Store - Burger Shop Slot 3", 0xeb10e2), + LocationData("Fourside", "Fourside Department Store - Burger Shop Slot 4", 0xeb10e3), + LocationData("Fourside", "Fourside Department Store - Burger Shop Slot 5", 0xeb10e4), + LocationData("Fourside", "Fourside Department Store - Arms Dealer Slot 1", 0xeb10e7), + LocationData("Fourside", "Fourside Department Store - Arms Dealer Slot 2", 0xeb10e8), + LocationData("Fourside", "Fourside Department Store - Arms Dealer Slot 3", 0xeb10e9), + LocationData("Fourside", "Fourside Department Store - Arms Dealer Slot 4", 0xeb10ea), + LocationData("Fourside", "Fourside Department Store - Arms Dealer Slot 5", 0xeb10eb), + LocationData("Fourside", "Fourside - Northeast Alley Junk Shop Slot 1", 0xeb10ee), + LocationData("Fourside", "Fourside - Northeast Alley Junk Shop Slot 2", 0xeb10ef), + LocationData("Fourside", "Fourside - Northeast Alley Junk Shop Slot 3", 0xeb10f0), + LocationData("Fourside", "Fourside - Northeast Alley Junk Shop Slot 4", 0xeb10f1), + LocationData("Summers", "Summers - Scam Shop Slot 1", 0xeb1103), + LocationData("Summers", "Summers - Scam Shop Slot 2", 0xeb1104), + LocationData("Summers", "Summers - Scam Shop Slot 3", 0xeb1105), + LocationData("Summers", "Summers - Scam Shop Slot 4", 0xeb1106), + LocationData("Summers", "Summers - Scam Shop Slot 5", 0xeb1107), + LocationData("Summers", "Summers - Scam Shop Slot 6", 0xeb1108), + LocationData("Summers", "Summers - Scam Shop Slot 7", 0xeb1109), + LocationData("Summers", "Summers Harbor - Shop Slot 1", 0xeb110a), + LocationData("Summers", "Summers Harbor - Shop Slot 2", 0xeb110b), + LocationData("Summers", "Summers Harbor - Shop Slot 3", 0xeb110c), + LocationData("Summers", "Summers Harbor - Shop Slot 4", 0xeb110d), + LocationData("Summers", "Summers Harbor - Shop Slot 5", 0xeb110e), + LocationData("Summers", "Summers Harbor - Shop Slot 6", 0xeb110f), + LocationData("Summers", "Summers Harbor - Shop Slot 7", 0xeb1110), + LocationData("Summers", "Summers Restaurant - Slot 1", 0xeb1111), + LocationData("Summers", "Summers Restaurant - Slot 2", 0xeb1112), + LocationData("Summers", "Summers Restaurant - Slot 3", 0xeb1113), + LocationData("Summers", "Summers Restaurant - Slot 4", 0xeb1114), + LocationData("Summers", "Summers Restaurant - Slot 5", 0xeb1115), + LocationData("Summers", "Summers Restaurant - Slot 6", 0xeb1116), + LocationData("Scaraba", "Scaraba - Indoors Shop Slot 1", 0xeb1118), + LocationData("Scaraba", "Scaraba - Indoors Shop Slot 2", 0xeb1119), + LocationData("Scaraba", "Scaraba - Indoors Shop Slot 3", 0xeb111a), + LocationData("Scaraba", "Scaraba - Indoors Shop Slot 4", 0xeb111b), + LocationData("Scaraba", "Scaraba - Indoors Shop Slot 5", 0xeb111c), + LocationData("Scaraba", "Scaraba - Indoors Shop Slot 6", 0xeb111d), + LocationData("Scaraba", "Scaraba Bazaar - Red Snake Carpet Slot 1", 0xeb1126), + LocationData("Scaraba", "Scaraba Bazaar - Red Snake Carpet Slot 2", 0xeb1127), + LocationData("Scaraba", "Scaraba Bazaar - Red Snake Carpet Slot 3", 0xeb1128), + LocationData("Scaraba", "Scaraba Bazaar - Bottom Left Carpet Slot 1", 0xeb112d), + LocationData("Scaraba", "Scaraba Bazaar - Bottom Left Carpet Slot 2", 0xeb112e), + LocationData("Scaraba", "Scaraba Bazaar - Bottom Left Carpet Slot 3", 0xeb112f), + LocationData("Scaraba", "Scaraba Bazaar - Bottom Left Carpet Slot 4", 0xeb1130), + LocationData("Scaraba", "Scaraba Bazaar - Bottom Left Carpet Slot 5", 0xeb1131), + LocationData("Scaraba", "Scaraba Bazaar - Bottom Left Carpet Slot 6", 0xeb1132), + LocationData("Scaraba", "Scaraba Hotel - Arms Dealer Slot 1", 0xeb1134), + LocationData("Scaraba", "Scaraba Hotel - Arms Dealer Slot 2", 0xeb1135), + LocationData("Scaraba", "Scaraba Hotel - Arms Dealer Slot 3", 0xeb1136), + LocationData("Scaraba", "Scaraba Hotel - Arms Dealer Slot 4", 0xeb1137), + LocationData("Deep Darkness", "Deep Darkness - Businessman Slot 1", 0xeb113b), + LocationData("Deep Darkness", "Deep Darkness - Businessman Slot 2", 0xeb113c), + LocationData("Deep Darkness", "Deep Darkness - Businessman Slot 3", 0xeb113d), + LocationData("Deep Darkness", "Deep Darkness - Businessman Slot 4", 0xeb113e), + LocationData("Deep Darkness", "Deep Darkness - Businessman Slot 5", 0xeb113f), + LocationData("Deep Darkness", "Deep Darkness - Businessman Slot 6", 0xeb1140), + LocationData("Deep Darkness", "Deep Darkness - Businessman Slot 7", 0xeb1141), + LocationData("Saturn Valley", "Saturn Valley Shop - Post-Belch Saturn Slot 1", 0xeb1157), + LocationData("Saturn Valley", "Saturn Valley Shop - Post-Belch Saturn Slot 2", 0xeb1158), + LocationData("Saturn Valley", "Saturn Valley Shop - Post-Belch Saturn Slot 3", 0xeb1159), + LocationData("Saturn Valley", "Saturn Valley Shop - Post-Belch Saturn Slot 4", 0xeb115a), + LocationData("Southern Scaraba", "Scaraba - Southern Camel Shop Slot 1", 0xeb115e), + LocationData("Southern Scaraba", "Scaraba - Southern Camel Shop Slot 2", 0xeb115f), + LocationData("Southern Scaraba", "Scaraba - Southern Camel Shop Slot 3", 0xeb1160), + LocationData("Southern Scaraba", "Scaraba - Southern Camel Shop Slot 4", 0xeb1161), + LocationData("Southern Scaraba", "Scaraba - Southern Camel Shop Slot 5", 0xeb1162), + LocationData("Southern Scaraba", "Scaraba - Southern Camel Shop Slot 6", 0xeb1163), + LocationData("Southern Scaraba", "Scaraba - Southern Camel Shop Slot 7", 0xeb1164), + LocationData("Deep Darkness", "Deep Darkness - Arms Dealer Slot 1", 0xeb1165), + LocationData("Deep Darkness", "Deep Darkness - Arms Dealer Slot 2", 0xeb1166), + LocationData("Deep Darkness", "Deep Darkness - Arms Dealer Slot 3", 0xeb1167), + LocationData("Deep Darkness", "Deep Darkness - Arms Dealer Slot 4", 0xeb1168), + LocationData("Lost Underworld", "Lost Underworld - Tenda Camp Shop Slot 1", 0xeb116c), + LocationData("Lost Underworld", "Lost Underworld - Tenda Camp Shop Slot 2", 0xeb116d), + LocationData("Lost Underworld", "Lost Underworld - Tenda Camp Shop Slot 3", 0xeb116e), + LocationData("Lost Underworld", "Lost Underworld - Tenda Camp Shop Slot 4", 0xeb116f), + LocationData("Lost Underworld", "Lost Underworld - Tenda Camp Shop Slot 5", 0xeb1170), + LocationData("Lost Underworld", "Lost Underworld - Tenda Camp Shop Slot 6", 0xeb1171), + LocationData("Lost Underworld", "Lost Underworld - Tenda Camp Shop Slot 7", 0xeb1172), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Left Counter Slot 1", 0xeb117a), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Left Counter Slot 2", 0xeb117b), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Left Counter Slot 3", 0xeb117c), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Left Counter Slot 4", 0xeb117d), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Left Counter Slot 5", 0xeb117e), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Left Counter Slot 6", 0xeb117f), + LocationData("Happy-Happy Village", "Happy-Happy Village Drugstore - Left Counter Slot 7", 0xeb1180), + LocationData("Grapefruit Falls", "Grapefruit Falls - Hiker Shop Slot 1", 0xeb1181), + LocationData("Grapefruit Falls", "Grapefruit Falls - Hiker Shop Slot 2", 0xeb1182), + LocationData("Grapefruit Falls", "Grapefruit Falls - Hiker Shop Slot 3", 0xeb1183), + LocationData("Saturn Valley", "Saturn Valley Shop - Top Saturn Slot 1", 0xeb1188), + LocationData("Saturn Valley", "Saturn Valley Shop - Top Saturn Slot 2", 0xeb1189), + LocationData("Saturn Valley", "Saturn Valley Shop - Top Saturn Slot 3", 0xeb118a), + LocationData("Saturn Valley", "Saturn Valley Shop - Top Saturn Slot 4", 0xeb118b), + LocationData("Saturn Valley", "Saturn Valley Shop - Top Saturn Slot 5", 0xeb118c), + LocationData("Saturn Valley", "Saturn Valley Shop - Top Saturn Slot 6", 0xeb118d), + LocationData("Saturn Valley", "Saturn Valley Shop - Top Saturn Slot 7", 0xeb118e), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Left Shop Slot 1", 0xeb118f), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Left Shop Slot 2", 0xeb1190), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Left Shop Slot 3", 0xeb1191), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Left Shop Slot 4", 0xeb1192), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Left Shop Slot 5", 0xeb1193), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Left Shop Slot 6", 0xeb1194), + LocationData("Dusty Dunes Desert", "Dusty Dunes Drugstore - Left Shop Slot 7", 0xeb1195), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Mine Food Cart Slot 1", 0xeb1196), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Mine Food Cart Slot 2", 0xeb1197), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Mine Food Cart Slot 3", 0xeb1198), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Mine Food Cart Slot 4", 0xeb1199), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Mine Food Cart Slot 5", 0xeb119a), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Mine Food Cart Slot 6", 0xeb119b), + LocationData("Dusty Dunes Desert", "Dusty Dunes - Mine Food Cart Slot 7", 0xeb119c), + LocationData("Moonside", "Moonside Hotel - Shop Slot 1", 0xeb119d), + LocationData("Moonside", "Moonside Hotel - Shop Slot 2", 0xeb119e), + LocationData("Moonside", "Moonside Hotel - Shop Slot 3", 0xeb119f), + LocationData("Moonside", "Moonside Hotel - Shop Slot 4", 0xeb11a0), + LocationData("Moonside", "Moonside Hotel - Shop Slot 5", 0xeb11a1), + LocationData("Dalaam", "Dalaam Restaurant - Slot 1", 0xeb11a4), + LocationData("Dalaam", "Dalaam Restaurant - Slot 2", 0xeb11a5), + LocationData("Dalaam", "Dalaam Restaurant - Slot 3", 0xeb11a6), + LocationData("Dalaam", "Dalaam Restaurant - Slot 4", 0xeb11a7), + LocationData("Scaraba", "Scaraba Bazaar - Delicacy Shop Slot 1", 0xeb11ab), + LocationData("Scaraba", "Scaraba Bazaar - Delicacy Shop Slot 2", 0xeb11ac), + LocationData("Scaraba", "Scaraba Bazaar - Delicacy Shop Slot 3", 0xeb11ad), + LocationData("Scaraba", "Scaraba Bazaar - Delicacy Shop Slot 4", 0xeb11ae), + LocationData("Scaraba", "Scaraba Bazaar - Delicacy Shop Slot 5", 0xeb11af), + LocationData("Scaraba", "Scaraba Bazaar - Delicacy Shop Slot 6", 0xeb11b0), + LocationData("Scaraba", "Scaraba Bazaar - Delicacy Shop Slot 7", 0xeb11b1), + LocationData("Common Condiment Shop", "Twoson/Scaraba - Shared Condiment Shop Slot 1", 0xeb11b2), + LocationData("Common Condiment Shop", "Twoson/Scaraba - Shared Condiment Shop Slot 2", 0xeb11b3), + LocationData("Common Condiment Shop", "Twoson/Scaraba - Shared Condiment Shop Slot 3", 0xeb11b4), + LocationData("Common Condiment Shop", "Twoson/Scaraba - Shared Condiment Shop Slot 4", 0xeb11b5), + LocationData("Common Condiment Shop", "Twoson/Scaraba - Shared Condiment Shop Slot 5", 0xeb11b6), + LocationData("Common Condiment Shop", "Twoson/Scaraba - Shared Condiment Shop Slot 6", 0xeb11b7), + LocationData("Common Condiment Shop", "Twoson/Scaraba - Shared Condiment Shop Slot 7", 0xeb11b8), + LocationData("Andonuts Lab Area", "Andonuts Lab - Caveman Shop Slot 1", 0xeb11c0), + LocationData("Andonuts Lab Area", "Andonuts Lab - Caveman Shop Slot 2", 0xeb11c1), + LocationData("Andonuts Lab Area", "Andonuts Lab - Caveman Shop Slot 3", 0xeb11c2), + LocationData("Andonuts Lab Area", "Andonuts Lab - Caveman Shop Slot 4", 0xeb11c3), + LocationData("Andonuts Lab Area", "Andonuts Lab - Caveman Shop Slot 5", 0xeb11c4) + ] + + if world.options.magicant_mode < MagicantMode.option_alternate_goal: + location_table += [ + LocationData("Magicant", "Magicant - Shop Slot 1", 0xeb10f5), + LocationData("Magicant", "Magicant - Shop Slot 2", 0xeb10f6) + ] + + return location_table diff --git a/worlds/earthbound/Options.py b/worlds/earthbound/Options.py new file mode 100644 index 0000000000..40dd90d633 --- /dev/null +++ b/worlds/earthbound/Options.py @@ -0,0 +1,625 @@ +from dataclasses import dataclass +from Options import (Toggle, DefaultOnToggle, DeathLink, Choice, Range, PerGameCommonOptions, StartInventoryPool, + OptionGroup, FreeText, Visibility, PlandoBosses) +from .modules.boss_shuffle import boss_plando_keys + + +class GiygasRequired(DefaultOnToggle): + """If enabled, your goal will be to defeat Giygas at the Cave of the Past. + If disabled, your goal will either complete automatically upon completing + enough Sanctuaries, or completing Magicant if it is required.""" + display_name = "Giygas Required" + + +class SanctuariesRequired(Range): + """How many of the eight "Your Sanctuary" locations are required to be cleared.""" + display_name = "Required Sanctuaries" + range_start = 1 + range_end = 8 + default = 4 + + +class SanctuaryAltGoal(Toggle): + """If enabled, you will be able to win by completing 2 more Sanctuaries than are required. + Does nothing if 7 or more Sanctuaries are required, or if Magicant and Giygas are not required.""" + display_name = "Sanctuary Alternate Goal" + + +class MagicantMode(Choice): + """PSI Location: You will be able to find a Magicant teleport item. Ness's Nightmare contains a PSI location, and no stat boost. + Required: You will unlock the Magicant Teleport upon reaching your Sanctuary goal. If Giygas is required, beating Ness's Nightmare will unlock the Cave of the Past and grant a party-wide stat boost. Otherwise, Ness's Nightmare will finish your game. + Alternate Goal: You will unlock the Magicant Teleport upon reaching one more Sanctuary than required. Beating Ness's Nightmare will finish your game. Does nothing if Giygas is not required, or if 8 Sanctuaries are required. Magicant locations are removed from the multiworld, but contain random junk for yourself. + Optional Boost: You will be able to find a Magicant teleport item. Beating Ness's Nightmare will grant a party-wide stat boost. Magicant locations are removed from the multiworld, but contain random junk for yourself. + Removed: Magicant will be completely inacessible.""" + display_name = "Magicant Mode" + option_psi_location = 0 + option_required = 1 + option_alternate_goal = 2 + option_optional_boost = 3 + option_removed = 4 + default = 0 + + +class MonkeyCavesMode(Choice): + """Chests: Items required to finish the Monkey Caves will be forcibly placed on the chests that can be found in-between rooms of the monkey caves. The "reward" locations, usually found at the end of a branch, are still random. If you waste chest items, they will need to be replaced via the methods in hunt mode. + Hunt: Items required to finish the Monkey Caves will needsell you every minor item needed to be found outside. They can be obtained from the Dusty Dunes drugstore, the Fourside department store, and the pizza shop in either Twoson or Threed. + Shop: The monkey outside the Monkey Caves will sell every item needed to complete the caves and is not affected by shop randomization. + Solved: The Monkey Caves monkeys will already be moved out of the way and not require any items.""" + display_name = "Monkey Caves Mode" + option_chests = 0 + option_hunt = 1 + option_shop = 2 + option_solved = 3 + default = 1 + + +class ShortenPrayers(DefaultOnToggle): + """If enabled, the Prayer cutscenes while fighting Giygas will be skipped, excluding the final one.""" + display_name = "Skip Prayer Sequences" + + +class RandomStartLocation(Toggle): + """If disabled, you will always start at Ness's house with no teleports unlocked. + If enabled, you will start at a random teleport destination with one teleport unlocked. + Additionally, you will need to fight Captain Strong to access the north part of Onett if this is enabled.""" + display_name = "Random Starting Location" + + +class LocalTeleports(Toggle): + """Forces all teleports and Poo PSI to be placed locally in your world.""" + display_name = "Local Teleports" + + +class CharacterShuffle(Choice): + """Shuffled: Characters will be shuffled amongst Character Locations. Extra locations will have Flying Man, a Teddy Bear, or a Super Plush Bear. + Anywhere: Characters can be found anywhere in the multiworld, and character locations will have regular checks. + See the Game Page for more information on Character Locations.""" + display_name = "Character Shuffle" + option_shuffled = 0 + option_anywhere = 1 + default = 0 + + +class PSIShuffle(Choice): + """None: Characters will learn their normal PSI skills. + Basic: Offensive and Assist PSI will be shuffled. Recovery PSI is not modified. Ness's Favorite Thing will be named Wave in other slots. + Extended: Basic shuffle, but includes Jeff gadgets and some combat items. + See the Game Page for more information.""" + display_name = "PSI Shuffle" + option_none = 0 + option_basic = 1 + option_extended = 2 + + +class BossShuffle(PlandoBosses): + """Shuffles boss encounters amongst each other.""" + display_name = "Boss Shuffle" + + option_false = 0 + option_true = 1 + default = 0 + bosses = boss_plando_keys + locations = boss_plando_keys + duplicate_bosses = False + + @classmethod + def can_place_boss(cls, boss: str, location: str) -> bool: + return True + + +class DecoupleDiamondDog(Toggle): + """Shuffles Diamond Dog as a boss separate from Carbon Dog. Carbon Dog will transform into a random boss. + Does nothing if Boss Shuffle is disabled.""" + display_name = "Decouple Diamond Dog" + + +class ShuffleGiygas(Toggle): + """Adds the standalone Giygas fight to the shuffled boss pool. + This only applies to the second phase Giygas. The prayer fight is not affected. + Does nothing if Boss Shuffle is disabled.""" + display_name = "Add Giygas to Boss Pool" + + +class BanFlashFavorite(Toggle): + """If enabled, allows PSI Flash to be shuffled onto the Favorite Thing PSI slot. Can be quite annoying early-game. + Does nothing if PSI Shuffle is set to None.""" + display_name = "Flash as Favorite" + + +class PreFixItems(Toggle): + """If enabled, broken items in the multiworld pool will be replaced with their fixed versions. + This does not affect any items that are not placed by the multiworld.""" + display_name = "Prefixed Items" + + +class AutoscaleParty(Toggle): + """If enabled, joining party members will be scaled to roughly the level of the sphere they were obtained in.""" + display_name = "Autoscale Party Members" + + +class ProgressiveWeapons(Toggle): + """If enabled, Bats, Fry Pans, and Guns will be progressive. Does not apply to items dropped by enemies or found in shops.""" + display_name = "Progressive Weapons" + + +class ProgressiveArmor(Toggle): + """If enabled, Bracelets and items for the Other slot besides Ribbons will be progressive. Does not apply to items dropped by enemies or found in shops.""" + display_name = "Progressive Armor" + + +class PresentSprites(DefaultOnToggle): + """If enabled, Presents, Trash cans, and chests will have their appearance modified to be indicative of the item they contain.""" + display_name = "Match Present Sprites" + + +class NoAPPresents(Toggle): + """If enabled, present that contain items for other players will appear as EarthBound presents (trashcan, present, and chest) instead of Archipelago boxes. + Does nothing if Presents Match Contents is disabled.""" + + +class ShuffleDrops(Toggle): + """If enabled, enemies will drop random filler items. This does not put checks on enemy drops. + Drop rates are unchanged.""" + display_name = "Shuffle Drops" + + +class RandomFranklinBadge(Toggle): + """If enabled, the Franklin Badge will reflect a randomly selected attack type. The type can be determined from the item's name, as well as the help + text for it. The badge's function outside of battle will not change, and neither will its name outside of the game itself.""" + display_name = "Franklin Badge Protection" + + +class CommonWeight(Range): + """Weight for placing a common filler item.""" + display_name = "Common Filler Weight" + range_start = 1 + range_end = 100 + default = 80 + + +class UncommonWeight(Range): + """Weight for placing an uncommon filler item.""" + display_name = "Uncommon Filler Weight" + range_start = 1 + range_end = 100 + default = 30 + + +class RareWeight(Range): + """Weight for placing a rare filler item.""" + display_name = "Rare Filler Weight" + range_start = 0 + range_end = 100 + default = 5 + + +class MoneyWeight(Range): + """Weight for placing money in the item pool.""" + display_name = "Money Weight" + range_start = 0 + range_end = 100 + default = 0 + + +class ExperienceModifier(Range): + """Percentage of EXP enemies give you. 100 is vanilla, after scaling, and 300 is x3.""" + display_name = "Experience Percentage" + range_start = 100 + range_end = 300 + default = 150 + + +class StartingMoney(Range): + """How much money you start with.""" + display_name = "Starting Money" + range_start = 0 + range_end = 99999 + default = 20 + + +class EasyDeaths(DefaultOnToggle): + """Fully revives and heals all party members after death. If off, only Ness will be healed with 0 PP.""" + display_name = "Easy Deaths" + + +class RandomFlavors(DefaultOnToggle): + """Randomizes the non-plain window color options.""" + display_name = "Random Flavors" + + +class DeathLinkMode(Choice): + """Controls how receiving a Deathlink functions in battle. + Instant: The player will be instantly defeated. + Mortal: All characters will receieve mortal damage. The player will not be able to heal until the battle is finished. + Mortal Mercy: All characters will receieve mortal damage, but the player will be able to heal it before they die. + Regardless of this setting, receiving a deathlink outside of battle will always instantly defeat the player.""" + display_name = "Death Link Mode" + option_instant = 0 + option_mortal = 1 + option_mortal_mercy = 2 + default = 1 + + +class RandomBattleBG(Toggle): + """Generates random battle backgrounds.""" + display_name = "Randomize Battle Backgrounds" + + +class RandomSwirlColors(Toggle): + """Generates random colors for pre-battle swirls.""" + display_name = "Randomize Swirl Colors" + + +class RemoteItems(Toggle): + """If enabled, you will receive your own items from the server upon collecting them, rather than locally. + This allows co-op within the same game, and protects against loss of save data. + However, you will not be able to play offline if this is enabled.""" + display_name = "Remote Items" + + +class PlandoLumineHallText(FreeText): + """Set text to be displayed at Lumine Hall. If nothing is entered, random community-submitted text will be selected instead.""" + display_name = "Lumine Hall Text Plando" + visibility = Visibility.none + + +class Armorizer(Choice): + """All equippable armor will have randomly generated attributes. This includes who can equip it, elemental resistance (and how strong that resistance is), + defense, and the secondary stat it increases (Either Luck or Speed, depending on armor slot.) Choosing "Help!" from the Goods menu will give you exact details + on that piece of equipment. + Keep Type: Equipment will keep its original equipment slot. If Progressive Armor is enabled, you will get armor with progressively higher defense. + Chaos: Equipment will have a randomly selected slot. It will try to respect the defense progressively, but the type may not match the type received.""" + display_name = "Armorizer" + option_off = 0 + option_keep_type = 1 + option_chaos = 2 + default = 0 + + +class Weaponizer(Choice): + """All weapons will have randomly generated attributes. This includes offense, guts boost, and miss rate. + Keep Type: Equipment will keep the character that was originally able to use it. If Progressive Weapons is enabled, you will get weapons with progressively higher offense. + Chaos: Equipment will be able to be equipped by a randomly selected character. It will try to respect the offense progresively, but the type may not match the type recieved. + The Tee Ball Bat will always be a weapon for Ness.""" + display_name = "Weaponizer" + option_off = 0 + option_keep_type = 1 + option_chaos = 2 + default = 0 + + +class ElementChance(Range): + """Percent chance for any given Body/Other equipment to have elemental protection. + Affects Armorizer only.""" + display_name = "Elemental Resistance Chance" + range_start = 1 + range_end = 50 + default = 15 + + +class NoFreeSancs(Toggle): + """If enabled, the entrance to Lilliput Steps and Fire Spring will be locked and require extra key items to access. + These items are the Tiny Key and Tenda Lavapants, respectively.""" + display_name = "No Free Sanctuaries" + + +class RandomizeFanfares(Choice): + """Randomizes fanfares.""" + display_name = "Randomize Fanfares" + option_off = 0 + option_on = 1 + option_on_no_sound_stone_fanfares = 2 + default = 0 + + +class RandomizeBattleMusic(Toggle): + """Randomizes in-battle songs.""" + display_name = "Randomize Battle Music" + + +class RandomizeOverworldMusic(Choice): + """Randomizes music on the overworld. Some sound effects might sound weird. + Normal: Does not randomize music. + Match Type: Music will be randomized with similar song categories (Town, dungeon, etc.) + Full: Overworld music will be randomized disregarding categories.""" + display_name = "Overworld Music Randomizer" + option_normal = 0 + option_match_type = 1 + option_full = 2 + default = 0 + + +class RandomizePSIPalettes(Choice): + """Randomizes the colors of PSI spells. + Normal: Doesn't randomize PSI colors. + Shuffled: PSI spell palettes are swapped around with each other. + Randomized: PSI spells use completely random colors.""" + display_name = "Random PSI Palettes" + option_normal = 0 + option_shuffled = 1 + option_randomized = 2 + default = 0 + + +class ShopRandomizer(Choice): + """Randomizes items in shops. + Local Filler: Shops contain only random items for yourself and are not checks. + Shopsanity. Every shop slot in the game contains a Multiworld location. ONLY ENABLE SHOPSANITY IF YOU KNOW WHAT YOU ARE DOING.""" + display_name = "Shop Randomizer" + option_off = 0 + option_local_filler = 1 + option_shopsanity = 2 + default = 0 + + +class ScoutShopChecks(Choice): + """Scouts Shop checks when you open a shop. Only affects shops in Shopsanity mode.""" + display_name = "Scout Shop Checks" + option_off = 0 + option_progression_only = 1 + option_all = 2 + default = 1 + + +class StartingCharacter(Choice): + """Sets which character you start as. Each character will always start with the ability to teleport, + and the ATM card. Ness will not be required to fight Sanctuary bosses.""" + display_name = "Starting Character" + option_Ness = 0 + option_Paula = 1 + option_Jeff = 2 + option_Poo = 3 + default = 0 + + +class EquipamizerStatCap(DefaultOnToggle): + """If enabled, the highest value that Equipamizer can roll for a piece of equipment's + main stat will be capped. 80 for armor, 125 for weapons. + If disabled, the main stat can potentially roll up to 128.""" + display_name = "Equipamizer Stat Cap" + + +class MoneyDropMultiplier(Range): + """Multiplies money dropped by enemies by the chosen value.""" + display_name = "Money Drop Multiplier" + range_start = 1 + range_end = 100 + default = 1 + + +class EnemyShuffle(Toggle): + """Shuffles Non-boss enemies amongst each other.""" + display_name = "Enemy Shuffle" + + +class SkipEpilogue(Toggle): + """If enabled, the choice to play the epilogue after beating Giygas will be removed, and you will + go directly to the credits. This option is mainly for no-release seeds where checks could be + potentially spoiled in the open-access epilogue.""" + display_name = "Skip Epilogue" + visibility = Visibility.template + + +class EnergyLink(Toggle): + """If enabled, the money in the ATM will be linked across the Archipelago Server. + This requires a server connection to be used, but won't break offline play.""" + display_name = "Energy Link" + + +class DungeonShuffle(Toggle): + """Shuffles Dungeon entrances amongst each other.""" + display_name = "Dungeon Shuffle" + + +class PhotoCount(Range): + """How many Photograph traps are placed in the item pool.""" + display_name = "Photos in pool" + range_start = 0 + range_end = 32 + default = 20 + + +class EasyCombat(Toggle): + """Automatically halves all scaled enemy levels.""" + display_name = "Easy Combat" + + +class EnemizerStats(Toggle): + """Randomizes base stats and level of non-boss enemies.""" + display_name = "Randomize Enemy Stats" + + +class EnemizerAttacks(Toggle): + """Randomizes attacks of non-boss enemies.""" + display_name = "Randomize Enemy Attacks" + + +class EnemizerAttributes(Toggle): + """Randomizes most attributes of non-boss enemies.""" + display_name = "Randomize Enemy Attributes" + + +class RandomMapColors(Choice): + """Randomizes map colors. + Normal: Uses normal colors + Nice: Uses generally good looking palettes for maps with little artifacting. + Ugly: Allows map palettes with artifacting or colors that may not look good. + Nonsense: Allows really bad palettes or heavy artifacting.""" + display_name = "Shuffle Map Palettes" + option_normal = 0 + option_nice = 1 + option_ugly = 2 + option_nonsense = 3 + default = 0 + +class SafeFinalBoss(DefaultOnToggle): + """Prevents specific difficult bosses from being randomized onto Heavily Armed Pokey's boss slot. + Only affects Boss Shuffle, and does not affect Phase 2 Giygas if Boss Shuffle Add Giygas is enabled.""" + display_name = "Safe Final Boss" + + +@dataclass +class EBOptions(PerGameCommonOptions): + giygas_required: GiygasRequired + sanctuaries_required: SanctuariesRequired + skip_prayer_sequences: ShortenPrayers + random_start_location: RandomStartLocation + alternate_sanctuary_goal: SanctuaryAltGoal + magicant_mode: MagicantMode + monkey_caves_mode: MonkeyCavesMode + local_teleports: LocalTeleports + character_shuffle: CharacterShuffle + starting_character: StartingCharacter + psi_shuffle: PSIShuffle + allow_flash_as_favorite_thing: BanFlashFavorite + enemy_shuffle: EnemyShuffle + boss_shuffle: BossShuffle + decouple_diamond_dog: DecoupleDiamondDog + boss_shuffle_add_giygas: ShuffleGiygas + safe_final_boss: SafeFinalBoss + randomize_enemy_attributes: EnemizerAttributes + randomize_enemy_stats: EnemizerStats + randomize_enemy_attacks: EnemizerAttacks + experience_modifier: ExperienceModifier + money_drop_multiplier: MoneyDropMultiplier + starting_money: StartingMoney + easy_deaths: EasyDeaths + easy_combat: EasyCombat + progressive_weapons: ProgressiveWeapons + progressive_armor: ProgressiveArmor + armorizer: Armorizer + weaponizer: Weaponizer + armorizer_resistance_chance: ElementChance + equipamizer_cap_stats: EquipamizerStatCap + auto_scale_party_members: AutoscaleParty + remote_items: RemoteItems + random_flavors: RandomFlavors + random_battle_backgrounds: RandomBattleBG + random_swirl_colors: RandomSwirlColors + presents_match_contents: PresentSprites + nonlocal_items_use_local_presents: NoAPPresents + prefixed_items: PreFixItems + total_photos: PhotoCount + randomize_franklinbadge_protection: RandomFranklinBadge + shuffle_enemy_drops: ShuffleDrops + common_filler_weight: CommonWeight + uncommon_filler_weight: UncommonWeight + rare_filler_weight: RareWeight + money_weight: MoneyWeight + plando_lumine_hall_text: PlandoLumineHallText + no_free_sanctuaries: NoFreeSancs + randomize_overworld_music: RandomizeOverworldMusic + randomize_battle_music: RandomizeBattleMusic + randomize_fanfares: RandomizeFanfares + randomize_psi_palettes: RandomizePSIPalettes + map_palette_shuffle: RandomMapColors + shop_randomizer: ShopRandomizer + scout_shop_checks: ScoutShopChecks + dungeon_shuffle: DungeonShuffle + skip_epilogue: SkipEpilogue + start_inventory_from_pool: StartInventoryPool + death_link: DeathLink + death_link_mode: DeathLinkMode + energy_link: EnergyLink + + +eb_option_groups = [ + OptionGroup("Goal Settings", [ + GiygasRequired, + SanctuariesRequired, + SanctuaryAltGoal + ]), + + OptionGroup("Item Settings", [ + LocalTeleports, + CharacterShuffle, + ProgressiveWeapons, + ProgressiveArmor, + RandomFranklinBadge, + CommonWeight, + UncommonWeight, + RareWeight, + MoneyWeight, + PreFixItems, + PhotoCount + ]), + + OptionGroup("Equipamizer", [ + Armorizer, + Weaponizer, + ElementChance, + EquipamizerStatCap + ]), + + OptionGroup("World Modes", [ + RandomStartLocation, + MagicantMode, + MonkeyCavesMode, + NoFreeSancs, + StartingCharacter + ]), + + OptionGroup("PSI Randomization", [ + PSIShuffle, + BanFlashFavorite + ]), + + OptionGroup("Enemy Randomization", [ + EnemyShuffle, + BossShuffle, + SafeFinalBoss, + DecoupleDiamondDog, + ShuffleGiygas, + ExperienceModifier, + ShuffleDrops, + MoneyDropMultiplier + ]), + + OptionGroup("Enemizer", [ + EnemizerAttributes, + EnemizerAttacks, + EnemizerStats + ]), + + OptionGroup("Shop Randomization", [ + ShopRandomizer, + ScoutShopChecks + ]), + + OptionGroup("Entrance Randomization", [ + DungeonShuffle + ]), + + OptionGroup("Convenience Settings", [ + ShortenPrayers, + EasyDeaths, + StartingMoney, + RemoteItems, + AutoscaleParty, + SkipEpilogue, + EasyCombat + ]), + + OptionGroup("Aesthetic Settings", [ + RandomFlavors, + RandomSwirlColors, + RandomBattleBG, + RandomMapColors, + PresentSprites, + NoAPPresents, + RandomizePSIPalettes, + PlandoLumineHallText + ]), + + OptionGroup("Music Randomizer", [ + RandomizeOverworldMusic, + RandomizeBattleMusic, + RandomizeFanfares + ]), + + OptionGroup("Multiplayer Features", [ + DeathLink, + DeathLinkMode, + EnergyLink + ]) +] diff --git a/worlds/earthbound/Regions.py b/worlds/earthbound/Regions.py new file mode 100644 index 0000000000..b5bea536b7 --- /dev/null +++ b/worlds/earthbound/Regions.py @@ -0,0 +1,279 @@ +from typing import List, Dict, TYPE_CHECKING, Optional +from BaseClasses import Region, Location +from .Locations import LocationData +from .Options import MagicantMode +if TYPE_CHECKING: + from . import EarthBoundWorld + + +class EBLocation(Location): + game: str = "EarthBound" + + +def init_areas(world: "EarthBoundWorld", locations: list[LocationData]) -> None: + multiworld = world.multiworld + player = world.player + + locations_per_region = get_locations_per_region(locations) + + regions = [ + create_region(world, player, locations_per_region, "Menu"), + create_region(world, player, locations_per_region, "Ness's Mind"), + create_region(world, player, locations_per_region, "Global ATM Access"), + create_region(world, player, locations_per_region, "Northern Onett"), + create_region(world, player, locations_per_region, "Onett"), + create_region(world, player, locations_per_region, "Arcade"), + create_region(world, player, locations_per_region, "Giant Step"), + create_region(world, player, locations_per_region, "Twoson"), + create_region(world, player, locations_per_region, "Common Condiment Shop"), + create_region(world, player, locations_per_region, "Everdred's House"), + create_region(world, player, locations_per_region, "Peaceful Rest Valley"), + create_region(world, player, locations_per_region, "Happy-Happy Village"), + create_region(world, player, locations_per_region, "Happy-Happy HQ"), + create_region(world, player, locations_per_region, "Lilliput Steps"), + create_region(world, player, locations_per_region, "Threed"), + create_region(world, player, locations_per_region, "Threed Underground"), + create_region(world, player, locations_per_region, "Boogey Tent"), + create_region(world, player, locations_per_region, "Grapefruit Falls"), + create_region(world, player, locations_per_region, "Belch's Factory"), + create_region(world, player, locations_per_region, "Saturn Valley"), + create_region(world, player, locations_per_region, "Upper Saturn Valley"), + create_region(world, player, locations_per_region, "Milky Well"), + create_region(world, player, locations_per_region, "Dusty Dunes Desert"), + create_region(world, player, locations_per_region, "Gold Mine"), + create_region(world, player, locations_per_region, "Monkey Caves"), + create_region(world, player, locations_per_region, "Fourside"), + create_region(world, player, locations_per_region, "Moonside"), + create_region(world, player, locations_per_region, "Fourside Dept. Store"), + create_region(world, player, locations_per_region, "Magnet Hill"), + create_region(world, player, locations_per_region, "Monotoli Building"), + create_region(world, player, locations_per_region, "Winters"), + create_region(world, player, locations_per_region, "Snow Wood Boarding School"), + create_region(world, player, locations_per_region, "Southern Winters"), + create_region(world, player, locations_per_region, "Brickroad Maze"), + create_region(world, player, locations_per_region, "Rainy Circle"), + create_region(world, player, locations_per_region, "Andonuts Lab Area"), + create_region(world, player, locations_per_region, "Stonehenge Base"), + create_region(world, player, locations_per_region, "Summers"), + create_region(world, player, locations_per_region, "Summers Museum"), + create_region(world, player, locations_per_region, "Dalaam"), + create_region(world, player, locations_per_region, "Pink Cloud"), + create_region(world, player, locations_per_region, "Scaraba"), + create_region(world, player, locations_per_region, "Pyramid"), + create_region(world, player, locations_per_region, "Southern Scaraba"), + create_region(world, player, locations_per_region, "Dungeon Man"), + create_region(world, player, locations_per_region, "Deep Darkness"), + create_region(world, player, locations_per_region, "Deep Darkness Darkness"), + create_region(world, player, locations_per_region, "Tenda Village"), + create_region(world, player, locations_per_region, "Lumine Hall"), + create_region(world, player, locations_per_region, "Lost Underworld"), + create_region(world, player, locations_per_region, "Fire Spring"), + create_region(world, player, locations_per_region, "Magicant"), + create_region(world, player, locations_per_region, "Sea of Eden"), + create_region(world, player, locations_per_region, "Cave of the Present") + + ] + if world.options.giygas_required: + regions.extend([ + create_region(world, player, locations_per_region, "Cave of the Past"), + create_region(world, player, locations_per_region, "Endgame") + ]) + multiworld.regions += regions + +def connect_area_exits(world: "EarthBoundWorld"): + multiworld = world.multiworld + player = world.player + + connect_menu_region(world) + arcade_connection = world.dungeon_connections["Arcade"] + giant_step_connection = world.dungeon_connections["Giant Step"] + lilliput_steps_connection = world.dungeon_connections["Lilliput Steps"] + happy_happy_hq_connection = world.dungeon_connections["Happy-Happy HQ"] + belch_factory_connection = world.dungeon_connections["Belch's Factory"] + milky_well_connection = world.dungeon_connections["Milky Well"] + gold_mine_connection = world.dungeon_connections["Gold Mine"] + moonside_connection = world.dungeon_connections["Moonside"] + monotoli_building_connection = world.dungeon_connections["Monotoli Building"] + magnet_hill_connection = world.dungeon_connections["Magnet Hill"] + pink_cloud_connection = world.dungeon_connections["Pink Cloud"] + pyramid_connection = world.dungeon_connections["Pyramid"] + dungeon_man_connection = world.dungeon_connections["Dungeon Man"] + rainy_circle_connection = world.dungeon_connections["Rainy Circle"] + stonehenge_connection = world.dungeon_connections["Stonehenge Base"] + lumine_hall_connection = world.dungeon_connections["Lumine Hall"] + fire_spring_connection = world.dungeon_connections["Fire Spring"] + sea_of_eden_connection = world.dungeon_connections["Sea of Eden"] + brickroad_maze_connection = world.dungeon_connections["Brickroad Maze"] + + multiworld.get_region("Ness's Mind", player).add_exits(["Onett", "Twoson", "Happy-Happy Village", "Threed", "Saturn Valley", "Dusty Dunes Desert", "Fourside", "Winters", "Summers", "Dalaam", "Scaraba", "Deep Darkness", "Tenda Village", "Lost Underworld", "Magicant"], + {"Onett": lambda state: state.has("Onett Teleport", player), + "Twoson": lambda state: state.has("Twoson Teleport", player), + "Happy-Happy Village": lambda state: state.has("Happy-Happy Village Teleport", player), + "Threed": lambda state: state.has("Threed Teleport", player), + "Saturn Valley": lambda state: state.has("Saturn Valley Teleport", player), + "Dusty Dunes Desert": lambda state: state.has("Dusty Dunes Teleport", player), + "Fourside": lambda state: state.has("Fourside Teleport", player), + "Winters": lambda state: state.has("Winters Teleport", player), + "Summers": lambda state: state.has("Summers Teleport", player), + "Dalaam": lambda state: state.has("Dalaam Teleport", player), + "Scaraba": lambda state: state.has("Scaraba Teleport", player), + "Deep Darkness": lambda state: state.has("Deep Darkness Teleport", player), + "Tenda Village": lambda state: state.has("Tenda Village Teleport", player), + "Lost Underworld": lambda state: state.has("Lost Underworld Teleport", player), + "Magicant": lambda state: state.has_any({"Magicant Teleport", "Magicant Unlock"}, player)}) + multiworld.get_region("Northern Onett", player).add_exits(["Onett"]) + + multiworld.get_region("Onett", player).add_exits([giant_step_connection, "Twoson", "Northern Onett", "Global ATM Access", arcade_connection], + {giant_step_connection: lambda state: state.has("Key to the Shack", player), + "Twoson": lambda state: state.has("Police Badge", player), + "Northern Onett": lambda state: state.has("Police Badge", player)}) + + multiworld.get_region("Twoson", player).add_exits(["Onett", "Peaceful Rest Valley", "Threed", "Everdred's House", "Global ATM Access", "Common Condiment Shop"], + {"Onett": lambda state: state.has("Police Badge", player), + "Peaceful Rest Valley": lambda state: state.has_any({"Pencil Eraser", "Valley Bridge Repair"}, player), + "Threed": lambda state: state.has_any({"Threed Tunnels Clear", "Wad of Bills"}, player), + "Everdred's House": lambda state: state.has("Paula", player)}) + + multiworld.get_region("Peaceful Rest Valley", player).add_exits(["Twoson", "Happy-Happy Village"], + {"Twoson": lambda state: state.has_any({"Pencil Eraser", "Valley Bridge Repair"}, player)}) + + multiworld.get_region("Happy-Happy Village", player).add_exits(["Peaceful Rest Valley", lilliput_steps_connection, "Global ATM Access", happy_happy_hq_connection]) + + multiworld.get_region("Threed", player).add_exits(["Twoson", "Dusty Dunes Desert", "Andonuts Lab Area", "Threed Underground", "Boogey Tent", "Global ATM Access"], + {"Twoson": lambda state: state.has("Threed Tunnels Clear", player), + "Dusty Dunes Desert": lambda state: state.has("Threed Tunnels Clear", player), + "Andonuts Lab Area": lambda state: state.has_all({"UFO Engine", "Bad Key Machine"}, player), + "Threed Underground": lambda state: state.has("Zombie Paper", player), + "Boogey Tent": lambda state: state.has("Jeff", player)}) + + multiworld.get_region("Threed Underground", player).add_exits(["Grapefruit Falls"]) + + multiworld.get_region("Grapefruit Falls", player).add_exits([belch_factory_connection, "Saturn Valley", "Threed Underground"], + {belch_factory_connection: lambda state: state.has("Jar of Fly Honey", player)}) + + multiworld.get_region(belch_factory_connection, player).add_exits(["Upper Saturn Valley"], + {"Upper Saturn Valley": lambda state: state.has("Threed Tunnels Clear", player)}) + + multiworld.get_region("Saturn Valley", player).add_exits(["Grapefruit Falls", "Cave of the Present", "Global ATM Access"], + {"Cave of the Present": lambda state: state.has("Meteorite Piece", player)}) + + multiworld.get_region("Upper Saturn Valley", player).add_exits([milky_well_connection, "Saturn Valley"]) + + multiworld.get_region("Dusty Dunes Desert", player).add_exits(["Threed", "Monkey Caves", gold_mine_connection, "Fourside", "Global ATM Access"], + {"Threed": lambda state: state.has("Threed Tunnels Clear", player), + "Monkey Caves": lambda state: state.has("King Banana", player), + gold_mine_connection: lambda state: state.has("Mining Permit", player)}) + + multiworld.get_region("Fourside", player).add_exits(["Dusty Dunes Desert", monotoli_building_connection, magnet_hill_connection, "Threed", "Fourside Dept. Store", "Global ATM Access", moonside_connection], + {monotoli_building_connection: lambda state: state.has("Yogurt Dispenser", player), + magnet_hill_connection: lambda state: state.has("Signed Banana", player), + "Threed": lambda state: state.has("Diamond", player), + "Fourside Dept. Store": lambda state: state.has("Jeff", player)}) + + multiworld.get_region("Moonside", player).add_exits(["Global ATM Access"]) + + multiworld.get_region("Summers", player).add_exits(["Scaraba", "Summers Museum", "Global ATM Access"], + {"Summers Museum": lambda state: state.has("Tiny Ruby", player)}) + + multiworld.get_region("Winters", player).add_exits(["Snow Wood Boarding School", "Southern Winters", "Global ATM Access"], + {"Snow Wood Boarding School": lambda state: state.has("Letter For Tony", player), + "Southern Winters": lambda state: state.has("Pak of Bubble Gum", player)}) + + multiworld.get_region("Southern Winters", player).add_exits([brickroad_maze_connection]) + + multiworld.get_region(brickroad_maze_connection, player).add_exits(["Southern Winters", rainy_circle_connection]) + + multiworld.get_region(rainy_circle_connection, player).add_exits([brickroad_maze_connection, "Andonuts Lab Area"]) + + multiworld.get_region("Andonuts Lab Area", player).add_exits([stonehenge_connection, "Winters", rainy_circle_connection], + {stonehenge_connection: lambda state: state.has("Eraser Eraser", player)}) + + multiworld.get_region("Dalaam", player).add_exits([pink_cloud_connection], + {pink_cloud_connection: lambda state: state.has("Carrot Key", player)}) + + multiworld.get_region("Scaraba", player).add_exits([pyramid_connection, "Global ATM Access", "Common Condiment Shop"], + {pyramid_connection: lambda state: state.has("Hieroglyph Copy", player)}) + + multiworld.get_region(pyramid_connection, player).add_exits(["Southern Scaraba"]) + + multiworld.get_region("Southern Scaraba", player).add_exits([dungeon_man_connection], + {dungeon_man_connection: lambda state: state.has_any({"Key to the Tower"}, player)}) + + multiworld.get_region("Dungeon Man", player).add_exits(["Deep Darkness"], + {"Deep Darkness": lambda state: state.has("Submarine to Deep Darkness", player)}) + + multiworld.get_region("Deep Darkness", player).add_exits(["Deep Darkness Darkness"], + {"Deep Darkness Darkness": lambda state: state.has("Hawk Eye", player)}) + + multiworld.get_region("Deep Darkness Darkness", player).add_exits(["Tenda Village", "Deep Darkness"]) + + multiworld.get_region("Tenda Village", player).add_exits([lumine_hall_connection, "Deep Darkness Darkness"], + {lumine_hall_connection: lambda state: state.has("Shyness Book", player), + "Deep Darkness Darkness": lambda state: state.has_all({"Shyness Book", "Hawk Eye"}, player)}) + + multiworld.get_region("Lumine Hall", player).add_exits(["Lost Underworld"]) + + multiworld.get_region("Lost Underworld", player).add_exits([fire_spring_connection]) + + if world.options.giygas_required: + multiworld.get_region("Cave of the Present", player).add_exits(["Cave of the Past"], + {"Cave of the Past": lambda state: state.has("Power of the Earth", player)}) + + multiworld.get_region("Cave of the Past", player).add_exits(["Endgame"], + {"Endgame": lambda state: state.has("Paula", player)}) + + if world.options.magicant_mode < MagicantMode.option_optional_boost: # 3 + multiworld.get_region("Magicant", player).add_exits(["Global ATM Access", sea_of_eden_connection], + {sea_of_eden_connection: lambda state: state.has("Ness", player)}) + + +def create_location(player: int, location_data: LocationData, region: Region) -> Location: + location = EBLocation(player, location_data.name, location_data.code, region) + + return location + + +def create_region(world: "EarthBoundWorld", player: int, locations_per_region: Dict[str, List[LocationData]], name: str) -> Region: + region = Region(name, player, world.multiworld) + + if name in locations_per_region: + for location_data in locations_per_region[name]: + location = create_location(player, location_data, region) + region.locations.append(location) + + return region + + +def get_locations_per_region(locations: List[LocationData]) -> Dict[str, List[LocationData]]: + per_region: Dict[str, List[LocationData]] = {} + + for location in locations: + per_region.setdefault(location.region, []).append(location) + + return per_region + + +def connect_menu_region(world: "EarthBoundWorld") -> None: + starting_region_list = { + 0: "Northern Onett", + 1: "Onett", + 2: "Twoson", + 3: "Happy-Happy Village", + 4: "Threed", + 5: "Saturn Valley", + 6: "Fourside", + 7: "Winters", + 8: "Summers", + 9: "Dalaam", + 10: "Scaraba", + 11: "Deep Darkness", + 12: "Tenda Village", + 13: "Lost Underworld", + 14: "Magicant" + } + + world.starting_region = starting_region_list[world.start_location] + world.multiworld.get_region("Menu", world.player).add_exits([world.starting_region, "Ness's Mind"], + {"Ness's Mind": lambda state: state.has_any({"Ness", "Paula", "Jeff", "Poo"}, world.player), + world.starting_region: lambda state: state.has_any({"Ness", "Paula", "Jeff", "Poo"}, world.player)}) + \ No newline at end of file diff --git a/worlds/earthbound/Rom.py b/worlds/earthbound/Rom.py new file mode 100644 index 0000000000..af23200e14 --- /dev/null +++ b/worlds/earthbound/Rom.py @@ -0,0 +1,848 @@ +import hashlib +import os +import Utils +import typing +import struct +import settings +from worlds.Files import APProcedurePatch, APTokenMixin, APTokenTypes, APPatchExtension +from .game_data import local_data +from .game_data.battle_bg_data import battle_bg_bpp +from .modules.psi_shuffle import write_psi +from .game_data.text_data import barf_text, text_encoder +from .modules.flavor_data import flavor_data, vanilla_flavor_pointers +from .modules.hint_data import parse_hint_data +from .modules.enemy_data import scale_enemies +from .modules.area_scaling import calculate_scaling +from .modules.boss_shuffle import write_bosses +from .modules.equipamizer import randomize_armor, randomize_weapons +from .modules.music_rando import music_randomizer +from .modules.palette_shuffle import randomize_psi_palettes, map_palette_shuffle +from .modules.shopsanity import write_shop_checks +from .modules.enemy_shuffler import apply_enemy_shuffle +from .modules.dungeon_er import write_dungeon_entrances +# from .modules.foodamizer import randomize_food +from .modules.enemizer.randomize_enemy_attributes import randomize_enemy_attributes +from .modules.enemizer.randomize_enemy_stats import randomize_enemy_stats +from .modules.enemizer.randomize_enemy_attacks import randomize_enemy_attacks +from .game_data.static_location_data import location_groups +from BaseClasses import ItemClassification +from typing import TYPE_CHECKING, Sequence +from logging import warning +# from .local_data import local_locations + +if TYPE_CHECKING: + from . import EarthBoundWorld + +item_id_table = local_data.item_id_table +location_dialogue = local_data.location_dialogue +present_locations = local_data.present_locations +psi_locations = local_data.psi_locations +npc_locations = local_data.npc_locations +character_locations = local_data.character_locations +special_name_table = local_data.special_name_table +item_space_checks = local_data.item_space_checks +local_present_types = local_data.local_present_types +present_text_pointers = local_data.present_text_pointers +psi_item_table = local_data.psi_item_table +character_item_table = local_data.character_item_table +party_id_nums = local_data.party_id_nums +starting_psi_table = local_data.starting_psi_table +badge_names = local_data.badge_names +world_version = local_data.world_version +protection_checks = local_data.protection_checks +protection_text = local_data.protection_text +nonlocal_present_types = local_data.nonlocal_present_types +ap_text_pntrs = local_data.ap_text_pntrs +money_item_table = local_data.money_item_table + +valid_hashes = ["a864b2e5c141d2dec1c4cbed75a42a85", # Cartridge + "6d71ccc8e2afda15d011348291afdf4f"] # VC + + +class LocalRom(object): + + def __init__(self, file: bytes, name: str | None = None) -> None: + self.file = bytearray(file) + self.name = name + + def read_byte(self, offset: int) -> int: + return self.file[offset] + + def read_bytes(self, offset: int, length: int) -> bytes: + return self.file[offset:offset + length] + + def write_bytes(self, offset: int, values: Sequence[int]) -> None: + self.file[offset:offset + len(values)] = values + + def get_bytes(self) -> bytes: + return bytes(self.file) + + +def patch_rom(world: "EarthBoundWorld", rom: LocalRom, player: int) -> None: + rom.copy_bytes(0x1578DD, 0x3E, 0x34A060) # Threed/Saturn teleport move + rom.copy_bytes(0x15791B, 0xF8, 0x157959) + + rom.copy_bytes(0x34A000, 0x1F, 0x1578DD) + rom.copy_bytes(0x34A020, 0x1F, 0x15793A) + rom.copy_bytes(0x34A040, 0x1F, 0x157A51) + rom.copy_bytes(0x34A060, 0x3E, 0x1578FC) + rom.copy_bytes(0x15ED4B, 0x06, 0x15F1FB) + rom.copy_bytes(0x1A7FA7, 0xBF, 0x389900) + + starting_area_coordinates = { + 0: [0x50, 0x04, 0xB5, 0x1F], # North Onett + 1: [0x52, 0x06, 0x4C, 0x1F], # Onett + 2: [0xEF, 0x22, 0x41, 0x1F], # Twoson + 3: [0x53, 0x06, 0x85, 0x1D], # Happy Happy + 4: [0x55, 0x24, 0x69, 0x1D], # Threed + 5: [0x60, 0x1D, 0x30, 0x01], # Saturn Valley + 6: [0xAB, 0x10, 0xF3, 0x09], # Fourside + 7: [0xE3, 0x09, 0xA3, 0x1D], # Winters + 8: [0xCB, 0x24, 0x7B, 0x1E], # Summers + 9: [0xD0, 0x1E, 0x31, 0x1D], # Dalaam + 10: [0xC7, 0x1F, 0x37, 0x19], # Scaraba + 11: [0xDD, 0x1B, 0xB7, 0x17], # Deep Darkness + 12: [0xD0, 0x25, 0x47, 0x18], # Tenda Village + 13: [0x9C, 0x00, 0x84, 0x17], # Lost Underworld + 14: [0x4B, 0x11, 0xAD, 0x18] # Magicant + } + + starting_levels = { + "Ness": 0x15F5FB, + "Paula": 0x15F60F, + "Jeff": 0x15F623, + "Poo": 0x15F637 + } + + atm_card_slots = { + "Ness": 0x15F5FF, + "Paula": 0x15F613, + "Jeff": 0x15F629, + "Poo": 0x15F63B + } + + starting_weapon = { + "Ness": [0x15F600, 0x12], + "Paula": [0x15F615, 0x1C], + "Jeff": [0x15F62A, 0x24] + } + + teleport_learnlevel = { + "Ness": [0x158D53, 0x158D62], + "Paula": [0x158D54, 0x158D63], + "Poo": [0x158D55, 0x158D64] + } + world.start_items = [] + world.handled_locations = [] + + for item in world.multiworld.precollected_items[world.player]: + world.start_items.append(item.name) + + if world.options.random_start_location: + rom.write_bytes(0x0F96C2, bytearray([0x69, 0x00])) + rom.write_bytes(0x0F9618, bytearray([0x69, 0x00])) + rom.write_bytes(0x0F9629, bytearray([0x69, 0x00])) # Block Northern Onett + else: + rom.write_bytes(0x00B66A, bytearray([0x06])) # Fix starting direction + + rom.write_bytes(0x01FE9B, bytearray(starting_area_coordinates[world.start_location][0:2])) + rom.write_bytes(0x01FE9E, bytearray(starting_area_coordinates[world.start_location][2:4])) # Start position + + rom.write_bytes(0x01FE91, bytearray(starting_area_coordinates[world.start_location][0:2])) + rom.write_bytes(0x01FE8B, bytearray(starting_area_coordinates[world.start_location][2:4])) # Respawn position + + if world.options.skip_epilogue: + rom.write_bytes(0x09C4D4, struct.pack("I", 0xEEA437)) + + if world.starting_character == "Poo": + rom.write_bytes(starting_levels[world.starting_character], bytearray([0x06])) + else: + rom.write_bytes(starting_levels[world.starting_character], bytearray([0x03])) + rom.write_bytes(atm_card_slots[world.starting_character], bytearray([0xB1])) + if world.starting_character != "Ness": + rom.write_bytes(atm_card_slots["Ness"], bytearray([0x58])) + if world.starting_character != "Poo": + rom.write_bytes(starting_weapon[world.starting_character][0], bytearray([starting_weapon[world.starting_character][1]])) + + if world.starting_character != "Jeff": + for i in range(2): + rom.write_bytes(teleport_learnlevel[world.starting_character][i - 1], bytearray([0x01])) + else: + rom.write_bytes(0x15F62B, bytearray([0xB5])) + + if world.options.alternate_sanctuary_goal: + rom.write_bytes(0x04FD72, bytearray([world.options.sanctuaries_required.value + 2])) + else: + rom.write_bytes(0x04FD72, bytearray([0xFF])) + + if not world.options.giygas_required: + rom.write_bytes(0x2E9C29, bytearray([0x10, 0xA5])) + + if world.options.magicant_mode == 2: + rom.write_bytes(0x04FD71, bytearray([world.options.sanctuaries_required.value + 1])) + rom.write_bytes(0x2EA26A, bytearray([0x0A, 0x10, 0xA5, 0xEE])) # Alt goal magicant sets the credits + elif world.options.magicant_mode == 1: + rom.write_bytes(0x2E9C29, bytearray([0x00, 0xA5])) + if world.options.giygas_required: + rom.write_bytes(0x2EA26A, bytearray([0x08, 0xD9, 0x9B, 0xEE])) # Give stat boost if magicant + giygas required + else: + rom.write_bytes(0x2EA26A, bytearray([0x0A, 0x10, 0xA5, 0xEE])) # If no giygas, set credits + elif world.options.magicant_mode == 3: + rom.write_bytes(0x2EA26A, bytearray([0x08, 0x0F, 0x9C, 0xEE])) # Give only stat boost if set to boost + + rom.write_bytes(0x04FD74, bytearray([world.options.death_link.value])) + rom.write_bytes(0x04FD75, bytearray([world.options.death_link_mode.value])) + rom.write_bytes(0x04FD76, bytearray([world.options.remote_items.value])) + rom.write_bytes(0x04FD78, bytearray([world.options.energy_link.value])) + + if world.options.death_link_mode != 1: + rom.write_bytes(0x2FFDFE, bytearray([0x80])) # Mercy healing + rom.write_bytes(0x2FFE30, bytearray([0x80])) # Mercy text + rom.write_bytes(0x2FFE59, bytearray([0x80])) # Mercy revive + # IF YOU ADD ASM, CHANGE THESE OR THE GAME WILL CRASH + + if world.options.monkey_caves_mode == 2: + rom.write_bytes(0x062B87, bytearray([0x0A, 0x28, 0xCA, 0xEE])) + elif world.options.monkey_caves_mode == 3: + rom.write_bytes(0x0F1388, bytearray([0x03, 0xCA, 0xEE])) + + if world.options.no_free_sanctuaries: + rom.write_bytes(0x0F09F2, bytearray([0x15, 0x84])) # Lock Lilliput steps with flag $0415 + rom.write_bytes(0x0F09EE, struct.pack("I", 0xEEF790)) # Lilliput door script + + rom.write_bytes(0x0F23D2, bytearray([0x16, 0x84])) # Lock Fire Spring with flag $0146 + rom.write_bytes(0x0F23CE, struct.pack("I", 0xEEF946)) # Fire Spring door script + + rom.write_bytes(0x04FD70, bytearray([world.options.sanctuaries_required.value])) + shop_checks = [] + + for location in world.multiworld.get_locations(player): + if location.address: + receiver_name = world.multiworld.get_player_name(location.item.player) + name = location.name + if world.options.remote_items: + item = "Remote Item" + else: + item = location.item.name + item_name_loc = (((location.address - 0xEB0000) * 128) + 0x3F0000) + # todo; replace with the encoder function + item_text = text_encoder(location.item.name, 128) + item_text.extend([0x00]) + player_name_loc = (((location.address - 0xEB0000) * 48) + 0x3F8000) + player_text = text_encoder(receiver_name, 48) + # Locations over this address are Shopsanity locations and handled in the shopsanity module + if location.address < 0xEB1000: + rom.write_bytes(item_name_loc, bytearray(item_text)) + rom.write_bytes(player_name_loc, bytearray(player_text)) + + if item not in item_id_table or location.item.player != location.player: + item_id = 0xAD + else: + item_id = item_id_table[item] + + if name in location_dialogue: + for i in range(len(location_dialogue[name])): + if location.item.player != location.player or item == "Remote Item": + rom.write_bytes(location_dialogue[name][i] - 1, bytearray([0x17, location.address - 0xEB0000])) + elif item in item_id_table: + rom.write_bytes(location_dialogue[name][i], bytearray([item_id])) + elif item in psi_item_table or item in character_item_table: + rom.write_bytes(location_dialogue[name][i] - 1, bytearray([0x16, special_name_table[item][0]])) + elif item in money_item_table: + rom.write_bytes(location_dialogue[name][i] - 1, bytearray([0x16, (0x16 + list(money_item_table).index(item))])) + + if name in present_locations: + world.handled_locations.append(name) + if item == "Nothing": # I can change this to "In nothing_table" later todo: make it so nonlocal items do not follow this table + rom.write_bytes(present_locations[name], bytearray([0x00, 0x00, 0x01])) + elif location.item.player != location.player or item == "Remote Item": + rom.write_bytes(present_locations[name], bytearray([item_id, 0x00, 0x00, (location.address - 0xEB0000)])) + elif item in item_id_table: + rom.write_bytes(present_locations[name], bytearray([item_id, 0x00])) + elif item in psi_item_table: + rom.write_bytes(present_locations[name], bytearray([psi_item_table[item], 0x00, 0x02])) + elif item in character_item_table: + rom.write_bytes(present_locations[name], bytearray([character_item_table[item][0], 0x00, 0x03])) + elif item in money_item_table: + rom.write_bytes(present_locations[name], struct.pack("H", money_item_table[item])) + rom.write_bytes(present_locations[name] + 2, bytearray([0x01])) + + if name in npc_locations: + world.handled_locations.append(name) + for i in range(len(npc_locations[name])): + if item in item_id_table or location.item.player != location.player or item == "Remote Item": + rom.write_bytes(npc_locations[name][i], bytearray([item_id])) + elif item in psi_item_table or item in character_item_table: + rom.write_bytes(npc_locations[name][i] - 3, bytearray([0x0E, 0x00, 0x0E, (special_name_table[item][0] + 1)])) + rom.write_bytes(npc_locations[name][i] + 2, bytearray([0xA5, 0xAA, 0xEE])) + elif item in money_item_table: + rom.write_bytes(npc_locations[name][i] - 3, bytearray([0x1D, 0x25])) + rom.write_bytes(npc_locations[name][i] - 1, struct.pack("H", money_item_table[item])) + rom.write_bytes(npc_locations[name][i] + 2, bytearray([0x00, 0xF0, 0xF3])) + + if name in psi_locations: + world.handled_locations.append(name) + if item in special_name_table and location.item.player == location.player and item != "Remote Item": + rom.write_bytes(psi_locations[name][0], special_name_table[item][1].to_bytes(3, byteorder="little")) + rom.write_bytes(psi_locations[name][0] + 4, bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00])) + elif item in money_item_table and location.item.player == location.player: + rom.write_bytes(psi_locations[name][0] - 1, bytearray([0x1D, 0x25])) + rom.write_bytes(psi_locations[name][0] + 1, struct.pack("H", money_item_table[item])) + rom.write_bytes(psi_locations[name][0] + 3, bytearray([0x08, 0x26, 0xF0, 0xF3, 0x00, 0x03, 0x00])) + else: + rom.write_bytes(psi_locations[name][0], bytearray(psi_locations[name][1:4])) + rom.write_bytes(psi_locations[name][4], bytearray([item_id])) + + if name in character_locations: + world.handled_locations.append(name) + if item in character_item_table and location.item.player == location.player and item != "Remote Item": + rom.write_bytes(character_locations[name][0], special_name_table[item][1].to_bytes(3, byteorder="little")) + if name == "Snow Wood - Bedroom": # Use lying down sprites for the bedroom check + rom.write_bytes(character_locations[name][1], struct.pack("H", character_item_table[item][2])) + rom.write_bytes(0x0FB0D8, bytearray([0x06])) + else: + rom.write_bytes(character_locations[name][1], struct.pack("H", character_item_table[item][1])) + elif item in psi_item_table and location.item.player == location.player: + rom.write_bytes(character_locations[name][0], (special_name_table[item][1] + 1).to_bytes(3, byteorder="little")) + rom.write_bytes(character_locations[name][1], bytearray([0x62])) + rom.write_bytes(character_locations[name][2], bytearray([0x70, 0xF9, 0xD5])) + elif item in money_item_table and location.item.player == location.player: + rom.write_bytes(character_locations[name][2] - 1, bytearray([0x1D, 0x25])) + rom.write_bytes(character_locations[name][2] + 1, struct.pack("H", money_item_table[item])) + rom.write_bytes(character_locations[name][0] - 2, bytearray([0x01])) + rom.write_bytes(character_locations[name][0], bytearray([0x4B, 0xF0, 0xF3])) + rom.write_bytes(character_locations[name][1], bytearray([0x97])) + else: + rom.write_bytes(character_locations[name][0], bytearray(character_locations[name][4:7])) + if location.item.name in ["Ness", "Paula", "Jeff", "Poo"]: + rom.write_bytes(character_locations[name][1], bytearray([character_item_table[location.item.name][1]])) + else: + rom.write_bytes(character_locations[name][1], bytearray([0x97])) + rom.write_bytes(character_locations[name][2], bytearray([0x18, 0xF9, 0xD5])) + rom.write_bytes(character_locations[name][3], bytearray([item_id])) + if name == "Deep Darkness - Barf Character": + if item in character_item_table: + rom.write_bytes(0x2EA0E2, bytearray(barf_text[item][0:3])) + rom.write_bytes(0x2EA0E8, bytearray(barf_text[item][3:6])) + elif item in psi_item_table and location.item.player == location.player: + rom.write_bytes(0x2EA0E2, bytearray([0x98, 0xC3, 0xEE])) + rom.write_bytes(0x2EA0E8, bytearray([0xF7, 0xC4, 0xEE])) + else: + rom.write_bytes(0x2EA0E2, bytearray([0x6A, 0xC3, 0xEE])) + rom.write_bytes(0x2EA0E8, bytearray([0xB4, 0xC4, 0xEE])) + + if name == "Poo - Starting Item": + world.handled_locations.append(name) + if item in item_id_table and location.item.player == location.player and item != "Remote Item": + rom.write_bytes(0x15F63C, bytearray([item_id])) + else: + rom.write_bytes(0x15F63C, bytearray([0x00])) # Don't give anything if the item doesn't have a tangible ID + + if item in special_name_table and location.item.player == location.player: # Apply a special script if teleport or character + rom.write_bytes(0x15F765, special_name_table[item][1].to_bytes(3, byteorder="little")) # This might be offset, check if it is + rom.write_bytes(0x2EC618, bytearray([(special_name_table[item][0] + 1)])) + rom.write_bytes(0x2EC61A, bytearray([0xA5, 0xAA, 0xEE])) + rom.write_bytes(0x2EC613, bytearray([0x03, 0x01])) + + if item in money_item_table and location.item.player == location.player: + rom.write_bytes(0x15F764, bytearray([0x1D, 0x08])) + rom.write_bytes(0x15F766, struct.pack("H", money_item_table[item])) + rom.write_bytes(0x15F768, bytearray([0x01])) + + if location.address >= 0xEB1000: + world.handled_locations.append(name) + shop_checks.append(location) + + if name not in world.handled_locations: + warning(f"{name} not placed in {world.multiworld.get_player_name(world.player)}'s EarthBound world. Something went wrong here.") + + if name in item_space_checks: + if item not in item_id_table or location.item.player != location.player: + if len(item_space_checks[name]) == 4: + rom.write_bytes(item_space_checks[name][0], bytearray(item_space_checks[name][1:4])) + else: + rom.write_bytes(item_space_checks[name][0], bytearray(item_space_checks[name][1:4])) + rom.write_bytes(item_space_checks[name][4], bytearray(item_space_checks[name][5:8])) + + if name in present_locations and "Lost Underworld" not in name and world.options.presents_match_contents: + if ItemClassification.trap in location.item.classification: + world.present_type = "trap" + elif ItemClassification.progression in location.item.classification: + world.present_type = "progression" + elif ItemClassification.useful in location.item.classification: + world.present_type = "useful" + else: + world.present_type = "filler" + + if location.item.player == world.player or world.options.nonlocal_items_use_local_presents: + rom.write_bytes(present_locations[name] - 12, bytearray(local_present_types[world.present_type])) + if name != "Threed - Boogey Tent Trashcan": + rom.write_bytes(present_locations[name] - 4, bytearray(present_text_pointers[world.present_type])) + else: + rom.write_bytes(present_locations[name] - 12, bytearray(nonlocal_present_types[world.present_type])) + if name != "Threed - Boogey Tent Trashcan": + if world.present_type == "progression": + rom.write_bytes(present_locations[name] - 4, struct.pack("I", world.random.choice(ap_text_pntrs))) + elif world.present_type == "trap": + rom.write_bytes(present_locations[name] - 4, bytearray([0x8D, 0xce, 0xee])) + else: + rom.write_bytes(present_locations[name] - 4, bytearray([0xc1, 0xcd, 0xee])) + + location = world.multiworld.get_location("Twoson - Bike Shop Rental", world.player) + if location.item.name in item_id_table: + item_id = item_id_table[location.item.name] + else: + item_id = 0xAD + + rom.write_bytes(0x0800C4, bytearray([item_id])) # Bike shop + rom.write_bytes(0x0802EA, bytearray([item_id])) + + rom.write_bytes(0x2EA05C, bytearray([item_id_table[world.slime_pile_wanted_item]])) + rom.write_bytes(0x2F61F6, bytearray([item_id_table[world.slime_pile_wanted_item]])) + + hintable_locations = [ + location for location in world.multiworld.get_locations() + if location.player == world.player or location.item.player == world.player + ] + world.hint_pointer = 0x0000 + world.hint_number = 0 + for index, hint in enumerate(world.in_game_hint_types): + if hint == "item_at_location": + for location in hintable_locations: + if location.name == world.hinted_locations[index] and location.player == world.player: + parse_hint_data(world, location, rom, hint, index) + + elif hint == "region_progression_check": + world.progression_count = 0 + for location in hintable_locations: + if location.name in location_groups[world.hinted_regions[index]] and location.player == world.player: + if ItemClassification.progression in location.item.classification: + world.progression_count += 1 + world.hinted_area = world.hinted_regions[index] # im doing a little sneaky + parse_hint_data(world, location, rom, hint, index) + + elif hint == "hint_for_good_item" or hint == "prog_item_at_region": + hintable_locations_2 = [] + for location in hintable_locations: + if location.item.name == world.hinted_items[index] and location.item.player == world.player: + hintable_locations_2.append(location) + if hintable_locations_2 == []: + # This is just failsafe behavior + warning(f"Warning: Unable to create local hint for {world.hinted_items[index]} for " + + f"{world.multiworld.get_player_name(world.player)}'s EarthBound world." + + " Please report this.") + location = world.random.choice(hintable_locations) + else: + location = world.random.choice(hintable_locations_2) + parse_hint_data(world, location, rom, hint, index) + + elif hint == "item_in_local_region": + for location in hintable_locations: + if location.name == world.hinted_locations[index] and location.player == world.player: + parse_hint_data(world, location, rom, hint, index) + else: + location = "null" + parse_hint_data(world, location, rom, hint, index) + + for location in hintable_locations: + if location.item.name == "Paula": + world.paula_region = location.parent_region + + if location.item.name == "Jeff": + world.jeff_region = location.parent_region + + if location.item.name == "Poo": + world.poo_region = location.parent_region + + if world.options.skip_prayer_sequences: + rom.write_bytes(0x07BC96, bytearray([0x02])) + rom.write_bytes(0x07BA2C, bytearray([0x02])) + rom.write_bytes(0x07BAC7, bytearray([0x02])) + rom.write_bytes(0x07BB38, bytearray([0x02])) + rom.write_bytes(0x07BBF3, bytearray([0x02])) + rom.write_bytes(0x07BC56, bytearray([0x02])) + rom.write_bytes(0x07B9A1, bytearray([0x1f, 0xeb, 0xff, 0x02, 0x1f, 0x1f, 0xca, 0x01, 0x06, 0x1f, 0x1f, 0x72, 0x01, 0x06, 0x02])) # Clean up overworld stuff + + if world.options.easy_deaths: + rom.write_bytes(0x2EBFF9, bytearray([0x0A])) + rom.write_bytes(0x04C7CE, bytearray([0x5C, 0x8A, 0xFB, 0xEF])) # Jump to code that restores the party + rom.write_bytes(0x04C7D4, bytearray([0xEA, 0xEA, 0xEA])) + # rom.write_bytes(0x04C7DA, bytearray([0xEA, 0xEA]))#Stop the game from zeroing stuff + rom.write_bytes(0x0912F2, bytearray([0x0A, 0xFE, 0xBF, 0xEE])) + rom.write_bytes(0x2EBFFE, bytearray([0x00, 0x1B, 0x04, 0x15, 0x38, 0x1F, 0x81, 0xFF, 0xFF, 0x1B, 0x04, 0x0A, 0xF7, 0x12, 0xC9])) # Hospitals = 0$ + rom.write_bytes(0x04C822, bytearray([0xEA, 0xEA, 0xEA, 0xEA])) + rom.write_bytes(0x04C7F7, bytearray([0x00, 0x00])) # Stop "rounding up" the money + + if world.options.magicant_mode >= 2: + rom.write_bytes(0x077629, bytearray([item_id_table[world.magicant_junk[0]]])) + rom.write_bytes(0x077614, bytearray([item_id_table[world.magicant_junk[0]]])) + rom.write_bytes(0x0FF25C, bytearray([item_id_table[world.magicant_junk[1]]])) + rom.write_bytes(0x0FF27E, bytearray([item_id_table[world.magicant_junk[2]]])) + rom.write_bytes(0x0FF28F, bytearray([item_id_table[world.magicant_junk[3]]])) + rom.write_bytes(0x0FF2A0, bytearray([item_id_table[world.magicant_junk[4]]])) + rom.write_bytes(0x0FF26D, bytearray([item_id_table[world.magicant_junk[5]]])) + + rom.write_bytes(0x02EC1AA, bytearray([world.options.sanctuaries_required.value])) + if world.options.alternate_sanctuary_goal and world.options.giygas_required: + rom.write_bytes(0x02EC1E2, bytearray([0xFD, 0xC1, 0xEE])) + + if world.options.magicant_mode == 1 and world.options.giygas_required: # Apple kid text + rom.write_bytes(0x2EC1D8, bytearray([0x33, 0xC2, 0xEE])) + elif world.options.magicant_mode == 2: + rom.write_bytes(0x2EC1D8, bytearray([0x6A, 0xC2, 0xEE])) + + if not world.options.giygas_required: + rom.write_bytes(0x2EC164, bytearray([0xE8, 0xF0, 0xEE])) + rom.write_bytes(0x02EC1E2, bytearray([0x40, 0xC1, 0xEE])) + rom.write_bytes(0x02EC1E2, bytearray([0x40, 0xC1, 0xEE])) + + flavor_address = 0x3FAF10 + for i in range(4): + rom.copy_bytes(world.flavor_pointer[i], 2, 0x34B110 + (2 * i)) + + rom.copy_bytes(0x202008, 0x100, 0x34B000) + for i in range(4): + if world.available_flavors[i] not in ["Mint flavor", "Strawberry flavor", "Banana flavor", "Peanut flavor"]: + rom.write_bytes(flavor_address, bytearray(world.flavor_text[i])) + flavor_addr = flavor_address - 0x3F0000 + flavor_addr = struct.pack("H", flavor_addr) + rom.write_bytes(world.flavor_pointer[i], flavor_addr) + rom.write_bytes(world.flavor_pointer[i] + 5, bytearray([0xFF])) + flavor_address += len(world.flavor_text[i]) + rom.write_bytes(0x202008 + (0x40 * i), bytearray(flavor_data[world.available_flavors[i]])) + else: + rom.copy_bytes(vanilla_flavor_pointers[world.available_flavors[i]][1], 0x40, 0x202008 + (0x40 * i)) + rom.copy_bytes(vanilla_flavor_pointers[world.available_flavors[i]][2], 2, world.flavor_pointer[i]) + + rom.write_bytes(0x048037, bytearray(world.lumine_text)) + starting_item_address = 0 + starting_psi = 0 + starting_char = 0 + starting_psi_types = [] + starting_character_count = [] + starting_inventory_pointers = { + "Ness": 0x99F3, + "Paula": 0x9A53, + "Jeff": 0x9AB4, + "Poo": 0x9B0F + } + + starting_inv_amounts = { + "Ness": 0x0B, + "Paula": 0x0A, + "Jeff": 0x08, + "Poo": 0x0C + } + + location = world.multiworld.get_location("Poo - Starting Item", world.player) + if world.starting_character == "Poo" and location.item.name in item_id_table and location.item.player == world.player: + starting_inventory_pointers["Poo"] = 0x9B10 + starting_inv_amounts["Poo"] = 0x0B + rom.write_bytes(0x16FB66, struct.pack("H", starting_inventory_pointers[world.starting_character])) + rom.write_bytes(0x16FB68, struct.pack("H", starting_inv_amounts[world.starting_character])) + + for item in world.multiworld.precollected_items[player]: + if item.name == world.starting_character: # Write the starting character + rom.write_bytes(0x00B672, bytearray([world.options.starting_character.value + 1])) + + if world.options.remote_items: + continue + + if item.name == "Photograph": + rom.write_bytes(0x17FEA8, bytearray([0x01])) + + if item.name == "Poo" and world.multiworld.get_location("Poo - Starting Item", world.player).item.name in special_name_table and item.player == world.player: + world.multiworld.push_precollected(world.multiworld.get_location("Poo - Starting Item", world.player).item) + elif item.name == "Poo" and world.multiworld.get_location("Poo - Starting Item", world.player).item.name in money_item_table: + world.starting_money += money_item_table[world.multiworld.get_location("Poo - Starting Item", world.player).item.name] + + # if item.name == "Poo" and world.multiworld.get_location("Poo - Starting Item", world.player).item.name == "Photograph": + # rom.write_bytes(0x17FEA9, bytearray([0x01])) + + if item.name in ["Progressive Bat", "Progressive Fry Pan", "Progressive Gun", "Progressive Bracelet", + "Progressive Other"]: + old_item_name = item.name + item.name = world.progressive_item_groups[item.name][world.start_prog_counts[item.name]] + if world.start_prog_counts[old_item_name] != len(world.progressive_item_groups[old_item_name]) - 1: + world.start_prog_counts[old_item_name] += 1 + + if item.name in item_id_table: + rom.write_bytes(0x375000 + starting_item_address, bytearray([item_id_table[item.name]])) + starting_item_address += 1 + elif item.name in psi_item_table: + if item.name != "Progressive Poo PSI": + if item.name not in starting_psi_types: + rom.write_bytes(0x17FC7C + starting_psi, bytearray([starting_psi_table[item.name]])) + starting_psi_types.append(item.name) + starting_psi += 1 + else: + if starting_psi_types.count(item.name) < 2: + rom.write_bytes(0x17FC7C + starting_psi, bytearray([starting_psi_table[item.name]])) + starting_psi_types.append(item.name) + starting_psi += 1 + elif item.name in character_item_table and item.name != "Photograph": + if item.name not in starting_character_count: + rom.write_bytes(0x17FC8D + starting_char, bytearray([party_id_nums[item.name]])) + starting_character_count.append(item.name) + starting_char += 1 + elif item.name in money_item_table: + world.starting_money += money_item_table[item] + + if world.options.random_battle_backgrounds: + bpp2_bgs = [bg_id for bg_id, bpp in battle_bg_bpp.items() if bpp == 2] + bpp4_bgs = [bg_id for bg_id, bpp in battle_bg_bpp.items() if bpp == 4] + for i in range(483): + world.flipped_bg = world.random.randint(0, 100) + if i == 480: + drawn_background = struct.pack("H", 0x00E3) + else: + drawn_background = struct.pack("H", world.random.randint(0x01, 0x0146)) + + if battle_bg_bpp[struct.unpack("H", drawn_background)[0]] == 4: + drawn_background_2 = struct.pack("H", 0x0000) + else: + drawn_background_2 = struct.pack("H", world.random.choice(bpp2_bgs)) + #print(f"ello mate we are doing background {i} at {hex(0xCBD89A + (i * 4))}, the background is {drawn_background[0]}.") + if world.flipped_bg > 33 or drawn_background not in bpp2_bgs: + rom.write_bytes(0x0BD89A + (i * 4), drawn_background) + rom.write_bytes(0x0BD89C + (i * 4), drawn_background_2) + else: + rom.write_bytes(0x0BD89A + (i * 4), drawn_background_2) + rom.write_bytes(0x0BD89C + (i * 4), drawn_background) + + rom.write_bytes(0x00B5F1, struct.pack("H", world.random.choice(bpp4_bgs))) + + if world.options.random_swirl_colors: + if world.random.random() < 0.5: + rom.write_bytes(0x02E98A, bytearray([0x7F])) # Color math mode + rom.write_bytes(0x02E996, bytearray([0x3F])) + + rom.write_bytes(0x300240, bytearray([world.random.randint(0x00, 0x1F)])) # Normal swirls + rom.write_bytes(0x300245, bytearray([world.random.randint(0x00, 0x1F)])) + rom.write_bytes(0x30024A, bytearray([world.random.randint(0x00, 0x1F)])) + + rom.write_bytes(0x300253, bytearray([world.random.randint(0x00, 0x1F)])) # Green swirls + rom.write_bytes(0x300258, bytearray([world.random.randint(0x00, 0x1F)])) + rom.write_bytes(0x30025D, bytearray([world.random.randint(0x00, 0x1F)])) + + rom.write_bytes(0x300269, bytearray([world.random.randint(0x00, 0x1F)])) # Red swirls + rom.write_bytes(0x30026E, bytearray([world.random.randint(0x00, 0x1F)])) + rom.write_bytes(0x300273, bytearray([world.random.randint(0x00, 0x1F)])) + + if not world.options.prefixed_items: + rom.write_bytes(0x15F9DC, bytearray([0x06])) + rom.write_bytes(0x15F9DE, bytearray([0x08])) + rom.write_bytes(0x15F9E0, bytearray([0x05])) + rom.write_bytes(0x15F9E2, bytearray([0x0B])) + rom.write_bytes(0x15F9E4, bytearray([0x0F])) + rom.write_bytes(0x15F9E6, bytearray([0x10])) + # change if necessary + + if world.options.psi_shuffle: + write_psi(world, rom) + + world.description_pointer = 0x1000 + if world.options.armorizer: + randomize_armor(world, rom) + + if world.options.weaponizer: + randomize_weapons(world, rom) + + music_randomizer(world, rom) + if world.options.map_palette_shuffle: + map_palette_shuffle(world, rom) + if world.options.randomize_psi_palettes: + randomize_psi_palettes(world, rom) + + if world.options.randomize_enemy_attributes: + randomize_enemy_attributes(world, rom) + + if world.options.randomize_enemy_stats: + randomize_enemy_stats(world, rom) + + if world.options.randomize_enemy_attacks: + randomize_enemy_attacks(world, rom) + + apply_enemy_shuffle(world, rom) + # randomize_food(world,rom) + write_bosses(world, rom) + if world.options.dungeon_shuffle: + write_dungeon_entrances(world, rom) + + world.get_all_spheres.wait() + calculate_scaling(world) + if world.options.shop_randomizer: + write_shop_checks(world, rom, shop_checks) + + scale_enemies(world, rom) + world.badge_name = badge_names[world.franklin_protection] + world.badge_name = text_encoder(world.badge_name, 23) + world.badge_name.extend([0x00]) + world.starting_money = min(world.starting_money, 99999) + world.starting_money = struct.pack(' bytes: + return get_base_rom_bytes() + + def write_bytes(self, offset: int, value: typing.Iterable[int]) -> None: + self.write_token(APTokenTypes.WRITE, offset, bytes(value)) + + def copy_bytes(self, source: int, amount: int, destination: int) -> None: + self.write_token(APTokenTypes.COPY, destination, (amount, source)) + + +class EBPatchExtensions(APPatchExtension): + game = "EarthBound" + + @staticmethod + def repoint_vanilla_tables(caller: APProcedurePatch, rom: bytes) -> bytes: + rom = LocalRom(rom) + version_check = rom.read_bytes(0x3FF0A0, 16) + version_check = version_check.split(b'\x00', 1)[0] + version_check_str = version_check.decode("ascii") + client_version = world_version + if client_version != version_check_str and version_check_str != "": + raise Exception(f"Error! Patch generated on EarthBound APWorld version {version_check_str} doesn't match client version {client_version}! " + + f"Please use EarthBound APWorld version {version_check_str} for patching.") + elif version_check_str == "": + raise Exception(f"Error! Patch generated on old EarthBound APWorld version, doesn't match client version {client_version}! " + + f"Please verify you are using the same APWorld as the generator.") + + for action_number in range(0x013F): + current_action = rom.read_bytes(0x157B68 + (12 * action_number), 12) + rom.write_bytes(0x3FAFB0 + (12 * action_number), current_action) + + for psi_number in range(0x35): + current_action = rom.read_bytes(0x158A50 + (15 * psi_number), 15) + rom.write_bytes(0x350000 + (15 * psi_number), current_action) + + psi_text_table = rom.read_bytes(0x158D7A, (25 * 17)) + rom.write_bytes(0x3B0500, psi_text_table) + + psi_anim_config = rom.read_bytes(0x0CF04D, 0x0198) + rom.write_bytes(0x360000, psi_anim_config) + + psi_anim_pointers = rom.read_bytes(0x0CF58F, 0x088) + rom.write_bytes(0x360400, psi_anim_pointers) + + psi_anim_palettes = rom.read_bytes(0x0CF47F, 0x0110) + rom.write_bytes(0x360600, psi_anim_palettes) + + for psi_number in range(0x32): + psi_anim = rom.read_bytes(0x2F8583 + (0x04 * psi_number), 4) + rom.write_bytes(0x3B0003 + (4 * psi_number), psi_anim) + rom.write_bytes(0x3B0003, bytearray([0x4C])) + # rom.write_bytes(0x3B0002, bytearray([0x45])) + + main_font_data = rom.read_bytes(0x210C7A, 96) + main_font_gfx = rom.read_bytes(0x210CDA, 0x0C00) + saturn_font_data = rom.read_bytes(0x201359, 96) + saturn_font_gfx = rom.read_bytes(0x2013B9, 0x0C00) + letter_n = rom.read_bytes(0x21169F, 6) + letter_a = rom.read_bytes(0x2114FF, 6) + letter_e = rom.read_bytes(0x21157F, 6) + saturn_a = rom.read_bytes(0x2017DD, 9) + saturn_n = rom.read_bytes(0x20197E, 8) + saturn_e = rom.read_bytes(0x20185C, 24) + + accent_tilde = rom.read_bytes(0x2118A1, 2) + saturn_tilde = rom.read_bytes(0x201F7F, 2) + + rom.write_bytes(0x3A0000, main_font_data) + rom.write_bytes(0x3C0000, main_font_gfx) + + rom.write_bytes(0x3A0100, saturn_font_data) + rom.write_bytes(0x3C1000, saturn_font_gfx) + rom.write_bytes(0x3C0D25, letter_n) # Setup n + rom.write_bytes(0x3C0D45, letter_a) # Setup a + rom.write_bytes(0x3C0D65, letter_e) + rom.write_bytes(0x3C0D22, accent_tilde) + + rom.write_bytes(0x3C1D25, saturn_n) # Setup n + rom.write_bytes(0x3C1D45, saturn_a) + rom.write_bytes(0x3C1D63, saturn_e) + rom.write_bytes(0x3C1D22, saturn_tilde) + + # --------------------------------------- + ness_level = rom.read_bytes(0x15F5FB, 1) + paula_level = rom.read_bytes(0x15f60f, 1) + jeff_level = rom.read_bytes(0x15f623, 1) + poo_level = rom.read_bytes(0x15f637, 1) + + ness_start_exp = rom.read_bytes(0x158F49 + (ness_level[0] * 4), 4) + paula_start_exp = rom.read_bytes(0x1590D9 + (paula_level[0] * 4), 4) + jeff_start_exp = rom.read_bytes(0x159269 + (jeff_level[0] * 4), 4) + poo_start_exp = rom.read_bytes(0x1593F9 + (poo_level[0] * 4), 4) + + rom.write_bytes(0x17FD40, ness_start_exp) + rom.write_bytes(0x17FD44, paula_start_exp) + rom.write_bytes(0x17FD48, jeff_start_exp) + rom.write_bytes(0x17FD4C, poo_start_exp) + return rom.get_bytes() + + +def get_base_rom_bytes(file_name: str = "") -> bytes: + base_rom_bytes = getattr(get_base_rom_bytes, "base_rom_bytes", None) + if not base_rom_bytes: + file_name = 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 basemd5.hexdigest() not in valid_hashes: + raise Exception('Supplied Base Rom does not match known MD5 for US(1.0) 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: settings.Settings = settings.get_settings() + if not file_name: + file_name = options["earthbound_options"]["rom_file"] + if not os.path.exists(file_name): + file_name = Utils.user_path(file_name) + return file_name + + +# Fix hint text, I have a special idea where I can give it info on a random region diff --git a/worlds/earthbound/Rules.py b/worlds/earthbound/Rules.py new file mode 100644 index 0000000000..1028868676 --- /dev/null +++ b/worlds/earthbound/Rules.py @@ -0,0 +1,128 @@ +from worlds.generic.Rules import set_rule, forbid_items_for_player, add_rule +from typing import TYPE_CHECKING +from .Options import ShopRandomizer, MonkeyCavesMode +if TYPE_CHECKING: + from . import EarthBoundWorld + + +def set_location_rules(world: "EarthBoundWorld") -> None: + player = world.player + twoson_paula_room_present = world.get_location("Twoson - Paula's Room Present") + can_buy_pizza = world.get_location("Threed - Downtown Trashcan") + + set_rule(world.multiworld.get_location("Onett - Traveling Entertainer", player), lambda state: state.has("Key to the Shack", player)) + set_rule(world.multiworld.get_location("Onett - South Road Present", player), lambda state: state.has("Police Badge", player)) + set_rule(world.multiworld.get_location("Onett - Tracy Gift", player), lambda state: state.has("Ness", player)) + set_rule(world.multiworld.get_location("Twoson - Paula's Mother", player), lambda state: state.has("Paula", player)) + set_rule(world.multiworld.get_location("Twoson - Everdred Meeting", player), lambda state: state.has("Paula", player)) + set_rule(world.multiworld.get_location("Twoson - Insignificant Location", player), lambda state: state.has("Insignificant Item", player)) + set_rule(world.multiworld.get_location("Happy-Happy Village - Defeat Carpainter", player), lambda state: state.has("Franklin Badge", player)) + set_rule(world.multiworld.get_location("Carpainter Defeated", player), lambda state: state.has("Franklin Badge", player)) + set_rule(world.multiworld.get_location("Happy-Happy Village - Prisoner", player), lambda state: state.has("Key to the Cabin", player)) + set_rule(world.multiworld.get_location("Threed - Boogey Tent Trashcan", player), lambda state: state.has("Jeff", player)) + set_rule(world.multiworld.get_location("Threed - Zombie Prisoner", player), lambda state: state.has("Bad Key Machine", player)) + set_rule(world.multiworld.get_location("Saturn Valley - Post Belch Gift #1", player), lambda state: state.has("Threed Tunnels Clear", player)) + set_rule(world.multiworld.get_location("Saturn Valley - Post Belch Gift #2", player), lambda state: state.has("Threed Tunnels Clear", player)) + set_rule(world.multiworld.get_location("Saturn Valley - Post Belch Gift #3", player), lambda state: state.has("Threed Tunnels Clear", player)) + set_rule(world.multiworld.get_location("Saturn Valley - Saturn Coffee", player), lambda state: state.has("Threed Tunnels Clear", player)) + set_rule(world.multiworld.get_location("Monkey Caves - Talah Rama Chest #1", player), lambda state: state.has("Pencil Eraser", player)) + set_rule(world.multiworld.get_location("Monkey Caves - Talah Rama Chest #2", player), lambda state: state.has("Pencil Eraser", player)) + set_rule(world.multiworld.get_location("Monkey Caves - Talah Rama Gift", player), lambda state: state.has("Pencil Eraser", player)) + set_rule(world.multiworld.get_location("Monkey Caves - Monkey Power", player), lambda state: state.has("Pencil Eraser", player)) + set_rule(world.multiworld.get_location("Dusty Dunes - Mine Reward", player), lambda state: state.can_reach_region("Gold Mine", player)) + set_rule(world.multiworld.get_location("Snow Wood - Upper Right Locker", player), lambda state: state.has("Key to the Locker", player)) + set_rule(world.multiworld.get_location("Snow Wood - Upper Left Locker", player), lambda state: state.has("Key to the Locker", player)) + set_rule(world.multiworld.get_location("Snow Wood - Bottom Right Locker", player), lambda state: state.has("Key to the Locker", player)) + set_rule(world.multiworld.get_location("Snow Wood - Bottom Left Locker", player), lambda state: state.has("Key to the Locker", player)) + set_rule(world.multiworld.get_location("Fourside - Bakery 2F Gift", player), lambda state: state.has("Contact Lens", player)) + set_rule(world.multiworld.get_location("Fourside - Department Store Blackout", player), lambda state: state.has("Jeff", player)) + set_rule(world.multiworld.get_location("Fourside - Venus Gift", player), lambda state: state.has("Diamond", player)) + set_rule(world.multiworld.get_location("Summers - Museum Item", player), lambda state: state.has("Tiny Ruby", player)) + set_rule(world.multiworld.get_location("Dalaam - Trial of Mu", player), lambda state: state.has("Poo", player)) + set_rule(world.multiworld.get_location("Poo - Starting Item", player), lambda state: state.has("Poo", player)) + set_rule(world.multiworld.get_location("Deep Darkness - North Alcove Truffle", player), lambda state: state.has("Piggy Nose", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Near Land Truffle", player), lambda state: state.has("Piggy Nose", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Present Truffle", player), lambda state: state.has("Piggy Nose", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Village Truffle", player), lambda state: state.has("Piggy Nose", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Entrance Truffle", player), lambda state: state.has("Piggy Nose", player)) + set_rule(world.multiworld.get_location("Tenda Village - Tenda Tea", player), lambda state: state.has("Shyness Book", player)) + set_rule(world.multiworld.get_location("Tenda Village - Tenda Gift", player), lambda state: state.has("Shyness Book", player)) + set_rule(world.multiworld.get_location("Tenda Village - Tenda Gift #2", player), lambda state: state.has("Shyness Book", player)) + set_rule(world.multiworld.get_location("Lost Underworld - Talking Rock", player), lambda state: state.has("Tendakraut", player)) + set_rule(world.multiworld.get_location("Sanctuary Goal", player), lambda state: state.has("Melody", player, world.options.sanctuaries_required.value)) + forbid_items_for_player(world.multiworld.get_location("Poo - Starting Item", player), {"Poo"}, player) + forbid_items_for_player(world.multiworld.get_location("Poo - Starting Item", player), {"Progressive Bat"}, player) + forbid_items_for_player(world.multiworld.get_location("Poo - Starting Item", player), {"Progressive Gun"}, player) + forbid_items_for_player(world.multiworld.get_location("Poo - Starting Item", player), {"Progressive Fry Pan"}, player) + forbid_items_for_player(world.multiworld.get_location("Poo - Starting Item", player), {"Progressive Bracelet"}, player) + forbid_items_for_player(world.multiworld.get_location("Poo - Starting Item", player), {"Progressive Other"}, player) + + if world.options.giygas_required: + set_rule(world.multiworld.get_location("Giygas", player), lambda state: state.has("Paula", player)) + + if world.options.monkey_caves_mode < MonkeyCavesMode.option_shop: # 2 + set_rule(world.multiworld.get_location("Monkey Caves - West 2F Left Chest", player), lambda state: (twoson_paula_room_present.can_reach(state) or can_buy_pizza.can_reach(state))) + set_rule(world.multiworld.get_location("Monkey Caves - East 2F Left Chest", player), lambda state: (twoson_paula_room_present.can_reach(state) or can_buy_pizza.can_reach(state))) + set_rule(world.multiworld.get_location("Monkey Caves - East End Chest", player), lambda state: (twoson_paula_room_present.can_reach(state) or can_buy_pizza.can_reach(state))) + set_rule(world.multiworld.get_location("Monkey Caves - East End Trashcan", player), lambda state: (twoson_paula_room_present.can_reach(state) or can_buy_pizza.can_reach(state))) + set_rule(world.multiworld.get_location("Monkey Caves - East West 3F Right Chest #1", player), lambda state: (twoson_paula_room_present.can_reach(state) or can_buy_pizza.can_reach(state))) + set_rule(world.multiworld.get_location("Monkey Caves - East West 3F Right Chest #2", player), lambda state: (twoson_paula_room_present.can_reach(state) or can_buy_pizza.can_reach(state))) + + add_rule(world.multiworld.get_location("Monkey Caves - Talah Rama Chest #1", player), lambda state: (twoson_paula_room_present.can_reach(state) or can_buy_pizza.can_reach(state))) + add_rule(world.multiworld.get_location("Monkey Caves - Talah Rama Chest #2", player), lambda state: (twoson_paula_room_present.can_reach(state) or can_buy_pizza.can_reach(state))) + add_rule(world.multiworld.get_location("Monkey Caves - Talah Rama Gift", player), lambda state: (twoson_paula_room_present.can_reach(state) or can_buy_pizza.can_reach(state))) + add_rule(world.multiworld.get_location("Monkey Caves - Monkey Power", player), lambda state: (twoson_paula_room_present.can_reach(state) or can_buy_pizza.can_reach(state))) + + if world.options.no_free_sanctuaries: + lilliput_steps = world.multiworld.get_entrance(f"Happy-Happy Village -> {world.dungeon_connections['Lilliput Steps']}", player) + fire_spring = world.multiworld.get_entrance(f"Lost Underworld -> {world.dungeon_connections['Fire Spring']}", player) + add_rule(fire_spring, lambda state: state.has("Tenda Lavapants", player)) + add_rule(lilliput_steps, lambda state: state.has("Tiny Key", player)) + + if world.options.shop_randomizer == ShopRandomizer.option_shopsanity: # 2 + set_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 1", player), lambda state: state.has("Tendakraut", player)) + set_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 2", player), lambda state: state.has("Tendakraut", player)) + set_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 3", player), lambda state: state.has("Tendakraut", player)) + set_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 4", player), lambda state: state.has("Tendakraut", player)) + set_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 5", player), lambda state: state.has("Tendakraut", player)) + set_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 6", player), lambda state: state.has("Tendakraut", player)) + set_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 7", player), lambda state: state.has("Tendakraut", player)) + + set_rule(world.multiworld.get_location("Dusty Dunes - Mine Food Cart Slot 1", player), lambda state: state.has("Mining Permit", player)) + set_rule(world.multiworld.get_location("Dusty Dunes - Mine Food Cart Slot 2", player), lambda state: state.has("Mining Permit", player)) + set_rule(world.multiworld.get_location("Dusty Dunes - Mine Food Cart Slot 3", player), lambda state: state.has("Mining Permit", player)) + set_rule(world.multiworld.get_location("Dusty Dunes - Mine Food Cart Slot 4", player), lambda state: state.has("Mining Permit", player)) + set_rule(world.multiworld.get_location("Dusty Dunes - Mine Food Cart Slot 5", player), lambda state: state.has("Mining Permit", player)) + set_rule(world.multiworld.get_location("Dusty Dunes - Mine Food Cart Slot 6", player), lambda state: state.has("Mining Permit", player)) + set_rule(world.multiworld.get_location("Dusty Dunes - Mine Food Cart Slot 7", player), lambda state: state.has("Mining Permit", player)) + + set_rule(world.multiworld.get_location("Saturn Valley Shop - Post-Belch Saturn Slot 1", player), lambda state: state.has("Threed Tunnels Clear", player)) + set_rule(world.multiworld.get_location("Saturn Valley Shop - Post-Belch Saturn Slot 2", player), lambda state: state.has("Threed Tunnels Clear", player)) + set_rule(world.multiworld.get_location("Saturn Valley Shop - Post-Belch Saturn Slot 3", player), lambda state: state.has("Threed Tunnels Clear", player)) + set_rule(world.multiworld.get_location("Saturn Valley Shop - Post-Belch Saturn Slot 4", player), lambda state: state.has("Threed Tunnels Clear", player)) + + set_rule(world.multiworld.get_location("Deep Darkness - Arms Dealer Slot 1", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Arms Dealer Slot 2", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Arms Dealer Slot 3", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Arms Dealer Slot 4", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Businessman Slot 1", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Businessman Slot 2", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Businessman Slot 3", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Businessman Slot 4", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Businessman Slot 5", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Businessman Slot 6", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Deep Darkness - Businessman Slot 7", player), lambda state: state.has("ATM Access", player)) + + add_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 1", player), lambda state: state.has("ATM Access", player)) + add_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 2", player), lambda state: state.has("ATM Access", player)) + add_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 3", player), lambda state: state.has("ATM Access", player)) + add_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 4", player), lambda state: state.has("ATM Access", player)) + add_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 5", player), lambda state: state.has("ATM Access", player)) + add_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 6", player), lambda state: state.has("ATM Access", player)) + add_rule(world.multiworld.get_location("Lost Underworld - Tenda Camp Shop Slot 7", player), lambda state: state.has("ATM Access", player)) + + set_rule(world.multiworld.get_location("Dalaam Restaurant - Slot 1", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Dalaam Restaurant - Slot 2", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Dalaam Restaurant - Slot 3", player), lambda state: state.has("ATM Access", player)) + set_rule(world.multiworld.get_location("Dalaam Restaurant - Slot 4", player), lambda state: state.has("ATM Access", player)) + \ No newline at end of file diff --git a/worlds/earthbound/__init__.py b/worlds/earthbound/__init__.py new file mode 100644 index 0000000000..3f2a1dc39c --- /dev/null +++ b/worlds/earthbound/__init__.py @@ -0,0 +1,609 @@ +import os +import typing +import threading +import pkgutil +from typing import List, Set, Dict, TextIO, Tuple + +from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification +from Fill import fill_restrictive +from worlds.AutoWorld import World, WebWorld +import itertools +import settings +from .Items import get_item_names_per_category, item_table +from .Locations import get_locations +from .Regions import init_areas, connect_area_exits +from .Options import EBOptions, eb_option_groups +from .setup_game import setup_gamevars, place_static_items +from .modules.enemy_data import initialize_enemies +from .modules.flavor_data import create_flavors +from .game_data.local_data import item_id_table, world_version +from .modules.hint_data import setup_hints +from .game_data.text_data import spoiler_psi, spoiler_starts, spoiler_badges +from .Client import EarthBoundClient +from .Rules import set_location_rules +from .Rom import patch_rom, EBProcPatch, valid_hashes +from .game_data.static_location_data import location_ids, location_groups +from .modules.equipamizer import EBArmor, EBWeapon +from .modules.boss_shuffle import BossData, SlotInfo +from worlds.generic.Rules import add_item_rule +from Options import OptionError + + +class EBSettings(settings.Group): + class RomFile(settings.SNESRomPath): + """File name of the EarthBound US ROM""" + description = "EarthBound ROM File" + copy_to = "EarthBound.sfc" + md5s = valid_hashes + + rom_file: RomFile = RomFile(RomFile.copy_to) + + +class EBWeb(WebWorld): + theme = "ocean" + + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to setting up the EarthBound randomizer" + "and connecting to an Archipelago server.", + "English", + "setup_en.md", + "setup/en", + ["Pink Switch"] + ) + + + tutorials = [setup_en] + + option_groups = eb_option_groups + # option_presets = eb_option_presets + +class EBItem(Item): + game: str = "EarthBound" + + +class EarthBoundWorld(World): + """EarthBound is a contemporary-themed JRPG. Take four psychically-endowed children + across the world in search of 8 Melodies to defeat Giygas, the cosmic evil.""" + + game = "EarthBound" + option_definitions = EBOptions + data_version = 1 + required_client_version = (0, 5, 0) + + item_name_to_id = {item: data.code for item, data in item_table.items() if data.code} + location_name_to_id = location_ids + item_name_groups = get_item_names_per_category() + location_name_groups = location_groups + + web = EBWeb() + settings: typing.ClassVar[EBSettings] + # topology_present = True + + options_dataclass = EBOptions + options: EBOptions + + locked_locations: List[str] + location_cache: List[Location] + + def __init__(self, multiworld: MultiWorld, player: int): + self.rom_name_available_event = threading.Event() + super().__init__(multiworld, player) + + self.locked_locations = [] + self.location_cache = [] + self.event_count = 8 + self.progressive_filler_bats: int = 0 + self.progressive_filler_pans: int = 0 + self.progressive_filler_guns: int = 0 + self.progressive_filler_bracelets: int = 0 + self.progressive_filler_other: int = 0 + self.world_version: str = world_version + self.armor_list = Dict[str, EBArmor] + self.weapon_list = Dict[str, EBWeapon] + self.boss_slots = Dict[str, SlotInfo] + self.boss_info = Dict[str, BossData] + self.starting_character: str | None = None + self.locals = [] + self.rom_name = None + self.starting_area_teleport = None + self.common_gear = [] + self.uncommon_gear = [] + self.rare_gear = [] + self.get_all_spheres = threading.Event() + self.boss_list: List[str] = [] + self.starting_region = str + self.start_location = int + self.dungeon_connections: dict[str, str] = {} + self.has_generated_output: bool = False + self.hint_man_hints: list[tuple[int | str, player]] = [] + + self.common_items = [ + "Cookie", + "Bag of Fries", + "Teddy Bear", + "Hamburger", + "Boiled Egg", + "Fresh Egg", + "Picnic Lunch", + "Croissant", + "Bread Roll", + "Can of Fruit Juice", + "Royal Iced Tea", + "Protein Drink", + "Bottle of Water", + "Cold Remedy", + "Vial of Serum", + "Ketchup Packet", + "Sugar Packet", + "Tin of Cocoa", + "Carton of Cream", + "Sprig of Parsley", + "Jar of Hot Sauce", + "Salt Packet", + "Wet Towel", + "Refreshing Herb", + "Ruler", + "Protractor", + "Insecticide Spray", + "Rust Promoter", + "Stag Beetle", + "Toothbrush", + "Handbag Strap", + "Chick", + "Chicken", + "Trout Yogurt", + "Banana", + "Calorie Stick", + "Gelato de Resort", + "Snake", + "Cup of Noodles", + "Cup of Coffee", + "Double Burger", + "Bean Croquette", + "Molokheiya Soup", + "Plain Roll", + "Magic Tart", + "PSI Caramel", + "Popsicle", + "Bottle Rocket" + ] + + self.common_gear = [ + "Yo-yo", + "Slingshot", + "Travel Charm", + "Great Charm", + "Ribbon", + "Red Ribbon" + ] + + self.uncommon_items = [ + "Pasta di Summers", + "Pizza", + "Chef's Special", + "Super Plush Bear", + "Jar of Delisauce", + "Secret Herb", + "Xterminator Spray", + "Snake Bag", + "Bomb", + "Rust Promoter DX", + "Pair of Dirty Socks", + "Mummy Wrap", + "Pharaoh's Curse", + "Sudden Guts Pill", + "Picture Postcard", + "Viper", + "Repel Sandwich", + "Lucky Sandwich", + "Peanut Cheese Bar", + "Bowl of Rice Gruel", + "Kabob", + "Plain Yogurt", + "Beef Jerky", + "Mammoth Burger", + "Bottle of DXwater", + "Magic Pudding", + "Big Bottle Rocket", + "Bazooka", + "Meteornium" + + ] + + self.uncommon_gear = [ + "Trick Yo-yo", + "Bionic Slingshot", + "Crystal Charm", + "Defense Ribbon", + "Earth Pendant", + "Flame Pendant", + "Rain Pendant", + "Night Pendant" + ] + + self.rare_items = [ + "Large Pizza", + "Magic Truffle", + "Brain Food Lunch", + "Rock Candy", + "Kraken Soup", + "IQ Capsule", + "Guts Capsule", + "Speed Capsule", + "Vital Capsule", + "Luck Capsule", + "Horn of Life", + "Multi Bottle Rocket", + "Super Bomb", + "Bag of Dragonite", + "Meteotite", + "Repel Superwich", + "Piggy Jelly", + "Spicy Jerky", + "Luxury Jerky", + "Cup of Lifenoodles" + ] + + self.rare_gear = [ + "Combat Yo-yo", + "Sword of Kings", + "Sea Pendant", + "Star Pendant", + "Goddess Ribbon" + ] + + self.money = [ + "$10", + "$100", + "$1000" + ] + + def generate_early(self) -> None: # Todo: place locked items in generate_early + self.starting_character = self.options.starting_character.current_key.capitalize() + self.locals = [] + local_space_count = 0 + max_counts = { + "Ness": 12, + "Paula": 11, + "Jeff": 9, + "Poo": 12 + } + + max_count = max_counts[self.starting_character] + for item_name, amount in itertools.chain(self.options.start_inventory.items(), self.options.start_inventory_from_pool.items()): + if item_name in item_id_table: + local_space_count += amount + if local_space_count > max_count and not self.options.remote_items: + player = self.multiworld.get_player_name(self.player) + raise OptionError(f"{player}: starting inventory cannot place more than {max_count} items into 'Goods' for {self.starting_character}. Attempted to place {local_space_count} Goods items.") + + setup_gamevars(self) + create_flavors(self) + initialize_enemies(self) + + if not self.options.character_shuffle: + self.options.local_items.value.update(["Paula", "Jeff", "Poo", "Flying Man"]) + self.event_count += 6 + + if self.options.local_teleports: + self.options.local_items.value |= self.item_name_groups["PSI"] + + def create_regions(self) -> None: + init_areas(self, get_locations(self)) + connect_area_exits(self) + place_static_items(self) + + def create_items(self) -> None: + pool = self.get_item_pool(self.get_excluded_items()) + self.fill_item_pool(pool) + + self.multiworld.itempool += pool + + def set_rules(self) -> None: + set_location_rules(self) + self.multiworld.completion_condition[self.player] = lambda state: state.has('Saved Earth', self.player) + + def pre_fill(self) -> None: + prefill_locations = [] + prefill_items = [] + + if not self.options.character_shuffle: + main_characters = ["Ness", "Paula", "Jeff", "Poo"] + for character in main_characters: + if character != self.starting_character: + prefill_items.append(self.create_item(character)) + + prefill_items.extend([ + self.create_item("Flying Man"), + self.create_item("Teddy Bear"), + self.create_item("Super Plush Bear") + ]) + + prefill_locations.extend([ + self.multiworld.get_location("Happy-Happy Village - Prisoner", self.player), + self.multiworld.get_location("Threed - Zombie Prisoner", self.player), + self.multiworld.get_location("Snow Wood - Bedroom", self.player), + self.multiworld.get_location("Monotoli Building - Monotoli Character", self.player), + self.multiworld.get_location("Dalaam - Throne Character", self.player), + self.multiworld.get_location("Deep Darkness - Barf Character", self.player), + ]) + self.random.shuffle(prefill_locations) + add_item_rule(self.multiworld.get_location("Happy-Happy Village - Prisoner", self.player), lambda item: item.name in self.item_name_groups["Characters"]) + add_item_rule(self.multiworld.get_location("Threed - Zombie Prisoner", self.player), lambda item: item.name in self.item_name_groups["Characters"]) + add_item_rule(self.multiworld.get_location("Snow Wood - Bedroom", self.player), lambda item: item.name in self.item_name_groups["Characters"]) + add_item_rule(self.multiworld.get_location("Monotoli Building - Monotoli Character", self.player), lambda item: item.name in self.item_name_groups["Characters"]) + add_item_rule(self.multiworld.get_location("Dalaam - Throne Character", self.player), lambda item: item.name in self.item_name_groups["Characters"]) + add_item_rule(self.multiworld.get_location("Deep Darkness - Barf Character", self.player), lambda item: item.name in self.item_name_groups["Characters"]) + + fill_restrictive(self.multiworld, self.multiworld.get_all_state(False, collect_pre_fill_items=False), prefill_locations, prefill_items, True, True) + setup_hints(self) + + def get_pre_fill_items(self) -> list[Item]: + characters = ["Ness", "Paula", "Jeff", "Poo"] + prefill_items = [] + for character in characters: + if character != self.starting_character: + prefill_items.append(self.create_item(f"{character}")) + return prefill_items + + @classmethod + def stage_generate_output(cls, multiworld: MultiWorld, output_directory: str) -> None: + try: + multiworld.earthbound_locations_by_sphere = list(multiworld.get_spheres()) + except Exception: + raise + finally: + for world in multiworld.get_game_worlds("EarthBound"): + world.get_all_spheres.set() + + def generate_output(self, output_directory: str) -> None: + self.has_generated_output = True # Make sure data defined in generate output doesn't get added to spoiler only mode + try: + patch = EBProcPatch(player=self.player, player_name=self.multiworld.player_name[self.player]) + patch.write_file("earthbound_basepatch.bsdiff4", pkgutil.get_data(__name__, "src/earthbound_basepatch.bsdiff4")) + patch_rom(self, patch, self.player) + + self.rom_name = patch.name + + patch.write(os.path.join(output_directory, + f"{self.multiworld.get_out_file_name_base(self.player)}{patch.patch_file_ending}")) + except Exception: + raise + finally: + self.rom_name_available_event.set() # make sure threading continues and errors are collected + + def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]) -> None: + if self.options.dungeon_shuffle: + dungeon_entrances = {} + dungeon_mapping = {} + for dungeon in self.dungeon_connections: + dungeon_entrances[self.dungeon_connections[dungeon]] = dungeon + + for dungeon in dungeon_entrances: + for location in self.get_region(dungeon).locations: + if location.address: + dungeon_mapping[location.address] = dungeon_entrances[dungeon] + + hint_data[self.player] = dungeon_mapping + + def fill_slot_data(self) -> Dict[str, typing.Any]: + return { + "starting_area": self.start_location, + "pizza_logic": self.options.monkey_caves_mode.value, + "free_sancs": self.options.no_free_sanctuaries.value, + "shopsanity": self.options.shop_randomizer.value, + "hint_man_hints": self.hint_man_hints + } + + def modify_multidata(self, multidata: dict) -> None: + import base64 + # wait for self.rom_name to be available. + self.rom_name_available_event.wait() + rom_name = getattr(self, "rom_name", None) + 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 write_spoiler_header(self, spoiler_handle: TextIO) -> None: + spoiler_handle.write(f"\nStarting Location: {spoiler_starts[self.start_location]}\n") + spoiler_handle.write(f"Franklin Badge Protection: {spoiler_badges[self.franklin_protection]}\n") + if self.options.psi_shuffle: + spoiler_handle.write("\nPSI Shuffle:\n") + spoiler_handle.write(f" Favorite Thing PSI Slot: {spoiler_psi[self.offensive_psi_slots[0]]}\n") + spoiler_handle.write(f" Ness Offensive PSI Middle Slot: {spoiler_psi[self.offensive_psi_slots[1]]}\n") + spoiler_handle.write(f" Paula Offensive PSI Top Slot: {spoiler_psi[self.offensive_psi_slots[2]]}\n") + spoiler_handle.write(f" Paula/Poo Offensive PSI Middle Slot: {spoiler_psi[self.offensive_psi_slots[3]]}\n") + spoiler_handle.write(f" Paula/Poo Offensive PSI Bottom Slot: {spoiler_psi[self.offensive_psi_slots[4]]}\n") + spoiler_handle.write(f" Poo Progressive PSI Slot: {spoiler_psi[self.offensive_psi_slots[5]]}\n") + + spoiler_handle.write(f" Ness/Poo Shield Slot: {spoiler_psi[self.shield_slots[0]]}\n") + spoiler_handle.write(f" Paula Shield Slot: {spoiler_psi[self.shield_slots[1]]}\n") + + spoiler_handle.write(f" Ness Assist PSI Middle Slot: {spoiler_psi[self.assist_psi_slots[0]]}\n") + spoiler_handle.write(f" Ness Assist PSI Bottom Slot: {spoiler_psi[self.assist_psi_slots[1]]}\n") + spoiler_handle.write(f" Paula Assist PSI Middle Slot: {spoiler_psi[self.assist_psi_slots[2]]}\n") + spoiler_handle.write(f" Paula Assist PSI Bottom Slot: {spoiler_psi[self.assist_psi_slots[3]]}\n") + spoiler_handle.write(f" Poo Assist PSI Slot: {spoiler_psi[self.assist_psi_slots[4]]}\n") + if self.options.psi_shuffle == 2: + spoiler_handle.write(f" Bomb/Bazooka Slot: {spoiler_psi[self.jeff_offense_items[0]]}\n") + spoiler_handle.write(f" Bottle Rocket Slot: {spoiler_psi[self.jeff_offense_items[1]]}\n") + + spoiler_handle.write(f" Spray Can Slot: {spoiler_psi[self.jeff_assist_items[0]]}\n") + spoiler_handle.write(f" Multi-Level Gadget Slot 1: {spoiler_psi[self.jeff_assist_items[1]]}\n") + spoiler_handle.write(f" Single-Level Gadget Slot 1: {spoiler_psi[self.jeff_assist_items[2]]}\n") + spoiler_handle.write(f" Single-Level Gadget Slot 2: {spoiler_psi[self.jeff_assist_items[3]]}\n") + spoiler_handle.write(f" Multi-Level Gadget Slot 2: {spoiler_psi[self.jeff_assist_items[4]]}\n") + + if self.options.boss_shuffle: + spoiler_handle.write("\nBoss Randomization:\n" + + f" Frank => {self.boss_list[0]}\n" + + f" Frankystein Mark II => {self.boss_list[1]}\n" + + f" Titanic Ant => {self.boss_list[2]}\n" + + f" Captain Strong => {self.boss_list[3]}\n" + + f" Everdred => {self.boss_list[4]}\n" + + f" Mr. Carpainter => {self.boss_list[5]}\n" + + f" Mondo Mole => {self.boss_list[6]}\n" + + f" Boogey Tent => {self.boss_list[7]}\n" + + f" Mini Barf => {self.boss_list[8]}\n" + + f" Master Belch => {self.boss_list[9]}\n" + + f" Trillionage Sprout => {self.boss_list[10]}\n" + + f" Guardian Digger => {self.boss_list[11]}\n" + + f" Dept. Store Spook => {self.boss_list[12]}\n" + + f" Evil Mani-Mani => {self.boss_list[13]}\n" + + f" Clumsy Robot => {self.boss_list[14]}\n" + + f" Shrooom! => {self.boss_list[15]}\n" + + f" Plague Rat of Doom => {self.boss_list[16]}\n" + + f" Thunder and Storm => {self.boss_list[17]}\n" + + f" Kraken => {self.boss_list[18]}\n" + + f" Guardian General => {self.boss_list[19]}\n" + + f" Master Barf => {self.boss_list[20]}\n" + + f" Starman Deluxe => {self.boss_list[21]}\n" + + f" Electro Specter => {self.boss_list[22]}\n" + + f" Carbon Dog => {self.boss_list[23]}\n" + + f" Ness's Nightmare => {self.boss_list[24]}\n" + + f" Heavily Armed Pokey => {self.boss_list[25]}\n" + + f" Starman Junior => {self.boss_list[26]}\n" + + f" Diamond Dog => {self.boss_list[27]}\n" + + f" Giygas (Phase 2) => {self.boss_list[28]}\n") + + if self.options.dungeon_shuffle: + spoiler_handle.write("\nDungeon Entrances:\n") + for dungeon in self.dungeon_connections: + spoiler_handle.write( + f" {dungeon} => {self.dungeon_connections[dungeon]}\n" + ) + + if self.has_generated_output: + spoiler_handle.write("\nArea Levels:\n") + spoiler_excluded_areas = ["Ness's Mind", "Global ATM Access", "Common Condiment Shop"] + for area in self.area_levels: + if area not in spoiler_excluded_areas: + spoiler_handle.write(f" {area}: Level {self.area_levels[area]}\n") + + def create_item(self, name: str) -> EBItem: + data = item_table[name] + return EBItem(name, data.classification, data.code, self.player) + + def get_filler_item_name(self) -> str: # Todo: make this suck less + weights = {"rare": self.options.rare_filler_weight.value, "uncommon": self.options.uncommon_filler_weight.value, "common": self.options.common_filler_weight.value, + "rare_gear": int(self.options.rare_filler_weight.value * 0.5), "uncommon_gear": int(self.options.uncommon_filler_weight.value * 0.5), + "common_gear": int(self.options.common_filler_weight.value * 0.5), "money": self.options.money_weight.value} + + filler_type = self.random.choices(list(weights), weights=list(weights.values()), k=1)[0] + weight_table = { + "common": self.common_items, + "common_gear": self.common_gear, + "uncommon": self.uncommon_items, + "uncommon_gear": self.uncommon_gear, + "rare": self.rare_items, + "rare_gear": self.rare_gear, + "money": self.money + } + return self.random.choice(weight_table[filler_type]) + + def get_excluded_items(self) -> Set[str]: + excluded_items: Set[str] = set() + excluded_items.add(self.starting_character) + starting_area_to_teleport = ["Onett Teleport", "Onett Teleport", "Twoson Teleport", "Happy-Happy Village Teleport", + "Threed Teleport", "Saturn Valley Teleport", "Fourside Teleport", "Winters Teleport", + "Summers Teleport", "Dalaam Teleport", "Scaraba Teleport", "Deep Darkness Teleport", + "Tenda Village Teleport", "Lost Underworld Teleport", "Magicant Teleport"] + self.starting_area_teleport = starting_area_to_teleport[self.start_location] + excluded_items.add(self.starting_area_teleport) + if self.options.random_start_location: + excluded_items.add(self.starting_teleport) + + if self.options.magicant_mode not in [0, 3]: + excluded_items.add("Magicant Teleport") + + if not self.options.character_shuffle: + excluded_items.add("Ness") + excluded_items.add("Paula") + excluded_items.add("Jeff") + excluded_items.add("Poo") + excluded_items.add("Flying Man") + + if self.options.progressive_weapons: + excluded_items.add("Magicant Bat") + excluded_items.add("Legendary Bat") + excluded_items.add("Pop Gun") + excluded_items.add("Stun Gun") + excluded_items.add("Death Ray") + excluded_items.add("Moon Beam Gun") + + if self.options.progressive_armor: + excluded_items.add("Platinum Band") + excluded_items.add("Diamond Band") + excluded_items.add("Pixie's Bracelet") + excluded_items.add("Cherub's Band") + excluded_items.add("Goddess Band") + excluded_items.add("Coin of Slumber") + excluded_items.add("Souvenir Coin") + excluded_items.add("Mr. Saturn Coin") + + if not self.options.no_free_sanctuaries: + excluded_items.add("Tiny Key") + excluded_items.add("Tenda Lavapants") + + return excluded_items + + def set_classifications(self, name: str) -> Item: + data = item_table[name] + item = Item(name, data.classification, data.code, self.player) + + if name == "Magicant Teleport" and self.options.magicant_mode == 3: + item.classification = ItemClassification.useful + return item + + def fill_item_pool(self, pool: List[Item]) -> None: + item_to_counts = { + "Progressive Bat": self.progressive_filler_bats, + "Progressive Fry Pan": self.progressive_filler_pans, + "Progressive Gun": self.progressive_filler_guns, + "Progressive Bracelet": self.progressive_filler_bracelets, + "Progressive Other": self.progressive_filler_other + } + + max_filler_counts = { + "Progressive Bat": 8, + "Progressive Fry Pan": 9, + "Progressive Gun": 6, + "Progressive Bracelet": 6, + "Progressive Other": 10 + } + + for _ in range(len(self.multiworld.get_unfilled_locations(self.player)) - len(pool) - self.event_count): # Change to fix event count + item = self.set_classifications(self.get_filler_item_name()) + if item.name in ["Progressive Bat", "Progressive Fry Pan", "Progressive Other", + "Progressive Gun", "Progressive Bracelet"]: + item_to_counts[item.name] += 1 + + if item_to_counts[item.name] >= max_filler_counts[item.name]: + self.common_gear = [x for x in self.common_gear if x != item.name] + self.uncommon_gear = [x for x in self.uncommon_gear if x != item.name] + self.rare_gear = [x for x in self.rare_gear if x != item.name] + pool.append(item) + + def get_item_pool(self, excluded_items: Set[str]) -> List[Item]: + pool: List[Item] = [] + + for name, data in item_table.items(): + if name not in excluded_items: + for _ in range(data.amount): + item = self.set_classifications(name) + pool.append(item) + + if self.options.progressive_weapons: + for i in range(2): + pool.append(self.set_classifications("Progressive Bat")) + for i in range(4): + pool.append(self.set_classifications("Progressive Gun")) + + if self.options.progressive_armor: + for i in range(5): + pool.append(self.set_classifications("Progressive Bracelet")) + for i in range(3): + pool.append(self.set_classifications("Progressive Other")) + + return pool diff --git a/worlds/earthbound/archipelago.json b/worlds/earthbound/archipelago.json new file mode 100644 index 0000000000..1cfdc01f50 --- /dev/null +++ b/worlds/earthbound/archipelago.json @@ -0,0 +1,4 @@ +{"game": "EarthBound", +"authors": ["Pink Switch"], +"minimum_ap_version": "0.6.3", +"world_version": "4.3.1"} diff --git a/worlds/earthbound/docs/en_EarthBound.md b/worlds/earthbound/docs/en_EarthBound.md new file mode 100644 index 0000000000..4043aa6d73 --- /dev/null +++ b/worlds/earthbound/docs/en_EarthBound.md @@ -0,0 +1,124 @@ +# EarthBound + +## Where is the options page? + +The [player options page for this game](../player-options) contains all the options you need to configure and export a config file. + +## What does randomization do to this game? + +Randomization of EarthBound randomizes all items, from presents, PSI Locations, Character Locations, and gifts from NPCs. + +## What is the goal of EarthBound when randomized? +By default, the goal is to reach the defined number of Sanctuaries, and then defeat Giygas at the Cave of the Past. +If Giygas is disabled, the game will end once the player reaches the required sanctuary number. +If Magicant is set to "required", players will need to defeat Ness's Nightmare in Magicant, unlocked upon reaching their required +Sanctuaries, before they can win. +Optionally, the player can set Alternate Goal conditions, on 1 or 2 sanctuaries more than required, but these will never be the expected +goal. + +You can check your goals by speaking to Apple Kid in the Cave of the Present. + + +## What items and locations get shuffled? + +Locations consist of PSI Locations, Character Locations, presents, and gifts from NPCs. + +PSI Locations are locations tied to psychic events in the normal game, usually corresponding to the Sanctuaries, PSI Teleport, or PSI Starstorm. + +PSI Locations: +- Checking the Mani-Mani Statue in Onett +- Speaking with Buzz Buzz +- Drinking the Coffee at Saturn Valley +- Defeating the Dept. Store Spook in Fourside +- Speaking with the Monkey with Talah Rama +- Eating the Magic Cake in Summers +- Completing Poo's Trial of Mu in Dalaam +- Speaking with the Star Master outside the Pyramid in Scaraba +- Drinking the Tea at Tenda Village +- Speaking with the Talking Rock in the Lost Underworld +- Speaking with the Star Master in the Cave of the Present +- Defeating Ness's Nightmare (Only if the Magicant Mode option is set to Psi location) + +Character Locations: + - The cabin just outside Happy-Happy Village + - The graveyard prison in Threed + - The second floor bedroom in the Snow Wood Boarding School + - Monotoli's office in Fourside + - The Throne Room in Dalaam + - Defeating Master Barf in Deep Darkness + + +## Which items can be in another player's world? + +Items you can find for EarthBound include PSI for Poo, characters, teleport destinations, money, and just about any regular or key item. +A few new key items have been added to replace certain plot flags. + +## What does another world's item look like in EarthBound? +When collecting an item for another player, the item and player are identified as the receiver. If Shopsanity is enabled, items for other players +in shops will display the player they are for below the shop window. When attempting to purchase an item for another player, the full name of the item and its receiver +will be displayed to confirm. If the 'Presents Match Contents' option is enabled, presents will display the Archipelago symbol if they contain an item for another player. + +## What happens when I receive an item? +When you receive an item, the sound effect of an item being received will play, and it will be put in your inventory. If your inventory is full, it will automatically be put in storage. +!If storage is full, you will not be able to receive any more items until you clear room! If you receive PSI, the PSI learn fanfare plays instead. If you receive a character, a cutscene +will play. + +## My inventory is full and there's items I can't find! +You can press R at any time on the overworld to access a pocket storage menu that allows you to store, withdraw from storage, and toss unnessecary items within one menu. + +## What about Escargo Express? +Escargo Express's item storage has been replaced with a cross-game gift delivery system. From any phone, you can call Escargo Express to receive or send Gift items to other players. +In order for players to be eligible, they have to have gifting enabled. Your gift inbox can hold 69 gifted items at a time, and up to 10 items can be queued to be sent to other players. + +## Hints? +In most major towns, you can find a helpful Hint Man who will give hints about your game... for a price. +The location of the Hint Man will be marked on your map, viewable at all times with X. + +## Repel Sandwiches? +Skip Sandwiches (And Skip Sandwich DXs) have been replaced with an item called the Repel Sandwich (and Repel Superwich). +Repel Sandwiches will prevent normal enemies from spawning for a short time. The help text can tell you more. + +## Is there a run button? +You can hold down the Y button to run. + +## I returned to Moonside after beating the Mani-Mani statue and now I can't leave! +Check behind the cafe counter as you would in Fourside. A sparkle indicates the general area. + +## How do I get to the undeground prison in Threed? +Use the Bad Key Machine on the door from the outside. + +## How do I get from Onett to Twoson? +The captain at the Police Station might be convinced to remove the barricade... + +## How do I get rid of the ghosts in the road tunnels? +The ghosts will vanish after Master Belch is defeated, irregardless of anything else. + +## How do I get back to Andonuts's Lab after using the Sky Runner? +You can either go back to the underground prison or talk to Bubble Monkey, regardless of if you have helped him before. + +## My game automatically rolls credits after getting to Lumine Hall, but I need to get to the Lost Underworld +Once you defeat the boss of Lumine Hall, the Lost Underworld teleport is automatically unlocked. You will need to leave and warp there, though. + +## How do I get into the Tenda Camp in the Lost Underworld? +Bring them Tendakraut. They tend to notice it if you walk up to the gate with it already in your inventory. + +## I started as Jeff. Can I teleport? +Jeff starts with an item called the "Warp pad", which is an inventory item that functions as Teleport. It can safely be tucked into Key Item storage. + +## Community Suggestions +Community suggestions for certain things are being accepted. You can find submissions below. + +## Lumine Hall Text Scroll +https://docs.google.com/forms/d/e/1FAIpQLSff7FR0mxtQcZ3d87BoZcRMggBxqGYk2fwmY_ibVnR1sXXQWw/viewform + +## Window Flavor Colors +https://docs.google.com/forms/d/e/1FAIpQLSd17Bp4NYGHJqadaYprKaEXFW4EgbUYSPKxGoyufhArb1BbYw/viewform + +## Joke Hints +https://docs.google.com/forms/d/e/1FAIpQLScHWK0wHPCmDgHYh8juTrntsyVqEdzYWGCScLdEs21oZCa2mQ/viewform + +## Equipment Randomizer +https://docs.google.com/forms/d/e/1FAIpQLSdy-aczL4LmMDirbeD-s5N6u8ae0G2BSrhGfCxOqFhZa_x48A/viewform + +## Enemy Randomizer +https://docs.google.com/forms/d/e/1FAIpQLSdF0aFoIwCO7t7OpaObTE_b6dAgLpXC2_8fS-SjdgJDjAQJ6A/viewform \ No newline at end of file diff --git a/worlds/earthbound/docs/setup_en.md b/worlds/earthbound/docs/setup_en.md new file mode 100644 index 0000000000..3a2f0b5375 --- /dev/null +++ b/worlds/earthbound/docs/setup_en.md @@ -0,0 +1,128 @@ +# EarthBound Archipelago Randomizer Setup Guide + +## Required Software + +- [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 such as: + - snes9x-rr from: [snes9x rr](https://github.com/gocha/snes9x-rr/releases), + - BizHawk from: [TASVideos](https://tasvideos.org/BizHawk) + - snes9x-nwa from: [snes9x nwa](https://github.com/Skarsnik/snes9x-emunwa/releases) + - RetroArch 1.10.3 or newer from: RetroArch Website + - You can additionally use the FX Pack Pro, however some issues with it have been reported and it is not officially recommended. + +- Your legally obtained EarthBound English ROM file, probably named `EarthBound (USA).sfc` + +## Optional Software +- EarthBound Archipelago Poptracker Pack + - PopTracker from: [PopTracker Releases Page](https://github.com/black-sliver/PopTracker/releases/) + - EarthBound Archipelago PopTracker pack from: [EarthBound AP Tracker Releases Page](https://github.com/PinkSwitch/earthbound_poptracker/releases/tag/ebpoptracker1.0) + - The EarthBound Sprite Injector Tool (For custom sprite usage): [EarthBound Sprite Injector](https://github.com/PinkSwitch/eb-sprite-injector/releases/) + +## Installation Procedures + +### Windows Setup + +1. Download and install Archipelago from the link above, making sure to install the most recent version. +2. During generation/patching, you will be asked to locate your base ROM file. This is your EarthBound ROM file. +3. If you are using an emulator, you should assign your Lua capable emulator as your default program for launching ROM + files. + 1. Extract your emulator's folder to your Desktop, or somewhere you will remember. + 2. Right-click on a ROM file and select **Open with...** + 3. Check the box next to **Always use this app to open .sfc files** + 4. Scroll to the bottom of the list and click the grey text **Look for another App on this PC** + 5. Browse for your emulator's `.exe` file and click **Open**. This file should be located inside the folder you + extracted in step one. + +## Create a Config (.yaml) File + +### What is a config file and why do I need one? + +See the guide on setting up a basic YAML at the Archipelago setup +guide: [Basic Multiworld Setup Guide](/tutorial/Archipelago/setup/en) + +### Where do I get a config file? + +The Player Options page on the website allows you to configure your personal options 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 page. YAML +validator page: [YAML Validation page](/mysterycheck) + +## 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 whomever 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 `.apeb` 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. This is done with the main menubar, under: + - (≤ 2.8) `Config` 〉 `Cores` 〉 `SNES` 〉 `BSNES` + - (≥ 2.9) `Config` 〉 `Preferred Cores` 〉 `SNES` 〉 `BSNESv115+` +2. Load your ROM file if it hasn't already been loaded. + If you changed your core preference after loading the ROM, don't forget to reload it (default hotkey: Ctrl+R). +3. Drag+drop the `Connector.lua` file included with your client onto the main EmuHawk window. + - Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the + emulator is 64-bit or 32-bit. Please note the most recent versions of BizHawk are 64-bit only. + - You could instead open the Lua Console manually, click `Script` 〉 `Open Script`, and navigate to `Connector.lua` + with the file picker. + + + +### Connect to the Archipelago Server + +The patch file which launched your client should have automatically connected you to the AP Server. There are a few +reasons this may not happen however, including if the game is hosted on the website but was generated elsewhere. If the +client window shows "Server Status: Not Connected", simply ask the host for the address of the server, and copy/paste it +into the "Server" input field then press enter. + +The client will attempt to reconnect to the new server address, and should momentarily show "Server Status: Connected". + +### Play the game + +When the client shows both SNES Device and Server as connected, you're ready to begin playing. Congratulations on +successfully joining a multiworld game! + +## Hosting a MultiWorld game + +The recommended way to host a game is to use our hosting service. The process is relatively simple: + +1. Collect config files from your players. +2. Create a zip file containing your players' config files. +3. Upload that zip file to the Generate page above. + - Generate page: [WebHost Seed Generation Page](/generate) +4. Wait a moment while the seed is generated. +5. When the seed is generated, you will be redirected to a "Seed Info" page. +6. Click "Create New Room". This will take you to the server page. Provide the link to this page to your players, so + they may download their patch files from there. +7. Note that a link to a MultiWorld Tracker is at the top of the room page. The tracker shows the progress of all + players in the game. Any observers may also be given the link to this page. +8. Once all players have joined, you may begin playing. diff --git a/worlds/earthbound/game_data/__init__.py b/worlds/earthbound/game_data/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/earthbound/game_data/battle_bg_data.py b/worlds/earthbound/game_data/battle_bg_data.py new file mode 100644 index 0000000000..faafea4c06 --- /dev/null +++ b/worlds/earthbound/game_data/battle_bg_data.py @@ -0,0 +1,329 @@ +battle_bg_bpp = { + 0x00: 2, + 0x01: 4, + 0x02: 4, + 0x03: 4, + 0x04: 4, + 0x05: 4, + 0x06: 4, + 0x07: 4, + 0x08: 4, + 0x09: 4, + 0x0a: 4, + 0x0b: 4, + 0x0c: 4, + 0x0d: 4, + 0x0e: 4, + 0x0f: 4, + 0x10: 4, + 0x11: 4, + 0x12: 4, + 0x13: 4, + 0x14: 4, + 0x15: 4, + 0x16: 4, + 0x17: 4, + 0x18: 4, + 0x19: 4, + 0x1a: 4, + 0x1b: 4, + 0x1c: 4, + 0x1d: 4, + 0x1e: 4, + 0x1f: 4, + 0x20: 4, + 0x21: 4, + 0x22: 4, + 0x23: 4, + 0x24: 4, + 0x25: 4, + 0x26: 4, + 0x27: 4, + 0x28: 4, + 0x29: 4, + 0x2a: 4, + 0x2b: 4, + 0x2c: 4, + 0x2d: 2, + 0x2e: 4, + 0x2f: 4, + 0x30: 4, + 0x31: 4, + 0x32: 4, + 0x33: 4, + 0x34: 4, + 0x35: 4, + 0x36: 4, + 0x37: 4, + 0x38: 4, + 0x39: 4, + 0x3a: 4, + 0x3b: 4, + 0x3c: 4, + 0x3d: 4, + 0x3e: 4, + 0x3f: 4, + 0x40: 4, + 0x41: 4, + 0x42: 4, + 0x43: 4, + 0x44: 4, + 0x45: 4, + 0x46: 4, + 0x47: 4, + 0x48: 4, + 0x49: 4, + 0x4a: 4, + 0x4b: 4, + 0x4c: 4, + 0x4d: 4, + 0x4e: 4, + 0x4f: 4, + 0x50: 4, + 0x51: 4, + 0x52: 4, + 0x53: 4, + 0x54: 4, + 0x55: 4, + 0x56: 4, + 0x57: 4, + 0x58: 4, + 0x59: 4, + 0x5a: 4, + 0x5b: 4, + 0x5c: 4, + 0x5d: 4, + 0x5e: 4, + 0x5f: 4, + 0x60: 4, + 0x61: 4, + 0x62: 4, + 0x63: 4, + 0x64: 4, + 0x65: 4, + 0x66: 4, + 0x67: 4, + 0x68: 4, + 0x69: 4, + 0x6a: 4, + 0x6b: 4, + 0x6c: 4, + 0x6d: 4, + 0x6e: 4, + 0x6f: 4, + 0x70: 4, + 0x71: 4, + 0x72: 4, + 0x73: 4, + 0x74: 4, + 0x75: 4, + 0x76: 4, + 0x77: 4, + 0x78: 4, + 0x79: 4, + 0x7a: 4, + 0x7b: 4, + 0x7c: 4, + 0x7d: 4, + 0x7e: 4, + 0x7f: 4, + 0x80: 4, + 0x81: 4, + 0x82: 4, + 0x83: 4, + 0x84: 4, + 0x85: 4, + 0x86: 4, + 0x87: 4, + 0x88: 4, + 0x89: 4, + 0x8a: 4, + 0x8b: 4, + 0x8c: 4, + 0x8d: 4, + 0x8e: 4, + 0x8f: 4, + 0x90: 4, + 0x91: 4, + 0x92: 4, + 0x93: 4, + 0x94: 4, + 0x95: 4, + 0x96: 4, + 0x97: 4, + 0x98: 4, + 0x99: 4, + 0x9a: 4, + 0x9b: 4, + 0x9c: 4, + 0x9d: 4, + 0x9e: 4, + 0x9f: 4, + 0xa0: 4, + 0xa1: 4, + 0xa2: 4, + 0xa3: 2, + 0xa4: 2, + 0xa5: 2, + 0xa6: 2, + 0xa7: 2, + 0xa8: 2, + 0xa9: 2, + 0xaa: 2, + 0xab: 2, + 0xac: 2, + 0xad: 2, + 0xae: 2, + 0xaf: 2, + 0xb0: 2, + 0xb1: 2, + 0xb2: 2, + 0xb3: 2, + 0xb4: 2, + 0xb5: 2, + 0xb6: 2, + 0xb7: 2, + 0xb8: 2, + 0xb9: 2, + 0xba: 2, + 0xbb: 2, + 0xbc: 2, + 0xbd: 4, + 0xbe: 2, + 0xbf: 2, + 0xc0: 2, + 0xc1: 2, + 0xc2: 2, + 0xc3: 4, + 0xc4: 4, + 0xc5: 4, + 0xc6: 4, + 0xc7: 4, + 0xc8: 2, + 0xc9: 2, + 0xca: 2, + 0xcb: 2, + 0xcc: 2, + 0xcd: 2, + 0xce: 2, + 0xcf: 2, + 0xd0: 4, + 0xd1: 4, + 0xd2: 2, + 0xd3: 2, + 0xd4: 2, + 0xd5: 2, + 0xd6: 2, + 0xd7: 2, + 0xd8: 2, + 0xd9: 2, + 0xda: 2, + 0xdb: 2, + 0xdc: 4, + 0xdd: 2, + 0xde: 2, + 0xdf: 2, + 0xe0: 2, + 0xe1: 4, + 0xe2: 4, + 0xe3: 4, + 0xe4: 4, + 0xe5: 4, + 0xe6: 4, + 0xe7: 4, + 0xe8: 4, + 0xe9: 4, + 0xea: 4, + 0xeb: 4, + 0xec: 4, + 0xed: 4, + 0xee: 4, + 0xef: 4, + 0xf0: 4, + 0xf1: 4, + 0xf2: 4, + 0xf3: 4, + 0xf4: 4, + 0xf5: 4, + 0xf6: 4, + 0xf7: 4, + 0xf8: 2, + 0xf9: 4, + 0xfa: 4, + 0xfb: 4, + 0xfc: 2, + 0xfd: 4, + 0xfe: 4, + 0xff: 4, + 0x100: 4, + 0x101: 4, + 0x102: 2, + 0x103: 4, + 0x104: 4, + 0x105: 4, + 0x106: 4, + 0x107: 2, + 0x108: 2, + 0x109: 4, + 0x10a: 2, + 0x10b: 2, + 0x10c: 4, + 0x10d: 2, + 0x10e: 2, + 0x10f: 4, + 0x110: 2, + 0x111: 2, + 0x112: 2, + 0x113: 2, + 0x114: 2, + 0x115: 2, + 0x116: 4, + 0x117: 4, + 0x118: 4, + 0x119: 2, + 0x11a: 2, + 0x11b: 4, + 0x11c: 4, + 0x11d: 4, + 0x11e: 4, + 0x11f: 4, + 0x120: 4, + 0x121: 4, + 0x122: 4, + 0x123: 4, + 0x124: 2, + 0x125: 2, + 0x126: 4, + 0x127: 4, + 0x128: 4, + 0x129: 4, + 0x12a: 4, + 0x12b: 4, + 0x12c: 4, + 0x12d: 4, + 0x12e: 4, + 0x12f: 4, + 0x130: 4, + 0x131: 4, + 0x132: 2, + 0x133: 2, + 0x134: 4, + 0x135: 4, + 0x136: 4, + 0x137: 4, + 0x138: 4, + 0x139: 4, + 0x13a: 4, + 0x13b: 4, + 0x13c: 4, + 0x13d: 4, + 0x13e: 4, + 0x13f: 4, + 0x140: 4, + 0x141: 4, + 0x142: 4, + 0x143: 4, + 0x144: 4, + 0x145: 4, + 0x146: 2 +} diff --git a/worlds/earthbound/game_data/local_data.py b/worlds/earthbound/game_data/local_data.py new file mode 100644 index 0000000000..c5a85b2733 --- /dev/null +++ b/worlds/earthbound/game_data/local_data.py @@ -0,0 +1,1406 @@ +world_version = "4.3.1" + +check_table = { + 0xEB0000: [0x11, 3], + 0xEB0001: [0x6C, 4], + 0xEB0002: [0x6B, 7], + 0xEB0003: [0x11, 6], + 0xEB0004: [0x84, 3], + 0xEB0005: [0x82, 1], + 0xEB0006: [0x47, 6], + 0xEB0007: [0x13, 0], + 0xEB0008: [0x6C, 0], + 0xEB0009: [0x11, 4], + 0xEB000A: [0x6C, 1], + 0xEB000B: [0x6C, 2], + 0xEB000C: [0x6C, 3], + 0xEB000D: [0x11, 7], + 0xEB000E: [0x11, 5], + 0xEB000F: [0x6C, 6], + 0xEB0010: [0x6C, 7], + 0xEB0011: [0x6C, 5], + 0xEB0012: [0x12, 0], + 0xEB0013: [0x5B, 5], + 0xEB0014: [0x6D, 1], + 0xEB0015: [0x6D, 2], + 0xEB0016: [0x6D, 0], + 0xEB0017: [0x4C, 5], + 0xEB0018: [0x12, 2], + 0xEB0019: [0x12, 1], + 0xEB001A: [0x12, 3], + 0xEB001B: [0x12, 4], + 0xEB001C: [0x85, 2], + 0xEB001D: [0x6E, 0], + 0xEB001E: [0x6D, 5], + 0xEB001F: [0x6D, 7], + 0xEB0020: [0x6E, 1], + 0xEB0021: [0x6E, 2], + 0xEB0022: [0x6D, 6], + 0xEB0023: [0x83, 7], + 0xEB0024: [0x6D, 4], + 0xEB0025: [0x6D, 3], + 0xEB0026: [0x12, 5], + 0xEB0027: [0x85, 4], + 0xEB0028: [0x17, 1], + 0xEB0029: [0x6E, 4], + 0xEB002A: [0x6E, 5], + 0xEB002B: [0x6E, 3], + 0xEB002C: [0x12, 6], + 0xEB002D: [0x6E, 6], + 0xEB002E: [0x6F, 0], + 0xEB002F: [0x6F, 1], + 0xEB0030: [0x6E, 7], + 0xEB0031: [0x66, 2], + 0xEB0032: [0x0D, 6], + 0xEB0033: [0x6F, 2], + 0xEB0034: [0x6F, 3], + 0xEB0035: [0x73, 4], + 0xEB0036: [0x73, 3], + 0xEB0037: [0x73, 5], + 0xEB0038: [0x73, 6], + 0xEB0039: [0x73, 7], + 0xEB003A: [0x74, 0], + 0xEB003B: [0x74, 1], + 0xEB003C: [0x84, 5], + 0xEB003D: [0x1D, 2], + 0xEB003E: [0x1D, 3], + 0xEB003F: [0x1D, 4], + 0xEB0040: [0x73, 2], + 0xEB0041: [0x72, 5], + 0xEB0042: [0x73, 1], + 0xEB0043: [0x72, 4], + 0xEB0044: [0x73, 0], + 0xEB0045: [0x72, 7], + 0xEB0046: [0x72, 6], + 0xEB0047: [0x76, 2], + 0xEB0048: [0x76, 7], + 0xEB0049: [0x76, 1], + 0xEB004A: [0x76, 4], + 0xEB004B: [0x76, 5], + 0xEB004C: [0x76, 6], + 0xEB004D: [0x76, 3], + 0xEB004E: [0x38, 0], + 0xEB004F: [0x77, 0], + 0xEB0050: [0x13, 1], + 0xEB0051: [0x70, 0], + 0xEB0052: [0x6F, 5], + 0xEB0053: [0x6F, 7], + 0xEB0054: [0x70, 2], + 0xEB0055: [0x70, 1], + 0xEB0056: [0x6F, 6], + 0xEB0057: [0x6F, 4], + 0xEB0058: [0x85, 1], + 0xEB0059: [0x12, 7], + 0xEB005A: [0x86, 3], + 0xEB005B: [0x0A, 6], + 0xEB005C: [0x31, 5], + 0xEB005D: [0x53, 4], + 0xEB005E: [0x17, 7], + 0xEB005F: [0x30, 2], + 0xEB0060: [0x71, 0], + 0xEB0061: [0x70, 6], + 0xEB0062: [0x70, 4], + 0xEB0063: [0x70, 7], + 0xEB0064: [0x70, 5], + 0xEB0065: [0x71, 3], + 0xEB0066: [0x71, 1], + 0xEB0067: [0x71, 2], + 0xEB0068: [0x70, 3], + 0xEB0069: [0x55, 1], + 0xEB006A: [0x72, 3], + 0xEB006B: [0x71, 5], + 0xEB006C: [0x72, 1], + 0xEB006D: [0x71, 6], + 0xEB006E: [0x71, 7], + 0xEB006F: [0x71, 4], + 0xEB0070: [0x72, 0], + 0xEB0071: [0x72, 2], + 0xEB0072: [0x58, 3], + 0xEB0073: [0x83, 4], + 0xEB0074: [0x78, 5], + 0xEB0075: [0x78, 3], + 0xEB0076: [0x77, 3], + 0xEB0077: [0x78, 6], + 0xEB0078: [0x78, 2], + 0xEB0079: [0x77, 5], + 0xEB007A: [0x77, 2], + 0xEB007B: [0x77, 7], + 0xEB007C: [0x77, 4], + 0xEB007D: [0x77, 1], + 0xEB007E: [0x78, 1], + 0xEB007F: [0x78, 0], + 0xEB0080: [0x78, 4], + 0xEB0081: [0x77, 6], + 0xEB0082: [0x74, 2], + 0xEB0083: [0x74, 3], + 0xEB0084: [0x74, 4], + 0xEB0085: [0x74, 5], + 0xEB0086: [0x41, 7], + 0xEB0087: [0x74, 6], + 0xEB0088: [0x74, 7], + 0xEB0089: [0x4D, 1], + 0xEB008A: [0x54, 4], + 0xEB00F1: [0x75, 1], + 0xEB00F2: [0x75, 0], + 0xEB00F3: [0x75, 2], + 0xEB00F4: [0x75, 4], + 0xEB00F5: [0x75, 3], + 0xEB00F6: [0x75, 5], + 0xEB00F7: [0x75, 6], + 0xEB00F8: [0x76, 0], + 0xEB00F9: [0x75, 7], + 0xEB008B: [0x19, 3], + 0xEB008C: [0x83, 6], + 0xEB008D: [0x63, 7], + 0xEB008E: [0x79, 2], + 0xEB008F: [0x79, 3], + 0xEB0090: [0x79, 6], + 0xEB0091: [0x79, 5], + 0xEB0092: [0x79, 4], + 0xEB0093: [0x19, 2], + 0xEB0094: [0x7A, 2], + 0xEB0095: [0x7A, 3], + 0xEB0096: [0x7A, 1], + 0xEB0097: [0x79, 7], + 0xEB0098: [0x7A, 0], + 0xEB0099: [0x78, 7], + 0xEB009A: [0x79, 0], + 0xEB009B: [0x79, 1], + 0xEB009C: [0x19, 4], + 0xEB009D: [0x64, 4], + 0xEB009E: [0x5A, 7], + 0xEB009F: [0x32, 6], + 0xEB00A0: [0x0F, 4], + 0xEB00A1: [0x7C, 6], + 0xEB00A2: [0x7C, 7], + 0xEB00A3: [0x7D, 0], + 0xEB00A4: [0x2A, 0], + 0xEB00A5: [0x7D, 2], + 0xEB00A6: [0x7D, 4], + 0xEB00A7: [0x7D, 3], + 0xEB00A8: [0x7D, 1], + 0xEB00A9: [0x57, 4], + 0xEB00AA: [0x09, 7], + 0xEB00AB: [0x7D, 6], + 0xEB00AC: [0x7D, 5], + 0xEB00AD: [0x7D, 7], + 0xEB00AE: [0x7A, 6], + 0xEB00AF: [0x7A, 4], + 0xEB00B0: [0x7A, 5], + 0xEB00B1: [0x7B, 0], + 0xEB00B2: [0x7B, 1], + 0xEB00B3: [0x33, 3], + 0xEB00B4: [0x7A, 7], + 0xEB00B5: [0x83, 0], + 0xEB00B6: [0x31, 7], + 0xEB00B7: [0x7B, 6], + 0xEB00B8: [0x7B, 2], + 0xEB00B9: [0x7C, 5], + 0xEB00BA: [0x7C, 0], + 0xEB00BB: [0x7C, 1], + 0xEB00BC: [0x7C, 2], + 0xEB00BD: [0x7B, 4], + 0xEB00BE: [0x7B, 7], + 0xEB00BF: [0x7B, 5], + 0xEB00C0: [0x7C, 4], + 0xEB00C1: [0x7C, 3], + 0xEB00C2: [0x7B, 3], + 0xEB00C3: [0x59, 1], + 0xEB00C4: [0x7E, 4], + 0xEB00C5: [0x7E, 3], + 0xEB00C6: [0x7E, 2], + 0xEB00C7: [0x7E, 5], + 0xEB00C8: [0x7E, 0], + 0xEB00C9: [0x7E, 1], + 0xEB00CA: [0x3E, 7], + 0xEB00CB: [0x3F, 1], + 0xEB00CC: [0x3F, 0], + 0xEB00CD: [0x3F, 2], + 0xEB00CE: [0x3E, 6], + 0xEB00CF: [0x84, 7], + 0xEB00D0: [0x7F, 7], + 0xEB00D1: [0x83, 1], + 0xEB00D2: [0x82, 6], + 0xEB00D3: [0x13, 3], + 0xEB00D4: [0x7F, 6], + 0xEB00D5: [0x7F, 2], + 0xEB00D6: [0x7F, 0], + 0xEB00D7: [0x7F, 5], + 0xEB00D8: [0x7E, 7], + 0xEB00D9: [0x7F, 3], + 0xEB00DA: [0x7E, 6], + 0xEB00DB: [0x7F, 1], + 0xEB00DC: [0x7F, 4], + 0xEB00DD: [0x3C, 6], + 0xEB00DE: [0x80, 1], + 0xEB00DF: [0x80, 2], + 0xEB00E0: [0x80, 3], + 0xEB00E1: [0x80, 4], + 0xEB00E2: [0x80, 0], + 0xEB00E3: [0x81, 1], + 0xEB00E4: [0x80, 7], + 0xEB00E5: [0x81, 0], + 0xEB00E6: [0x80, 6], + 0xEB00E7: [0x80, 5], + 0xEB00E8: [0x13, 4], + 0xEB00E9: [0x81, 2], + 0xEB00EA: [0x81, 4], + 0xEB00EB: [0x81, 5], + 0xEB00EC: [0x81, 6], + 0xEB00ED: [0x86, 1], + 0xEB00EE: [0x84, 4], + 0xEB00EF: [0x86, 4], + 0xEB00F0: [0x81, 7], + 0xEB00FA: [0x81, 3], + # Shop checks + 0xeb1000: [0x00, 0], + 0xeb1001: [0x00, 1], + 0xeb1002: [0x00, 2], + 0xeb1003: [0x00, 3], + 0xeb1004: [0x00, 4], + 0xeb1007: [0x01, 0], + 0xeb100e: [0x02, 0], + 0xeb1015: [0x03, 0], + 0xeb1016: [0x03, 1], + 0xeb1017: [0x03, 2], + 0xeb1018: [0x03, 3], + 0xeb101c: [0x04, 0], + 0xeb101d: [0x04, 1], + 0xeb101e: [0x04, 2], + 0xeb101f: [0x04, 3], + 0xeb1023: [0x05, 0], + 0xeb1024: [0x05, 1], + 0xeb1025: [0x05, 2], + 0xeb1026: [0x05, 3], + 0xeb102a: [0x06, 0], + 0xeb102b: [0x06, 1], + 0xeb102c: [0x06, 2], + 0xeb102d: [0x06, 3], + 0xeb1031: [0x07, 0], + 0xeb1032: [0x07, 1], + 0xeb1033: [0x07, 2], + 0xeb1034: [0x07, 3], + 0xeb1035: [0x07, 4], + 0xeb1036: [0x07, 5], + 0xeb1038: [0x08, 0], + 0xeb1039: [0x08, 1], + 0xeb103f: [0x09, 0], + 0xeb1046: [0x0a, 0], + 0xeb1047: [0x0a, 1], + 0xeb1048: [0x0a, 2], + 0xeb1049: [0x0a, 3], + 0xeb104a: [0x0a, 4], + 0xeb104b: [0x0a, 5], + 0xeb105b: [0x0d, 0], + 0xeb105c: [0x0d, 1], + 0xeb105d: [0x0d, 2], + 0xeb105e: [0x0d, 3], + 0xeb105f: [0x0d, 4], + 0xeb1060: [0x0d, 5], + 0xeb1062: [0x0e, 0], + 0xeb1069: [0x0f, 0], + 0xeb106a: [0x0f, 1], + 0xeb106b: [0x0f, 2], + 0xeb106c: [0x0f, 3], + 0xeb106d: [0x0f, 4], + 0xeb1070: [0x10, 0], + 0xeb1071: [0x10, 1], + 0xeb1072: [0x10, 2], + 0xeb1073: [0x10, 3], + 0xeb1074: [0x10, 4], + 0xeb1077: [0x11, 0], + 0xeb1078: [0x11, 1], + 0xeb1079: [0x11, 2], + 0xeb107a: [0x11, 3], + 0xeb107b: [0x11, 4], + 0xeb107e: [0x12, 0], + 0xeb107f: [0x12, 1], + 0xeb1080: [0x12, 2], + 0xeb1081: [0x12, 3], + 0xeb1085: [0x13, 0], + 0xeb1086: [0x13, 1], + 0xeb1087: [0x13, 2], + 0xeb1088: [0x13, 3], + 0xeb1089: [0x13, 4], + 0xeb108a: [0x13, 5], + 0xeb108b: [0x13, 6], + 0xeb108c: [0x14, 0], + 0xeb1093: [0x15, 0], + 0xeb1094: [0x15, 1], + 0xeb1095: [0x15, 2], + 0xeb1096: [0x15, 3], + 0xeb1097: [0x15, 4], + 0xeb1098: [0x15, 5], + 0xeb1099: [0x15, 6], + 0xeb109a: [0x16, 0], + 0xeb109b: [0x16, 1], + 0xeb109c: [0x16, 2], + 0xeb109d: [0x16, 3], + 0xeb109e: [0x16, 4], + 0xeb10a1: [0x17, 0], + 0xeb10a2: [0x17, 1], + 0xeb10a3: [0x17, 2], + 0xeb10a4: [0x17, 3], + 0xeb10a5: [0x17, 4], + 0xeb10a8: [0x18, 0], + 0xeb10a9: [0x18, 1], + 0xeb10aa: [0x18, 2], + 0xeb10ab: [0x18, 3], + 0xeb10af: [0x19, 0], + 0xeb10b0: [0x19, 1], + 0xeb10b1: [0x19, 2], + 0xeb10b2: [0x19, 3], + 0xeb10b3: [0x19, 4], + 0xeb10b4: [0x19, 5], + 0xeb10b6: [0x1a, 0], + 0xeb10b7: [0x1a, 1], + 0xeb10b8: [0x1a, 2], + 0xeb10b9: [0x1a, 3], + 0xeb10ba: [0x1a, 4], + 0xeb10bb: [0x1a, 5], + 0xeb10bc: [0x1a, 6], + 0xeb10bd: [0x1b, 0], + 0xeb10be: [0x1b, 1], + 0xeb10bf: [0x1b, 2], + 0xeb10c0: [0x1b, 3], + 0xeb10c4: [0x1c, 0], + 0xeb10c5: [0x1c, 1], + 0xeb10c6: [0x1c, 2], + 0xeb10c7: [0x1c, 3], + 0xeb10c8: [0x1c, 4], + 0xeb10cb: [0x1d, 0], + 0xeb10cc: [0x1d, 1], + 0xeb10cd: [0x1d, 2], + 0xeb10ce: [0x1d, 3], + 0xeb10cf: [0x1d, 4], + 0xeb10d0: [0x1d, 5], + 0xeb10d1: [0x1d, 6], + 0xeb10d2: [0x1e, 0], + 0xeb10d3: [0x1e, 1], + 0xeb10d4: [0x1e, 2], + 0xeb10d5: [0x1e, 3], + 0xeb10d6: [0x1e, 4], + 0xeb10d7: [0x1e, 5], + 0xeb10d9: [0x1f, 0], + 0xeb10da: [0x1f, 1], + 0xeb10db: [0x1f, 2], + 0xeb10dc: [0x1f, 3], + 0xeb10e0: [0x20, 0], + 0xeb10e1: [0x20, 1], + 0xeb10e2: [0x20, 2], + 0xeb10e3: [0x20, 3], + 0xeb10e4: [0x20, 4], + 0xeb10e7: [0x21, 0], + 0xeb10e8: [0x21, 1], + 0xeb10e9: [0x21, 2], + 0xeb10ea: [0x21, 3], + 0xeb10eb: [0x21, 4], + 0xeb10ee: [0x22, 0], + 0xeb10ef: [0x22, 1], + 0xeb10f0: [0x22, 2], + 0xeb10f1: [0x22, 3], + 0xeb10f5: [0x23, 0], + 0xeb10f6: [0x23, 1], + 0xeb1103: [0x25, 0], + 0xeb1104: [0x25, 1], + 0xeb1105: [0x25, 2], + 0xeb1106: [0x25, 3], + 0xeb1107: [0x25, 4], + 0xeb1108: [0x25, 5], + 0xeb1109: [0x25, 6], + 0xeb110a: [0x26, 0], + 0xeb110b: [0x26, 1], + 0xeb110c: [0x26, 2], + 0xeb110d: [0x26, 3], + 0xeb110e: [0x26, 4], + 0xeb110f: [0x26, 5], + 0xeb1110: [0x26, 6], + 0xeb1111: [0x27, 0], + 0xeb1112: [0x27, 1], + 0xeb1113: [0x27, 2], + 0xeb1114: [0x27, 3], + 0xeb1115: [0x27, 4], + 0xeb1116: [0x27, 5], + 0xeb1118: [0x28, 0], + 0xeb1119: [0x28, 1], + 0xeb111a: [0x28, 2], + 0xeb111b: [0x28, 3], + 0xeb111c: [0x28, 4], + 0xeb111d: [0x28, 5], + 0xeb1126: [0x2a, 0], + 0xeb1127: [0x2a, 1], + 0xeb1128: [0x2a, 2], + 0xeb112d: [0x2b, 0], + 0xeb112e: [0x2b, 1], + 0xeb112f: [0x2b, 2], + 0xeb1130: [0x2b, 3], + 0xeb1131: [0x2b, 4], + 0xeb1132: [0x2b, 5], + 0xeb1134: [0x2c, 0], + 0xeb1135: [0x2c, 1], + 0xeb1136: [0x2c, 2], + 0xeb1137: [0x2c, 3], + 0xeb113b: [0x2d, 0], + 0xeb113c: [0x2d, 1], + 0xeb113d: [0x2d, 2], + 0xeb113e: [0x2d, 3], + 0xeb113f: [0x2d, 4], + 0xeb1140: [0x2d, 5], + 0xeb1141: [0x2d, 6], + 0xeb1157: [0x31, 0], + 0xeb1158: [0x31, 1], + 0xeb1159: [0x31, 2], + 0xeb115a: [0x31, 3], + 0xeb115e: [0x32, 0], + 0xeb115f: [0x32, 1], + 0xeb1160: [0x32, 2], + 0xeb1161: [0x32, 3], + 0xeb1162: [0x32, 4], + 0xeb1163: [0x32, 5], + 0xeb1164: [0x32, 6], + 0xeb1165: [0x33, 0], + 0xeb1166: [0x33, 1], + 0xeb1167: [0x33, 2], + 0xeb1168: [0x33, 3], + 0xeb116c: [0x34, 0], + 0xeb116d: [0x34, 1], + 0xeb116e: [0x34, 2], + 0xeb116f: [0x34, 3], + 0xeb1170: [0x34, 4], + 0xeb1171: [0x34, 5], + 0xeb1172: [0x34, 6], + 0xeb117a: [0x36, 0], + 0xeb117b: [0x36, 1], + 0xeb117c: [0x36, 2], + 0xeb117d: [0x36, 3], + 0xeb117e: [0x36, 4], + 0xeb117f: [0x36, 5], + 0xeb1180: [0x36, 6], + 0xeb1181: [0x37, 0], + 0xeb1182: [0x37, 1], + 0xeb1183: [0x37, 2], + 0xeb1188: [0x38, 0], + 0xeb1189: [0x38, 1], + 0xeb118a: [0x38, 2], + 0xeb118b: [0x38, 3], + 0xeb118c: [0x38, 4], + 0xeb118d: [0x38, 5], + 0xeb118e: [0x38, 6], + 0xeb118f: [0x39, 0], + 0xeb1190: [0x39, 1], + 0xeb1191: [0x39, 2], + 0xeb1192: [0x39, 3], + 0xeb1193: [0x39, 4], + 0xeb1194: [0x39, 5], + 0xeb1195: [0x39, 6], + 0xeb1196: [0x3a, 0], + 0xeb1197: [0x3a, 1], + 0xeb1198: [0x3a, 2], + 0xeb1199: [0x3a, 3], + 0xeb119a: [0x3a, 4], + 0xeb119b: [0x3a, 5], + 0xeb119c: [0x3a, 6], + 0xeb119d: [0x3b, 0], + 0xeb119e: [0x3b, 1], + 0xeb119f: [0x3b, 2], + 0xeb11a0: [0x3b, 3], + 0xeb11a1: [0x3b, 4], + 0xeb11a4: [0x3c, 0], + 0xeb11a5: [0x3c, 1], + 0xeb11a6: [0x3c, 2], + 0xeb11a7: [0x3c, 3], + 0xeb11ab: [0x3d, 0], + 0xeb11ac: [0x3d, 1], + 0xeb11ad: [0x3d, 2], + 0xeb11ae: [0x3d, 3], + 0xeb11af: [0x3d, 4], + 0xeb11b0: [0x3d, 5], + 0xeb11b1: [0x3d, 6], + 0xeb11b2: [0x3e, 0], + 0xeb11b3: [0x3e, 1], + 0xeb11b4: [0x3e, 2], + 0xeb11b5: [0x3e, 3], + 0xeb11b6: [0x3e, 4], + 0xeb11b7: [0x3e, 5], + 0xeb11b8: [0x3e, 6], + 0xeb11c0: [0x40, 0], + 0xeb11c1: [0x40, 1], + 0xeb11c2: [0x40, 2], + 0xeb11c3: [0x40, 3], + 0xeb11c4: [0x40, 4] +} + +location_dialogue = { # Locations which just need to print the name of the item + "Onett - Tracy Gift": [0x07616B, 0x330478], + "Onett - Meteor Item": [0x0862C3], + "Onett - Library Counter": [0x05EC0C], + "Onett - Library Bookshelf": [0x2EBA66], + "Onett - Treehouse Guy": [0x073F34], + "Onett - Mayor Pirkle": [0x0661D6, 0x072D4B, 0x072BE9], + "Onett - Traveling Entertainer": [0x07476C], + "Twoson - Bike Shop Rental": [0x080046, 0x08008F], + "Twoson - Orange Kid Donation": [0x08134A, 0x0813B9, 0x3303E3], + "Twoson - Apple Kid Invention": [0x081F89, 0x081FF3], + "Twoson - Apple Kid's Mouse": [0x2EBA86], + "Twoson - Antique Shop": [0x093E5F, 0x093F0A], + "Twoson - Paula's Mother": [0x08061B, 0x0807F7], + "Twoson - Everdred Meeting": [0x095FA2], + "Twoson - Insignificant Location": [0x094EB1], + "Happy-Happy Village - Donation Lady": [0x2EC578, 0x2EC580], + "Happy-Happy Village - Prisoner Item": [0x2F95FE, 0x33001E, 0x079646], + "Happy-Happy Village - Defeat Carpainter": [0x098215], + "Threed - Hospital Drawer": [0x08686C], + "Saturn Valley - Post Belch Gift #1": [0x07EAAA], + "Saturn Valley - Post Belch Gift #2": [0x07EACE], + "Saturn Valley - Post Belch Gift #3": [0x07EAF2], + "Dusty Dunes - Shining Spot": [0x060D8D], + "Dusty Dunes - Mine Reward": [0x06038A, 0x06123A, 0x06053F], + "Snow Wood - Maxwell Item": [0x06AB89], + "Scaraba - Snake Bag Salesman": [0x2EA713, 0x057116], + "Winters - Drugstore Saleswoman": [0x07A223, 0x06AEB8], + "Andonuts Lab - Mouse": [0x06C840], + "Stonehenge - Tony Item": [0x2FFA0C], + "Stonehenge - Kidnapped Mr. Saturn": [0x06C061], + "Monkey Caves - Bow Monkey Gift": [0x0625E7], + "Monkey Caves - Talah Rama Gift": [0x060E77], + "Fourside - Venus Gift": [0x06D643], + "Fourside - Post-Moonside Delivery": [0x07AA04, 0x3310E6], + "Fourside - Bakery 2F Gift": [0x06DDAC], + "Monotoli Building - Monotoli Gift": [0x06EAA9], + "Monotoli Building - Electra Gift": [0x06E9A9], + "Summers - Museum Item": [0x08ABB8], + "Pyramid - Pedestal Item": [0x2EBA92], + "Scaraba - Key Holder": [0x2EBA9E], + "Deep Darkness - Teleporting Monkey": [0x2EBEE2], + "Deep Darkness - North Alcove Truffle": [0x3315CE], + "Deep Darkness - Near Land Truffle": [0x33162A], + "Deep Darkness - Present Truffle": [0x3315FC], + "Deep Darkness - Village Truffle": [0x331658], + "Deep Darkness - Entrance Truffle": [0x3315A0], + "Tenda Village - Tenda Gift": [0x09DA6C, 0x09DA79], + "Tenda Village - Tenda Gift #2": [0x09D7FD], + "Magicant - Ness's Gift": [0x077614], + "Cave of the Present - Broken Phase Distorter": [0x2F58FC], + "Onett - Buzz Buzz": [0x2EAA43], + "Onett - Mani Mani Statue": [0x2EA99E], + "Deep Darkness - Barf Character": [0x2EB664], + "Dalaam - Throne Character": [0x2EB4E2], + "Monotoli Building - Monotoli Character": [0x2EB2C3], + "Snow Wood - Bedroom": [0x2EB10D], + "Threed - Zombie Prisoner": [0x2EAFB1, 0x2EC9E1], + "Happy-Happy Village - Prisoner": [0x2EBABA], + "Saturn Valley - Saturn Coffee": [0x2EB008], + "Monkey Caves - Monkey Power": [0x2EB1A1], + "Fourside - Department Store Blackout": [0x2EBFE8, 0x2ED155], + "Summers - Magic Cake": [0x2EBFB4], + "Scaraba - Star Master": [0x2EBFA7], + "Dalaam - Trial of Mu": [0x2EBF95, 0x2EBF88], + "Tenda Village - Tenda Tea": [0x2EB6CC], + "Lost Underworld - Talking Rock": [0x2EB751], + "Cave of the Present - Star Master": [0x2EB8DF], + "Magicant - Ness's Nightmare": [0x2EB803, 0x2EB87C], + "Dungeon Man - 1F Exit Ledge Present": [0x057A55], + "Snow Wood - Upper Right Locker": [0x2EFB11], + "Snow Wood - Upper Left Locker": [0x2EFB50], + "Snow Wood - Bottom Right Locker": [0x2EFB8F], + "Snow Wood - Bottom Left Locker": [0x2EFBCE] +} + +npc_locations = { # Locations given to you by an NPC + "Onett - Tracy Gift": [0x07617B], + "Onett - Meteor Item": [0x086304], + "Onett - Library Counter": [0x07339C], + "Onett - Library Bookshelf": [0x087E7B], + "Onett - Treehouse Guy": [0x073F78], + "Onett - Mayor Pirkle": [0x072D61], + "Onett - Traveling Entertainer": [0x07477C], + "Twoson - Bike Shop Rental": [0x0801A5], + "Twoson - Orange Kid Donation": [0x081362], + "Twoson - Apple Kid's Mouse": [0x0819DF], + "Twoson - Apple Kid Invention": [0x082015], + "Twoson - Antique Shop": [0x2EAEFD], + "Twoson - Paula's Mother": [0x08062F, 0x08081F], + "Twoson - Everdred Meeting": [0x096052], + "Twoson - Insignificant Location": [0x094ED1], + "Happy-Happy Village - Donation Lady": [0x098A97, 0x0893B6], + "Happy-Happy Village - Prisoner Item": [0x2F9664, 0x2EAF41, 0x2F9707], + "Happy-Happy Village - Defeat Carpainter": [0x09826F], + "Threed - Hospital Drawer": [0x086883], + "Saturn Valley - Post Belch Gift #1": [0x07EAB2], + "Saturn Valley - Post Belch Gift #2": [0x07EAD6], + "Saturn Valley - Post Belch Gift #3": [0x07EAFA], + "Dusty Dunes - Shining Spot": [0x060DAD], + "Dusty Dunes - Mine Reward": [0x06058F], + "Snow Wood - Maxwell Item": [0x06AC73], + "Scaraba - Snake Bag Salesman": [0x0570AC], + "Winters - Drugstore Saleswoman": [0x06AEC7], + "Andonuts Lab - Mouse": [0x06C898], + "Stonehenge - Kidnapped Mr. Saturn": [0x06C076], + "Stonehenge - Tony Item": [0x2FFA78], + "Monkey Caves - Bow Monkey Gift": [0x062636], + "Monkey Caves - Talah Rama Gift": [0x060FEB], + "Fourside - Venus Gift": [0x2EB1CE], + "Fourside - Post-Moonside Delivery": [0x07AAC4, 0x07B598, 0x331101], + "Fourside - Bakery 2F Gift": [0x06DE56], + "Monotoli Building - Electra Gift": [0x2EB29B], + "Monotoli Building - Monotoli Gift": [0x06EB3C], + "Summers - Museum Item": [0x08ABF2], + "Pyramid - Pedestal Item": [0x0931DF], + "Scaraba - Key Holder": [0x0576C1], + "Deep Darkness - Teleporting Monkey": [0x09E50F, 0x09E55F], + "Deep Darkness - North Alcove Truffle": [0x3315E5], + "Deep Darkness - Near Land Truffle": [0x331641], + "Deep Darkness - Present Truffle": [0x331613], + "Deep Darkness - Village Truffle": [0x33166F], + "Deep Darkness - Entrance Truffle": [0x3315B7], + "Tenda Village - Tenda Gift": [0x09DAF0], + "Tenda Village - Tenda Gift #2": [0x09D814], + "Magicant - Ness's Gift": [0x077629], + "Cave of the Present - Broken Phase Distorter": [0x2F590C], + "Dungeon Man - 1F Exit Ledge Present": [0x057A6B], + "Snow Wood - Upper Right Locker": [0x2EFB2A], + "Snow Wood - Upper Left Locker": [0x2EFB69], + "Snow Wood - Bottom Right Locker": [0x2EFBA8], + "Snow Wood - Bottom Left Locker": [0x2EFBE7] +} + + +present_locations = { # Field presents + "Onett - Tracy's Room Present": 0x0FE756, + "Onett - Hilltop Present": 0x0FE701, + "Onett - Burger Shop Trashcan": 0x0FE712, + "Onett - South Road Present": 0x0FE723, + "Onett - Hotel Trashcan": 0x0FE734, + "Onett - Arcade Trashcan": 0x0FE745, + "Giant Step - First Cave Present": 0x0FE778, + "Giant Step - Floor 2 Cave Present": 0x0FE789, + "Giant Step - Floor 3 Present": 0x0FE767, + "Twoson - Paula's Room Present": 0x0FE7AB, + "Twoson - Apple Kid Trashcan": 0x0FE7BC, + "Twoson - South of Town Present": 0x0FE79A, + "Peaceful Rest Valley - Split Hill Present": 0x0FE822, + "Peaceful Rest Valley - Hill Nook Present": 0x0FE7EF, + "Peaceful Rest Valley - South of Bridge Present": 0x0FE811, + "Peaceful Rest Valley - Dead End Present": 0x0FE833, + "Peaceful Rest Valley - River Overlook Present": 0x0FE844, + "Peaceful Rest Valley - North Side Present": 0x0FE800, + "Happy-Happy Village - Right HQ Present": 0x0FE7DE, + "Happy-Happy Village - Left HQ Present": 0x0FE7CD, + "Lilliput Steps - Southwest Pool Present": 0x0FE866, + "Lilliput Steps - East Cliff Present": 0x0FE877, + "Lilliput Steps - North Stream Present": 0x0FE855, + "Threed - Boogey Tent Trashcan": 0x0FB038, + "Threed - Cemetery Trashcan": 0x0FE888, + "Threed - Downtown Trashcan": 0x0FE8AA, + "Threed - East Side Trashcan": 0x0FE8BB, + "Threed - Northeast Shack Trashcan": 0x0FE899, + "Threed Underground - Left Coffin": 0x0FE8CC, + "Threed Underground - Right Coffin": 0x0FE8DD, + "Grapefruit Falls - South Present": 0x0FEB0E, + "Grapefruit Falls - North Present": 0x0FEAFD, + "Grapefruit Falls - Saturn Cave Present": 0x0FEB1F, + "Saturn Valley - Ladder Present": 0x0FEB30, + "Saturn Valley - Trashcan #1": 0x0FEB41, + "Saturn Valley - Trashcan #2": 0x0FEB52, + "Saturn Valley - Trashcan #3": 0x0FEB63, + "Milky Well - Cavern Present": 0x0FEAEC, + "Belch's Factory - Top Right Room Trashcan": 0x0FEA97, + "Belch's Factory - Pit Room Trashcan #1": 0x0FEADB, + "Belch's Factory - Pit Room Trashcan #2": 0x0FEA86, + "Belch's Factory - Balcony Room Trashcan #1": 0x0FEACA, + "Belch's Factory - Balcony Room Trashcan #2": 0x0FEAB9, + "Belch's Factory - Balcony Room Trashcan #3": 0x0FEAA8, + "Dusty Dunes - Northwest Corner Present": 0x0FEC84, + "Dusty Dunes - South Side Present": 0x0FECD9, + "Dusty Dunes - Surrounding Rocks Present": 0x0FEC73, + "Dusty Dunes - Black Sesame Present": 0x0FECA6, + "Dusty Dunes - Oasis Present": 0x0FECB7, + "Dusty Dunes - Northeast Corner Present": 0x0FECC8, + "Dusty Dunes - North Central Present": 0x0FEC95, + "Dusty Dunes - East Peninsula Present": 0x0FECEA, + "Snow Wood - Many Present Room Present #1": 0x0FE932, + "Snow Wood - Many Present Room Present #2": 0x0FE8FF, + "Snow Wood - Many Present Room Present #3": 0x0FE921, + "Snow Wood - Many Present Room Present #4": 0x0FE954, + "Snow Wood - Many Present Room Present #5": 0x0FE943, + "Snow Wood - Many Present Room Present #6": 0x0FE910, + "Snow Wood - Many Present Room Present #7": 0x0FE8EE, + "Brick Road Maze - Top Path Present": 0x0FE9BA, + "Brick Road Maze - Guarded Present": 0x0FE998, + "Brick Road Maze - Out of the Way Present": 0x0FE976, + "Brick Road Maze - Alcove Present": 0x0FE9A9, + "Brick Road Maze - Near Exit Present": 0x0FE987, + "Rainy Circle - Isolated Present": 0x0FE9ED, + "Rainy Circle - East Cliff Present": 0x0FE9CB, + "Rainy Circle - Near Ropes Present": 0x0FE9DC, + "Andonuts Lab - Present": 0x0FE965, + "Stonehenge - Purple Maze Present": 0x0FEA75, + "Stonehenge - Dead End Present": 0x0FEA0F, + "Stonehenge - Near End of the Maze Present": 0x0FEA53, + "Stonehenge - Bridge Room East Balcony Present": 0x0FEA20, + "Stonehenge - Bridge Room Lower Present": 0x0FEA31, + "Stonehenge - Flashing Room Right Path Present": 0x0FE9FE, + "Stonehenge - Flashing Room Center Present": 0x0FEA42, + "Stonehenge - Flashing Room Upper Present": 0x0FEA64, + "Gold Mine - Mouse Crossroad Present #1": 0x0FEDC7, + "Gold Mine - Mouse Crossroad Present #2": 0x0FEDA5, + "Gold Mine - B1F Lonely Mole Present": 0x0FED1D, + "Gold Mine - South Hall Present": 0x0FEDD8, + "Gold Mine - South Corner Present": 0x0FED94, + "Gold Mine - South Mole Present #1": 0x0FED3F, + "Gold Mine - South Mole Present #2": 0x0FED0C, + "Gold Mine - North Crossroad Detour Present": 0x0FED61, + "Gold Mine - North Mole Present": 0x0FED2E, + "Gold Mine - West Mole Present": 0x0FECFB, + "Gold Mine - B1F Isolated Present": 0x0FED83, + "Gold Mine - West Crossroad Detour Present": 0x0FED72, + "Gold Mine - B1F Junction Present": 0x0FEDB6, + "Gold Mine - B1F Junction Mole Present": 0x0FED50, + "Monkey Caves - 1F Right Chest": 0x0FEBEB, + "Monkey Caves - 1F Left Chest": 0x0FEBDA, + "Monkey Caves - West 2F Left Chest": 0x0FEBFC, + "Monkey Caves - West 2F Right Chest #1": 0x0FEC1E, + "Monkey Caves - West 2F Right Chest #2": 0x0FEC0D, + "Monkey Caves - East 2F Left Chest": 0x0FEC2F, + "Monkey Caves - East 2F Right Chest": 0x0FEC40, + "Monkey Caves - East West 3F Right Chest #1": 0x0FEC62, + "Monkey Caves - East West 3F Right Chest #2": 0x0FEC51, + "Monkey Caves - West End Chest": 0x0FEB74, + "Monkey Caves - West End Trashcan": 0x0FEB85, + "Monkey Caves - East End Chest": 0x0FEB96, + "Monkey Caves - East End Trashcan": 0x0FEBA7, + "Monkey Caves - Talah Rama Chest #1": 0x0FEBB8, + "Monkey Caves - Talah Rama Chest #2": 0x0FEBC9, + "Moonside - Two Trees Present": 0x0FEE1C, + "Moonside - East Island Present": 0x0FEE2D, + "Moonside - Businessman Present": 0x0FEE60, + "Moonside - West Island Present": 0x0FEE4F, + "Moonside - Hospital Present": 0x0FEE3E, + "Magnet Hill - West Entrance Trashcan": 0x0FEEA4, + "Magnet Hill - First Room Free Door Trashcan": 0x0FEEB5, + "Magnet Hill - First Room Barrel Door Trashcan": 0x0FEE93, + "Magnet Hill - Second Room Dead End Trashcan": 0x0FEE71, + "Magnet Hill - Final Room Door Trashcan": 0x0FEE82, + "Fourside - Magnet Hill Chest": 0x0FEDE9, + "Monotoli Building - One Table Present": 0x0FEDFA, + "Monotoli Building - Two Table Present": 0x0FEE0B, + "Dalaam - Throne Room Chest #1": 0x0FEFF8, + "Dalaam - Throne Room Chest #2": 0x0FF009, + "Dalaam - Throne Room Chest #3": 0x0FF01A, + "Dalaam - Restaurant Chest #1": 0x0FF03C, + "Dalaam - Restaurant Chest #2": 0x0FF05E, + "Dalaam - Do Do Guy's House Chest": 0x0FF04D, + "Dalaam - Upper House Chest": 0x0FF02B, + "Pink Cloud - Three Holes Present": 0x0FF080, + "Pink Cloud - Left Hole Present": 0x0FF06F, + "Pink Cloud - Ground Floor Present": 0x0FF091, + "Pyramid - Anteroom Sarcophagus": 0x0FEEE8, + "Pyramid - Northwest Door Sarcophagus": 0x0FEEC6, + "Pyramid - Hallway Sarcophagus #1": 0x0FEED7, + "Pyramid - Hallway Sarcophagus #2": 0x0FEF0A, + "Pyramid - Switch Room Sarcophagus": 0x0FEF1B, + "Pyramid - Way Out Sarcophagus": 0x0FEEF9, + "Dungeon Man - 1F Dead End Present": 0x0FEF70, + "Dungeon Man - 1F Long Walk Present": 0x0FEF2C, + "Dungeon Man - 1F Disappointing Present": 0x0FEFE7, + "Dungeon Man - 1F Opinion Present": 0x0FEF92, + "Dungeon Man - 1F No Sign Present": 0x0FEFA3, + "Dungeon Man - 2F Unnecessary Billboard Present": 0x0FEFB4, + "Dungeon Man - 2F Dungeon Exploration Present": 0x0FEF4E, + "Dungeon Man - 2F South Ledge Present": 0x0FEF81, + "Dungeon Man - 2F North Alcove Present": 0x0FEF5F, + "Dungeon Man - 3F Present": 0x0FEFD6, + "Dungeon Man - 2F Hole Present": 0x0FEFC5, + "Dungeon Man - 1F Exit Ledge Present": 0x0FEF3D, + "Deep Darkness - Crest of Darkness Present": 0x0FF0E6, + "Deep Darkness - Helicopter Present": 0x0FF0D5, + "Deep Darkness - Yellow Bird Present": 0x0FF0C4, + "Deep Darkness - Swamp Present": 0x0FF0F7, + "Deep Darkness - Corner Present": 0x0FF0A2, + "Deep Darkness - Alcove Present": 0x0FF0B3, + "Tenda Village - Trashcan": 0x0FF1A1, + "Lumine Hall - B1F Non-Talkative Rock Present": 0x0FF190, + "Lumine Hall - 1F North Path Present": 0x0FF14C, + "Lumine Hall - B1F Thankful Rock Corner Present": 0x0FF12A, + "Lumine Hall - B1F Thankful Rock Junction Present": 0x0FF17F, + "Lumine Hall - 1F Above Belly Button Present": 0x0FF119, + "Lumine Hall - B1F Belly Button Present": 0x0FF15D, + "Lumine Hall - 1F Near Exit Present": 0x0FF108, + "Lumine Hall - 1F Dead End Present": 0x0FF13B, + "Lumine Hall - B1F West Alcove Present": 0x0FF16E, + "Lost Underworld - East Present": 0x0FF1C3, + "Lost Underworld - Northeast Present": 0x0FF1D4, + "Lost Underworld - Northeast of Tenda Tribe Present": 0x0FF1E5, + "Lost Underworld - Southwest of Tenda Tribe Present": 0x0FF1F6, + "Lost Underworld - Evacuation Present": 0x0FF1B2, + "Fire Spring - 1st Cave Present": 0x0FF24B, + "Fire Spring - East Corner Present": 0x0FF229, + "Fire Spring - Volcano Present": 0x0FF23A, + "Fire Spring - Lone Cave Present": 0x0FF218, + "Fire Spring - Upper Volcano Present": 0x0FF207, + "Magicant - Present Near Ness": 0x0FF25C, + "Magicant - Lonely Present": 0x0FF27E, + "Magicant - North Present": 0x0FF28F, + "Magicant - Hills Present": 0x0FF2A0, + "Magicant - Town Present": 0x0FF26D, + "Cave of the Past - Present": 0x0FF2B1 +} + +psi_locations = { + "Onett - Mani Mani Statue": [0x2EA976, 0x90, 0xA9, 0xEE, 0x2EA9B9], + "Onett - Buzz Buzz": [0x2EAA04, 0x12, 0xAA, 0xEE, 0x2EAA49], + "Saturn Valley - Saturn Coffee": [0x2EAFE3, 0xF1, 0xAF, 0xEE, 0x2EB030], + "Monkey Caves - Monkey Power": [0x2EB12E, 0x68, 0xB1, 0xEE, 0x2EB1B1], + "Fourside - Department Store Blackout": [0x2EB22F, 0x66, 0xB2, 0xEE, 0x2EBFEF], + "Summers - Magic Cake": [0x2EB311, 0x1F, 0xB3, 0xEE, 0x2EB3A1], + "Dalaam - Trial of Mu": [0x2EB3FA, 0x08, 0xB4, 0xEE, 0x2EB443], + "Scaraba - Star Master": [0x2EB521, 0x32, 0xB5, 0xEE, 0x2EBFAD], + "Tenda Village - Tenda Tea": [0x2EB6A9, 0xB7, 0xB6, 0xEE, 0x2EB6E7], + "Lost Underworld - Talking Rock": [0x2EB72D, 0x3B, 0xB7, 0xEE, 0x2EB770], + "Magicant - Ness's Nightmare": [0x2EB7B4, 0xC7, 0xB7, 0xEE, 0x2EB812], + "Cave of the Present - Star Master": [0x2EB8C8, 0xD6, 0xB8, 0xEE, 0x2EB8EE] +} + +character_locations = { + "Happy-Happy Village - Prisoner": [0x2EBAA9, 0x0FA68B, 0x2EBAA4, 0x2EBAC9, 0xB8, 0xBA, 0xEE], + "Threed - Zombie Prisoner": [0x2EAF7F, 0x0FA977, 0x2EAF7A, 0x2EAFC5, 0xAF, 0xAF, 0xEE], + "Snow Wood - Bedroom": [0x2EB0DA, 0x0FB0D6, 0x2EB0D5, 0x2EB11C, 0x0B, 0xB1, 0xEE], + "Monotoli Building - Monotoli Character": [0x2EB2B2, 0x0FC37F, 0x2EB2AD, 0x2EB2D2, 0xC1, 0xB2, 0xEE], + "Dalaam - Throne Character": [0x2EB4D1, 0x0FD20A, 0x2EB4CC, 0x2EB4F1, 0xE0, 0xB4, 0xEE], + "Deep Darkness - Barf Character": [0x2EB654, 0x0FE0C8, 0x2EB64F, 0x2EB673, 0x62, 0xB6, 0xEE] +} + +item_id_table = { + "Franklin Badge": 0x01, + "Teddy Bear": 0x02, + "Super Plush Bear": 0x03, + "Broken Machine": 0x04, + "Broken Gadget": 0x05, + "Broken Air Gun": 0x06, + "Broken Spray Can": 0x07, + "Broken Laser": 0x08, + "Broken Iron": 0x09, + "Broken Pipe": 0x0A, + "Broken Cannon": 0x0B, + "Broken Tube": 0x0C, + "Broken Bazooka": 0x0D, + "Broken Trumpet": 0x0E, + "Broken Harmonica": 0x0F, + "Broken Antenna": 0x10, + "Cracked Bat": 0x11, + "Tee Ball Bat": 0x12, + "Sand Lot Bat": 0x13, + "Minor League Bat": 0x14, + "Mr. Baseball Bat": 0x15, + "Big League Bat": 0xD5, + "Hall of Fame Bat": 0x17, + "Magicant Bat": 0x18, + "Legendary Bat": 0x19, + "Gutsy Bat": 0x1A, + "Casey Bat": 0x1B, + "Fry Pan": 0x1C, + "Thick Fry Pan": 0x1D, + "Deluxe Fry Pan": 0x1E, + "Chef's Fry Pan": 0x1F, + "French Fry Pan": 0x20, + "Magic Fry Pan": 0x21, + "Holy Fry Pan": 0x22, + "Sword of Kings": 0x23, + "Pop Gun": 0x24, + "Stun Gun": 0x25, + "Toy Air Gun": 0x26, + "Magnum Air Gun": 0x27, + "Zip Gun": 0x28, + "Laser Gun": 0x29, + "Hyper Beam": 0x2A, + "Crusher Beam": 0x2B, + "Spectrum Beam": 0x2C, + "Death Ray": 0x2D, + "Baddest Beam": 0x2E, + "Moon Beam Gun": 0x2F, + "Gaia Beam": 0x30, + "Yo-yo": 0x31, + "Slingshot": 0x32, + "Bionic Slingshot": 0x33, + "Trick Yo-yo": 0x34, + "Combat Yo-yo": 0x35, + "Travel Charm": 0x36, + "Great Charm": 0x37, + "Crystal Charm": 0x38, + "Rabbit's Foot": 0x39, + "Flame Pendant": 0x3A, + "Rain Pendant": 0x3B, + "Night Pendant": 0x3C, + "Sea Pendant": 0x3D, + "Star Pendant": 0x3E, + "Cloak of Kings": 0x3F, + "Cheap Bracelet": 0x40, + "Copper Bracelet": 0x41, + "Silver Bracelet": 0x42, + "Gold Bracelet": 0x43, + "Platinum Band": 0xD8, + "Diamond Band": 0xD9, + "Pixie's Bracelet": 0x46, + "Cherub's Band": 0x47, + "Goddess Band": 0x48, + "Bracer of Kings": 0x49, + "Baseball Cap": 0x4A, + "Holmes Hat": 0x4B, + "Mr. Baseball Cap": 0x4C, + "Hard Hat": 0x4D, + "Ribbon": 0x4E, + "Red Ribbon": 0x4F, + "Goddess Ribbon": 0x50, + "Coin of Slumber": 0x51, + "Coin of Defense": 0x52, + "Lucky Coin": 0x53, + "Talisman Coin": 0x54, + "Shiny Coin": 0x55, + "Souvenir Coin": 0x56, + "Diadem of Kings": 0x57, + "Cookie": 0x58, + "Bag of Fries": 0x59, + "Hamburger": 0x5A, + "Boiled Egg": 0x5B, + "Fresh Egg": 0x5C, + "Picnic Lunch": 0x5D, + "Pasta di Summers": 0x5E, + "Pizza": 0x5F, + "Chef's Special": 0x60, + "Large Pizza": 0x61, + "PSI Caramel": 0x62, + "Magic Truffle": 0x63, + "Brain Food Lunch": 0x64, + "Rock Candy": 0x65, + "Croissant": 0x66, + "Bread Roll": 0x67, + "Pak of Bubble Gum": 0x68, + "Jar of Fly Honey": 0x69, + "Can of Fruit Juice": 0x6A, + "Royal Iced Tea": 0x6B, + "Protein Drink": 0x6C, + "Kraken Soup": 0x6D, + "Bottle of Water": 0x6E, + "Cold Remedy": 0x6F, + "Vial of Serum": 0x70, + "IQ Capsule": 0x71, + "Guts Capsule": 0x72, + "Speed Capsule": 0x73, + "Vital Capsule": 0x74, + "Luck Capsule": 0x75, + "Ketchup Packet": 0x76, + "Sugar Packet": 0x77, + "Tin of Cocoa": 0x78, + "Carton of Cream": 0x79, + "Sprig of Parsley": 0x7A, + "Jar of Hot Sauce": 0x7B, + "Salt Packet": 0x7C, + "Tiny Key": 0x7D, + "Jar of Delisauce": 0x7E, + "Wet Towel": 0x7F, + "Refreshing Herb": 0x80, + "Secret Herb": 0x81, + "Horn of Life": 0x82, + "Counter-PSI Unit": 0x83, + "Shield Killer": 0x84, + "Bazooka": 0x85, + "Heavy Bazooka": 0x86, + "HP-Sucker": 0x87, + "Hungry HP-Sucker": 0x88, + "Xterminator Spray": 0x89, + "Slime Generator": 0x8A, + "Yogurt Dispenser": 0x8B, + "Ruler": 0x8C, + "Snake Bag": 0x8D, + "Mummy Wrap": 0x8E, + "Protractor": 0x8F, + "Bottle Rocket": 0x90, + "Big Bottle Rocket": 0x91, + "Multi Bottle Rocket": 0x92, + "Bomb": 0x93, + "Super Bomb": 0x94, + "Insecticide Spray": 0x95, + "Rust Promoter": 0x96, + "Rust Promoter DX": 0x97, + "Pair of Dirty Socks": 0x98, + "Stag Beetle": 0x99, + "Toothbrush": 0x9A, + "Handbag Strap": 0x9B, + "Pharaoh's Curse": 0x9C, + "Defense Shower": 0x9D, + "UFO Engine": 0x9E, + "Sudden Guts Pill": 0x9F, + "Bag of Dragonite": 0xA0, + "Defense Spray": 0xA1, + "Piggy Nose": 0xA2, + "For Sale Sign": 0xA3, + "Shyness Book": 0xA4, + "Picture Postcard": 0xA5, + "King Banana": 0xA6, + "Letter For Tony": 0xA7, + "Chick": 0xA8, + "Chicken": 0xA9, + "Key to the Shack": 0xAA, + "Key to the Cabin": 0xAB, + "Bad Key Machine": 0xAC, + "Zombie Paper": 0xAE, + "Hawk Eye": 0xAF, + "Bicycle": 0xB0, + "ATM Card": 0xB1, + "Show Ticket": 0xB2, + "Tenda Lavapants": 0xB3, + "Wad of Bills": 0xB4, + "Receiver Phone": 0xB5, + "Diamond": 0xB6, + "Signed Banana": 0xB7, + "Pencil Eraser": 0xB8, + "Hieroglyph Copy": 0xB9, + "Meteotite": 0xBA, + "Contact Lens": 0xBB, + "Hand-Aid": 0xBC, + "Trout Yogurt": 0xBD, + "Banana": 0xBE, + "Calorie Stick": 0xBF, + "Key to the Tower": 0xC0, + "Meteorite Piece": 0xC1, + "Earth Pendant": 0xC2, + "Neutralizer": 0xC3, + "Sound Stone": 0xC4, + "Exit Mouse": 0xC5, + "Gelato de Resort": 0xC6, + "Snake": 0xC7, + "Viper": 0xC8, + "Brain Stone": 0xC9, + "Police Badge": 0xCA, + "Mining Permit": 0xCB, + "Suporma": 0xCC, + "Key to the Locker": 0xCD, + "Insignificant Item": 0xCE, + "Magic Tart": 0xCF, + "Tiny Ruby": 0xD0, + "Monkey's Love": 0xD1, + "Eraser Eraser": 0xD2, + "Tendakraut": 0xD3, + "T-Rex's Bat": 0xD4, + "Ultimate Bat": 0xD6, + "Double Beam": 0xD7, + "Defense Ribbon": 0xDA, + "Talisman Ribbon": 0xDB, + "Saturn Ribbon": 0xDC, + "Coin of Silence": 0xDD, + "Charm Coin": 0xDE, + "Cup of Noodles": 0xDF, + "Repel Sandwich": 0xE0, + "Repel Superwich": 0xE1, + "Lucky Sandwich": 0xE2, + "Progressive Bat": 0xE3, + "Progressive Fry Pan": 0xE4, + "Progressive Gun": 0xE5, + "Progressive Bracelet": 0xE6, + "Progressive Other": 0xE7, + "Cup of Coffee": 0xE8, + "Double Burger": 0xE9, + "Peanut Cheese Bar": 0xEA, + "Piggy Jelly": 0xEB, + "Bowl of Rice Gruel": 0xEC, + "Bean Croquette": 0xED, + "Molokheiya Soup": 0xEE, + "Plain Roll": 0xEF, + "Kabob": 0xF0, + "Plain Yogurt": 0xF1, + "Beef Jerky": 0xF2, + "Mammoth Burger": 0xF3, + "Spicy Jerky": 0xF4, + "Luxury Jerky": 0xF5, + "Bottle of DXwater": 0xF6, + "Magic Pudding": 0xF7, + "Non-Stick Frypan": 0xF8, + "Mr. Saturn Coin": 0xF9, + "Meteornium": 0xFA, + "Popsicle": 0xFB, + "Cup of Lifenoodles": 0xFC, + "Carrot Key": 0xFD +} + +psi_item_table = { + "Onett Teleport": 0x01, + "Twoson Teleport": 0x02, + "Happy-Happy Village Teleport": 0x03, + "Threed Teleport": 0x04, + "Saturn Valley Teleport": 0x05, + "Dusty Dunes Teleport": 0x06, + "Fourside Teleport": 0x07, + "Winters Teleport": 0x08, + "Summers Teleport": 0x09, + "Scaraba Teleport": 0x0A, + "Dalaam Teleport": 0x0B, + "Deep Darkness Teleport": 0x0C, + "Tenda Village Teleport": 0x0D, + "Lost Underworld Teleport": 0x0E, + "Magicant Teleport": 0x0F, + "Progressive Poo PSI": 0x10 +} + +character_item_table = { + "Paula": [0x01, 0x02, 0x0189, 0x06], + "Jeff": [0x02, 0x03, 0x018A, 0x06], + "Poo": [0x03, 0x04, 0x018B, 0x06], + "Flying Man": [0x04, 0x27, 0x0027, 0x04], + "Ness": [0x05, 0x00, 0x0010, 0x01, 0x06], # the last 2 might not be needed anymore + "Photograph": [0x06, 0x0153, 0x01C1] +} + +party_id_nums = { + "Paula": 0x02, + "Jeff": 0x03, + "Poo": 0x04, + "Flying Man": 0x0B, + "Ness": 0x01 +} + +special_name_table = { + "Onett Teleport": [0x00, 0xEE9210], + "Twoson Teleport": [0x01, 0xEE9240], + "Happy-Happy Village Teleport": [0x02, 0xEE9271], + "Threed Teleport": [0x03, 0xEE92AF], + "Saturn Valley Teleport": [0x04, 0xEE92E0], + "Dusty Dunes Teleport": [0x05, 0xEE9318], + "Fourside Teleport": [0x06, 0xEE9355], + "Winters Teleport": [0x07, 0xEE9388], + "Summers Teleport": [0x08, 0xEE93BA], + "Scaraba Teleport": [0x09, 0xEE93EC], + "Dalaam Teleport": [0x0A, 0xEE941E], + "Deep Darkness Teleport": [0x0B, 0xEE944F], + "Tenda Village Teleport": [0x0C, 0xEE948B], + "Lost Underworld Teleport": [0x0D, 0xEE94C3], + "Progressive Poo PSI": [0x0E, 0xEE9554], + "Paula": [0x0F, 0xD5F830], + "Jeff": [0x10, 0xD5F837], + "Poo": [0x11, 0xD5F83E], + "Flying Man": [0x12, 0xD5F845], + "Magicant Teleport": [0x13, 0xEE9501], + "Ness": [0x14, 0xD5F849], + "Photograph": [0x15, 0xF3FFE0] +} + +client_specials = { + 0x00FE: 0x01, + 0x00FF: 0x02, + 0x0100: 0x0D, + 0x0101: 0x03, + 0x0102: 0x05, + 0x0103: 0x0E, + 0x0104: 0x06, + 0x0105: 0x04, + 0x0106: 0x07, + 0x0107: 0x09, + 0x0108: 0x08, + 0x0109: 0x0A, + 0x010A: 0x0B, + 0x010B: 0x0C, + 0x010C: 0x14, + 0x010D: 0x0F, + 0x010E: 0x10, + 0x010F: 0x11, + 0x0110: 0x12, + 0x0111: 0x13, + 0x0112: 0x15, + 0x0113: 0x16 +} + + +starting_psi_table = { + "Onett Teleport": 0x01, + "Twoson Teleport": 0x02, + "Threed Teleport": 0x03, + "Winters Teleport": 0x04, + "Saturn Valley Teleport": 0x05, + "Fourside Teleport": 0x06, + "Summers Teleport": 0x07, + "Dalaam Teleport": 0x08, + "Scaraba Teleport": 0x09, + "Deep Darkness Teleport": 0x0A, + "Tenda Village Teleport": 0x0B, + "Lost Underworld Teleport": 0x0C, + "Happy-Happy Village Teleport": 0x0D, + "Dusty Dunes Teleport": 0x0E, + "Magicant Teleport": 0x0F, + "Progressive Poo PSI": 0x10 +} + +# Todo; convert the list shit to a Struct.pack! +item_space_checks = { + "Onett - Tracy Gift": [0x076174, 0x78, 0x61, 0xC7], + "Onett - Meteor Item": [0x0862FD, 0x01, 0x63, 0xC8], + "Onett - Library Counter": [0x05ECA7, 0xAB, 0xEC, 0xC5], + "Onett - Library Bookshelf": [0x087E74, 0x78, 0x7E, 0xC3], + "Onett - Treehouse Guy": [0x073F71, 0x75, 0x3F, 0xC7], + "Onett - Mayor Pirkle": [0x072D5A, 0x5E, 0x2D, 0xC7], + "Onett - Traveling Entertainer": [0x074775, 0x79, 0x74, 0xC7], + "Twoson - Bike Shop Rental": [0x08019E, 0xA2, 0x01, 0xC8], + "Twoson - Orange Kid Donation": [0x08135B, 0x5F, 0x13, 0xC8], + "Twoson - Apple Kid's Mouse": [0x0819D8, 0xDC, 0x19, 0xC8], + "Twoson - Apple Kid Invention": [0x08200E, 0x11, 0x20, 0xC8], + "Twoson - Antique Shop": [0x093EE3, 0xE7, 0x3E, 0xC9], + "Twoson - Paula's Mother": [0x080628, 0x2C, 0x0C, 0xC8], + "Twoson - Everdred Meeting": [0x09604B, 0x4F, 0x60, 0xC9], + "Happy-Happy Village - Donation Lady": [0x098A90, 0x94, 0x8A, 0xC9, 0x0893AF, 0xB3, 0x93, 0xC8], + "Happy-Happy Village - Prisoner Item": [0x2F965D, 0x61, 0x96, 0xEF, 0x2EAF3A, 0x3E, 0xAF, 0xEE], + "Happy-Happy Village - Defeat Carpainter": [0x098268, 0x6C, 0x82, 0xC9], + "Threed - Hospital Drawer": [0x08687C, 0x80, 0x68, 0xC8], + "Threed - Boogey Tent Trashcan": [0x2EF640, 0x44, 0xF6, 0xEE], + "Saturn Valley - Post Belch Gift #1": [0x2EC049, 0x4D, 0xC0, 0xEE], + "Saturn Valley - Post Belch Gift #2": [0x2EC063, 0x67, 0xC0, 0xEE], + "Saturn Valley - Post Belch Gift #3": [0x2EC056, 0x5A, 0xC0, 0xEE], + "Dusty Dunes - Shining Spot": [0x060DA1, 0xA5, 0x0D, 0xC6], + "Dusty Dunes - Mine Reward": [0x060588, 0x8C, 0x05, 0xC6], + "Snow Wood - Maxwell Item": [0x06AC6C, 0x70, 0xAC, 0xC6], + "Scaraba - Snake Bag Salesman": [0x057024, 0x28, 0x70, 0xC5], + "Winters - Drugstore Saleswoman": [0x2EF625, 0x29, 0xF6, 0xEE], + "Andonuts Lab - Mouse": [0x06C891, 0x95, 0xC8, 0xC6], + "Stonehenge - Kidnapped Mr. Saturn": [0x06C06F, 0x73, 0xC0, 0xC6], + "Stonehenge - Tony Item": [0x2FFA71, 0x7F, 0xFA, 0xEF], + "Monkey Caves - Bow Monkey Gift": [0x0625F1, 0xF5, 0x25, 0xC6], + "Monkey Caves - Talah Rama Gift": [0x060FE1, 0xE5, 0x0F, 0xC6], + "Fourside - Venus Gift": [0x2EB1C7, 0xCB, 0xB1, 0xEE], + "Fourside - Post-Moonside Delivery": [0x07AABD, 0xC1, 0xAA, 0xC7, 0x07B57C, 0x80, 0xB5, 0xC7], + "Monotoli Building - Electra Gift": [0x06E99C, 0xA0, 0xE9, 0xC6], + "Monotoli Building - Monotoli Gift": [0x06EB35, 0x39, 0xEB, 0xC6], + "Summers - Museum Item": [0x08ABEB, 0xEF, 0xAB, 0xC8], + "Pyramid - Pedestal Item": [0x0931D8, 0xDC, 0x31, 0xC9], + "Scaraba - Key Holder": [0x0576B9, 0xBD, 0x76, 0xC5], # Extra break? + "Deep Darkness - Teleporting Monkey": [0x09E508, 0x0C, 0xE5, 0xC9], + "Deep Darkness - North Alcove Truffle": [0x3315DE, 0xE2, 0x15, 0xF3], + "Deep Darkness - Near Land Truffle": [0x33163A, 0x3E, 0x16, 0xF3], + "Deep Darkness - Present Truffle": [0x33160C, 0x10, 0x16, 0xF3], + "Deep Darkness - Village Truffle": [0x331668, 0x6C, 0x16, 0xF3], + "Deep Darkness - Entrance Truffle": [0x3315B0, 0xB4, 0x15, 0xF3], + "Tenda Village - Tenda Gift #2": [0x09D80D, 0x11, 0xD8, 0xC9], + "Magicant - Ness's Gift": [0x077622, 0x26, 0x76, 0xC7], + "Cave of the Present - Broken Phase Distorter": [0x2F5905, 0x09, 0x59, 0xEF], + "Onett - Mani Mani Statue": [0x2EBEA6, 0xAA, 0xBE, 0xEE], + "Onett - Buzz Buzz": [0x2EAA4C, 0x50, 0xAA, 0xEE], + "Saturn Valley - Saturn Coffee": [0x2EB029, 0x2D, 0xB0, 0xEE], + "Monkey Caves - Monkey Power": [0x2EB1AA, 0xAE, 0xB1, 0xEE], + "Fourside - Department Store Blackout": [0x2EB26B, 0x6F, 0xB2, 0xEE], + "Summers - Magic Cake": [0x2EB39A, 0x9E, 0xB3, 0xEE], + "Dalaam - Trial of Mu": [0x2EB43C, 0x40, 0xB4, 0xEE], + "Scaraba - Star Master": [0x2EB537, 0x3B, 0xB5, 0xEE], + "Tenda Village - Tenda Tea": [0x2EB6E0, 0xE4, 0xB6, 0xEE], + "Lost Underworld - Talking Rock": [0x2EB769, 0x6D, 0xB7, 0xEE], + "Magicant - Ness's Nightmare": [0x2EB80B, 0x0F, 0xB8, 0xEE], + "Cave of the Present - Star Master": [0x2EB8E7, 0xEB, 0xB8, 0xEE], + "Happy-Happy Village - Prisoner": [0x2EBAC2, 0xC6, 0xBA, 0xEE], + "Threed - Zombie Prisoner": [0x2EAF85, 0x89, 0xAF, 0xEE], + "Dalaam - Throne Character": [0x2EB4EA, 0xEE, 0xB4, 0xEE], + "Snow Wood - Upper Right Locker": [0x2EFB23, 0x27, 0xFB, 0xEE], + "Snow Wood - Upper Left Locker": [0x2EFB62, 0x66, 0xFB, 0xEE], + "Snow Wood - Bottom Right Locker": [0x2EFBA1, 0xA5, 0xFB, 0xEE], + "Snow Wood - Bottom Left Locker": [0x2EFBE0, 0xE4, 0xFB, 0xEE], + "Snow Wood - Bedroom": [0x2EB0E0, 0xE4, 0xB0, 0xEE], + "Monotoli Building - Monotoli Character": [0x2EB2B8, 0xBC, 0xB2, 0xEE], + "Deep Darkness - Barf Character": [0x2EB65A, 0x5E, 0xB6, 0xEE] +} + +protection_checks = { + "thunder": [0x0297D2], + "fire": [0x2FFC35, 0x2FFC77], + "freeze": [0x2FFC56], + "flash": [0x2FFC9B], + "starstorm": [0x2FFCCD], + "special": [0x2FFC1E], + "explosive": [0x2FFCED] +} + +badge_names = { + "thunder": "Franklin badge", + "fire": "Bunsen badge", + "freeze": "Thilorier badge", + "flash": "Cowen badge", + "starstorm": "Leavitt badge", + "special": "Mesmer badge", + "explosive": "Nobel badge" +} + +protection_text = { + "thunder": [0xEEC911, 0xEEC95F], + "fire": [0xEEC91C, 0xEEC969], + "freeze": [0xEEC922, 0xEEC96E], + "flash": [0xEEC928, 0xEEC972], + "starstorm": [0xEEC92F, 0xEEC978], + "special": [0xEEC93A, 0xEEC982], + "explosive": [0xEEC94A, 0xEEC989] +} + +local_present_types = { + "filler": [0xd6, 0x00], + "progression": [0xE9, 0x00], + "useful": [0xC3, 0x00], + "trap": [0xE9, 0x00], + "progression_skip_balancing": [0xE9, 0x00] +} + +nonlocal_present_types = { + "filler": [0x98, 0x01], + "progression": [0x90, 0x01], + "useful": [0x98, 0x01], + "trap": [0x90, 0x01], + "progression_skip_balancing": [0x90, 0x01] + +} + +present_text_pointers = { + "filler": [0x5b, 0xd8, 0xc7], + "progression": [0x67, 0xd8, 0xc7], + "useful": [0x4F, 0xD8, 0xC7], + "progression_skip_balancing": [0x67, 0xd8, 0xc7], + "trap": [0x67, 0xd8, 0xc7] +} + +ap_text_pntrs = [ + 0xEECDCD, # ce + 0xEECDD9, # cf + 0xEECDE5, # d0 + 0xEECDF1, # e7 + 0xEECDFD, # e8 + 0xEECE09, # e9 + 0xEECE15, # ea + 0xEECE21, # eb + 0xEECE2D, # ec + 0xEECE39, # ed + 0xEECE45, # ee + 0xEECE51, # ef + 0xEECE5D, # f0 + 0xEECE69, # f1 + 0xEECE75, # f2 + 0xEECE81, # f3 + # [0x8D, 0xCE, 0xEE] #trap text +] + +hint_bits = [ + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80 +] + +money_item_table = { + "$10": 10, + "$100": 100, + "$1000": 1000 +} + +money_id_table = { + 0x114: 10, + 0x115: 100, + 0x116: 1000 +} + +# 0: Action pointer, call the actual item being given +# 1: Sprite ID +# 2: Secondary routine pointer, used for items and psi +# 3: Inventory item give +# 4: Standard item routine address +# For characters diff --git a/worlds/earthbound/game_data/palettes_organized.py b/worlds/earthbound/game_data/palettes_organized.py new file mode 100644 index 0000000000..aaf9276279 --- /dev/null +++ b/worlds/earthbound/game_data/palettes_organized.py @@ -0,0 +1,11066 @@ +map_palettes = { + "Pyramid": 0, + "Lost Underworld": 1, + "Cave of the Past": 2, + "Giygas's Lair": 3, + "Onett": 4, + # "Onett Nighttime": 5, + # "Onett Flashback": 6, + "Twoson": 7, + "Happy-Happy Village": 8, + "Happy-Happy Clear": 9, + "Tunnel Outdoors": 10, + "Threed": 11, + "Threed Daytime": 12, + "Fourside": 13, + "Moonside": 14, + "Magicant": 15, + "Tunnels": 16, + "Magicant Interiors": 17, + "Tents": 18, + "Peaceful Rest Valley": 19, + "Grapefruit Falls": 20, + "Saturn Valley": 21, + "Deep Darkness": 22, + "Lilliput Steps Sanctuary": 23, + "Milky Well": 24, + "Deep Darkness Darkness": 25, + "Summers": 26, + "Dusty Dunes Desert": 27, + "The Sky": 28, + "Dalaam": 29, + "Dalaam Palace": 30, + "Cave of the Present": 31, + "Pink Cloud Sanctuary": 32, + "The Sea": 33, + # "????": 34, + "Monotoli Offices": 35, + "Onett Hotel": 36, + "Threed Red-Wall House": 37, + "Electra's Room": 38, + "Threed Green-Wall House": 39, + "Threed Blue-Wall House": 40, + "Pokey's House": 41, + "Moonside Hospital": 42, + "Onett Green-Wall House": 43, + "Onett Blue-Wall House": 44, + "Onett Seafoam-Wall House": 45, + "Onett Peach-Wall House": 46, + "Onett Light Blue-Wall House": 47, + "Onett Pink-Wall House": 48, + "Onett White-Wall House": 49, + # "Onett Flashback House": 50, + "Hospitals": 51, + "Apple Kid's House": 52, + "Tracy's Room": 53, + "Orange Kid's House": 54, + "Everdred's House": 55, + "Twoson Green-Wall House": 56, + "Ness's Room": 57, + "Police Station Backroom": 58, + "Winters": 59, + "Rainy Circle Sanctuary": 60, + # "Winters Nighttime": 61, + # "Ness's House Nighttime": 62, + "Hospital Rooms": 63, + "Twoson Peach-Wall House": 64, + "Twoson Pink-Wall House": 65, + "Twoson Gray-Wall House": 66, + "Gold Office": 67, + "Happy-Happy Guardhouse": 68, + "Happy-Happy Hospital": 69, + "Happy-Happy Hospital Clear": 70, + "Onett Town Hall": 71, + "Onett Hotel Bedrooms": 72, + "Fourside Hotel Bedrooms": 73, + "Happy-Happy Saturn House": 74, + "Happy-Happy Hotel": 75, + "Twoson Hotel Bedrooms": 76, + "Threed Hotel Bedrooms": 77, + "Happy-Happy Hotel Clear": 78, + "Monotoli Building": 79, + "Paula's House": 80, + "Paula's Room": 81, + "Ness's House": 82, + "Twoson Hotel": 83, + "Threed Hotel": 84, + "Fourside Hotel": 85, + "Monotoli Elevators": 86, + "Fourside Dept. Store Office": 87, + "Onett Library": 88, + "Paula's House Rooms": 89, + "Onett Police Station": 90, + "Scaraba": 91, + "Dalaam House": 92, + "Scaraba House": 93, + "Happy-Happy HQ": 94, + "Fourside Cafe": 95, + "Moonside Cafe": 96, + "Scaraba Hospital": 97, + "Scaraba Shop": 98, + "Twoson Dept. Store": 99, + "Fourside Dept. Store": 100, + "Bakery": 101, + "Mach Pizza": 102, + "Burger Shop": 103, + "Onett Drugstore": 104, + "Threed Drugstore": 105, + "Winters Drugstore": 106, + "Chaos Theater": 107, + "Fourside Museum": 108, + "Summers Hotel": 109, + "Summers Shop": 110, + # "Topolla Theater Stage": 111, + "Snow Wood Boarding School": 112, + # "Chaos Theater Stage": 113, + "Summers Harbor House": 114, + "Summers Restaurant": 115, + "Moonside Museum": 116, + "Stoic Club": 117, + "Andonuts Lab": 118, + "Topolla Theater": 119, + "Summers Museum": 120, + "Onett Arcade": 121, + "Twoson Bus Station": 122, + "Twoson Bike Shop": 123, + "Hint Shop": 124, + "Fourside Dept. Store Rooms": 125, + "Threed Tent": 126, + "Onett Treehouse": 127, + "Lier's House": 128, + "Run-down House": 129, + "Paula's Cabin": 130, + "Dusty Dunes Drugstore": 131, + "Dusty Dunes Miner Shack": 132, + "Traveler's Shack": 133, + "Lumine Hall": 134, + "Connector Caves": 135, + "Lumine Hall Sanctuary": 136, + "Fire Spring": 137, + "Sea of Eden": 138, + "Monkey Caves Treasure Rooms": 139, + "Dungeon Man": 140, + "Threed Underground": 141, + "Lier's Cave": 142, + "Stonehenge Balcony Room": 143, + "Stonehenge Balcony Off": 144, + "Brickroad Maze": 145, + "Rainy Circle": 146, + "Belch's Factory": 147, + "Milky Well Caves": 148, + "Lilliput Steps": 149, + "Monkey Caves Hallway": 150, + "Giant Step": 151, + "Pink Cloud": 152, + "Saturn Caves": 153, + "Stonehenge Tunnels": 154, + # "Stonehenge Flashing Room": 155, + # "????": 156, + "Gold Mine": 157, + "Sewer": 158, + "Tenda Village": 159, + "Fourside Dept. Store Blackout": 160, + "Fourside Dept. Store Blackout Rooms": 161, + "Magicant Manly Fish": 162, + "Magicant Ness": 163, + # "Magicant Tracy (Unused)": 164, + "Magicant Rabbit": 165, + "Magicant Belch": 166, + "Magicant Mom": 167 +} + +# To anyone reviewing this, you can just close and ignore these. + +nice_palettes = { + "Pyramid": [ + 0, + 6, + 26, + 31, + 33, + 34, + 38, + 39, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 53, + 57, + 62, + 67, + 68, + 69, + 70, + 75, + 78, + 79, + 82, + 84, + 85, + 87, + 92, + 93, + 95, + 99, + 100, + 101, + 107, + 109, + 110, + 111, + 112, + 113, + 118, + 119, + 124, + 128, + 129, + 130, + 131, + 132, + 133, + 155, + 156, + 159, + 160 + ], + "Lost Underworld": [ + 1, + 22, + 62, + 79, + 86, + 107, + 114, + 130, + 133, + 134, + 141, + 154, + 156 + ], + "Cave of the Past": [ + 2, + 42, + 62, + 79, + 86, + 92, + 101, + 107, + 123, + 137, + 140, + 142, + 146, + 157 + ], + "Giygas's Lair": [ + 0, + 3, + 30, + 33, + 36, + 37, + 50, + 67, + 83, + 84, + 111, + 128, + 132, + 139, + 160, + 164 + ], + "Onett": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 19, + 21, + 22, + 42, + 105, + 106, + 107, + 109, + 116 + ], + "Twoson": [ + 4, + 5, + 7, + 9, + 11, + 12, + 13, + 14, + 22, + 42, + 59, + 62, + 63, + 107, + 116 + ], + "Happy-Happy Village": [ + 4, + 5, + 7, + 8, + 9, + 11, + 12, + 13, + 14, + 21, + 22, + 42, + 47, + 59, + 62 + ], + "Happy-Happy Clear": [ + 4, + 5, + 7, + 8, + 9, + 11, + 12, + 13, + 14, + 21, + 22, + 42, + 47, + 59, + 62 + ], + "Tunnel Outdoors": [ + 1, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 19, + 21, + 22, + 25, + 26, + 42, + 59, + 62, + 63, + 79, + 86, + 92, + 95, + 96, + 104, + 105, + 106, + 107, + 109, + 116, + 141, + 154 + ], + "Threed": [ + 4, + 5, + 7, + 9, + 11, + 12, + 13, + 14, + 42, + 62, + 116 + ], + "Threed Daytime": [ + 4, + 5, + 7, + 9, + 11, + 12, + 13, + 14, + 42, + 62, + 116 + ], + "Fourside": [ + 4, + 5, + 9, + 10, + 11, + 12, + 13, + 14, + 42, + 109, + 116 + ], + "Moonside": [ + 4, + 5, + 7, + 9, + 11, + 12, + 13, + 14, + 21, + 22, + 42, + 63, + 109, + 116 + ], + "Magicant": [ + 15, + 42, + 63, + 79, + 89, + 97, + 112, + 115, + 116, + 118, + 162, + 163, + 164, + 165, + 166, + 167 + ], + "Tunnels": [ + 0, + 1, + 8, + 9, + 10, + 11, + 12, + 16, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 33, + 38, + 40, + 41, + 43, + 48, + 49, + 57, + 59, + 61, + 62, + 63, + 68, + 70, + 71, + 75, + 78, + 82, + 85, + 86, + 90, + 92, + 94, + 95, + 99, + 100, + 101, + 104, + 105, + 111, + 117, + 119, + 120, + 128, + 129, + 131, + 135, + 136, + 137, + 140, + 141, + 142, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 156, + 157, + 158, + 159 + ], + "Magicant Interiors": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 25, + 26, + 27, + 32, + 33, + 34, + 38, + 39, + 40, + 41, + 42, + 44, + 51, + 52, + 54, + 58, + 62, + 71, + 75, + 79, + 81, + 82, + 86, + 88, + 91, + 101, + 103, + 105, + 107, + 109, + 112, + 115, + 116, + 120, + 123, + 132, + 146, + 147, + 157, + 160, + 162, + 163, + 164, + 165, + 166, + 167 + ], + "Tents": [ + 18, + 20, + 29, + 42, + 63, + 79, + 80, + 93, + 107, + 109, + 116, + 146, + 147, + 157 + ], + "Peaceful Rest Valley": [ + 4, + 5, + 13, + 14, + 19, + 21, + 22, + 42, + 62, + 63, + 82, + 116 + ], + "Grapefruit Falls": [ + 4, + 5, + 7, + 8, + 9, + 11, + 12, + 13, + 14, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 42, + 62, + 63, + 101, + 109, + 112, + 133 + ], + "Saturn Valley": [ + 4, + 5, + 7, + 9, + 11, + 12, + 13, + 14, + 21, + 22, + 42, + 59, + 63, + 116 + ], + "Deep Darkness": [ + 22, + 42, + 47, + 62, + 112, + 116 + ], + "Lilliput Steps Sanctuary": [ + 4, + 5, + 7, + 8, + 9, + 11, + 12, + 13, + 14, + 19, + 20, + 21, + 22, + 23, + 24, + 42, + 59, + 61, + 62, + 63, + 101, + 112 + ], + "Milky Well": [ + 4, + 5, + 7, + 8, + 9, + 12, + 13, + 14, + 21, + 22, + 24, + 42, + 59, + 62, + 63, + 116 + ], + "Deep Darkness Darkness": [ + 25 + ], + "Summers": [ + 14, + 26, + 27, + 42, + 57, + 59, + 62, + 91, + 93, + 107, + 109, + 112, + 115, + 116, + 118 + ], + "Dusty Dunes Desert": [ + 27, + 38, + 39, + 42, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 68, + 71, + 75, + 78, + 80, + 90, + 92, + 93, + 104, + 109, + 112, + 115, + 116, + 119, + 120, + 130, + 133, + 163 + ], + "The Sky": [ + 0, + 1, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 25, + 26, + 27, + 28, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 62, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 139, + 140, + 141, + 154, + 159, + 160, + 161, + 162, + 165, + 166 + ], + "Dalaam": [ + 14, + 22, + 29, + 32, + 42, + 62, + 109, + 115, + 116 + ], + "Dalaam Palace": [ + 3, + 14, + 30, + 31, + 132, + 162 + ], + "Cave of the Present": [ + 31, + 72 + ], + "Pink Cloud Sanctuary": [ + 9, + 32, + 42, + 62, + 73, + 87, + 93, + 98, + 99, + 100, + 103, + 109, + 119, + 120, + 130 + ], + "The Sea": [ + 9, + 33, + 34, + 42, + 107, + 109, + 112, + 116, + 118 + ], + "Monotoli Offices": [ + 35, + 38, + 39, + 41, + 42, + 50, + 51, + 53, + 56, + 57, + 58, + 63, + 71, + 80, + 82, + 88, + 90, + 102, + 104, + 107, + 109, + 116, + 120, + 128 + ], + "Onett Hotel": [ + 14, + 36, + 42, + 44, + 51, + 57, + 58, + 62, + 63, + 65, + 70, + 71, + 74, + 79, + 102, + 107, + 109, + 112, + 116, + 120 + ], + "Threed Red-Wall House": [ + 14, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 70, + 71, + 75, + 78, + 81, + 82, + 90, + 104, + 112, + 116, + 120 + ], + "Electra's Room": [ + 14, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 47, + 48, + 50, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 68, + 69, + 70, + 71, + 72, + 73, + 75, + 76, + 78, + 80, + 81, + 82, + 90, + 93, + 109, + 112, + 116, + 118, + 119, + 120 + ], + "Threed Green-Wall House": [ + 38, + 39, + 41, + 42, + 43, + 44, + 50, + 53, + 57, + 62, + 63, + 70, + 71, + 75, + 78, + 82, + 90, + 109, + 112, + 116, + 120 + ], + "Threed Blue-Wall House": [ + 14, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 52, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 66, + 67, + 69, + 70, + 71, + 74, + 75, + 78, + 81, + 88, + 90, + 107, + 109, + 112, + 116, + 118, + 120 + ], + "Pokey's House": [ + 14, + 38, + 41, + 42, + 44, + 57, + 70, + 71, + 75, + 78, + 90, + 109, + 112, + 115, + 116, + 120 + ], + "Moonside Hospital": [ + 14, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 52, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 73, + 74, + 75, + 76, + 78, + 80, + 81, + 82, + 88, + 90, + 91, + 109, + 112, + 116, + 120 + ], + "Onett Green-Wall House": [ + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 66, + 70, + 71, + 75, + 78, + 80, + 90, + 109, + 112, + 116, + 120 + ], + "Onett Blue-Wall House": [ + 38, + 41, + 42, + 43, + 44, + 51, + 53, + 57, + 62, + 63, + 70, + 71, + 75, + 78, + 109, + 112, + 116, + 120 + ], + "Onett Seafoam-Wall House": [ + 42, + 45, + 50, + 51, + 54, + 56, + 62, + 63, + 66, + 107, + 109, + 112, + 116, + 120 + ], + "Onett Peach-Wall House": [ + 36, + 42, + 46, + 50, + 55, + 56, + 62, + 65, + 66, + 67, + 71, + 75, + 76, + 78, + 90, + 109, + 112, + 116, + 120 + ], + "Onett Light Blue-Wall House": [ + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 53, + 57, + 58, + 62, + 63, + 67, + 70, + 71, + 75, + 78, + 79, + 82, + 83, + 85, + 86, + 90, + 104, + 107, + 109, + 112, + 116, + 120 + ], + "Onett Pink-Wall House": [ + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 47, + 48, + 50, + 51, + 52, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 68, + 69, + 70, + 71, + 72, + 73, + 75, + 76, + 78, + 81, + 88, + 90, + 109, + 112, + 116, + 120 + ], + "Onett White-Wall House": [ + 38, + 39, + 41, + 42, + 43, + 44, + 47, + 48, + 49, + 50, + 51, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 67, + 71, + 72, + 73, + 74, + 75, + 76, + 78, + 79, + 81, + 83, + 86, + 87, + 109, + 112, + 116 + ], + "Hospitals": [ + 41, + 42, + 51, + 53, + 57, + 58, + 62, + 63, + 67, + 68, + 71, + 82, + 88, + 90, + 93, + 107, + 109, + 112, + 115, + 116, + 119, + 120 + ], + "Apple Kid's House": [ + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 52, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 66, + 69, + 70, + 71, + 75, + 78, + 80, + 81, + 82, + 88, + 90, + 102, + 109, + 116, + 119, + 120 + ], + "Tracy's Room": [ + 38, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 66, + 70, + 71, + 75, + 78, + 90, + 109, + 112, + 115, + 116, + 118, + 120 + ], + "Orange Kid's House": [ + 42, + 47, + 50, + 51, + 54, + 62, + 63, + 70, + 107, + 109, + 112, + 116, + 120 + ], + "Everdred's House": [ + 36, + 38, + 39, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 55, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 70, + 71, + 75, + 76, + 78, + 82, + 83, + 90, + 109, + 112, + 116, + 118, + 119, + 120 + ], + "Twoson Green-Wall House": [ + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 66, + 70, + 71, + 75, + 78, + 90, + 109, + 112, + 115, + 116, + 120 + ], + "Ness's Room": [ + 38, + 39, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 68, + 71, + 75, + 76, + 78, + 109, + 112, + 116, + 120 + ], + "Police Station Backroom": [ + 6, + 9, + 14, + 36, + 38, + 39, + 41, + 42, + 43, + 44, + 45, + 46, + 48, + 49, + 50, + 51, + 53, + 55, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 90, + 102, + 103, + 104, + 107, + 109, + 112, + 116, + 118, + 119, + 120, + 128, + 131, + 132 + ], + "Winters": [ + 4, + 5, + 7, + 9, + 12, + 13, + 14, + 21, + 22, + 42, + 59, + 60, + 61, + 62, + 63, + 82, + 109, + 116, + 162 + ], + "Rainy Circle Sanctuary": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 15, + 17, + 19, + 20, + 21, + 22, + 26, + 27, + 42, + 50, + 51, + 59, + 61, + 62, + 63, + 79, + 86, + 96, + 97, + 101, + 105, + 107, + 108, + 116, + 118, + 123, + 167 + ], + "Hospital Rooms": [ + 38, + 39, + 41, + 42, + 43, + 44, + 47, + 50, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 66, + 70, + 71, + 75, + 78, + 81, + 88, + 90, + 109, + 112, + 116 + ], + "Twoson Peach-Wall House": [ + 38, + 39, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 71, + 72, + 75, + 76, + 78, + 90, + 109, + 112, + 116, + 120 + ], + "Twoson Pink-Wall House": [ + 38, + 39, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 68, + 70, + 71, + 72, + 73, + 75, + 76, + 78, + 90, + 109, + 112, + 115, + 116, + 120 + ], + "Twoson Gray-Wall House": [ + 38, + 39, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 66, + 70, + 71, + 75, + 78, + 81, + 109, + 112, + 116 + ], + "Gold Office": [ + 42, + 47, + 50, + 51, + 57, + 62, + 63, + 67, + 71, + 75, + 78, + 83, + 90, + 109, + 112, + 116, + 120 + ], + "Happy-Happy Guardhouse": [ + 14, + 38, + 39, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 68, + 70, + 71, + 72, + 73, + 75, + 76, + 78, + 81, + 90, + 109, + 112, + 116, + 120 + ], + "Happy-Happy Hospital": [ + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 53, + 54, + 57, + 58, + 62, + 63, + 67, + 69, + 70, + 71, + 75, + 78, + 81, + 90, + 107, + 109, + 112, + 116, + 120 + ], + "Happy-Happy Hospital Clear": [ + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 53, + 54, + 57, + 58, + 62, + 63, + 67, + 69, + 70, + 71, + 75, + 78, + 81, + 90, + 107, + 109, + 112, + 116, + 120 + ], + "Onett Town Hall": [ + 14, + 39, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 54, + 57, + 58, + 63, + 66, + 67, + 68, + 70, + 71, + 75, + 83, + 88, + 90, + 100, + 102, + 104, + 105, + 107, + 109, + 112, + 116, + 118, + 120 + ], + "Onett Hotel Bedrooms": [ + 38, + 39, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 68, + 70, + 71, + 72, + 73, + 75, + 76, + 78, + 81, + 107, + 109, + 112, + 116, + 120 + ], + "Fourside Hotel Bedrooms": [ + 38, + 39, + 41, + 42, + 43, + 44, + 47, + 48, + 50, + 51, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 68, + 69, + 70, + 71, + 72, + 73, + 75, + 76, + 77, + 78, + 81, + 88, + 90, + 102, + 109, + 112, + 116, + 120 + ], + "Happy-Happy Saturn House": [ + 42, + 56, + 62, + 74, + 75, + 90, + 109, + 112, + 116, + 119, + 120 + ], + "Happy-Happy Hotel": [ + 38, + 39, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 71, + 75, + 78, + 90, + 109, + 112, + 116 + ], + "Twoson Hotel Bedrooms": [ + 38, + 39, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 68, + 70, + 71, + 75, + 76, + 78, + 109, + 112, + 116, + 120 + ], + "Threed Hotel Bedrooms": [ + 38, + 39, + 41, + 42, + 43, + 44, + 48, + 50, + 51, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 64, + 65, + 66, + 68, + 69, + 70, + 71, + 72, + 73, + 75, + 76, + 77, + 78, + 81, + 88, + 90, + 102, + 109, + 112, + 120 + ], + "Happy-Happy Hotel Clear": [ + 38, + 39, + 41, + 42, + 43, + 44, + 50, + 51, + 53, + 56, + 57, + 58, + 62, + 63, + 71, + 75, + 78, + 90, + 109, + 112, + 116 + ], + "Monotoli Building": [ + 38, + 42, + 51, + 57, + 62, + 63, + 79, + 109, + 112, + 116, + 120 + ], + "Paula's House": [ + 42, + 51, + 63, + 80, + 109, + 112, + 116, + 118, + 120 + ], + "Paula's Room": [ + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 52, + 53, + 54, + 56, + 57, + 58, + 62, + 63, + 66, + 69, + 70, + 71, + 75, + 78, + 81, + 90, + 109, + 112, + 116, + 120 + ], + "Ness's House": [ + 38, + 39, + 41, + 42, + 43, + 50, + 51, + 53, + 57, + 58, + 62, + 63, + 67, + 71, + 82, + 90, + 109, + 112, + 116 + ], + "Twoson Hotel": [ + 38, + 39, + 41, + 42, + 44, + 50, + 51, + 53, + 57, + 58, + 62, + 63, + 67, + 70, + 71, + 72, + 75, + 83, + 90, + 109, + 112, + 116, + 118, + 120 + ], + "Threed Hotel": [ + 39, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 53, + 57, + 58, + 62, + 63, + 67, + 70, + 71, + 75, + 78, + 79, + 83, + 84, + 88, + 90, + 107, + 109, + 112, + 116, + 120 + ], + "Fourside Hotel": [ + 38, + 39, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 53, + 57, + 58, + 62, + 63, + 67, + 70, + 71, + 75, + 78, + 79, + 82, + 83, + 85, + 86, + 90, + 104, + 109, + 112, + 116, + 118, + 119, + 120 + ], + "Monotoli Elevators": [ + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 19, + 22, + 36, + 37, + 41, + 42, + 51, + 53, + 54, + 57, + 58, + 62, + 63, + 67, + 68, + 69, + 70, + 79, + 82, + 83, + 84, + 85, + 86, + 88, + 89, + 90, + 92, + 93, + 98, + 99, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 109, + 112, + 116, + 119, + 120, + 123, + 127, + 132, + 160 + ], + "Fourside Dept. Store Office": [ + 42, + 45, + 50, + 57, + 62, + 66, + 67, + 87, + 88, + 109, + 112, + 116, + 120, + 161 + ], + "Onett Library": [ + 39, + 41, + 42, + 43, + 44, + 47, + 50, + 51, + 57, + 58, + 62, + 63, + 70, + 71, + 75, + 78, + 88, + 90, + 102, + 107, + 109, + 112, + 116, + 118, + 120 + ], + "Paula's House Rooms": [ + 42, + 51, + 63, + 89, + 109, + 112, + 115, + 116, + 120 + ], + "Onett Police Station": [ + 14, + 41, + 42, + 50, + 62, + 63, + 66, + 71, + 75, + 78, + 82, + 90, + 102, + 104, + 105, + 106, + 107, + 109, + 112, + 116, + 119, + 120 + ], + "Scaraba": [ + 27, + 42, + 47, + 56, + 63, + 66, + 70, + 71, + 75, + 78, + 91, + 108, + 109, + 112, + 115, + 116, + 118, + 120, + 133 + ], + "Dalaam House": [ + 42, + 63, + 91, + 92, + 107, + 109, + 112, + 115, + 116, + 120 + ], + "Scaraba House": [ + 36, + 42, + 47, + 51, + 63, + 93, + 108, + 112, + 116, + 120 + ], + "Happy-Happy HQ": [ + 14, + 21, + 42, + 71, + 74, + 75, + 78, + 85, + 90, + 94, + 107, + 108, + 109, + 110, + 112, + 114, + 115, + 116, + 118, + 119, + 120 + ], + "Fourside Cafe": [ + 42, + 74, + 75, + 78, + 90, + 93, + 95, + 96, + 107, + 109, + 111, + 112, + 113, + 114, + 115, + 116, + 118, + 119, + 120 + ], + "Moonside Cafe": [ + 14, + 42, + 71, + 75, + 78, + 90, + 93, + 95, + 96, + 107, + 108, + 109, + 111, + 112, + 113, + 114, + 115, + 116, + 118, + 119, + 120 + ], + "Scaraba Hospital": [ + 42, + 44, + 57, + 79, + 97, + 109, + 112, + 116 + ], + "Scaraba Shop": [ + 42, + 50, + 53, + 57, + 62, + 71, + 72, + 73, + 76, + 90, + 98, + 104, + 109, + 120 + ], + "Twoson Dept. Store": [ + 13, + 21, + 27, + 42, + 62, + 63, + 99, + 100, + 103, + 104, + 106, + 107, + 109, + 112, + 116, + 121, + 123, + 130, + 132, + 160 + ], + "Fourside Dept. Store": [ + 13, + 21, + 62, + 100, + 107, + 109, + 121, + 123, + 160 + ], + "Bakery": [ + 42, + 99, + 100, + 101, + 103, + 107, + 109, + 112, + 116, + 120, + 160 + ], + "Mach Pizza": [ + 13, + 19, + 42, + 50, + 102, + 109, + 116 + ], + "Burger Shop": [ + 42, + 62, + 103, + 104, + 105, + 106, + 107, + 109, + 112, + 119, + 120 + ], + "Onett Drugstore": [ + 13, + 99, + 100, + 101, + 104, + 105, + 106, + 109, + 116, + 160 + ], + "Threed Drugstore": [ + 13, + 101, + 103, + 104, + 105, + 106, + 109, + 116, + 160 + ], + "Winters Drugstore": [ + 13, + 62, + 99, + 100, + 101, + 104, + 105, + 106, + 109, + 122, + 160 + ], + "Chaos Theater": [ + 14, + 42, + 71, + 75, + 78, + 90, + 93, + 96, + 107, + 109, + 112, + 115, + 116, + 118, + 119, + 120, + 130 + ], + "Fourside Museum": [ + 42, + 108, + 109, + 116 + ], + "Summers Hotel": [ + 14, + 42, + 107, + 109, + 112, + 115, + 116, + 118, + 120 + ], + "Summers Shop": [ + 14, + 42, + 107, + 109, + 110, + 112, + 114, + 115, + 116, + 118, + 120 + ], + "Snow Wood Boarding School": [ + 14, + 42, + 57, + 71, + 90, + 107, + 109, + 112, + 116, + 120 + ], + "Summers Harbor House": [ + 42, + 107, + 109, + 112, + 114, + 115, + 116, + 120 + ], + "Summers Restaurant": [ + 14, + 42, + 74, + 75, + 78, + 90, + 93, + 107, + 109, + 112, + 113, + 115, + 116, + 118, + 119, + 120 + ], + "Moonside Museum": [ + 42, + 109, + 112, + 116, + 119, + 120 + ], + "Stoic Club": [ + 14, + 41, + 42, + 57, + 70, + 71, + 75, + 78, + 90, + 93, + 95, + 96, + 107, + 109, + 111, + 112, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 130 + ], + "Andonuts Lab": [ + 14, + 41, + 42, + 57, + 75, + 78, + 90, + 93, + 107, + 109, + 112, + 116, + 118, + 119, + 120 + ], + "Topolla Theater": [ + 42, + 75, + 78, + 90, + 93, + 107, + 109, + 112, + 115, + 116, + 119, + 120 + ], + "Summers Museum": [ + 42, + 78, + 90, + 107, + 109, + 112, + 115, + 120 + ], + "Onett Arcade": [ + 14, + 42, + 109, + 112, + 116, + 121 + ], + "Twoson Bus Station": [ + 42, + 50, + 51, + 62, + 67, + 71, + 86, + 104, + 118, + 122, + 123 + ], + "Twoson Bike Shop": [ + 13, + 27, + 62, + 91, + 100, + 101, + 103, + 104, + 105, + 106, + 109, + 116, + 123 + ], + "Hint Shop": [ + 14, + 42, + 47, + 51, + 63, + 79, + 80, + 91, + 93, + 94, + 107, + 108, + 109, + 110, + 112, + 114, + 115, + 116, + 118, + 120, + 122, + 124, + 133, + 159 + ], + "Fourside Dept. Store Rooms": [ + 62, + 90, + 95, + 96, + 102, + 103, + 104, + 105, + 106, + 116, + 161 + ], + "Threed Tent": [ + 26, + 42, + 107, + 109, + 115, + 120, + 126 + ], + "Onett Treehouse": [ + 6, + 9, + 36, + 41, + 42, + 62, + 63, + 66, + 67, + 79, + 86, + 93, + 99, + 103, + 104, + 107, + 112, + 116, + 119, + 120, + 127, + 132, + 133 + ], + "Lier's House": [ + 38, + 39, + 41, + 42, + 43, + 50, + 51, + 53, + 54, + 57, + 58, + 62, + 63, + 68, + 70, + 71, + 82, + 88, + 90, + 102, + 107, + 109, + 112, + 115, + 116, + 120, + 128, + 130, + 132 + ], + "Run-down House": [ + 14, + 42, + 62, + 109, + 116, + 129 + ], + "Paula's Cabin": [ + 42, + 50, + 62, + 82, + 93, + 109, + 112, + 119, + 120 + ], + "Dusty Dunes Drugstore": [ + 39, + 41, + 42, + 43, + 44, + 50, + 62, + 102, + 107, + 109, + 112, + 131, + 132 + ], + "Dusty Dunes Miner Shack": [ + 38, + 39, + 41, + 42, + 43, + 44, + 50, + 53, + 57, + 58, + 62, + 68, + 70, + 71, + 74, + 75, + 76, + 82, + 90, + 102, + 107, + 109, + 112, + 116, + 120, + 132 + ], + "Traveler's Shack": [ + 42, + 63, + 109, + 112, + 115, + 133 + ], + "Lumine Hall": [ + 134, + 136, + 140 + ], + "Connector Caves": [ + 0, + 33, + 34, + 110, + 134, + 135, + 136, + 137, + 140, + 141, + 145, + 149, + 150, + 153, + 154, + 156, + 158 + ], + "Lumine Hall Sanctuary": [ + 110, + 134, + 136, + 137, + 140, + 150, + 153 + ], + "Fire Spring": [ + 134, + 136, + 137, + 140, + 150, + 153 + ], + "Sea of Eden": [ + 42, + 70, + 91, + 107, + 109, + 112, + 115, + 138 + ], + "Monkey Caves Treasure Rooms": [ + 139 + ], + "Dungeon Man": [ + 19, + 42, + 107, + 109, + 110, + 114, + 115, + 116, + 134, + 136, + 140, + 159 + ], + "Threed Underground": [ + 1, + 21, + 71, + 75, + 78, + 79, + 80, + 85, + 95, + 97, + 107, + 108, + 109, + 110, + 112, + 114, + 115, + 119, + 120, + 141, + 154 + ], + "Lier's Cave": [ + 42, + 107, + 109, + 112, + 114, + 115, + 116, + 142, + 146, + 151, + 157, + 159 + ], + "Stonehenge Balcony Room": [ + 5, + 19, + 21, + 42, + 51, + 54, + 57, + 62, + 63, + 80, + 102, + 107, + 109, + 112, + 115, + 120, + 143, + 144, + 146, + 147, + 148, + 157 + ], + "Stonehenge Balcony Off": [ + 5, + 19, + 21, + 42, + 51, + 54, + 57, + 62, + 63, + 80, + 102, + 107, + 109, + 112, + 115, + 120, + 143, + 144, + 146, + 147, + 148, + 157 + ], + "Brickroad Maze": [ + 0, + 1, + 4, + 5, + 6, + 7, + 8, + 10, + 14, + 16, + 19, + 20, + 22, + 23, + 24, + 25, + 26, + 27, + 33, + 41, + 42, + 43, + 45, + 47, + 53, + 57, + 59, + 61, + 62, + 67, + 68, + 69, + 70, + 71, + 75, + 79, + 85, + 91, + 92, + 93, + 96, + 97, + 99, + 100, + 101, + 106, + 108, + 111, + 112, + 113, + 114, + 115, + 116, + 118, + 119, + 126, + 128, + 130, + 133, + 134, + 135, + 136, + 137, + 140, + 141, + 142, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 156, + 157, + 158, + 159 + ], + "Rainy Circle": [ + 42, + 107, + 109, + 112, + 114, + 115, + 146 + ], + "Belch's Factory": [ + 5, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 38, + 42, + 51, + 52, + 54, + 63, + 80, + 88, + 89, + 102, + 107, + 109, + 112, + 115, + 118, + 120, + 143, + 144, + 146, + 147, + 157, + 160 + ], + "Milky Well Caves": [ + 14, + 38, + 41, + 42, + 57, + 71, + 75, + 78, + 93, + 107, + 109, + 112, + 115, + 119, + 120, + 146, + 148 + ], + "Lilliput Steps": [ + 9, + 26, + 41, + 42, + 57, + 71, + 75, + 78, + 79, + 80, + 85, + 86, + 93, + 97, + 107, + 108, + 109, + 112, + 115, + 116, + 118, + 119, + 120, + 140, + 146, + 148, + 149, + 157, + 158 + ], + "Monkey Caves Hallway": [ + 42, + 62, + 79, + 107, + 109, + 110, + 112, + 115, + 116, + 120, + 133, + 134, + 136, + 137, + 140, + 142, + 146, + 150, + 151, + 153, + 157 + ], + "Giant Step": [ + 14, + 22, + 25, + 42, + 53, + 62, + 79, + 80, + 107, + 109, + 110, + 112, + 115, + 116, + 124, + 129, + 134, + 136, + 137, + 140, + 142, + 146, + 150, + 151, + 153, + 157, + 159 + ], + "Pink Cloud": [ + 0, + 16, + 19, + 20, + 26, + 27, + 38, + 41, + 42, + 43, + 47, + 59, + 62, + 63, + 67, + 69, + 70, + 71, + 75, + 78, + 79, + 80, + 82, + 85, + 90, + 91, + 93, + 95, + 104, + 105, + 106, + 107, + 108, + 109, + 112, + 113, + 114, + 115, + 118, + 119, + 120, + 124, + 127, + 130, + 133, + 134, + 135, + 136, + 137, + 140, + 141, + 142, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 157, + 158, + 159 + ], + "Saturn Caves": [ + 22, + 42, + 53, + 62, + 79, + 80, + 94, + 107, + 109, + 110, + 112, + 114, + 115, + 116, + 118, + 120, + 133, + 134, + 136, + 137, + 140, + 142, + 146, + 150, + 151, + 153, + 157 + ], + "Stonehenge Tunnels": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 13, + 19, + 21, + 26, + 51, + 58, + 62, + 63, + 66, + 67, + 70, + 75, + 79, + 82, + 83, + 84, + 85, + 88, + 89, + 94, + 107, + 111, + 112, + 113, + 115, + 123, + 124, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 141, + 154, + 159 + ], + "Gold Mine": [ + 42, + 107, + 109, + 112, + 115, + 118, + 119, + 120, + 146, + 157 + ], + "Sewer": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 16, + 18, + 19, + 20, + 21, + 22, + 25, + 26, + 27, + 33, + 34, + 38, + 41, + 42, + 43, + 53, + 57, + 58, + 62, + 63, + 67, + 68, + 70, + 71, + 75, + 81, + 84, + 85, + 86, + 89, + 90, + 91, + 92, + 93, + 96, + 97, + 101, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 112, + 113, + 115, + 116, + 118, + 119, + 120, + 122, + 123, + 126, + 127, + 128, + 130, + 140, + 146, + 147, + 148, + 149, + 157, + 158, + 160, + 164 + ], + "Tenda Village": [ + 21, + 42, + 71, + 75, + 78, + 80, + 93, + 107, + 108, + 109, + 112, + 114, + 115, + 116, + 118, + 120, + 133, + 159 + ], + "Fourside Dept. Store Blackout": [ + 13, + 21, + 62, + 100, + 107, + 109, + 121, + 123, + 160 + ], + "Fourside Dept. Store Blackout Rooms": [ + 42, + 50, + 62, + 104, + 112, + 116, + 161 + ], + "Magicant Manly Fish": [ + 15, + 42, + 63, + 79, + 89, + 97, + 112, + 115, + 116, + 118, + 162, + 163, + 164, + 165, + 166, + 167 + ], + "Magicant Ness": [ + 15, + 42, + 63, + 79, + 89, + 97, + 112, + 115, + 116, + 118, + 162, + 163, + 164, + 165, + 166, + 167 + ], + "Magicant Rabbit": [ + 15, + 42, + 63, + 79, + 89, + 97, + 112, + 115, + 116, + 118, + 162, + 163, + 164, + 165, + 166, + 167 + ], + "Magicant Belch": [ + 15, + 42, + 63, + 79, + 89, + 97, + 112, + 115, + 116, + 118, + 162, + 163, + 164, + 165, + 166, + 167 + ], + "Magicant Mom": [ + 15, + 42, + 63, + 79, + 89, + 97, + 112, + 115, + 116, + 118, + 162, + 163, + 164, + 165, + 166, + 167 + ] +} + +ugly_palettes = { + "Pyramid": [ + 1, + 3, + 5, + 7, + 8, + 9, + 13, + 14, + 15, + 19, + 21, + 22, + 35, + 49, + 56, + 58, + 59, + 60, + 61, + 63, + 71, + 74, + 83, + 86, + 89, + 91, + 97, + 102, + 104, + 105, + 108, + 115, + 116, + 117, + 120, + 123, + 126, + 127, + 134, + 166 + ], + "Lost Underworld": [ + 0, + 8, + 14, + 15, + 21, + 33, + 34, + 38, + 41, + 42, + 50, + 53, + 58, + 59, + 63, + 65, + 69, + 82, + 83, + 87, + 90, + 95, + 97, + 104, + 105, + 118, + 120, + 123, + 126, + 127, + 128, + 129, + 131, + 136, + 140, + 159, + 160 + ], + "Cave of the Past": [ + 4, + 5, + 13, + 16, + 18, + 19, + 22, + 33, + 38, + 39, + 44, + 47, + 51, + 57, + 63, + 67, + 68, + 70, + 75, + 78, + 82, + 87, + 91, + 97, + 111, + 114, + 121, + 128, + 131, + 134, + 136, + 141, + 150, + 153, + 156, + 161 + ], + "Giygas's Lair": [ + 5, + 6, + 10, + 11, + 12, + 26, + 31, + 34, + 58, + 62, + 63, + 79, + 82, + 95, + 99, + 107, + 117, + 124, + 129, + 131, + 154 + ], + "Onett": [ + 0, + 1, + 2, + 6, + 8, + 26, + 27, + 38, + 41, + 43, + 51, + 53, + 59, + 61, + 62, + 63, + 70, + 82, + 83, + 91, + 92, + 93, + 99, + 104, + 108, + 112, + 120, + 126, + 130, + 132, + 133 + ], + "Twoson": [ + 6, + 8, + 10, + 19, + 21, + 38, + 47, + 51, + 57, + 82, + 91, + 96, + 104 + ], + "Happy-Happy Village": [ + 10, + 19, + 53, + 61, + 63, + 89, + 107, + 109, + 112, + 116, + 124, + 130, + 133 + ], + "Happy-Happy Clear": [ + 10, + 19, + 53, + 61, + 63, + 89, + 107, + 109, + 112, + 116, + 124, + 130, + 133 + ], + "Tunnel Outdoors": [ + 0, + 2, + 27, + 33, + 34, + 38, + 39, + 41, + 43, + 47, + 51, + 57, + 58, + 61, + 67, + 70, + 71, + 91, + 93, + 99, + 100, + 101, + 108, + 112, + 113, + 121, + 126, + 127, + 129, + 134, + 136, + 140, + 156, + 160, + 164 + ], + "Threed": [ + 8, + 10, + 19, + 21, + 22, + 26, + 47, + 59, + 63, + 104, + 105, + 107, + 109, + 112, + 133 + ], + "Threed Daytime": [ + 8, + 10, + 19, + 21, + 22, + 26, + 47, + 59, + 63, + 104, + 105, + 107, + 109, + 112, + 133 + ], + "Fourside": [ + 7, + 8, + 21, + 22, + 53, + 54, + 57, + 59, + 62, + 104, + 105, + 106, + 107, + 131, + 132, + 133, + 162 + ], + "Moonside": [ + 8, + 10, + 39, + 41, + 54, + 59, + 61, + 64, + 67, + 81, + 107, + 132, + 163, + 164 + ], + "Magicant": [ + 4, + 5, + 9, + 19, + 21, + 22, + 25, + 26, + 32, + 36, + 38, + 39, + 41, + 44, + 46, + 47, + 48, + 49, + 51, + 54, + 55, + 56, + 57, + 59, + 65, + 66, + 72, + 75, + 76, + 80, + 81, + 86, + 92, + 98, + 101, + 104, + 108, + 109, + 120, + 130, + 133 + ], + "Tunnels": [ + 2, + 4, + 5, + 7, + 13, + 27, + 34, + 35, + 42, + 52, + 53, + 54, + 58, + 66, + 69, + 74, + 79, + 80, + 87, + 91, + 93, + 107, + 113, + 114, + 115, + 118, + 121, + 127, + 133, + 162, + 164 + ], + "Magicant Interiors": [ + 29, + 36, + 37, + 43, + 50, + 59, + 63, + 64, + 67, + 74, + 78, + 83, + 97, + 98, + 126 + ], + "Tents": [ + 4, + 5, + 6, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 19, + 22, + 26, + 32, + 38, + 39, + 41, + 43, + 44, + 45, + 47, + 52, + 53, + 54, + 57, + 58, + 59, + 61, + 62, + 66, + 68, + 70, + 75, + 78, + 81, + 88, + 100, + 101, + 102, + 103, + 108, + 112, + 113, + 119, + 120, + 126, + 128, + 133, + 162 + ], + "Peaceful Rest Valley": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 25, + 38, + 39, + 47, + 59, + 61, + 79, + 91, + 101, + 105, + 107, + 109, + 112 + ], + "Grapefruit Falls": [ + 2, + 6, + 10, + 15, + 26, + 27, + 47, + 57, + 59, + 61, + 79, + 90, + 91, + 94, + 99, + 107, + 108, + 146 + ], + "Saturn Valley": [ + 8, + 10, + 19, + 61, + 62, + 89, + 105, + 107, + 109, + 112, + 164 + ], + "Deep Darkness": [ + 4, + 5, + 8, + 9, + 11, + 12, + 13, + 14, + 19, + 26, + 27, + 41, + 44, + 61, + 63, + 70, + 71, + 82, + 106, + 107, + 109, + 115, + 129 + ], + "Lilliput Steps Sanctuary": [ + 10, + 51, + 57, + 58, + 71, + 92, + 94, + 107, + 109 + ], + "Milky Well": [ + 10, + 11, + 19, + 51, + 58, + 61, + 71, + 82, + 107, + 146 + ], + "Deep Darkness Darkness": [ + 25 + ], + "Summers": [ + 4, + 5, + 19, + 21, + 38, + 41, + 43, + 50, + 51, + 58, + 61, + 63, + 70, + 71, + 80, + 89, + 104 + ], + "Dusty Dunes Desert": [ + 5, + 14, + 15, + 19, + 21, + 22, + 26, + 41, + 43, + 44, + 50, + 65, + 67, + 70, + 82, + 83, + 91, + 99, + 100, + 105, + 106, + 108, + 118, + 164, + 165, + 167 + ], + "The Sky": [ + 30, + 63, + 64, + 136, + 164 + ], + "Dalaam": [ + 4, + 5, + 9, + 13, + 36, + 47, + 48, + 50, + 56, + 64, + 65, + 66, + 68, + 70, + 73, + 78, + 81, + 82, + 89, + 105, + 112, + 126, + 160 + ], + "Dalaam Palace": [ + 0, + 1, + 2, + 19, + 21, + 22, + 25, + 36, + 42, + 59, + 62, + 63, + 67, + 68, + 69, + 70, + 75, + 82, + 85, + 86, + 90, + 92, + 93, + 94, + 95, + 116, + 126, + 131, + 140, + 141, + 160 + ], + "Cave of the Present": [ + 14, + 22, + 25, + 39, + 73, + 97, + 100, + 105, + 106, + 110, + 132 + ], + "Pink Cloud Sanctuary": [ + 4, + 5, + 7, + 8, + 10, + 12, + 13, + 50, + 56, + 57, + 64, + 68, + 72, + 80, + 81, + 82, + 83, + 91, + 102, + 104, + 105, + 106, + 111, + 112, + 115, + 118, + 121, + 126, + 129 + ], + "The Sea": [ + 6, + 41, + 44, + 63, + 70, + 75, + 78, + 79, + 86, + 90, + 115, + 120 + ], + "Monotoli Offices": [ + 9, + 11, + 13, + 14, + 19, + 21, + 27, + 36, + 37, + 40, + 43, + 44, + 47, + 48, + 52, + 54, + 55, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 72, + 73, + 74, + 75, + 77, + 78, + 81, + 83, + 91, + 105, + 106, + 115, + 118, + 130, + 131, + 132 + ], + "Onett Hotel": [ + 13, + 27, + 37, + 38, + 39, + 40, + 41, + 43, + 46, + 47, + 49, + 50, + 52, + 53, + 54, + 56, + 64, + 66, + 67, + 68, + 72, + 73, + 75, + 76, + 81, + 83, + 84, + 88, + 89, + 100, + 101 + ], + "Threed Red-Wall House": [ + 47, + 54, + 67, + 68, + 69, + 83, + 102, + 105, + 106, + 107 + ], + "Electra's Room": [ + 21, + 27, + 35, + 36, + 37, + 51, + 52, + 67, + 83, + 88, + 91, + 102, + 103, + 104, + 107, + 130 + ], + "Threed Green-Wall House": [ + 14, + 40, + 47, + 51, + 67, + 88, + 107, + 115 + ], + "Threed Blue-Wall House": [ + 13, + 21, + 27, + 68, + 82, + 83, + 93, + 99, + 100, + 104, + 105, + 119, + 130 + ], + "Pokey's House": [ + 27, + 40, + 43, + 47, + 52, + 53, + 54, + 56, + 58, + 62, + 63, + 69, + 81, + 83, + 88, + 99, + 102, + 104, + 106, + 107, + 118, + 119, + 121, + 130 + ], + "Moonside Hospital": [ + 7, + 9, + 10, + 12, + 13, + 22, + 26, + 27, + 37, + 72, + 83, + 89, + 93, + 102, + 103, + 104, + 105, + 106, + 107, + 115, + 118, + 119 + ], + "Onett Green-Wall House": [ + 13, + 14, + 27, + 47, + 54, + 67, + 68, + 69, + 74, + 81, + 82, + 91, + 99, + 104, + 106, + 107, + 119, + 126, + 130 + ], + "Onett Blue-Wall House": [ + 27, + 37, + 39, + 40, + 47, + 50, + 52, + 54, + 56, + 58, + 67, + 68, + 74, + 82, + 89, + 90, + 91, + 115 + ], + "Onett Seafoam-Wall House": [ + 14, + 27, + 37, + 38, + 39, + 40, + 41, + 43, + 44, + 47, + 49, + 52, + 53, + 57, + 58, + 67, + 70, + 71, + 74, + 75, + 78, + 79, + 81, + 83, + 88, + 90, + 91 + ], + "Onett Peach-Wall House": [ + 14, + 27, + 38, + 39, + 40, + 41, + 43, + 44, + 47, + 48, + 49, + 51, + 52, + 53, + 54, + 57, + 58, + 63, + 64, + 68, + 70, + 72, + 73, + 74, + 81, + 83, + 87, + 88, + 89, + 91, + 102, + 104, + 107 + ], + "Onett Light Blue-Wall House": [ + 14, + 27, + 37, + 45, + 69, + 88, + 91, + 115 + ], + "Onett Pink-Wall House": [ + 14, + 27, + 36, + 37, + 67, + 74, + 80, + 82, + 83, + 89, + 91, + 104, + 105, + 106, + 107 + ], + "Onett White-Wall House": [ + 14, + 21, + 36, + 37, + 40, + 45, + 46, + 52, + 55, + 68, + 69, + 70, + 85, + 88, + 89, + 90, + 91, + 101, + 102, + 104, + 107 + ], + "Hospitals": [ + 9, + 10, + 11, + 12, + 13, + 14, + 19, + 22, + 38, + 39, + 43, + 50, + 54, + 70, + 91, + 102, + 103, + 104, + 105, + 106 + ], + "Apple Kid's House": [ + 4, + 7, + 8, + 10, + 11, + 12, + 13, + 14, + 27, + 36, + 37, + 74, + 93, + 99, + 100, + 103, + 104, + 106, + 107, + 112, + 115, + 128 + ], + "Tracy's Room": [ + 14, + 27, + 39, + 40, + 47, + 48, + 67, + 69, + 74, + 80, + 81, + 82, + 83, + 88, + 91, + 99, + 100, + 102, + 103, + 104, + 105 + ], + "Orange Kid's House": [ + 14, + 27, + 37, + 38, + 39, + 40, + 41, + 43, + 44, + 48, + 52, + 53, + 56, + 57, + 58, + 66, + 69, + 71, + 75, + 78, + 81, + 83, + 88, + 91, + 102, + 105, + 106, + 115 + ], + "Everdred's House": [ + 14, + 26, + 27, + 37, + 40, + 47, + 72, + 73, + 88, + 89, + 91, + 93, + 102, + 104, + 107, + 115, + 121 + ], + "Twoson Green-Wall House": [ + 13, + 14, + 27, + 52, + 67, + 69, + 74, + 81, + 88, + 104, + 105, + 106 + ], + "Ness's Room": [ + 14, + 27, + 36, + 40, + 47, + 54, + 55, + 67, + 70, + 72, + 73, + 74, + 82, + 88, + 90, + 102, + 107, + 115, + 119 + ], + "Police Station Backroom": [ + 2, + 4, + 5, + 7, + 8, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 35, + 37, + 40, + 47, + 52, + 54, + 77, + 89, + 91, + 99, + 100, + 101, + 105, + 106, + 115, + 121, + 130 + ], + "Winters": [ + 8, + 11, + 15, + 19, + 20, + 26, + 27, + 32, + 37, + 38, + 39, + 41, + 47, + 50, + 51, + 52, + 53, + 54, + 57, + 58, + 65, + 67, + 69, + 71, + 75, + 78, + 80, + 81, + 87, + 88, + 91, + 93, + 104, + 107, + 108, + 112, + 115, + 119, + 121, + 129, + 131, + 146, + 160, + 161, + 163, + 164, + 166 + ], + "Rainy Circle Sanctuary": [ + 4, + 18, + 32, + 35, + 36, + 37, + 38, + 39, + 41, + 44, + 46, + 47, + 52, + 53, + 56, + 57, + 58, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 73, + 74, + 75, + 76, + 77, + 78, + 80, + 81, + 82, + 83, + 85, + 87, + 91, + 98, + 104, + 111, + 121 + ], + "Hospital Rooms": [ + 14, + 27, + 37, + 40, + 51, + 52, + 68, + 69, + 80, + 82, + 83, + 91, + 102, + 103, + 104, + 105, + 106, + 115, + 119 + ], + "Twoson Peach-Wall House": [ + 14, + 27, + 36, + 37, + 40, + 47, + 52, + 54, + 55, + 67, + 68, + 70, + 73, + 74, + 82, + 83, + 88, + 89, + 91, + 98, + 102 + ], + "Twoson Pink-Wall House": [ + 14, + 36, + 40, + 47, + 52, + 54, + 67, + 69, + 74, + 81, + 88, + 89, + 91, + 107, + 118 + ], + "Twoson Gray-Wall House": [ + 14, + 27, + 37, + 40, + 52, + 54, + 67, + 69, + 74, + 82, + 88, + 90, + 104, + 106, + 118, + 120 + ], + "Gold Office": [ + 14, + 27, + 38, + 39, + 40, + 41, + 43, + 44, + 52, + 53, + 54, + 56, + 58, + 66, + 68, + 69, + 70, + 74, + 89, + 107 + ], + "Happy-Happy Guardhouse": [ + 36, + 37, + 40, + 48, + 52, + 55, + 67, + 74, + 80, + 88, + 89, + 91, + 102, + 105, + 106, + 107 + ], + "Happy-Happy Hospital": [ + 14, + 27, + 37, + 52, + 56, + 66, + 68, + 82, + 88, + 93, + 99, + 100, + 103, + 104, + 106, + 130 + ], + "Happy-Happy Hospital Clear": [ + 14, + 27, + 37, + 52, + 56, + 66, + 68, + 82, + 88, + 93, + 99, + 100, + 103, + 104, + 106, + 130 + ], + "Onett Town Hall": [ + 13, + 27, + 38, + 40, + 47, + 52, + 56, + 69, + 74, + 80, + 81, + 82, + 89, + 91, + 103 + ], + "Onett Hotel Bedrooms": [ + 14, + 27, + 36, + 37, + 40, + 48, + 52, + 67, + 69, + 74, + 83, + 89, + 90, + 91, + 104, + 105 + ], + "Fourside Hotel Bedrooms": [ + 9, + 14, + 36, + 37, + 40, + 52, + 67, + 104, + 105, + 106, + 107, + 115, + 128, + 132 + ], + "Happy-Happy Saturn House": [ + 38, + 39, + 40, + 41, + 43, + 44, + 47, + 50, + 51, + 53, + 54, + 57, + 63, + 66, + 67, + 70, + 71, + 78, + 81, + 82, + 88, + 91, + 102, + 103, + 107, + 115 + ], + "Happy-Happy Hotel": [ + 14, + 40, + 47, + 52, + 54, + 67, + 70, + 89, + 91, + 104, + 105, + 106, + 115, + 120 + ], + "Twoson Hotel Bedrooms": [ + 27, + 36, + 37, + 40, + 47, + 48, + 52, + 54, + 67, + 72, + 73, + 81, + 83, + 88, + 89, + 90, + 91, + 115 + ], + "Threed Hotel Bedrooms": [ + 14, + 40, + 47, + 52, + 67, + 74, + 104, + 106, + 115, + 116 + ], + "Happy-Happy Hotel Clear": [ + 14, + 40, + 47, + 52, + 54, + 67, + 70, + 89, + 91, + 104, + 105, + 106, + 115, + 120 + ], + "Monotoli Building": [ + 14, + 21, + 27, + 37, + 40, + 41, + 43, + 44, + 45, + 50, + 53, + 54, + 56, + 58, + 66, + 67, + 70, + 71, + 75, + 78, + 82, + 83, + 85, + 86, + 89, + 90, + 104, + 105, + 106, + 107, + 115 + ], + "Paula's House": [ + 27, + 38, + 39, + 40, + 41, + 43, + 44, + 47, + 50, + 53, + 56, + 57, + 62, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 78, + 81, + 83, + 88, + 89, + 90, + 91, + 93, + 98, + 102, + 103, + 104, + 107, + 115 + ], + "Paula's Room": [ + 14, + 27, + 37, + 68, + 80, + 82, + 88, + 91, + 102, + 107 + ], + "Ness's House": [ + 14, + 26, + 27, + 37, + 40, + 52, + 54, + 69, + 70, + 83, + 88, + 104, + 105, + 106, + 107, + 115, + 120 + ], + "Twoson Hotel": [ + 14, + 40, + 43, + 47, + 52, + 54, + 56, + 66, + 68, + 78, + 82, + 88, + 104, + 107 + ], + "Threed Hotel": [ + 6, + 13, + 14, + 27, + 38, + 40, + 69, + 85, + 86, + 100, + 101, + 104, + 105, + 106, + 118, + 160 + ], + "Fourside Hotel": [ + 14, + 35, + 37, + 40, + 54, + 69, + 89, + 93, + 105, + 106, + 107 + ], + "Monotoli Elevators": [ + 4, + 5, + 8, + 14, + 21, + 26, + 27, + 35, + 38, + 39, + 40, + 43, + 49, + 50, + 52, + 59, + 61, + 64, + 65, + 66, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 80, + 81, + 87, + 91, + 97, + 100, + 115, + 117, + 118, + 122, + 131, + 163, + 164, + 165 + ], + "Fourside Dept. Store Office": [ + 14, + 38, + 39, + 40, + 41, + 43, + 44, + 47, + 51, + 53, + 54, + 63, + 68, + 70, + 71, + 75, + 78, + 81, + 82, + 90, + 91, + 118 + ], + "Onett Library": [ + 12, + 13, + 14, + 27, + 38, + 40, + 52, + 53, + 54, + 56, + 66, + 67, + 74, + 81, + 104, + 105, + 106 + ], + "Paula's House Rooms": [ + 14, + 38, + 39, + 40, + 41, + 43, + 44, + 47, + 50, + 52, + 54, + 57, + 58, + 62, + 67, + 68, + 70, + 71, + 74, + 75, + 78, + 81, + 83, + 102, + 104, + 105, + 106 + ], + "Onett Police Station": [ + 37, + 38, + 39, + 40, + 43, + 44, + 47, + 51, + 53, + 54, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 74, + 80, + 81, + 83, + 88, + 89, + 91, + 93, + 99, + 100, + 103, + 114, + 115, + 117, + 121 + ], + "Scaraba": [ + 5, + 7, + 9, + 10, + 14, + 19, + 21, + 22, + 26, + 41, + 44, + 51, + 52, + 53, + 54, + 57, + 58, + 62, + 67, + 68, + 74, + 93, + 104, + 121, + 130 + ], + "Dalaam House": [ + 14, + 27, + 38, + 40, + 41, + 43, + 44, + 47, + 50, + 51, + 54, + 57, + 58, + 62, + 66, + 67, + 71, + 74, + 75, + 78, + 81, + 88, + 89, + 93, + 102, + 104, + 105, + 106 + ], + "Scaraba House": [ + 41, + 44, + 50, + 56, + 62, + 66, + 67, + 71, + 75, + 76, + 78, + 81, + 91, + 98, + 115 + ], + "Happy-Happy HQ": [ + 6, + 8, + 9, + 11, + 13, + 22, + 27, + 38, + 41, + 43, + 44, + 57, + 62, + 63, + 68, + 70, + 79, + 80, + 86, + 88, + 91, + 93, + 97, + 104, + 105, + 106, + 117, + 130, + 133 + ], + "Fourside Cafe": [ + 14, + 21, + 41, + 43, + 44, + 47, + 51, + 54, + 57, + 62, + 63, + 71, + 82, + 108 + ], + "Moonside Cafe": [ + 38, + 41, + 57, + 62, + 63, + 67, + 70, + 91 + ], + "Scaraba Hospital": [ + 26, + 38, + 41, + 47, + 54, + 56, + 58, + 62, + 63, + 66, + 67, + 71, + 75, + 78, + 80, + 82, + 85, + 86, + 90, + 107, + 115, + 120, + 130 + ], + "Scaraba Shop": [ + 26, + 38, + 41, + 44, + 47, + 54, + 56, + 63, + 64, + 74, + 78, + 106, + 107, + 116 + ], + "Twoson Dept. Store": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 14, + 19, + 22, + 26, + 40, + 41, + 47, + 50, + 51, + 58, + 59, + 70, + 75, + 78, + 82, + 83, + 88, + 90, + 91, + 93, + 105, + 115, + 120, + 163 + ], + "Fourside Dept. Store": [ + 9, + 19, + 27, + 42, + 47, + 50, + 51, + 58, + 59, + 63, + 70, + 71, + 75, + 78, + 88, + 90, + 91, + 99, + 102, + 103, + 104, + 105, + 106, + 112, + 115, + 120 + ], + "Bakery": [ + 9, + 14, + 41, + 58, + 62, + 63, + 67, + 75, + 78, + 79, + 80, + 82, + 83, + 85, + 86, + 88, + 89, + 90, + 93, + 102, + 104, + 105, + 106, + 108, + 115, + 119, + 121, + 122, + 123 + ], + "Mach Pizza": [ + 14, + 21, + 27, + 40, + 41, + 58, + 62, + 70, + 71, + 75, + 90, + 91, + 100, + 103, + 105, + 106, + 107, + 112, + 120, + 132, + 160 + ], + "Burger Shop": [ + 7, + 13, + 22, + 27, + 41, + 47, + 50, + 51, + 54, + 58, + 63, + 67, + 70, + 71, + 78, + 88, + 90, + 93, + 99, + 100, + 102, + 116, + 118, + 132 + ], + "Onett Drugstore": [ + 14, + 41, + 42, + 62, + 67, + 70, + 75, + 78, + 79, + 82, + 86, + 103, + 112, + 120 + ], + "Threed Drugstore": [ + 9, + 14, + 42, + 62, + 67, + 79, + 82, + 85, + 86, + 88, + 99, + 100, + 107, + 112, + 120, + 123 + ], + "Winters Drugstore": [ + 9, + 14, + 41, + 42, + 50, + 51, + 58, + 79, + 85, + 86, + 88, + 90, + 103, + 107, + 112, + 115, + 116, + 123 + ], + "Chaos Theater": [ + 38, + 41, + 43, + 57, + 88, + 114, + 121, + 133 + ], + "Fourside Museum": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 38, + 41, + 47, + 57, + 62, + 63, + 66, + 70, + 71, + 75, + 78, + 82, + 93, + 99, + 100, + 104, + 105, + 106, + 111, + 112, + 114, + 115, + 117, + 118, + 119, + 120, + 130 + ], + "Summers Hotel": [ + 38, + 41, + 57, + 62, + 63, + 67, + 70, + 71, + 75, + 78, + 91, + 133 + ], + "Summers Shop": [ + 57, + 62, + 63, + 71, + 78, + 79, + 86, + 93, + 94, + 101, + 133 + ], + "Snow Wood Boarding School": [ + 26, + 38, + 41, + 43, + 44, + 62, + 70, + 75, + 78, + 115, + 118, + 119 + ], + "Summers Harbor House": [ + 22, + 41, + 44, + 62, + 63, + 71, + 74, + 75, + 78, + 91, + 118, + 133 + ], + "Summers Restaurant": [ + 22, + 38, + 41, + 57, + 71, + 80, + 96, + 103, + 111, + 130, + 133 + ], + "Moonside Museum": [ + 14, + 38, + 41, + 43, + 44, + 52, + 53, + 54, + 57, + 62, + 63, + 66, + 70, + 71, + 74, + 75, + 78, + 88, + 90, + 93, + 96, + 105, + 106, + 107, + 115 + ], + "Stoic Club": [ + 8, + 9, + 27, + 38, + 44, + 47, + 53, + 62, + 63, + 67, + 69, + 88, + 91, + 104, + 106, + 113 + ], + "Andonuts Lab": [ + 4, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 21, + 26, + 38, + 43, + 47, + 53, + 62, + 63, + 69, + 70, + 71, + 91, + 100, + 103, + 104, + 105, + 106, + 121 + ], + "Topolla Theater": [ + 14, + 22, + 38, + 41, + 44, + 57, + 63, + 70, + 71, + 74, + 91, + 96, + 118 + ], + "Summers Museum": [ + 8, + 9, + 14, + 21, + 38, + 41, + 44, + 57, + 62, + 71, + 75, + 88, + 116 + ], + "Onett Arcade": [ + 9, + 21, + 22, + 27, + 41, + 50, + 51, + 53, + 54, + 62, + 102, + 104, + 106, + 107, + 130 + ], + "Twoson Bus Station": [ + 22, + 63, + 66, + 79, + 90, + 99, + 100, + 103, + 105, + 106, + 109, + 116, + 119 + ], + "Twoson Bike Shop": [ + 9, + 12, + 42, + 47, + 58, + 79, + 99, + 107, + 112, + 115, + 119, + 120, + 121, + 126, + 160 + ], + "Hint Shop": [ + 4, + 5, + 11, + 12, + 26, + 27, + 38, + 40, + 41, + 43, + 44, + 52, + 54, + 57, + 58, + 62, + 66, + 67, + 71, + 74, + 75, + 81, + 84, + 85, + 97, + 99, + 101, + 102, + 103, + 104, + 105, + 106, + 111, + 121, + 123, + 126, + 134 + ], + "Fourside Dept. Store Rooms": [ + 7, + 10, + 27, + 37, + 41, + 47, + 50, + 51, + 54, + 56, + 58, + 63, + 68, + 70, + 71, + 88, + 107, + 108, + 109, + 112, + 117, + 119, + 120 + ], + "Threed Tent": [ + 7, + 9, + 10, + 11, + 12, + 13, + 51, + 59, + 68, + 80, + 93, + 99, + 100, + 104, + 105, + 106, + 112, + 118 + ], + "Onett Treehouse": [ + 19, + 21, + 22, + 35, + 37, + 38, + 43, + 44, + 51, + 54, + 56, + 58, + 64, + 65, + 68, + 70, + 71, + 74, + 78, + 83, + 84, + 85, + 89, + 91, + 92, + 98, + 100, + 102, + 105, + 106, + 108, + 109, + 118, + 123, + 128, + 131 + ], + "Lier's House": [ + 11, + 14, + 27, + 36, + 44, + 47, + 48, + 52, + 64, + 65, + 66, + 67, + 69, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 80, + 81, + 83, + 89, + 103, + 104, + 105, + 106 + ], + "Run-down House": [ + 38, + 43, + 44, + 47, + 50, + 51, + 53, + 54, + 56, + 57, + 58, + 63, + 70, + 71, + 74, + 75, + 78, + 81, + 82, + 90, + 91, + 93, + 108, + 112, + 120, + 130, + 133 + ], + "Paula's Cabin": [ + 21, + 27, + 35, + 38, + 39, + 40, + 41, + 43, + 47, + 51, + 52, + 53, + 54, + 56, + 57, + 58, + 63, + 66, + 71, + 80, + 81, + 88, + 90, + 91, + 98, + 102, + 103, + 104, + 105, + 106, + 107, + 115, + 116 + ], + "Dusty Dunes Drugstore": [ + 14, + 26, + 27, + 37, + 38, + 40, + 47, + 54, + 57, + 58, + 63, + 70, + 75, + 82, + 88, + 90, + 91, + 93, + 103, + 104, + 105, + 106, + 115, + 116, + 119, + 120 + ], + "Dusty Dunes Miner Shack": [ + 9, + 11, + 14, + 27, + 36, + 37, + 40, + 47, + 48, + 51, + 52, + 54, + 56, + 63, + 65, + 66, + 67, + 73, + 77, + 78, + 80, + 81, + 83, + 88, + 89, + 91, + 103, + 106, + 115, + 119, + 128, + 130 + ], + "Traveler's Shack": [ + 5, + 14, + 41, + 43, + 54, + 56, + 62, + 66, + 70, + 71, + 74, + 75, + 78, + 90, + 91, + 107, + 120, + 130 + ], + "Lumine Hall": [ + 25, + 34, + 62, + 79, + 86, + 92, + 94, + 97, + 107, + 110, + 114, + 120, + 121, + 133, + 159 + ], + "Connector Caves": [ + 23, + 26, + 41, + 53, + 62, + 63, + 67, + 69, + 71, + 75, + 82, + 91, + 97, + 99, + 100, + 101, + 105, + 106, + 107, + 109, + 112, + 113, + 119, + 124, + 127, + 129, + 130, + 142, + 146, + 148, + 151, + 152, + 157, + 159 + ], + "Lumine Hall Sanctuary": [ + 0, + 1, + 20, + 25, + 33, + 34, + 42, + 62, + 79, + 91, + 92, + 97, + 109, + 114, + 129, + 133, + 141, + 142, + 146, + 147, + 149, + 156, + 164 + ], + "Fire Spring": [ + 26, + 41, + 59, + 62, + 91, + 107, + 108, + 109, + 110, + 114, + 142, + 146, + 151, + 157, + 159 + ], + "Sea of Eden": [ + 19, + 26, + 27, + 29, + 41, + 56, + 57, + 62, + 69, + 74, + 79, + 93, + 108, + 111, + 118, + 120, + 163, + 164 + ], + "Monkey Caves Treasure Rooms": [ + 0, + 31, + 42, + 56, + 67, + 92, + 94, + 97, + 107, + 111, + 114, + 116, + 127, + 134, + 136, + 140, + 141, + 154, + 160, + 162 + ], + "Dungeon Man": [ + 0, + 1, + 4, + 5, + 12, + 21, + 22, + 33, + 41, + 43, + 47, + 59, + 62, + 67, + 70, + 94, + 112, + 118, + 126, + 137, + 141, + 147, + 150, + 153, + 154, + 157 + ], + "Threed Underground": [ + 0, + 8, + 22, + 25, + 41, + 44, + 62, + 74, + 90, + 93, + 94, + 111, + 117, + 118, + 124, + 127, + 130, + 140, + 159 + ], + "Lier's Cave": [ + 14, + 16, + 19, + 22, + 38, + 41, + 43, + 53, + 56, + 57, + 58, + 59, + 62, + 63, + 67, + 68, + 69, + 70, + 71, + 75, + 78, + 118, + 120, + 121, + 123, + 130, + 133 + ], + "Stonehenge Balcony Room": [ + 4, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 22, + 26, + 38, + 40, + 41, + 43, + 50, + 52, + 53, + 56, + 58, + 66, + 68, + 70, + 71, + 75, + 78, + 81, + 88, + 89, + 91, + 93, + 103, + 105, + 106, + 160 + ], + "Stonehenge Balcony Off": [ + 4, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 22, + 26, + 38, + 40, + 41, + 43, + 50, + 52, + 53, + 56, + 58, + 66, + 68, + 70, + 71, + 75, + 78, + 81, + 88, + 89, + 91, + 93, + 103, + 105, + 106, + 160 + ], + "Brickroad Maze": [ + 2, + 11, + 12, + 13, + 21, + 34, + 35, + 38, + 44, + 49, + 52, + 63, + 66, + 74, + 78, + 87, + 95, + 103, + 105, + 107, + 120, + 121, + 129, + 131, + 164 + ], + "Rainy Circle": [ + 14, + 19, + 21, + 38, + 41, + 53, + 62, + 80, + 91, + 116, + 120, + 130, + 133 + ], + "Belch's Factory": [ + 4, + 7, + 8, + 9, + 10, + 11, + 40, + 41, + 43, + 44, + 53, + 56, + 57, + 58, + 64, + 65, + 66, + 70, + 71, + 72, + 73, + 77, + 78, + 81, + 82, + 91, + 93, + 103, + 104, + 105, + 106, + 108, + 121 + ], + "Milky Well Caves": [ + 44, + 63, + 74, + 80, + 90, + 118, + 130, + 133 + ], + "Lilliput Steps": [ + 6, + 10, + 11, + 14, + 33, + 34, + 38, + 43, + 44, + 53, + 58, + 62, + 63, + 67, + 69, + 70, + 74, + 81, + 87, + 91, + 113, + 118, + 130, + 133, + 160 + ], + "Monkey Caves Hallway": [ + 16, + 20, + 22, + 23, + 24, + 27, + 40, + 41, + 43, + 44, + 47, + 49, + 53, + 54, + 57, + 63, + 66, + 67, + 69, + 70, + 71, + 74, + 75, + 78, + 80, + 86, + 88, + 91, + 94, + 114, + 118, + 124, + 130, + 159 + ], + "Giant Step": [ + 12, + 16, + 19, + 23, + 24, + 44, + 97, + 108, + 114, + 120 + ], + "Pink Cloud": [ + 1, + 2, + 4, + 5, + 7, + 8, + 10, + 11, + 12, + 13, + 21, + 22, + 23, + 33, + 34, + 40, + 44, + 45, + 53, + 56, + 57, + 58, + 68, + 81, + 87, + 94, + 99, + 100, + 101, + 110, + 117, + 122, + 123, + 126, + 129, + 156, + 160, + 164 + ], + "Saturn Caves": [ + 2, + 14, + 16, + 19, + 20, + 24, + 26, + 38, + 41, + 43, + 44, + 45, + 47, + 54, + 57, + 58, + 63, + 66, + 67, + 69, + 70, + 74, + 75, + 81, + 82, + 87, + 91, + 97, + 99, + 100, + 101, + 117, + 147, + 159 + ], + "Stonehenge Tunnels": [ + 0, + 12, + 22, + 33, + 34, + 35, + 37, + 38, + 39, + 40, + 41, + 43, + 44, + 45, + 47, + 50, + 53, + 54, + 56, + 57, + 59, + 69, + 71, + 78, + 81, + 86, + 90, + 91, + 92, + 93, + 95, + 97, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 108, + 109, + 114, + 117, + 118, + 119, + 120, + 121, + 122, + 133, + 136, + 155, + 156 + ], + "Gold Mine": [ + 14, + 38, + 41, + 43, + 44, + 47, + 52, + 53, + 54, + 57, + 62, + 63, + 71, + 74, + 75, + 78, + 80, + 93, + 114, + 129, + 147 + ], + "Sewer": [ + 0, + 1, + 2, + 4, + 5, + 23, + 24, + 35, + 39, + 44, + 47, + 51, + 59, + 61, + 69, + 82, + 99, + 100, + 102, + 121, + 129, + 135, + 156, + 162, + 166 + ], + "Tenda Village": [ + 5, + 8, + 12, + 13, + 14, + 19, + 22, + 38, + 41, + 43, + 44, + 52, + 53, + 54, + 57, + 60, + 62, + 63, + 66, + 67, + 88, + 91, + 106, + 121, + 128, + 129, + 130, + 160, + 164 + ], + "Fourside Dept. Store Blackout": [ + 9, + 19, + 27, + 42, + 47, + 50, + 51, + 58, + 59, + 63, + 70, + 71, + 75, + 78, + 88, + 90, + 91, + 99, + 102, + 103, + 104, + 105, + 106, + 112, + 115, + 120 + ], + "Fourside Dept. Store Blackout Rooms": [ + 41, + 47, + 51, + 54, + 56, + 58, + 63, + 66, + 70, + 71, + 78, + 88, + 90, + 107, + 109, + 120 + ], + "Magicant Manly Fish": [ + 4, + 5, + 9, + 19, + 21, + 22, + 25, + 26, + 32, + 36, + 38, + 39, + 41, + 44, + 46, + 47, + 48, + 49, + 51, + 54, + 55, + 56, + 57, + 59, + 65, + 66, + 72, + 75, + 76, + 80, + 81, + 86, + 92, + 98, + 101, + 104, + 108, + 109, + 120, + 130, + 133 + ], + "Magicant Ness": [ + 4, + 5, + 9, + 19, + 21, + 22, + 25, + 26, + 32, + 36, + 38, + 39, + 41, + 44, + 46, + 47, + 48, + 49, + 51, + 54, + 55, + 56, + 57, + 59, + 65, + 66, + 72, + 75, + 76, + 80, + 81, + 86, + 92, + 98, + 101, + 104, + 108, + 109, + 120, + 130, + 133 + ], + "Magicant Rabbit": [ + 4, + 5, + 9, + 19, + 21, + 22, + 25, + 26, + 32, + 36, + 38, + 39, + 41, + 44, + 46, + 47, + 48, + 49, + 51, + 54, + 55, + 56, + 57, + 59, + 65, + 66, + 72, + 75, + 76, + 80, + 81, + 86, + 92, + 98, + 101, + 104, + 108, + 109, + 120, + 130, + 133 + ], + "Magicant Belch": [ + 4, + 5, + 9, + 19, + 21, + 22, + 25, + 26, + 32, + 36, + 38, + 39, + 41, + 44, + 46, + 47, + 48, + 49, + 51, + 54, + 55, + 56, + 57, + 59, + 65, + 66, + 72, + 75, + 76, + 80, + 81, + 86, + 92, + 98, + 101, + 104, + 108, + 109, + 120, + 130, + 133 + ], + "Magicant Mom": [ + 4, + 5, + 9, + 19, + 21, + 22, + 25, + 26, + 32, + 36, + 38, + 39, + 41, + 44, + 46, + 47, + 48, + 49, + 51, + 54, + 55, + 56, + 57, + 59, + 65, + 66, + 72, + 75, + 76, + 80, + 81, + 86, + 92, + 98, + 101, + 104, + 108, + 109, + 120, + 130, + 133 + ] + +} + +nonsense_palettes = { + "Pyramid": [ + 2, + 4, + 11, + 12, + 20, + 27, + 30, + 32, + 37, + 40, + 45, + 52, + 54, + 65, + 66, + 80, + 81, + 88, + 90, + 94, + 103, + 106, + 121, + 122, + 140, + 141, + 154, + 162, + 164, + 167 + ], + "Lost Underworld": [ + 4, + 5, + 6, + 9, + 11, + 12, + 13, + 26, + 39, + 47, + 51, + 57, + 67, + 68, + 70, + 71, + 75, + 85, + 94, + 100, + 108, + 111, + 112, + 113, + 119, + 163, + 164, + 166 + ], + "Cave of the Past": [ + 0, + 1, + 8, + 11, + 12, + 20, + 23, + 24, + 27, + 41, + 43, + 50, + 53, + 74, + 94, + 126, + 159, + 163 + ], + "Giygas's Lair": [ + 4, + 8, + 14, + 20, + 21, + 27, + 35, + 54, + 59, + 64, + 92, + 94, + 108, + 109, + 114, + 118, + 121, + 136, + 140, + 141, + 156 + ], + "Onett": [ + 34, + 39, + 47, + 57, + 58, + 65, + 67, + 68, + 69, + 74, + 75, + 111, + 114, + 117, + 118, + 121, + 129, + 131, + 160, + 161, + 162, + 164 + ], + "Twoson": [ + 1, + 2, + 26, + 27, + 39, + 58, + 68, + 74, + 88, + 89, + 90, + 93, + 99 + ], + "Happy-Happy Village": [ + 27, + 38, + 39, + 41, + 58, + 88, + 91, + 106, + 121, + 160 + ], + "Happy-Happy Clear": [ + 27, + 38, + 39, + 41, + 58, + 88, + 91, + 106, + 121, + 160 + ], + "Tunnel Outdoors": [ + 44, + 53, + 68, + 74, + 85, + 94, + 114, + 128, + 159 + ], + "Threed": [ + 27, + 38, + 39, + 41, + 43, + 44, + 51, + 61, + 67, + 68, + 82, + 88, + 91, + 99, + 102, + 121, + 126, + 160, + 164 + ], + "Threed Daytime": [ + 27, + 38, + 39, + 41, + 43, + 44, + 51, + 61, + 67, + 68, + 82, + 88, + 91, + 99, + 102, + 121, + 126, + 160, + 164 + ], + "Fourside": [ + 19, + 26, + 27, + 32, + 38, + 39, + 40, + 41, + 47, + 50, + 51, + 52, + 61, + 63, + 67, + 68, + 71, + 74, + 75, + 81, + 91, + 100, + 103, + 112, + 121, + 130, + 160, + 163 + ], + "Moonside": [ + 19, + 26, + 27, + 51, + 52, + 53, + 56, + 62, + 65, + 69, + 74, + 76, + 81, + 82, + 88, + 91, + 99, + 100, + 112, + 121, + 126, + 130, + 133, + 166 + ], + "Magicant": [ + 7, + 8, + 10, + 12, + 14, + 27, + 37, + 43, + 50, + 79, + 82, + 99, + 100, + 103, + 107, + 121, + 122, + 123, + 129, + 131, + 146, + 160 + ], + "Tunnels": [ + 6, + 15, + 17, + 126, + 145 + ], + "Magicant Interiors": [ + 61, + 68, + 84, + 121, + 140, + 143, + 144 + ], + "Tents": [ + 7, + 21, + 25, + 27, + 33, + 34, + 37, + 40, + 50, + 71, + 82, + 85, + 89, + 91, + 97, + 99, + 114, + 115, + 118, + 123, + 130 + ], + "Peaceful Rest Valley": [ + 2, + 26, + 27, + 41, + 43, + 51, + 53, + 58, + 67, + 70, + 71, + 74, + 86, + 92, + 99, + 100, + 104, + 121, + 123, + 133, + 160 + ], + "Grapefruit Falls": [ + 38, + 39, + 41, + 43, + 58, + 67, + 71, + 74, + 89, + 93, + 117, + 121, + 123, + 124, + 129, + 136, + 140, + 151, + 159, + 160, + 164 + ], + "Saturn Valley": [ + 26, + 27, + 39, + 41, + 47, + 51, + 53, + 58, + 67, + 70, + 74, + 82, + 88, + 90, + 91, + 93, + 99, + 103, + 104, + 108, + 121, + 126, + 160, + 161 + ], + "Deep Darkness": [ + 7, + 10, + 21, + 43, + 51, + 57, + 58, + 59, + 74, + 91, + 99, + 100, + 102, + 103, + 104, + 114, + 120, + 121, + 160, + 163, + 164, + 165, + 167 + ], + "Lilliput Steps Sanctuary": [ + 2, + 6, + 15, + 26, + 27, + 39, + 41, + 47, + 68, + 74, + 79, + 82, + 90, + 91, + 93, + 100, + 106, + 130, + 131, + 132, + 133, + 160, + 164, + 165 + ], + "Milky Well": [ + 15, + 26, + 27, + 38, + 39, + 41, + 43, + 47, + 57, + 70, + 74, + 91, + 93, + 105, + 109, + 126, + 131, + 133 + ], + "Deep Darkness Darkness": [ + 25 + ], + "Summers": [ + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 22, + 52, + 53, + 82, + 88, + 102, + 126, + 160, + 164, + 165 + ], + "Dusty Dunes Desert": [ + 4, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 37, + 40, + 52, + 54, + 60, + 74, + 81, + 89, + 103, + 107, + 114, + 121, + 123, + 160, + 161, + 166 + ], + "The Sky": [ + 135 + ], + "Dalaam": [ + 7, + 8, + 10, + 11, + 12, + 15, + 19, + 21, + 26, + 27, + 39, + 40, + 41, + 43, + 52, + 63, + 74, + 88, + 90, + 91, + 98, + 99, + 100, + 106, + 107, + 121 + ], + "Dalaam Palace": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 26, + 27, + 33, + 34, + 35, + 37, + 66, + 71, + 79, + 80, + 91, + 99, + 100, + 101, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 117, + 118, + 119, + 120, + 136 + ], + "Cave of the Present": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 27, + 33, + 34, + 40, + 41, + 42, + 53, + 54, + 62, + 63, + 67, + 68, + 69, + 70, + 71, + 79, + 86, + 88, + 90, + 91, + 93, + 94, + 99, + 101, + 104, + 107, + 109, + 112, + 134 + ], + "Pink Cloud Sanctuary": [ + 11, + 19, + 21, + 22, + 27, + 35, + 36, + 37, + 41, + 43, + 44, + 47, + 48, + 52, + 54, + 55, + 59, + 65, + 66, + 107 + ], + "The Sea": [ + 4, + 5, + 7, + 8, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 25, + 26, + 27, + 47, + 53, + 54, + 58, + 62, + 68, + 71, + 74, + 85, + 88, + 91, + 97, + 99, + 100, + 101, + 103, + 104, + 105, + 106, + 121 + ], + "Monotoli Offices": [ + 4, + 5, + 7, + 8, + 12, + 22, + 26, + 93, + 98, + 99, + 112, + 113, + 121, + 123 + ], + "Onett Hotel": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 19, + 21, + 22, + 26, + 80, + 91, + 99, + 104, + 105, + 106 + ], + "Threed Red-Wall House": [ + 52, + 74, + 88, + 91, + 99, + 100, + 119, + 121, + 130 + ], + "Electra's Room": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 22, + 26, + 96, + 121 + ], + "Threed Green-Wall House": [ + 37, + 52, + 54, + 56, + 58, + 68, + 69, + 83, + 102, + 121 + ], + "Threed Blue-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 19, + 22, + 26, + 37, + 59, + 80, + 91, + 96, + 106, + 121, + 126 + ], + "Pokey's House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 59, + 68, + 91, + 105, + 114, + 117, + 126, + 133 + ], + "Moonside Hospital": [ + 4, + 5, + 8, + 11, + 19, + 21, + 59, + 98, + 99, + 100, + 111, + 114, + 121, + 123, + 126, + 130, + 133 + ], + "Onett Green-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 26, + 52, + 59, + 96 + ], + "Onett Blue-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 19, + 21, + 22, + 26, + 59, + 69, + 99, + 100, + 103, + 104, + 105, + 106 + ], + "Onett Seafoam-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 59, + 99, + 100, + 101, + 102, + 104, + 105, + 118 + ], + "Onett Peach-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 45, + 69, + 99, + 100, + 103, + 105, + 106 + ], + "Onett Light Blue-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 99, + 100, + 102, + 103, + 106 + ], + "Onett Pink-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 26, + 59, + 99, + 100, + 102, + 103 + ], + "Onett White-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 22, + 26, + 27, + 99, + 100, + 105, + 106, + 126 + ], + "Hospitals": [ + 4, + 5, + 7, + 8, + 21, + 26, + 27, + 52, + 99, + 100 + ], + "Apple Kid's House": [ + 5, + 9, + 19, + 21, + 22, + 26, + 68, + 91 + ], + "Tracy's Room": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 37, + 52, + 54, + 106 + ], + "Orange Kid's House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 99, + 100, + 104, + 118 + ], + "Everdred's House": [ + 2, + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 48, + 52, + 54, + 59, + 69, + 74, + 80, + 81, + 99, + 100, + 103, + 105, + 106, + 123 + ], + "Twoson Green-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 19, + 21, + 26, + 99, + 100, + 102, + 103 + ], + "Ness's Room": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 48, + 52, + 69, + 91, + 99 + ], + "Police Station Backroom": [ + 1 + ], + "Winters": [ + 3, + 6, + 40, + 43, + 68, + 74, + 89, + 90, + 99, + 100, + 102, + 103, + 111, + 123, + 133, + 148, + 157, + 167 + ], + "Rainy Circle Sanctuary": [ + 16, + 29, + 33, + 92, + 93 + ], + "Hospital Rooms": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 98, + 99, + 100 + ], + "Twoson Peach-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 99, + 100, + 103, + 104, + 105, + 106, + 107 + ], + "Twoson Pink-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 48, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106 + ], + "Twoson Gray-Wall House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 91, + 99, + 100, + 102, + 103, + 105 + ], + "Gold Office": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 88, + 91, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 121, + 126 + ], + "Happy-Happy Guardhouse": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 59, + 98, + 99, + 100, + 104 + ], + "Happy-Happy Hospital": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 59, + 91 + ], + "Happy-Happy Hospital Clear": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 59, + 91 + ], + "Onett Town Hall": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 19, + 21, + 22, + 25, + 26, + 59, + 61, + 62, + 121, + 133 + ], + "Onett Hotel Bedrooms": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 99, + 100, + 102, + 103, + 106 + ], + "Fourside Hotel Bedrooms": [ + 4, + 5, + 7, + 8, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 59, + 91, + 99, + 100, + 103, + 121 + ], + "Happy-Happy Saturn House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 19, + 21, + 22, + 26, + 27, + 99, + 100, + 104, + 105, + 106, + 126 + ], + "Happy-Happy Hotel": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 26, + 27, + 74, + 88, + 99, + 100, + 102, + 103 + ], + "Twoson Hotel Bedrooms": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 19, + 21, + 22, + 26, + 59, + 74, + 99, + 100, + 102, + 105, + 106 + ], + "Threed Hotel Bedrooms": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 59, + 99, + 100 + ], + "Happy-Happy Hotel Clear": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 26, + 27, + 74, + 88, + 99, + 100, + 102, + 103 + ], + "Monotoli Building": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 22, + 26, + 52, + 91, + 99, + 100, + 101, + 102, + 103 + ], + "Paula's House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 19, + 21, + 22, + 26, + 48, + 52, + 54, + 99, + 100, + 105, + 106, + 121 + ], + "Paula's Room": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 59, + 99, + 100, + 103, + 104, + 105, + 106, + 126 + ], + "Ness's House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 59, + 91, + 99, + 100, + 102, + 103, + 121, + 123 + ], + "Twoson Hotel": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 69, + 91, + 99, + 100, + 102, + 103, + 105, + 106, + 126, + 130 + ], + "Threed Hotel": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 19, + 21, + 22, + 26, + 59, + 91, + 164 + ], + "Fourside Hotel": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 91, + 99, + 100, + 102, + 103 + ], + "Monotoli Elevators": [ + 96, + 121, + 126 + ], + "Fourside Dept. Store Office": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106 + ], + "Onett Library": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 19, + 21, + 22, + 26, + 89, + 91, + 99, + 100 + ], + "Paula's House Rooms": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 59, + 91, + 99, + 100, + 107 + ], + "Onett Police Station": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 52, + 59, + 126, + 133 + ], + "Scaraba": [ + 4, + 8, + 11, + 12, + 13, + 38, + 43, + 83, + 100, + 101, + 107, + 126, + 129, + 164 + ], + "Dalaam House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 59 + ], + "Scaraba House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 83, + 99, + 100, + 104, + 105, + 106 + ], + "Happy-Happy HQ": [ + 2, + 4, + 5, + 7, + 10, + 12, + 19, + 25, + 26, + 33, + 34, + 40, + 45, + 47, + 49, + 52, + 53, + 54, + 58, + 59, + 61, + 66, + 67, + 69, + 81, + 82, + 87, + 92, + 99, + 100, + 101, + 103, + 121, + 122, + 123, + 126, + 129, + 160, + 164, + 166 + ], + "Fourside Cafe": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 19, + 22, + 26, + 27, + 35, + 40, + 58, + 91, + 99, + 100, + 103, + 104, + 105, + 106 + ], + "Moonside Cafe": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 43, + 44, + 47, + 52, + 54, + 59, + 100, + 103, + 104, + 105, + 106 + ], + "Scaraba Hospital": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 27, + 91, + 99, + 100, + 101, + 104, + 105, + 106 + ], + "Scaraba Shop": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 14, + 19, + 21, + 22, + 27, + 36, + 37, + 39, + 40, + 43, + 52, + 65, + 66, + 68, + 69, + 70, + 91, + 99, + 100, + 102, + 103, + 112, + 115 + ], + "Twoson Dept. Store": [ + 56, + 66, + 67, + 69, + 97, + 108, + 161, + 162, + 164 + ], + "Fourside Dept. Store": [ + 4, + 5, + 7, + 8, + 10, + 11, + 12, + 26, + 41 + ], + "Bakery": [ + 4, + 5, + 7, + 8, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 27, + 47, + 50, + 51, + 54, + 56, + 91, + 126 + ], + "Mach Pizza": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 22, + 26, + 47, + 54, + 59, + 63, + 66, + 82, + 88, + 98, + 99, + 123 + ], + "Burger Shop": [ + 4, + 5, + 8, + 9, + 10, + 11, + 12, + 19, + 21, + 26, + 80, + 82, + 83, + 89 + ], + "Onett Drugstore": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 19, + 21, + 22, + 27, + 47, + 60, + 63, + 68, + 91 + ], + "Threed Drugstore": [ + 4, + 5, + 7, + 8, + 10, + 11, + 12, + 19, + 21, + 22, + 27, + 41, + 47, + 51, + 63, + 70, + 78, + 90, + 91 + ], + "Winters Drugstore": [ + 4, + 5, + 7, + 8, + 10, + 11, + 12, + 19, + 21, + 22, + 25, + 27, + 47, + 59, + 60, + 61, + 63, + 68, + 70, + 75, + 78, + 80, + 82, + 83, + 91, + 121, + 126 + ], + "Chaos Theater": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 40, + 44, + 52, + 53, + 54, + 58, + 63, + 66, + 67, + 68, + 69, + 70, + 74, + 81, + 82, + 91, + 99, + 100, + 103, + 104, + 105, + 106, + 123 + ], + "Fourside Museum": [ + 19, + 21, + 22, + 27, + 53, + 91 + ], + "Summers Hotel": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 40, + 43, + 47, + 52, + 53, + 54, + 56, + 100, + 104, + 105, + 106, + 121, + 126 + ], + "Summers Shop": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 38, + 40, + 41, + 43, + 44, + 47, + 53, + 54, + 58, + 66, + 68, + 69, + 70, + 74, + 75, + 88, + 91, + 99, + 100, + 105, + 106 + ], + "Snow Wood Boarding School": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 27, + 50, + 51, + 52, + 53, + 58, + 59, + 63, + 81, + 82, + 88, + 91, + 99, + 100, + 105, + 106 + ], + "Summers Harbor House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 19, + 21, + 26, + 27, + 40, + 43, + 47, + 52, + 54, + 57, + 67, + 70, + 100, + 104, + 105, + 106, + 121, + 126, + 164 + ], + "Summers Restaurant": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 26, + 27, + 35, + 43, + 44, + 53, + 54, + 56, + 58, + 59, + 62, + 63, + 66, + 67, + 68, + 69, + 70, + 81, + 82, + 88, + 91, + 99, + 100, + 104, + 105, + 106, + 108, + 117, + 126 + ], + "Moonside Museum": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 35, + 40, + 47, + 58, + 82, + 91, + 99, + 100, + 103, + 104 + ], + "Stoic Club": [ + 4, + 5, + 7, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 100 + ], + "Andonuts Lab": [ + 5, + 19, + 22, + 27, + 35, + 40, + 68, + 99, + 130 + ], + "Topolla Theater": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 26, + 27, + 35, + 40, + 43, + 47, + 53, + 56, + 58, + 62, + 68, + 69, + 80, + 81, + 82, + 88, + 99, + 100, + 104, + 105, + 106 + ], + "Summers Museum": [ + 4, + 5, + 7, + 10, + 11, + 12, + 13, + 19, + 22, + 26, + 27, + 43, + 47, + 53, + 59, + 63, + 67, + 70, + 82, + 91, + 99, + 100, + 103, + 104, + 105, + 106, + 126, + 130, + 133 + ], + "Onett Arcade": [ + 5, + 7, + 8, + 10, + 11, + 12, + 13, + 19, + 26, + 39, + 40, + 43, + 57, + 58, + 59, + 63, + 70, + 71, + 78, + 80, + 82, + 88, + 89, + 90, + 91, + 99, + 100, + 103 + ], + "Twoson Bus Station": [ + 22, + 63, + 66, + 79, + 90, + 94, + 99, + 100, + 103, + 105, + 106, + 109, + 116, + 119 + ], + "Twoson Bike Shop": [ + 4, + 5, + 7, + 8, + 10, + 11, + 19, + 21, + 22, + 41, + 63, + 70, + 71, + 75, + 78, + 82, + 90 + ], + "Hint Shop": [ + 7, + 8, + 9, + 10, + 13, + 19, + 50, + 53, + 82, + 86 + ], + "Fourside Dept. Store Rooms": [ + 2, + 4, + 5, + 8, + 9, + 11, + 12, + 13, + 14, + 19, + 21, + 22, + 26, + 35, + 36, + 59, + 99, + 100 + ], + "Threed Tent": [ + 4, + 5, + 8, + 19, + 21, + 22, + 27, + 40, + 41, + 63, + 88, + 89, + 91, + 102, + 121, + 160 + ], + "Onett Treehouse": [ + 4, + 5, + 7, + 8, + 11, + 12, + 13, + 14, + 26, + 53, + 80, + 90, + 101, + 130 + ], + "Lier's House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 12, + 13, + 19, + 21, + 22, + 26, + 37, + 40, + 59, + 91, + 99, + 100 + ], + "Run-down House": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 41, + 99, + 100, + 103, + 105, + 106, + 107, + 126 + ], + "Paula's Cabin": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 19, + 22, + 26, + 29, + 99, + 100, + 126 + ], + "Dusty Dunes Drugstore": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 52, + 53, + 56, + 74, + 83, + 89, + 99, + 100 + ], + "Dusty Dunes Miner Shack": [ + 4, + 5, + 7, + 8, + 10, + 12, + 13, + 19, + 21 + ], + "Traveler's Shack": [ + 4, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 38, + 40, + 47, + 52, + 59, + 99, + 100, + 105, + 106 + ], + "Lumine Hall": [ + 1, + 14, + 18, + 21, + 26, + 33, + 40, + 41, + 44, + 47, + 54, + 61, + 68, + 70, + 74, + 75, + 101, + 104, + 109, + 111, + 115, + 118, + 126, + 128, + 162, + 164 + ], + "Connector Caves": [ + 1, + 2, + 7, + 11, + 12, + 13, + 15, + 19, + 20, + 21, + 22, + 24, + 27, + 38, + 43, + 44, + 49, + 52, + 57, + 59, + 70, + 74, + 78, + 80, + 81, + 94, + 108, + 115, + 117, + 118, + 120, + 121, + 122, + 123, + 126, + 147 + ], + "Lumine Hall Sanctuary": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 16, + 18, + 19, + 21, + 22, + 23, + 24, + 26, + 27, + 38, + 40, + 41, + 43, + 44, + 47, + 52, + 53, + 54, + 56, + 57, + 58, + 63, + 67, + 68, + 69, + 70, + 74, + 75, + 78, + 81, + 82, + 83, + 85, + 86, + 87, + 88, + 90, + 93, + 99, + 100, + 101, + 103, + 104, + 105, + 106, + 107, + 108, + 112, + 115, + 117, + 118, + 119, + 120, + 121, + 126, + 128, + 162 + ], + "Fire Spring": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 16, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 27, + 43, + 44, + 63, + 70, + 71, + 75, + 78, + 99, + 100, + 104, + 105, + 112, + 121 + ], + "Sea of Eden": [ + 4, + 5, + 7, + 9, + 12, + 15, + 21, + 22, + 40, + 52, + 126 + ], + "Monkey Caves Treasure Rooms": [ + 1, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 19, + 21, + 22, + 26, + 27, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 43, + 44, + 47, + 51, + 52, + 53, + 55, + 63, + 64, + 71, + 72, + 73, + 82, + 83, + 88, + 89, + 90, + 91, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 108, + 109, + 110, + 112, + 113, + 119, + 120, + 126, + 130, + 131, + 132, + 133 + ], + "Dungeon Man": [ + 2, + 7, + 11, + 14, + 26, + 29, + 58, + 93 + ], + "Threed Underground": [ + 4, + 5, + 6, + 7, + 10, + 11, + 12, + 13, + 19, + 26, + 27, + 33, + 35, + 38, + 40, + 42, + 45, + 47, + 52, + 53, + 54, + 56, + 57, + 58, + 63, + 66, + 67, + 69, + 70, + 91, + 99, + 100, + 104, + 105, + 106, + 156 + ], + "Lier's Cave": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 21, + 26, + 27, + 44, + 47, + 52, + 74, + 80, + 81, + 91, + 99, + 100, + 104, + 105, + 106, + 126 + ], + "Stonehenge Balcony Room": [ + 16, + 67, + 99, + 100, + 118, + 164 + ], + "Stonehenge Balcony Off": [ + 16, + 67, + 99, + 100, + 118, + 164 + ], + "Brickroad Maze": [ + 18, + 54, + 58 + ], + "Rainy Circle": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 22, + 26, + 27, + 43, + 44, + 47, + 52, + 54, + 56, + 57, + 59, + 63, + 66, + 67, + 69, + 70, + 71, + 74, + 75, + 78, + 81, + 99, + 100, + 104, + 105, + 106, + 126, + 160 + ], + "Belch's Factory": [ + 14, + 15, + 16, + 29, + 98, + 99, + 100, + 116, + 126 + ], + "Milky Well Caves": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 26, + 27, + 35, + 40, + 43, + 47, + 52, + 53, + 54, + 56, + 62, + 66, + 67, + 68, + 69, + 70, + 81, + 82, + 91, + 129 + ], + "Lilliput Steps": [ + 4, + 5, + 7, + 8, + 12, + 13, + 19, + 20, + 21, + 22, + 27, + 35, + 40, + 59, + 82, + 99, + 100, + 101, + 103, + 104, + 105, + 106, + 126 + ], + "Monkey Caves Hallway": [ + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 38, + 99, + 100, + 101, + 104, + 106 + ], + "Giant Step": [ + 1, + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 13, + 15, + 20, + 21, + 26, + 43, + 45, + 47, + 49 + ], + "Pink Cloud": [ + 6, + 35, + 74, + 121 + ], + "Saturn Caves": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 21, + 23, + 27, + 52, + 56, + 71, + 78, + 126 + ], + "Stonehenge Tunnels": [ + 1, + 27, + 42, + 52, + 74, + 99 + ], + "Gold Mine": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 16, + 19, + 21, + 22, + 26, + 27, + 40, + 56, + 66, + 67, + 88, + 91, + 100, + 103, + 104, + 105, + 106, + 117, + 123 + ], + "Sewer": [ + 32, + 74, + 79, + 80, + 111 + ], + "Tenda Village": [ + 4, + 7, + 11, + 15, + 26, + 27, + 29, + 32, + 40, + 47, + 56, + 58, + 65, + 68, + 74, + 92, + 99, + 102, + 104, + 105, + 123, + 126, + 162 + ], + "Fourside Dept. Store Blackout": [ + 4, + 5, + 7, + 8, + 10, + 11, + 12, + 26, + 41 + ], + "Fourside Dept. Store Blackout Rooms": [ + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 19, + 21, + 22, + 27, + 37, + 59, + 82, + 91, + 99, + 100, + 102, + 103, + 105, + 106 + ], + "Magicant Manly Fish": [ + 7, + 8, + 10, + 12, + 14, + 27, + 37, + 43, + 50, + 79, + 82, + 99, + 100, + 103, + 107, + 121, + 122, + 123, + 129, + 131, + 146, + 160 + ], + "Magicant Ness": [ + 7, + 8, + 10, + 12, + 14, + 27, + 37, + 43, + 50, + 79, + 82, + 99, + 100, + 103, + 107, + 121, + 122, + 123, + 129, + 131, + 146, + 160 + ], + "Magicant Rabbit": [ + 7, + 8, + 10, + 12, + 14, + 27, + 37, + 43, + 50, + 79, + 82, + 99, + 100, + 103, + 107, + 121, + 122, + 123, + 129, + 131, + 146, + 160 + ], + "Magicant Belch": [ + 7, + 8, + 10, + 12, + 14, + 27, + 37, + 43, + 50, + 79, + 82, + 99, + 100, + 103, + 107, + 121, + 122, + 123, + 129, + 131, + 146, + 160 + ], + "Magicant Mom": [ + 7, + 8, + 10, + 12, + 14, + 27, + 37, + 43, + 50, + 79, + 82, + 99, + 100, + 103, + 107, + 121, + 122, + 123, + 129, + 131, + 146, + 160 + ] +} diff --git a/worlds/earthbound/game_data/static_location_data.py b/worlds/earthbound/game_data/static_location_data.py new file mode 100644 index 0000000000..b04d854d10 --- /dev/null +++ b/worlds/earthbound/game_data/static_location_data.py @@ -0,0 +1,1407 @@ +location_ids = { + "Onett - Tracy Gift": 0xEB0000, + "Onett - Tracy's Room Present": 0xEB0001, + "Onett - Hilltop Present": 0xEB0002, + "Onett - Meteor Item": 0xEB0003, + "Onett - Buzz Buzz": 0xEB0004, + "Onett - Mani Mani Statue": 0xEB0005, + "Onett - Library Counter": 0xEB0006, + "Onett - Library Bookshelf": 0xEB0007, + "Onett - Burger Shop Trashcan": 0xEB0008, + "Onett - Treehouse Guy": 0xEB0009, + "Onett - South Road Present": 0xEB000A, + "Onett - Hotel Trashcan": 0xEB000B, + "Onett - Arcade Trashcan": 0xEB000C, + "Onett - Mayor Pirkle": 0xEB000D, + "Onett - Traveling Entertainer": 0xEB000E, + "Giant Step - First Cave Present": 0xEB000F, + "Giant Step - Floor 2 Cave Present": 0xEB0010, + "Giant Step - Floor 3 Present": 0xEB0011, + "Twoson - Bike Shop Rental": 0xEB0012, + "Twoson - Antique Shop": 0xEB0013, + "Twoson - Paula's Room Present": 0xEB0014, + "Twoson - Apple Kid Trashcan": 0xEB0015, + "Twoson - South of Town Present": 0xEB0016, + "Twoson - Orange Kid Donation": 0xEB0017, + "Twoson - Apple Kid Invention": 0xEB0018, + "Twoson - Apple Kid's Mouse": 0xEB0019, + "Twoson - Paula's Mother": 0xEB001A, + "Twoson - Everdred Meeting": 0xEB001B, + "Twoson - Insignificant Location": 0xEB001C, + "Peaceful Rest Valley - Split Hill Present": 0xEB001D, + "Peaceful Rest Valley - Hill Nook Present": 0xEB001E, + "Peaceful Rest Valley - South of Bridge Present": 0xEB001F, + "Peaceful Rest Valley - Dead End Present": 0xEB0020, + "Peaceful Rest Valley - River Overlook Present": 0xEB0021, + "Peaceful Rest Valley - North Side Present": 0xEB0022, + "Happy-Happy Village - Donation Lady": 0xEB0023, + "Happy-Happy Village - Right HQ Present": 0xEB0024, + "Happy-Happy Village - Left HQ Present": 0xEB0025, + "Happy-Happy Village - Prisoner Item": 0xEB0026, + "Happy-Happy Village - Prisoner": 0xEB0027, + "Happy-Happy Village - Defeat Carpainter": 0xEB0028, + "Lilliput Steps - Southwest Pool Present": 0xEB0029, + "Lilliput Steps - East Cliff Present": 0xEB002A, + "Lilliput Steps - North Stream Present": 0xEB002B, + "Threed - Boogey Tent Trashcan": 0xEB002C, + "Threed - Cemetery Trashcan": 0xEB002D, + "Threed - Downtown Trashcan": 0xEB002E, + "Threed - East Side Trashcan": 0xEB002F, + "Threed - Northeast Shack Trashcan": 0xEB0030, + "Threed - Hospital Drawer": 0xEB0031, + "Threed - Zombie Prisoner": 0xEB0032, + "Threed Underground - Left Coffin": 0xEB0033, + "Threed Underground - Right Coffin": 0xEB0034, + "Grapefruit Falls - South Present": 0xEB0035, + "Grapefruit Falls - North Present": 0xEB0036, + "Grapefruit Falls - Saturn Cave Present": 0xEB0037, + "Saturn Valley - Ladder Present": 0xEB0038, + "Saturn Valley - Trashcan #1": 0xEB0039, + "Saturn Valley - Trashcan #2": 0xEB003A, + "Saturn Valley - Trashcan #3": 0xEB003B, + "Saturn Valley - Saturn Coffee": 0xEB003C, + "Saturn Valley - Post Belch Gift #1": 0xEB003D, + "Saturn Valley - Post Belch Gift #2": 0xEB003E, + "Saturn Valley - Post Belch Gift #3": 0xEB003F, + "Milky Well - Cavern Present": 0xEB0040, + "Belch's Factory - Top Right Room Trashcan": 0xEB0041, + "Belch's Factory - Pit Room Trashcan #1": 0xEB0042, + "Belch's Factory - Pit Room Trashcan #2": 0xEB0043, + "Belch's Factory - Balcony Room Trashcan #1": 0xEB0044, + "Belch's Factory - Balcony Room Trashcan #2": 0xEB0045, + "Belch's Factory - Balcony Room Trashcan #3": 0xEB0046, + "Dusty Dunes - Northwest Corner Present": 0xEB0047, + "Dusty Dunes - South Side Present": 0xEB0048, + "Dusty Dunes - Surrounding Rocks Present": 0xEB0049, + "Dusty Dunes - Black Sesame Present": 0xEB004A, + "Dusty Dunes - Oasis Present": 0xEB004B, + "Dusty Dunes - Northeast Corner Present": 0xEB004C, + "Dusty Dunes - North Central Present": 0xEB004D, + "Dusty Dunes - Shining Spot": 0xEB004E, + "Dusty Dunes - East Peninsula Present": 0xEB004F, + "Dusty Dunes - Mine Reward": 0xEB0050, + "Snow Wood - Many Present Room Present #1": 0xEB0051, + "Snow Wood - Many Present Room Present #2": 0xEB0052, + "Snow Wood - Many Present Room Present #3": 0xEB0053, + "Snow Wood - Many Present Room Present #4": 0xEB0054, + "Snow Wood - Many Present Room Present #5": 0xEB0055, + "Snow Wood - Many Present Room Present #6": 0xEB0056, + "Snow Wood - Many Present Room Present #7": 0xEB0057, + "Scaraba - Snake Bag Salesman": 0xEB0058, + "Snow Wood - Upper Right Locker": 0xEB0059, + "Snow Wood - Upper Left Locker": 0xEB005A, + "Snow Wood - Bottom Right Locker": 0xEB005B, + "Snow Wood - Bottom Left Locker": 0xEB005C, + "Snow Wood - Maxwell Item": 0xEB005D, + "Snow Wood - Bedroom": 0xEB005E, + "Winters - Drugstore Saleswoman": 0xEB005F, + "Brick Road Maze - Top Path Present": 0xEB0060, + "Brick Road Maze - Guarded Present": 0xEB0061, + "Brick Road Maze - Out of the Way Present": 0xEB0062, + "Brick Road Maze - Alcove Present": 0xEB0063, + "Brick Road Maze - Near Exit Present": 0xEB0064, + "Rainy Circle - Isolated Present": 0xEB0065, + "Rainy Circle - East Cliff Present": 0xEB0066, + "Rainy Circle - Near Ropes Present": 0xEB0067, + "Andonuts Lab - Present": 0xEB0068, + "Andonuts Lab - Mouse": 0xEB0069, + "Stonehenge - Purple Maze Present": 0xEB006A, + "Stonehenge - Dead End Present": 0xEB006B, + "Stonehenge - Near End of the Maze Present": 0xEB006C, + "Stonehenge - Bridge Room East Balcony Present": 0xEB006D, + "Stonehenge - Bridge Room Lower Present": 0xEB006E, + "Stonehenge - Flashing Room Right Path Present": 0xEB006F, + "Stonehenge - Flashing Room Center Present": 0xEB0070, + "Stonehenge - Flashing Room Upper Present": 0xEB0071, + "Stonehenge - Kidnapped Mr. Saturn": 0xEB0072, + "Stonehenge - Tony Item": 0xEB0073, + "Gold Mine - Mouse Crossroad Present #1": 0xEB0074, + "Gold Mine - Mouse Crossroad Present #2": 0xEB0075, + "Gold Mine - B1F Lonely Mole Present": 0xEB0076, + "Gold Mine - South Hall Present": 0xEB0077, + "Gold Mine - South Corner Present": 0xEB0078, + "Gold Mine - South Mole Present #1": 0xEB0079, + "Gold Mine - South Mole Present #2": 0xEB007A, + "Gold Mine - North Crossroad Detour Present": 0xEB007B, + "Gold Mine - North Mole Present": 0xEB007C, + "Gold Mine - West Mole Present": 0xEB007D, + "Gold Mine - B1F Isolated Present": 0xEB007E, + "Gold Mine - West Crossroad Detour Present": 0xEB007F, + "Gold Mine - B1F Junction Present": 0xEB0080, + "Gold Mine - B1F Junction Mole Present": 0xEB0081, + "Monkey Caves - 1F Right Chest": 0xEB00F1, + "Monkey Caves - 1F Left Chest": 0xEB00F2, + "Monkey Caves - West 2F Left Chest": 0xEB00F3, + "Monkey Caves - West 2F Right Chest #1": 0xEB00F4, + "Monkey Caves - West 2F Right Chest #2": 0xEB00F5, + "Monkey Caves - East 2F Left Chest": 0xEB00F6, + "Monkey Caves - East 2F Right Chest": 0xEB00F7, + "Monkey Caves - East West 3F Right Chest #1": 0xEB00F8, + "Monkey Caves - East West 3F Right Chest #2": 0xEB00F9, + "Monkey Caves - West End Chest": 0xEB0082, + "Monkey Caves - West End Trashcan": 0xEB0083, + "Monkey Caves - East End Chest": 0xEB0084, + "Monkey Caves - East End Trashcan": 0xEB0085, + "Monkey Caves - Bow Monkey Gift": 0xEB0086, + "Monkey Caves - Talah Rama Chest #1": 0xEB0087, + "Monkey Caves - Talah Rama Chest #2": 0xEB0088, + "Monkey Caves - Talah Rama Gift": 0xEB0089, + "Monkey Caves - Monkey Power": 0xEB008A, + "Fourside - Venus Gift": 0xEB008B, + "Fourside - Post-Moonside Delivery": 0xEB008C, + "Fourside - Bakery 2F Gift": 0xEB008D, + "Moonside - Two Trees Present": 0xEB008E, + "Moonside - East Island Present": 0xEB008F, + "Moonside - Businessman Present": 0xEB0090, + "Moonside - West Island Present": 0xEB0091, + "Moonside - Hospital Present": 0xEB0092, + "Fourside - Department Store Blackout": 0xEB0093, + "Magnet Hill - West Entrance Trashcan": 0xEB0094, + "Magnet Hill - First Room Free Door Trashcan": 0xEB0095, + "Magnet Hill - First Room Barrel Door Trashcan": 0xEB0096, + "Magnet Hill - Second Room Dead End Trashcan": 0xEB0097, + "Magnet Hill - Final Room Door Trashcan": 0xEB0098, + "Fourside - Magnet Hill Chest": 0xEB0099, + "Monotoli Building - One Table Present": 0xEB009A, + "Monotoli Building - Two Table Present": 0xEB009B, + "Monotoli Building - Electra Gift": 0xEB009C, + "Monotoli Building - Monotoli Gift": 0xEB009D, + "Monotoli Building - Monotoli Character": 0xEB009E, + "Summers - Museum Item": 0xEB009F, + "Summers - Magic Cake": 0xEB00A0, + "Dalaam - Throne Room Chest #1": 0xEB00A1, + "Dalaam - Throne Room Chest #2": 0xEB00A2, + "Dalaam - Throne Room Chest #3": 0xEB00A3, + "Dalaam - Trial of Mu": 0xEB00A4, + "Dalaam - Restaurant Chest #1": 0xEB00A5, + "Dalaam - Restaurant Chest #2": 0xEB00A6, + "Dalaam - Do Do Guy's House Chest": 0xEB00A7, + "Dalaam - Upper House Chest": 0xEB00A8, + "Dalaam - Throne Character": 0xEB00A9, + "Poo - Starting Item": 0xEB00AA, + "Pink Cloud - Three Holes Present": 0xEB00AB, + "Pink Cloud - Left Hole Present": 0xEB00AC, + "Pink Cloud - Ground Floor Present": 0xEB00AD, + "Pyramid - Anteroom Sarcophagus": 0xEB00AE, + "Pyramid - Northwest Door Sarcophagus": 0xEB00AF, + "Pyramid - Hallway Sarcophagus #1": 0xEB00B0, + "Pyramid - Hallway Sarcophagus #2": 0xEB00B1, + "Pyramid - Switch Room Sarcophagus": 0xEB00B2, + "Pyramid - Pedestal Item": 0xEB00B3, + "Pyramid - Way Out Sarcophagus": 0xEB00B4, + "Scaraba - Star Master": 0xEB00B5, + "Scaraba - Key Holder": 0xEB00B6, + "Dungeon Man - 1F Dead End Present": 0xEB00B7, + "Dungeon Man - 1F Long Walk Present": 0xEB00B8, + "Dungeon Man - 1F Disappointing Present": 0xEB00B9, + "Dungeon Man - 1F Opinion Present": 0xEB00BA, + "Dungeon Man - 1F No Sign Present": 0xEB00BB, + "Dungeon Man - 2F Unnecessary Billboard Present": 0xEB00BC, + "Dungeon Man - 2F Dungeon Exploration Present": 0xEB00BD, + "Dungeon Man - 2F South Ledge Present": 0xEB00BE, + "Dungeon Man - 2F North Alcove Present": 0xEB00BF, + "Dungeon Man - 3F Present": 0xEB00C0, + "Dungeon Man - 2F Hole Present": 0xEB00C1, + "Dungeon Man - 1F Exit Ledge Present": 0xEB00C2, + "Deep Darkness - Teleporting Monkey": 0xEB00C3, + "Deep Darkness - Crest of Darkness Present": 0xEB00C4, + "Deep Darkness - Helicopter Present": 0xEB00C5, + "Deep Darkness - Yellow Bird Present": 0xEB00C6, + "Deep Darkness - Swamp Present": 0xEB00C7, + "Deep Darkness - Corner Present": 0xEB00C8, + "Deep Darkness - Alcove Present": 0xEB00C9, + "Deep Darkness - North Alcove Truffle": 0xEB00CA, + "Deep Darkness - Near Land Truffle": 0xEB00CB, + "Deep Darkness - Present Truffle": 0xEB00CC, + "Deep Darkness - Village Truffle": 0xEB00CD, + "Deep Darkness - Entrance Truffle": 0xEB00CE, + "Deep Darkness - Barf Character": 0xEB00CF, + "Tenda Village - Trashcan": 0xEB00D0, + "Tenda Village - Tenda Tea": 0xEB00D1, + "Tenda Village - Tenda Gift": 0xEB00D2, + "Tenda Village - Tenda Gift #2": 0xEB00D3, + "Lumine Hall - B1F Non-Talkative Rock Present": 0xEB00D4, + "Lumine Hall - 1F North Path Present": 0xEB00D5, + "Lumine Hall - B1F Thankful Rock Corner Present": 0xEB00D6, + "Lumine Hall - B1F Thankful Rock Junction Present": 0xEB00D7, + "Lumine Hall - 1F Above Belly Button Present": 0xEB00D8, + "Lumine Hall - B1F Belly Button Present": 0xEB00D9, + "Lumine Hall - 1F Near Exit Present": 0xEB00DA, + "Lumine Hall - 1F Dead End Present": 0xEB00DB, + "Lumine Hall - B1F West Alcove Present": 0xEB00DC, + "Lost Underworld - Talking Rock": 0xEB00DD, + "Lost Underworld - East Present": 0xEB00DE, + "Lost Underworld - Northeast Present": 0xEB00DF, + "Lost Underworld - Northeast of Tenda Tribe Present": 0xEB00E0, + "Lost Underworld - Southwest of Tenda Tribe Present": 0xEB00E1, + "Lost Underworld - Evacuation Present": 0xEB00E2, + "Fire Spring - 1st Cave Present": 0xEB00E3, + "Fire Spring - East Corner Present": 0xEB00E4, + "Fire Spring - Volcano Present": 0xEB00E5, + "Fire Spring - Lone Cave Present": 0xEB00E6, + "Fire Spring - Upper Volcano Present": 0xEB00E7, + "Magicant - Ness's Gift": 0xEB00E8, + "Magicant - Present Near Ness": 0xEB00E9, + "Magicant - Lonely Present": 0xEB00EA, + "Magicant - North Present": 0xEB00EB, + "Magicant - Hills Present": 0xEB00EC, + "Magicant - Town Present": 0xEB00FA, + "Magicant - Ness's Nightmare": 0xEB00ED, + "Cave of the Present - Star Master": 0xEB00EE, + "Cave of the Present - Broken Phase Distorter": 0xEB00EF, + "Cave of the Past - Present": 0xEB00F0, + ########################################## + # Shop checks are denoted by an ID of + # 0x1000 | Each shop has 7 allocated ID spaces in memory + "Onett Drugstore - Right Counter Slot 1": 0xEB1000, + "Onett Drugstore - Right Counter Slot 2": 0xEB1001, + "Onett Drugstore - Right Counter Slot 3": 0xEB1002, + "Onett Drugstore - Right Counter Slot 4": 0xEB1003, + "Onett Drugstore - Right Counter Slot 5": 0xEB1004, + + "Onett Drugstore - Left Counter": 0xEB1007, + + "Summers - Beach Cart": 0xEB100E, + + "Onett Burger Shop - Slot 1": 0xEB1015, + "Onett Burger Shop - Slot 2": 0xEB1016, + "Onett Burger Shop - Slot 3": 0xEB1017, + "Onett Burger Shop - Slot 4": 0xEB1018, + + "Onett Bakery - Slot 1": 0xEB101C, + "Onett Bakery - Slot 2": 0xEB101D, + "Onett Bakery - Slot 3": 0xEB101E, + "Onett Bakery - Slot 4": 0xEB101F, + + "Twoson Department Store Burger Shop - Slot 1": 0xEB1023, + "Twoson Department Store Burger Shop - Slot 2": 0xEB1024, + "Twoson Department Store Burger Shop - Slot 3": 0xEB1025, + "Twoson Department Store Burger Shop - Slot 4": 0xEB1026, + + "Twoson Department Store Bakery - Slot 1": 0xEB102A, # Force This slot needs to always be a local food item + "Twoson Department Store Bakery - Slot 2": 0xEB102B, + "Twoson Department Store Bakery - Slot 3": 0xEB102C, + "Twoson Department Store Bakery - Slot 4": 0xEB102D, + + "Twoson Department Store Top Floor - Right Counter Slot 1": 0xEB1031, + "Twoson Department Store Top Floor - Right Counter Slot 2": 0xEB1032, + "Twoson Department Store Top Floor - Right Counter Slot 3": 0xEB1033, + "Twoson Department Store Top Floor - Right Counter Slot 4": 0xEB1034, + "Twoson Department Store Top Floor - Right Counter Slot 5": 0xEB1035, + "Twoson Department Store Top Floor - Right Counter Slot 6": 0xEB1036, + + "Twoson Department Store Top Floor - Left Counter Slot 1": 0xEB1038, + "Twoson Department Store Top Floor - Left Counter Slot 2": 0xEB1039, + + "Summers - Magic Cake Cart Shop Slot": 0xEB103F, + + "Burglin Park Junk Shop - Slot 1": 0xEB1046, + "Burglin Park Junk Shop - Slot 2": 0xEB1047, + "Burglin Park Junk Shop - Slot 3": 0xEB1048, + "Burglin Park Junk Shop - Slot 4": 0xEB1049, + "Burglin Park Junk Shop - Slot 5": 0xEB104A, + "Burglin Park Junk Shop - Slot 6": 0xEB104B, + + "Burglin Park Bread Stand - Slot 1": 0xEB105B, + "Burglin Park Bread Stand - Slot 2": 0xEB105C, + "Burglin Park Bread Stand - Slot 3": 0xEB105D, + "Burglin Park Bread Stand - Slot 4": 0xEB105E, + "Burglin Park Bread Stand - Slot 5": 0xEB105F, + "Burglin Park Bread Stand - Slot 6": 0xEB1060, + + "Burglin Park - Banana Stand": 0xEB1062, + + "Happy-Happy Village Drugstore - Right Counter Slot 1": 0xEB1069, + "Happy-Happy Village Drugstore - Right Counter Slot 2": 0xEB106A, + "Happy-Happy Village Drugstore - Right Counter Slot 3": 0xEB106B, + "Happy-Happy Village Drugstore - Right Counter Slot 4": 0xEB106C, + "Happy-Happy Village Drugstore - Right Counter Slot 5": 0xEB106D, + + "Threed Drugstore - Right Counter Slot 1": 0xEB1070, + "Threed Drugstore - Right Counter Slot 2": 0xEB1071, + "Threed Drugstore - Right Counter Slot 3": 0xEB1072, + "Threed Drugstore - Right Counter Slot 4": 0xEB1073, + "Threed Drugstore - Right Counter Slot 5": 0xEB1074, + + "Threed Drugstore - Left Counter Slot 1": 0xEB1077, + "Threed Drugstore - Left Counter Slot 2": 0xEB1078, + "Threed Drugstore - Left Counter Slot 3": 0xEB1079, + "Threed Drugstore - Left Counter Slot 4": 0xEB107A, + "Threed Drugstore - Left Counter Slot 5": 0xEB107B, + + "Threed - Arms Dealer Slot 1": 0xEB107E, + "Threed - Arms Dealer Slot 2": 0xEB107F, + "Threed - Arms Dealer Slot 3": 0xEB1080, + "Threed - Arms Dealer Slot 4": 0xEB1081, + + "Threed Bakery - Slot 1": 0xEB1085, + "Threed Bakery - Slot 2": 0xEB1086, + "Threed Bakery - Slot 3": 0xEB1087, + "Threed Bakery - Slot 4": 0xEB1088, + "Threed Bakery - Slot 5": 0xEB1089, + "Threed Bakery - Slot 6": 0xEB108A, + "Threed Bakery - Slot 7": 0xEB108B, + + "Scaraba - Expensive Water Guy": 0xEB108C, + + "Winters Drugstore - Slot 1": 0xEB1093, + "Winters Drugstore - Slot 2": 0xEB1094, + "Winters Drugstore - Slot 3": 0xEB1095, + "Winters Drugstore - Slot 4": 0xEB1096, + "Winters Drugstore - Slot 5": 0xEB1097, + "Winters Drugstore - Slot 6": 0xEB1098, + "Winters Drugstore - Slot 7": 0xEB1099, + + "Saturn Valley Shop - Center Saturn Slot 1": 0xEB109A, + "Saturn Valley Shop - Center Saturn Slot 2": 0xEB109B, + "Saturn Valley Shop - Center Saturn Slot 3": 0xEB109C, + "Saturn Valley Shop - Center Saturn Slot 4": 0xEB109D, + "Saturn Valley Shop - Center Saturn Slot 5": 0xEB109E, + + "Dusty Dunes Drugstore - Counter Slot 1": 0xEB10A1, + "Dusty Dunes Drugstore - Counter Slot 2": 0xEB10A2, + "Dusty Dunes Drugstore - Counter Slot 3": 0xEB10A3, + "Dusty Dunes Drugstore - Counter Slot 4": 0xEB10A4, + "Dusty Dunes Drugstore - Counter Slot 5": 0xEB10A5, + + "Dusty Dunes - Arms Dealer Slot 1": 0xEB10A8, + "Dusty Dunes - Arms Dealer Slot 2": 0xEB10A9, + "Dusty Dunes - Arms Dealer Slot 3": 0xEB10AA, + "Dusty Dunes - Arms Dealer Slot 4": 0xEB10AB, + + "Fourside Bakery - Slot 1": 0xEB10AF, + "Fourside Bakery - Slot 2": 0xEB10B0, + "Fourside Bakery - Slot 3": 0xEB10B1, + "Fourside Bakery - Slot 4": 0xEB10B2, # Force this slot to be repel sandwich in monkey caves mode + "Fourside Bakery - Slot 5": 0xEB10B3, + "Fourside Bakery - Slot 6": 0xEB10B4, + + "Fourside Department Store - Tool Shop Slot 1": 0xEB10B6, + "Fourside Department Store - Tool Shop Slot 2": 0xEB10B7, + "Fourside Department Store - Tool Shop Slot 3": 0xEB10B8, + "Fourside Department Store - Tool Shop Slot 4": 0xEB10B9, + "Fourside Department Store - Tool Shop Slot 5": 0xEB10BA, + "Fourside Department Store - Tool Shop Slot 6": 0xEB10BB, + "Fourside Department Store - Tool Shop Slot 7": 0xEB10BC, # Force this slot to be ruler in monkey caves mode + + "Fourside Department Store - Shop Shop Slot 1": 0xEB10BD, + "Fourside Department Store - Shop Shop Slot 2": 0xEB10BE, + "Fourside Department Store - Shop Shop Slot 3": 0xEB10BF, # Force this slot to be Protein drink in monkey caves mod + "Fourside Department Store - Shop Shop Slot 4": 0xEB10C0, + + "Fourside Department Store - Food Shop Slot 1": 0xEB10C4, + "Fourside Department Store - Food Shop Slot 2": 0xEB10C5, + "Fourside Department Store - Food Shop Slot 3": 0xEB10C6, + "Fourside Department Store - Food Shop Slot 4": 0xEB10C7, + "Fourside Department Store - Food Shop Slot 5": 0xEB10C8, # Force this slot to be Picnic lunch in monkey caves mode + + "Fourside Department Store - 2F Cart Slot 1": 0xEB10CB, + "Fourside Department Store - 2F Cart Slot 2": 0xEB10CC, + "Fourside Department Store - 2F Cart Slot 3": 0xEB10CD, + "Fourside Department Store - 2F Cart Slot 4": 0xEB10CE, + "Fourside Department Store - 2F Cart Slot 5": 0xEB10CF, + "Fourside Department Store - 2F Cart Slot 6": 0xEB10D0, + "Fourside Department Store - 2F Cart Slot 7": 0xEB10D1, + + "Fourside Department Store - Toys Shop Slot 1": 0xEB10D2, + "Fourside Department Store - Toys Shop Slot 2": 0xEB10D3, + "Fourside Department Store - Toys Shop Slot 3": 0xEB10D4, + "Fourside Department Store - Toys Shop Slot 4": 0xEB10D5, + "Fourside Department Store - Toys Shop Slot 5": 0xEB10D6, + "Fourside Department Store - Toys Shop Slot 6": 0xEB10D7, + + "Fourside Department Store - Sports Shop Slot 1": 0xEB10D9, + "Fourside Department Store - Sports Shop Slot 2": 0xEB10DA, + "Fourside Department Store - Sports Shop Slot 3": 0xEB10DB, + "Fourside Department Store - Sports Shop Slot 4": 0xEB10DC, + + "Fourside Department Store - Burger Shop Slot 1": 0xEB10E0, + "Fourside Department Store - Burger Shop Slot 2": 0xEB10E1, + "Fourside Department Store - Burger Shop Slot 3": 0xEB10E2, + "Fourside Department Store - Burger Shop Slot 4": 0xEB10E3, # Force this slot to be Hamburger + "Fourside Department Store - Burger Shop Slot 5": 0xEB10E4, + + "Fourside Department Store - Arms Dealer Slot 1": 0xEB10E7, + "Fourside Department Store - Arms Dealer Slot 2": 0xEB10E8, + "Fourside Department Store - Arms Dealer Slot 3": 0xEB10E9, + "Fourside Department Store - Arms Dealer Slot 4": 0xEB10EA, + "Fourside Department Store - Arms Dealer Slot 5": 0xEB10EB, + + "Fourside - Northeast Alley Junk Shop Slot 1": 0xEB10EE, + "Fourside - Northeast Alley Junk Shop Slot 2": 0xEB10EF, + "Fourside - Northeast Alley Junk Shop Slot 3": 0xEB10F0, + "Fourside - Northeast Alley Junk Shop Slot 4": 0xEB10F1, + + "Magicant - Shop Slot 1": 0xEB10F5, + "Magicant - Shop Slot 2": 0xEB10F6, + + "Summers - Scam Shop Slot 1": 0xEB1103, + "Summers - Scam Shop Slot 2": 0xEB1104, + "Summers - Scam Shop Slot 3": 0xEB1105, + "Summers - Scam Shop Slot 4": 0xEB1106, + "Summers - Scam Shop Slot 5": 0xEB1107, + "Summers - Scam Shop Slot 6": 0xEB1108, + "Summers - Scam Shop Slot 7": 0xEB1109, + + "Summers Harbor - Shop Slot 1": 0xEB110A, + "Summers Harbor - Shop Slot 2": 0xEB110B, + "Summers Harbor - Shop Slot 3": 0xEB110C, + "Summers Harbor - Shop Slot 4": 0xEB110D, + "Summers Harbor - Shop Slot 5": 0xEB110E, + "Summers Harbor - Shop Slot 6": 0xEB110F, + "Summers Harbor - Shop Slot 7": 0xEB1110, + + "Summers Restaurant - Slot 1": 0xEB1111, + "Summers Restaurant - Slot 2": 0xEB1112, + "Summers Restaurant - Slot 3": 0xEB1113, + "Summers Restaurant - Slot 4": 0xEB1114, + "Summers Restaurant - Slot 5": 0xEB1115, + "Summers Restaurant - Slot 6": 0xEB1116, + + "Scaraba - Indoors Shop Slot 1": 0xEB1118, + "Scaraba - Indoors Shop Slot 2": 0xEB1119, + "Scaraba - Indoors Shop Slot 3": 0xEB111A, + "Scaraba - Indoors Shop Slot 4": 0xEB111B, + "Scaraba - Indoors Shop Slot 5": 0xEB111C, + "Scaraba - Indoors Shop Slot 6": 0xEB111D, + + "Scaraba Bazaar - Red Snake Carpet Slot 1": 0xEB1126, + "Scaraba Bazaar - Red Snake Carpet Slot 2": 0xEB1127, + "Scaraba Bazaar - Red Snake Carpet Slot 3": 0xEB1128, + + "Scaraba Bazaar - Bottom Left Carpet Slot 1": 0xEB112D, + "Scaraba Bazaar - Bottom Left Carpet Slot 2": 0xEB112E, + "Scaraba Bazaar - Bottom Left Carpet Slot 3": 0xEB112F, + "Scaraba Bazaar - Bottom Left Carpet Slot 4": 0xEB1130, + "Scaraba Bazaar - Bottom Left Carpet Slot 5": 0xEB1131, + "Scaraba Bazaar - Bottom Left Carpet Slot 6": 0xEB1132, + + "Scaraba Hotel - Arms Dealer Slot 1": 0xEB1134, + "Scaraba Hotel - Arms Dealer Slot 2": 0xEB1135, + "Scaraba Hotel - Arms Dealer Slot 3": 0xEB1136, + "Scaraba Hotel - Arms Dealer Slot 4": 0xEB1137, + + "Deep Darkness - Businessman Slot 1": 0xEB113B, + "Deep Darkness - Businessman Slot 2": 0xEB113C, + "Deep Darkness - Businessman Slot 3": 0xEB113D, + "Deep Darkness - Businessman Slot 4": 0xEB113E, + "Deep Darkness - Businessman Slot 5": 0xEB113F, + "Deep Darkness - Businessman Slot 6": 0xEB1140, + "Deep Darkness - Businessman Slot 7": 0xEB1141, + + "Saturn Valley Shop - Post-Belch Saturn Slot 1": 0xEB1157, + "Saturn Valley Shop - Post-Belch Saturn Slot 2": 0xEB1158, + "Saturn Valley Shop - Post-Belch Saturn Slot 3": 0xEB1159, + "Saturn Valley Shop - Post-Belch Saturn Slot 4": 0xEB115A, + + "Scaraba - Southern Camel Shop Slot 1": 0xEB115E, + "Scaraba - Southern Camel Shop Slot 2": 0xEB115F, + "Scaraba - Southern Camel Shop Slot 3": 0xEB1160, + "Scaraba - Southern Camel Shop Slot 4": 0xEB1161, + "Scaraba - Southern Camel Shop Slot 5": 0xEB1162, + "Scaraba - Southern Camel Shop Slot 6": 0xEB1163, + "Scaraba - Southern Camel Shop Slot 7": 0xEB1164, + + "Deep Darkness - Arms Dealer Slot 1": 0xEB1165, + "Deep Darkness - Arms Dealer Slot 2": 0xEB1166, + "Deep Darkness - Arms Dealer Slot 3": 0xEB1167, + "Deep Darkness - Arms Dealer Slot 4": 0xEB1168, + + "Lost Underworld - Tenda Camp Shop Slot 1": 0xEB116C, + "Lost Underworld - Tenda Camp Shop Slot 2": 0xEB116D, + "Lost Underworld - Tenda Camp Shop Slot 3": 0xEB116E, + "Lost Underworld - Tenda Camp Shop Slot 4": 0xEB116F, + "Lost Underworld - Tenda Camp Shop Slot 5": 0xEB1170, + "Lost Underworld - Tenda Camp Shop Slot 6": 0xEB1171, + "Lost Underworld - Tenda Camp Shop Slot 7": 0xEB1172, + + "Happy-Happy Village Drugstore - Left Counter Slot 1": 0xEB117A, + "Happy-Happy Village Drugstore - Left Counter Slot 2": 0xEB117B, + "Happy-Happy Village Drugstore - Left Counter Slot 3": 0xEB117C, + "Happy-Happy Village Drugstore - Left Counter Slot 4": 0xEB117D, + "Happy-Happy Village Drugstore - Left Counter Slot 5": 0xEB117E, + "Happy-Happy Village Drugstore - Left Counter Slot 6": 0xEB117F, + "Happy-Happy Village Drugstore - Left Counter Slot 7": 0xEB1180, + + "Grapefruit Falls - Hiker Shop Slot 1": 0xEB1181, + "Grapefruit Falls - Hiker Shop Slot 2": 0xEB1182, + "Grapefruit Falls - Hiker Shop Slot 3": 0xEB1183, + + "Saturn Valley Shop - Top Saturn Slot 1": 0xEB1188, + "Saturn Valley Shop - Top Saturn Slot 2": 0xEB1189, + "Saturn Valley Shop - Top Saturn Slot 3": 0xEB118A, + "Saturn Valley Shop - Top Saturn Slot 4": 0xEB118B, + "Saturn Valley Shop - Top Saturn Slot 5": 0xEB118C, + "Saturn Valley Shop - Top Saturn Slot 6": 0xEB118D, + "Saturn Valley Shop - Top Saturn Slot 7": 0xEB118E, + + "Dusty Dunes Drugstore - Left Shop Slot 1": 0xEB118F, # Force this slot to be a wet towel in monkey caves + "Dusty Dunes Drugstore - Left Shop Slot 2": 0xEB1190, + "Dusty Dunes Drugstore - Left Shop Slot 3": 0xEB1191, + "Dusty Dunes Drugstore - Left Shop Slot 4": 0xEB1192, + "Dusty Dunes Drugstore - Left Shop Slot 5": 0xEB1193, + "Dusty Dunes Drugstore - Left Shop Slot 6": 0xEB1194, + "Dusty Dunes Drugstore - Left Shop Slot 7": 0xEB1195, + + "Dusty Dunes - Mine Food Cart Slot 1": 0xEB1196, + "Dusty Dunes - Mine Food Cart Slot 2": 0xEB1197, + "Dusty Dunes - Mine Food Cart Slot 3": 0xEB1198, + "Dusty Dunes - Mine Food Cart Slot 4": 0xEB1199, + "Dusty Dunes - Mine Food Cart Slot 5": 0xEB119A, + "Dusty Dunes - Mine Food Cart Slot 6": 0xEB119B, + "Dusty Dunes - Mine Food Cart Slot 7": 0xEB119C, + + "Moonside Hotel - Shop Slot 1": 0xEB119D, + "Moonside Hotel - Shop Slot 2": 0xEB119E, + "Moonside Hotel - Shop Slot 3": 0xEB119F, + "Moonside Hotel - Shop Slot 4": 0xEB11A0, + "Moonside Hotel - Shop Slot 5": 0xEB11A1, + + "Dalaam Restaurant - Slot 1": 0xEB11A4, + "Dalaam Restaurant - Slot 2": 0xEB11A5, + "Dalaam Restaurant - Slot 3": 0xEB11A6, + "Dalaam Restaurant - Slot 4": 0xEB11A7, + + "Scaraba Bazaar - Delicacy Shop Slot 1": 0xEB11AB, + "Scaraba Bazaar - Delicacy Shop Slot 2": 0xEB11AC, + "Scaraba Bazaar - Delicacy Shop Slot 3": 0xEB11AD, + "Scaraba Bazaar - Delicacy Shop Slot 4": 0xEB11AE, + "Scaraba Bazaar - Delicacy Shop Slot 5": 0xEB11AF, + "Scaraba Bazaar - Delicacy Shop Slot 6": 0xEB11B0, + "Scaraba Bazaar - Delicacy Shop Slot 7": 0xEB11B1, + + "Twoson/Scaraba - Shared Condiment Shop Slot 1": 0xEB11B2, + "Twoson/Scaraba - Shared Condiment Shop Slot 2": 0xEB11B3, + "Twoson/Scaraba - Shared Condiment Shop Slot 3": 0xEB11B4, + "Twoson/Scaraba - Shared Condiment Shop Slot 4": 0xEB11B5, + "Twoson/Scaraba - Shared Condiment Shop Slot 5": 0xEB11B6, + "Twoson/Scaraba - Shared Condiment Shop Slot 6": 0xEB11B7, + "Twoson/Scaraba - Shared Condiment Shop Slot 7": 0xEB11B8, + + # Make sure this shop uses the earlier one + "Andonuts Lab - Caveman Shop Slot 1": 0xEB11C0, + "Andonuts Lab - Caveman Shop Slot 2": 0xEB11C1, + "Andonuts Lab - Caveman Shop Slot 3": 0xEB11C2, + "Andonuts Lab - Caveman Shop Slot 4": 0xEB11C3, + "Andonuts Lab - Caveman Shop Slot 5": 0xEB11C4 +} + + +location_groups = { + "Poo's Inventory": { + "Poo - Starting Item" + }, + + "Northern Onett": { + "Onett - Tracy Gift", + "Onett - Tracy's Room Present", + "Onett - Meteor Item", + "Onett - Buzz Buzz", + "Onett - Mani Mani Statue", + "Onett - Hilltop Present" + }, + + "Onett": { + "Onett - Library Counter", + "Onett - Library Bookshelf", + "Onett - Burger Shop Trashcan", + "Onett - Treehouse Guy", + "Onett - South Road Present", + "Onett - Hotel Trashcan", + "Onett - Mayor Pirkle", + "Onett - Traveling Entertainer", + "Onett - Arcade Trashcan", + "Onett Drugstore - Right Counter Slot 1", + "Onett Drugstore - Right Counter Slot 2", + "Onett Drugstore - Right Counter Slot 3", + "Onett Drugstore - Right Counter Slot 4", + "Onett Drugstore - Right Counter Slot 5", + "Onett Drugstore - Left Counter", + "Onett Burger Shop - Slot 1", + "Onett Burger Shop - Slot 2", + "Onett Burger Shop - Slot 3", + "Onett Burger Shop - Slot 4", + "Onett Bakery - Slot 1", + "Onett Bakery - Slot 2", + "Onett Bakery - Slot 3", + "Onett Bakery - Slot 4" + }, + + "Giant Step": { + "Giant Step - First Cave Present", + "Giant Step - Floor 2 Cave Present", + "Giant Step - Floor 3 Present" + }, + + "Twoson": { + "Twoson - Bike Shop Rental", + "Twoson - Antique Shop", + "Twoson - Paula's Room Present", + "Twoson - Apple Kid Trashcan", + "Twoson - South of Town Present", + "Twoson - Orange Kid Donation", + "Twoson - Apple Kid Invention", + "Twoson - Apple Kid's Mouse", + "Twoson - Paula's Mother", + "Twoson - Everdred Meeting", + "Twoson - Insignificant Location", + "Twoson Department Store Burger Shop - Slot 1", + "Twoson Department Store Burger Shop - Slot 2", + "Twoson Department Store Burger Shop - Slot 3", + "Twoson Department Store Burger Shop - Slot 4", + "Twoson Department Store Bakery - Slot 1", + "Twoson Department Store Bakery - Slot 2", + "Twoson Department Store Bakery - Slot 3", + "Twoson Department Store Bakery - Slot 4", + "Twoson Department Store Top Floor - Right Counter Slot 1", + "Twoson Department Store Top Floor - Right Counter Slot 2", + "Twoson Department Store Top Floor - Right Counter Slot 3", + "Twoson Department Store Top Floor - Right Counter Slot 4", + "Twoson Department Store Top Floor - Right Counter Slot 5", + "Twoson Department Store Top Floor - Right Counter Slot 6", + "Twoson Department Store Top Floor - Left Counter Slot 1", + "Twoson Department Store Top Floor - Left Counter Slot 2", + "Twoson/Scaraba - Shared Condiment Shop Slot 1", + "Twoson/Scaraba - Shared Condiment Shop Slot 2", + "Twoson/Scaraba - Shared Condiment Shop Slot 3", + "Twoson/Scaraba - Shared Condiment Shop Slot 4", + "Twoson/Scaraba - Shared Condiment Shop Slot 5", + "Twoson/Scaraba - Shared Condiment Shop Slot 6", + "Twoson/Scaraba - Shared Condiment Shop Slot 7" + }, + + "Peaceful Rest Valley": { + "Peaceful Rest Valley - Split Hill Present", + "Peaceful Rest Valley - Hill Nook Present", + "Peaceful Rest Valley - South of Bridge Present", + "Peaceful Rest Valley - Dead End Present", + "Peaceful Rest Valley - River Overlook Present", + "Peaceful Rest Valley - North Side Present" + }, + + "Happy-Happy Village": { + "Happy-Happy Village - Donation Lady", + "Happy-Happy Village - Prisoner Item", + "Happy-Happy Village - Prisoner", + "Happy-Happy Village Drugstore - Right Counter Slot 1", + "Happy-Happy Village Drugstore - Right Counter Slot 2", + "Happy-Happy Village Drugstore - Right Counter Slot 3", + "Happy-Happy Village Drugstore - Right Counter Slot 4", + "Happy-Happy Village Drugstore - Right Counter Slot 5", + "Happy-Happy Village Drugstore - Left Counter Slot 1", + "Happy-Happy Village Drugstore - Left Counter Slot 2", + "Happy-Happy Village Drugstore - Left Counter Slot 3", + "Happy-Happy Village Drugstore - Left Counter Slot 4", + "Happy-Happy Village Drugstore - Left Counter Slot 5", + "Happy-Happy Village Drugstore - Left Counter Slot 6", + "Happy-Happy Village Drugstore - Left Counter Slot 7" + }, + + "the Happy-Happy HQ": { + "Happy-Happy Village - Right HQ Present", + "Happy-Happy Village - Left HQ Present", + "Happy-Happy Village - Defeat Carpainter" + }, + + "Lilliput Steps": { + "Lilliput Steps - Southwest Pool Present", + "Lilliput Steps - East Cliff Present", + "Lilliput Steps - North Stream Present" + }, + + "Threed": { + "Threed - Boogey Tent Trashcan", + "Threed - Cemetery Trashcan", + "Threed - Downtown Trashcan", + "Threed - East Side Trashcan", + "Threed - Northeast Shack Trashcan", + "Threed - Hospital Drawer", + "Threed - Zombie Prisoner", + "Threed Drugstore - Right Counter Slot 1", + "Threed Drugstore - Right Counter Slot 2", + "Threed Drugstore - Right Counter Slot 3", + "Threed Drugstore - Right Counter Slot 4", + "Threed Drugstore - Right Counter Slot 5", + "Threed Drugstore - Left Counter Slot 1", + "Threed Drugstore - Left Counter Slot 2", + "Threed Drugstore - Left Counter Slot 3", + "Threed Drugstore - Left Counter Slot 4", + "Threed Drugstore - Left Counter Slot 5", + "Threed - Arms Dealer Slot 1", + "Threed - Arms Dealer Slot 2", + "Threed - Arms Dealer Slot 3", + "Threed - Arms Dealer Slot 4", + "Threed Bakery - Slot 1", + "Threed Bakery - Slot 2", + "Threed Bakery - Slot 3", + "Threed Bakery - Slot 4", + "Threed Bakery - Slot 5", + "Threed Bakery - Slot 6", + "Threed Bakery - Slot 7" + }, + + "the Threed Underground Passage": { + "Threed Underground - Left Coffin", + "Threed Underground - Right Coffin" + }, + + "Grapefruit Falls": { + "Grapefruit Falls - South Present", + "Grapefruit Falls - North Present", + "Grapefruit Falls - Saturn Cave Present", + "Grapefruit Falls - Hiker Shop Slot 1", + "Grapefruit Falls - Hiker Shop Slot 2", + "Grapefruit Falls - Hiker Shop Slot 3" + }, + + "Saturn Valley": { + "Saturn Valley - Ladder Present", + "Saturn Valley - Trashcan #1", + "Saturn Valley - Trashcan #2", + "Saturn Valley - Trashcan #3", + "Saturn Valley - Saturn Coffee", + "Saturn Valley - Post Belch Gift #1", + "Saturn Valley - Post Belch Gift #2", + "Saturn Valley - Post Belch Gift #3", + "Saturn Valley Shop - Center Saturn Slot 1", + "Saturn Valley Shop - Center Saturn Slot 2", + "Saturn Valley Shop - Center Saturn Slot 3", + "Saturn Valley Shop - Center Saturn Slot 4", + "Saturn Valley Shop - Center Saturn Slot 5", + "Saturn Valley Shop - Top Saturn Slot 1", + "Saturn Valley Shop - Top Saturn Slot 2", + "Saturn Valley Shop - Top Saturn Slot 3", + "Saturn Valley Shop - Top Saturn Slot 4", + "Saturn Valley Shop - Top Saturn Slot 5", + "Saturn Valley Shop - Top Saturn Slot 6", + "Saturn Valley Shop - Top Saturn Slot 7", + "Saturn Valley Shop - Post-Belch Saturn Slot 1", + "Saturn Valley Shop - Post-Belch Saturn Slot 2", + "Saturn Valley Shop - Post-Belch Saturn Slot 3", + "Saturn Valley Shop - Post-Belch Saturn Slot 4" + }, + + "Milky Well": { + "Milky Well - Cavern Present" # this is a very good location group :^) + }, + + "Belch's Factory": { + "Belch's Factory - Top Right Room Trashcan", + "Belch's Factory - Pit Room Trashcan #1", + "Belch's Factory - Pit Room Trashcan #2", + "Belch's Factory - Balcony Room Trashcan #1", + "Belch's Factory - Balcony Room Trashcan #2", + "Belch's Factory - Balcony Room Trashcan #3" + }, + + "Dusty Dunes Desert": { + "Dusty Dunes - Northwest Corner Present", + "Dusty Dunes - South Side Present", + "Dusty Dunes - Surrounding Rocks Present", + "Dusty Dunes - Black Sesame Present", + "Dusty Dunes - Oasis Present", + "Dusty Dunes - Northeast Corner Present", + "Dusty Dunes - North Central Present", + "Dusty Dunes - Shining Spot", + "Dusty Dunes - East Peninsula Present", + "Dusty Dunes - Mine Reward", + "Dusty Dunes Drugstore - Left Shop Slot 1", + "Dusty Dunes Drugstore - Left Shop Slot 2", + "Dusty Dunes Drugstore - Left Shop Slot 3", + "Dusty Dunes Drugstore - Left Shop Slot 4", + "Dusty Dunes Drugstore - Left Shop Slot 5", + "Dusty Dunes Drugstore - Left Shop Slot 6", + "Dusty Dunes Drugstore - Left Shop Slot 7", + "Dusty Dunes - Mine Food Cart Slot 1", + "Dusty Dunes - Mine Food Cart Slot 2", + "Dusty Dunes - Mine Food Cart Slot 3", + "Dusty Dunes - Mine Food Cart Slot 4", + "Dusty Dunes - Mine Food Cart Slot 5", + "Dusty Dunes - Mine Food Cart Slot 6", + "Dusty Dunes - Mine Food Cart Slot 7", + "Dusty Dunes Drugstore - Counter Slot 1", + "Dusty Dunes Drugstore - Counter Slot 2", + "Dusty Dunes Drugstore - Counter Slot 3", + "Dusty Dunes Drugstore - Counter Slot 4", + "Dusty Dunes Drugstore - Counter Slot 5", + "Dusty Dunes - Arms Dealer Slot 1", + "Dusty Dunes - Arms Dealer Slot 2", + "Dusty Dunes - Arms Dealer Slot 3", + "Dusty Dunes - Arms Dealer Slot 4" + }, + + "the Snow Wood locker room": { + "Snow Wood - Upper Right Locker", + "Snow Wood - Upper Left Locker", + "Snow Wood - Bottom Right Locker", + "Snow Wood - Bottom Left Locker" + }, + + "Snow Wood Boarding School": { + "Snow Wood - Many Present Room Present #1", + "Snow Wood - Many Present Room Present #2", + "Snow Wood - Many Present Room Present #3", + "Snow Wood - Many Present Room Present #4", + "Snow Wood - Many Present Room Present #5", + "Snow Wood - Many Present Room Present #6", + "Snow Wood - Many Present Room Present #7", + "Snow Wood - Maxwell Item", + "Snow Wood - Bedroom", + "Snow Wood - Upper Right Locker", + "Snow Wood - Upper Left Locker", + "Snow Wood - Bottom Right Locker", + "Snow Wood - Bottom Left Locker" + }, + + "Winters": { + "Winters - Drugstore Saleswoman", + "Winters Drugstore - Slot 1", + "Winters Drugstore - Slot 2", + "Winters Drugstore - Slot 3", + "Winters Drugstore - Slot 4", + "Winters Drugstore - Slot 5", + "Winters Drugstore - Slot 6", + "Winters Drugstore - Slot 7" + }, + + "the Brick Road Maze": { + "Brick Road Maze - Top Path Present", + "Brick Road Maze - Guarded Present", + "Brick Road Maze - Out of the Way Present", + "Brick Road Maze - Alcove Present", + "Brick Road Maze - Near Exit Present" + }, + + "Rainy Circle": { + "Rainy Circle - Isolated Present", + "Rainy Circle - East Cliff Present", + "Rainy Circle - Near Ropes Present" + }, + + "Dr. Andonuts's Lab": { + "Andonuts Lab - Present", + "Andonuts Lab - Mouse", + "Andonuts Lab - Caveman Shop Slot 1", + "Andonuts Lab - Caveman Shop Slot 2", + "Andonuts Lab - Caveman Shop Slot 3", + "Andonuts Lab - Caveman Shop Slot 4", + "Andonuts Lab - Caveman Shop Slot 5" + }, + + "Stonehenge Maze Area": { + "Stonehenge - Purple Maze Present", + "Stonehenge - Dead End Present", + "Stonehenge - Near End of the Maze Present" + }, + + "Stonehenge Bridge Area": { + "Stonehenge - Bridge Room East Balcony Present", + "Stonehenge - Bridge Room Lower Present" + }, + + "Stonehenge Flashing Area": { + "Stonehenge - Flashing Room Right Path Present", + "Stonehenge - Flashing Room Center Present", + "Stonehenge - Flashing Room Upper Present" + }, + + "Stonehenge Tube Room": { + "Stonehenge - Kidnapped Mr. Saturn", + "Stonehenge - Tony Item" + }, + + "Gold Mine 1F": { + "Gold Mine - Mouse Crossroad Present #1", + "Gold Mine - Mouse Crossroad Present #2", + "Gold Mine - South Hall Present", + "Gold Mine - South Corner Present", + "Gold Mine - South Mole Present #1", + "Gold Mine - South Mole Present #2", + "Gold Mine - North Crossroad Detour Present", + "Gold Mine - North Mole Present", + "Gold Mine - West Mole Present", + "Gold Mine - West Crossroad Detour Present" + + }, + + "Gold Mine B1F": { + "Gold Mine - B1F Lonely Mole Present", + "Gold Mine - B1F Isolated Present", + "Gold Mine - B1F Junction Present", + "Gold Mine - B1F Junction Mole Present" + + }, + + "Monkey Caves West Wing": { + "Monkey Caves - 1F Left Chest", + "Monkey Caves - West 2F Left Chest", + "Monkey Caves - West 2F Right Chest #1", + "Monkey Caves - West 2F Right Chest #2", + "Monkey Caves - West End Chest", + "Monkey Caves - West End Trashcan", + + + }, + + "Monkey Caves East Wing": { + "Monkey Caves - 1F Right Chest", + "Monkey Caves - East 2F Left Chest", + "Monkey Caves - East 2F Right Chest", + "Monkey Caves - East West 3F Right Chest #1", + "Monkey Caves - East West 3F Right Chest #2", + "Monkey Caves - East End Chest", + "Monkey Caves - East End Trashcan", + "Monkey Caves - Bow Monkey Gift" + + }, + + "Monkey Caves Talah Rama Room": { + "Monkey Caves - Talah Rama Chest #1", + "Monkey Caves - Talah Rama Chest #2", + "Monkey Caves - Talah Rama Gift", + "Monkey Caves - Monkey Power" + + }, + + "Fourside": { + "Fourside - Venus Gift", + "Fourside - Bakery 2F Gift", + "Fourside - Department Store Blackout", + "Fourside Department Store - Tool Shop Slot 1", + "Fourside Department Store - Tool Shop Slot 2", + "Fourside Department Store - Tool Shop Slot 3", + "Fourside Department Store - Tool Shop Slot 4", + "Fourside Department Store - Tool Shop Slot 5", + "Fourside Department Store - Tool Shop Slot 6", + "Fourside Department Store - Tool Shop Slot 7", + "Fourside Department Store - Shop Shop Slot 1", + "Fourside Department Store - Shop Shop Slot 2", + "Fourside Department Store - Shop Shop Slot 3", + "Fourside Department Store - Shop Shop Slot 4", + "Fourside Department Store - Food Shop Slot 1", + "Fourside Department Store - Food Shop Slot 2", + "Fourside Department Store - Food Shop Slot 3", + "Fourside Department Store - Food Shop Slot 4", + "Fourside Department Store - Food Shop Slot 5", + "Fourside Department Store - 2F Cart Slot 1", + "Fourside Department Store - 2F Cart Slot 2", + "Fourside Department Store - 2F Cart Slot 3", + "Fourside Department Store - 2F Cart Slot 4", + "Fourside Department Store - 2F Cart Slot 5", + "Fourside Department Store - 2F Cart Slot 6", + "Fourside Department Store - 2F Cart Slot 7", + "Fourside Department Store - Toys Shop Slot 1", + "Fourside Department Store - Toys Shop Slot 2", + "Fourside Department Store - Toys Shop Slot 3", + "Fourside Department Store - Toys Shop Slot 4", + "Fourside Department Store - Toys Shop Slot 5", + "Fourside Department Store - Toys Shop Slot 6", + "Fourside Department Store - Sports Shop Slot 1", + "Fourside Department Store - Sports Shop Slot 2", + "Fourside Department Store - Sports Shop Slot 3", + "Fourside Department Store - Sports Shop Slot 4", + "Fourside Department Store - Burger Shop Slot 1", + "Fourside Department Store - Burger Shop Slot 2", + "Fourside Department Store - Burger Shop Slot 3", + "Fourside Department Store - Burger Shop Slot 4", + "Fourside Department Store - Burger Shop Slot 5", + "Fourside Department Store - Arms Dealer Slot 1", + "Fourside Department Store - Arms Dealer Slot 2", + "Fourside Department Store - Arms Dealer Slot 3", + "Fourside Department Store - Arms Dealer Slot 4", + "Fourside Department Store - Arms Dealer Slot 5", + "Fourside - Northeast Alley Junk Shop Slot 1", + "Fourside - Northeast Alley Junk Shop Slot 2", + "Fourside - Northeast Alley Junk Shop Slot 3", + "Fourside - Northeast Alley Junk Shop Slot 4", + "Fourside Bakery - Slot 1", + "Fourside Bakery - Slot 2", + "Fourside Bakery - Slot 3", + "Fourside Bakery - Slot 4", + "Fourside Bakery - Slot 5", + "Fourside Bakery - Slot 6" + }, + + "Moonside": { + "Moonside - Two Trees Present", + "Moonside - East Island Present", + "Moonside - Businessman Present", + "Moonside - West Island Present", + "Moonside - Hospital Present", + "Fourside - Post-Moonside Delivery", + "Moonside Hotel - Shop Slot 1", + "Moonside Hotel - Shop Slot 2", + "Moonside Hotel - Shop Slot 3", + "Moonside Hotel - Shop Slot 4", + "Moonside Hotel - Shop Slot 5" + + }, + + "Magnet Hill": { + "Magnet Hill - West Entrance Trashcan", + "Magnet Hill - First Room Free Door Trashcan", + "Magnet Hill - First Room Barrel Door Trashcan", + "Magnet Hill - Second Room Dead End Trashcan", + "Magnet Hill - Final Room Door Trashcan", + "Fourside - Magnet Hill Chest" + + }, + + "Monotoli Building": { + "Monotoli Building - One Table Present", + "Monotoli Building - Two Table Present", + "Monotoli Building - Electra Gift", + "Monotoli Building - Monotoli Gift", + "Monotoli Building - Monotoli Character" + + }, + + "Summers": { + "Summers - Museum Item", + "Summers - Magic Cake", + "Summers - Beach Cart", + "Summers - Magic Cake Cart Shop Slot", + "Summers - Scam Shop Slot 1", + "Summers - Scam Shop Slot 2", + "Summers - Scam Shop Slot 3", + "Summers - Scam Shop Slot 4", + "Summers - Scam Shop Slot 5", + "Summers - Scam Shop Slot 6", + "Summers - Scam Shop Slot 7", + "Summers Harbor - Shop Slot 1", + "Summers Harbor - Shop Slot 2", + "Summers Harbor - Shop Slot 3", + "Summers Harbor - Shop Slot 4", + "Summers Harbor - Shop Slot 5", + "Summers Harbor - Shop Slot 6", + "Summers Harbor - Shop Slot 7", + "Summers Restaurant - Slot 1", + "Summers Restaurant - Slot 2", + "Summers Restaurant - Slot 3", + "Summers Restaurant - Slot 4", + "Summers Restaurant - Slot 5", + "Summers Restaurant - Slot 6" + }, + + "Dalaam": { + "Dalaam - Throne Room Chest #1", + "Dalaam - Throne Room Chest #2", + "Dalaam - Throne Room Chest #3", + "Dalaam - Trial of Mu", + "Dalaam - Restaurant Chest #1", + "Dalaam - Restaurant Chest #2", + "Dalaam - Do Do Guy's House Chest", + "Dalaam - Upper House Chest", + "Dalaam - Throne Character", + "Dalaam Restaurant - Slot 1", + "Dalaam Restaurant - Slot 2", + "Dalaam Restaurant - Slot 3", + "Dalaam Restaurant - Slot 4" + + }, + + "Pink Cloud": { + "Pink Cloud - Three Holes Present", + "Pink Cloud - Left Hole Present", + "Pink Cloud - Ground Floor Present" + }, + + "Scaraba": { + "Scaraba - Snake Bag Salesman", + "Scaraba - Star Master", + "Scaraba - Key Holder", + "Twoson/Scaraba - Shared Condiment Shop Slot 1", + "Twoson/Scaraba - Shared Condiment Shop Slot 2", + "Twoson/Scaraba - Shared Condiment Shop Slot 3", + "Twoson/Scaraba - Shared Condiment Shop Slot 4", + "Twoson/Scaraba - Shared Condiment Shop Slot 5", + "Twoson/Scaraba - Shared Condiment Shop Slot 6", + "Twoson/Scaraba - Shared Condiment Shop Slot 7", + "Scaraba - Expensive Water Guy", + "Scaraba - Indoors Shop Slot 1", + "Scaraba - Indoors Shop Slot 2", + "Scaraba - Indoors Shop Slot 3", + "Scaraba - Indoors Shop Slot 4", + "Scaraba - Indoors Shop Slot 5", + "Scaraba - Indoors Shop Slot 6", + "Scaraba Hotel - Arms Dealer Slot 1", + "Scaraba Hotel - Arms Dealer Slot 2", + "Scaraba Hotel - Arms Dealer Slot 3", + "Scaraba Hotel - Arms Dealer Slot 4", + "Scaraba - Southern Camel Shop Slot 1", + "Scaraba - Southern Camel Shop Slot 2", + "Scaraba - Southern Camel Shop Slot 3", + "Scaraba - Southern Camel Shop Slot 4", + "Scaraba - Southern Camel Shop Slot 5", + "Scaraba - Southern Camel Shop Slot 6", + "Scaraba - Southern Camel Shop Slot 7" + }, + + "the Pyramid": { + "Pyramid - Anteroom Sarcophagus", + "Pyramid - Northwest Door Sarcophagus", + "Pyramid - Hallway Sarcophagus #1", + "Pyramid - Hallway Sarcophagus #2", + "Pyramid - Switch Room Sarcophagus", + "Pyramid - Pedestal Item", + "Pyramid - Way Out Sarcophagus" + }, + + "Dungeon Man 1F": { + "Dungeon Man - 1F Dead End Present", + "Dungeon Man - 1F Long Walk Present", + "Dungeon Man - 1F Disappointing Present", + "Dungeon Man - 1F Opinion Present", + "Dungeon Man - 1F No Sign Present", + "Dungeon Man - 1F Exit Ledge Present" + }, + + "Dungeon Man 2F": { + "Dungeon Man - 2F Unnecessary Billboard Present", + "Dungeon Man - 2F Dungeon Exploration Present", + "Dungeon Man - 2F South Ledge Present", + "Dungeon Man - 2F North Alcove Present", + "Dungeon Man - 2F Hole Present" + }, + + "Dungeon Man 3F": { + "Dungeon Man - 3F Present" + }, + + "Deep Darkness": { + "Deep Darkness - Teleporting Monkey", + "Deep Darkness - Crest of Darkness Present", + "Deep Darkness - Helicopter Present", + "Deep Darkness - Yellow Bird Present", + "Deep Darkness - Swamp Present", + "Deep Darkness - Corner Present", + "Deep Darkness - Alcove Present", + "Deep Darkness - Barf Character", + "Deep Darkness - Businessman Slot 1", + "Deep Darkness - Businessman Slot 2", + "Deep Darkness - Businessman Slot 3", + "Deep Darkness - Businessman Slot 4", + "Deep Darkness - Businessman Slot 5", + "Deep Darkness - Businessman Slot 6", + "Deep Darkness - Businessman Slot 7", + "Deep Darkness - Arms Dealer Slot 1", + "Deep Darkness - Arms Dealer Slot 2", + "Deep Darkness - Arms Dealer Slot 3", + "Deep Darkness - Arms Dealer Slot 4" + }, + + "Deep Darkness Truffles": { + "Deep Darkness - North Alcove Truffle", + "Deep Darkness - Near Land Truffle", + "Deep Darkness - Present Truffle", + "Deep Darkness - Village Truffle", + "Deep Darkness - Entrance Truffle" + }, + + "Tenda Village": { + "Tenda Village - Trashcan", + "Tenda Village - Tenda Tea", + "Tenda Village - Tenda Gift", + "Tenda Village - Tenda Gift #2" + }, + + "Lumine Hall 1F": { + "Lumine Hall - 1F North Path Present", + "Lumine Hall - 1F Above Belly Button Present", + "Lumine Hall - 1F Near Exit Present", + "Lumine Hall - 1F Dead End Present" + }, + + "Lumine Hall B1F": { + "Lumine Hall - B1F Non-Talkative Rock Present", + "Lumine Hall - B1F Thankful Rock Corner Present", + "Lumine Hall - B1F Thankful Rock Junction Present", + "Lumine Hall - B1F Belly Button Present", + "Lumine Hall - B1F West Alcove Present" + }, + + "Lost Underworld": { + "Lost Underworld - Talking Rock", + "Lost Underworld - East Present", + "Lost Underworld - Northeast Present", + "Lost Underworld - Northeast of Tenda Tribe Present", + "Lost Underworld - Southwest of Tenda Tribe Present", + "Lost Underworld - Evacuation Present", + "Lost Underworld - Tenda Camp Shop Slot 1", + "Lost Underworld - Tenda Camp Shop Slot 2", + "Lost Underworld - Tenda Camp Shop Slot 3", + "Lost Underworld - Tenda Camp Shop Slot 4", + "Lost Underworld - Tenda Camp Shop Slot 5", + "Lost Underworld - Tenda Camp Shop Slot 6", + "Lost Underworld - Tenda Camp Shop Slot 7" + }, + + "Fire Spring": { + "Fire Spring - 1st Cave Present", + "Fire Spring - East Corner Present", + "Fire Spring - Volcano Present", + "Fire Spring - Lone Cave Present", + "Fire Spring - Upper Volcano Present" + }, + + "Magicant": { + "Magicant - Ness's Gift", + "Magicant - Present Near Ness", + "Magicant - Lonely Present", + "Magicant - North Present", + "Magicant - Hills Present", + "Magicant - Town Present", + "Magicant - Shop Slot 1", + "Magicant - Shop Slot 2" + }, + + + "Sea of Eden": { + "Magicant - Ness's Nightmare" + }, + + "Cave of the Present": { + "Cave of the Present - Star Master", + "Cave of the Present - Broken Phase Distorter" + }, + + "Cave of the Past": { + "Cave of the Past - Present" + }, + + "Burglin Park": { + "Burglin Park Junk Shop - Slot 1", + "Burglin Park Junk Shop - Slot 2", + "Burglin Park Junk Shop - Slot 3", + "Burglin Park Junk Shop - Slot 4", + "Burglin Park Junk Shop - Slot 5", + "Burglin Park Junk Shop - Slot 6", + "Burglin Park Bread Stand - Slot 1", + "Burglin Park Bread Stand - Slot 2", + "Burglin Park Bread Stand - Slot 3", + "Burglin Park Bread Stand - Slot 4", + "Burglin Park Bread Stand - Slot 5", + "Burglin Park Bread Stand - Slot 6", + "Burglin Park - Banana Stand", + "Twoson - Everdred Meeting", + "Twoson - Apple Kid Invention", + "Twoson/Scaraba - Shared Condiment Shop Slot 1", + "Twoson/Scaraba - Shared Condiment Shop Slot 2", + "Twoson/Scaraba - Shared Condiment Shop Slot 3", + "Twoson/Scaraba - Shared Condiment Shop Slot 4", + "Twoson/Scaraba - Shared Condiment Shop Slot 5", + "Twoson/Scaraba - Shared Condiment Shop Slot 6", + "Twoson/Scaraba - Shared Condiment Shop Slot 7" + }, + + "the Scaraba Bazaar": { + "Scaraba Bazaar - Delicacy Shop Slot 1", + "Scaraba Bazaar - Delicacy Shop Slot 2", + "Scaraba Bazaar - Delicacy Shop Slot 3", + "Scaraba Bazaar - Delicacy Shop Slot 4", + "Scaraba Bazaar - Delicacy Shop Slot 5", + "Scaraba Bazaar - Delicacy Shop Slot 6", + "Scaraba Bazaar - Delicacy Shop Slot 7", + "Twoson/Scaraba - Shared Condiment Shop Slot 1", + "Twoson/Scaraba - Shared Condiment Shop Slot 2", + "Twoson/Scaraba - Shared Condiment Shop Slot 3", + "Twoson/Scaraba - Shared Condiment Shop Slot 4", + "Twoson/Scaraba - Shared Condiment Shop Slot 5", + "Twoson/Scaraba - Shared Condiment Shop Slot 6", + "Twoson/Scaraba - Shared Condiment Shop Slot 7", + "Scaraba Bazaar - Red Snake Carpet Slot 1", + "Scaraba Bazaar - Red Snake Carpet Slot 2", + "Scaraba Bazaar - Red Snake Carpet Slot 3", + "Scaraba Bazaar - Bottom Left Carpet Slot 1", + "Scaraba Bazaar - Bottom Left Carpet Slot 2", + "Scaraba Bazaar - Bottom Left Carpet Slot 3", + "Scaraba Bazaar - Bottom Left Carpet Slot 4", + "Scaraba Bazaar - Bottom Left Carpet Slot 5", + "Scaraba Bazaar - Bottom Left Carpet Slot 6" + }, + + "the Twoson Department Store": { + "Twoson Department Store Burger Shop - Slot 1", + "Twoson Department Store Burger Shop - Slot 2", + "Twoson Department Store Burger Shop - Slot 3", + "Twoson Department Store Burger Shop - Slot 4", + "Twoson Department Store Bakery - Slot 1", + "Twoson Department Store Bakery - Slot 2", + "Twoson Department Store Bakery - Slot 3", + "Twoson Department Store Bakery - Slot 4", + "Twoson Department Store Top Floor - Right Counter Slot 1", + "Twoson Department Store Top Floor - Right Counter Slot 2", + "Twoson Department Store Top Floor - Right Counter Slot 3", + "Twoson Department Store Top Floor - Right Counter Slot 4", + "Twoson Department Store Top Floor - Right Counter Slot 5", + "Twoson Department Store Top Floor - Right Counter Slot 6", + "Twoson Department Store Top Floor - Left Counter Slot 1", + "Twoson Department Store Top Floor - Left Counter Slot 2" + }, + + "the Fourside Department Store": { + "Fourside Department Store - Tool Shop Slot 1", + "Fourside Department Store - Tool Shop Slot 2", + "Fourside Department Store - Tool Shop Slot 3", + "Fourside Department Store - Tool Shop Slot 4", + "Fourside Department Store - Tool Shop Slot 5", + "Fourside Department Store - Tool Shop Slot 6", + "Fourside Department Store - Tool Shop Slot 7", + "Fourside Department Store - Shop Shop Slot 1", + "Fourside Department Store - Shop Shop Slot 2", + "Fourside Department Store - Shop Shop Slot 3", + "Fourside Department Store - Shop Shop Slot 4", + "Fourside Department Store - Food Shop Slot 1", + "Fourside Department Store - Food Shop Slot 2", + "Fourside Department Store - Food Shop Slot 3", + "Fourside Department Store - Food Shop Slot 4", + "Fourside Department Store - Food Shop Slot 5", + "Fourside Department Store - 2F Cart Slot 1", + "Fourside Department Store - 2F Cart Slot 2", + "Fourside Department Store - 2F Cart Slot 3", + "Fourside Department Store - 2F Cart Slot 4", + "Fourside Department Store - 2F Cart Slot 5", + "Fourside Department Store - 2F Cart Slot 6", + "Fourside Department Store - 2F Cart Slot 7", + "Fourside Department Store - Toys Shop Slot 1", + "Fourside Department Store - Toys Shop Slot 2", + "Fourside Department Store - Toys Shop Slot 3", + "Fourside Department Store - Toys Shop Slot 4", + "Fourside Department Store - Toys Shop Slot 5", + "Fourside Department Store - Toys Shop Slot 6", + "Fourside Department Store - Sports Shop Slot 1", + "Fourside Department Store - Sports Shop Slot 2", + "Fourside Department Store - Sports Shop Slot 3", + "Fourside Department Store - Sports Shop Slot 4", + "Fourside Department Store - Burger Shop Slot 1", + "Fourside Department Store - Burger Shop Slot 2", + "Fourside Department Store - Burger Shop Slot 3", + "Fourside Department Store - Burger Shop Slot 4", + "Fourside Department Store - Burger Shop Slot 5", + "Fourside Department Store - Arms Dealer Slot 1", + "Fourside Department Store - Arms Dealer Slot 2", + "Fourside Department Store - Arms Dealer Slot 3", + "Fourside Department Store - Arms Dealer Slot 4", + "Fourside Department Store - Arms Dealer Slot 5", + "Fourside - Department Store Blackout" + }, + + "the Saturn Valley Shop": { + "Saturn Valley Shop - Center Saturn Slot 1", + "Saturn Valley Shop - Center Saturn Slot 2", + "Saturn Valley Shop - Center Saturn Slot 3", + "Saturn Valley Shop - Center Saturn Slot 4", + "Saturn Valley Shop - Center Saturn Slot 5", + "Saturn Valley Shop - Post-Belch Saturn Slot 1", + "Saturn Valley Shop - Post-Belch Saturn Slot 2", + "Saturn Valley Shop - Post-Belch Saturn Slot 3", + "Saturn Valley Shop - Post-Belch Saturn Slot 4", + "Saturn Valley Shop - Top Saturn Slot 1", + "Saturn Valley Shop - Top Saturn Slot 2", + "Saturn Valley Shop - Top Saturn Slot 3", + "Saturn Valley Shop - Top Saturn Slot 4", + "Saturn Valley Shop - Top Saturn Slot 5", + "Saturn Valley Shop - Top Saturn Slot 6", + "Saturn Valley Shop - Top Saturn Slot 7" + } +} diff --git a/worlds/earthbound/game_data/text_data.py b/worlds/earthbound/game_data/text_data.py new file mode 100644 index 0000000000..7ec7e856e3 --- /dev/null +++ b/worlds/earthbound/game_data/text_data.py @@ -0,0 +1,297 @@ +region_text = { + "Northern Onett": "Onett", + "Onett": "Onett", + "Giant Step": "Giant Step", + "Twoson": "Twoson", + "Peaceful Rest Valley": "Peaceful Rest Valley", + "Happy-Happy Village": "Happy-Happy Village", + "Lilliput Steps": "Lilliput Steps", + "Threed": "Threed", + "Belch's Factory": "Belch's factory", + "Saturn Valley": "Saturn Valley", + "Upper Saturn Valley": "Saturn Valley", + "Milky Well": "Milky Well", + "Dusty Dunes Desert": "the Dusty Dunes Desert", + "Gold Mine": "the gold mine", + "Monkey Caves": "the monkey caves", + "Fourside": "Fourside", + "Magnet Hill": "Fourside's sewers", + "Monotoli Building": "the Monotoli Building", + "Winters": "Winters", + "Snow Wood Boarding School": "the Snow Wood Boarding School", + "Southern Winters": "Winters", + "Rainy Circle": "Rainy Circle", + "Stonehenge Base": "Stonehenge", + "Summers": "Summers", + "Dalaam": "Dalaam", + "Pink Cloud": "Pink Cloud", + "Scaraba": "Scaraba", + "Pyramid": "the Pyramid", + "Southern Scaraba": "Scaraba", + "Dungeon Man": "Dungeon Man", + "Deep Darkness": "the Deep Darkness", + "Tenda Village": "Tenda Village", + "Lumine Hall": "Lumine Hall", + "Lost Underworld": "the Lost Underworld", + "Fire Spring": "Fire Spring", + "Magicant": "Magicant", + "Cave of the Present": "Cave of the Past", + "Cave of the Past": "Cave of the Past" +} + +barf_text = { + "Paula": [0xE0, 0xC2, 0xEE, 0xBD, 0xC3, 0xEE], + "Jeff": [0xFA, 0xC2, 0xEE, 0x10, 0xC4, 0xEE], + "Poo": [0x1A, 0x74, 0xEF, 0x3E, 0xC4, 0xEE], + "Flying Man": [0x17, 0xC3, 0xEE, 0x95, 0xC4, 0xEE], + "Ness": [0x16, 0x07, 0xF3, 0x2B, 0x07, 0xF3], + "Photograph": [0x2F, 0x99, 0xC9, 0x2F, 0x99, 0xC9] +} + +eb_text_table = {" ": ([0x50]), "!": ([0x51]), '"': ([0x52]), "■": ([0x53]), "$": ([0x54]), "%": ([0x55]), + "°": ([0x56]), "'": ([0x57]), "(": ([0x58]), ")": ([0x59]), "*": ([0x5A]), "+": ([0x5B]), + ",": ([0x5C]), "-": ([0x5D]), ".": ([0x5E]), "/": ([0x5F]), "0": ([0x60]), "1": ([0x61]), + "2": ([0x62]), "3": ([0x63]), "4": ([0x64]), "5": ([0x65]), "6": ([0x66]), "7": ([0x67]), + "8": ([0x68]), "9": ([0x69]), ":": ([0x6A]), ";": ([0x6B]), "“": ([0x6C]), "=": ([0x6D]), + "”": ([0x6E]), "?": ([0x6F]), "@": ([0x70]), "A": ([0x71]), "B": ([0x72]), "C": ([0x73]), + "D": ([0x74]), "E": ([0x75]), "F": ([0x76]), "G": ([0x77]), "H": ([0x78]), "I": ([0x79]), + "J": ([0x7A]), "K": ([0x7B]), "L": ([0x7C]), "M": ([0x7D]), "N": ([0x7E]), "O": ([0x7F]), + "P": ([0x80]), "Q": ([0x81]), "R": ([0x82]), "S": ([0x83]), "T": ([0x84]), "U": ([0x85]), + "V": ([0x86]), "W": ([0x87]), "X": ([0x88]), "Y": ([0x89]), "Z": ([0x8A]), "α": ([0x8B]), + "β": ([0x8C]), "γ": ([0x8D]), "Σ": ([0x8E]), "Ω": ([0x8F]), "a": ([0x91]), "b": ([0x92]), + "c": ([0x93]), "d": ([0x94]), "e": ([0x95]), "f": ([0x96]), "g": ([0x97]), "h": ([0x98]), + "i": ([0x99]), "j": ([0x9A]), "k": ([0x9B]), "l": ([0x9C]), "m": ([0x9D]), "n": ([0x9E]), + "o": ([0x9F]), "p": ([0xA0]), "q": ([0xA1]), "r": ([0xA2]), "s": ([0xA3]), "t": ([0xA4]), + "u": ([0xA5]), "v": ([0xA6]), "w": ([0xA7]), "x": ([0xA8]), "y": ([0xA9]), "z": ([0xAA]), + "[": ([0xAB]), "♪": ([0xAC]), "]": ([0xAD]), "~": ([0xAE]), "◯": ([0xAF]), "_": ([0xB0]), + "<": ([0xB1]), " ": ([0x90]), "&": ([0xB6]), "#": ([0xB7]), "\n": ([0x03, 0x00]), "ñ": ([0xB9]), + "ä": ([0xBA]), "é": ([0xBB])} +# 0x90 is a half-width space + +pixel_width_table = {" ": 2, "!": 2, '"': 3, "■": 2, "$": 5, "%": 9, + "°": 7, "'": 2, "(": 3, ")": 3, "*": 3, "+": 5, + ",": 2, "-": 2, ".": 2, "/": 4, "0": 5, "1": 5, + "2": 5, "3": 5, "4": 5, "5": 5, "6": 5, "7": 5, + "8": 5, "9": 5, ":": 2, ";": 3, "“": 3, "=": 5, + "”": 3, "?": 4, "@": 5, "A": 6, "B": 5, "C": 5, + "D": 5, "E": 4, "F": 4, "G": 5, "H": 5, "I": 1, + "J": 4, "K": 5, "L": 4, "M": 7, "N": 5, "O": 5, + "P": 5, "Q": 5, "R": 5, "S": 5, "T": 5, "U": 5, + "V": 6, "W": 7, "X": 5, "Y": 5, "Z": 4, "α": 5, + "β": 4, "γ": 6, "Σ": 4, "Ω": 5, "a": 4, "b": 4, + "c": 4, "d": 4, "e": 4, "f": 3, "g": 4, "h": 4, + "i": 1, "j": 2, "k": 4, "l": 1, "m": 7, "n": 4, + "o": 4, "p": 4, "q": 4, "r": 3, "s": 4, "t": 3, + "u": 4, "v": 5, "w": 7, "x": 4, "y": 4, "z": 4, + "[": 2, "♪": 5, "]": 2, "~": 6, "◯": 7, "_": 5, + "<": 4, " ": 1, "&": 6, "#": 6, "ñ": 6, "ä": 5, + "é": 5} + + +lumine_hall_text = [ + "You paid 350 bucks for this seed", + "You could be playing Mario is Missing!", + "youtu.be/dQw4w9WgXcQ", + "Please help I am in BK mode", + "But anyways, its not about the glitch, its not about that its a video game, its because you don't care about how this is affecting other people, your heartless, you can apparently live with yourself with this.", + "Do you still remember your pin? It's the price of a cheese pizza and and a large soda back where I used to work; Panucci's Pizza.", + "Did you remember to clear your sphere 1?", + "You should use a tracker, personally I recommend Poptracker", + "You should try Mario Is Missing AP, its fun and funny.", + "Despite everything, you're still you.", + "Bababooey", + "Reticulating Splines", + "You only have one shot.", + "human.. i remember you're genocides.", + '"May your woes be many, and your days few."', + "For you, the day Pokey graced your village was the most important day of your life. But for me, it was Tuesday.", + "To shreds you say?", + "Hey player, I'm in BK, can you get my item at Starman Super Drop Sword of Kings? It's my go mode.", + "Why did you make me do this? You're fighting so you can watch everyone around you die! Think, Player Name! You'll outlast every fragile, insignificant being on this planet.", + "Is this thing on? Testing. Oh hey, its me, Tony! Is Jeff doing okay? I worry about him a lot, and he's like, on my mind a lot. Maybe stop by Winters sometime! Pretty please?", + "If you have your club card, please scan it now.", + "Come on Reggie, give us MOTHER 3!", + "Growing up, Man I spent hours of my life stomping................................................................................................................................................ Koopas.", + "We've been trying to reach you about your car's extended warranty...", + "YOU MUST CONSTRUCT ADDITIONAL PYLONS!!!", + "It all start on the day the Happy Happyists attacked...", + "You just lost the game.", + "ERROR 404: HALL TEXT NOT FOUND.", + "Long ago, two races ruled over Earth: HUMANS and MONSTERS. One day, war broke out between the two races. After a long battle, the humans were victorious. They sealed the monsters underground with a magic spell.", + "Once upon a time, a LEGEND was whispered among shadows. It was a LEGEND of HOPE. It was a LEGEND of DREAMS. It was a LEGEND of LIGHT. It was a LEGEND of DARK.", + "OwO? What's This?", + "What about now it's time to rock with the Bickedy Buck Buzz Buzz! What about now it's time to rock with the Bickedy Buck Buzz Buzz! Bum to the bum to the bum to the bass to the bum to the boom to the Buzz Buzz!", + "HOW ARE YOU GENTLEMEN !! ALL YOUR BASE ARE BELONG TO US.", + "You're just the delivery boy. Sorry, your parts over now. Here, go play hero with this.", + "My friends are my power, and I'm theirs!", + "Did somebody mention the Door to Darkness?", + "We hope you'll be a great asset to the company. Great asset to the company. Asset-Great-Great-Asset to the Company.", + "So thanks, goat-bunny-cat lady.", + "It's dangerous to go alone, take this!", + "The rabbit virus got so happy that it exploded!!", + "Steve tried to swim in lava.", + "The flow of time is always cruel... its speed seems different for each person, but no one can change it... A thing that does not change with time is a memory of younger days...", + "Hah! You better have BURN HEAL!", + "..and so she left, heart still racing.", + "I've found you faker! Faker? I think you're the fake hedgehog around here. In fact, you're not even good enough be my fake. I'll make you eat those words!", + "Don't ask about Mother 3 AP.", + "Hello. This is Punk-Sure. I've been trying to reach you about your bicycle's extended warranty.", + "Who's that kid with blue hair whose name sounds like evil? Who suspiciously showed up to say we'd die like wretches? Surely HE'S not the bad guy, right? Nah, not when he has such a cool violin. Perish the thought!", + "I wonder if xfisjmg1 is going to release another Ninten Speaks video anytime soon?", + "weedle", + "hi", + "Look Ma, I'm in Lumine Hall!", + "Did you check Aginah?", + "Eat at Joe's", + "FOR A GOOD TIME, CALL 555-...", + "!hint Moon Pearl", + "'); DROP TABLE Lumine Hall Text;--", + "No, no! We can't! This baby is a demon child!", + "Rhydon Earthquake vs. Mr. Mime: 169-199 (59.7 - 70.3%) -- guaranteed 2HKO", + "Dakota", + "Ness, I am your father.", + "Hello, it's your dad. You've been out there for a long time now... It may be none of my business, but don't you think it would be a good idea if you took a break?", + "RIP AND TEAR", + "Sorry Ness, Pokey died of ligma", + "A horrible chill goes down your spine...", + "You feel an evil presence watching you...", + "Going to BK, BRB.", + "My favorite Mr. Saturn... It... cute... lovely... smart... plus... amazing... you think so? Hug it... when... sleeping... warm and cuddly... spectacular... ravishing... Oops! Look at the time! I kept you too long!", + "THE CLUMSY ROBOT IN NAME ONLY, FOR IT IS NEITHER.", + "The Arcana is the means by which all is revealed.", + "Say the password! ", + "Hello? Is there anybody in there? Just nod if you can hear me. Is there anyone home?", + "I bought my sneakers from a drug dealer in Fourside. I don't know what they were laced with but I've been tripping all day.", + "Sans Is Ness", + "Your Goal This Game: Join Happy Happyism", + "There's only junk items that way.", + "GET OUT WHILE YOU STILL CAN", + "Why isn't my SNI connecting?", + "It's 10 p.m. Do you know where your kids are?", + "If they censored what the adults were drinking to coffee, then what did Mr. Saturn give Ness originally?", + "Fourside Frappuccino. Work can wait.", + "Let's do an Archibald seed !", + "WARNING! Scheduled Maintenance in 4 Minutes...", + "I'm still stuck in BK", + "John Madden! John Madden! John Madden! John Madden! John Madden! John Madden! John Madden! ", + "Did you know that by reading this message you are wasting time not getting checks?", + "Your text here! Check the game's design thread on the Archipelago Server for how to submit!", + "WITNESS JOKE HERE", + "Also try The Witness!", + "Also try Adventure!", + "Also try DOOM 1993!", + "Also try Super Mario World!", + "Also try Yoshi's Island!", + "Also try Castlevania 64!", + "Hi Mom! I'm on AP!", + "Looking for hot multiworlds in your area?", + "Paleontologists do it in the dirt.", + "Wait... something seems off... Things seem more random than usual...", + "Shoutouts to SimpleFlips.", + "How long have you been BK?", + "Also try PK Scramble!", + "Also try Ancient Cave!", + "I am playing this on AP version 1.0 and it is amazing.", + "WHAT A HORRIBLE NIGHT TO HAVE A CURSE.", + "It's so jover", + "The National Weather Service has issued a severe thunderstorm warning for the following areas, starting at 7:49 PM Eastern Daylight Time and ending at 7:49 PM Eastern Daylight Time.", + "Where is everyone? I've done most of my checks and I still can't find my friends, it's so lonely here.", + "Can you hurry up and go to Ness's Nightmare it has my Morph Ball for my Super Metroid seed Thanks in advance Berserker", + "gottem", + "Dear Ness, please come to the house. I've baked a steak for you. Yours truly, mom.", + "Phar why", + "Tell Figment to check POD!", + "Congratulations, you're the Lumine Hall's 100th visitor! Click here for $2 off your next order at the Onett Burger Shop!", + "Well, that's never happened before...", + "99 bottles of DXWater on the wall, 99 bottles of DXWater. Take one down, pass it around, 98 bottles of DXWater on the wall!", + "After all these years. Finally, I have them all.", + "If there were two guys on the moon and one killed the other with a rock would that be screwed up or what", + "Help, I'm trapped in a Lumine Hall factory!", + "They say that Ice Palace can be found at Ice Palace...", + "Hey Mom, I'm in AP!", + "It says “gullible” on the wall", + "64 bits! 32 bits! 16 bits! 8 bits! 4 bits! 2 bits! 1 bit! Half bit! Quarter bit! THE WRIST GAME!!!", + "Where did YOU learn to teleport?", + "My statistics show about 70% of kids these days don't stop to read bulletin boards anymore. Well, I had to shell out a lot of money for this, but let's see you ignore THIS one, suckers! ...Brick Road", + "I'm Ness... I could go for a burger right about now... That girl from Twoson sure is cute... I wonder if I should ask her out on a date... W...wha...? What's...? H-HEY! These thoughts are PRIVATE!", + "Chris, when is Parasite Eve in AP?", + "Praise the Fool!", + "Am I the only one who likes Sonic Unleashed?" +] + +spoiler_psi = { + "Special": "PSI Rockin", + "Fire": "PSI Fire", + "Freeze": "PSI Freeze", + "Thunder": "PSI Thunder", + "Flash": "PSI Flash", + "Starstorm": "PSI Starstorm", + "Shield": "Shield", + "PSI Shield": "PSI Shield", + "Offense Up": "Offense up", + "Defense Down": "Defense down", + "Hypnosis": "Hypnosis", + "Paralysis": "Paralysis", + "Brainshock": "Brainshock", + "Blast": "PSI Blast", + "Missile": "PSI Missile", + "Stop": "Stop", + "Drain": "Drain", + "Defense up": "Defense up", + "Neutralize": "Neutralize", + "Disable": "Disable" +} + +spoiler_starts = [ + "Ness's House", + "Onett Downtown", + "Twoson", + "Happy-Happy Village", + "Threed", + "Saturn Valley", + "Fourside", + "Winters", + "Summers", + "Dalaam", + "Scaraba", + "Deep Darkness", + "Tenda Village", + "Lost Underworld", + "Magicant" +] + +spoiler_badges = { + "special": "Rockin", + "fire": "Fire", + "freeze": "Freeze", + "flash": "Flash", + "starstorm": "Starstorm", + "explosive": "Bomb", + "thunder": "Thunder", +} + + +def text_encoder(text: str, textcap: int) -> bytearray: + """Return an encoded bytearray of in-game text from a string. Unknown characters will be replaced with a ?. + textcap is the maximum allowed length of the text.""" + encoded_text = bytearray() + for char in text[:textcap]: + if char in eb_text_table: + encoded_text.extend(eb_text_table[char]) + else: + encoded_text.extend([0x6F]) + return encoded_text + + +def calc_pixel_width(text: str) -> int: + """Return the in-game width of a string. EarthBound uses a VWF, and some text strings + need to be shortened to fit within in-game menus.""" + width = 0 + for char in text: + if char in pixel_width_table: + width += pixel_width_table[char] + else: + width += 4 + width += 1 + width -= 1 + return width diff --git a/worlds/earthbound/gifting/__init__.py b/worlds/earthbound/gifting/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/earthbound/gifting/gift_tags.py b/worlds/earthbound/gifting/gift_tags.py new file mode 100644 index 0000000000..8aff19866e --- /dev/null +++ b/worlds/earthbound/gifting/gift_tags.py @@ -0,0 +1,606 @@ +from dataclasses import dataclass +from typing import List + +gift_qualities = { + "Super Plush Bear": {"MeatShield": 3}, + "Cracked Bat": {"Weapon": 0.07}, + "Tee Ball Bat": {"Weapon": 0.14}, + "Sand Lot Bat": {"Weapon": 0.27}, + "Minor League Bat": {"Weapon": 0.48}, + "Mr. Baseball Bat": {"Weapon": 0.70}, + "Big League Bat": {"Weapon": 0.90}, + "Hall of Fame Bat": {"Weapon": 1.14}, + "Magicant Bat": {"Weapon": 1.48}, + "Legendary Bat": {"Weapon": 2.03}, + "Gutsy Bat": {"Weapon": 4.0}, + "Casey Bat": {"Weapon": 0.1}, + "T-Rex's Bat": {"Weapon": 0.88}, + "Ultimate Bat": {"Weapon": 1.25}, + + "Fry Pan": {"Weapon": 0.24}, + "Thick Fry Pan": {"Weapon": 0.48}, + "Deluxe Fry Pan": {"Weapon": 0.73}, + "Chef's Fry Pan": {"Weapon": 0.97}, + "Non-Stick Frypan": {"Weapon": 1.19}, + "French Fry Pan": {"Weapon": 1.46}, + "Holy Fry Pan": {"Weapon": 1.90}, + "Magic Frypan": {"Weapon": 2.5}, + + "Pop Gun": {"Weapon": 0.25}, + "Stun Gun": {"Weapon": 0.34}, + "Toy Air Gun": {"Weapon": 0.50}, + "Magnum Air Gun": {"Weapon": 0.57}, + "Zip Gun": {"Weapon": 0.63}, + "Laser Gun": {"Weapon": 0.76}, + "Hyper Beam": {"Weapon": 0.92}, + "Double Beam": {"Weapon": 1.04}, + "Crusher Beam": {"Weapon": 1.14}, + "Spectrum Beam": {"Weapon": 1.24}, + "Death Ray": {"Weapon": 1.42}, + "Baddest Beam": {"Weapon": 1.55}, + "Moon Beam Gun": {"Weapon": 1.74}, + "Gaia Beam": {"Weapon": 1.98}, + "Sword of Kings": {"Weapon": 2.00}, + + "Bag of Fries": {"Heal": 0.24}, + "Banana": {"Heal": 0.22}, + "Bean Croquette": {"Heal": 0.42}, + "Beef Jerky": {"Heal": 1.50}, + "Boiled Egg": {"Heal": 0.42}, + "Bowl of Rice Gruel": {"Heal": 2.16}, + "Brain Food Lunch": {"Heal": 3.00, "Mana": 1.42}, + "Bread Roll": {"Heal": 0.30}, + "Calorie Stick": {"Heal": 0.60}, + "Can of Fruit Juice": {"Heal": 0.06}, + "Chef's Special": {"Heal": 2.16}, + "Cookie": {"Heal": 0.06}, + "Croissant": {"Heal": 0.60}, + "Cup of Coffee": {"Heal": 0.12}, + "Cup of Noodles": {"Heal": 0.42}, + "Double Burger": {"Heal": 0.96}, + "Fresh Egg": {"Heal": 0.84}, + "Hamburger": {"Heal": 0.48}, + "Kabob": {"Heal": 1.26}, + "Kraken Soup": {"Heal": 9.99}, + "Large Pizza": {"Heal": 2.40}, + "Lucky Sandwich": {"Heal": 0.60, "Mana": 0.57}, + "Luxury Jerky": {"Heal": 3.00}, + "Mammoth Burger": {"Heal": 2.05}, + "Molokheiya Soup": {"Heal": 0.84}, + "Pasta di Summers": {"Heal": 1.10}, + "Peanut Cheese Bar": {"Heal": 1.00}, + "Picnic Lunch": {"Heal": 0.80}, + "Piggy Jelly": {"Heal": 3.00}, + "Pizza": {"Heal": 1.20}, + "Plain Roll": {"Heal": 0.80}, + "Plain Yogurt": {"Heal": 1.60}, + "Popsicle": {"Heal": 0.18}, + "Protein Drink": {"Heal": 0.80}, + "Royal Iced Tea": {"Heal": 0.60}, + "Repel Sandwich": {"Heal": 0.06}, + "Repel Superwich": {"Heal": 0.06}, + "Spicy Jerky": {"Heal": 2.52}, + "Trout Yogurt": {"Heal": 0.30}, + "Hand-Aid": {"Heal": 9.99}, + + "Cold Remedy": {"Cure": 0.10}, + "Vial of Serum": {"Cure": 0.25}, + "Wet Towel": {"Cure": 0.50}, + "Refreshing Herb": {"Cure": 1.00}, + "Secret Herb": {"Cure": 2.00, "Life": 0.50}, + "Horn of Life": {"Cure": 3.00, "Life": 1.00}, + "Cup of Lifenoodles": {"Cure": 3.00, "Life": 1.00}, + + "Bottle of Water": {"Mana": 0.28}, + "Bottle of DXwater": {"Mana": 1.14}, + "Magic Pudding": {"Mana": 1.14}, + "Magic Tart": {"Mana": 0.57}, + "Magic Truffle": {"Mana": 2.28}, + "PSI Caramel": {"Mana": 0.57}, + + "Cheap Bracelet": {"Armor": 0.12}, + "Copper Bracelet": {"Armor": 0.25}, + "Silver Bracelet": {"Armor": 0.37}, + "Gold Bracelet": {"Armor": 0.75}, + "Platinum Band": {"Armor": 1.00}, + "Diamond Band": {"Armor": 1.25}, + "Pixie's Bracelet": {"Armor": 1.50}, + "Cherub's Band": {"Armor": 1.75}, + "Goddess Band": {"Armor": 2.00}, + "Bracer of Kings": {"Armor": 0.87, "Fire": 0.50}, + + "Ribbon": {"Armor": 0.35}, + "Red Ribbon": {"Armor": 0.43}, + "Defense Ribbon": {"Armor": 0.70}, + "Talisman Ribbon": {"Armor": 1.05}, + "Saturn Ribbon": {"Armor": 1.57}, + "Goddess Ribbon": {"Armor": 1.92}, + + "Yo-yo": {"Weapon": 0.06}, + "Slingshot": {"Weapon": 0.12}, + "Bionic Slingshot": {"Weapon": 0.32}, + "Trick Yo-yo": {"Weapon": 0.46}, + "Combat Yo-yo": {"Weapon": 0.54}, + + "Travel Charm": {"AntiNumb": 0.25}, + "Great Charm": {"Armor": 0.01, "AntiNumb": 0.50}, + "Crystal Charm": {"Armor": 0.02, "AntiNumb": 1.00}, + "Rabbit's Foot": {"Armor": 0.03, "AntiNumb": 1.00, "Speed": 2.00}, + + "Flame Pendant": {"Armor": 1.00, "Fire": 1.00}, + "Rain Pendant": {"Armor": 1.00, "Ice": 1.00}, + "Night Pendant": {"Armor": 1.00, "Light": 1.00}, + "Sea Pendant": {"Armor": 2.00, "Fire": 1.00, "Ice": 1.00, "Light": 1.00}, + "Star Pendant": {"Armor": 3.00, "Fire": 1.00, "Ice": 1.00, "Light": 1.00, "AntiNumb": 1.00}, + "Earth Pendant": {"Armor": 1.50, "Fire": 0.50, "Ice": 0.50, "Light": 0.50}, + "Cloak of Kings": {"Armor": 0.50}, + + "Shield Killer": {"Neutralizing": 0.50}, + "Neutralizer": {"Neutralizing": 1.00}, + "HP-Sucker": {"Draining": 0.50}, + "Hungry HP-Sucker": {"Draining": 1.00}, + + "Baseball Cap": {"Armor": 0.13}, + "Holmes Hat": {"Armor": 0.27}, + "Mr. Baseball Cap": {"Armor": 0.16}, + "Hard Hat": {"Armor": 0.41}, + "Coin of Slumber": {"Armor": 0.83}, + "Coin of Defense": {"Armor": 1.11}, + "Lucky Coin": {"Armor": 1.38}, + "Talisman Coin": {"Armor": 1.66}, + "Shiny Coin": {"Armor": 1.94}, + "Souvenir Coin": {"Armor": 2.22}, + "Coin of Silence": {"Armor": 1.25}, + "Mr. Saturn Coin": {"Armor": 1.30}, + "Diadem of Kngs": {"Armor": 0.50, "Fire": 0.25, "Ice": 0.25, "Light": 0.25, "AntiNumb": 0.25} +} + + +@dataclass +class EarthBoundGift: + name: str + value: int + traits: list[str] + + +def make_trait(trait: str, name: str) -> dict[str, str | int]: + if name in gift_qualities and trait in gift_qualities[name]: + quality = gift_qualities[name][trait] + else: + quality = None + + if quality: + return {"trait": trait, "quality": quality} + else: + return {"trait": trait} + + +def make_default_traits(traits: list[str], name: str) -> list[dict[str, str | int]]: + return [make_trait(trait, name) for trait in traits] + + +def create_gift(name: str, value: int, traits: list[str]) -> EarthBoundGift: + """Create a Gift with the specified tag and values.""" + return EarthBoundGift(name, value, make_default_traits(traits, name)) + + +gift_properties = { + 2: create_gift("Teddy Bear", 178, ["Toy", "Doll"]), + + 3: create_gift("Super Plush Bear", 1198, ["Toy", "Doll"]), + + 4: create_gift("Broken Machine", 0, ["Broken", "Machine", "Metal", "Material", "Resource", "Trash"]), + + 5: create_gift("Broken Gadget", 109, ["Broken", "Machine", "Metal", "Material", "Resource", "Trash"]), + + 6: create_gift("Broken Air Gun", 0, ["Broken", "Machine", "Metal", "Material", "Resource", "Trash"]), + + 7: create_gift("Broken Spray Can", 189, ["Broken", "Machine", "Metal", "Material", "Resource", "Trash"]), + + 8: create_gift("Broken Laser", 0, ["Broken", "Machine", "Metal", "Material", "Resource", "Trash"]), + + 9: create_gift("Broken Iron", 149, ["Broken", "Machine", "Metal", "Material", "Resource", "Trash"]), + + 10: create_gift("Broken Pipe", 149, ["Broken", "Machine", "Metal", "Material", "Resource", "Pipe", "Trash"]), + + 11: create_gift("Broken Cannon", 218, ["Broken", "Machine", "Metal", "Material", "Resource", "Trash"]), + + 12: create_gift("Broken Tube", 0, ["Broken", "Machine", "Metal", "Material", "Resource", "Trash"]), + + 13: create_gift("Broken Bazooka", 0, ["Broken", "Machine", "Metal", "Material", "Resource", "Weapon", "Trash"]), + + 14: create_gift("Broken Trumpet", 0, ["Broken", "Machine", "Metal", "Material", "Resource", "Instrument", + "Trash"]), + + 15: create_gift("Broken Harmonica", 0, ["Broken", "Machine", "Metal", "Material", "Resource", "Instrument", + "Trash"]), + + 16: create_gift("Broken Antenna", 0, ["Broken", "Machine", "Metal", "Material", "Resource", "Trash"]), + + 17: create_gift("Cracked Bat", 18, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon"]), + + 18: create_gift("Tee Ball Bat", 48, ["MeleeWeapon", "Metal", "Toy", "Weapon"]), + + 19: create_gift("Sand Lot Bat", 98, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon"]), + + 20: create_gift("Minor League Bat", 399, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon"]), + + 21: create_gift("Mr. Baseball Bat", 498, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon"]), + + 22: create_gift("Big League Bat", 3080, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon"]), + + 23: create_gift("Hall of Fame Bat", 1880, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon"]), + + 24: create_gift("Magicant Bat", 0, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon", "Dreamlike"]), + + 25: create_gift("Legendary Bat", 0, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon", "Legendary"]), + + 26: create_gift("Gutsy Bat", 0, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon", "Guts"]), + + 27: create_gift("Casey Bat", 0, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon"]), + + 28: create_gift("Fry Pan", 0, ["MeleeWeapon", "Metal", "Tool", "Weapon"]), + + 29: create_gift("Thick Fry Pan", 0, ["MeleeWeapon", "Metal", "Tool", "Weapon"]), + + 30: create_gift("Deluxe Fry Pan", 0, ["MeleeWeapon", "Metal", "Tool", "Weapon"]), + + 31: create_gift("Chef's Fry Pan", 0, ["MeleeWeapon", "Metal", "Tool", "Weapon"]), + + 32: create_gift("French Fry Pan", 0, ["MeleeWeapon", "Metal", "Tool", "Weapon"]), + + 33: create_gift("Magic Fry Pan", 0, ["MeleeWeapon", "Metal", "Tool", "Weapon"]), + + 34: create_gift("Holy Fry Pan", 0, ["MeleeWeapon", "Metal", "Tool", "Weapon"]), + + 35: create_gift("Sword of Kings", 0, ["Weapon"]), + + 36: create_gift("Pop Gun", 0, ["RangedWeapon", "Toy", "Weapon"]), + + 37: create_gift("Stun Gun", 0, ["RangedWeapon", "Weapon"]), + + 38: create_gift("Toy Air Gun", 0, ["RangedWeapon", "Toy", "Weapon"]), + + 39: create_gift("Magnum Air Gun", 0, ["RangedWeapon", "Toy", "Weapon"]), + + 40: create_gift("Zip Gun", 0, ["RangedWeapon", "Toy", "Weapon"]), + + 41: create_gift("Laser Gun", 0, ["RangedWeapon", "Beam", "Weapon"]), + + 42: create_gift("Hyper Beam", 0, ["RangedWeapon", "Beam", "Weapon"]), + + 43: create_gift("Crusher Beam", 0, ["RangedWeapon", "Beam", "Weapon"]), + + 44: create_gift("Spectrum Beam", 0, ["RangedWeapon", "Beam", "Weapon"]), + + 45: create_gift("Death Ray", 0, ["RangedWeapon", "Beam", "Weapon"]), + + 46: create_gift("Baddest Beam", 0, ["RangedWeapon", "Beam", "Weapon"]), + + 47: create_gift("Moon Beam Gun", 0, ["RangedWeapon", "Beam", "Weapon"]), + + 48: create_gift("Gaia Beam", 0, ["RangedWeapon", "Beam", "Weapon"]), + + 49: create_gift("Yo-yo", 0, ["RangedWeapon", "Toy", "Weapon"]), + + 50: create_gift("Slingshot", 0, ["RangedWeapon", "Toy", "Weapon"]), + + 51: create_gift("Bionic Slingshot", 0, ["RangedWeapon", "Toy", "Weapon"]), + + 52: create_gift("Trick Yo-yo", 0, ["RangedWeapon", "Toy", "Weapon"]), + + 53: create_gift("Combat Yo-yo", 0, ["RangedWeapon", "Toy", "Weapon"]), + + 54: create_gift("Travel Charm", 0, ["Jewelry"]), + + 55: create_gift("Great Charm", 0, ["Jewelry", "Defense", "Armor"]), + + 56: create_gift("Crystal Charm", 0, ["Jewelry", "Defense", "Armor", "Crystal"]), + + 57: create_gift("Rabbit's Foot", 0, ["Armor", "Jewelry", "Defense", "Speed"]), + + 58: create_gift("Flame Pendant", 0, ["Armor", "Jewelry", "Defense", "Fire"]), + + 59: create_gift("Rain Pendant", 0, ["Armor", "Jewelry", "Defense", "Water"]), + + 60: create_gift("Night Pendant", 0, ["Armor", "Jewelry", "Defense", "Light"]), + + 61: create_gift("Sea Pendant", 0, ["Armor", "Jewelry", "Defense", "Light", "Fire", "Water"]), + + 62: create_gift("Star Pendant", 0, ["Armor", "Jewelry", "Defense", "Light", "Fire", "Water"]), + + 63: create_gift("Cloak of Kings", 0, ["Armor", "Jewelry", "Defense"]), + + 64: create_gift("Cheap Bracelet", 0, ["Armor", "Jewelry", "Defense", "Plastic"]), + + 65: create_gift("Copper Bracelet", 0, ["Armor", "Jewelry", "Defense", "Copper"]), + + 66: create_gift("Silver Bracelet", 0, ["Armor", "Jewelry", "Defense", "Silver"]), + + 67: create_gift("Gold Bracelet", 0, ["Armor", "Jewelry", "Defense", "Gold"]), + + 68: create_gift("Platinum Band", 0, ["Armor", "Jewelry", "Defense", "Platinum"]), + + 69: create_gift("Diamond Band", 0, ["Armor", "Jewelry", "Defense", "Diamond"]), + + 70: create_gift("Pixie's Bracelet", 0, ["Armor", "Jewelry", "Defense"]), + + 71: create_gift("Cherub's Band", 0, ["Armor", "Jewelry", "Defense"]), + + 72: create_gift("Goddess Band", 0, ["Armor", "Jewelry", "Defense"]), + + 73: create_gift("Bracer of Kings", 0, ["Armor", "Jewelry", "Defense", "Fire"]), + + 74: create_gift("Baseball Cap", 0, ["Armor", "Baseball", "Defense", "Hat"]), + + 75: create_gift("Holmes Hat", 0, ["Armor", "Defense", "Hat"]), + + 76: create_gift("Mr. Baseball Cap", 0, ["Armor", "Defense", "Hat", "Baseball"]), + + 77: create_gift("Hard Hat", 0, ["Armor", "Defense", "Hat"]), + + 78: create_gift("Ribbon", 0, ["Armor", "Cloth", "Defense"]), + + 79: create_gift("Red Ribbon", 0, ["Armor", "Cloth", "Defense", "Red"]), + + 80: create_gift("Goddess Ribbon", 0, ["Armor", "Cloth", "Defense"]), + + 81: create_gift("Coin of Slumber", 0, ["Armor", "Defense"]), + + 82: create_gift("Coin of Defense", 0, ["Armor", "Defense"]), + + 83: create_gift("Lucky Coin", 0, ["Armor", "Defense", "Luck"]), + + 84: create_gift("Talisman Coin", 0, ["Armor", "Defense"]), + + 85: create_gift("Shiny Coin", 0, ["Armor", "Defense"]), + + 86: create_gift("Souvenir Coin", 0, ["Armor", "Defense"]), + + 87: create_gift("Diadem of Kings", 0, ["Armor", "Jewelry", "Defense", "Fire", "Water", "Light"]), + + 88: create_gift("Cookie", 7, ["Confectionary", "Comsumable", "Heal", "Food"]), + + 89: create_gift("Bag of Fries", 8, ["FastFood", "Comsumable", "Heal", "Food"]), + + 90: create_gift("Hamburger", 14, ["FastFood", "Comsumable", "Heal", "Food", "Beef", "Meat"]), + + 91: create_gift("Boiled Egg", 0, ["Egg", "Comsumable", "Heal", "Food", "White"]), + + 92: create_gift("Fresh Egg", 0, ["Egg", "Comsumable", "Heal", "Food", "White"]), + + 93: create_gift("Picnic Lunch", 24, ["Comsumable", "Heal", "Food"]), + + 94: create_gift("Pasta di Summers", 0, ["Pasta", "Comsumable", "Heal", "Food", "Cooking"]), + + 95: create_gift("Pizza", 0, ["Comsumable", "Heal", "Food"]), + + 96: create_gift("Chef's Special", 0, ["Comsumable", "Heal", "Food"]), + + 97: create_gift("Large Pizza", 0, ["Comsumable", "Heal", "Food"]), + + 98: create_gift("PSI Caramel", 0, ["Comsumable", "Mana", "Food", "Candy"]), + + 99: create_gift("Magic Truffle", 0, ["Comsumable", "Mana", "Food", "Candy"]), + + 100: create_gift("Brain Food Lunch", 0, ["Comsumable", "Mana", "Food", "Heal", "ExoticFood"]), + + 101: create_gift("Rock Candy", 0, ["Comsumable", "Candy", "Food", "Buff"]), + + 102: create_gift("Croissant", 0, ["Comsumable", "Food", "Heal", "Bread"]), + + 103: create_gift("Bread Roll", 0, ["Comsumable", "Food", "Heal", "Bread"]), + + 106: create_gift("Can of Fruit Juice", 0, ["Comsumable", "Heal", "Drink", "Liquid", "Fruit", "Juice"]), + + 107: create_gift("Royal Iced Tea", 0, ["Comsumable", "Heal", "Drink", "Liquid"]), + + 108: create_gift("Protein Drink", 0, ["Comsumable", "Heal", "Drink", "Liquid"]), + + 109: create_gift("Kraken Soup", 0, ["Comsumable", "Heal", "Food", "Liquid", "Cooking"]), + + 110: create_gift("Bottle of Water", 0, ["Comsumable", "Mana", "Drink", "Liquid", "Water"]), + + 111: create_gift("Cold Remedy", 0, ["Comsumable", "Medicine", "Drink", "Liquid", "Cure"]), + + 112: create_gift("Vial of Serum", 0, ["Comsumable", "Medicine", "Drink", "Liquid", "Cure"]), + + 113: create_gift("IQ Capsule", 0, ["Comsumable", "Medicine", "IQ", "Buff"]), + + 114: create_gift("Guts Capsule", 0, ["Comsumable", "Medicine", "Guts", "Buff"]), + + 115: create_gift("Speed Capsule", 0, ["Comsumable", "Medicine", "Speed", "Buff"]), + + 116: create_gift("Vital Capsule", 0, ["Comsumable", "Medicine", "Buff", "Life"]), + + 117: create_gift("Luck Capsule", 0, ["Comsumable", "Medicine", "Buff", "Luck"]), + + 118: create_gift("Ketchup Packet", 0, ["Comsumable", "Heal", "Food", "Condiment", "Red"]), + + 119: create_gift("Sugar Packet", 0, ["Comsumable", "Heal", "Food", "Condiment", "White"]), + + 120: create_gift("Tin of Cocoa", 0, ["Comsumable", "Heal", "Food", "Condiment", "Brown", "Chocolate"]), + + 121: create_gift("Carton of Cream", 0, ["Comsumable", "Heal", "Food", "Condiment", "White", "Liquid"]), + + 122: create_gift("Sprig of Parsley", 0, ["Comsumable", "Heal", "Food", "Condiment", "Green", "Plant"]), + + 123: create_gift("Jar of Hot Sauce", 0, ["Comsumable", "Heal", "Food", "Condiment", "Orange", "Spicy"]), + + 124: create_gift("Salt Packet", 0, ["Comsumable", "Heal", "Food", "Condiment", "White", "Salted"]), + + 126: create_gift("Jar of Delisauce", 0, ["Comsumable", "Heal", "Food", "Condiment", "Green"]), + + 127: create_gift("Wet Towel", 0, ["Comsumable", "Cure"]), + + 128: create_gift("Refreshing Herb", 0, ["Comsumable", "Cure", "Food", "Herb"]), + + 129: create_gift("Secret Herb", 0, ["Comsumable", "Cure", "Food", "Life", "Herb"]), + + 130: create_gift("Horn of Life", 0, ["Comsumable", "Cure", "Life"]), + + 131: create_gift("Counter-PSI Unit", 0, ["Machine", "Electronics", "Metal"]), + + 132: create_gift("Shield Killer", 0, ["Machine", "Electronics", "Metal", "Neutralizing"]), + + 133: create_gift("Bazooka", 0, ["Machine", "Weapon", "Electronics", "Explosive", "RangedWeapon"]), + + 134: create_gift("Heavy Bazooka", 0, ["Machine", "Weapon", "Electronics", "Explosive", "RangedWeapon"]), + + 135: create_gift("HP-Sucker", 0, ["Machine", "Draining", "Electronics"]), + + 136: create_gift("Hungry HP-Sucker", 0, ["Machine", "Draining", "Electronics"]), + + 137: create_gift("Xterminator Spray", 0, ["Can", "Metal", "Insect", "Weapon", "Chemicals"]), + + 138: create_gift("Slime Generator", 0, ["Machine", "Slime", "Electronics"]), + + 140: create_gift("Ruler", 0, ["Long", "Wood", "Trash", "IQ"]), + + 141: create_gift("Snake Bag", 0, ["Animal", "Container", "Throwing"]), + + 142: create_gift("Mummy Wrap", 0, ["Ancient", "Paper", "Weapon", "Throwing", "Consumable"]), + + 143: create_gift("Protractor", 0, ["Metal", "Trash", "IQ"]), + + 144: create_gift("Bottle Rocket", 0, ["Weapon", "Explosive", "Rocket", "Fireworks", "Consumable"]), + + 145: create_gift("Big Bottle Rocket", 0, ["Weapon", "Explosive", "Rocket", "Fireworks", "Consumable"]), + + 146: create_gift("Multi Bottle Rocket", 0, ["Weapon", "Explosive", "Rocket", "Fireworks", "Consumable"]), + + 147: create_gift("Bomb", 0, ["Weapon", "Explosive", "Throwing", "Consumable", "Bomb"]), + + 148: create_gift("Super Bomb", 0, ["Weapon", "Explosive", "Throwing", "Consumable", "Bomb"]), + + 149: create_gift("Insecticide Spray", 0, ["Can", "Metal", "Insect", "Weapon", "Consumable", "Chemicals"]), + + 150: create_gift("Rust Promoter", 0, ["Can", "Metal", "Rusting", "Weapon", "Consumable", "Chemicals"]), + + 151: create_gift("Rust Promoter DX", 0, ["Can", "Metal", "Rusting", "Weapon", "Consumable", "Chemicals", "Insect"]), + + 152: create_gift("Pair of Dirty Socks", 0, ["Consumable", "Throwing", "Stinky", "Clothing"]), + + 153: create_gift("Stag Beetle", 0, ["Consumable", "Throwing", "Animal", "Insect"]), + + 154: create_gift("Toothbrush", 0, ["Consumable", "Tool"]), + + 155: create_gift("Handbag Strap", 0, ["Consumable", "Weapon", "Throwing", "Leather"]), + + 156: create_gift("Pharaoh's Curse", 0, ["Consumable", "Weapon", "Throwing", "Goo", "Slime", "Poison", "Chemicals"]), + + 157: create_gift("Defense Shower", 0, ["Can", "Machine", "Chemicals", "Buff", "Defense", "Liquid"]), + + 159: create_gift("Sudden Guts Pill", 0, ["Consumable", "Guts", "Buff"]), + + 160: create_gift("Bag of Dragonite", 0, ["Consumable", "Weapon", "Powder"]), + + 161: create_gift("Defense Spray", 0, ["Can", "Consumable", "Chemicals", "Buff", "Defense", "Liquid"]), + + 165: create_gift("Picture Postcard", 0, ["Paper", "Trash"]), + + 168: create_gift("Chick", 0, ["Animal", "Yellow", "Chicken"]), + + 169: create_gift("Chicken", 0, ["Animal", "White", "Chicken"]), + + 186: create_gift("Meteotite", 0, ["Mineral", "Artifact", "Brown", "Gem"]), + + 188: create_gift("Hand-Aid", 0, ["Consumable", "Heal", "Cloth"]), + + 189: create_gift("Trout Yogurt", 0, ["Consumable", "Heal", "Food", "Fish", "Dairy"]), + + 190: create_gift("Banana", 0, ["Consumable", "Heal", "Food", "Fruit", "Yellow"]), + + 191: create_gift("Calorie Stick", 0, ["Consumable", "Heal", "Food", "Jerky"]), + + 194: create_gift("Earth Pendant", 0, ["Armor", "Jewelry", "Fire", "Ice", "Light"]), + + 195: create_gift("Neutralizer", 0, ["Machine", "Electronics", "Metal", "Neutralizing"]), + + 198: create_gift("Gelato de Resort", 0, ["Consumable", "Food", "Heal", "Dairy", "FrozenFood"]), + + 199: create_gift("Snake", 0, ["Animal", "Weapon", "Throwing", "Consumable"]), + + 200: create_gift("Viper", 0, ["Animal", "Weapon", "Throwing", "Poison", "Consumable"]), + + 201: create_gift("Brain Stone", 0, ["Stone", "Mineral", "Trash"]), + + 207: create_gift("Magic Tart", 0, ["Food", "Consumable", "Mana", "Confectionary"]), + + 209: create_gift("Monkey's Love", 0, ["Weapon", "Animal"]), + + 212: create_gift("T-Rex's Bat", 0, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon"]), + + 213: create_gift("Big League Bat", 0, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon"]), + + 214: create_gift("Ultimate Bat", 0, ["MeleeWeapon", "Wood", "Baseball", "Toy", "Weapon"]), + + 215: create_gift("Double Beam", 0, ["RangedWeapon", "Gun", "Beam", "Weapon"]), + + 216: create_gift("Platinum Band", 0, ["Armor", "Defense", "Platinum", "Jewelry"]), + + 217: create_gift("Diamond Band", 0, ["Armor", "Defense", "Diamond", "Jewelry"]), + + 218: create_gift("Defense Ribbon", 0, ["Armor", "Cloth", "Defense"]), + + 219: create_gift("Talisman Ribbon", 0, ["Armor", "Cloth", "Defense"]), + + 220: create_gift("Saturn Ribbon", 0, ["Armor", "Cloth", "Defense"]), + + 221: create_gift("Coin of Silence", 0, ["Armor", "Defense"]), + + 222: create_gift("Charm Coin", 0, ["Armor", "Defense"]), + + 223: create_gift("Cup of Noodles", 0, ["Food", "Consumable", "Heal", "FastFood", "Pasta"]), + + 224: create_gift("Repel Sandwich", 0, ["Food", "Consumable", "Heal", "Repellant", "Sandwich"]), + + 225: create_gift("Repel Superwich", 0, ["Food", "Consumable", "Heal", "Repellant", "Sandwich"]), + + 226: create_gift("Lucky Sandwich", 0, ["Food", "Consumable", "Heal", "Luck", "Mana", "Sandwich"]), + + 232: create_gift("Cup of Coffee", 0, ["Drink", "Consumable", "Heal", "Liquid", "Coffee"]), + + 233: create_gift("Double Burger", 0, ["FastFood", "Comsumable", "Heal", "Food", "Beef", "Meat"]), + + 234: create_gift("Peanut Cheese Bar", 0, ["Comsumable", "Heal", "Food", "Candy", "ExoticFood"]), + + 235: create_gift("Piggy Jelly", 0, ["Comsumable", "Heal", "Food", "ExoticFood", "Gelatin", "Jelly"]), + + 236: create_gift("Bowl of Rice Gruel", 0, ["Comsumable", "Heal", "Food", "Cooking", "ExoticFood", "Liquid"]), + + 237: create_gift("Bean Croquette", 0, ["Comsumable", "Heal", "Food", "Cooking", "ExoticFood"]), + + 238: create_gift("Molokheiya Soup", 0, ["Comsumable", "Heal", "Food", "Cooking", "ExoticFood", "Vegetable", + "Liquid"]), + + 239: create_gift("Plain Roll", 0, ["Comsumable", "Heal", "Food", "Bread"]), + + 240: create_gift("Kabob", 0, ["Comsumable", "Heal", "Food", "ExoticFood", "Meat"]), + + 241: create_gift("Plain Yogurt", 0, ["Comsumable", "Heal", "Food", "Slime", "Dairy"]), + + 242: create_gift("Beef Jerky", 0, ["Comsumable", "Heal", "Food", "Meat", "Dried", "Jerky"]), + + 243: create_gift("Mammoth Burger", 0, ["FastFood", "Comsumable", "Heal", "Food", "Beef", "Meat"]), + + 244: create_gift("Spicy Jerky", 0, ["Comsumable", "Heal", "Food", "Meat", "Dried", "Jerky", "Spicy"]), + + 245: create_gift("Luxury Jerky", 0, ["Comsumable", "Heal", "Food", "Meat", "Dried", "Jerky", "Luxury"]), + + 246: create_gift("Bottle of DXwater", 0, ["Comsumable", "Mana", "Drink", "Liquid", "Water"]), + + 247: create_gift("Magic Pudding", 0, ["Comsumable", "Mana", "Food", "Candy"]), + + 248: create_gift("Non-Stick Frypan", 0, ["MeleeWeapon", "Metal", "Tool", "Weapon"]), + + 249: create_gift("Mr. Saturn Coin", 0, ["Armor", "Defense"]), + + 250: create_gift("Meteornium", 0, ["Mineral", "Artifact", "SpaceMineral"]), + + 251: create_gift("Popsicle", 0, ["Consumable", "Food", "Heal", "FrozenFood"]), + + 252: create_gift("Cup of Lifenoodles", 0, ["Consumable", "Food", "Cure", "Life", "Pasta"]) + # Todo; separate traits for GoodWeapon and BadWeapon + # Todo; Satus heals should be Medicine, Cure +} diff --git a/worlds/earthbound/gifting/trait_parser.py b/worlds/earthbound/gifting/trait_parser.py new file mode 100644 index 0000000000..c721be44ab --- /dev/null +++ b/worlds/earthbound/gifting/trait_parser.py @@ -0,0 +1,454 @@ +from ..game_data.local_data import item_id_table +import random +from typing import Any + +gift_exclusions = [ + "Franklin Badge", + "Pak of Bubble Gum", + "Jar of Fly Honey", + "Tiny Key", + "Yogurt Dispenser", + "UFO Engine", + "Piggy Nose", + "Shyness Book", + "King Banana", + "Letter For Tony", + "Key to the Shack", + "Key to the Cabin", + "Bad Key Machine", + "Zombie Paper", + "Hawk Eye", + "ATM Card", + "Show Ticket", + "Tenda Lavapants", + "Wad of Bills", + "Receiver Phone", + "Diamond", + "Signed Banana", + "Pencil Eraser", + "Hieroglyph Copy", + "Contact Lens", + "Key to the Tower", + "Meteorite Piece", + "Sound Stone", + "Police Badge", + "Mining Permit", + "Key to the Locker", + "Insignificant Item", + "Tiny Ruby", + "Eraser Eraser", + "Tendakraut", + "Progressive Bat", + "Progressive Fry Pan", + "Progressive Gun", + "Progressive Bracelet", + "Progressive Other", + "Carrot Key" +] + +wanted_traits = [ + "Armor", + "Weapon", + "Cure", + "Bomb", + "Mana", + "Heal", + "Life", + "Neutralizing", + "Draining", + "Beef", + "Jerky", + "Egg", + "Chicken", + "Spicy", + "Broken", + "Pasta", + "Pizza", + "Condiment", + "Dairy", + "AnimalProduct", + "Copper", + "Silver", + "Gold", + "Diamond", + "Plastic", + "Herb", + "Repellant", + "Slime", + "Animal", + "Juice", + "Meat", + "Water", + "Drink", + "FastFood", + "Bread", + "FrozenFood", + "Fruit", + "Toy", + "Salted", + "Speed", + "Guts", + "Luck", + "Doll", + "Legendary", + "Buff", + "Pipe", + "Hat", + "Trash", + "ExoticFood", + "Insect", + "Fire", + "Ice", + "Light", + "Food", + "Consumable", + "Electronics", + "Candy", + "Medicine", + "Coffee", + "Artifact", + "Fireworks", + "Confectionary", + "Explosive", + "Jewelry", + "Rock", + "Metal" +] + +# If these traits are in the item, then pick randomly from the results +# If multiple fit, pick the combined highest quality. +secondary_trait_list = { + "Beef": ["Hamburger", "Double Burger", "Mammoth Burger", "Beef Jerky"], + "Jerky": ["Beef Jerky", "Spicy Jerky", "Luxury Jerky"], + "Egg": ["Fresh Egg", "Boiled Egg"], + "Chicken": ["Chicken"], + "Spicy": ["Jar of Hot Sauce", "Spicy Jerky"], + "Broken": ["Broken Machine", "Broken Gadget", "Broken Air Gun", "Broken Spray Can", + "Broken Laser", "Broken Iron", "Broken Pipe", "Broken Cannon", "Broken Tube", + "Broken Bazooka", "Broken Trumpet", "Broken Harmonica", "Broken Antenna"], + "Pasta": ["Pasta di Summers", "Cup of Noodles", "Cup of Lifenoodles"], + "Pizza": ["Pizza", "Large Pizza"], + "Condiment": ["Ketchup Packet", "Sugar Packet", "Salt Packet", "Tin of Cocoa", + "Carton of Cream", "Sprig of Parsley", "Jar of Delisauce", "Jar of Hot Sauce"], + "Dairy": ["Plain Yogurt", "Trout Yogurt", "Gelato de Resort"], + "AnimalProduct": ["Fresh Egg"], + "Copper": ["Copper Bracelet"], + "Silver": ["Silver Bracelet"], + "Gold": ["Gold Bracelet"], + "Diamond": ["Diamond Band"], + "Plastic": ["Cheap Bracelet", "Bottle of Water", "Bottle of DXwater"], + "Herb": ["Refreshing Herb", "Secret Herb"], + "Repellant": ["Repel Sandwich", "Repel Superwich"], + "Slime": ["Slime Generator"], + "Animal": ["Chicken", "Chick", "Snake", "Viper"], + "Juice": ["Can of Fruit Juice"], + "Meat": ["Hamburger", "Double Burger", "Mammoth Burger", "Beef Jerky", + "Spicy Jerky", "Luxury Jerky", "Kabob"], + "Water": ["Bottle of Water", "Bottle of DXwater"], + "Drink": ["Bottle of Water", "Bottle of DXwater", "Cup of Coffee", "Can of Fruit Juice", "Protein Drink", + "Royal Iced Tea"], + "FastFood": ["Hamburger", "Ketchup Packet", "Double Burger", "Bag of Fries"], + "Bread": ["Plain Roll", "Bread Roll", "Croissant"], + "FrozenFood": ["Popsicle", "Gelato de Resort"], + "Fruit": ["Banana", "Can of Fruit Juice"], + "Toy": ["Toy Air Gun", "Teddy Bear", "Super Plush Bear", "Yo-yo", "Slingshot"], + "Salted": ["Salt Packet"], + "Speed": ["Speed Capsule", "Rabbit's Foot"], + "Guts": ["Guts Capsule", "Sudden Guts Pill", "Gutsy Bat"], + "Luck": ["Lucky Coin", "Luck Capsule", "Lucky Sandwich"], + "Doll": ["Teddy Bear", "Super Plush Bear"], + "Legendary": ["Legendary Bat"], + "Buff": ["Sudden Guts Pill", "Guts Capsule", "Speed Capsule", "IQ Capsule", "Luck Capsule", "Vital Capsule", + "Defense Spray", "Defense Shower", "Rock Candy"], + "Pipe": ["HP-Sucker", "Hungry HP-Sucker", "Broken Pipe"], + "Hat": ["Holmes Hat", "Hard Hat", "Baseball Cap", "Mr. Baseball Cap"], + "Trash": ["Broken Machine", "Broken Gadget", "Broken Air Gun", "Broken Spray Can", + "Broken Laser", "Broken Iron", "Broken Pipe", "Broken Cannon", "Broken Tube", + "Broken Bazooka", "Broken Trumpet", "Broken Harmonica", "Broken Antenna", + "Ruler", "Pair of Dirty Socks", "Protractor"], + "ExoticFood": ["Piggy Jelly", "Peanut Cheese Bar", "Bowl of Rice Gruel", + "Molokheiya Soup", "Kabob", "Bean Croquette", "Brain Food Lunch"], + "Insect": ["Insecticde Spray", "Xterminator Spray", "Stag Beetle"], + "Fire": ["Flame Pendant"], + "Ice": ["Rain Pendant"], + "Light": ["Night Pendant"], + "Electronics": ["Slime Generator", "Shield Killer", "Neutralizer", "Defense Shower", "Counter-PSI Unit", + "HP-Sucker", "Hungry HP-Sucker"], + "Candy": ["PSI Caramel", "Magic Truffle", "Rock Candy", "Magic Pudding", "Peanut Cheese Bar"], + "Medicine": ["Vial of Serum", "Cold Remedy", "IQ Capsule", "Guts Capsule", "Speed Capsule", "Vital Capsule", "Luck Capsule"], + "Coffee": ["Cup of Coffee"], + "Artifact": ["Metotite", "Meteornium"], + "Fireworks": ["Bottle Rocket", "Big Bottle Rocket", "Multi Bottle Rocket"], + "Confectionary": ["Cookie", "Magic Tart"], + "Explosive": ["Bottle Rocket", "Big Bottle Rocket", "Multi Bottle Rocket", "Heavy Bazooka", + "Bazooka", "Bomb", "Super Bomb"], + "Jewelry": ["Cheap Bracelet", "Copper Bracelet", "Silver Bracelet", "Gold Bracelet", + "Platinum Band", "Diamond Band", "Flame Pendant", "Sea Pendant", "Star Pendant", "Earth Pendant", + "Rain Pendant", "Night Pendant"], + "Rock": ["Rock Candy", "Brain Stone"], + "Metal": ["Broken Machine", "Broken Gadget", "Broken Air Gun", "Broken Spray Can", + "Broken Laser", "Broken Iron", "Broken Pipe", "Broken Cannon", "Broken Tube", + "Broken Bazooka", "Broken Trumpet", "Broken Harmonica", "Broken Antenna", "Slime Generator", + "Fry Pan", "Magic Fry Pan", "Thick Fry Pan", "Deluxe Fry Pan", "Chef's Fry Pan", + "French Fry Pan", "Holy Fry Pan", "Non-Stick Frypan"], + + "Food": ["Cookie", "Bag of Fries", "Hamburger", "Boiled Egg", "Fresh Egg", "Picnic Lunch", + "Pasta di Summers", "Pizza", "Chef's Special", "Large Pizza", "PSI Caramel", "Magic Truffle", + "Brain Food Lunch", "Rock Candy", "Croissant", "Bread Roll", "Kraken Soup", + "Trout Yogurt", "Banana", "Calorie Stick", "Gelato de Resort", "Magic Tart", + "Cup of Noodles", "Repel Sandwich", "Repel Superwich", "Lucky Sandwich", "Double Burger", + "Peanut Cheese Bar", "Piggy Jelly", "Bowl of Rice Gruel", "Bean Croquette", + "Molokheiya Soup", "Plain Roll", "Kabob", "Plain Yogurt", "Beef Jerky", + "Mammoth Burger", "Spicy Jerky", "Luxury Jerky", "Magic Pudding", + "Popsicle"] + +} + +tertiary_trait_list = { + "Consumable": ["Cookie", "Bag of Fries", "Hamburger", "Boiled Egg", "Fresh Egg", "Picnic Lunch", + "Pasta di Summers", "Pizza", "Chef's Special", "Large Pizza", "PSI Caramel", "Magic Truffle", + "Brain Food Lunch", "Rock Candy", "Croissant", "Bread Roll", "Kraken Soup", + "Trout Yogurt", "Banana", "Calorie Stick", "Gelato de Resort", "Magic Tart", + "Cup of Noodles", "Repel Sandwich", "Repel Superwich", "Lucky Sandwich", "Double Burger", + "Peanut Cheese Bar", "Piggy Jelly", "Bowl of Rice Gruel", "Bean Croquette", + "Molokheiya Soup", "Plain Roll", "Kabob", "Plain Yogurt", "Beef Jerky", + "Mammoth Burger", "Spicy Jerky", "Luxury Jerky", "Magic Pudding", + "Popsicle", "Can of Fruit Juice", "Royal Iced Tea", "Protein Drink", + "Bottle of Water", "Cold Remedy", "Vial of Serum", "IQ Capsule", + "Guts Capsule", "Speed Capsule", "Vital Capsule", "Luck Capsule", + "Ketchup Packet", "Sugar Packet", "Tin of Cocoa", "Carton of Cream", "Sprig of Parsley", + "Jar of Hot Sauce", "Salt Packet", "Jar of Delisauce", "Wet Towel", "Refreshing Herb", + "Secret Herb", "Horn of Life", "Mummy Wrap", "Bottle Rocket", "Big Bottle Rocket", + "Multi Bottle Rocket", "Bomb", "Super Bomb", "Insecticide Spray", "Rust Promoter", + "Rust Promoter DX", "Pair of Dirty Socks", "Stag Beetle", "Toothbrush", + "Handbag Strap", "Pharaoh's Curse", "Sudden Guts Pill", "Bag of Dragonite", + "Defense Spray", "Chick", "Chicken", "Hand-Aid", "Snake", "Viper", + "Cup of Coffee", "Bottle of DXwater", "Cup of Lifenoodles"] +} + +scaled_traits = [ + "Armor", + "Weapon", + "Cure", + "Bomb", + "Mana", + "Heal", + "Life", + "Neutralizing", + "Draining" +] + +gift_by_quality = { + "Heal": { + 0.06: "Cookie", + 0.08: "Can of Fruit Juice", + 0.12: "Cup of Coffee", + 0.18: "Popsicle", + 0.22: "Banana", + 0.24: "Bag of Fries", + 0.30: "Trout Yogurt", + 0.35: "Bread Roll", + 0.42: "Bean Croquette", + 0.43: "Cup of Noodles", + 0.45: "Boiled Egg", + 0.48: "Hamburger", + 0.60: "Royal Iced Tea", + 0.63: "Calorie Stick", + 0.65: "Croissant", + 0.70: "Lucky Sandwich", + 0.80: "Picnic Lunch", + 0.82: "Plain Roll", + 0.84: "Fresh Egg", + 0.88: "Molokheiya Soup", + 0.96: "Double Burger", + 1.00: "Peanut Cheese Bar", + 1.10: "Pasta di Summers", + 1.20: "Pizza", + 1.26: "Kabob", + 1.50: "Beef Jerky", + 1.60: "Plain Yogurt", + 2.05: "Mammoth Burger", + 2.16: "Bowl of Rice Gruel", + 2.20: "Chef's Special", + 2.52: "Spicy Jerky", + 2.40: "Large Pizza", + 3.00: "Piggy Jelly", + 3.10: "Luxury Jerky", + 3.50: "Brain Food Lunch", + 4.00: "Kraken Soup", + 4.01: "Hand-Aid" + }, + + "Armor": { + 0.05: "Travel Charm", + 0.10: "Great Charm", + 0.12: "Cheap Bracelet", + 0.13: "Baseball Cap", + 0.14: "Mr. Baseball Cap", + 0.24: "Copper Bracelet", + 0.26: "Holmes Hat", + 0.20: "Crystal Charm", + 0.36: "Silver Bracelet", + 0.38: "Hard Hat", + 0.48: "Ribbon", + 0.50: "Diadem of Kings", + 0.60: "Red Ribbon", + 0.73: "Gold Bracelet", + 0.75: "Bracer of Kings", + 0.78: "Coin of Slumber", + 0.97: "Platinum Band", + 0.98: "Defense Ribbon", + 0.99: "Coin of Defense", + 1.00: "Cloak of Kings", + 1.21: "Diamond Band", + 1.25: "Lucky Coin", + 1.46: "Pixie's Bracelet", + 1.48: "Talisman Coin", + 1.50: "Talisman Ribbon", + 1.70: "Cherub's Band", + 1.75: "Shiny Coin", + 1.95: "Goddess Band", + 2.00: "Souvenir Coin", + 2.19: "Saturn Ribbon", + 2.68: "Goddess Ribbon" + }, + + "Draining": { + 0.50: "HP-Sucker", + 1.00: "Hungry HP-Sucker" + }, + + "Bomb": { + 0.50: "Bomb", + 1.00: "Super Bomb" + }, + + "Neutralizing": { + 0.50: "Shield Killer", + 1.00: "Neutralizer" + }, + + "Cure": { + 0.10: "Cold Remedy", + 0.25: "Vial of Serum", + 0.50: "Wet Towel", + 1.00: "Refreshing Herb", + 2.00: "Secret Herb", + 3.00: "Horn of Life", + 3.01: "Cup of Lifenoodles" + }, + + "Life": { + 0.50: "Secret Herb", + 1.00: "Cup of Lifenoodles", + 1.01: "Horn of Life", + }, + + "Weapon": { + 0.01: "Casey Bat", + 0.04: "Cracked Bat", + 0.11: "Yo-yo", + 0.15: "Tee Ball Bat", + 0.19: "Fy Pan", + 0.23: "Slingshot", + 0.28: "Sand Lot Bat", + 0.30: "Pop Gun", + 0.38: "Thick Fry Pan", + 0.40: "Bionic Slingshot", + 0.46: "Stun Gun", + 0.50: "Minor League Bat", + 0.57: "Deluxe Fry Pan", + 0.61: "Toy Air Gun", + 0.69: "Magnum Air Gun", + 0.73: "Mr. Baseball Bat", + 0.76: "Chef's Fry Pan", + 0.78: "Zip Gun", + 0.88: "Trick Yo-yo", + 0.92: "Laser Gun", + 0.95: "T-Rex's Bat", + 0.96: "Non-Stick Frypan", + 1.00: "Big League Bat", + 1.03: "Combat Yo-yo", + 1.11: "Hyper Beam", + 1.15: "French Fry Pan", + 1.19: "Hall of Fame Bat", + 1.26: "Double Beam", + 1.32: "Ultimate Bat", + 1.38: "Crusher Beam", + 1.50: "Spectrum Beam", + 1.53: "Magicant Bat", + 1.73: "Death Ray", + 1.80: "Sword of Kings", + 1.88: "Baddest Beam", + 2.00: "Magic Fry Pan", + 2.11: "Legendary Bat", + 2.15: "Moon Beam Gun", + 2.40: "Holy Fry Pan", + 2.45: "Gaia Beam", + 2.55: "Gutsy Bat", + }, + + "Mana": { + 0.28: "Bottle of Water", + 0.50: "PSI Caramel", + 0.51: "Magic Tart", + 1.14: "Bottle of DXwater", + 1.20: "Magic Pudding", + 2.28: "Magic Truffle" + } +} + + +def trait_interpreter(gift: dict[str, Any]) -> int: + """Converts received gifts into in-game items. + If the item name perfectly matches an in-game item, that item will be received. + If any of the traits can be scaled i.e. a healing item, the gift will be converted into an item of roughly that value. + If any of the traits are not scaled, but are in the secondary trait list i.e. a food item, it will be converted into a random appropriate item. + If none of the traits are applicable, return a random consumable.""" + item = None + trait_list = [] + got_trait = False + if "Traits" in gift: + gift["traits"] = gift.pop("Traits") + + for trait in gift["traits"]: + if "Trait" in trait: + trait["trait"] = trait.pop("Trait") + + if "Quality" in trait: + trait["quality"] = trait.pop("Quality") + + if "quality" not in trait: + trait["quality"] = 1 + + trait_list.append(trait["trait"]) + if trait["trait"] in scaled_traits: + item_quality_table = gift_by_quality[trait["trait"]] + quality = min(item_quality_table.keys(), key=lambda x: abs(x - trait["quality"])) + item = item_quality_table[quality] + got_trait = True + break + + if not got_trait: + for trait in trait_list: + if trait in secondary_trait_list: + item = random.choice(secondary_trait_list[trait]) + got_trait = True + break + + if not got_trait: + for trait in trait_list: + if trait in tertiary_trait_list: + item = random.choice(tertiary_trait_list[trait]) + break + + if item is not None: + item = item_id_table[item] + else: + item = random.choice(secondary_trait_list["Consumable"]) + item = item_id_table[item] + return item + + +# IF trait is in special traits, give that item. +# Else if the trait is in a Scaled trait (Food, Armor, etc., then break them up by scaling) diff --git a/worlds/earthbound/modules/__init__.py b/worlds/earthbound/modules/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/earthbound/modules/area_scaling.py b/worlds/earthbound/modules/area_scaling.py new file mode 100644 index 0000000000..a29380f9a0 --- /dev/null +++ b/worlds/earthbound/modules/area_scaling.py @@ -0,0 +1,603 @@ +from ..modules.enemy_data import combat_regions +from ..Options import MagicantMode +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import EarthBoundWorld + + +expected_level_gains = { + "Ness's Mind": 0, + "Global ATM Access": 0, + "Northern Onett": 1, + "Onett": 1, + "Arcade": 0, + "Giant Step": 2, + "Twoson": 0, + "Everdred's House": 1, + "Common Condiment Shop": 0, + "Peaceful Rest Valley": 2, + "Happy-Happy Village": 0, + "Happy-Happy HQ": 1, + "Lilliput Steps": 2, + "Threed": 0, + "Boogey Tent": 0, + "Threed Underground": 2, + "Grapefruit Falls": 1, + "Saturn Valley": 0, + "Belch's Factory": 2, + "Upper Saturn Valley": 0, + "Milky Well": 3, + "Dusty Dunes Desert": 2, + "Gold Mine": 2, + "Monkey Caves": 2, + "Fourside": 0, + "Fourside Dept. Store": 1, + "Moonside": 1, + "Monotoli Building": 2, + "Magnet Hill": 2, + "Winters": 2, + "Snow Wood Boarding School": 0, + "Southern Winters": 1, + "Brickroad Maze": 1, + "Andonuts Lab Area": 0, + "Rainy Circle": 2, + "Stonehenge Base": 2, + "Summers": 0, + "Summers Museum": 0, + "Dalaam": 0, + "Pink Cloud": 2, + "Scaraba": 0, + "Pyramid": 2, + "Southern Scaraba": 1, + "Dungeon Man": 2, + "Deep Darkness": 0, + "Deep Darkness Darkness": 2, + "Tenda Village": 0, + "Lumine Hall": 2, + "Lost Underworld": 2, + "Fire Spring": 2, + "Magicant": 1, + "Sea of Eden": 1, + "Cave of the Present": 0, + "Cave of the Past": 2, + "Endgame": 0 +} + +locations_with_item_requirements = [ + "Onett - Traveling Entertainer", + "Onett - South Road Present", + "Onett - Tracy Gift", + "Twoson - Paula's Mother", + "Twoson - Everdred Meeting", + "Twoson - Insignificant Location", + "Happy-Happy Village - Defeat Carpainter", + "Happy-Happy Village - Prisoner", + "Threed - Boogey Tent Trashcan", + "Threed - Zombie Prisoner", + "Saturn Valley - Post Belch Gift #1", + "Saturn Valley - Post Belch Gift #2", + "Saturn Valley - Post Belch Gift #3", + "Saturn Valley - Saturn Coffee", + "Monkey Caves - Talah Rama Chest #1", + "Monkey Caves - Talah Rama Chest #2", + "Monkey Caves - Talah Rama Gift", + "Monkey Caves - Monkey Power", + "Dusty Dunes - Mine Reward", + "Snow Wood - Upper Right Locker", + "Snow Wood - Upper Left Locker", + "Snow Wood - Bottom Right Locker", + "Snow Wood - Bottom Left Locker", + "Fourside - Bakery 2F Gift", + "Fourside - Department Store Blackout", + "Fourside - Venus Gift", + "Summers - Museum Item", + "Dalaam - Trial of Mu", + "Deep Darkness - North Alcove Truffle", + "Deep Darkness - Near Land Truffle", + "Deep Darkness - Present Truffle", + "Deep Darkness - Village Truffle", + "Deep Darkness - Entrance Truffle", + "Tenda Village - Tenda Tea", + "Tenda Village - Tenda Gift", + "Tenda Village - Tenda Gift #2", + "Lost Underworld - Talking Rock", + "Lost Underworld - Tenda Camp Shop Slot 1", + "Lost Underworld - Tenda Camp Shop Slot 2", + "Lost Underworld - Tenda Camp Shop Slot 3", + "Lost Underworld - Tenda Camp Shop Slot 4", + "Lost Underworld - Tenda Camp Shop Slot 5", + "Lost Underworld - Tenda Camp Shop Slot 6", + "Lost Underworld - Tenda Camp Shop Slot 7", + "Dusty Dunes - Mine Food Cart Slot 1", + "Dusty Dunes - Mine Food Cart Slot 2", + "Dusty Dunes - Mine Food Cart Slot 3", + "Dusty Dunes - Mine Food Cart Slot 4", + "Dusty Dunes - Mine Food Cart Slot 5", + "Dusty Dunes - Mine Food Cart Slot 6", + "Dusty Dunes - Mine Food Cart Slot 7", + "Saturn Valley Shop - Post-Belch Saturn Slot 1", + "Saturn Valley Shop - Post-Belch Saturn Slot 2", + "Saturn Valley Shop - Post-Belch Saturn Slot 3", + "Saturn Valley Shop - Post-Belch Saturn Slot 4", + "Deep Darkness - Arms Dealer Slot 1", + "Deep Darkness - Arms Dealer Slot 2", + "Deep Darkness - Arms Dealer Slot 3", + "Deep Darkness - Arms Dealer Slot 4", + "Deep Darkness - Businessman Slot 1", + "Deep Darkness - Businessman Slot 2", + "Deep Darkness - Businessman Slot 3", + "Deep Darkness - Businessman Slot 4", + "Deep Darkness - Businessman Slot 5", + "Deep Darkness - Businessman Slot 6", + "Deep Darkness - Businessman Slot 7", + "Dalaam Restaurant - Slot 1", + "Dalaam Restaurant - Slot 2", + "Dalaam Restaurant - Slot 3", + "Dalaam Restaurant - Slot 4"] + + +def calculate_scaling(world: "EarthBoundWorld") -> None: + """Calculates the individual scaled level of each region/major area.""" + arcade = world.dungeon_connections["Arcade"] + giant_step = world.dungeon_connections["Giant Step"] + lilliput_steps = world.dungeon_connections["Lilliput Steps"] + happy_happy_hq = world.dungeon_connections["Happy-Happy HQ"] + belch_factory = world.dungeon_connections["Belch's Factory"] + milky_well = world.dungeon_connections["Milky Well"] + gold_mine = world.dungeon_connections["Gold Mine"] + monotoli_building = world.dungeon_connections["Monotoli Building"] + magnet_hill = world.dungeon_connections["Magnet Hill"] + moonside = world.dungeon_connections["Moonside"] + pink_cloud = world.dungeon_connections["Pink Cloud"] + rainy_circle = world.dungeon_connections["Rainy Circle"] + stonehenge_base = world.dungeon_connections["Stonehenge Base"] + brickroad_maze = world.dungeon_connections["Brickroad Maze"] + pyramid = world.dungeon_connections["Pyramid"] + dungeon_man = world.dungeon_connections["Dungeon Man"] + lumine_hall = world.dungeon_connections["Lumine Hall"] + fire_spring = world.dungeon_connections["Fire Spring"] + sea_of_eden = world.dungeon_connections["Sea of Eden"] + world.area_exits = { + "Ness's Mind": ["Onett", "Twoson", "Happy-Happy Village", "Threed", "Saturn Valley", "Dusty Dunes Desert", + "Fourside", "Winters", "Summers", "Dalaam", "Scaraba", "Deep Darkness", "Tenda Village", + "Lost Underworld", "Magicant"], + "Northern Onett": ["Onett"], + "Onett": ["Northern Onett", "Twoson", giant_step, arcade, "Global ATM Access"], + arcade: [arcade], + "Giant Step": ["Giant Step"], + "Twoson": ["Onett", "Peaceful Rest Valley", "Threed", "Everdred's House", "Common Condiment Shop", "Global ATM Access"], + "Everdred's House": ["Everdred's House"], + "Peaceful Rest Valley": ["Twoson", "Happy-Happy Village"], + "Happy-Happy Village": ["Peaceful Rest Valley", lilliput_steps, happy_happy_hq, "Global ATM Access"], + "Happy-Happy HQ": ["Happy-Happy HQ"], + "Lilliput Steps": ["Lilliput Steps"], + "Threed": ["Twoson", "Dusty Dunes Desert", "Andonuts Lab Area", "Threed Underground", "Boogey Tent", "Winters", "Global ATM Access"], + "Boogey Tent": ["Boogey Tent"], + "Threed Underground": ["Grapefruit Falls"], + "Grapefruit Falls": [belch_factory, "Saturn Valley", "Threed Underground"], + "Saturn Valley": ["Grapefruit Falls", "Cave of the Present", "Global ATM Access"], + belch_factory: ["Upper Saturn Valley"], + "Upper Saturn Valley": ["Saturn Valley", world.dungeon_connections["Milky Well"]], + "Milky Well": ["Milky Well"], + "Dusty Dunes Desert": ["Threed", "Monkey Caves", gold_mine, "Fourside", "Global ATM Access"], + "Monkey Caves": ["Monkey Caves"], + "Gold Mine": ["Gold Mine"], + "Fourside": ["Dusty Dunes Desert", monotoli_building, magnet_hill, "Threed", "Fourside Dept. Store", moonside, "Global ATM Access"], + "Moonside": ["Moonside", "Global ATM Access"], + "Monotoli Building": ["Monotoli Building"], + "Fourside Dept. Store": ["Fourside Dept. Store"], + "Magnet Hill": ["Magnet Hill"], + "Winters": ["Snow Wood Boarding School", "Southern Winters", "Global ATM Access"], + "Snow Wood Boarding School": ["Snow Wood Boarding School"], + "Southern Winters": [brickroad_maze], + brickroad_maze: [rainy_circle, "Southern Winters"], + "Stonehenge Base": ["Stonehenge Base"], + rainy_circle: [brickroad_maze, "Andonuts Lab Area"], + "Andonuts Lab Area": [rainy_circle, "Winters", stonehenge_base], + "Summers": ["Scaraba", "Summers Museum", "Global ATM Access"], + "Summers Museum": ["Summers Museum"], + "Dalaam": [pink_cloud], + "Pink Cloud": ["Pink Cloud"], + "Scaraba": [pyramid, "Common Condiment Shop", "Global ATM Access"], + pyramid: ["Southern Scaraba"], + "Southern Scaraba": [dungeon_man], + "Dungeon Man": ["Deep Darkness"], + "Deep Darkness": ["Deep Darkness Darkness"], + "Deep Darkness Darkness": ["Tenda Village", "Deep Darkness"], + "Tenda Village": [lumine_hall, "Deep Darkness Darkness"], + "Lumine Hall": ["Lost Underworld"], + "Lost Underworld": [fire_spring], + "Fire Spring": ["Fire Spring"], + "Magicant": [sea_of_eden, "Global ATM Access"], + "Sea of Eden": ["Sea of Eden"], + "Cave of the Present": ["Cave of the Past"], + "Cave of the Past": ["Endgame"], + "Endgame": ["Endgame"], + "Global ATM Access": ["Global ATM Access"], + "Common Condiment Shop": ["Common Condiment Shop"] + } + + world.area_rules = { + "Ness's Mind": {"Onett": [["Onett Teleport"]], + "Twoson": [["Twoson Teleport"]], + "Happy-Happy Village": [["Happy-Happy Village Teleport"]], + "Threed": [["Threed Teleport"]], + "Saturn Valley": [["Saturn Valley Teleport"]], + "Dusty Dunes Desert": [["Dusty Dunes Teleport"]], + "Fourside": [["Fourside Teleport"]], + "Winters": [["Winters Teleport"]], + "Summers": [["Summers Teleport"]], + "Dalaam": [["Dalaam Teleport"]], + "Scaraba": [["Scaraba Teleport"]], + "Deep Darkness": [["Deep Darkness Teleport"]], + "Tenda Village": [["Tenda Village Teleport"]], + "Lost Underworld": [["Lost Underworld Teleport"]], + "Magicant": [["Magicant Teleport"], ["Magicant Unlock"]] + }, + + "Northern Onett": {"Onett": [["Nothing"]]}, + "Onett": + {"Northern Onett": [["Police Badge"]], + "Twoson": [["Police Badge"]], + giant_step: [["Key to the Shack"]], + arcade: [["Nothing"]], + "Global ATM Access": [["Nothing"]]}, + + arcade: {arcade: [["Nothing"]]}, + "Giant Step": {"Giant Step": [["Nothing"]]}, + + "Twoson": {"Onett": [["Police Badge"]], + "Peaceful Rest Valley": [["Pencil Eraser"], ["Valley Bridge Repair"]], + "Threed": [["Wad of Bills"], ["Threed Tunnels Clear"]], + "Everdred's House": [["Paula"]], + "Common Condiment Shop": [["Nothing"]], + "Global ATM Access": [["Nothing"]]}, + + "Everdred's House": {"Everdred's House": [["Nothing"]]}, + + "Peaceful Rest Valley": {"Twoson": [["Pencil Eraser"], ["Valley Bridge Repair"]], + "Happy-Happy Village": [["Nothing"]]}, + + "Happy-Happy Village": {"Peaceful Rest Valley": [["Nothing"]], + lilliput_steps: [["Nothing"]], + happy_happy_hq: [["Nothing"]], + "Global ATM Access": [["Nothing"]]}, + + "Happy-Happy HQ": {"Happy-Happy HQ": [["Nothing"]]}, + + "Lilliput Steps": {"Lilliput Steps": [["Nothing"]]}, + + "Threed": {"Twoson": [["Threed Tunnels Clear"]], + "Dusty Dunes Desert": [["Threed Tunnels Clear"]], + "Andonuts Lab Area": [["UFO Engine", "Bad Key Machine"]], + "Threed Underground": [["Zombie Paper"]], + "Boogey Tent": [["Jeff"]], + "Winters": [["UFO Engine", "Bad Key Machine"]], + "Global ATM Access": [["Nothing"]]}, + + "Boogey Tent": {"Boogey Tent": [["Nothing"]]}, + + "Threed Underground": {"Grapefruit Falls": [["Nothing"]]}, + + "Grapefruit Falls": {belch_factory: [["Jar of Fly Honey"]], + "Saturn Valley": [["Nothing"]], + "Threed Underground": [["Nothing"]]}, + + "Saturn Valley": {"Grapefruit Falls": [["Nothing"]], + "Cave of the Present": [["Meteorite Piece"]], + "Global ATM Access": [["Nothing"]]}, + + belch_factory: {"Upper Saturn Valley": [["Threed Tunnels Clear"]]}, + + "Upper Saturn Valley": {"Saturn Valley": [["Nothing"]], + milky_well: [["Nothing"]]}, + + "Milky Well": {"Milky Well": [["Nothing"]]}, + + "Dusty Dunes Desert": {"Threed": [["Threed Tunnels Clear"]], + "Monkey Caves": [["King Banana"]], + gold_mine: [["Mining Permit"]], + "Fourside": [["Nothing"]], + "Global ATM Access": [["Nothing"]]}, + + "Monkey Caves": {"Monkey Caves": [["Nothing"]]}, + + "Gold Mine": {"Gold Mine": [["Nothing"]]}, + + "Fourside": {"Dusty Dunes Desert": [["Nothing"]], + monotoli_building: [["Yogurt Dispenser"]], + "Threed": [["Diamond"]], + magnet_hill: [["Signed Banana"]], + "Fourside Dept. Store": [["Jeff"]], + moonside: [["Nothing"]], + "Global ATM Access": [["Nothing"]]}, + + "Monotoli Building": {"Monotoli Building": [["Nothing"]]}, + + "Moonside": {"Moonside": [["Nothing"]], + "Global ATM Access": [["Nothing"]]}, + + "Fourside Dept. Store": {"Fourside Dept. Store": [["Nothing"]]}, + + "Magnet Hill": {"Magnet Hill": [["Nothing"]]}, + + "Winters": {"Snow Wood Boarding School": [["Letter For Tony"]], + "Southern Winters": [["Pak of Bubble Gum"]], + "Global ATM Access": [["Nothing"]]}, + + "Snow Wood Boarding School": {"Snow Wood Boarding School": [["Nothing"]]}, + + "Southern Winters": {brickroad_maze: [["Nothing"]]}, + + brickroad_maze: {rainy_circle: [["Nothing"]], + "Southern Winters": [["Nothing"]], + brickroad_maze: [["Nothing"]]}, + + rainy_circle: {rainy_circle: [["Nothing"]], + "Andonuts Lab Area": [["Nothing"]], + brickroad_maze: [["Nothing"]]}, + + "Andonuts Lab Area": {rainy_circle: [["Nothing"]], + stonehenge_base: [["Eraser Eraser"]], + "Winters": [["Nothing"]]}, + + "Stonehenge Base": {"Stonehenge Base": [["Nothing"]]}, + + "Summers": {"Scaraba": [["Nothing"]], + "Summers Museum": [["Tiny Ruby"]], + "Global ATM Access": [["Nothing"]]}, + + "Summers Museum": {"Summers Museum": [["Nothing"]]}, + + "Dalaam": {pink_cloud: [["Carrot Key"]]}, + + "Pink Cloud": {"Pink Cloud": [["Nothing"]]}, + + "Scaraba": {pyramid: [["Hieroglyph Copy"]], + "Common Condiment Shop": [["Nothing"]], + "Global ATM Access": [["Nothing"]]}, + + pyramid: {"Southern Scaraba": [["Nothing"]]}, + + "Southern Scaraba": {dungeon_man: [["Key to the Tower"]]}, + + "Dungeon Man": {"Deep Darkness": [["Submarine to Deep Darkness"]]}, + + "Deep Darkness": {"Deep Darkness Darkness": [["Hawk Eye"]]}, + + "Deep Darkness Darkness": {"Tenda Village": [["Nothing"]], + "Deep Darkness": [["Nothing"]]}, + + "Tenda Village": {lumine_hall: [["Shyness Book"]], + "Deep Darkness Darkness": [["Hawk Eye"]]}, + + "Lumine Hall": {"Lost Underworld": [["Nothing"]]}, + + "Lost Underworld": {fire_spring: [["Nothing"]]}, + + "Fire Spring": {"Fire Spring": [["Nothing"]]}, + + "Magicant": {sea_of_eden: [["Ness"]], + "Global ATM Access": [["Nothing"]]}, + + "Sea of Eden": {"Sea of Eden": [["Nothing"]]}, + + "Cave of the Present": {"Cave of the Past": [["Power of the Earth"]]}, + + "Cave of the Past": {"Endgame": [["Paula"]]}, + + "Endgame": {"Endgame": [["Nothing"]]}, + + "Common Condiment Shop": {"Common Condiment Shop": [["Nothing"]]}, + + "Global ATM Access": {"Global ATM Access": [["Nothing"]]} + + } + + teleports = { + "Onett Teleport": "Onett", + "Twoson Teleport": "Twoson", + "Happy-Happy Village Teleport": "Happy-Happy Village", + "Threed Teleport": "Threed", + "Saturn Valley Teleport": "Saturn Valley", + "Dusty Dunes Teleport": "Dusty Dunes Desert", + "Fourside Teleport": "Fourside", + "Winters Teleport": "Winters", + "Summers Teleport": "Summers", + "Scaraba Teleport": "Scaraba", + "Dalaam Teleport": "Dalaam", + "Deep Darkness Teleport": "Deep Darkness", + "Tenda Village Teleport": "Tenda Village", + "Lost Underworld Teleport": "Lost Underworld", + "Magicant Teleport": "Magicant" + } + + if world.options.no_free_sanctuaries: + world.area_rules["Happy-Happy Village"][lilliput_steps] = [["Tiny Key"]] + world.area_rules["Lost Underworld"][fire_spring] = [["Tenda Lavapants"]] + else: + world.area_rules["Happy-Happy Village"][lilliput_steps] = [["Nothing"]] + world.area_rules["Lost Underworld"][fire_spring] = [["Nothing"]] + + inventory = {0: ["Nothing"]} # Nothing means no item needed for connection + item_regions = {} + + for item in world.multiworld.precollected_items[world.player]: + inventory[0].append(item.name) + + unconnected_regions = [world.starting_region, "Ness's Mind"] + world.accessible_regions = [world.starting_region, "Ness's Mind"] + if world.options.random_start_location: + unconnected_regions.append(teleports[world.starting_teleport]) + world.accessible_regions.append(teleports[world.starting_teleport]) + + world.scaled_area_order = [] + passed_connections = [] + local_prog = [] + ness_scaled = False + paula_scaled = False + jeff_scaled = False + poo_scaled = False + badge_scaled = False + scaled_chars = { + "Ness": ness_scaled, + "Paula": paula_scaled, + "Jeff": jeff_scaled, + "Poo": poo_scaled + } + + sphere_count = 0 + last_region = "Ness's Mind" + regions_that_were_already_scaled = [] + early_regions = [] + world.Ness_region = "Ness's Mind" + world.Paula_region = "Ness's Mind" + world.Jeff_region = "Ness's Mind" + world.Poo_region = "Ness's Mind" + world.Badge_region = "Ness's Mind" + for item in world.multiworld.precollected_items[world.player]: + if item.name in ["Ness", "Paula", "Jeff", "Poo"]: + scaled_chars[item.name] = True + + if item.name == "Franklin Badge": + badge_scaled = True + + for num, sphere in enumerate(world.multiworld.earthbound_locations_by_sphere): + if num + 1 not in inventory: + inventory[num + 1] = [] + + for location in sorted(sphere): + if num == 0: + if location.parent_region.name not in world.accessible_regions and location.player == world.player: + early_regions.append(location.parent_region.name) + world.accessible_regions.append(location.parent_region.name) + unconnected_regions.append(location.parent_region.name) + + if location.item.player == world.player and location.item.advancement: + inventory[num + 1].append(location.item.name) + if location.player == world.player: + local_prog.append(location.item.name) + if location.item.name not in item_regions: + item_regions[location.item.name] = [] + item_regions[location.item.name].append(location.parent_region.name) + + # TODO; all areas have levels now, so I can skip the combat regions check + if location.player == world.player and location.parent_region.name in combat_regions and ( + location.parent_region.name not in regions_that_were_already_scaled): + last_region = location.parent_region.name + + regions_that_were_already_scaled.append(last_region) + + if location.item.player == world.player and location.item.name == "Ness" and not scaled_chars["Ness"]: + if location.parent_region.name in combat_regions and (location.player == world.player) and ( + location.name not in locations_with_item_requirements): + world.Ness_region = location.parent_region.name + else: + world.Ness_region = last_region + scaled_chars["Ness"] = True + + if location.item.player == world.player and location.item.name == "Paula" and not scaled_chars["Paula"]: + if location.parent_region.name in combat_regions and (location.player == world.player) and ( + location.name not in locations_with_item_requirements): + world.Paula_region = location.parent_region.name + else: + world.Paula_region = last_region + scaled_chars["Paula"] = True + + if location.item.player == world.player and location.item.name == "Jeff" and not scaled_chars["Jeff"]: + if location.parent_region.name in combat_regions and (location.player == world.player) and ( + location.name not in locations_with_item_requirements): + world.Jeff_region = location.parent_region.name + else: + world.Jeff_region = last_region + scaled_chars["Jeff"] = True + + if location.item.player == world.player and location.item.name == "Poo" and not scaled_chars["Poo"]: + if location.parent_region.name in combat_regions and (location.player == world.player) and ( + location.name not in locations_with_item_requirements): + world.Poo_region = location.parent_region.name + else: + world.Poo_region = last_region + scaled_chars["Poo"] = True + + if location.item.player == world.player and location.item.name == "Franklin Badge" and not badge_scaled: + if location.parent_region.name in combat_regions and (location.player == world.player) and ( + location.name not in locations_with_item_requirements): + world.Badge_region = location.parent_region.name + else: + world.Badge_region = last_region + badge_scaled = True + + sphere_count = num + + for item in range(1, len(inventory)): + if item in inventory: + inventory[item] = inventory[item - 1] + inventory[item] + else: + inventory[item] = inventory[item - 1] + + for i in range(sphere_count): + # Ness's mind needs to be calculated last, always. (Players are more likely to walk around + # and explore areas than suddenly leave with a teleport) + # Shuffle it to the end of the list on each loop so it gets deprioritized + # Is there a better way to do this? + if "Ness's Mind" in unconnected_regions: + unconnected_regions.remove("Ness's Mind") + unconnected_regions.append("Ness's Mind") # probably do this differently earlier + for region in unconnected_regions: + for connection in world.area_exits[region]: + if f"{region} -> {connection}" not in passed_connections: + for rule_set in world.area_rules[region][connection]: + # check if this sphere has the items needed to make this connection + if all(item in inventory[i] for item in rule_set): + passed_connections.append(f"{region} -> {connection}") + if connection not in world.accessible_regions: + world.accessible_regions.append(connection) + unconnected_regions.append(connection) + else: + world.area_exits[region].remove(connection) + if "Endgame" in unconnected_regions: + unconnected_regions.remove("Endgame") + unconnected_regions.insert(0, "Endgame") + + for region in world.multiworld.get_regions(world.player): + if region.name not in world.accessible_regions and region.name != "Menu": + world.accessible_regions.append(region.name) + + if world.options.magicant_mode == MagicantMode.option_alternate_goal and world.options.giygas_required: + # If magicant is an alternate goal it should be scaled after Giygas + world.accessible_regions.remove("Magicant") + world.accessible_regions.append("Sea of Eden") + world.accessible_regions.insert(world.accessible_regions.index("Endgame") + 1, "Magicant") + elif world.options.magicant_mode == MagicantMode.option_optional_boost and world.options.giygas_required: + world.accessible_regions.insert(world.accessible_regions.index("Endgame") - 1, "Magicant") + elif world.options.magicant_mode == MagicantMode.option_optional_boost and not world.options.giygas_required: + # Just add it to the end of scaling + world.accessible_regions.append("Magicant") + world.accessible_regions.append("Sea of Eden") + + # calculate which areas need to have enemies scaled + for region in world.accessible_regions: + if region in world.regional_enemies: + world.scaled_area_order.append(region) + + current_level = 1 + world.area_levels = {} + for region in world.accessible_regions: + world.area_levels[region] = current_level + current_level += expected_level_gains[region] + + if world.Ness_region == "Ness's Mind": + world.Ness_region = world.scaled_area_order[0] + + if world.Paula_region == "Ness's Mind": + world.Paula_region = world.scaled_area_order[0] + + if world.Jeff_region == "Ness's Mind": + world.Jeff_region = world.scaled_area_order[0] + + if world.Poo_region == "Ness's Mind": + world.Poo_region = world.scaled_area_order[0] + + if world.Badge_region == "Ness's Mind": + world.Badge_region = world.scaled_area_order[0] diff --git a/worlds/earthbound/modules/boss_shuffle.py b/worlds/earthbound/modules/boss_shuffle.py new file mode 100644 index 0000000000..3a6e8708eb --- /dev/null +++ b/worlds/earthbound/modules/boss_shuffle.py @@ -0,0 +1,411 @@ +from typing import NamedTuple, TYPE_CHECKING +from logging import warning +import struct +if TYPE_CHECKING: + from .. import EarthBoundWorld + from ..Rom import LocalRom +import struct + +boss_sprite_pointers = { + "Frank": 0xEF2B69, + "Frankystein Mark II": 0xEF43F9, + "Titanic Ant": 0xEF3B57, + "Captain Strong": 0xEF23A9, + "Everdred": 0xEF2BCD, + "Mr. Carpainter": 0xEF2BFF, + "Mondo Mole": 0xEF4557, + "Boogey Tent": 0xEF3748, + "Mini Barf": 0xEF3B89, + "Master Belch": 0xEF3CD6, + "Trillionage Sprout": 0xEF3BBB, + "Guardian Digger": 0xEF45BB, + "Dept. Store Spook": 0xEF495F, + "Evil Mani-Mani": 0xEF395F, + "Clumsy Robot": 0xEF45A2, + "Shrooom!": 0xEF392B, + "Plague Rat of Doom": 0xEF4570, + "Thunder and Storm": 0xEF3C70, + "Kraken": 0xEF3991, + "Guardian General": 0xEF3C3C, + "Master Barf": 0xEF39F5, + "Starman Deluxe": 0xEF3A59, + "Electro Specter": 0xEF45ED, + "Carbon Dog": 0xEF3D08, + "Ness's Nightmare": 0xEF395F, + "Heavily Armed Pokey": 0xEF49AA, + "Starman Junior": 0xEF3A59, + "Diamond Dog": 0xEF3D08, + "Giygas": 0xEF40F2 + +} + +boss_plando_keys = { + "Frank", + "Frankystein Mark II", + "Frankystein", + "Captain Strong", + "Strong", + "Everdred", + "Mr. Carpainter", + "Mr Carpainter", + "Carpainter", + "Mondo Mole", + "Boogey Tent", + "Mini Barf", + "Master Belch", + "Belch", + "Trillionage Sprout", + "Guardian Digger", + "Dept. Store Spook", + "Dept Store Spook", + "Evil Mani Mani", + "Mani Mani", + "Clumsy Robot", + "Shrooom!", + "Shrooom", + "Shroom!", + "Shroooooom!", + "Shroom", + "Plague Rat of Doom", + "Thunder and Storm", + "Kraken", + "The Kraken", + "Guardian General", + "Master Barf", + "Starman Deluxe", + "Starman DX", + "Electro Specter", + "Carbon Dog", + "Ness's Nightmare", + "Nesss Nightmare", + "Heavily Armed Pokey", + "Pokey" + "Starman Junior", + "Diamond Dog", + "Giygas" +} + +boss_typo_key = { + "Frankystein": "Frankystein Mark II", + "Strong": "Captain Strong", + "Mr Carpainter": "Mr. Carpainter", + "Carpainter": "Mr. Carpainter", + "Belch": "Master Belch", + "Dept Store Spook": "Dept. Store Spook", + "Evil Mani Mani": "Evil Mani-Mani", + "Mani Mani": "Evil Mani-Mani", + "Shroom": "Shrooom!", + "Shrooom": "Shrooom!", + "Shroom!": "Shrooom!", + "Shroooooom!": "Shrooom!", + "The Kraken": "Kraken", + "Starman DX": "Starman Deluxe", + "Nesss Nightmare": "Ness's Nightmare", + "Pokey": "Heavily Armed Pokey" +} + +banned_transformations = ["Master Belch", "Master Barf", "Kraken", "Heavily Armed Pokey"] +hard_final_bosses = ["Carbon Dog", "Kraken", "Clumsy Robot", "Starman Junior", "Starman Deluxe", "Giygas", "Thunder and Storm", "Electro Specter", + "Evil Mani-Mani", "Ness's Nightmare", "Shrooom!", "Master Belch"] + + +class SlotInfo(NamedTuple): + sprite_addrs: list[int] + short_names: list[int] + long_names: list[int] + battle_data: list[int] + + +class BossData(NamedTuple): + sprite_pointer: int + short_name_pointer: int + long_name_pointer: int + battle_group: int + enemy_id: int + music: int + + +def initialize_bosses(world: "EarthBoundWorld") -> None: + from ..Options import BossShuffle + + world.boss_list = [ + "Frank", + "Frankystein Mark II", + "Titanic Ant", + "Captain Strong", + "Everdred", + "Mr. Carpainter", + "Mondo Mole", + "Boogey Tent", + "Mini Barf", + "Master Belch", + "Trillionage Sprout", + "Guardian Digger", + "Dept. Store Spook", + "Evil Mani-Mani", + "Clumsy Robot", + "Shrooom!", + "Plague Rat of Doom", + "Thunder and Storm", + "Kraken", + "Guardian General", + "Master Barf", + "Starman Deluxe", + "Electro Specter", + "Carbon Dog", + "Ness's Nightmare", + "Heavily Armed Pokey", + "Starman Junior", + "Diamond Dog", + "Giygas" + ] + + world.boss_slots = { + "Frank": SlotInfo([0x0F9338], + [0x066111, 0x066198, 0x0661AC], + [0x065F11, 0x065F20, 0x066482, 0x0660C5, 0x0746E2, 0x074BC1, 0x074E1D], + [0x0683FF]), + "Frankystein Mark II": SlotInfo([0x0F96F0], [], [0x066146, 0x06648B, 0x0664FC], [0x068406]), + "Titanic Ant": SlotInfo([], [], [], [0x06840D]), + "Captain Strong": SlotInfo([], [0x5FC2B, 0x05FCF7, 0x065F88, 0x066085], + [0x05FC59, 0x3317DB], [0x068468]), + "Everdred": SlotInfo([0x0F9A64, 0x0F9FB4], [0x2EEEEA], [0x095C70], [0x06846F]), + "Mr. Carpainter": SlotInfo([0x0FA27E, 0x0FA5D0], + [0x0990DA, 0x0684D0], + [0x0993DB, 0x09945E, 0x099311, 0x099364, 0x098EF6, 0x099143, 0x099028, + 0x0983BB, 0x09840C, 0x09835B, 0x09056F, 0x0794EC], + [0x0684FD]), + "Mondo Mole": SlotInfo([], [], [], [0x068414]), + "Boogey Tent": SlotInfo([0x0FACEB], [], [], [0x06853C]), + "Mini Barf": SlotInfo([0x0FB0B4], [], [], [0x2F9515]), + "Master Belch": SlotInfo([0x0FB7CF], + [0x09E64D, 0x09E690, 0x2EEED7, 0x08EF21, 0x08EF38], + [0x2F6297, 0x2F62B3, 0x2F6910, 0x2F6973], + [0x068558]), + "Trillionage Sprout": SlotInfo([], [], [], [0x068422]), + "Guardian Digger": SlotInfo([0x0FC11B, 0x0FC0B5, 0x0FC12C, 0x0FC0D7, 0x0FC0C6], + [], + [], + [0x06858E, 0x068595, 0x06859C, 0x0685A3, 0x0685AA]), + "Dept. Store Spook": SlotInfo([0x0FC803], [], [], [0x06855F]), + "Evil Mani-Mani": SlotInfo([0x0FE6E4], [], [0x0978AD, 0x09782D, 0x097998], [0x068587]), + "Clumsy Robot": SlotInfo([0x0FC429], [], [], [0x06856D]), + "Shrooom!": SlotInfo([], [], [], [0x06841B]), + "Plague Rat of Doom": SlotInfo([], [], [], [0x068429]), + "Thunder and Storm": SlotInfo([], [], [], [0x068430]), + "Kraken": SlotInfo([0x092CD0, 0x0FE370, 0x0FE381, 0x0FE392, 0x092D13], + [0x092D4D], + [0x086061, 0x086139, 0x08B430, 0x08B6FC, 0x08B8B4, 0x08B591, 0x09AB2B], + [0x0685B1, 0x2F9472, 0x2F9491, 0x2F94B0]), + "Guardian General": SlotInfo([0x0FD7E2], [], [], [0x2F9453]), + "Master Barf": SlotInfo([0x0FDB23], [], [], [0x068574]), + "Starman Deluxe": SlotInfo([0x0FB626], [], [0x092C29], [0x2F942F]), + "Electro Specter": SlotInfo([], [], [], [0x068437]), + "Carbon Dog": SlotInfo([], [], [], [0x06843E]), + "Ness's Nightmare": SlotInfo([0x0FE3B4], [], [], [0x068580]), + "Heavily Armed Pokey": SlotInfo([0x09C2EC], [0x2EEEC3, 0x2EEECC], [], []), + "Starman Junior": SlotInfo([], [], [], []), + "Diamond Dog": SlotInfo([], [], [], []), + "Giygas": SlotInfo([0x09C2BF, 0x09C2E5], [0x2EF0A9], [0x2EF09F], []) + } + + world.boss_info = { + "Frank": BossData(0x0099, 0xEEEEBC, 0xEEEEBC, 0x01C0, 0x83, 0x64), + "Frankystein Mark II": BossData(0x0191, 0xEEEF0A, 0xEEEEF6, 0x01C1, 0x82, 0x66), + "Titanic Ant": BossData(0x0139, 0xEEEF1E, 0xEEEF16, 0x01C2, 0x25, 0x67), + "Captain Strong": BossData(0x004B, 0xEEEF2A, 0xEEEF22, 0x01C4, 0xE4, 0x66), + "Everdred": BossData(0x009D, 0xEEEF31, 0xEEEF31, 0x01C5, 0x6E, 0x62), + "Mr. Carpainter": BossData(0x009F, 0xEEEF3E, 0xEEEF3A, 0x01C6, 0x1A, 0x94), + "Mondo Mole": BossData(0x019F, 0xEEEF4F, 0xEEEF49, 0x01C7, 0x29, 0x67), + "Boogey Tent": BossData(0x0110, 0xEEEF5B, 0xEEEF54, 0x01CA, 0x66, 0x66), + "Mini Barf": BossData(0x013B, 0xEEEF65, 0xEEEF60, 0x01E2, 0xE2, 0x63), + "Master Belch": BossData(0x0148, 0xEEEF71, 0xEEEF6A, 0x01C8, 0x5D, 0x63), + "Trillionage Sprout": BossData(0x013D, 0xEEEF83, 0xEEEF77, 0x01C9, 0x5A, 0x67), + "Guardian Digger": BossData(0x01A3, 0xEEEF93, 0xEEEF8A, 0x01CB, 0x2A, 0x67), + "Dept. Store Spook": BossData(0x01C7, 0xEEEFA6, 0xEEEF9A, 0x01CC, 0x02, 0x66), + "Evil Mani-Mani": BossData(0x0125, 0xEEEFC1, 0xEEEFAC, 0x01CD, 0x89, 0x94), + "Clumsy Robot": BossData(0x01A2, 0xEEEFD2, 0xEEEFCB, 0x01CE, 0x92, 0x94), + "Shrooom!": BossData(0x0123, 0xEEEFD8, 0xEEEFD8, 0x01D1, 0x27, 0x67), + "Plague Rat of Doom": BossData(0x01A0, 0xEEEFEE, 0xEEEFE0, 0x01CF, 0x28, 0x67), + "Thunder and Storm": BossData(0x0144, 0xEEEFFF, 0xEEEFF3, 0x01D0, 0x80, 0x68), + "Kraken": BossData(0x0127, 0xEEF005, 0xEEF005, 0x01D3, 0x31, 0x68), + "Guardian General": BossData(0x0142, 0xEEF015, 0xEEF00C, 0x01D4, 0x49, 0x67), + "Master Barf": BossData(0x012B, 0xEEEF65, 0xEEF01D, 0x01D5, 0x5F, 0x63), + "Starman Deluxe": BossData(0x012F, 0xEEF034, 0xEEF029, 0x01D2, 0x4A, 0x61), + "Electro Specter": BossData(0x01A5, 0xEEF043, 0xEEF03B, 0x01D6, 0x74, 0x68), + "Carbon Dog": BossData(0x014A, 0xEEF052, 0xEEF04B, 0x01D7, 0x1B, 0x67), + "Ness's Nightmare": BossData(0x0125, 0xEEF070, 0xEEF06A, 0x01D8, 0x15, 0x94), + "Heavily Armed Pokey": BossData(0x01CA, 0xEEF064, 0xEEF056, 0x000E, 0xD8, 0x69), + "Starman Junior": BossData(0x012F, 0xEEF082, 0xEEF07A, 0x01DA, 0xD6, 0x94), + "Diamond Dog": BossData(0x014A, 0xEEF052, 0xEEF089, 0x01D9, 0x53, 0x61), + "Giygas": BossData(0x0172, 0xEEF095, 0xEEF095, 0x01DD, 0xDC, 0x49) + } + + if world.options.skip_prayer_sequences: + # Boss shuffle sprites needs to apply to the skip prayer cleanup too + world.boss_slots["Giygas"].sprite_addrs.append(0x07B9AC) + world.boss_slots["Heavily Armed Pokey"].sprite_addrs.append(0x07B9A7) + + # mole/rat text + # todo; Giygas sprites/text + + world.boss_slot_order = world.boss_list.copy() + if type(world.options.boss_shuffle.value) == str: + boss_plando = world.options.boss_shuffle.value.split(";") + shuffle_result = boss_plando.pop() + else: + boss_plando = [] + shuffle_result = world.options.boss_shuffle.value + + if shuffle_result == "true" or shuffle_result == 1: + world.random.shuffle(world.boss_list) + + if not world.options.decouple_diamond_dog: + world.boss_list.remove("Diamond Dog") + insert_index = 28 if not world.options.boss_shuffle_add_giygas else 27 + world.boss_list.insert(insert_index, "Diamond Dog") + + if not world.options.boss_shuffle_add_giygas: + world.boss_list.remove("Giygas") + world.boss_list.insert(29, "Giygas") + + if world.options.safe_final_boss: + while world.boss_list[25] in hard_final_bosses: + i = world.random.randrange(len(world.boss_list)) + if (world.boss_list[i] == "Diamond Dog" and not world.options.decouple_diamond_dog) or ( + world.boss_list[i] == "Giygas" and not world.options.boss_shuffle_add_giygas + ): + continue + world.boss_list[25], world.boss_list[i] = world.boss_list[i], world.boss_list[25] + + did_plando_diam_dog = False + diamond_dog_plando_slot = None + + for item in boss_plando: + boss_block = item.split("-") + boss = boss_block[0].title() # Boss is what's being placed + slot = boss_block[1].title() # SLot is where the boss is going. + if boss in boss_typo_key: + boss = boss_typo_key[boss] + + if slot in boss_typo_key: + slot = boss_typo_key[boss] + + if slot == "Diamond Dog": + did_plando_diam_dog = True + diamond_dog_plando_slot = boss + + old_index = world.boss_list.index(boss) # This should be the slot where the chosen boss currently is + new_index = world.boss_slot_order.index(slot) # Boss slots should use the original position + + world.boss_list[old_index] = world.boss_list[new_index] # We want to replace the boss that was originally there with the boss we're swapping with + world.boss_list[new_index] = boss + + if world.boss_list[25] == "Carbon Dog" and world.boss_list[27] in banned_transformations: + if did_plando_diam_dog: + warning(f"""Unable to plando {diamond_dog_plando_slot} for {world.multiworld.get_player_name(world.player)}'s EarthBound world. +This boss cannot be placed onto Diamond Dog's slot if Carbon Dog is on Heavily Armed Pokey's slot. +This message is likely the result of randomization and can be safely ignored.""") # Why is this spacing the only way to get the message to render legibly + original_boss = world.boss_list[27] + transformation_replacement = world.random.randint(0, 24) + while world.boss_list[transformation_replacement] in banned_transformations: + transformation_replacement = world.random.randint(0, 24) + world.boss_list[27] = world.boss_list[transformation_replacement] + world.boss_list[transformation_replacement] = original_boss + +def write_bosses(world: "EarthBoundWorld", rom: "LocalRom") -> None: + rom.write_bytes(0x15E527, bytearray([0x00, 0x00])) # Blank out Pokey's end battle action + rom.write_bytes(0x15B8B9, bytearray([0x00, 0x00])) + rom.write_bytes(0x15DD13, bytearray([0x00, 0x00])) # Blank out barf's end battle script + rom.write_bytes(0x15E69F, bytearray([0x00, 0x00])) # Blank giygas + if world.boss_list[25] == "Carbon Dog": # Heavily armed Pokey + pokey_adjust = 27 + else: + pokey_adjust = 25 + + rom.write_bytes(world.enemies[world.boss_list[pokey_adjust]].address + 78, bytearray([0x13, 0x01])) + for i in range(1, world.enemies[world.boss_list[pokey_adjust]].attack_extensions): + enemy_new = f"{world.enemies[world.boss_list[pokey_adjust]].name} ({i + 1})" + rom.write_bytes(world.enemies[enemy_new].address + 78, bytearray([0x13, 0x01])) + + if world.boss_list[20] == "Carbon Dog": # Master Barf + barf_adjust = 27 + else: + barf_adjust = 20 + + rom.write_bytes(world.enemies[world.boss_list[barf_adjust]].address + 78, bytearray([0xF4, 0x00])) + for i in range(1, world.enemies[world.boss_list[barf_adjust]].attack_extensions): + enemy_new = f"{world.enemies[world.boss_list[barf_adjust]].name} ({i + 1})" + rom.write_bytes(world.enemies[enemy_new].address + 78, bytearray([0xF4, 0x00])) + + if world.boss_list[28] == "Carbon Dog": # Giygas 2 + # I should probably just hard stop Carbon Dog from being here + giygas_2_adjust = 27 # Set to the diamond dog slot + else: + + giygas_2_adjust = 28 + + rom.write_bytes(world.enemies[world.boss_list[giygas_2_adjust]].address + 78, bytearray([0x16, 0x01])) + for i in range(1, world.enemies[world.boss_list[giygas_2_adjust]].attack_extensions): + enemy_new = f"{world.enemies[world.boss_list[giygas_2_adjust]].name} ({i + 1})" + rom.write_bytes(world.enemies[enemy_new].address + 78, bytearray([0x16, 0x01])) + + if world.boss_list[25] != "Heavily Armed Pokey": + rom.write_bytes(0x15E50A, bytearray([0x19, 0x6E, 0xEF])) + rom.write_bytes(0x15E4FE, bytearray([0x70, 0x11, 0x01])) # Add to the scaling list? + + for slot, boss in enumerate(world.boss_slot_order): + for address in world.boss_slots[boss].sprite_addrs: # sprite + rom.write_bytes(address, struct.pack("H", world.boss_info[world.boss_list[slot]].sprite_pointer)) + + for address in world.boss_slots[boss].short_names: # short name + rom.write_bytes(address, struct.pack("I", world.boss_info[world.boss_list[slot]].short_name_pointer)) + + for address in world.boss_slots[boss].long_names: # long name + rom.write_bytes(address, struct.pack("I", world.boss_info[world.boss_list[slot]].long_name_pointer)) + + for address in world.boss_slots[boss].battle_data: # battle + rom.write_bytes(address, struct.pack("H", world.boss_info[world.boss_list[slot]].battle_group)) + + rom.write_bytes(0x10DF7F, struct.pack("H", world.boss_info[world.boss_list[25]].enemy_id)) + rom.write_bytes(0x10DF86, struct.pack("H", world.boss_info[world.boss_list[25]].enemy_id)) + # rom.write_bytes(0x10DF8D, struct.pack("H", world.boss_info[world.boss_list[25]].enemy_id)) + rom.write_bytes(0x10DFA2, struct.pack("H", world.boss_info[world.boss_list[25]].enemy_id)) + rom.write_bytes(0x10D563, struct.pack("H", world.boss_info[world.boss_list[25]].enemy_id)) + rom.write_bytes(world.enemies[world.boss_list[25]].address + 91, bytearray([0x00])) # Row of the enemy + + rom.write_bytes(0x10DF83, struct.pack("H", world.boss_info[world.boss_list[28]].enemy_id)) + rom.write_bytes(0x02C4FD, struct.pack("H", world.boss_info[world.boss_list[28]].enemy_id)) + rom.write_bytes(0x10D560, struct.pack("H", world.boss_info[world.boss_list[28]].enemy_id)) + + rom.write_bytes(0x159FC7, struct.pack("H", world.boss_info[world.boss_list[27]].enemy_id)) + rom.write_bytes(0x15D5C1, struct.pack("H", world.boss_info[world.boss_list[27]].enemy_id)) + # carbon dog's transformation + rom.write_bytes(0x10DF69, struct.pack("H", world.boss_info[world.boss_list[27]].enemy_id)) + rom.write_bytes(0x02C503, bytearray([world.boss_info[world.boss_list[28]].music])) # music + + rom.write_bytes(0x2F188F, struct.pack("I", boss_sprite_pointers[world.boss_list[3]])) + + rom.write_bytes(0x0302CE, struct.pack("H", 0x0154)) + rom.write_bytes(0x05F870, struct.pack("H", 0x0154)) + rom.write_bytes(0x0F8E3D, struct.pack("H", 0x0154)) + rom.write_bytes(0x05F886, struct.pack("H", 0x0154)) + rom.write_bytes(0x05F8A1, struct.pack("H", 0x0154)) + rom.write_bytes(0x05F8E3, struct.pack("H", 0x0154)) + rom.write_bytes(0x05FB0E, struct.pack("H", 0x0154)) + rom.write_bytes(0x05FBFC, struct.pack("H", 0x0154)) + rom.write_bytes(0x05FD08, struct.pack("H", 0x0154)) + rom.write_bytes(0x05FD5C, struct.pack("H", 0x0154)) + rom.copy_bytes(0x10DF7B, 6, 0x2FFF10) + if world.boss_list[25] == "Carbon Dog": + rom.write_bytes(0x2FFF16, bytearray([0x00])) # Count of enemies + rom.write_bytes(0x2FFF17, struct.pack("H", world.boss_info[world.boss_list[27]].enemy_id)) # Add diamond dog + rom.write_bytes(0x2FFF19, bytearray([0xFF])) + rom.write_bytes(world.enemies[world.boss_list[27]].address + 91, bytearray([0x00])) # Force to front row + elif world.boss_list[25] == "Giygas": + rom.write_bytes(0x0121DF, bytearray([0x00])) + rom.write_bytes(0x2FFF16, bytearray([0xFF])) + else: + rom.write_bytes(0x2FFF16, bytearray([0xFF])) + + # c2c505 sets the song diff --git a/worlds/earthbound/modules/dungeon_er.py b/worlds/earthbound/modules/dungeon_er.py new file mode 100644 index 0000000000..34bf429556 --- /dev/null +++ b/worlds/earthbound/modules/dungeon_er.py @@ -0,0 +1,212 @@ +import struct +from typing import Optional, TYPE_CHECKING +from dataclasses import dataclass +from ..game_data.local_data import item_id_table +from typing import Optional, TYPE_CHECKING +from dataclasses import dataclass +from ..game_data.local_data import item_id_table +if TYPE_CHECKING: + from .. import EarthBoundWorld + from ..Rom import LocalRom + + +@dataclass +class EBDungeonDoor: + address: int + copyaddress: int + direction: int + is_script: bool = False # Script warps invert the x and y coordinate + + +def shuffle_dungeons(world: "EarthBoundWorld") -> None: + # Is the dept. store a dungeon + single_exit_dungeons = [ + "Giant Step", + "Happy-Happy HQ", + "Lilliput Steps", + "Milky Well", + "Gold Mine", + "Moonside", + "Monotoli Building", + "Magnet Hill", + "Pink Cloud", + "Dungeon Man", + "Stonehenge Base", + "Lumine Hall", + "Fire Spring", + "Sea of Eden" + ] + + double_exit_dungeons = [ + "Arcade", + "Brickroad Maze", + "Rainy Circle", + "Belch's Factory", + "Pyramid" + ] + + world.dungeon_connections = { + "Arcade": "Arcade", + "Giant Step": "Giant Step", + "Happy-Happy HQ": "Happy-Happy HQ", + "Lilliput Steps": "Lilliput Steps", + "Belch's Factory": "Belch's Factory", + "Milky Well": "Milky Well", + "Gold Mine": "Gold Mine", + "Moonside": "Moonside", + "Monotoli Building": "Monotoli Building", + "Magnet Hill": "Magnet Hill", + "Pink Cloud": "Pink Cloud", + "Dungeon Man": "Dungeon Man", + "Stonehenge Base": "Stonehenge Base", + "Brickroad Maze": "Brickroad Maze", + "Rainy Circle": "Rainy Circle", + "Pyramid": "Pyramid", + "Lumine Hall": "Lumine Hall", + "Fire Spring": "Fire Spring", + "Sea of Eden": "Sea of Eden" + } + if world.options.magicant_mode: + # Don't shuffle Magicant when it's important + single_exit_dungeons.remove("Sea of Eden") + + shuffled_single_dungeons = single_exit_dungeons.copy() + shuffled_double_dungeons = double_exit_dungeons.copy() + + if world.options.dungeon_shuffle: + world.random.shuffle(shuffled_single_dungeons) + world.random.shuffle(shuffled_double_dungeons) + + for index, entrance in enumerate(single_exit_dungeons): + world.dungeon_connections[entrance] = shuffled_single_dungeons[index] + + for index, entrance in enumerate(double_exit_dungeons): + world.dungeon_connections[entrance] = shuffled_double_dungeons[index] + + +def write_dungeon_entrances(world: "EarthBoundWorld", rom: "LocalRom") -> None: + dungeon_entrances = { + "Arcade": ["Arcade Entrance", "Arcade Exit", "Arcade Back Exit", "Arcade Back Entrance"], + "Giant Step": ["Giant Step Entrance", "Giant Step Exit"], + "Happy-Happy HQ": ["Happy-Happy HQ Entrance", "Happy-Happy HQ Exit"], + "Lilliput Steps": ["Lilliput Steps Entrance", "Lilliput Steps Exit"], + "Belch's Factory": ["Factory Script Warp", "Factory Exit", "Factory Back Exit", "Factory Back Entrance"], + "Milky Well": ["Milky Well Entrance", "Milky Well Exit"], + "Gold Mine": ["Mine Entrance", "Mine Exit"], + "Monotoli Building": ["Monotoli Entrance", "Monotoli Exit"], + "Moonside": ["Cafe Entrance", "Cafe Exit"], + "Brickroad Maze": ["Maze Entrance", "Maze Exit", "Maze Back Exit", "Maze Back Entrance"], + "Rainy Circle": ["Rainy Entrance", "Rainy Exit", "Rainy Back Exit", "Rainy Back Entrance"], + "Magnet Hill": ["Sewer Entrance", "Sewer Exit"], + "Pink Cloud": ["Pink Cloud Entrance", "Pink Cloud Exit"], + "Pyramid": ["Pyramid Entrance", "Pyramid Exit", "Pyramid Back Exit", "Pyramid Back Entrance"], + "Dungeon Man": ["D.M. Entrance Script", "D.M. Exit Script"], + "Stonehenge Base": ["Stonehenge Entrance", "Stonehenge Exit"], + "Lumine Hall": ["Lumine Entrance", "Lumine Exit"], + "Fire Spring": ["Fire Spring Entrance", "Fire Spring Exit"], + "Sea of Eden": ["Sea Entrance Script", "Sea Exit Script"] + } + + all_dungeon_doors = { + "Arcade Entrance": EBDungeonDoor(0x0F00CC, 0x321000, 7), + "Arcade Exit": EBDungeonDoor(0x0F029A, 0x321010, 5), + "Arcade Back Exit": EBDungeonDoor(0x0F026E, 0x321020, 1), + "Arcade Back Entrance": EBDungeonDoor(0x0F00C1, 0x321030, 5), + "Giant Step Entrance": EBDungeonDoor(0x0F0032, 0x321040, 7), + "Giant Step Exit": EBDungeonDoor(0x0F04B5, 0x321050, 5), + "Happy-Happy HQ Entrance": EBDungeonDoor(0x0F09E9, 0x321060, 7), + "Happy-Happy HQ Exit": EBDungeonDoor(0x0F0A99, 0x321070, 5), + "Lilliput Steps Entrance": EBDungeonDoor(0x0F09F4, 0x321080, 3), + "Lilliput Steps Exit": EBDungeonDoor(0x0F0B1A, 0x321090, 7), + "Factory Entrance": EBDungeonDoor(0x0F1277, 0x3210A0, 5), + "Factory Script Warp": EBDungeonDoor(0x15EECB, 0x3210B0, 5, True), + "Factory Exit": EBDungeonDoor(0x0F1159, 0x3210C0, 5), + "Factory Back Exit": EBDungeonDoor(0x0F11BC, 0x3210D0, 5), + "Factory Back Entrance": EBDungeonDoor(0x0F11FE, 0x3210E0, 3), + "Milky Well Entrance": EBDungeonDoor(0x0F12E9, 0x3210F0, 3), + "Milky Well Exit": EBDungeonDoor(0x0F11E8, 0x321100, 5), + "Mine Entrance": EBDungeonDoor(0x0F1378, 0x321110, 7), + "Mine Exit": EBDungeonDoor(0x0F1400, 0x321120, 5), + "Cafe Entrance": EBDungeonDoor(0x0F165D, 0x321150, 3), + "Cafe Exit": EBDungeonDoor(0x0F1A25, 0x321160, 7), + "Monotoli Entrance": EBDungeonDoor(0x0F1928, 0x321170, 7), + "Monotoli Exit": EBDungeonDoor(0x0F1862, 0x321180, 3), + "Maze Entrance": EBDungeonDoor(0x0F0EB6, 0x321190, 3), + "Maze Exit": EBDungeonDoor(0x0F0FD8, 0x3211A0, 5), + "Maze Back Exit": EBDungeonDoor(0x0F0FE3, 0x3211B0, 5), + "Maze Back Entrance": EBDungeonDoor(0x0F0EC1, 0x3211C0, 7), + "Rainy Entrance": EBDungeonDoor(0x0F0ED7, 0x3211D0, 7), + "Rainy Exit": EBDungeonDoor(0x0F1030, 0x3211E0, 5), + "Rainy Back Exit": EBDungeonDoor(0x0F0FEE, 0x3211F0, 5), + "Rainy Back Entrance": EBDungeonDoor(0x0F0EAB, 0x321200, 3), + "Sewer Entrance": EBDungeonDoor(0x0F1A3B, 0x321210, 5), + "Sewer Exit": EBDungeonDoor(0x0F1A9E, 0x321220, 1), + "Pink Cloud Entrance": EBDungeonDoor(0x0F1E32, 0x321230, 7), + "Pink Cloud Exit": EBDungeonDoor(0x0F1EAB, 0x321240, 5), + "Pyramid Entrance": EBDungeonDoor(0x0F1F3A, 0x321250, 3), + "Pyramid Exit": EBDungeonDoor(0x0F1FA9, 0x321260, 5), + "Pyramid Back Exit": EBDungeonDoor(0x0F20E8, 0x321290, 5), + "Pyramid Back Entrance": EBDungeonDoor(0x0F1F45, 0x3212A0, 3), + "D.M. Entrance Script": EBDungeonDoor(0x15F0A3, 0x321270, 7, True), + "D.M. Exit Script": EBDungeonDoor(0x15F0CB, 0x321280, 5, True), + "Stonehenge Entrance": EBDungeonDoor(0x0F105C, 0x3212B0, 7), + "Stonehenge Exit": EBDungeonDoor(0x0F1072, 0x3212C0, 3), + "Lumine Entrance": EBDungeonDoor(0x0F239C, 0x3212D0, 7), + "Lumine Exit": EBDungeonDoor(0x0F2318, 0x3212E0, 3), + "Fire Spring Entrance": EBDungeonDoor(0x0F23D4, 0x3212F0, 3), + "Fire Spring Exit": EBDungeonDoor(0x0F2437, 0x321300, 5), + "Sea Entrance Script": EBDungeonDoor(0x15F25B, 0x321310, 3, True), + "Sea Exit Script": EBDungeonDoor(0x15ECEB, 0x321320, 5, True), + "Post-Nightmare Script": EBDungeonDoor(0x15ED4B, 0x321330, 5, True), + "Carpainter Failure Script": EBDungeonDoor(0x15EEF3, 0x321340, 7, True) + } + + paired_doors = {} + + for door in all_dungeon_doors: + rom.copy_bytes(all_dungeon_doors[door].address, 6, all_dungeon_doors[door].copyaddress) # Copy 6 bytes at the source of the door to the destination of the door + + for door in world.dungeon_connections: + for index, entrance in enumerate(dungeon_entrances[door]): + if "Exit" in entrance: + paired_doors[dungeon_entrances[world.dungeon_connections[door]][index]] = entrance + else: + paired_doors[entrance] = dungeon_entrances[world.dungeon_connections[door]][index] + + paired_doors["Post-Nightmare Script"] = paired_doors["Sea Exit Script"] + paired_doors["Carpainter Failure Script"] = paired_doors["Happy-Happy HQ Exit"] + + for door in paired_doors: + destination = all_dungeon_doors[paired_doors[door]] + source = all_dungeon_doors[door] + if source.is_script: + if destination.is_script: + rom.copy_bytes(destination.copyaddress, 6, source.address) + else: + rom.copy_bytes(destination.copyaddress + 2, 2, source.address) + rom.copy_bytes(destination.copyaddress, 2, source.address + 2) + rom.write_bytes(source.address + 4, bytearray([destination.direction])) + rom.copy_bytes(destination.copyaddress + 4, 1, source.address + 5) + else: + if destination.is_script: + rom.copy_bytes(destination.copyaddress + 2, 2, source.address) + rom.copy_bytes(destination.copyaddress, 2, source.address + 2) + rom.copy_bytes(destination.copyaddress + 5, 1, source.address + 4) + else: + rom.copy_bytes(destination.copyaddress, 5, source.address) + + rom.write_bytes(0x101664, struct.pack("H", 0x041F)) # Flag controlling the Saturn Valley ladder + rom.write_bytes(0x0F19C7, struct.pack("I", 0xF3104C)) # Replacement for the Moonside deliveryman + rom.write_bytes(0x0F0A93, struct.pack("I", 0x000000)) # Skip Pokey walking up after HHHQ + rom.write_bytes(0x086DFC, struct.pack("H", 0x00C7)) # Flag-independent Moonside entry + rom.write_bytes(0x0F1657, struct.pack("I", 0xF311A7)) # Fourside Cafe Door Script + rom.write_bytes(0x0F165B, struct.pack("H", 0x8091)) # Lock Cafe + rom.write_bytes(0x0FC8C6, struct.pack("I", 0xF3120B)) # Everdred script + rom.write_bytes(0x10784A, struct.pack("H", 0x0000)) # Mook spawn in stonehenge anteroom + rom.write_bytes(0x0FC51E, bytearray([0x00])) # Moonside sparkle always active + + rom.write_bytes(0x0FA4D6, bytearray([0xC7, 0x00, 0x01])) + + moonside_reward = world.multiworld.get_location("Fourside - Post-Moonside Delivery", world.player).item + if (moonside_reward.player != world.player) or world.options.remote_items or moonside_reward.name not in item_id_table: + rom.write_bytes(0x3310F7, struct.pack("I", 0xF310FB)) diff --git a/worlds/earthbound/modules/enemizer/__init__.py b/worlds/earthbound/modules/enemizer/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/earthbound/modules/enemizer/enemy_attributes.py b/worlds/earthbound/modules/enemizer/enemy_attributes.py new file mode 100644 index 0000000000..af4b2d30d7 --- /dev/null +++ b/worlds/earthbound/modules/enemizer/enemy_attributes.py @@ -0,0 +1,1024 @@ +enemy_species = [ + "Cultist", + "Spook", + "Frog", + "Buffalo", + "Antoid", + "Mushroom", + "Fungus", + "Mobile Sprout", + "Fire Plug", + "Record", + "Power Robot", + "Reactor Robot", + "Hieroglyph", + "Asp Hieroglyph", + "Swoosh", + "Menace", + "Spirit", + "Elemental", + "Party Man", + "Reveler", + "Local Guy", + "Hippie", + "Bear", + "Bear Seven", + "Moldyman", + "Mite", + "Lady", + "Ant", + "Coffee Cup", + "Dice", + "Little Pile", + "Kraken", + "Robo", + "Cop", + "Coil Snake", + "Batty", + "Roach", + "Sign", + "Shambler", + "Punk", + "Skelpion", + "Starman", + "Sphere", + "Royal Guard", + "General", + "Zombie", + "Possessor", + "Dog", + "Oak", + "Octobot", + "Duck", + "Clock", + "Wolf", + "Musica", + "Pile of Puke", + "Kiss of Death", + "Eel", + "Tangoo", + "Arachnid", + "Demon", + "Fobby", + "Foppy", + "Booka", + "Mook", + "Ghost", + "Slug", + "Mouse", + "Bomb", + "Tom", + "Sam", + "Fish", + "Fish's Brother", + "Kid", + "Boy", + "Art", + "Shattered Man", + "Orb", + "Man Junior", + "Li'l UFO", + "UFO", + "Guy", + "Taxi", + "Molecule", + "Protoplasm", + "Robot", + "Psycho", + "Goat", + "Mole", + "Flame", + "Petunia", + "Ranboob", + "Noose", + "Pump", + "Crocodile", + "Fly", + "Crow", + "Caterpillar", + "Eye", + "Worm", + "Statue", + "Rat of Doom", + "Specter", + "Chief", + "Bot", + "Gangster", + "Storm", + "Dino", + "Painter", + "Burglar", + "Tank", +] + +enemy_adjectives = [ + "", + "Insane ", + "Dept. Store ", + "Armored ", + "Bad ", + "Black ", + "Red ", + "Ramblin' ", + "Struttin' ", + "Tough ", + "Enraged ", + "Mystical ", + "Atomic ", + "Nuclear ", + "Guardian ", + "Lethal ", + "Electro ", + "Conducting ", + "Evil ", + "Annoying Old ", + "Annoying ", + "Unassuming ", + "New Age Retro ", + "Carbon ", + "Mighty ", + "Putrid ", + "Thunder ", + "Cranky ", + "Extra Cranky ", + "Titanic ", + "Gigantic ", + "Mondo ", + "Scalding ", + "Loaded ", + "Slimy ", + "Even Slimier ", + "Bionic ", + "Spinning ", + "Whirling ", + "Hyper Spinning ", + "Coil ", + "Thirsty ", + "Mr. ", + "Elder ", + "Violent ", + "Filthy Attack ", + "Crazed ", + "Wooly ", + "Wild 'n Wooly ", + "Skate ", + "Dread ", + "Super ", + "Ghost of ", + "Smilin' ", + "Uncontrollable ", + "Petrified ", + "Urban ", + "Zombie ", + "Crooked ", + "Over Zealous ", + "Territorial ", + "Hostile Elder ", + "Diamond ", + "Marauder ", + "Military ", + "Mechanical ", + "Ultimate ", + "Mad ", + "Dali's ", + "Trillionage ", + "Desert ", + "Big ", + "French ", + "Zap ", + "Squatter ", + "Crested ", + "Great Crested ", + "Lesser ", + "Smelly ", + "Stinky ", + "Attack ", + "Pit Bull ", + "Rowdy ", + "Deadly ", + "Care Free ", + "Electro ", + "Handsome ", + "Manly ", + "Runaway ", + "Trick or Trick ", + "Cave ", + "Abstract ", + "Shattered ", + "Fierce ", + "Ego ", + "Yes ", + "Cute ", + "Beautiful ", + "Pogo ", + "Tough ", + "Worthless ", + "Sentry ", + "Heavily Armed ", + "Psychic ", + "Major Psychic ", + "Gruff ", + "Clumsy ", + "Soul Consuming ", + "Demonic ", + "High-class ", + "Robo-", + "Plain ", + "Strong ", + "Hard ", + "No Good ", + "Mostly Bad ", + "Spiteful ", + "Farm ", + "Criminal ", + "Master Criminal ", + "Final ", + "Plague ", + "Disingenuous ", + "Disgusting ", + "Inadequate ", + "Dr. ", + "Electronic ", + "Jealous ", + "Bald ", + "Baked ", + "Magic ", + "Polar ", + "Depressed ", + "Clean ", + "Elderly ", + "Banned ", + "Grumpy ", + "Whelmed ", + "Loud ", + "Mushy ", + "Randomized ", + "Homesick ", + "Mecha ", + "Ramblin' Evil ", + "Master ", + "Secret ", + "Platinum ", + "Armed ", + "Condemned ", + "Rad ", + "Hangry ", + "Moonsidian ", + "No. 3 ", + "Legal ", + "Copyrighted ", + "Cyanotic ", + "Serendipitous ", + "Disgruntled " +] + +battle_sprites = { + "Antoid": [0x01], + "Dog": [0x02, 0x42], + "Frog": [0x03], + "Sphere": [0x04], + "Mushroom": [0x05], + "Bomb": [0x06], + "Octobot": [0x07], + "Musica": [0x08], + "Ranboob": [0x09], + "Moldyman": [0x0A], + "Fungus": [0x0B], + "Booka": [0x0C], + "Shambler": [0x0D], + "Dino": [0x0E, 0x41], + "Art": [0x0F], + "Crow": [0x10], + "Fobby": [0x11], + "Foppy": [0x11], + "Duck": [0x12], + "Batty": [0x13], + "Mouse": [0x14], + "Kiss of Death": [0x15], + "Swoosh": [0x16], + "Petunia": [0x17], + "Flame": [0x18], + "Coil Snake": [0x19], + "Sign": [0x1A], + "Kid": [0x1B], + "Sam": [0x1C], + "Tom": [0x1C], + "Psycho": [0x1D], + "Mite": [0x1E], + "Fish": [0x1F], + "Fish's Brother": [0x1F], + "Burglar": [0x20], + "Painter": [0x21], + "Party Man": [0x22], + "Reveler": [0x22], + "Local Guy": [0x23], + "Menace": [0x24], + "Spirit": [0x24], + "Gangster": [0x25], + "Guy": [0x26], + "Storm": [0x27], + # Carbon + "Kraken": [0x29], + # Pokey + "Li'l UFO": [0x2B], + "Coffee Cup": [0x2C], + "Molecule": [0x2D], + "Record": [0x2E], + "Slug": [0x2F], + "Elemental": [0x30], + "UFO": [0x31], + "Possessor": [0x32], + "Cop": [0x33], + "Robo": [0x34], + "Ghost": [0x35], + "Robot": [0x36], + "Starman": [0x37, 0x6A], + "Shattered Man": [0x38], + "Specter": [0x39], + "Dice": [0x3A], + "Fire Plug": [0x3B], + "Protoplasm": [0x3C], + "Mook": [0x3D], + "Spook": [0x3D], + "Pump": [0x3E], + "Cultist": [0x3F], + "Man Junior": [0x40], + "Asp Hieroglyph": [0x43], + "Eel": [0x44], + "Chief": [0x45], + "Hieroglyph": [0x46], + "Bot": [0x47], + "Zombie": [0x48], + "Ant": [0x49], + "Buffalo": [0x4A], + "Rat of Doom": [0x4B], + # iamond Dog + "Arachnid": [0x4D], + "Mole": [0x4E], + "Statue": [0x4F], + "Roach": [0x50], + "Noose": [0x51], + "Tangoo": [0x52], + # "Digger": [0x53], + "Crocodile": [0x54], + "Taxi": [0x55], + "Demon": [0x56], + "General": [0x57], + "Royal Guard": [0x57], + # Trillionage sprout + "Fly": [0x59], + "Mobile Sprout": [0x5A], + "Little Pile": [0x5B], + "Skelpion": [0x5C], + "Clock": [0x5D], + "Goat": [0x5E], + "Oak": [0x5F], + "Punk": [0x60, 0x64], + "Tank": [0x61], + "Pile of Puke": [0x62], + "Lady": [0x63], + "Boy": [0x65], + "Orb": [0x66], + "Wolf": [0x67], + "Bear": [0x68], + "Bear Seven": [0x68], + "Power Robot": [0x69], + "Reactor Robot": [0x69], + "Hippie": [0x6B], + "Worm": [0x6D], + "Caterpillar": [0x6D], + "Eye": [0x6E] + + +} + +field_sprites = [ + 0x00, + 0x013C, + 0x014A, + 0x0118, + 0x012E, + 0x0123, + 0x0115, + 0x0132, + 0xC3, + 0x0124, + 0x011D, + 0x0123, + 0x0128, + 0x0132, + 0x012A, + 0x012C, + 0x011A, + 0x0116, + 0x011F, + 0x0112, + 0x01A0, + 0x0144, + 0x0114, + 0x0122, + 0x0117, + 0x011B, + 0x0135, + 0x01BC, + 0x011E, + 0x0117, + 0x0144, + 0x0120, + 0x9D, + 0x9F, + 0x0187, + 0x0184, + 0x0144, + 0x99, + 0x0186, + 0x0144, + 0x014A, + 0x0132, + 0x2C, + 0x0130, + 0xC3, + 0x0115, + 0xC3, + 0x013C, + 0x0117, + 0x0130, + 0x0131, + 0x0182, + 0x0132, + 0x011D, + 0x0136, + 0x012F, + 0x0133, + 0x0144, + 0xC3, + 0x0117, + 0xC3, + 0x0132, + 0x0117, + 0x65, + 0x011C, + 0x0138, + 0x016C, + 0x0140, + 0x012D, + 0x0183, + 0x0145, + 0x01A2, + 0x0134, + 0x0139, + 0x0137, + 0x01A0, + 0x014A, + 0x013A, + 0x019F, + 0x0125, + 0x013A, + 0x0143, + 0x0144, + 0x019F, + 0x014C, + 0x0121, + 0x0132, + 0x0142, + 0x013D, + 0x013E, + 0x013D, + 0x013B, + 0x013F, + 0x0146, + 0x0126, + 0x0129, + 0x011C, + 0x0191, + 0x0148, + 0x0188, + 0x011C, + 0x0149, + 0x0147, + 0x014A, + 0x014B, + 0x0132, + 0x0132, + 0x0185, + 0x0132, + 0x01A1, + 0x0132, +] + +excluded_enemies = [ + "Dept. Store Spook", + "Ness's Nightmare", + "Mr. Carpainter", + "Carbon Dog", + "Titanic Ant", + "Shrooom!", + "Plague Rat of Doom", + "Mondo Mole", + "Guardian Digger", + "Kraken", + "Guardian General", + "Starman Deluxe", + "Diamond Dog", + "Trillionage Sprout", + "Master Belch", + "Master Barf", + "Electro Specter", + "Boogey Tent", + "Everdred", + "Thunder and Storm", + "Frankystein Mark II", + "Frank", + "Evil Mani-Mani", + "Clumsy Robot", + "Dept. Store Spook (2)", + "Ness's Nightmare (2)", + "Mr. Carpainter (2)", + "Carbon Dog (2)", + "Chomposaur (2)", + "Titanic Ant (2)", + "Gigantic Ant (2)", + "Shrooom! (2)", + "Plague Rat of Doom (2)", + "Mondo Mole (2)", + "Guardian Digger (2)", + "Kraken (2)", + "Starman (2)", + "Starman Super (2)", + "Ghost of Starman (2)", + "Starman Deluxe (2)", + "Final Starman (2)", + "Diamond Dog (2)", + "Trillionage Sprout (2)", + "Master Belch (2)", + "Master Barf (2)", + "Boogey Tent (2)", + "Everdred (2)", + "Electro Specter (2)", + "Thunder and Storm (2)", + "Frankystein Mark II (2)", + "Evil Mani-Mani (2)", + "Clumsy Robot (2)", + "Robo-pump (2)", + "Guardian General (2)", + "Struttin' Evil Mushroom (2)", + "Runaway Dog (2)", + "Tiny Li'l Ghost", + "Starman Junior", + "Buzz Buzz", + "Heavily Armed Pokey", + "Giygas (2)", + "Giygas (3)", + "Giygas (4)", + "Giygas (5)", + "Mini Barf", + "Captain Strong", + "Giygas (6)", + "Clumsy Robot (3)", + "Giygas" +] + +robots = [ + "Power Robot", + "Reactor Robot", + "Robo", + "Sign", + "Shambler", + "Sphere", + "Octobot", + "Bomb", + "Li'l UFO", + "UFO", + "Taxi", + "Bot", + "Pump", + "Robot" +] + +insects = [ + "Antoid", + "Ant", + "Arachnid", + "Roach", + "Skelpion", + "Slug", + "Fly", + "Caterpillar", + "Worm" +] + +movement_patterns = { + 0x65: 21, + 0x99: 21, + 0x9D: 21, + 0x9F: 21, + 0xC3: 31, + 0x0112: 25, + 0x01A2: 27, + 0x0114: 27, + 0x0115: 27, + 0x0116: 21, + 0x0117: 27, + 0x0118: 21, + 0x011A: 25, + 0x011B: 20, + 0x011C: 21, + 0x011D: 24, + 0x011E: 24, + 0x011F: 21, + 0x0120: 21, + 0x0121: 30, + 0x0122: 29, + 0x0123: 24, + 0x0124: 21, + 0x0125: 21, + 0x0126: 22, + 0x0128: 20, + 0x0129: 29, + 0x012A: 29, + 0x012C: 27, + 0x012D: 20, + 0x012E: 23, + 0x012F: 26, + 0x0130: 23, + 0x0131: 27, + 0x0132: 23, + 0x0133: 24, + 0x0134: 21, + 0x0135: 28, + 0x0136: 30, + 0x0137: 29, + 0x0138: 29, + 0x0139: 20, + 0x013A: 20, + 0x013B: 20, + 0x013C: 20, + 0x013D: 24, + 0x013E: 23, + 0x013F: 20, + 0x0140: 21, + 0x0142: 28, + 0x0143: 21, + 0x0144: 23, + 0x0145: 21, + 0x0146: 27, + 0x0147: 30, + 0x0148: 29, + 0x0149: 29, + 0x014A: 22, + 0x014B: 29, + 0x014C: 29, + 0x016C: 22, + 0x0182: 21, + 0x0183: 21, + 0x0184: 21, + 0x0185: 21, + 0x0186: 21, + 0x0187: 21, + 0x0188: 21, + 0x0191: 30, + 0x019F: 20, + 0x01A0: 20, + 0x01A1: 27, + 0x01BC: 21, +} + +start_texts = [ + 0xEF7858, # attacked + 0xEF7866, # blocked the way + 0xEF7879, # came after you + 0xEF788B, # trapped you + 0xEF789C, # you encounter + 0xEF78AB, # you meet + 0xEF78B8, # you engage + 0xEF78C7, # you confront +] + +death_texts = [ + 0xEF6D71, + 0xEF6D83, # Stopped moving + 0xEF6D96, + 0xEF6DA7, # disappeared + 0xEF6DB8, # melted into thin air + 0xEF6DD8, # broken into pieces + 0xEF6DF0, # destroyed + 0xEF6E03, # totally scrapped + 0xEF6E19, # turned back to normal + 0xEF6E31, # dust of the earth + +] + + +weakness_table = { + "Fire": { + "Frog": 0, + "Buffalo": 0, + "Antoid": 0, + "Mushroom": 0, + "Fungus": 0, + "Mobile Sprout": 0, + "Fire Plug": 3, + "Record": 0, + "Power Robot": 3, + "Reactor Robot": 3, + "Hieroglyph": 0, + "Asp Hieroglyph": 2, + "Swoosh": 2, + "Elemental": 0, + "Moldyman": 3, + "Mite": 0, + "Ant": 0, + "Coffee Cup": 2, + "Dice": 0, + "Kraken": 2, + "Robo": 3, + "Roach": 0, + "Sign": 2, + "Shambler": 2, + "Skelpion": 0, + "Sphere": 0, + "Zombie": 0, + "Possessor": 3, + "Dog": 0, + "Oak": 0, + "Octobot": 0, + "Duck": 0, + "Wolf": 0, + "Eel": 0, + "Arachnid": 0, + "Demon": 0, + "Fobby": 0, + "Foppy": 0, + "Booka": 3, + "Mook": 0, + "Ghost": 0, + "Slug": 0, + "Mouse": 0, + "Bomb": 2, + "Tom": 0, + "Sam": 0, + "Fish": 3, + "Kid": 0, + "Boy": 0, + "Shattered Man": 2, + "Orb": 2, + "Li'l UFO": 0, + "UFO": 2, + "Taxi": 2, + "Molecule": 0, + "Protoplasm": 0, + "Robot": 2, + "Psycho": 3, + "Goat": 0, + "Flame": 3, + "Petunia": 0, + "Ranboob": 0, + "Noose": 0, + "Pump": 2, + "Crocodile": 2, + "Fly": 0, + "Crow": 0, + "Caterpillar": 0, + "Eye": 3, + "Worm": 0, + "Bot": 2, + "Gangster": 0, + "Tank": 0 + }, + + "Freeze": { + "Frog": 0, + "Antoid": 0, + "Mushroom": 0, + "Fungus": 2, + "Mobile Sprout": 0, + "Fire Plug": 0, + "Power Robot": 0, + "Hieroglyph": 2, + "Asp Hieroglyph": 0, + "Elemental": 3, + "Moldyman": 0, + "Mite": 0, + "Ant": 0, + "Coffee Cup": 0, + "Dice": 0, + "Robo": 0, + "Coil Snake": 0, + "Roach": 0, + "Skelpion": 0, + "Sphere": 3, + "Royal Guard": 2, + "General": 2, + "Zombie": 3, + "Possessor": 0, + "Dog": 0, + "Oak": 2, + "Octobot": 2, + "Duck": 0, + "Wolf": 0, + "Pile of Puke": 2, + "Arachnid": 0, + "Demon": 3, + "Fobby": 0, + "Foppy": 0, + "Mook": 3, + "Ghost": 2, + "Slug": 0, + "Mouse": 0, + "Tom": 2, + "Sam": 2, + "Fish's Brother": 3, + "Kid": 0, + "Boy": 3, + "Orb": 0, + "Li'l UFO": 2, + "UFO": 2, + "Taxi": 2, + "Molecule": 0, + "Protoplasm": 0, + "Robot": 2, + "Goat": 0, + "Flame": 0, + "Petunia": 3, + "Ranboob": 2, + "Noose": 2, + "Pump": 2, + "Fly": 0, + "Crow": 0, + "Caterpillar": 0, + "Eye": 0, + "Worm": 0, + "Rat of Doom": 2, + "Bot": 2, + "Gangster": 0, + "Tank": 0 + }, + + "Flash": { + "Fire Plug": 3, + "Record": 3, + "Power Robot": 2, + "Reactor Robot": 2, + "Swoosh": 0, + "Menace": 3, + "Spirit": 3, + "Elemental": 0, + "Mite": 3, + "Coffee Cup": 2, + "Dice": 2, + "Sign": 3, + "Starman": 2, + "Sphere": 3, + "Zombie": 0, + "Possessor": 0, + "Dog": 0, + "Octobot": 3, + "Musica": 2, + "Kiss of Death": 2, + "Tangoo": 0, + "Ghost": 0, + "Tom": 0, + "Sam": 0, + "Fish's Brother": 2, + "Kid": 0, + "Orb": 2, + "Li'l UFO": 2, + "UFO": 2, + "Taxi": 2, + "Molecule": 2, + "Robot": 3, + "Mole": 0, + "Pump": 2, + "Crow": 0, + "Caterpillar": 0, + "Eye": 3, + "Worm": 0, + "Specter": 3, + "Bot": 2, + "Storm": 0, + "Tank": 2 + }, + + "Paralysis": { + "Spook": 2, + "Buffalo": 0, + "Antoid": 0, + "Fungus": 3, + "Mobile Sprout": 0, + "Power Robot": 3, + "Reactor Robot": 3, + "Asp Hieroglyph": 0, + "Elemental": 3, + "Bear": 2, + "Bear Seven": 2, + "Moldyman": 2, + "Dice": 0, + "Little Pile": 0, + "Coil Snake": 0, + "Batty": 0, + "Roach": 0, + "Starman": 2, + "Royal Guard": 0, + "General": 2, + "Clock": 3, + "Arachnid": 0, + "Demon": 3, + "Fobby": 0, + "Foppy": 0, + "Booka": 2, + "Mook": 2, + "Ghost": 0, + "Slug": 0, + "Fish's Brother": 2, + "Boy": 3, + "Art": 0, + "Shattered Man": 0, + "Orb": 3, + "Taxi": 0, + "Molecule": 0, + "Protoplasm": 0, + "Psycho": 2, + "Mole": 0, + "Petunia": 3, + "Fly": 0, + "Crow": 0, + "Caterpillar": 0, + "Eye": 2, + "Worm": 0, + "Statue": 3, + "Rat of Doom": 2, + "Specter": 3, + "Storm": 3, + "Dino": 2, + "Tank": 2 + }, + + "Hypnosis": { + "Buffalo": 2, + "Antoid": 0, + "Mushroom": 3, + "Mobile Sprout": 3, + "Fire Plug": 3, + "Record": 3, + "Power Robot": 2, + "Reactor Robot": 2, + "Hieroglyph": 0, + "Asp Hieroglyph": 0, + "Menace": 2, + "Spirit": 2, + "Elemental": 0, + "Moldyman": 0, + "Coffee Cup": 2, + "Dice": 3, + "Kraken": 2, + "Coil Snake": 0, + "Batty": 3, + "Roach": 3, + "Sign": 0, + "Skelpion": 0, + "Sphere": 0, + "Dog": 0, + "Octobot": 2, + "Duck": 2, + "Clock": 0, + "Pile of Puke": 2, + "Kiss of Death": 0, + "Eel": 2, + "Arachnid": 3, + "Demon": 2, + "Fobby": 3, + "Foppy": 3, + "Booka": 0, + "Mook": 0, + "Ghost": 0, + "Slug": 3, + "Mouse": 2, + "Bomb": 2, + "Tom": 3, + "Fish": 2, + "Fish's Brother": 2, + "Kid": 0, + "Boy": 2, + "Art": 2, + "Orb": 2, + "Li'l UFO": 3, + "UFO": 3, + "Taxi": 2, + "Molecule": 3, + "Protoplasm": 3, + "Psycho": 3, + "Goat": 0, + "Mole": 2, + "Flame": 2, + "Petunia": 2, + "Noose": 3, + "Pump": 2, + "Fly": 3, + "Caterpillar": 0, + "Worm": 0, + "Rat of Doom": 2, + "Specter": 2, + "Bot": 2, + "Tank": 2 + } +} diff --git a/worlds/earthbound/modules/enemizer/randomize_enemy_attacks.py b/worlds/earthbound/modules/enemizer/randomize_enemy_attacks.py new file mode 100644 index 0000000000..01745a8fe4 --- /dev/null +++ b/worlds/earthbound/modules/enemizer/randomize_enemy_attacks.py @@ -0,0 +1,236 @@ +import struct +from .enemy_attributes import excluded_enemies +from ..enemy_data import spell_breaks +from ..enemy_shuffler import enemy_ids +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from ... import EarthBoundWorld + from ...Rom import LocalRom + +battle_actions = { # Actions in camel case are scaled + "Attack": 0x04, + "Shoot": 0x05, + "Spy": 0x06, + "Defend": 0x08, + "None": 0x09, + "Magnet Alpha": 0x36, + "Magnet Omega": 0x37, + "Call": 0x3E, + "Sow Seeds": 0x3F, + "Steal": 0x42, + "Freeze in Time": 0x43, + "diamond_eyes": 0x44, + "Strange Beam": 0x46, + "nauseous_breath": 0x47, + "poison_stinger": 0x48, + "kiss_of_death": 0x49, + "Arctic Breath": 0x4A, + "Mushroom Spores": 0x4B, + "Possess": 0x4C, + "Sprinkle Powder": 0x4D, + "Mold Spores": 0x4E, + "Binding Attack": 0x4F, + "Sticky Mucus": 0x50, + "Spew Fly Honey": 0x51, + "Shoot Silk": 0x52, + "Say Something Scary": 0x53, + "Do Something Mysterious": 0x54, + "Disrupt Sense": 0x55, + "Size Up Situation": 0x56, + "Exhale Stinky": 0x57, + "summon_storm": 0x58, + "scalding_espresso": 0x59, + "Haunting Melody": 0x5A, + "extinguishing_blast": 0x5B, + "crashing_boom_bang": 0x5C, + "spray_fire": 0x5D, + "breathe_fire": 0x5E, + "Spin Around": 0x5F, + "Lose Temper": 0x60, + "Say Nasty": 0x61, + "Vacuum Attack": 0x62, + # "Replenish Fuel", + "poisonous_fangs": 0x64, + # Dizzy Missile + "Continuous Attack": 0x66, + "Guard": 0x67, + "flaming_fireball": 0x68, + "Intertwine": 0x69, + "Crushing Chop": 0x6A, + "Submission Hold": 0x6B, + "Rev and Accelerate": 0x6C, + "Brandish a Knife": 0x6D, + "Tear Into": 0x6E, + "Bite": 0x6F, + "Claw with Nails": 0x70, + "Swing Tail": 0x71, + "Lunge": 0x72, + "Shopping Bag": 0x73, + "Swing Club": 0x74, + "Tornado": 0x75, + "Spray Water": 0x76, + "Flash a Menacing Smile": 0x77, + "Laugh Hysterically": 78, + "Edge Closer": 0x79, + "Whisper 3": 0x7A, + "Murmur 2": 0x7B, + "Mutter 1": 0x7C, + "Fall down": 0x7D, + "Be Absentminded": 0x7E, + "Burst of Steam": 0x7F, + "Wobble": 0x80, + "Reel": 0x81, + "Big Grin": 0x82, + "Take Breath": 0x83, + "Greeting": 0x84, + "Howl": 0x85, + "Tick Tock": 0x86, + # "Eat Food": 0x8A, + "PSI Food": 0x8E, + # Counter PSI: 0x9F World.gadget actions? + # Shield Killer + # HP Sucker + "Yogurt Dispenser": 0xAA, + "Toothbrush": 0xAE, + "Sudden Guts": 0xB6, + "Ruler": 0xBA, + "Protractor": 0xBB, + "Fly Honey": 0xBD, + "glorious_light": 0xC9, + "electrical_shock": 0xCA, + "paralyzing_pollen": 0xCB, + "Icy Hand": 0xCC, + "poison_flute": 0xCD, + "Exhaust Fumes": 0xCE, + "Laugh Maniacally": 0xCF, + "Breathe Flute": 0xD0, + "Leap and Spread Wings": 0xD1, + "Become Friendly": 0xD2, + "Rumble": 0xD3, + "Give Hug": 0xD4, + "hacking_cough": 0xD5, + "Misery Attack": 0xD6, + "Paint Attack": 0xD7, + "Come Out Swinging": 0xD8, + "Scratch with Claws": 0xD9, + "Peck at Eyes": 0xDA, + "Ram and Trample": 0xDB, + "Punch": 0xDC, + "Spit Seeds": 0xDD, + "Fire a Beam": 0xDE, + "Spear": 0xDF, + "Stomp with Foot": 0xE0, + "Hula Hoop": 0xE1, + "Charge Forward": 0xE2, + "Shred on Skateboard": 0xE3, + "diamond_bite": 0xE4, + "Grumble": 0xE5, + "Lecture": 0xE6, + "Scow": 0xE7, + "Vent Odor": 0xE8, + "Shout": 0xE9, + "Shriek": 0xEA, + "Knit Brow": 0xEB, + "scatter_spores": 0xED, + "Bite Attack": 0xEE, + "stuffiness_beam": 0xF1, + "Coil Around": 0xF2, + "Emit Light": 0xF8, + "Homesick": 0xFB, + "Fake PSI": 0x0100, + "Bark": 0x0108, + "Chant": 0x0109, + "Scratch Head": 0x010B, + "Discharge Gas": 0x0111, + "Monkey Love": 0x011B, + "Lost Bolts": 0x013A, + "Clean Area": 0x013C, + "Want Battery": 0x013D, + "throw_bomb": 0x01FC, + "shoot_rocket": 0x0203 + +} + +needs_argument = { + "PSI Food": [0xCF, 0xF7, 0x6E, 0xF6, 0x63, 0x62], + "Ruler": [0x8C], + "Protractor": [0x8F], + "Toothbrush": [0x9A], + "Monkey Love": [0xD1], + "Sudden Guts": [0x9F], + "Shield Alpha": [0x1F], + "Shield Beta": [0x21], + "PSI Shield Alpha": [0x23], + "PSI Shield Beta": [0x25], + "Offense Up Alpha": [0x27], + "Offense Up Omega": [0x28], + "Defense Down Alpha": [0x29], + "Defense Down Omega": [0x2A], + "Hypnosis Alpha": [0x2B], + "Hypnosis Omega": [0x2C], + "Brainshock": [0x31], + "Magnet Alpha": [0x2D], + "Magnet Omega": [0x2E], + "Yogurt Dispenser": [0x8B], + "Fake PSI": [0x55, 0x04, 0x14, 0x16, 0x30, 0x32, 0x4D, 0x57] +} + +psi_actions = { + "special": 0x0A, + "fire": 0x0E, + "freeze": 0x12, + "thunder": 0x16, + "flash": 0x1A, + "starstorm": 0x1E, + "lifeup": 0x20, + "healing": 0x24, + "Shield Alpha": 0x28, + "Shield Beta": 0x29, + "PSI Shield Alpha": 0x2C, + "PSI Shield Beta": 0x2D, + "Offense Up Alpha": 0x30, + "Offense Up Omega": 0x31, + "Defense Down Alpha": 0x32, + "Defense Down Omega": 0x33, + "Hypnosis Alpha": 0x34, + "Hypnosis Omega": 0x35, + "paralysis": 0x38, + "Brainshock": 0x3A, + "blast": 0x01A4, + "missile": 0x01A8 +} + + + +def randomize_enemy_attacks(world: "EarthBoundWorld", rom: "LocalRom") -> None: + """Generates random attacks for enemies. + Certain attacks need to have an argument variable attached. + PSI moves have a 19% chance of being rolled only if the enemy has a non-zero max PP stat.""" + for enemy in world.enemies: + if enemy not in excluded_enemies: + enemy_ai = world.random.randint(0, 3) + world.enemy_psi[enemy] = ["null", "null", "null", "null"] + max_calls = 0 + for i in range(4): + if world.enemies[enemy].pp and world.random.randint(1, 100) < 20: + attack = world.random.choice(list(psi_actions.keys())) + attack_id = psi_actions[attack] + else: + attack = world.random.choice(list(battle_actions.keys())) + attack_id = battle_actions[attack] + if attack in spell_breaks: + world.enemy_psi[enemy][i] = attack + + if attack in needs_argument: + argument = world.random.choice(needs_argument[attack]) + elif attack in ["Sow Seeds", "Call"]: + argument = enemy_ids[enemy] + max_calls = world.random.randint(1, 4) + else: + argument = 0 + + rom.write_bytes(world.enemies[enemy].address + (0x46 + (i * 2)), struct.pack("H", attack_id)) + rom.write_bytes(world.enemies[enemy].address + (0x50 + (i)), bytearray([argument])) + rom.write_bytes(world.enemies[enemy].address + 0x5C, bytearray([max_calls])) + rom.write_bytes(world.enemies[enemy].address + 0x45, bytearray([enemy_ai])) + # Todo; attack extenders? diff --git a/worlds/earthbound/modules/enemizer/randomize_enemy_attributes.py b/worlds/earthbound/modules/enemizer/randomize_enemy_attributes.py new file mode 100644 index 0000000000..b38200c30f --- /dev/null +++ b/worlds/earthbound/modules/enemizer/randomize_enemy_attributes.py @@ -0,0 +1,143 @@ +import struct +from .enemy_attributes import (enemy_species, enemy_adjectives, battle_sprites, field_sprites, excluded_enemies, + insects, robots, movement_patterns, start_texts, death_texts, weakness_table) +from ...game_data.text_data import calc_pixel_width, text_encoder +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from ... import EarthBoundWorld + from ...Rom import LocalRom +shield_statuses = [ + "phys_1", + "phys_2", + "psi_1", + "psi_2" +] + +battle_songs = [ + 0x60, + 0x61, + 0x62, + 0x63, + 0x64, + 0x65, + 0x66, + 0x67, + 0x68, + 0x69, + 0x8D, + 0x94 +] + + +def randomize_enemy_attributes(world: "EarthBoundWorld", rom: "LocalRom") -> None: + """Randomizes various attributes of enemies. This includes the name, + gender, sprite, color, etc. Data can be found in enemy_attributes.""" + taken_names = [] + for enemy in world.enemies: + if enemy not in excluded_enemies and " (" not in enemy: + new_name = "FFFFFFFFFFFFFFFFFFFFFFFFFF" + pixel_width = calc_pixel_width(new_name) + species = "Null" + while not (len(new_name) <= 25 and new_name not in taken_names and pixel_width <= 95): + species = world.random.choice(enemy_species) + adjective = world.random.choice(enemy_adjectives) + new_name = adjective + species + pixel_width = calc_pixel_width(new_name) + taken_names.append(new_name) + sprite = world.random.choice(battle_sprites[species]) + field_sprite = field_sprites[sprite] + world.enemy_sprites[enemy] = field_sprite + movement_pattern = movement_patterns[field_sprite] + palette = world.random.randint(1, 31) + gender = world.random.randint(1, 3) + if species in robots: + enemy_type = 2 + elif species in insects: + enemy_type = 1 + else: + enemy_type = 0 + row = world.random.randint(0, 1) + mirror_chance = world.random.randint(0, 100) + start_text = world.random.choice(start_texts) + death_text = world.random.choice(death_texts) + if species in ["Power Robot", "Reactor Robot", "Sphere"]: + death_action = 0x0040 + elif species == "Oak": + death_action = 0x0041 + else: + death_action = 0x0000 + music = world.random.choice(battle_songs) + drop_rate = world.random.randint(0, 7) + base_drop = world.random.choice(world.filler_drops) + if world.random.randint(1, 100) < 6: + status = world.random.randint(1, 7) + if status < 5: + world.enemies[enemy].has_shield = shield_statuses[status - 1] + else: + status = 0 + + if species in ["Party Man", "Reveler"]: + miss_rate = 6 + elif species == "Boy": + miss_rate = 8 + elif species == "Bot": + miss_rate = 5 + else: + miss_rate = world.random.randint(0, 4) + + fire_weakness = get_weakness("Fire", species) + + freeze_weakness = get_weakness("Freeze", species) + + flash_weakness = get_weakness("Flash", species) + + paralysis_weakness = get_weakness("Paralysis", species) + + hypnosis_weakness = get_weakness("Hypnosis", species) + + address = world.enemies[enemy].address + new_name = text_encoder(new_name, 0x18) + if len(new_name) < 0x18: + new_name.extend([0x00]) + + if world.enemies[enemy].attack_extensions > 1: + num_enemies = world.enemies[enemy].attack_extensions + else: + num_enemies = 1 + + for i in range(num_enemies): + rom.write_bytes(address, bytearray([0x01])) + rom.write_bytes(address + 1, new_name) + rom.write_bytes(address + 0x1A, bytearray([gender])) + rom.write_bytes(address + 0x1B, bytearray([enemy_type])) + rom.write_bytes(address + 0x1C, struct.pack("H", sprite)) + rom.write_bytes(address + 0x1E, struct.pack("H", field_sprite)) + rom.write_bytes(address + 0x2B, struct.pack("H", movement_pattern)) + rom.write_bytes(address + 0x2D, struct.pack("I", start_text)) + rom.write_bytes(address + 0x31, struct.pack("I", death_text)) + rom.write_bytes(address + 0x35, bytearray([palette])) + rom.write_bytes(address + 0x37, bytearray([music])) + rom.write_bytes(address + 0x3F, bytearray([fire_weakness])) + rom.write_bytes(address + 0x40, bytearray([freeze_weakness])) + rom.write_bytes(address + 0x41, bytearray([flash_weakness])) + rom.write_bytes(address + 0x42, bytearray([paralysis_weakness])) + rom.write_bytes(address + 0x43, bytearray([hypnosis_weakness])) + rom.write_bytes(address + 0x43, bytearray([miss_rate])) + rom.write_bytes(address + 0x4E, struct.pack("H", death_action)) + rom.write_bytes(address + 0x57, bytearray([drop_rate])) + rom.write_bytes(address + 0x58, bytearray([base_drop])) + rom.write_bytes(address + 0x59, bytearray([status])) + rom.write_bytes(address + 0x5B, bytearray([row])) + rom.write_bytes(address + 0x5D, bytearray([mirror_chance])) + if world.enemies[enemy].attack_extensions > 1: + address = world.enemies[f"{enemy} ({i + 2})"].address + enemy = f"{enemy} ({i + 2})" + + +def get_weakness(element: str, species: str) -> int: + """Returns a weakness to given element, given the enemy's base species.""" + if species in weakness_table[element]: + weakness = weakness_table[element][species] + else: + weakness = 1 + return weakness diff --git a/worlds/earthbound/modules/enemizer/randomize_enemy_stats.py b/worlds/earthbound/modules/enemizer/randomize_enemy_stats.py new file mode 100644 index 0000000000..382919aa48 --- /dev/null +++ b/worlds/earthbound/modules/enemizer/randomize_enemy_stats.py @@ -0,0 +1,68 @@ +from .enemy_attributes import excluded_enemies +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from ... import EarthBoundWorld + from ...Rom import LocalRom + + +class EnemyStatCopy: + def __init__(self, hp: int, exp: int, money: int, speed: int, offense: int, + defense: int, level: int, guts: int, luck: int): + self.hp = hp + self.exp = exp + self.money = money + self.speed = speed + self.offense = offense + self.defense = defense + self.level = level + self.guts = guts + self.luck = luck + + +def randomize_enemy_stats(world: "EarthBoundWorld", rom: "LocalRom") -> None: + """Randomizes enemy stats. It does not actually randomize them, rather it gives enemies the stats of a random other enemy. + Enemies have a 19% chance to have PP.""" + stat_copies = {} + for enemy in world.enemies: + if enemy not in excluded_enemies: + stat_copies[enemy] = EnemyStatCopy( + hp=world.enemies[enemy].hp, + exp=world.enemies[enemy].exp, + money=world.enemies[enemy].money, + speed=world.enemies[enemy].speed, + offense=world.enemies[enemy].offense, + defense=world.enemies[enemy].defense, + level=world.enemies[enemy].level, + guts=world.enemies[enemy].guts, + luck=world.enemies[enemy].luck + ) + + for enemy in world.enemies: + if enemy not in excluded_enemies: + copied_stat_base = world.random.choice(list(stat_copies)) + world.enemies[enemy].hp = stat_copies[copied_stat_base].hp + if world.random.randint(1, 100) < 20: + world.enemies[enemy].pp = int(world.random.randint(10, 500) / 2) + else: + world.enemies[enemy].pp = 0 + world.enemies[enemy].offense = stat_copies[copied_stat_base].offense + world.enemies[enemy].defense = stat_copies[copied_stat_base].defense + world.enemies[enemy].speed = stat_copies[copied_stat_base].speed + world.enemies[enemy].level = stat_copies[copied_stat_base].level + world.enemies[enemy].exp = stat_copies[copied_stat_base].exp + world.enemies[enemy].money = stat_copies[copied_stat_base].money + world.enemies[enemy].guts = stat_copies[copied_stat_base].guts + world.enemies[enemy].luck = stat_copies[copied_stat_base].luck + rom.write_bytes(world.enemies[enemy].address + 0x3D, bytearray([world.enemies[enemy].guts])) + rom.write_bytes(world.enemies[enemy].address + 0x3E, bytearray([world.enemies[enemy].luck])) + if world.enemies[enemy].attack_extensions > 0: + world.enemies[f"{enemy} (2)"].hp = world.enemies[enemy].hp + world.enemies[f"{enemy} (2)"].pp = world.enemies[enemy].pp + world.enemies[f"{enemy} (2)"].offense = world.enemies[enemy].offense + world.enemies[f"{enemy} (2)"].defense = world.enemies[enemy].defense + world.enemies[f"{enemy} (2)"].speed = world.enemies[enemy].speed + world.enemies[f"{enemy} (2)"].level = world.enemies[enemy].level + world.enemies[f"{enemy} (2)"].exp = world.enemies[enemy].exp + world.enemies[f"{enemy} (2)"].money = world.enemies[enemy].money + rom.write_bytes(world.enemies[f"{enemy} (2)"].address + 0x3D, bytearray([world.enemies[enemy].guts])) + rom.write_bytes(world.enemies[f"{enemy} (2)"].address + 0x3E, bytearray([world.enemies[enemy].luck])) diff --git a/worlds/earthbound/modules/enemy_data.py b/worlds/earthbound/modules/enemy_data.py new file mode 100644 index 0000000000..210a38645f --- /dev/null +++ b/worlds/earthbound/modules/enemy_data.py @@ -0,0 +1,1320 @@ +from typing import Dict +from collections import Counter +import struct +import math +from typing import TYPE_CHECKING +from logging import warning +if TYPE_CHECKING: + from .. import EarthBoundWorld + from ..Rom import LocalRom + + + +class EarthBoundEnemy: + def __init__(self, name: str, address: int, hp: int, pp: int, exp: int, money: int, speed: int, offense: int, + defense: int, level: int, guts: int, luck: int, is_scaled: bool, shield: str | None = None, + attack_extensions: int = 0): + self.name = name + self.address = address + self.hp = hp + self.pp = pp + self.exp = exp + self.money = money + self.speed = speed + self.offense = offense + self.defense = defense + self.level = level + self.guts = guts + self.luck = luck + self.is_scaled = is_scaled + self.shield = shield + self.attack_extensions = attack_extensions + + +def initialize_enemies(world: "EarthBoundWorld") -> None: + world.enemy_psi = { + "Dept. Store Spook": ["freeze", "fire", "lifeup", "null"], + "Dept. Store Spook (2)": ["null", "null", "freeze", "null"], + "Black Antoid": ["null", "null", "null", "lifeup"], + "Struttin' Evil Mushroom": ["null", "null", "null", "scatter_spores"], + "Mobile Sprout": ["null", "null", "null", "lifeup"], + "Tough Mobile Sprout": ["null", "null", "null", "lifeup"], + "Mystical Record": ["null", "null", "lifeup", "null"], + "Guardian Hieroglyph": ["hacking_cough", "thunder_minus", "flash", "thunder"], + "Electro Swoosh": ["null", "electrical_shock", "electrical_shock", "null"], + "Conducting Menace": ["flash_minus", "flash", "thunder_minus", "thunder"], + "Conducting Spirit": ["flash_minus", "flash", "thunder_minus", "thunder"], + "Ness's Nightmare": ["null", "special", "glorious_light", "null"], + "Mr. Carpainter": ["crashing_boom_bang", "lifeup", "null", "null"], + "Carbon Dog": ["flaming_fireball", "null", "null", "null"], + "Thunder Mite": ["thunder_minus", "thunder_minus", "thunder", "thunder"], + "Chomposaur": ["fire", "fire", "null", "null"], + "Gigantic Ant": ["null", "poison_stinger", "null", "null"], + "Shrooom!": ["null", "lifeup", "scatter_spores", "null"], + "Plague Rat of Doom": ["poisonous_fangs", "null", "null", "null"], + "Mondo Mole": ["lifeup", "null", "null", "null"], + "Scalding Coffee Cup": ["scalding_espresso", "scalding_espresso", "scalding_espresso", "scalding_espresso"], + "Arachnid!": ["null", "null", "null", "poison_stinger"], + "Arachnid!!!": ["poison_stinger", "null", "null", "null"], + "Slimy Little Pile": ["hacking_cough", "null", "null", "null"], + "Even Slimier Little Pile": ["null", "null", "null", "hacking_cough"], + "Kraken": ["breathe_fire", "null", "crashing_boom_bang", "null"], + "Bionic Kraken": ["null", "crashing_boom_bang", "breathe_fire", "null"], # Generate tornado? + "Spinning Robo": ["null", "null", "stuffiness_beam", "null"], + "Whirling Robo": ["null", "stuffiness_beam", "null", "null"], + "Thirsty Coil Snake": ["poisonous_fangs", "null", "null", "null"], + "Crazed Sign": ["null", "null", "paralysis", "null"], + "Wooly Shambler": ["null", "null", "null", "flash"], + "Wild 'n Wooly Shambler": ["null", "null", "null", "flash"], + "Skelpion": ["null", "poison_stinger", "null", "thunder"], + "Dread Skelpion": ["poison_stinger", "null", "thunder", "thunder"], + "Ghost of Starman": ["starstorm_minus", "null", "null", "null"], + "Smilin' Sphere": ["null", "fire", "null", "null"], + "Uncontrollable Sphere": ["null", "fire", "fire", "null"], + "Starman Deluxe": ["null", "null", "starstorm", "null"], + "Final Starman": ["null", "null", "starstorm", "null"], + "Urban Zombie": ["null", "null", "nauseous_breath", "null"], + "Zombie Dog": ["null", "null", "null", "poisonous_fangs"], + "Diamond Dog": ["null", "null", "null", "glorious_light"], + "Trillionage Sprout": ["null", "null", "flash", "paralysis"], + "Musica": ["electrical_shock", "null", "null", "electrical_shock"], + "Desert Wolf": ["null", "null", "null", "poisonous_fangs"], + "Master Belch": ["nauseous_breath", "nauseous_breath", "null", "null"], + "Big Pile of Puke": ["null", "hacking_cough", "null", "nauseous_breath"], + "Master Barf": ["nauseous_breath", "null", "null", "null"], + "Kiss of Death": ["null", "null", "kiss_of_death", "null"], + "French Kiss of Death": ["kiss_of_death", "kiss_of_death", "kiss_of_death", "kiss_of_death"], + "Zap Eel": ["electrical_shock", "electrical_shock", "electrical_shock", "electrical_shock"], + "Tangoo": ["null", "null", "poison_flute", "null"], + "Squatter Demon": ["poisonous_fangs", "diamond_bite", "null", "null"], + "Lesser Mook": ["freeze", "freeze", "null", "diamond_eyes"], + "Mook Senior": ["freeze", "fire", "lifeup", "diamond_eyes"], + "Smelly Ghost": ["null", "null", "lifeup", "null"], + "Deadly Mouse": ["poisonous_fangs", "null", "null", "null"], + "Care Free Bomb": ["throw_bomb_minus", "throw_bomb_minus", "throw_bomb_minus", "throw_bomb"], + "Electro Specter": ["electrical_shock", "null", "electrical_shock", "null"], + "Smilin' Sam": ["null", "null", "null", "lifeup"], + "Manly Fish's Brother": ["null", "paralysis", "freeze", "healing"], + "Thunder and Storm": ["crashing_boom_bang", "null", "null", "null"], + "Cute Li'l UFO": ["null", "null", "null", "lifeup"], + "Beautiful UFO": ["null", "null", "null", "lifeup"], + "Evil Mani-Mani": ["null", "paralysis", "null", "null"], + "Mr. Molecule": ["thunder", "flash", "fire", "freeze"], + "Sentry Robot": ["null", "null", "null", "shoot_rocket"], + "Psychic Psycho": ["fire", "fire", "fire", "fire"], + "Major Psychic Psycho": ["fire", "null", "paralysis", "fire"], + "Soul Consuming Flame": ["null", "breathe_fire", "flaming_fireball", "spray_fire"], + "Demonic Petunia": ["null", "extinguishing_blast", "null", "paralyzing_pollen"], + "Li'l UFO": ["null", "null", "stuffiness_beam", "null"], + "Robo-Pump (2)": ["throw_bomb", "null", "null", "null"], + "Ness's Nightmare (2)": ["special", "lifeup", "special", "null"], + "Mr. Carpainter (2)": ["crashing_boom_bang", "null", "null", "null"], + "Carbon Dog (2)": ["spray_fire", "null", "null", "null"], + "Gigantic Ant (2)": ["paralysis", "null", "null", "null"], + "Chomposaur (2)": ["null", "null", "fire", "fire"], + "Guardian Digger (2)": ["null", "null", "null", "lifeup"], + "Kraken (2)": ["flash", "breathe_fire", "null", "null"], # tornado? + "Starman Super (2)": ["null", "healing", "null", "null"], + "Ghost of Starman (2)": ["null", "null", "starstorm", "null"], + "Final Starman (2)": ["starstorm", "null", "healing", "null"], + "Diamond Dog (2)": ["null", "null", "null", "diamond_bite"], + "Trillionage Sprout (2)": ["null", "null", "diamond_eyes", "null"], + "Master Belch (2)": ["nauseous_breath", "null", "null", "null"], + "Master Barf (2)": ["null", "null", "nauseous_breath", "null"], + "Boogey Tent (2)": ["null", "null", "flash", "null"], + "Electro Specter (2)": ["null", "null", "electrical_shock", "null"], + "Thunder and Storm (2)": ["summon_storm", "null", "crashing_boom_bang", "null"], + "Evil Mani-Mani (2)": ["null", "null", "glorious_light", "null"], + "Black Antoid (2)": ["lifeup", "lifeup", "lifeup", "lifeup"], + "Giygas (2)": ["special", "special", "special", "special"], + "Farm Zombie": ["null", "null", "nauseous_breath", "null"], + "Criminal Caterpillar": ["fire", "fire", "fire", "fire"], + "Evil Eye": ["null", "diamond_eyes", "paralysis", "null"], + "Master Criminal Worm": ["fire", "fire", "fire", "fire"], + "Giygas": ["giygas_phase2_thunder", "giygas_phase2_freeze", "giygas_phase2_flash", "null"], + "Giygas (5)": ["giygas_phase3_thunder", "giygas_phase3_freeze", "giygas_phase3_flash", "null"], + "Giygas (6)": ["giygas_phase4_thunder", "giygas_phase4_freeze", "giygas_phase4_flash", "null"], + "Starman Junior": ["fire", "null", "freeze", "fire"], + "Ultimate Octobot": ["null", "stuffiness_beam", "null", "stuffiness_beam"], + "Mechanical Octobot": ["null", "null", "null", "stuffiness_beam"] + } + + world.enemy_sprites = { + "Insane Cultist": 0x0065, + "Armored Frog": 0x0118, + "Bad Buffalo": 0x0137, + "Black Antoid": 0x013C, + "Black Antoid (2)": 0x013C, + "Red Antoid": 0x013C, + "Ramblin' Evil Mushroom": 0x0123, + "Struttin' Evil Mushroom": 0x0123, + "Mobile Sprout": 0x013D, + "Tough Mobile Sprout": 0x013D, + "Enraged Fire Plug": 0x0117, + "Mystical Record": 0x00C3, + "Atomic Power Robot": 0x0132, + "Nuclear Reactor Robot": 0x0132, + "Guardian Hieroglyph": 0x0145, + "Lethal Asp Hieroglyph": 0x0140, + "Electro Swoosh": 0x0114, + "Conducting Menace": 0x0144, + "Conducting Spirit": 0x0144, + "Evil Elemental": 0x0117, + "Annoying Old Party Man": 0x0187, + "Annoying Reveler": 0x0187, + "Unassuming Local Guy": 0x0045, + "New Age Retro Hippie": 0x0169, + "Mighty Bear": 0x014B, + "Mighty Bear Seven": 0x014B, + "Putrid Moldyman": 0x011D, + "Thunder Mite": 0x0144, + "Cranky Lady": 0x0188, + "Extra Cranky Lady": 0x0188, + "Wetnosaur": 0x012A, + "Chomposaur": 0x0138, + "Gigantic Ant": 0x0139, + "Scalding Coffee Cup": 0x00C3, + "Loaded Dice": 0x00C3, + "Slimy Little Pile": 0x013B, + "Even Slimier Little Pile": 0x013B, + "Arachnid!": 0x013A, + "Arachnid!!!": 0x013A, + "Bionic Kraken": 0x0132, + "Spinning Robo": 0x0132, + "Whirling Robo": 0x0132, + "Hyper Spinning Robo": 0x0132, + "Cop": 0x004A, + "Coil Snake": 0x011B, + "Thirsty Coil Snake": 0x011B, + "Mr. Batty": 0x0112, + "Elder Batty": 0x0112, + "Violent Roach": 0x013A, + "Filthy Attack Roach": 0x013A, + "Crazed Sign": 0x0135, + "Wooly Shambler": 0x0132, + "Wild 'n Wooly Shambler": 0x0132, + "Skate Punk": 0x011C, + "Skelpion": 0x013F, + "Dread Skelpion": 0x013F, + "Starman": 0x012F, + "Starman Super": 0x012F, + "Ghost of Starman": 0x0132, + "Smilin' Sphere": 0x012E, + "Uncontrollable Sphere": 0x012E, + "Petrified Royal Guard": 0x0142, + "Final Starman": 0x0132, + "Urban Zombie": 0x0134, + "Zombie Possessor": 0x0131, + "Zombie Dog": 0x016C, + "Over Zealous Cop": 0x0182, + "Territorial Oak": 0x0129, + "Hostile Elder Oak": 0x0129, + "Marauder Octobot": 0x0132, + "Military Octobot": 0x0132, + "Mechanical Octobot": 0x0132, + "Ultimate Octobot": 0x0132, + "Mad Duck": 0x011F, + "Dali's Clock": 0x0146, + "Musica": 0x00C3, + "Desert Wolf": 0x014A, + "Big Pile of Puke": 0x0148, + "Kiss of Death": 0x0144, + "French Kiss of Death": 0x0115, + "Foppy": 0x0116, + "Fobby": 0x0116, + "Zap Eel": 0x012D, + "Tangoo": 0x0144, + "Squatter Demon": 0x0132, + "Crested Booka": 0x0128, + "Great Crested Booka": 0x0128, + "Lesser Mook": 0x0132, + "Mook Senior": 0x0132, + "Smelly Ghost": 0x011D, + "Stinky Ghost": 0x011D, + "Attack Slug": 0x013C, + "Pit Bull Slug": 0x013C, + "Rowdy Mouse": 0x01A0, + "Deadly Mouse": 0x01A0, + "Care Free Bomb": 0x0115, + "Handsome Tom": 0x011E, + "Smilin' Sam": 0x011E, + "Manly Fish": 0x0120, + "Manly Fish's Brother": 0x0120, + "Runaway Dog": 0x014A, + "Trick or Trick Kid": 0x01BC, + "Cave Boy": 0x0149, + "Abstract Art": 0x012C, + "Shattered Man": 0x0142, + "Fierce Shattered Man": 0x0133, + "Ego Orb": 0x0147, + "Yes Man Junior": 0x011C, + "Cute Li'l UFO": 0x0130, + "Beautiful UFO": 0x0130, + "Pogo Punk": 0x011C, + "Tough Guy": 0x0186, + "Mad Taxi": 0x0121, + "Mr. Molecule": 0x0115, + "Worthless Protoplasm": 0x00C3, + "Sentry Robot": 0x0136, + "Psychic Psycho": 0x0117, + "Major Psychic Psycho": 0x0117, + "Mole Playing Rough": 0x019F, + "Gruff Goat": 0x0126, + "Soul Consuming Flame": 0x0117, + "Demonic Petunia": 0x0122, + "Ranboob": 0x0124, + "Li'l UFO": 0x0130, + "High-class UFO": 0x0130, + "Noose Man": 0x0143, + "Robo-pump": 0x0117, + "Plain Crocodile": 0x014C, + "Strong Crocodile": 0x014C, + "Hard Crocodile": 0x014C, + "No Good Fly": 0x013E, + "Mostly Bad Fly": 0x013E, + "Spiteful Crow": 0x011A, + "Farm Zombie": 0x0134, + "Criminal Caterpillar": 0x01A1, + "Evil Eye": 0x0132, + "Master Criminal Worm": 0x01CD, + "Loaded Dice 2": 0x00C3, +} + + world.enemies = { + "Insane Cultist": EarthBoundEnemy("Insane Cultist", 0x1595e7, 94, 0, 353, 33, 8, 19, 25, 13, 20, 64, False), + "Dept. Store Spook": EarthBoundEnemy("Dept. Store Spook", 0x159645, 610, 290, 24291, 1648, 19, 82, 135, 42, 24, 62, False, None, 2), + "Armored Frog": EarthBoundEnemy("Armored Frog", 0x1596a3, 202, 0, 1566, 77, 7, 37, 108, 22, 5, 8, False), + "Bad Buffalo": EarthBoundEnemy("Bad Buffalo", 0x159701, 341, 0, 4108, 172, 11, 64, 104, 34, 5, 5, False), + "Black Antoid": EarthBoundEnemy("Black Antoid", 0x15975f, 34, 25, 37, 7, 4, 14, 13, 7, 3, 0, False), + "Red Antoid": EarthBoundEnemy("Red Antoid", 0x1597bd, 112, 30, 1175, 35, 10, 29, 27, 20, 4, 0, False), + "Ramblin' Evil Mushroom": EarthBoundEnemy("Ramblin' Evil Mushroom", 0x15981b, 60, 0, 95, 15, 5, 15, 10, 7, 5, 1, False), + "Struttin' Evil Mushroom": EarthBoundEnemy("Struttin' Evil Mushroom", 0x159879, 157, 0, 1492, 95, 28, 29, 22, 17, 7, 1, False), + "Mobile Sprout": EarthBoundEnemy("Mobile Sprout", 0x1598d7, 79, 9, 133, 13, 6, 17, 12, 10, 5, 1, False), + "Tough Mobile Sprout": EarthBoundEnemy("Tough Mobile Sprout", 0x159935, 179, 13, 1865, 119, 18, 33, 27, 21, 6, 1, False), + "Enraged Fire Plug": EarthBoundEnemy("Enraged Fire Plug", 0x159993, 309, 0, 4321, 346, 14, 60, 81, 32, 5, 4, False), + "Mystical Record": EarthBoundEnemy("Mystical Record", 0x1599f1, 263, 35, 2736, 310, 20, 63, 78, 33, 12, 7, False), + "Atomic Power Robot": EarthBoundEnemy("Atomic Power Robot", 0x159a4f, 594, 0, 26937, 730, 25, 119, 133, 56, 8, 12, False), + "Nuclear Reactor Robot": EarthBoundEnemy("Nuclear Reactor Robot", 0x159aad, 798, 0, 53142, 820, 46, 142, 185, 64, 8, 12, False), + "Guardian Hieroglyph": EarthBoundEnemy("Guardian Hieroglyph", 0x159b0b, 470, 126, 13064, 470, 20, 94, 106, 48, 20, 38, False), + "Lethal Asp Hieroglyph": EarthBoundEnemy("Lethal Asp Hieroglyph", 0x159b69, 458, 0, 11321, 625, 21, 89, 94, 46, 5, 36, False), + "Electro Swoosh": EarthBoundEnemy("Electro Swoosh", 0x159bc7, 543, 338, 17075, 791, 40, 140, 156, 62, 5, 10, False), + "Conducting Menace": EarthBoundEnemy("Conducting Menace", 0x159c25, 445, 238, 14792, 574, 20, 107, 107, 52, 5, 8, False), + "Conducting Spirit": EarthBoundEnemy("Conducting Spirit", 0x159c83, 587, 329, 30390, 804, 26, 130, 139, 59, 5, 8, False), + "Evil Elemental": EarthBoundEnemy("Evil Elemental", 0x159ce1, 564, 0, 35737, 853, 30, 121, 136, 57, 7, 16, False), + "Ness's Nightmare": EarthBoundEnemy("Ness's Nightmare", 0x159d3f, 1654, 882, 89004, 4442, 31, 172, 253, 71, 1, 80, False, "psi_1", 2), + "Annoying Old Party Man": EarthBoundEnemy("Annoying Old Party Man", 0x159d9d, 99, 0, 130, 32, 6, 20, 25, 13, 50, 15, False), + "Annoying Reveler": EarthBoundEnemy("Annoying Reveler", 0x159dfb, 288, 0, 2373, 268, 17, 58, 77, 31, 50, 15, False), + "Unassuming Local Guy": EarthBoundEnemy("Unassuming Local Guy", 0x159e59, 73, 0, 146, 19, 5, 18, 13, 9, 1, 14, False), + "New Age Retro Hippie": EarthBoundEnemy("New Age Retro Hippie", 0x159eb7, 87, 0, 160, 23, 5, 19, 14, 11, 10, 16, False), + "Mr. Carpainter": EarthBoundEnemy("Mr. Carpainter", 0x159f15, 262, 70, 1412, 195, 8, 33, 45, 21, 13, 72, False, None, 2), + "Carbon Dog": EarthBoundEnemy("Carbon Dog", 0x159f73, 1672, 0, 0, 0, 31, 159, 174, 70, 52, 53, False, None, 2), + "Mighty Bear": EarthBoundEnemy("Mighty Bear", 0x159fd1, 167, 0, 609, 49, 7, 29, 31, 16, 1, 5, False), + "Mighty Bear Seven": EarthBoundEnemy("Mighty Bear Seven", 0x15a02f, 367, 0, 8884, 440, 11, 85, 76, 42, 1, 4, False), + "Putrid Moldyman": EarthBoundEnemy("Putrid Moldyman", 0x15a08d, 203, 0, 830, 53, 9, 36, 41, 21, 5, 17, False), + "Thunder Mite": EarthBoundEnemy("Thunder Mite", 0x15a0eb, 293, 200, 10798, 430, 20, 85, 83, 43, 13, 8, False), + "Cranky Lady": EarthBoundEnemy("Cranky Lady", 0x15a149, 95, 0, 200, 17, 6, 16, 18, 8, 3, 32, False), + "Extra Cranky Lady": EarthBoundEnemy("Extra Cranky Lady", 0x15a1a7, 277, 0, 3651, 134, 17, 48, 70, 27, 5, 32, False), + "Wetnosaur": EarthBoundEnemy("Wetnosaur", 0x15a263, 1030, 0, 33098, 745, 17, 126, 172, 59, 2, 16, False), + "Chomposaur": EarthBoundEnemy("Chomposaur", 0x15a2c1, 1288, 320, 44378, 896, 17, 139, 183, 62, 3, 16, False, "phys_2", 2), + "Titanic Ant": EarthBoundEnemy("Titanic Ant", 0x15a31f, 235, 102, 685, 150, 6, 19, 23, 13, 9, 72, False, None, 2), + "Gigantic Ant": EarthBoundEnemy("Gigantic Ant", 0x15a37d, 308, 81, 3980, 304, 17, 54, 112, 30, 5, 6, False, None, 2), + "Shrooom!": EarthBoundEnemy("Shrooom!", 0x15a3db, 1700, 112, 96323, 4086, 18, 95, 154, 48, 32, 72, False, None, 2), + "Plague Rat of Doom": EarthBoundEnemy("Plague Rat of Doom", 0x15a439, 1827, 60, 115272, 4464, 19, 71, 180, 47, 250, 45, False, None, 2), + "Mondo Mole": EarthBoundEnemy("Mondo Mole", 0x15a497, 498, 161, 5791, 400, 9, 37, 50, 23, 15, 36, False, None, 2), + "Guardian Digger": EarthBoundEnemy("Guardian Digger", 0x15a4f5, 386, 110, 17301, 1467, 17, 59, 129, 32, 21, 55, False, "phys_2", 2), + "Scalding Coffee Cup": EarthBoundEnemy("Scalding Coffee Cup", 0x15a553, 190, 0, 2462, 280, 23, 55, 20, 30, 5, 1, False), + "Loaded Dice": EarthBoundEnemy("Loaded Dice", 0x15a5b1, 307, 0, 10672, 703, 77, 146, 113, 59, 75, 6, False, None), + "Slimy Little Pile": EarthBoundEnemy("Slimy Little Pile", 0x15a60f, 224, 0, 1978, 124, 15, 42, 61, 24, 7, 38, False), + "Even Slimier Little Pile": EarthBoundEnemy("Even Slimier Little Pile", 0x15a66d, 326, 0, 15075, 579, 22, 103, 101, 49, 9, 38, False), + "Arachnid!": EarthBoundEnemy("Arachnid!", 0x15a6cb, 216, 0, 4933, 296, 23, 61, 30, 32, 3, 0, False), + "Arachnid!!!": EarthBoundEnemy("Arachnid!!!", 0x15a729, 344, 0, 10449, 412, 20, 87, 86, 45, 4, 0, False), + "Kraken": EarthBoundEnemy("Kraken", 0x15a787, 1097, 176, 79267, 3049, 21, 105, 166, 54, 1, 32, False, None, 2), + "Bionic Kraken": EarthBoundEnemy("Bionic Kraken", 0x15a7e5, 900, 60, 50308, 960, 42, 155, 195, 70, 1, 32, False), + "Spinning Robo": EarthBoundEnemy("Spinning Robo", 0x15a843, 113, 17, 297, 21, 7, 21, 22, 14, 5, 12, False), + "Whirling Robo": EarthBoundEnemy("Whirling Robo", 0x15a8a1, 374, 36, 5782, 256, 18, 78, 90, 39, 5, 12, False), + "Hyper Spinning Robo": EarthBoundEnemy("Hyper Spinning Robo", 0x15a8ff, 553, 83, 28866, 756, 28, 122, 130, 56, 5, 12, False), + "Cop": EarthBoundEnemy("Cop", 0x15a95d, 75, 0, 86, 18, 5, 15, 18, 7, 7, 16, False), + "Coil Snake": EarthBoundEnemy("Coil Snake", 0x15a9bb, 18, 0, 1, 4, 2, 3, 4, 1, 0, 6, False), + "Thirsty Coil Snake": EarthBoundEnemy("Thirsty Coil Snake", 0x15aa19, 270, 0, 2786, 276, 18, 52, 80, 28, 5, 7, False), + "Mr. Batty": EarthBoundEnemy("Mr. Batty", 0x15aa77, 86, 0, 304, 30, 29, 25, 5, 15, 4, 3, False), + "Elder Batty": EarthBoundEnemy("Elder Batty", 0x15aad5, 294, 0, 4177, 371, 33, 66, 72, 35, 8, 4, False), + "Violent Roach": EarthBoundEnemy("Violent Roach", 0x15ab33, 209, 0, 1757, 80, 35, 30, 26, 18, 9, 24, False), + "Filthy Attack Roach": EarthBoundEnemy("Filthy Attack Roach", 0x15ab91, 399, 0, 10543, 432, 77, 84, 33, 42, 9, 24, False), + "Crazed Sign": EarthBoundEnemy("Crazed Sign", 0x15abef, 295, 98, 3618, 244, 17, 64, 96, 34, 5, 11, False), + "Wooly Shambler": EarthBoundEnemy("Wooly Shambler", 0x15ac4d, 391, 140, 5397, 458, 18, 81, 91, 40, 5, 63, False), + "Wild 'n Wooly Shambler": EarthBoundEnemy("Wild 'n Wooly Shambler", 0x15acab, 722, 212, 33818, 906, 38, 144, 171, 65, 5, 63, False), + "Skate Punk": EarthBoundEnemy("Skate Punk", 0x15ad09, 31, 0, 12, 17, 5, 7, 8, 3, 0, 13, False), + "Skelpion": EarthBoundEnemy("Skelpion", 0x15ad67, 137, 21, 1823, 140, 37, 41, 23, 24, 80, 7, False), + "Dread Skelpion": EarthBoundEnemy("Dread Skelpion", 0x15adc5, 214, 125, 9908, 609, 40, 82, 57, 41, 88, 8, False), + "Starman": EarthBoundEnemy("Starman", 0x15ae23, 545, 155, 23396, 720, 24, 103, 126, 55, 25, 16, False, None, 2), + "Starman Super": EarthBoundEnemy("Starman Super", 0x15ae81, 568, 310, 30145, 735, 24, 112, 129, 56, 25, 16, False, "psi_2", 1), + "Ghost of Starman": EarthBoundEnemy("Ghost of Starman", 0x15aedf, 750, 462, 48695, 807, 46, 152, 170, 68, 43, 16, False, None, 2), + "Smilin' Sphere": EarthBoundEnemy("Smilin' Sphere", 0x15af3d, 233, 60, 2218, 191, 17, 50, 65, 27, 5, 13, False), + "Uncontrollable Sphere": EarthBoundEnemy("Uncontrollable Sphere", 0x15af9b, 577, 180, 20389, 796, 27, 116, 134, 56, 5, 15, False, "psi_1"), + "Petrified Royal Guard": EarthBoundEnemy("Petrified Royal Guard", 0x15aff9, 573, 0, 19163, 628, 12, 106, 173, 53, 5, 5, False), + "Guardian General": EarthBoundEnemy("Guardian General", 0x15b057, 831, 6, 95390, 3235, 21, 109, 214, 55, 1, 7, False, None, 2), + "Starman Deluxe": EarthBoundEnemy("Starman Deluxe", 0x15b0b5, 1400, 418, 160524, 3827, 27, 143, 186, 65, 43, 21, False, "psi_2", 2), + "Final Starman": EarthBoundEnemy("Final Starman", 0x15b113, 840, 860, 61929, 915, 47, 178, 187, 71, 25, 24, False, "psi_2", 2), + "Urban Zombie": EarthBoundEnemy("Urban Zombie", 0x15b171, 171, 0, 700, 58, 10, 31, 24, 19, 15, 24, False), + "Zombie Possessor": EarthBoundEnemy("Zombie Possessor", 0x15b1cf, 176, 0, 950, 81, 30, 28, 19, 17, 9, 6, False), + "Zombie Dog": EarthBoundEnemy("Zombie Dog", 0x15b22d, 210, 0, 1354, 54, 30, 39, 51, 22, 10, 11, False), + "Over Zealous Cop": EarthBoundEnemy("Over Zealous Cop", 0x15b2e9, 325, 0, 7448, 420, 18, 69, 75, 36, 7, 16, False), + "Territorial Oak": EarthBoundEnemy("Territorial Oak", 0x15b347, 145, 41, 356, 29, 5, 26, 30, 15, 9, 4, False), + "Hostile Elder Oak": EarthBoundEnemy("Hostile Elder Oak", 0x15b3a5, 609, 76, 17567, 690, 14, 134, 146, 59, 11, 5, False), + "Diamond Dog": EarthBoundEnemy("Diamond Dog", 0x15b403, 3344, 154, 337738, 6968, 31, 167, 230, 70, 10, 47, False, "phys_2", 2), + "Marauder Octobot": EarthBoundEnemy("Marauder Octobot", 0x15b461, 482, 0, 14475, 499, 23, 99, 121, 49, 8, 24, False), + "Military Octobot": EarthBoundEnemy("Military Octobot", 0x15b4bf, 604, 0, 25607, 637, 26, 138, 147, 61, 8, 18, False), + "Mechanical Octobot": EarthBoundEnemy("Mechanical Octobot", 0x15b51d, 768, 0, 41738, 744, 43, 147, 176, 66, 8, 24, False), + "Ultimate Octobot": EarthBoundEnemy("Ultimate Octobot", 0x15b57b, 792, 0, 47876, 815, 44, 163, 181, 70, 8, 24, False), + "Mad Duck": EarthBoundEnemy("Mad Duck", 0x15b5d9, 51, 0, 41, 12, 30, 12, 24, 8, 5, 1, False), + "Dali's Clock": EarthBoundEnemy("Dali's Clock", 0x15b637, 296, 0, 2503, 314, 4, 65, 66, 34, 5, 4, False), + "Trillionage Sprout": EarthBoundEnemy("Trillionage Sprout", 0x15b695, 1048, 240, 30303, 1358, 16, 54, 88, 29, 21, 71, False, None, 2), + "Musica": EarthBoundEnemy("Musica", 0x15b6f3, 292, 0, 3748, 341, 21, 69, 85, 35, 20, 8, False), + "Desert Wolf": EarthBoundEnemy("Desert Wolf", 0x15b751, 247, 0, 3740, 114, 33, 57, 67, 30, 2, 11, False), + "Master Belch": EarthBoundEnemy("Master Belch", 0x15b7af, 650, 0, 12509, 664, 16, 50, 88, 27, 20, 61, False, None, 2), # Real one + "Big Pile of Puke": EarthBoundEnemy("Big Pile of Puke", 0x15b80d, 631, 0, 19659, 728, 16, 120, 158, 57, 26, 32, False), + "Master Barf": EarthBoundEnemy("Master Barf", 0x15b86b, 1319, 0, 125056, 3536, 24, 136, 177, 60, 39, 64, False, None, 2), + "Kiss of Death": EarthBoundEnemy("Kiss of Death", 0x15b8c9, 333, 0, 10354, 528, 19, 91, 100, 46, 7, 16, False), + "French Kiss of Death": EarthBoundEnemy("French Kiss of Death", 0x15b927, 588, 0, 19210, 879, 30, 160, 160, 70, 7, 16, False), + "Foppy": EarthBoundEnemy("Foppy", 0x15b985, 120, 10, 1311, 93, 1, 29, 9, 16, 5, 3, False), + "Fobby": EarthBoundEnemy("Fobby", 0x15b9e3, 240, 19, 18348, 620, 5, 98, 84, 48, 5, 3, False), + "Zap Eel": EarthBoundEnemy("Zap Eel", 0x15ba41, 370, 0, 12170, 611, 29, 97, 93, 48, 5, 8, False), + "Tangoo": EarthBoundEnemy("Tangoo", 0x15ba9f, 371, 5, 14718, 572, 19, 96, 99, 48, 20, 16, False), + "Boogey Tent": EarthBoundEnemy("Boogey Tent", 0x15bafd, 579, 56, 5500, 407, 10, 43, 69, 25, 16, 32, False, None, 2), + "Squatter Demon": EarthBoundEnemy("Squatter Demon", 0x15bb5b, 774, 60, 48311, 897, 45, 158, 192, 69, 25, 32, False), + "Crested Booka": EarthBoundEnemy("Crested Booka", 0x15bbb9, 265, 0, 3011, 130, 17, 53, 73, 28, 24, 37, False), + "Great Crested Booka": EarthBoundEnemy("Great Crested Booka", 0x15bc17, 452, 0, 16365, 604, 20, 100, 110, 49, 28, 40, False), + "Lesser Mook": EarthBoundEnemy("Lesser Mook", 0x15bc75, 401, 190, 7640, 467, 17, 76, 102, 39, 7, 16, False), + "Mook Senior": EarthBoundEnemy("Mook Senior", 0x15bcd3, 501, 700, 21056, 715, 25, 108, 122, 54, 7, 16, False), + "Smelly Ghost": EarthBoundEnemy("Smelly Ghost", 0x15bd31, 194, 50, 606, 71, 10, 35, 89, 21, 2, 9, False), + "Stinky Ghost": EarthBoundEnemy("Stinky Ghost", 0x15bd8f, 444, 0, 13179, 541, 18, 90, 179, 46, 4, 7, False), + "Everdred": EarthBoundEnemy("Everdred", 0x15bded, 182, 0, 986, 171, 6, 25, 35, 15, 10, 40, False, None, 2), + "Attack Slug": EarthBoundEnemy("Attack Slug", 0x15be4b, 30, 6, 27, 6, 1, 9, 2, 5, 0, 3, False), + "Pit Bull Slug": EarthBoundEnemy("Pit Bull Slug", 0x15bea9, 217, 11, 9994, 543, 2, 79, 77, 39, 5, 7, False), + "Rowdy Mouse": EarthBoundEnemy("Rowdy Mouse", 0x15bf07, 36, 0, 34, 9, 5, 7, 20, 6, 225, 2, False), + "Deadly Mouse": EarthBoundEnemy("Deadly Mouse", 0x15bf65, 416, 0, 9225, 406, 18, 63, 98, 38, 225, 13, False), + "Care Free Bomb": EarthBoundEnemy("Care Free Bomb", 0x15bfc3, 504, 0, 14941, 641, 31, 135, 215, 60, 15, 8, False), + "Electro Specter": EarthBoundEnemy("Electro Specter", 0x15c021, 3092, 80, 261637, 6564, 29, 148, 203, 67, 47, 56, False, "psi_2", 2), + "Handsome Tom": EarthBoundEnemy("Handsome Tom", 0x15c07f, 133, 16, 520, 45, 11, 27, 25, 16, 5, 8, False), + "Smilin' Sam": EarthBoundEnemy("Smilin' Sam", 0x15c0dd, 161, 55, 712, 48, 17, 34, 44, 20, 16, 16, False), + "Manly Fish": EarthBoundEnemy("Manly Fish", 0x15c13b, 500, 0, 15826, 624, 22, 83, 114, 42, 9, 20, False), + "Manly Fish's Brother": EarthBoundEnemy("Manly Fish's Brother", 0x15c199, 526, 210, 15970, 686, 24, 114, 123, 56, 11, 24, False), + "Runaway Dog": EarthBoundEnemy("Runaway Dog", 0x15c1f7, 21, 0, 4, 3, 26, 4, 5, 2, 0, 1, False), + "Trick or Trick Kid": EarthBoundEnemy("Trick or Trick Kid", 0x15c255, 142, 0, 570, 47, 7, 30, 37, 18, 12, 12, False), + "Cave Boy": EarthBoundEnemy("Cave Boy", 0x15c2b3, 314, 0, 618, 17, 79, 21, 33, 14, 0, 80, False), + "Abstract Art": EarthBoundEnemy("Abstract Art", 0x15c311, 301, 60, 4361, 255, 19, 67, 79, 35, 7, 7, False), + "Shattered Man": EarthBoundEnemy("Shattered Man", 0x15c36f, 694, 0, 44690, 2630, 18, 104, 138, 51, 25, 38, False), + "Fierce Shattered Man": EarthBoundEnemy("Fierce Shattered Man", 0x15c3cd, 516, 0, 17423, 577, 12, 101, 116, 50, 5, 4, False), + "Ego Orb": EarthBoundEnemy("Ego Orb", 0x15c42b, 592, 0, 24180, 836, 17, 125, 140, 58, 1, 8, False), + "Thunder and Storm": EarthBoundEnemy("Thunder and Storm", 0x15c489, 2065, 70, 129026, 4736, 21, 111, 178, 56, 35, 55, False, None, 2), + "Yes Man Junior": EarthBoundEnemy("Yes Man Junior", 0x15c4e7, 33, 0, 13, 18, 4, 8, 9, 4, 0, 14, False), + "Frankystein Mark II": EarthBoundEnemy("Frankystein Mark II", 0x15c545, 91, 0, 76, 31, 4, 15, 18, 7, 0, 40, False, None, 2), + "Frank": EarthBoundEnemy("Frank", 0x15c5a3, 63, 0, 50, 48, 7, 12, 17, 6, 5, 32, False), + "Cute Li'l UFO": EarthBoundEnemy("Cute Li'l UFO", 0x15c601, 162, 25, 1519, 110, 58, 49, 32, 27, 1, 70, False), + "Beautiful UFO": EarthBoundEnemy("Beautiful UFO", 0x15c65f, 339, 15, 8257, 426, 59, 86, 87, 44, 1, 71, False), + "Pogo Punk": EarthBoundEnemy("Pogo Punk", 0x15c6bd, 35, 0, 15, 18, 3, 8, 10, 4, 0, 15, False), + "Tough Guy": EarthBoundEnemy("Tough Guy", 0x15c71b, 342, 0, 9310, 525, 18, 72, 92, 37, 20, 16, False), + "Mad Taxi": EarthBoundEnemy("Mad Taxi", 0x15c779, 253, 0, 2336, 216, 38, 53, 68, 28, 5, 8, False), + "Evil Mani-Mani": EarthBoundEnemy("Evil Mani-Mani", 0x15c7d7, 860, 88, 28139, 1852, 15, 86, 145, 45, 1, 80, False, None, 2), + "Mr. Molecule": EarthBoundEnemy("Mr. Molecule", 0x15c835, 280, 21, 8708, 659, 18, 118, 97, 56, 5, 4, False), + "Worthless Protoplasm": EarthBoundEnemy("Worthless Protoplasm", 0x15c893, 38, 0, 17, 11, 27, 11, 21, 7, 0, 1, False), + "Sentry Robot": EarthBoundEnemy("Sentry Robot", 0x15c8f1, 372, 0, 5034, 392, 17, 77, 105, 39, 10, 4, False), + # "Heavily Armed Pokey ": EarthBoundEnemy("Heavily Armed Pokey", 0x15c94f, 1746, 999, 0, 0, 51, 150, 274, 72, False), Unused + "Psychic Psycho": EarthBoundEnemy("Psychic Psycho", 0x15c9ad, 591, 252, 30094, 682, 30, 124, 144, 58, 1, 24, False), + "Major Psychic Psycho": EarthBoundEnemy("Major Psychic Psycho", 0x15ca0b, 618, 574, 39247, 862, 31, 145, 152, 65, 1, 24, False), + "Mole Playing Rough": EarthBoundEnemy("Mole Playing Rough", 0x15ca69, 103, 0, 456, 36, 9, 22, 28, 14, 2, 8, False), + "Gruff Goat": EarthBoundEnemy("Gruff Goat", 0x15cac7, 45, 0, 20, 9, 12, 8, 23, 7, 0, 16, False), + "Clumsy Robot": EarthBoundEnemy("Clumsy Robot", 0x15cb25, 962, 0, 32378, 2081, 83, 88, 137, 46, 30, 49, False, "psi_1", 3), + "Soul Consuming Flame": EarthBoundEnemy("Soul Consuming Flame", 0x15cb83, 602, 0, 37618, 768, 30, 131, 262, 59, 14, 8, False), + "Demonic Petunia": EarthBoundEnemy("Demonic Petunia", 0x15cbe1, 478, 0, 15171, 724, 26, 102, 111, 50, 5, 9, False), + "Ranboob": EarthBoundEnemy("Ranboob", 0x15cc3f, 232, 42, 2486, 158, 20, 41, 63, 24, 1, 9, False), + "Li'l UFO": EarthBoundEnemy("Li'l UFO", 0x15cc9d, 82, 0, 223, 14, 53, 18, 17, 12, 13, 8, False), + "High-class UFO": EarthBoundEnemy("High-class UFO", 0x15ccfb, 433, 72, 12385, 456, 60, 93, 103, 47, 15, 24, False, "phys_1"), + "Noose Man": EarthBoundEnemy("Noose Man", 0x15cd59, 231, 0, 1990, 220, 18, 47, 52, 26, 5, 4, False), + "Robo-pump": EarthBoundEnemy("Robo-pump", 0x15cdb7, 431, 0, 4797, 349, 19, 70, 113, 36, 5, 4, False, None, 2), + "Plain Crocodile": EarthBoundEnemy("Plain Crocodile", 0x15ce15, 234, 0, 1928, 62, 10, 40, 55, 24, 1, 5, False), + "Strong Crocodile": EarthBoundEnemy("Strong Crocodile", 0x15ce73, 417, 0, 10122, 495, 17, 85, 131, 43, 5, 6, False), + "Hard Crocodile": EarthBoundEnemy("Hard Crocodile", 0x15ced1, 522, 0, 19484, 692, 23, 110, 128, 55, 10, 4, False), + "No Good Fly": EarthBoundEnemy("No Good Fly", 0x15cf2f, 100, 0, 415, 26, 10, 23, 13, 15, 3, 0, False), + "Mostly Bad Fly": EarthBoundEnemy("Mostly Bad Fly", 0x15cf8d, 141, 0, 1116, 84, 15, 32, 16, 19, 4, 0, False), + "Spiteful Crow": EarthBoundEnemy("Spiteful Crow", 0x15cfeb, 24, 0, 3, 5, 77, 5, 3, 3, 0, 1, False), + # "Master Belch": EarthBoundEnemy("Master Belch", 0x15d397, 650, 0, 12509, 664, 16, 50, 88, 27, False), Unused + # "Insane Cultist (2)": EarthBoundEnemy("Insane Cultist", 0x15d3f5, 94, 0, 353, 33, 8, 19, 25, 13, False), + "Dept. Store Spook (2)": EarthBoundEnemy("Dept. Store Spook (2)", 0x15d453, 610, 290, 24291, 1648, 19, 82, 135, 42, 24, 62, False), + "Ness's Nightmare (2)": EarthBoundEnemy("Ness's Nightmare (2)", 0x15d4b1, 1654, 882, 89004, 4442, 31, 172, 253, 71, 1, 80, False), + "Mr. Carpainter (2)": EarthBoundEnemy("Mr. Carpainter (2)", 0x15d50f, 262, 70, 1412, 195, 8, 33, 45, 21, 13, 72, False), + "Carbon Dog (2)": EarthBoundEnemy("Carbon Dog (2)", 0x15d56d, 1672, 0, 0, 0, 31, 159, 174, 70, 52, 53, False), + "Chomposaur (2)": EarthBoundEnemy("Chomposaur (2)", 0x15d5cb, 1288, 320, 44378, 896, 17, 139, 183, 62, 3, 16, False), + "Titanic Ant (2)": EarthBoundEnemy("Titanic Ant (2)", 0x15d629, 235, 102, 685, 150, 6, 19, 23, 13, 9, 72, False), + "Gigantic Ant (2)": EarthBoundEnemy("Gigantic Ant (2)", 0x15d687, 308, 81, 3980, 304, 17, 54, 112, 30, 5, 6, False), + "Shrooom! (2)": EarthBoundEnemy("Shrooom! (2)", 0x15d6e5, 1700, 112, 96323, 4086, 18, 95, 154, 48, 32, 72, False), + "Plague Rat of Doom (2)": EarthBoundEnemy("Plague Rat of Doom (2)", 0x15d743, 1827, 60, 115272, 4464, 19, 71, 180, 47, 250, 45, False), + "Mondo Mole (2)": EarthBoundEnemy("Mondo Mole (2)", 0x15d7a1, 498, 161, 5791, 400, 9, 37, 50, 23, 15, 36, False), + "Guardian Digger (2)": EarthBoundEnemy("Guardian Digger (2)", 0x15d7ff, 386, 110, 17301, 1467, 17, 59, 129, 32, 21, 55, False), + "Kraken (2)": EarthBoundEnemy("Kraken (2)", 0x15d85d, 1097, 176, 79267, 3049, 21, 105, 166, 54, 1, 32, False), + # "Bionic Kraken (2)": EarthBoundEnemy("Bionic Kraken", 0x15d8bb, 900, 60, 50308, 960, 42, 155, 195, 70, False), + "Starman (2)": EarthBoundEnemy("Starman (2)", 0x15d919, 545, 155, 23396, 720, 24, 103, 126, 55, 25, 16, False), + "Starman Super (2)": EarthBoundEnemy("Starman Super (2)", 0x15d977, 568, 310, 30145, 735, 24, 112, 129, 56, 25, 16, False), + "Ghost of Starman (2)": EarthBoundEnemy("Ghost of Starman (2)", 0x15d9d5, 750, 462, 48695, 807, 46, 152, 170, 68, 43, 16, False), + "Starman Deluxe (2)": EarthBoundEnemy("Starman Deluxe (2)", 0x15da33, 1400, 418, 160524, 3827, 27, 143, 186, 65, 43, 21, False), + "Final Starman (2)": EarthBoundEnemy("Final Starman (2)", 0x15da91, 840, 860, 61929, 915, 47, 178, 187, 71, 25, 24, False), + "Diamond Dog (2)": EarthBoundEnemy("Diamond Dog (2)", 0x15db4d, 3344, 154, 337738, 6968, 31, 167, 230, 70, 15, 24, False), + "Trillionage Sprout (2)": EarthBoundEnemy("Trillionage Sprout (2)", 0x15dbab, 1048, 240, 30303, 1358, 16, 54, 88, 29, 21, 71, False), + "Master Belch (2)": EarthBoundEnemy("Master Belch (2)", 0x15dc09, 650, 0, 12509, 664, 16, 50, 88, 27, 20, 61, False), + "Master Barf (2)": EarthBoundEnemy("Master Barf (2)", 0x15dcc5, 1319, 0, 125056, 3536, 24, 136, 177, 60, 39, 64, False), + "Loaded Dice 2": EarthBoundEnemy("Loaded Dice 2", 0x15dd23, 307, 0, 10672, 703, 77, 146, 113, 59, 75, 6, False), + "Boogey Tent (2)": EarthBoundEnemy("Boogey Tent (2)", 0x15dddf, 579, 56, 5500, 407, 10, 43, 69, 25, 16, 32, False), + "Everdred (2)": EarthBoundEnemy("Everdred (2)", 0x15de9b, 182, 0, 986, 171, 6, 25, 35, 15, 10, 40, False), + "Electro Specter (2)": EarthBoundEnemy("Electro Specter (2)", 0x15def9, 3092, 80, 261637, 6564, 29, 148, 203, 67, 47, 56, False), + "Thunder and Storm (2)": EarthBoundEnemy("Thunder and Storm (2)", 0x15df57, 2065, 70, 129026, 4736, 21, 111, 178, 56, 35, 55, False), + "Frankystein Mark II (2)": EarthBoundEnemy("Frankystein Mark II (2)", 0x15dfb5, 91, 0, 76, 31, 4, 15, 18, 7, 0, 40, False), + "Evil Mani-Mani (2)": EarthBoundEnemy("Evil Mani-Mani (2)", 0x15e013, 860, 88, 28139, 1852, 15, 86, 145, 45, 1, 80, False), + # "Heavily Armed Pokey": EarthBoundEnemy("Heavily Armed Pokey", 0x15e071, 1746, 999, 0, 0, 51, 150, 274, 72, False), + "Clumsy Robot (2)": EarthBoundEnemy("Clumsy Robot (2)", 0x15e0cf, 962, 0, 32378, 2081, 83, 88, 137, 46, 30, 49, False), + "Robo-pump (2)": EarthBoundEnemy("Robo-pump (2)", 0x15e12d, 431, 0, 4797, 349, 19, 70, 113, 36, 5, 4, False), + "Guardian General (2)": EarthBoundEnemy("Guardian General (2)", 0x15e1e9, 831, 6, 95390, 3235, 21, 109, 214, 55, 1, 7, False), + "Black Antoid (2)": EarthBoundEnemy("Black Antoid (2)", 0x15e247, 34, 25, 37, 7, 4, 14, 13, 7, 3, 0, False), # Separate enemy used in the titanic ant fight + "Runaway Dog (2)": EarthBoundEnemy("Runaway Dog", 0x15e303, 21, 0, 4, 3, 26, 4, 5, 73, 0, 1, False), + # "Cave Boy (2)": EarthBoundEnemy("Cave Boy (2)", 0x15e361, 314, 0, 618, 17, 5, 21, 33, 11, False), + "Tiny Li'l Ghost": EarthBoundEnemy("Tiny Li'l Ghost", 0x15e3bf, 90, 0, 1, 162, 100, 19, 7, 18, 25, 24, False), + "Starman Junior": EarthBoundEnemy("Starman Junior", 0x15e41d, 200, 999, 16, 20, 1, 11, 10, 6, 0, 80, False), + "Buzz Buzz": EarthBoundEnemy("Buzz Buzz", 0x15e47b, 2000, 999, 0, 0, 100, 40, 92, 20, 1, 80, False), + "Heavily Armed Pokey": EarthBoundEnemy("Heavily Armed Pokey", 0x15e4d9, 2000, 999, 70000, 0, 60, 145, 255, 80, 5, 255, False), + # "Heavily Armed Pokey": EarthBoundEnemy("Heavily Armed Pokey", 0x15e537, 1746, 999, 0, 0, 51, 150, 274, 72, False), Cutscene? + "Giygas (2)": EarthBoundEnemy("Giygas (2)", 0x15e595, 9999, 999, 70000, 0, 80, 255, 255, 80, 5, 255, False), + "Giygas (3)": EarthBoundEnemy("Giygas (3)", 0x15e5f3, 9999, 0, 0, 0, 80, 255, 255, 80, 5, 255, False), + "Giygas": EarthBoundEnemy("Giygas", 0x15e651, 2000, 0, 0, 0, 80, 255, 255, 80, 5, 255, False), + "Giygas (5)": EarthBoundEnemy("Giygas (5)", 0x15e6af, 9999, 0, 0, 0, 80, 255, 255, 80, 5, 255, False), + "Farm Zombie": EarthBoundEnemy("Farm Zombie", 0x15e70d, 171, 0, 700, 58, 10, 31, 24, 19, 15, 24, False), + "Criminal Caterpillar": EarthBoundEnemy("Criminal Caterpillar", 0x15e76b, 250, 168, 30384, 0, 134, 37, 16, 23, 0, 0, False), + "Evil Eye": EarthBoundEnemy("Evil Eye", 0x15e7c9, 720, 400, 46376, 896, 38, 141, 162, 63, 25, 16, False), + "Mini Barf": EarthBoundEnemy("Mini Barf", 0x15e885, 616, 0, 7521, 460, 10, 45, 71, 26, 19, 30, False), + "Master Criminal Worm": EarthBoundEnemy("Master Criminal Worm", 0x15e8e3, 377, 300, 82570, 0, 136, 73, 40, 37, 0, 0, False), + "Captain Strong": EarthBoundEnemy("Captain Strong", 0x15e941, 140, 0, 492, 159, 15, 20, 24, 13, 8, 18, False), + "Giygas (6)": EarthBoundEnemy("Giygas (6)", 0x15e99f, 9999, 0, 0, 0, 80, 255, 127, 80, 5, 255, False), + "Clumsy Robot (3)": EarthBoundEnemy("Clumsy Robot (3)", 0x15e9fd, 962, 0, 32378, 2081, 83, 88, 137, 46, 30, 49, False) + } + + shuffled_enemies = {} + for enemy in world.acting_enemy_list: + shuffled_enemies[enemy] = world.enemies[world.acting_enemy_list[enemy]] + + flunkies = { + "Titanic Ant": shuffled_enemies["Black Antoid (2)"], + "Master Belch": shuffled_enemies["Slimy Little Pile"], + "Trillionage Sprout": shuffled_enemies["Tough Mobile Sprout"], + "Master Barf": shuffled_enemies["Even Slimier Little Pile"], + "Starman Deluxe": [shuffled_enemies["Starman"], shuffled_enemies["Starman Super"]], + "Carbon Dog": world.enemies[world.boss_list[27]], # This should be the enemy that gets shuffled WITH carbon dog, right? Fix??? + "Skate Punk": [shuffled_enemies["Pogo Punk"], shuffled_enemies["Yes Man Junior"]], + "Loaded Dice": [shuffled_enemies["Care Free Bomb"], shuffled_enemies["Beautiful UFO"], shuffled_enemies["High-class UFO"]], + "Loaded Dice 2": [shuffled_enemies["Electro Swoosh"], shuffled_enemies["Fobby"], shuffled_enemies["Uncontrollable Sphere"]], + "Starman Super": [shuffled_enemies["Starman"]] + } + + world.regional_enemies = {"Northern Onett": {shuffled_enemies["Spiteful Crow"], shuffled_enemies["Runaway Dog"], shuffled_enemies["Coil Snake"]}, + "Onett": {shuffled_enemies["Pogo Punk"], shuffled_enemies["Skate Punk"], shuffled_enemies["Yes Man Junior"], world.enemies[world.boss_list[0]], world.enemies[world.boss_list[1]]}, + "Arcade": {shuffled_enemies["Pogo Punk"], shuffled_enemies["Skate Punk"], shuffled_enemies["Yes Man Junior"]}, + "Giant Step": {shuffled_enemies["Attack Slug"], shuffled_enemies["Black Antoid"], shuffled_enemies["Rowdy Mouse"], world.enemies[world.boss_list[2]]}, + "Twoson": {shuffled_enemies["Black Antoid"], shuffled_enemies["Cop"], world.enemies[world.boss_list[3]], shuffled_enemies["Ramblin' Evil Mushroom"], + shuffled_enemies["Annoying Old Party Man"], shuffled_enemies["Cranky Lady"], shuffled_enemies["Mobile Sprout"], shuffled_enemies["New Age Retro Hippie"], shuffled_enemies["Unassuming Local Guy"], + shuffled_enemies["Runaway Dog"]}, + "Everdred's House": {world.enemies[world.boss_list[4]]}, + "Peaceful Rest Valley": {shuffled_enemies["Li'l UFO"], shuffled_enemies["Mobile Sprout"], shuffled_enemies["Spinning Robo"], shuffled_enemies["Territorial Oak"]}, + "Happy-Happy Village": {shuffled_enemies["Coil Snake"], shuffled_enemies["Insane Cultist"], shuffled_enemies["Spiteful Crow"], shuffled_enemies["Unassuming Local Guy"]}, + "Happy-Happy HQ": {shuffled_enemies["Insane Cultist"], world.enemies[world.boss_list[5]]}, + "Lilliput Steps": {shuffled_enemies["Mighty Bear"], shuffled_enemies["Mole Playing Rough"], shuffled_enemies["Mr. Batty"], world.enemies[world.boss_list[6]]}, + "Threed": {shuffled_enemies["Coil Snake"], shuffled_enemies["Handsome Tom"], shuffled_enemies["Smilin' Sam"], shuffled_enemies["Trick or Trick Kid"], + shuffled_enemies["Zombie Dog"], shuffled_enemies["Putrid Moldyman"], shuffled_enemies["Smelly Ghost"]}, + "Threed Underground": {shuffled_enemies["No Good Fly"], shuffled_enemies["Urban Zombie"], shuffled_enemies["Zombie Possessor"], world.enemies[world.boss_list[8]], shuffled_enemies["Zombie Dog"]}, + "Grapefruit Falls": {shuffled_enemies["Armored Frog"], shuffled_enemies["Black Antoid"], shuffled_enemies["Coil Snake"], shuffled_enemies["Farm Zombie"], + shuffled_enemies["Plain Crocodile"], shuffled_enemies["Red Antoid"], shuffled_enemies["Violent Roach"], shuffled_enemies["Mad Duck"], shuffled_enemies["Black Antoid (2)"]}, + "Belch's Factory": {shuffled_enemies["Farm Zombie"], shuffled_enemies["Foppy"], shuffled_enemies["Mostly Bad Fly"], shuffled_enemies["Slimy Little Pile"], world.enemies[world.boss_list[9]]}, + "Milky Well": {shuffled_enemies["Mad Duck"], shuffled_enemies["Ranboob"], shuffled_enemies["Struttin' Evil Mushroom"], shuffled_enemies["Tough Mobile Sprout"], world.enemies[world.boss_list[10]]}, + "Dusty Dunes Desert": {shuffled_enemies["Bad Buffalo"], shuffled_enemies["Crested Booka"], shuffled_enemies["Criminal Caterpillar"], shuffled_enemies["Cute Li'l UFO"], shuffled_enemies["Desert Wolf"], shuffled_enemies["Mole Playing Rough"], + shuffled_enemies["Skelpion"], shuffled_enemies["Smilin' Sphere"]}, + "Fourside": {shuffled_enemies["Annoying Reveler"], shuffled_enemies["Crazed Sign"], shuffled_enemies["Extra Cranky Lady"], shuffled_enemies["Mad Taxi"]}, + "Moonside": {shuffled_enemies["Abstract Art"], shuffled_enemies["Dali's Clock"], shuffled_enemies["Enraged Fire Plug"], shuffled_enemies["Robo-pump"], world.enemies[world.boss_list[13]]}, + "Gold Mine": {shuffled_enemies["Gigantic Ant"], shuffled_enemies["Mad Duck"], shuffled_enemies["Noose Man"], shuffled_enemies["Thirsty Coil Snake"], world.enemies[world.boss_list[11]]}, + "Fourside Dept. Store": {shuffled_enemies["Musica"], shuffled_enemies["Mystical Record"], shuffled_enemies["Scalding Coffee Cup"], world.enemies[world.boss_list[12]]}, + "Monkey Caves": {shuffled_enemies["Struttin' Evil Mushroom"], shuffled_enemies["Tough Mobile Sprout"]}, + "Monotoli Building": {shuffled_enemies["Sentry Robot"], world.enemies[world.boss_list[14]]}, + "Rainy Circle": {shuffled_enemies["Arachnid!"], shuffled_enemies["Elder Batty"], shuffled_enemies["Strong Crocodile"], world.enemies[world.boss_list[15]]}, + "Andonuts Lab Area": {shuffled_enemies["Cave Boy"], shuffled_enemies["Mighty Bear Seven"]}, + "Summers": {shuffled_enemies["Crazed Sign"], shuffled_enemies["Mad Taxi"], shuffled_enemies["Mole Playing Rough"], shuffled_enemies["Over Zealous Cop"], shuffled_enemies["Tough Guy"], world.enemies[world.boss_list[18]]}, + "Summers Museum": {shuffled_enemies["Shattered Man"]}, + "Magnet Hill": {shuffled_enemies["Deadly Mouse"], shuffled_enemies["Filthy Attack Roach"], shuffled_enemies["Stinky Ghost"], world.enemies[world.boss_list[16]]}, + "Pink Cloud": {shuffled_enemies["Conducting Menace"], shuffled_enemies["Kiss of Death"], shuffled_enemies["Tangoo"], shuffled_enemies["Thunder Mite"], world.enemies[world.boss_list[17]]}, + "Scaraba": {shuffled_enemies["Beautiful UFO"], shuffled_enemies["Dread Skelpion"], shuffled_enemies["Great Crested Booka"], shuffled_enemies["High-class UFO"], shuffled_enemies["Master Criminal Worm"]}, + "Pyramid": {shuffled_enemies["Arachnid!!!"], shuffled_enemies["Fierce Shattered Man"], shuffled_enemies["Guardian Hieroglyph"], shuffled_enemies["Lethal Asp Hieroglyph"], shuffled_enemies["Petrified Royal Guard"], + world.enemies[world.boss_list[19]]}, + "Southern Scaraba": {shuffled_enemies["Beautiful UFO"], shuffled_enemies["High-class UFO"], shuffled_enemies["Marauder Octobot"]}, + "Dungeon Man": {shuffled_enemies["Dali's Clock"], shuffled_enemies["Mystical Record"], shuffled_enemies["Lesser Mook"], shuffled_enemies["Mystical Record"], shuffled_enemies["Scalding Coffee Cup"], shuffled_enemies["Worthless Protoplasm"], shuffled_enemies["Cute Li'l UFO"]}, + "Deep Darkness": {shuffled_enemies["Mole Playing Rough"]}, + "Winters": {shuffled_enemies["Lesser Mook"], shuffled_enemies["Whirling Robo"], shuffled_enemies["Wooly Shambler"]}, + "Deep Darkness Darkness": {shuffled_enemies["Big Pile of Puke"], shuffled_enemies["Demonic Petunia"], shuffled_enemies["Even Slimier Little Pile"], shuffled_enemies["Hard Crocodile"], shuffled_enemies["Hostile Elder Oak"], + shuffled_enemies["Manly Fish"], shuffled_enemies["Manly Fish's Brother"], shuffled_enemies["Pit Bull Slug"], shuffled_enemies["Zap Eel"], world.enemies[world.boss_list[20]]}, + "Boogey Tent": {world.enemies[world.boss_list[7]]}, + "Southern Winters": {shuffled_enemies["Lesser Mook"], shuffled_enemies["Whirling Robo"], shuffled_enemies["Wooly Shambler"]}, + "Brickroad Maze": {shuffled_enemies["Rowdy Mouse"], shuffled_enemies["Worthless Protoplasm"], shuffled_enemies["Mad Duck"]}, + "Stonehenge Base": {shuffled_enemies["Atomic Power Robot"], shuffled_enemies["Military Octobot"], shuffled_enemies["Mook Senior"], shuffled_enemies["Starman"], shuffled_enemies["Starman Super"], world.enemies[world.boss_list[21]]}, + "Lumine Hall": {shuffled_enemies["Conducting Spirit"], shuffled_enemies["Fobby"], shuffled_enemies["Hyper Spinning Robo"], shuffled_enemies["Uncontrollable Sphere"], world.enemies[world.boss_list[22]]}, + "Lost Underworld": {shuffled_enemies["Chomposaur"], shuffled_enemies["Ego Orb"], shuffled_enemies["Wetnosaur"]}, + "Fire Spring": {shuffled_enemies["Evil Elemental"], shuffled_enemies["Major Psychic Psycho"], shuffled_enemies["Psychic Psycho"], shuffled_enemies["Soul Consuming Flame"], world.enemies[world.boss_list[23]]}, + "Magicant": {shuffled_enemies["Care Free Bomb"], shuffled_enemies["Electro Swoosh"], shuffled_enemies["French Kiss of Death"], shuffled_enemies["Loaded Dice"], shuffled_enemies["Mr. Molecule"], shuffled_enemies["Loaded Dice 2"]}, + "Sea of Eden": {world.enemies[world.boss_list[18]], world.enemies[world.boss_list[24]]}, + "Cave of the Past": {shuffled_enemies["Bionic Kraken"], shuffled_enemies["Final Starman"], shuffled_enemies["Ghost of Starman"], shuffled_enemies["Nuclear Reactor Robot"], shuffled_enemies["Squatter Demon"], + shuffled_enemies["Ultimate Octobot"], shuffled_enemies["Wild 'n Wooly Shambler"]}, + "Endgame": {world.enemies[world.boss_list[25]], world.enemies["Giygas (2)"], world.enemies[world.boss_list[28]], world.enemies["Giygas (3)"], world.enemies["Giygas (5)"], world.enemies["Giygas (6)"]}, + + } + + if world.options.randomize_enemy_attacks: + del flunkies["Loaded Dice 2"] + del flunkies["Skate Punk"] + del flunkies["Loaded Dice"] + del flunkies["Starman Super"] + + for region in world.regional_enemies: + enemy_list = world.regional_enemies[region] + updated_list = set(enemy_list) + for enemy in enemy_list: + if enemy.name == "Carbon Dog": + updated_list.add(world.enemies[world.boss_list[27]]) + for i in range(1, world.enemies[world.boss_list[27]].attack_extensions): + updated_list.add(world.enemies[f"{world.enemies[world.boss_list[27]].name} ({i + 1})"]) + # todo; option to not have in Giygas/Mine + + if enemy.name in flunkies: + # Can I just always update instead of doing an add? Would probably need to make singulars a list of one item... + if enemy.name in ["Starman Deluxe", "Skate Punk", "Loaded Dice", "Loaded Dice 2", "Starman Super"]: + updated_list.update(flunkies[enemy.name]) + else: + updated_list.add(flunkies[enemy.name]) + + if enemy.attack_extensions > 1: + for i in range(1, enemy.attack_extensions): + updated_list.add(world.enemies[f"{enemy.name} ({i + 1})"]) + world.regional_enemies[region] = updated_list + + +combat_regions = [ + "Northern Onett", + "Onett", + "Arcade", + "Giant Step", + "Twoson", + "Happy-Happy Village", + "Happy-Happy HQ" + "Lilliput Steps", + "Winters", + "Threed", + "Milky Well", + "Dusty Dunes Desert", + "Fourside", + "Moonside", + "Gold Mine", + "Monkey Caves", + "Monotoli Building", + "Rainy Circle", + "Summers", + "Magnet Hill", + "Pink Cloud", + "Scaraba", + "Pyramid", + "Southern Scaraba", + "Dungeon Man", + "Deep Darkness", + "Deep Darkness Darkness", + "Stonehenge Base", + "Lumine Hall", + "Lost Underworld", + "Fire Spring", + "Magicant", + "Cave of the Past", + "Endgame", + "Grapefruit Falls", + "Peaceful Rest Valley", + "Everdred's House", + "Belch's Factory", + "Southern Winters", + "Brickroad Maze" + "Summers Museum", + "Fourside Dept. Store", + "Threed Underground", + "Boogey Tent" +] + + +levels = [ + 1, # north onett + 2, # south onett + 3, # giant step + 5, # twoson + 7, # everdred + 9, # peaceful rest + 10, # happy happy + 12, # lilliput steps + 13, # threed + 14, # threed caverns + 15, # grapefruit falls + 17, # belch base + 18, # milky well + 19, # duty dunes + 21, # fourside + 23, # gold mine + 24, # dept store + 25, # monkey cabves + 26, # monotoli building + 28, # winters + 29, # southern winters + 31, # rainy circle + 32, # summers + 33, # museum + 35, # Moonside + 36, # magnet hill + 38, # pink cloud + 39, # scaraba + 42, # pyramid + 43, # scaraba south + 45, # dungeon man + 47, # deep darkness + 49, # deep darkness swamp + 51, # Happy-Happy HQ + 52, # stonehenge + 54, # Arcade + 56, # lumine hall + 59, # lost underworld + 61, # fire spring + 63, # magicant + 65, # cave of the past + 68, # Sea of Eden + 70, + 73, + 74, + 75] # gigyas + +spell_breaks: dict[str, dict[int, str]] = { + "freeze": {8: "zeta", 12: "epsilon", 20: "delta", 25: "lambda", 40: "alpha", 65: "beta", 70: "gamma", 100: "omega"}, + "fire": {5: "zeta", 10: "epsilon", 20: "alpha", 50: "beta", 70: "gamma", 100: "omega"}, # zeta needs to do less damage + "lifeup": {20: "alpha", 100: "beta"}, + "thunder": {5: "zeta", 10: "epsilon", 15: "delta", 20: "lambda", 35: "alpha", 45: "beta", 60: "gamma", 100: "omega"}, + "flash": {25: "alpha", 60: "beta", 70: "gamma", 100: "omega"}, + "special": {5: "zeta", 10: "epsilon", 30: "alpha", 65: "beta", 80: "gamma", 100: "omega"}, + "healing": {20: "alpha", 40: "beta", 60: "gamma", 100: "omega"}, + "starstorm": {5: "zeta", 12: "epsilon", 20: "delta", 45: "lambda", 70: "alpha", 100: "beta"}, + "diamond_eyes": {35: "alpha", 40: "beta", 100: "gamma"}, + "nauseous_breath": {25: "alpha", 100: "beta"}, + "poison_stinger": {25: "alpha", 100: "beta"}, + "kiss_of_death": {25: "alpha", 100: "beta"}, + "summon_storm": {25: "alpha", 45: "beta", 60: "gamma", 100: "omega"}, + "scalding_espresso": {5: "zeta", 10: "epsilon", 20: "alpha", 30: "beta", 40: "gamma", 100: "omega"}, + "extinguishing_blast": {5: "zeta", 10: "epsilon", 20: "alpha", 30: "beta", 40: "gamma", 100: "omega"}, + "spray_fire": {5: "zeta", 10: "epsilon", 20: "alpha", 30: "beta", 40: "gamma", 100: "omega"}, + "breathe_fire": {5: "zeta", 10: "epsilon", 20: "alpha", 30: "beta", 40: "gamma", 100: "omega"}, + "poisonous_fangs": {25: "alpha", 100: "beta"}, + "flaming_fireball": {5: "zeta", 10: "epsilon", 20: "alpha", 30: "beta", 40: "gamma", 100: "omega"}, + "glorious_light": {25: "alpha", 45: "beta", 60: "gamma", 100: "omega"}, + "poison_flute": {25: "alpha", 100: "beta"}, + "diamond_bite": {35: "alpha", 40: "beta", 100: "gamma"}, + "scatter_spores": {25: "alpha", 100: "beta"}, + "hacking_cough": {25: "alpha", 100: "beta"}, + "stuffiness_beam": {25: "alpha", 100: "beta"}, + "crashing_boom_bang": {5: "zeta", 10: "epsilon", 15: "delta", 20: "lambda", 35: "alpha", 45: "beta", 60: "gamma", 100: "omega"}, + "paralysis": {30: "lambda", 60: "alpha", 100: "omega"}, + "electrical_shock": {5: "zeta", 10: "epsilon", 15: "delta", 20: "lambda", 35: "alpha", 45: "beta", 60: "gamma", 100: "omega"}, + "giygas_phase2_thunder": {5: "zeta", 10: "epsilon", 15: "delta", 20: "lambda", 35: "alpha", 100: "beta"}, + "giygas_phase3_thunder": {5: "zeta", 10: "epsilon", 15: "delta", 20: "lambda", 35: "alpha", 100: "beta"}, + "giygas_phase4_thunder": {5: "zeta", 10: "epsilon", 15: "delta", 20: "lambda", 35: "alpha", 100: "beta"}, + "giygas_phase2_freeze": {8: "zeta", 12: "epsilon", 20: "delta", 25: "lambda", 100: "alpha"}, + "giygas_phase3_freeze": {8: "zeta", 12: "epsilon", 20: "delta", 25: "lambda", 100: "alpha"}, + "giygas_phase4_freeze": {8: "zeta", 12: "epsilon", 20: "delta", 25: "lambda", 100: "alpha"}, + "giygas_phase2_flash": {25: "alpha", 60: "beta", 100: "gamma"}, + "giygas_phase3_flash": {25: "alpha", 60: "beta", 100: "gamma"}, + "giygas_phase4_flash": {25: "alpha", 60: "beta", 100: "gamma"}, + "thunder_minus": {10: "zeta", 15: "epsilon", 20: "delta", 35: "lambda", 45: "alpha", 60: "beta", 100: "gamma", 200: "omega"}, + "starstorm_minus": {12: "zeta", 20: "epsilon", 45: "delta", 70: "lambda", 100: "alpha", 200: "beta"}, + "flash_minus": {60: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "blast": {10: "zeta", 20: "epsilon", 30: "alpha", 40: "beta", 50: "gamma", 100: "omega"}, + "missile": {5: "zeta", 12: "epsilon", 20: "alpha", 50: "beta", 73: "gamma", 100: "omega"}, + "throw_bomb": {10: "zeta", 20: "epsilon", 30: "alpha", 40: "beta", 50: "gamma", 100: "omega"}, + "throw_bomb_minus": {20: "zeta", 30: "epsilon", 40: "alpha", 50: "beta", 100: "gamma", 200: "omega"}, + "shoot_rocket": {5: "zeta", 12: "epsilon", 20: "alpha", 50: "beta", 73: "gamma", 100: "omega"}, + "paralyzing_pollen": {30: "lambda", 60: "alpha", 100: "omega"}, + + "electrical_shock_minus": {10: "zeta", 15: "epsilon", 20: "delta", 35: "lambda", 45: "alpha", 60: "beta", 100: "gamma", 200: "omega"}, + "crashing_boom_bang_minus": {10: "zeta", 15: "epsilon", 20: "delta", 35: "lambda", 45: "alpha", 60: "beta", 100: "gamma", 200: "omega"}, + "giygas_phase2_thunder_minus": {10: "zeta", 15: "epsilon", 20: "delta", 35: "lambda", 100: "alpha", 200: "beta"}, + "giygas_phase3_thunder_minus": {10: "zeta", 15: "epsilon", 20: "delta", 35: "lambda", 100: "alpha", 200: "beta"}, + "giygas_phase4_thunder_minus": {10: "zeta", 15: "epsilon", 20: "delta", 35: "lambda", 100: "alpha", 200: "beta"}, + "thunder_minus_minus": {15: "zeta", 20: "epsilon", 35: "delta", 45: "lambda", 60: "alpha", 100: "beta", 200: "gamma", 300: "omega"}, + + "starstorm_minus_minus": {20: "zeta", 45: "epsilon", 70: "delta", 100: "lambda", 200: "alpha", 300: "beta"}, + + "giygas_phase2_flash_minus": {60: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "giygas_phase3_flash_minus": {60: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "giygas_phase4_flash_minus": {60: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "summon_storm_minus": {60: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "glorious_light_minus": {60: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "flash_minus_minus": {70: "alpha", 100: "beta", 200: "gamma", 300: "omega"}, + + "fire_minus": {10: "zeta", 20: "epsilon", 50: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "spray_fire_minus": {10: "zeta", 20: "epsilon", 50: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "breathe_fire_minus": {10: "zeta", 20: "epsilon", 50: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "scalding_espresso_minus": {10: "zeta", 20: "epsilon", 50: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "flaming_fireball_minus": {10: "zeta", 20: "epsilon", 50: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "extinguishing_blast_minus": {10: "zeta", 20: "epsilon", 50: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + + "throw_bomb_minus_minus": {30: "zeta", 40: "epsilon", 50: "alpha", 100: "beta", 200: "gamma", 300: "omega"}, + + "shoot_rocket_minus": {12: "zeta", 20: "epsilon", 50: "alpha", 73: "beta", 100: "gamma", 200: "omega"}, + + "freeze_minus": {12: "zeta", 20: "epsilon", 25: "delta", 40: "lambda", 65: "alpha", 70: "beta", 100: "gamma", 200: "omega"}, + "giygas_phase2_freeze_minus": {12: "zeta", 20: "epsilon", 25: "delta", 100: "lambda", 200: "alpha"}, + "giygas_phase3_freeze_minus": {12: "zeta", 20: "epsilon", 25: "delta", 100: "lambda", 200: "alpha"}, + "giygas_phase4_freeze_minus": {12: "zeta", 20: "epsilon", 25: "delta", 100: "lambda", 200: "alpha"}, + + "special_minus": {10: "zeta", 30: "epsilon", 65: "alpha", 80: "beta", 100: "gamma", 200: "omega"}, + "blast_minus": {20: "zeta", 30: "epsilon", 40: "alpha", 50: "beta", 100: "gamma", 200: "omega"}, + +} + + +def get_psi_levels(level: int, breaks: dict[str, dict[int, str]]): + for top_level, psi_val in breaks.items(): + if level <= top_level: + return psi_val + return breaks[max(breaks)] + + +spell_elements = { + "thunder": "thunder", + "giygas_phase2_thunder": "thunder", + "giygas_phase3_thunder": "thunder", + "giygas_phase4_thunder": "thunder", + "crashing_boom_bang": "thunder", + "electrical_shock": "thunder", + "thunder_minus": "thunder", + + "freeze": "freeze", + "giygas_phase2_freeze": "freeze", + "giygas_phase3_freeze": "freeze", + "giygas_phase4_freeze": "freeze", + + "fire": "fire", + "scalding_espresson": "fire", + "extinguishing_blast": "fire", + "spray_fire": "fire", + "breathe_fire": "fire", + "flaming_fireball": "fire", + + "flash": "flash", + "summon_storm": "flash", + "glorious_light": "flash", + "giygas_phase2_flash": "flash", + "giygas_phase3_flash": "flash", + "giygas_phase4_flash": "flash", + "flash_minus": "flash", + + "starstorm": "starstorm", + "starstorm_minus": "starstorm", + + "special": "special", + + "blast": "explosive", + "throw_bomb": "explosive", + "throw_bomb_minus": "explosive" +} + +spell_data = { + "freeze": { + "zeta": [0x62, 0x01, 0x37], + "epsilon": [0x63, 0x01, 0x38], + "delta": [0x64, 0x01, 0x39], + "lambda": [0x65, 0x01, 0x3A], + "alpha": [0x12, 0x00, 0x09], + "beta": [0x13, 0x00, 0x0A], + "gamma": [0x14, 0x00, 0x0B], + "omega": [0x15, 0x00, 0x0C] + }, + "fire": { + "zeta": [0x60, 0x01, 0x35], + "epsilon": [0x61, 0x01, 0x36], + "alpha": [0x0E, 0x00, 0x05], + "beta": [0x0F, 0x00, 0x06], + "gamma": [0x10, 0x00, 0x07], + "omega": [0x11, 0x00, 0x08] + }, + "lifeup": { + "alpha": [0x20, 0x00, 0x17], + "beta": [0x21, 0x00, 0x18] + }, + "flash": { + "alpha": [0x1A, 0x00, 0x11], + "beta": [0x1B, 0x00, 0x12], + "gamma": [0x1C, 0x00, 0x13], + "omega": [0x1D, 0x00, 0x14] + }, + "thunder": { + "zeta": [0x69, 0x01, 0x3E], + "epsilon": [0x6A, 0x01, 0x3F], + "delta": [0x6B, 0x01, 0x40], + "lambda": [0x6C, 0x01, 0x41], + "alpha": [0x16, 0x00, 0x0D], + "beta": [0x17, 0x00, 0x0E], + "gamma": [0x18, 0x00, 0x0F], + "omega": [0x19, 0x00, 0x10] + }, + "special": { + "zeta": [0x66, 0x01, 0x3B], + "epsilon": [0x67, 0x01, 0x3C], + "alpha": [0x0A, 0x00, 0x01], + "beta": [0x0B, 0x00, 0x02], + "gamma": [0x0C, 0x00, 0x03], + "omega": [0x0D, 0x00, 0x04] + }, + "healing": { + "alpha": [0x24, 0x00, 0x1B], + "beta": [0x25, 0x00, 0x1C], + "gamma": [0x26, 0x00, 0x1D], + "omega": [0x27, 0x00, 0x1E] + }, + "starstorm": { + "zeta": [0x6D, 0x01, 0x42], + "epsilon": [0x6E, 0x01, 0x43], + "delta": [0x6F, 0x01, 0x44], + "lambda": [0x70, 0x01, 0x45], + "alpha": [0x1E, 0x00, 0x15], + "beta": [0x1F, 0x00, 0x16] + }, + "scatter_spores": { + "alpha": [0x3F, 0x01, 0x00], + "beta": [0xED, 0x00, 0x00], + }, + "nauseous_breath": { + "alpha": [0x4A, 0x00, 0x00], + "beta": [0x47, 0x00, 0x00] + }, + "diamond_eyes": { + "alpha": [0x40, 0x01, 0x00], + "beta": [0x41, 0x01, 0x00], + "gamma": [0x44, 0x00, 0x00] + }, + "glorious_light": { + "alpha": [0x42, 0x01, 0x00], + "beta": [0x43, 0x01, 0x00], + "gamma": [0xC9, 0x00, 0x00], + "omega": [0x44, 0x01, 0x00], + }, + "flaming_fireball": { + "zeta": [0x73, 0x01, 0x00], + "epsilon": [0x74, 0x01, 0x00], + "alpha": [0x47, 0x01, 0x00], + "beta": [0x46, 0x01, 0x00], + "gamma": [0x45, 0x01, 0x00], + "omega": [0x68, 0x00, 0x00], + }, + "breathe_fire": { + "zeta": [0x71, 0x01, 0x00], + "epsilon": [0x72, 0x01, 0x00], + "alpha": [0x48, 0x01, 0x00], + "beta": [0x49, 0x01, 0x00], + "gamma": [0x5E, 0x00, 0x00], + "omega": [0x4A, 0x01, 0x00], + }, + "spray_fire": { + "zeta": [0x75, 0x01, 0x00], + "epsilon": [0x76, 0x01, 0x00], + "alpha": [0x4B, 0x01, 0x00], + "beta": [0x4C, 0x01, 0x00], + "gamma": [0x4D, 0x01, 0x00], + "omega": [0x5D, 0x00, 0x00], + }, + "paralysis": { + "lambda": [0x68, 0x01, 0x3D], + "alpha": [0x38, 0x00, 0x2F], + "omega": [0x39, 0x00, 0x30] + }, + "poisonous_fangs": { + "alpha": [0x4E, 0x01, 0x00], + "beta": [0x64, 0x00, 0x00] + }, + "poison_stinger": { + "alpha": [0x4F, 0x01, 0x00], + "beta": [0x48, 0x00, 0x00] + }, + "crashing_boom_bang": { + "zeta": [0x7D, 0x01, 0x00], + "epsilon": [0x7E, 0x01, 0x00], + "delta": [0x7F, 0x01, 0x00], + "lambda": [0x80, 0x01, 0x00], + "alpha": [0x50, 0x01, 0x00], + "beta": [0x5C, 0x00, 0x00], + "gamma": [0x51, 0x01, 0x00], + "omega": [0x52, 0x01, 0x00] + }, + + "electrical_shock": { + "zeta": [0x79, 0x01, 0x00], + "epsilon": [0x7A, 0x01, 0x00], + "delta": [0x7C, 0x01, 0x00], + "lambda": [0x7B, 0x01, 0x00], + "alpha": [0x53, 0x01, 0x00], + "beta": [0xCA, 0x00, 0x00], + "gamma": [0x54, 0x01, 0x00], + "omega": [0x55, 0x01, 0x00] + }, + + "scalding_espresso": { + "zeta": [0x77, 0x01, 0x00], + "epsilon": [0x78, 0x01, 0x00], + "alpha": [0x59, 0x00, 0x00], + "beta": [0x56, 0x01, 0x00], + "gamma": [0x57, 0x01, 0x00], + "omega": [0x58, 0x01, 0x00] + }, + "extinguishing_blast": { + "zeta": [0x81, 0x01, 0x00], + "epsilon": [0x82, 0x01, 0x00], + "alpha": [0x59, 0x01, 0x00], + "beta": [0x5A, 0x01, 0x00], + "gamma": [0x5B, 0x00, 0x00], + "omega": [0x5B, 0x01, 0x00] + }, + + "diamond_bite": { + "alpha": [0x5C, 0x01, 0x00], + "beta": [0x5D, 0x01, 0x00], + "gamma": [0xE4, 0x00, 0x00] + }, + "poison_flute": { + "alpha": [0x5E, 0x01, 0x00], + "beta": [0xCD, 0x00, 0x00] + }, + "kiss_of_death": { + "alpha": [0x5F, 0x01, 0x00], + "beta": [0x49, 0x00, 0x00] + }, + "stuffiness_beam": { + "alpha": [0xF1, 0x00, 0x00], + "beta": [0x45, 0x00, 0x00] + }, + "hacking_cough": { + "alpha": [0xD5, 0x00, 0x00], + "beta": [0x57, 0x00, 0x00] + }, + "giygas_phase2_thunder": { + "zeta": [0x87, 0x01, 0x00], + "epsilon": [0x86, 0x01, 0x00], + "delta": [0x85, 0x01, 0x00], + "lambda": [0x84, 0x01, 0x00], + "alpha": [0x83, 0x01, 0x00], + "beta": [0x12, 0x01, 0x00] + }, + + "giygas_phase3_thunder": { + "zeta": [0x8C, 0x01, 0x00], + "epsilon": [0x8B, 0x01, 0x00], + "delta": [0x8A, 0x01, 0x00], + "lambda": [0x89, 0x01, 0x00], + "alpha": [0x88, 0x01, 0x00], + "beta": [0x2E, 0x01, 0x00] + }, + + "giygas_phase4_thunder": { + "zeta": [0x91, 0x01, 0x00], + "epsilon": [0x90, 0x01, 0x00], + "delta": [0x8F, 0x01, 0x00], + "lambda": [0x8E, 0x01, 0x00], + "alpha": [0x8D, 0x01, 0x00], + "beta": [0x31, 0x01, 0x00] + }, + + + "giygas_phase2_freeze": { + "zeta": [0x92, 0x01, 0x00], + "epsilon": [0x93, 0x01, 0x00], + "delta": [0x94, 0x01, 0x00], + "lambda": [0x95, 0x01, 0x00], + "alpha": [0x2C, 0x01, 0x00] + }, + + "giygas_phase3_freeze": { + "zeta": [0x96, 0x01, 0x00], + "epsilon": [0x97, 0x01, 0x00], + "delta": [0x98, 0x01, 0x00], + "lambda": [0x99, 0x01, 0x00], + "alpha": [0x2F, 0x01, 0x00] + }, + + "giygas_phase4_freeze": { + "zeta": [0x9A, 0x01, 0x00], + "epsilon": [0x9B, 0x01, 0x00], + "delta": [0x9C, 0x01, 0x00], + "lambda": [0x9D, 0x01, 0x00], + "alpha": [0x32, 0x01, 0x00] + }, + + + "giygas_phase2_flash": { + "alpha": [0x9E, 0x01, 0x00], + "beta": [0x9F, 0x01, 0x00], + "gamma": [0x2D, 0x01, 0x00] + }, + + "giygas_phase3_flash": { + "alpha": [0xA0, 0x01, 0x00], + "beta": [0xA1, 0x01, 0x00], + "gamma": [0x30, 0x01, 0x00] + }, + + "giygas_phase4_flash": { + "alpha": [0xA2, 0x01, 0x00], + "beta": [0xA3, 0x01, 0x00], + "gamma": [0x33, 0x01, 0x00] + }, + + "explosion_damage": { + "alpha": [0xA7, 0x00, 0x00], + "beta": [0xA3, 0x01, 0x00], + "gamma": [0x33, 0x01, 0x00] + }, + "thunder_minus": { + "zeta": [0x69, 0x01, 0x3E], + "epsilon": [0x6A, 0x01, 0x3F], + "delta": [0x6B, 0x01, 0x40], + "lambda": [0x6C, 0x01, 0x41], + "alpha": [0x16, 0x00, 0x0D], + "beta": [0x17, 0x00, 0x0E], + "gamma": [0x18, 0x00, 0x0F], + "omega": [0x19, 0x00, 0x10] + }, + + "flash_minus": { + "alpha": [0x1A, 0x00, 0x11], + "beta": [0x1B, 0x00, 0x12], + "gamma": [0x1C, 0x00, 0x13], + "omega": [0x1D, 0x00, 0x14] + }, + + "starstorm_minus": { + "zeta": [0x6D, 0x01, 0x42], + "epsilon": [0x6E, 0x01, 0x43], + "delta": [0x6F, 0x01, 0x44], + "lambda": [0x70, 0x01, 0x45], + "alpha": [0x1E, 0x00, 0x15], + "beta": [0x1F, 0x00, 0x16] + }, + "blast": { + "zeta": [0xF7, 0x01, 0x58], + "epsilon": [0xF8, 0x01, 0x59], + "alpha": [0xA4, 0x01, 0x46], + "beta": [0xA5, 0x01, 0x47], + "gamma": [0xA6, 0x01, 0x48], + "omega": [0xA7, 0x01, 0x48] + }, + "missile": { + "zeta": [0xF9, 0x01, 0x5A], + "epsilon": [0xFA, 0x01, 0x5B], + "alpha": [0xA8, 0x01, 0x4A], + "beta": [0xA9, 0x01, 0x4B], + "gamma": [0xAA, 0x01, 0x4C], + "omega": [0xAB, 0x01, 0x4D] + }, + "summon_storm": { + "alpha": [0xF4, 0x01, 0x00], + "beta": [0xF5, 0x01, 0x00], + "gamma": [0x58, 0x00, 0x00], + "omega": [0xF6, 0x01, 0x00] + }, + "throw_bomb": { + "zeta": [0xFC, 0x01, 0x00], + "epsilon": [0xFB, 0x01, 0x00], + "alpha": [0xFD, 0x01, 0x00], + "beta": [0xFE, 0x01, 0x00], + "gamma": [0xFF, 0x01, 0x00], + "omega": [0x00, 0x02, 0x00] + }, + + "throw_bomb_minus": { + "zeta": [0xFC, 0x01, 0x00], + "epsilon": [0xFB, 0x01, 0x00], + "alpha": [0xFD, 0x01, 0x00], + "beta": [0xFE, 0x01, 0x00], + "gamma": [0xFF, 0x01, 0x00], + "omega": [0x00, 0x02, 0x00] + }, + "shoot_rocket": { + "zeta": [0x01, 0x02, 0x00], + "epsilon": [0x02, 0x02, 0x00], + "alpha": [0x03, 0x02, 0x00], + "beta": [0x04, 0x02, 0x00], + "gamma": [0x05, 0x02, 0x00], + "omega": [0x06, 0x02, 0x00] + }, + + "paralyzing_pollen": { + "lambda": [0x07, 0x02, 0x00], + "alpha": [0xCB, 0x00, 0x00], + "omega": [0x08, 0x02, 0x00] + }, + + +} + +shield_table = { + "disabled": 0x00, + "phys_1": 0x03, + "phys_2": 0x04, + "psi_1": 0x01, + "psi_2": 0x02 +} + + +def assumed_player_speed_for_level(level: int) -> int: + return 2 + 58 * (level - 1) / 80 + + +def scale_enemy_speed(enemy: EarthBoundEnemy, new_level: int) -> int: + normal_dodge_chance = (2 * enemy.speed - assumed_player_speed_for_level(enemy.level)) / 500 + + enemy_scaled_speed = (normal_dodge_chance * 500 + assumed_player_speed_for_level(new_level)) / 2 + return enemy_scaled_speed + + +def scale_exp_2(base_exp: int, base_level: int, new_level: int, world: "EarthBoundWorld") -> int: + base_scaled_exp = calculate_exp(base_level) + scaled_exp = calculate_exp(new_level) + new_exp = base_exp * scaled_exp / base_scaled_exp + new_exp = max(new_exp, scaled_exp) # maybe remove? if early scaled + new_exp = math.ceil(new_exp * world.options.experience_modifier / 100) + return new_exp + + +def calculate_exp(level: int) -> float: + if level > 30: + return 1000 * math.exp(0.05 * level) + else: + return 50 * math.exp(0.15 * level) + # return 10 * math.exp(0.2 * level) if not boosted + + +def scale_shield(level: int, shield: str | None) -> str: + if shield is not None: + if level < 10: + enemy_shield = "disabled" + elif shield in ["phys_1", "phys_2"]: + if level < 25: + enemy_shield = "phys_1" + else: + enemy_shield = "phys_2" + elif shield in ["psi_1", "psi_2"]: + if level < 25: + enemy_shield = "psi_1" + else: + enemy_shield = "psi_2" + else: + warning(f"Could not scale shield, found initial value of {shield}, this is probably a typo") + enemy_shield = "disabled" + return enemy_shield + + +guardian_text = [ + 0xEEFAA0, + 0xEEFAA6, + 0xEEFAAD, + 0xEEFAB3, + 0xEEFABA, + 0xEEFAC0, + 0xEEFAC6, + 0xEEFACE +] + +guardian_intro = { + "Giant Step": 0x066699, + "Lilliput Steps": 0x2F97CB, + "Milky Well": 0x2F67C3, + "Rainy Circle": 0x2EFAD6, + "Magnet Hill": 0x083D4D, + "Pink Cloud": 0x09D2E3, + "Lumine Hall": 0x09E2A4, + "Fire Spring": 0x2EFADF +} + + +def scale_enemies(world: "EarthBoundWorld", rom: "LocalRom") -> None: + additional_party_members = 0 + if world.options.auto_scale_party_members: + if world.starting_character != "Ness": + rom.write_bytes(0x15F5FB, bytearray([max(levels[world.scaled_area_order.index(world.Ness_region)] + world.random.randint(-3, 3), 1)])) + + if world.starting_character != "Paula": + rom.write_bytes(0x15F60F, bytearray([max(levels[world.scaled_area_order.index(world.Paula_region)] + world.random.randint(-3, 3), 1)])) # Paula starting level + + if world.starting_character != "Jeff": + rom.write_bytes(0x15F623, bytearray([max(levels[world.scaled_area_order.index(world.Jeff_region)] + world.random.randint(-3, 3), 1)])) # Jeff starting level + + if world.starting_character != "Poo": + rom.write_bytes(0x15F637, bytearray([max(levels[world.scaled_area_order.index(world.Poo_region)] + world.random.randint(-3, 3), 1)])) # Poo starting level + + melody_number = 1 + has_badge = False + c = Counter([world.Ness_region, world.Paula_region, world.Jeff_region, world.Poo_region]) + # for region, level in zip(world.scaled_area_order, levels): + for region in world.scaled_area_order: + level = world.area_levels[region] + if world.options.easy_combat: + level = max(1, int(level / 2)) + if region in ["Giant Step", "Lilliput Steps", "Milky Well", + "Rainy Circle", "Magnet Hill", "Pink Cloud", + "Lumine Hall", "Fire Spring"]: + rom.write_bytes(guardian_intro[region], struct.pack("I", guardian_text[melody_number - 1])) + melody_number += 1 + + if region == world.Badge_region: + has_badge = True + + additional_party_members += c[region] + for enemy in world.regional_enemies[region]: + if enemy.is_scaled is False: + enemy_hp = int(enemy.hp * level / enemy.level) + if not world.options.easy_combat: + enemy_hp = int(enemy_hp + (enemy_hp * (0.10 * (additional_party_members - 1)))) + enemy_pp = int(enemy.pp * level / enemy.level) + enemy_exp = int(scale_exp_2(enemy.exp, enemy.level, level, world)) + enemy_money = min(65535, int((enemy.money * level / enemy.level) * world.options.money_drop_multiplier)) + enemy_speed = max(2, int(scale_enemy_speed(enemy, level))) + enemy_offense = int(enemy.offense * level / enemy.level) + enemy_defense = int(enemy.defense * level / enemy.level) + enemy_level = int(enemy.level * level / enemy.level) + enemy_shield = scale_shield(level, enemy.shield) + rom.write_bytes(enemy.address + 33, enemy_hp.to_bytes(2, "little")) + rom.write_bytes(enemy.address + 35, enemy_pp.to_bytes(2, "little")) + rom.write_bytes(enemy.address + 37, enemy_exp.to_bytes(4, "little")) + rom.write_bytes(enemy.address + 41, enemy_money.to_bytes(2, "little")) + rom.write_bytes(enemy.address + 60, enemy_speed.to_bytes(1, "little")) + rom.write_bytes(enemy.address + 56, enemy_offense.to_bytes(2, "little")) + rom.write_bytes(enemy.address + 58, enemy_defense.to_bytes(2, "little")) + rom.write_bytes(enemy.address + 54, enemy_level.to_bytes(1, "little")) + if enemy.shield is not None: + rom.write_bytes(enemy.address + 89, shield_table[enemy_shield].to_bytes(1, "little")) + + if enemy.name in world.enemy_psi: + for index, spell in [(i, s) for i, s in enumerate(world.enemy_psi[enemy.name]) if s != "null"]: + if spell == "special": + spell = world.offensive_psi_slots[0].lower() + + if spell in spell_elements: + element = spell_elements[spell] + else: + element = "None" + + if element == world.franklin_protection and not has_badge: + spell = f"{spell}_minus" + psi_level = get_psi_levels(level, spell_breaks[spell]) + filtered_spell = spell.replace("_minus", "") + rom.write_bytes(enemy.address + 70 + (index * 2), bytearray(spell_data[filtered_spell][psi_level][0:2])) + rom.write_bytes(enemy.address + 80 + index, bytearray([spell_data[filtered_spell][psi_level][2]])) + if world.options.shuffle_enemy_drops: + rom.write_bytes(enemy.address + 88, bytearray([world.random.choice(world.filler_drops)])) + enemy.is_scaled = True diff --git a/worlds/earthbound/modules/enemy_shuffler.py b/worlds/earthbound/modules/enemy_shuffler.py new file mode 100644 index 0000000000..9751cb225c --- /dev/null +++ b/worlds/earthbound/modules/enemy_shuffler.py @@ -0,0 +1,1372 @@ +import struct +from ..game_data.text_data import text_encoder +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import EarthBoundWorld + from ..Rom import LocalRom + +enemy_ids = { + "Insane Cultist": 0x01, + "Armored Frog": 0x03, + "Bad Buffalo": 0x04, + "Black Antoid": 0x05, + "Red Antoid": 0x06, + "Ramblin' Evil Mushroom": 0x07, + "Struttin' Evil Mushroom": 0x08, + "Mobile Sprout": 0x09, + "Tough Mobile Sprout": 0x0a, + "Enraged Fire Plug": 0x0b, + "Mystical Record": 0x0c, + "Atomic Power Robot": 0x0d, + "Nuclear Reactor Robot": 0x0e, + "Guardian Hieroglyph": 0x0f, + "Lethal Asp Hieroglyph": 0x10, + "Electro Swoosh": 0x11, + "Conducting Menace": 0x12, + "Conducting Spirit": 0x13, + "Evil Elemental": 0x14, + "Annoying Old Party Man": 0x16, + "Annoying Reveler": 0x17, + "Unassuming Local Guy": 0x18, + "New Age Retro Hippie": 0x19, + "Mighty Bear": 0x1c, + "Mighty Bear Seven": 0x1d, + "Putrid Moldyman": 0x1e, + "Thunder Mite": 0x1f, + "Cranky Lady": 0x20, + "Extra Cranky Lady": 0x21, + "Wetnosaur": 0x23, + "Chomposaur": 0x24, + "Gigantic Ant": 0x26, + "Scalding Coffee Cup": 0x2b, + "Loaded Dice": 0x2c, + "Slimy Little Pile": 0x2d, + "Even Slimier Little Pile": 0x2e, + "Arachnid!": 0x2f, + "Arachnid!!!": 0x30, + "Kraken": 0x31, + "Bionic Kraken": 0x32, + "Spinning Robo": 0x33, + "Whirling Robo": 0x34, + "Hyper Spinning Robo": 0x35, + "Cop": 0x36, + "Coil Snake": 0x37, + "Thirsty Coil Snake": 0x38, + "Mr. Batty": 0x39, + "Elder Batty": 0x3a, + "Violent Roach": 0x3b, + "Filthy Attack Roach": 0x3c, + "Crazed Sign": 0x3d, + "Wooly Shambler": 0x3e, + "Wild 'n Wooly Shambler": 0x3f, + "Skate Punk": 0x40, + "Skelpion": 0x41, + "Dread Skelpion": 0x42, + "Starman": 0x43, + "Starman Super": 0x44, + "Ghost of Starman": 0x45, + "Smilin' Sphere": 0x46, + "Uncontrollable Sphere": 0x47, + "Petrified Royal Guard": 0x48, + "Final Starman": 0x4b, + "Urban Zombie": 0x4c, + "Zombie Possessor": 0x4d, + "Zombie Dog": 0x4e, + "Over Zealous Cop": 0x50, + "Territorial Oak": 0x51, + "Hostile Elder Oak": 0x52, + "Marauder Octobot": 0x54, + "Military Octobot": 0x55, + "Mechanical Octobot": 0x56, + "Ultimate Octobot": 0x57, + "Mad Duck": 0x58, + "Dali's Clock": 0x59, + "Musica": 0x5b, + "Desert Wolf": 0x5c, + "Big Pile of Puke": 0x5e, + "Kiss of Death": 0x60, + "French Kiss of Death": 0x61, + "Foppy": 0x62, + "Fobby": 0x63, + "Zap Eel": 0x64, + "Tangoo": 0x65, + "Squatter Demon": 0x67, + "Crested Booka": 0x68, + "Great Crested Booka": 0x69, + "Lesser Mook": 0x6a, + "Mook Senior": 0x6b, + "Smelly Ghost": 0x6c, + "Stinky Ghost": 0x6d, + "Everdred": 0x6e, + "Attack Slug": 0x6f, + "Pit Bull Slug": 0x70, + "Rowdy Mouse": 0x71, + "Deadly Mouse": 0x72, + "Care Free Bomb": 0x73, + "Handsome Tom": 0x75, + "Smilin' Sam": 0x76, + "Manly Fish": 0x77, + "Manly Fish's Brother": 0x78, + "Runaway Dog": 0x79, + "Trick or Trick Kid": 0x7a, + "Abstract Art": 0x7c, + "Shattered Man": 0x7d, + "Fierce Shattered Man": 0x7e, + "Ego Orb": 0x7f, + "Yes Man Junior": 0x81, + "Frank": 0x83, + "Cute Li'l UFO": 0x84, + "Beautiful UFO": 0x85, + "Pogo Punk": 0x86, + "Tough Guy": 0x87, + "Mad Taxi": 0x88, + "Mr. Molecule": 0x8a, + "Worthless Protoplasm": 0x8b, + "Sentry Robot": 0x8c, + "Psychic Psycho": 0x8e, + "Major Psychic Psycho": 0x8f, + "Mole Playing Rough": 0x90, + "Gruff Goat": 0x91, + "Clumsy Robot": 0x92, + "Soul Consuming Flame": 0x93, + "Demonic Petunia": 0x94, + "Ranboob": 0x95, + "Li'l UFO": 0x96, + "High-class UFO": 0x97, + "Noose Man": 0x98, + "Robo-pump": 0x99, + "Plain Crocodile": 0x9a, + "Strong Crocodile": 0x9b, + "Hard Crocodile": 0x9c, + "No Good Fly": 0x9d, + "Mostly Bad Fly": 0x9e, + "Spiteful Crow": 0x9f, + "Loaded Dice 2": 0xC3, + "Black Antoid (2)": 0xD1, + "Cave Boy": 0x7B, + "Farm Zombie": 0xde, + "Criminal Caterpillar": 0xdf, + "Evil Eye": 0xe0, + "Master Criminal Worm": 0xe3 +} + +base_enemy_table = [ + "Insane Cultist", + "Armored Frog", + "Bad Buffalo", + "Black Antoid", + "Red Antoid", + "Ramblin' Evil Mushroom", + "Struttin' Evil Mushroom", + "Mobile Sprout", + "Tough Mobile Sprout", + "Enraged Fire Plug", + "Mystical Record", + "Atomic Power Robot", + "Nuclear Reactor Robot", + "Guardian Hieroglyph", + "Lethal Asp Hieroglyph", + "Electro Swoosh", + "Conducting Menace", + "Conducting Spirit", + "Evil Elemental", + "Annoying Old Party Man", + "Annoying Reveler", + "Unassuming Local Guy", + "New Age Retro Hippie", + "Mighty Bear", + "Mighty Bear Seven", + "Putrid Moldyman", + "Thunder Mite", + "Cranky Lady", + "Extra Cranky Lady", + "Wetnosaur", + "Chomposaur", + "Gigantic Ant", + "Scalding Coffee Cup", + "Loaded Dice", + "Slimy Little Pile", + "Even Slimier Little Pile", + "Arachnid!", + "Arachnid!!!", + "Bionic Kraken", + "Spinning Robo", + "Whirling Robo", + "Hyper Spinning Robo", + "Cop", + "Coil Snake", + "Thirsty Coil Snake", + "Mr. Batty", + "Elder Batty", + "Violent Roach", + "Filthy Attack Roach", + "Crazed Sign", + "Wooly Shambler", + "Wild 'n Wooly Shambler", + "Skate Punk", + "Skelpion", + "Dread Skelpion", + "Starman", + "Starman Super", + "Ghost of Starman", + "Smilin' Sphere", + "Uncontrollable Sphere", + "Petrified Royal Guard", + "Final Starman", + "Urban Zombie", + "Zombie Possessor", + "Zombie Dog", + "Over Zealous Cop", + "Territorial Oak", + "Hostile Elder Oak", + "Marauder Octobot", + "Military Octobot", + "Mechanical Octobot", + "Ultimate Octobot", + "Mad Duck", + "Dali's Clock", + "Musica", + "Desert Wolf", + "Big Pile of Puke", + "Kiss of Death", + "French Kiss of Death", + "Foppy", + "Fobby", + "Zap Eel", + "Tangoo", + "Squatter Demon", + "Crested Booka", + "Great Crested Booka", + "Lesser Mook", + "Mook Senior", + "Smelly Ghost", + "Stinky Ghost", + "Attack Slug", + "Pit Bull Slug", + "Rowdy Mouse", + "Deadly Mouse", + "Care Free Bomb", + "Handsome Tom", + "Smilin' Sam", + "Manly Fish", + "Manly Fish's Brother", + "Runaway Dog", + "Trick or Trick Kid", + "Abstract Art", + "Shattered Man", + "Fierce Shattered Man", + "Ego Orb", + "Yes Man Junior", + "Cute Li'l UFO", + "Beautiful UFO", + "Pogo Punk", + "Tough Guy", + "Mad Taxi", + "Mr. Molecule", + "Worthless Protoplasm", + "Sentry Robot", + "Psychic Psycho", + "Major Psychic Psycho", + "Mole Playing Rough", + "Gruff Goat", + "Soul Consuming Flame", + "Demonic Petunia", + "Ranboob", + "Li'l UFO", + "High-class UFO", + "Noose Man", + "Robo-pump", + "Plain Crocodile", + "Strong Crocodile", + "Hard Crocodile", + "No Good Fly", + "Mostly Bad Fly", + "Spiteful Crow", + "Black Antoid (2)", + "Struttin' Evil Mushroom", + "Cave Boy", + "Farm Zombie", + "Criminal Caterpillar", + "Evil Eye", + "Master Criminal Worm", + "Loaded Dice 2" +] + +enemy_descriptions = { + "Insane Cultist": "@They are friendly if you give them blue gifts.", + "Armored Frog": "@Their hard shell makes them very resistant.", + "Bad Buffalo": "@It really is a bad kind of buffalo.", + "Black Antoid": "@Be careful not to step on him.", + "Black Antoid (2)": "@Be careful not to step on him.", + "Red Antoid": "@Collectors dig that bright red hue.", + "Ramblin' Evil Mushroom": "@He is a really fun guy.", + "Struttin' Evil Mushroom": "@Watch the spores!", + "Mobile Sprout": "@The next evolution of plant.", + "Tough Mobile Sprout": "@This plant is actually made of stainless steel.", + "Enraged Fire Plug": "@A little hot-tempered.", + "Mystical Record": "@It has all your least favorite songs.", + "Atomic Power Robot": "@Handle with care!", + "Nuclear Reactor Robot": "@Handle with care!", + "Guardian Hieroglyph": "@I found him at the Pyramid north of here.", + "Lethal Asp Hieroglyph": "@I found him at the Pyramid north of here.", + "Electro Swoosh": "@Don't stare directly at it.", + "Conducting Menace": "@Shield your eyes from his light.", + "Conducting Spirit": "@Shield your eyes from his light.", + "Evil Elemental": "@What is the element of evil?", + "Annoying Old Party Man": "@He really knows how to throw a good party.", + "Annoying Reveler": "@This is my friend, Dave.", + "Unassuming Local Guy": "@What is he so unassuming about?", + "New Age Retro Hippie": "@I like him better than the Old Age Modern Urbanite.", + "Mighty Bear": "@He's stronger than the average bear.", + "Mighty Bear Seven": "@I wonder what happened to two through six?", + "Putrid Moldyman": "@I think this one's kinda cute.", + "Thunder Mite": "@He mite rain on your parade.", + "Cranky Lady": "@There aren't enough stores in the desert.", + "Extra Cranky Lady": "@There aren't enough stores in the desert.", + "Wetnosaur": "@Reminds me of a fossil I saw once.", + "Chomposaur": "@Reminds me of a fossil I saw once.", + "Gigantic Ant": "@No relation to the Titanic Ant.", + "Scalding Coffee Cup": "@It's a little too hot for me.", + "Loaded Dice": "@Always fun at parties.", + "Even Slimier Little Pile": "@Smells worse than the Slimy Little Pile.", + "Arachnid!": "@I think he just lives here.", + "Arachnid!!!": "@How did it get the extra exclamation points?", + "Bionic Kraken": "@The bionics make better soup.", + "Spinning Robo": "@Look at it go!", + "Whirling Robo": "@Look at it go!", + "Hyper Spinning Robo": "@Look at it go!", + "Cop": "@He said I wasn't paying taxes.", + "Coil Snake": "@Not a tool for modding.", + "Thirsty Coil Snake": "@What could he be thirsting for?", + "Mr. Batty": "@They make for good pets if you're careful.", + "Elder Batty": "@They make for good pets if you're careful.", + "Violent Roach": "@They make for good pets.", + "Filthy Attack Roach": "@They make for good pets.", + "Crazed Sign": "@That actually seems like a pretty reasonable speed limit.", + "Wooly Shambler": "@These are not actually Earth sheep.", + "Wild 'n Wooly Shambler": "@These are not actually Earth sheep.", + "Skate Punk": "@I saw him do a sick flip once.", + "Skelpion": "@How can scorpions shoot lightning?", + "Dread Skelpion": "@How can scorpions shoot lightning?", + "Starman": "@Famous for their fan-made websites.", + "Starman Super": "@My own personal sword farm.", + "Ghost of Starman": "@Are Starmen aliens or robots, anyways?", + "Smilin' Sphere": "@I don't like how it smiles at me.", + "Uncontrollable Sphere": "@Fortunately, these ones are controlled", + "Petrified Royal Guard": "@He isn't guarding this place.", + "Final Starman": "@Watch yourself around this one.", + "Urban Zombie": "@An import from the big city.", + "Zombie Possessor": "@Did you hear something just now?", + "Zombie Dog": "@He's more dog than zombie.", + "Over Zealous Cop": "@He is overstaying his welcome.", + "Territorial Oak": "@Don't worry, this one is just a model.", + "Hostile Elder Oak": "@Don't worry, this one is just a model.", + "Marauder Octobot": "@Watch out for your valuables!", + "Military Octobot": "@Watch out for your valuables!", + "Mechanical Octobot": "@Watch out for your valuables!", + "Ultimate Octobot": "@Watch out for your valuables!", + "Dali's Clock": "@I can never tell what time he's showing.", + "Musica": "@His soothing music puts me to sleep.", + "Desert Wolf": "@He is a surprisingly good pet.", + "Big Pile of Puke": "@How did this one get in here?", + "Kiss of Death": "@Despite the name, I wouldn't recommend kissing it.", + "French Kiss of Death": "@Despite the name, I wouldn't recommend kissing it.", + "Foppy": "@I can't even tell what this thing is.", + "Fobby": "@I wonder what color they are?", + "Zap Eel": "@How can eels live on land, anyway?", + "Tangoo": "@Watch out for his poisonous breath.", + "Squatter Demon": "@I don't know what to say about this one.", + "Crested Booka": "@The classic desert animal.", + "Great Crested Booka": "@The classic desert animal.", + "Lesser Mook": "@These aliens live here.", + "Mook Senior": "@These aliens live here.", + "Smelly Ghost": "@This exhibit needs some air freshener.", + "Stinky Ghost": "@This exhibit needs some air freshener.", + "Attack Slug": "@Cute when alone.", + "Pit Bull Slug": "@It is neither pit bull nor slug.", + "Rowdy Mouse": "@They're good pets if you don't let them SMAAAASH you.", + "Deadly Mouse": "@They're good pets if you don't let them SMAAAASH you.", + "Care Free Bomb": "@Don't get too close!", + "Handsome Tom": "@Not really all that handsome.", + "Smilin' Sam": "@He usually doesn't smile.", + "Manly Fish": "@Not related to Manly Fish's Brother.", + "Manly Fish's Brother": "@They are not actually related.", + "Runaway Dog": "@Don't worry, this one is adopted.", + "Trick or Trick Kid": "@He likes to play Clique.", + "Cave Boy": "@Not quite a Cave Man.", + "Abstract Art": "@Looks good in any gallery.", + "Shattered Man": "@He doesn't look so shattered to me.", + "Fierce Shattered Man": "@He doesn't look so shattered to me.", + "Ego Orb": "@I'll get back to you on that one.", + "Yes Man Junior": "@Not that bad of a guy.", + "Cute Li'l UFO": "@The ribbon is actually biological.", + "Beautiful UFO": "@Personally, I'm a bigger fan of the Li'l UFO.", + "Pogo Punk": "@He knows some sick tricks.", + "Tough Guy": "@Likes to chew gum and kick butt.", + "Mad Taxi": "@It has surprisingly good mental health.", + "Mr. Molecule": "@His whole family is here.", + "Worthless Protoplasm": "@He's actually kind of worthwhile.", + "Sentry Robot": "@Built by a crafty engineer.", + "Psychic Psycho": "@Watch out for Fire attacks!", + "Major Psychic Psycho": "@Watch out for Fire attacks!", + "Mole Playing Rough": "@They like to show up in the most random places.", + "Soul Consuming Flame": "@This one can't affect me.", + "Demonic Petunia": "@Looks beautiful from a distance.", + "Ranboob": "@Yeah I've got nothing to say on this one.", + "Li'l UFO": "@Personally, I'm a bigger fan of the High-class UFO.", + "High-class UFO": "@Personally, I'm a bigger fan of the Beautiful UFO.", + "Noose Man": "@How was this approved for a family game?", + "Robo-pump": "@It causes fires more than it puts them out.", + "Plain Crocodile": "@Also known as the vanilla crocodile.", + "Strong Crocodile": "@Stronger than the weak crocodile", + "Hard Crocodile": "@Slightly harder than the soft crocodile.", + "No Good Fly": "@They are often mistaken for bees.", + "Mostly Bad Fly": "@He's not all bad.", + "Spiteful Crow": "@Keep your valuables in your pocket!", + "Farm Zombie": "@Easily subdued by plants.", + "Criminal Caterpillar": "@He is wanted in seventeen countries for his crimes.", + "Evil Eye": "@Third-year staring contest champion.", + "Master Criminal Worm": "@He is wanted in seventeen countries for his crimes.", + "Loaded Dice 2": "@Always dangerous at parties.", +} + +can_walkthrough = [ + 0x0045, + 0x004A, + 0x0065, + 0x00C3, + 0x0112, + 0x0114, + 0x0115, + 0x0116, + 0x0117, + 0x0118, + 0x011A, + 0x011B, + 0x011C, + 0x011D, + 0x011E, + 0x011F, + 0x0120, + 0x0123, + 0x0124, + 0x012D, + 0x012E, + 0x012F, + 0x0130, + 0x0131, + 0x0132, + 0x0133, + 0x0134, + 0x0135, + 0x0136, + 0x0139, + 0x013A, + 0x013B, + 0x013C, + 0x013D, + 0x013E, + 0x013F, + 0x0140, + 0x0142, + 0x0143, + 0x0144, + 0x0145, + 0x0146, + 0x0169, + 0x0182, + 0x0185, + 0x0186, + 0x0187, + 0x0188, + 0x019F, + 0x01A0, + 0x01A1, + 0x01BC, + 0x01CD +] + + +def shuffle_enemies(world: "EarthBoundWorld") -> None: + """Shuffles the global enemy table.""" + world.acting_enemy_list = {} + shuffled_enemies = base_enemy_table.copy() + if world.options.enemy_shuffle: + world.random.shuffle(shuffled_enemies) + for index, enemy in enumerate(shuffled_enemies): + world.acting_enemy_list[base_enemy_table[index]] = enemy + + +def apply_enemy_shuffle(world: "EarthBoundWorld", rom: "LocalRom") -> None: + """Writes the shuffled enemy table into ROM.""" + rom.write_bytes(0x10d54d, bytearray([enemy_ids[world.acting_enemy_list["Spiteful Crow"]]])) + rom.write_bytes(0x10d551, bytearray([enemy_ids[world.acting_enemy_list["Runaway Dog"]]])) + rom.write_bytes(0x10d555, bytearray([enemy_ids[world.acting_enemy_list["Coil Snake"]]])) + rom.write_bytes(0x10d559, bytearray([enemy_ids[world.acting_enemy_list["Ghost of Starman"]]])) + rom.write_bytes(0x10d55c, bytearray([enemy_ids[world.acting_enemy_list["Evil Eye"]]])) + rom.write_bytes(0x10d567, bytearray([enemy_ids[world.acting_enemy_list["Evil Eye"]]])) + rom.write_bytes(0x10d56a, bytearray([enemy_ids[world.acting_enemy_list["Mechanical Octobot"]]])) + rom.write_bytes(0x10d56e, bytearray([enemy_ids[world.acting_enemy_list["Ghost of Starman"]]])) + rom.write_bytes(0x10d571, bytearray([enemy_ids[world.acting_enemy_list["Mechanical Octobot"]]])) + rom.write_bytes(0x10d574, bytearray([enemy_ids[world.acting_enemy_list["Evil Eye"]]])) + rom.write_bytes(0x10d578, bytearray([enemy_ids[world.acting_enemy_list["Skate Punk"]]])) + rom.write_bytes(0x10d57b, bytearray([enemy_ids[world.acting_enemy_list["Yes Man Junior"]]])) + rom.write_bytes(0x10d57e, bytearray([enemy_ids[world.acting_enemy_list["Pogo Punk"]]])) + rom.write_bytes(0x10d582, bytearray([enemy_ids[world.acting_enemy_list["Skate Punk"]]])) + rom.write_bytes(0x10d585, bytearray([enemy_ids[world.acting_enemy_list["Pogo Punk"]]])) + rom.write_bytes(0x10d588, bytearray([enemy_ids[world.acting_enemy_list["Yes Man Junior"]]])) + rom.write_bytes(0x10d58c, bytearray([enemy_ids[world.acting_enemy_list["Pogo Punk"]]])) + rom.write_bytes(0x10d58f, bytearray([enemy_ids[world.acting_enemy_list["Yes Man Junior"]]])) + rom.write_bytes(0x10d593, bytearray([enemy_ids[world.acting_enemy_list["Skate Punk"]]])) + rom.write_bytes(0x10d596, bytearray([enemy_ids[world.acting_enemy_list["Yes Man Junior"]]])) + rom.write_bytes(0x10d599, bytearray([enemy_ids[world.acting_enemy_list["Pogo Punk"]]])) + rom.write_bytes(0x10d5a1, bytearray([enemy_ids[world.acting_enemy_list["Spiteful Crow"]]])) + rom.write_bytes(0x10d5a9, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10d5ac, bytearray([enemy_ids[world.acting_enemy_list["Whirling Robo"]]])) + rom.write_bytes(0x10d5b0, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10d5b3, bytearray([enemy_ids[world.acting_enemy_list["Wooly Shambler"]]])) + rom.write_bytes(0x10d5b7, bytearray([enemy_ids[world.acting_enemy_list["Wooly Shambler"]]])) + rom.write_bytes(0x10d5ba, bytearray([enemy_ids[world.acting_enemy_list["Whirling Robo"]]])) + rom.write_bytes(0x10d5be, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10d5c1, bytearray([enemy_ids[world.acting_enemy_list["Whirling Robo"]]])) + rom.write_bytes(0x10d5c4, bytearray([enemy_ids[world.acting_enemy_list["Wooly Shambler"]]])) + rom.write_bytes(0x10d5c8, bytearray([enemy_ids[world.acting_enemy_list["Spiteful Crow"]]])) + rom.write_bytes(0x10d5cc, bytearray([enemy_ids[world.acting_enemy_list["Gruff Goat"]]])) + rom.write_bytes(0x10d5d4, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10d5d7, bytearray([enemy_ids[world.acting_enemy_list["Whirling Robo"]]])) + rom.write_bytes(0x10d5db, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10d5de, bytearray([enemy_ids[world.acting_enemy_list["Wooly Shambler"]]])) + rom.write_bytes(0x10d5e2, bytearray([enemy_ids[world.acting_enemy_list["Wooly Shambler"]]])) + rom.write_bytes(0x10d5e5, bytearray([enemy_ids[world.acting_enemy_list["Whirling Robo"]]])) + rom.write_bytes(0x10d5e9, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10d5ec, bytearray([enemy_ids[world.acting_enemy_list["Wooly Shambler"]]])) + rom.write_bytes(0x10d5ef, bytearray([enemy_ids[world.acting_enemy_list["Whirling Robo"]]])) + rom.write_bytes(0x10d5f7, bytearray([enemy_ids[world.acting_enemy_list["Cave Boy"]]])) + rom.write_bytes(0x10d5fa, bytearray([enemy_ids[world.acting_enemy_list["Mighty Bear Seven"]]])) + rom.write_bytes(0x10d5fe, bytearray([enemy_ids[world.acting_enemy_list["Cave Boy"]]])) + rom.write_bytes(0x10d601, bytearray([enemy_ids[world.acting_enemy_list["Mighty Bear Seven"]]])) + rom.write_bytes(0x10d605, bytearray([enemy_ids[world.acting_enemy_list["Cave Boy"]]])) + rom.write_bytes(0x10d608, bytearray([enemy_ids[world.acting_enemy_list["Mighty Bear Seven"]]])) + rom.write_bytes(0x10d60c, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid"]]])) + rom.write_bytes(0x10d610, bytearray([enemy_ids[world.acting_enemy_list["Ramblin' Evil Mushroom"]]])) + rom.write_bytes(0x10d614, bytearray([enemy_ids[world.acting_enemy_list["Ramblin' Evil Mushroom"]]])) + rom.write_bytes(0x10d618, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid"]]])) + rom.write_bytes(0x10d61b, bytearray([enemy_ids[world.acting_enemy_list["Ramblin' Evil Mushroom"]]])) + rom.write_bytes(0x10d61f, bytearray([enemy_ids[world.acting_enemy_list["Ramblin' Evil Mushroom"]]])) + rom.write_bytes(0x10d623, bytearray([enemy_ids[world.acting_enemy_list["Ramblin' Evil Mushroom"]]])) + rom.write_bytes(0x10d627, bytearray([enemy_ids[world.acting_enemy_list["Runaway Dog"]]])) + rom.write_bytes(0x10d62a, bytearray([enemy_ids[world.acting_enemy_list["Cop"]]])) + rom.write_bytes(0x10d62e, bytearray([enemy_ids[world.acting_enemy_list["Cranky Lady"]]])) + rom.write_bytes(0x10d632, bytearray([enemy_ids[world.acting_enemy_list["Annoying Old Party Man"]]])) + rom.write_bytes(0x10d636, bytearray([enemy_ids[world.acting_enemy_list["Unassuming Local Guy"]]])) + rom.write_bytes(0x10d63a, bytearray([enemy_ids[world.acting_enemy_list["New Age Retro Hippie"]]])) + rom.write_bytes(0x10d63e, bytearray([enemy_ids[world.acting_enemy_list["Ramblin' Evil Mushroom"]]])) + rom.write_bytes(0x10d641, bytearray([enemy_ids[world.acting_enemy_list["Mobile Sprout"]]])) + rom.write_bytes(0x10d645, bytearray([enemy_ids[world.acting_enemy_list["Ramblin' Evil Mushroom"]]])) + rom.write_bytes(0x10d649, bytearray([enemy_ids[world.acting_enemy_list["Mobile Sprout"]]])) + rom.write_bytes(0x10d64c, bytearray([enemy_ids[world.acting_enemy_list["Territorial Oak"]]])) + rom.write_bytes(0x10d650, bytearray([enemy_ids[world.acting_enemy_list["Mobile Sprout"]]])) + rom.write_bytes(0x10d653, bytearray([enemy_ids[world.acting_enemy_list["Territorial Oak"]]])) + rom.write_bytes(0x10d657, bytearray([enemy_ids[world.acting_enemy_list["Mobile Sprout"]]])) + rom.write_bytes(0x10d65a, bytearray([enemy_ids[world.acting_enemy_list["Li'l UFO"]]])) + rom.write_bytes(0x10d65e, bytearray([enemy_ids[world.acting_enemy_list["Mobile Sprout"]]])) + rom.write_bytes(0x10d662, bytearray([enemy_ids[world.acting_enemy_list["Mobile Sprout"]]])) + rom.write_bytes(0x10d666, bytearray([enemy_ids[world.acting_enemy_list["Territorial Oak"]]])) + rom.write_bytes(0x10d66a, bytearray([enemy_ids[world.acting_enemy_list["Spinning Robo"]]])) + rom.write_bytes(0x10d66e, bytearray([enemy_ids[world.acting_enemy_list["Li'l UFO"]]])) + rom.write_bytes(0x10d672, bytearray([enemy_ids[world.acting_enemy_list["Li'l UFO"]]])) + rom.write_bytes(0x10d675, bytearray([enemy_ids[world.acting_enemy_list["Mobile Sprout"]]])) + rom.write_bytes(0x10d679, bytearray([enemy_ids[world.acting_enemy_list["Li'l UFO"]]])) + rom.write_bytes(0x10d67c, bytearray([enemy_ids[world.acting_enemy_list["Spinning Robo"]]])) + rom.write_bytes(0x10d680, bytearray([enemy_ids[world.acting_enemy_list["Li'l UFO"]]])) + rom.write_bytes(0x10d684, bytearray([enemy_ids[world.acting_enemy_list["Insane Cultist"]]])) + rom.write_bytes(0x10d688, bytearray([enemy_ids[world.acting_enemy_list["Insane Cultist"]]])) + rom.write_bytes(0x10d68c, bytearray([enemy_ids[world.acting_enemy_list["Spiteful Crow"]]])) + rom.write_bytes(0x10d690, bytearray([enemy_ids[world.acting_enemy_list["Spiteful Crow"]]])) + rom.write_bytes(0x10d694, bytearray([enemy_ids[world.acting_enemy_list["Cranky Lady"]]])) + rom.write_bytes(0x10d698, bytearray([enemy_ids[world.acting_enemy_list["Annoying Old Party Man"]]])) + rom.write_bytes(0x10d69c, bytearray([enemy_ids[world.acting_enemy_list["New Age Retro Hippie"]]])) + rom.write_bytes(0x10d6a0, bytearray([enemy_ids[world.acting_enemy_list["Trick or Trick Kid"]]])) + rom.write_bytes(0x10d6a3, bytearray([enemy_ids[world.acting_enemy_list["Handsome Tom"]]])) + rom.write_bytes(0x10d6a7, bytearray([enemy_ids[world.acting_enemy_list["Trick or Trick Kid"]]])) + rom.write_bytes(0x10d6ab, bytearray([enemy_ids[world.acting_enemy_list["Handsome Tom"]]])) + rom.write_bytes(0x10d6ae, bytearray([enemy_ids[world.acting_enemy_list["Smilin' Sam"]]])) + rom.write_bytes(0x10d6b2, bytearray([enemy_ids[world.acting_enemy_list["Handsome Tom"]]])) + rom.write_bytes(0x10d6b6, bytearray([enemy_ids[world.acting_enemy_list["Smilin' Sam"]]])) + rom.write_bytes(0x10d6ba, bytearray([enemy_ids[world.acting_enemy_list["Urban Zombie"]]])) + rom.write_bytes(0x10d6be, bytearray([enemy_ids[world.acting_enemy_list["Zombie Possessor"]]])) + rom.write_bytes(0x10d6c1, bytearray([enemy_ids[world.acting_enemy_list["Urban Zombie"]]])) + rom.write_bytes(0x10d6c5, bytearray([enemy_ids[world.acting_enemy_list["No Good Fly"]]])) + rom.write_bytes(0x10d6c8, bytearray([enemy_ids[world.acting_enemy_list["Putrid Moldyman"]]])) + rom.write_bytes(0x10d6cc, bytearray([enemy_ids[world.acting_enemy_list["Putrid Moldyman"]]])) + rom.write_bytes(0x10d6cf, bytearray([enemy_ids[world.acting_enemy_list["Smelly Ghost"]]])) + rom.write_bytes(0x10d6d3, bytearray([enemy_ids[world.acting_enemy_list["Zombie Possessor"]]])) + rom.write_bytes(0x10d6d6, bytearray([enemy_ids[world.acting_enemy_list["Putrid Moldyman"]]])) + rom.write_bytes(0x10d6da, bytearray([enemy_ids[world.acting_enemy_list["Zombie Possessor"]]])) + rom.write_bytes(0x10d6dd, bytearray([enemy_ids[world.acting_enemy_list["Smelly Ghost"]]])) + rom.write_bytes(0x10d6e1, bytearray([enemy_ids[world.acting_enemy_list["Putrid Moldyman"]]])) + rom.write_bytes(0x10d6e4, bytearray([enemy_ids[world.acting_enemy_list["Smelly Ghost"]]])) + rom.write_bytes(0x10d6e8, bytearray([enemy_ids[world.acting_enemy_list["No Good Fly"]]])) + rom.write_bytes(0x10d6eb, bytearray([enemy_ids[world.acting_enemy_list["Putrid Moldyman"]]])) + rom.write_bytes(0x10d6ef, bytearray([enemy_ids[world.acting_enemy_list["No Good Fly"]]])) + rom.write_bytes(0x10d6f2, bytearray([enemy_ids[world.acting_enemy_list["Smelly Ghost"]]])) + rom.write_bytes(0x10d6f6, bytearray([enemy_ids[world.acting_enemy_list["No Good Fly"]]])) + rom.write_bytes(0x10d6fa, bytearray([enemy_ids[world.acting_enemy_list["Zombie Dog"]]])) + rom.write_bytes(0x10d6fe, bytearray([enemy_ids[world.acting_enemy_list["Zombie Dog"]]])) + rom.write_bytes(0x10d701, bytearray([enemy_ids[world.acting_enemy_list["No Good Fly"]]])) + rom.write_bytes(0x10d705, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d70c, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d713, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d716, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d719, bytearray([enemy_ids[world.acting_enemy_list["Farm Zombie"]]])) + rom.write_bytes(0x10d71d, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d720, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d724, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d727, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d72b, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d72e, bytearray([enemy_ids[world.acting_enemy_list["Farm Zombie"]]])) + rom.write_bytes(0x10d732, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d735, bytearray([enemy_ids[world.acting_enemy_list["Farm Zombie"]]])) + rom.write_bytes(0x10d739, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d73d, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d740, bytearray([enemy_ids[world.acting_enemy_list["Farm Zombie"]]])) + rom.write_bytes(0x10d744, bytearray([enemy_ids[world.acting_enemy_list["Plain Crocodile"]]])) + rom.write_bytes(0x10d747, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d74b, bytearray([enemy_ids[world.acting_enemy_list["Plain Crocodile"]]])) + rom.write_bytes(0x10d74e, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d751, bytearray([enemy_ids[world.acting_enemy_list["Farm Zombie"]]])) + rom.write_bytes(0x10d755, bytearray([enemy_ids[world.acting_enemy_list["Plain Crocodile"]]])) + rom.write_bytes(0x10d758, bytearray([enemy_ids[world.acting_enemy_list["Farm Zombie"]]])) + rom.write_bytes(0x10d75c, bytearray([enemy_ids[world.acting_enemy_list["Plain Crocodile"]]])) + rom.write_bytes(0x10d75f, bytearray([enemy_ids[world.acting_enemy_list["Farm Zombie"]]])) + rom.write_bytes(0x10d763, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d769, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d76d, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d770, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid (2)"]]])) + rom.write_bytes(0x10d766, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid (2)"]]])) + rom.write_bytes(0x10d774, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d777, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid (2)"]]])) + rom.write_bytes(0x10d77b, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d77e, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d781, bytearray([enemy_ids[world.acting_enemy_list["Plain Crocodile"]]])) + rom.write_bytes(0x10d785, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d788, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d78c, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d78f, bytearray([enemy_ids[world.acting_enemy_list["Plain Crocodile"]]])) + rom.write_bytes(0x10d793, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d796, bytearray([enemy_ids[world.acting_enemy_list["Plain Crocodile"]]])) + rom.write_bytes(0x10d79a, bytearray([enemy_ids[world.acting_enemy_list["Red Antoid"]]])) + rom.write_bytes(0x10d79d, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d7a1, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d7a5, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d7a9, bytearray([enemy_ids[world.acting_enemy_list["Plain Crocodile"]]])) + rom.write_bytes(0x10d7ac, bytearray([enemy_ids[world.acting_enemy_list["Armored Frog"]]])) + rom.write_bytes(0x10d7b0, bytearray([enemy_ids[world.acting_enemy_list["Plain Crocodile"]]])) + rom.write_bytes(0x10d7b4, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10d7b8, bytearray([enemy_ids[world.acting_enemy_list["Violent Roach"]]])) + rom.write_bytes(0x10d7bc, bytearray([enemy_ids[world.acting_enemy_list["Ranboob"]]])) + rom.write_bytes(0x10d7c0, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10d7c3, bytearray([enemy_ids[world.acting_enemy_list["Ranboob"]]])) + rom.write_bytes(0x10d7c7, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10d7cb, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10d7ce, bytearray([enemy_ids[world.acting_enemy_list["Struttin' Evil Mushroom"]]])) + rom.write_bytes(0x10d7d1, bytearray([enemy_ids[world.acting_enemy_list["Ranboob"]]])) + rom.write_bytes(0x10d7d5, bytearray([enemy_ids[world.acting_enemy_list["Bad Buffalo"]]])) + rom.write_bytes(0x10d7d8, bytearray([enemy_ids[world.acting_enemy_list["Desert Wolf"]]])) + rom.write_bytes(0x10d7dc, bytearray([enemy_ids[world.acting_enemy_list["Bad Buffalo"]]])) + rom.write_bytes(0x10d7df, bytearray([enemy_ids[world.acting_enemy_list["Smilin' Sphere"]]])) + rom.write_bytes(0x10d7e3, bytearray([enemy_ids[world.acting_enemy_list["Bad Buffalo"]]])) + rom.write_bytes(0x10d7e7, bytearray([enemy_ids[world.acting_enemy_list["Desert Wolf"]]])) + rom.write_bytes(0x10d7eb, bytearray([enemy_ids[world.acting_enemy_list["Skelpion"]]])) + rom.write_bytes(0x10d7ee, bytearray([enemy_ids[world.acting_enemy_list["Cute Li'l UFO"]]])) + rom.write_bytes(0x10d7f2, bytearray([enemy_ids[world.acting_enemy_list["Skelpion"]]])) + rom.write_bytes(0x10d7f5, bytearray([enemy_ids[world.acting_enemy_list["Smilin' Sphere"]]])) + rom.write_bytes(0x10d7f9, bytearray([enemy_ids[world.acting_enemy_list["Skelpion"]]])) + rom.write_bytes(0x10d7fc, bytearray([enemy_ids[world.acting_enemy_list["Smilin' Sphere"]]])) + rom.write_bytes(0x10d7ff, bytearray([enemy_ids[world.acting_enemy_list["Cute Li'l UFO"]]])) + rom.write_bytes(0x10d803, bytearray([enemy_ids[world.acting_enemy_list["Skelpion"]]])) + rom.write_bytes(0x10d806, bytearray([enemy_ids[world.acting_enemy_list["Crested Booka"]]])) + rom.write_bytes(0x10d80a, bytearray([enemy_ids[world.acting_enemy_list["Skelpion"]]])) + rom.write_bytes(0x10d80e, bytearray([enemy_ids[world.acting_enemy_list["Skelpion"]]])) + rom.write_bytes(0x10d812, bytearray([enemy_ids[world.acting_enemy_list["Crested Booka"]]])) + rom.write_bytes(0x10d815, bytearray([enemy_ids[world.acting_enemy_list["Bad Buffalo"]]])) + rom.write_bytes(0x10d819, bytearray([enemy_ids[world.acting_enemy_list["Crested Booka"]]])) + rom.write_bytes(0x10d81c, bytearray([enemy_ids[world.acting_enemy_list["Desert Wolf"]]])) + rom.write_bytes(0x10d820, bytearray([enemy_ids[world.acting_enemy_list["Crested Booka"]]])) + rom.write_bytes(0x10d823, bytearray([enemy_ids[world.acting_enemy_list["Cute Li'l UFO"]]])) + rom.write_bytes(0x10d826, bytearray([enemy_ids[world.acting_enemy_list["Smilin' Sphere"]]])) + rom.write_bytes(0x10d82a, bytearray([enemy_ids[world.acting_enemy_list["Crested Booka"]]])) + rom.write_bytes(0x10d82d, bytearray([enemy_ids[world.acting_enemy_list["Cute Li'l UFO"]]])) + rom.write_bytes(0x10d831, bytearray([enemy_ids[world.acting_enemy_list["Crested Booka"]]])) + rom.write_bytes(0x10d834, bytearray([enemy_ids[world.acting_enemy_list["Smilin' Sphere"]]])) + rom.write_bytes(0x10d838, bytearray([enemy_ids[world.acting_enemy_list["Mad Taxi"]]])) + rom.write_bytes(0x10d83c, bytearray([enemy_ids[world.acting_enemy_list["Extra Cranky Lady"]]])) + rom.write_bytes(0x10d840, bytearray([enemy_ids[world.acting_enemy_list["Annoying Reveler"]]])) + rom.write_bytes(0x10d844, bytearray([enemy_ids[world.acting_enemy_list["Crazed Sign"]]])) + rom.write_bytes(0x10d848, bytearray([enemy_ids[world.acting_enemy_list["Dali's Clock"]]])) + rom.write_bytes(0x10d84c, bytearray([enemy_ids[world.acting_enemy_list["Enraged Fire Plug"]]])) + rom.write_bytes(0x10d850, bytearray([enemy_ids[world.acting_enemy_list["Enraged Fire Plug"]]])) + rom.write_bytes(0x10d854, bytearray([enemy_ids[world.acting_enemy_list["Abstract Art"]]])) + rom.write_bytes(0x10d858, bytearray([enemy_ids[world.acting_enemy_list["Robo-pump"]]])) + rom.write_bytes(0x10d85c, bytearray([enemy_ids[world.acting_enemy_list["Robo-pump"]]])) + rom.write_bytes(0x10d85f, bytearray([enemy_ids[world.acting_enemy_list["Enraged Fire Plug"]]])) + rom.write_bytes(0x10d863, bytearray([enemy_ids[world.acting_enemy_list["Mad Taxi"]]])) + rom.write_bytes(0x10d867, bytearray([enemy_ids[world.acting_enemy_list["Mad Taxi"]]])) + rom.write_bytes(0x10d86a, bytearray([enemy_ids[world.acting_enemy_list["Crazed Sign"]]])) + rom.write_bytes(0x10d86e, bytearray([enemy_ids[world.acting_enemy_list["Crazed Sign"]]])) + rom.write_bytes(0x10d872, bytearray([enemy_ids[world.acting_enemy_list["Tough Guy"]]])) + rom.write_bytes(0x10d876, bytearray([enemy_ids[world.acting_enemy_list["Over Zealous Cop"]]])) + rom.write_bytes(0x10d879, bytearray([enemy_ids[world.acting_enemy_list["Tough Guy"]]])) + rom.write_bytes(0x10d87d, bytearray([enemy_ids[world.acting_enemy_list["Over Zealous Cop"]]])) + rom.write_bytes(0x10d881, bytearray([enemy_ids[world.acting_enemy_list["High-class UFO"]]])) + rom.write_bytes(0x10d884, bytearray([enemy_ids[world.acting_enemy_list["Beautiful UFO"]]])) + rom.write_bytes(0x10d888, bytearray([enemy_ids[world.acting_enemy_list["High-class UFO"]]])) + rom.write_bytes(0x10d88c, bytearray([enemy_ids[world.acting_enemy_list["High-class UFO"]]])) + rom.write_bytes(0x10d890, bytearray([enemy_ids[world.acting_enemy_list["Beautiful UFO"]]])) + rom.write_bytes(0x10d894, bytearray([enemy_ids[world.acting_enemy_list["Dread Skelpion"]]])) + rom.write_bytes(0x10d897, bytearray([enemy_ids[world.acting_enemy_list["Great Crested Booka"]]])) + rom.write_bytes(0x10d89b, bytearray([enemy_ids[world.acting_enemy_list["Dread Skelpion"]]])) + rom.write_bytes(0x10d89f, bytearray([enemy_ids[world.acting_enemy_list["Great Crested Booka"]]])) + rom.write_bytes(0x10d8a3, bytearray([enemy_ids[world.acting_enemy_list["Great Crested Booka"]]])) + rom.write_bytes(0x10d8a6, bytearray([enemy_ids[world.acting_enemy_list["Dread Skelpion"]]])) + rom.write_bytes(0x10d8aa, bytearray([enemy_ids[world.acting_enemy_list["Great Crested Booka"]]])) + rom.write_bytes(0x10d8ae, bytearray([enemy_ids[world.acting_enemy_list["High-class UFO"]]])) + rom.write_bytes(0x10d8b1, bytearray([enemy_ids[world.acting_enemy_list["Beautiful UFO"]]])) + rom.write_bytes(0x10d8b5, bytearray([enemy_ids[world.acting_enemy_list["High-class UFO"]]])) + rom.write_bytes(0x10d8b8, bytearray([enemy_ids[world.acting_enemy_list["Marauder Octobot"]]])) + rom.write_bytes(0x10d8bb, bytearray([enemy_ids[world.acting_enemy_list["Beautiful UFO"]]])) + rom.write_bytes(0x10d8bf, bytearray([enemy_ids[world.acting_enemy_list["High-class UFO"]]])) + rom.write_bytes(0x10d8c2, bytearray([enemy_ids[world.acting_enemy_list["Marauder Octobot"]]])) + rom.write_bytes(0x10d8c6, bytearray([enemy_ids[world.acting_enemy_list["Beautiful UFO"]]])) + rom.write_bytes(0x10d8ca, bytearray([enemy_ids[world.acting_enemy_list["Marauder Octobot"]]])) + rom.write_bytes(0x10d8ce, bytearray([enemy_ids[world.acting_enemy_list["Hostile Elder Oak"]]])) + rom.write_bytes(0x10d8d2, bytearray([enemy_ids[world.acting_enemy_list["Pit Bull Slug"]]])) + rom.write_bytes(0x10d8d6, bytearray([enemy_ids[world.acting_enemy_list["Demonic Petunia"]]])) + rom.write_bytes(0x10d8da, bytearray([enemy_ids[world.acting_enemy_list["Big Pile of Puke"]]])) + rom.write_bytes(0x10d8dd, bytearray([enemy_ids[world.acting_enemy_list["Even Slimier Little Pile"]]])) + rom.write_bytes(0x10d8e1, bytearray([enemy_ids[world.acting_enemy_list["Big Pile of Puke"]]])) + rom.write_bytes(0x10d8e4, bytearray([enemy_ids[world.acting_enemy_list["Even Slimier Little Pile"]]])) + rom.write_bytes(0x10d8e8, bytearray([enemy_ids[world.acting_enemy_list["Hostile Elder Oak"]]])) + rom.write_bytes(0x10d8ec, bytearray([enemy_ids[world.acting_enemy_list["Zap Eel"]]])) + rom.write_bytes(0x10d8ef, bytearray([enemy_ids[world.acting_enemy_list["Hard Crocodile"]]])) + rom.write_bytes(0x10d8f3, bytearray([enemy_ids[world.acting_enemy_list["Zap Eel"]]])) + rom.write_bytes(0x10d8f7, bytearray([enemy_ids[world.acting_enemy_list["Even Slimier Little Pile"]]])) + rom.write_bytes(0x10d8fa, bytearray([enemy_ids[world.acting_enemy_list["Zap Eel"]]])) + rom.write_bytes(0x10d8fe, bytearray([enemy_ids[world.acting_enemy_list["Even Slimier Little Pile"]]])) + rom.write_bytes(0x10d901, bytearray([enemy_ids[world.acting_enemy_list["Hard Crocodile"]]])) + rom.write_bytes(0x10d905, bytearray([enemy_ids[world.acting_enemy_list["Even Slimier Little Pile"]]])) + rom.write_bytes(0x10d908, bytearray([enemy_ids[world.acting_enemy_list["Manly Fish"]]])) + rom.write_bytes(0x10d90c, bytearray([enemy_ids[world.acting_enemy_list["Manly Fish"]]])) + rom.write_bytes(0x10d90f, bytearray([enemy_ids[world.acting_enemy_list["Hard Crocodile"]]])) + rom.write_bytes(0x10d913, bytearray([enemy_ids[world.acting_enemy_list["Manly Fish"]]])) + rom.write_bytes(0x10d916, bytearray([enemy_ids[world.acting_enemy_list["Manly Fish's Brother"]]])) + rom.write_bytes(0x10d91a, bytearray([enemy_ids[world.acting_enemy_list["Pit Bull Slug"]]])) + rom.write_bytes(0x10d91e, bytearray([enemy_ids[world.acting_enemy_list["Demonic Petunia"]]])) + rom.write_bytes(0x10d922, bytearray([enemy_ids[world.acting_enemy_list["Demonic Petunia"]]])) + rom.write_bytes(0x10d925, bytearray([enemy_ids[world.acting_enemy_list["Hostile Elder Oak"]]])) + rom.write_bytes(0x10d929, bytearray([enemy_ids[world.acting_enemy_list["Wetnosaur"]]])) + rom.write_bytes(0x10d92d, bytearray([enemy_ids[world.acting_enemy_list["Chomposaur"]]])) + rom.write_bytes(0x10d931, bytearray([enemy_ids[world.acting_enemy_list["Ego Orb"]]])) + rom.write_bytes(0x10d935, bytearray([enemy_ids[world.acting_enemy_list["Care Free Bomb"]]])) + rom.write_bytes(0x10d938, bytearray([enemy_ids[world.acting_enemy_list["Mr. Molecule"]]])) + rom.write_bytes(0x10d93c, bytearray([enemy_ids[world.acting_enemy_list["Care Free Bomb"]]])) + rom.write_bytes(0x10d940, bytearray([enemy_ids[world.acting_enemy_list["French Kiss of Death"]]])) + rom.write_bytes(0x10d944, bytearray([enemy_ids[world.acting_enemy_list["Loaded Dice"]]])) + rom.write_bytes(0x10d947, bytearray([enemy_ids[world.acting_enemy_list["Care Free Bomb"]]])) + rom.write_bytes(0x10d94a, bytearray([enemy_ids[world.acting_enemy_list["Beautiful UFO"]]])) + rom.write_bytes(0x10d94d, bytearray([enemy_ids[world.acting_enemy_list["High-class UFO"]]])) + + rom.write_bytes(0x10d951, bytearray([enemy_ids[world.acting_enemy_list["Loaded Dice 2"]]])) + rom.write_bytes(0x10d954, bytearray([enemy_ids[world.acting_enemy_list["Electro Swoosh"]]])) + rom.write_bytes(0x10d957, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10d95a, bytearray([enemy_ids[world.acting_enemy_list["Uncontrollable Sphere"]]])) + rom.write_bytes(0x10d95e, bytearray([enemy_ids[world.acting_enemy_list["Electro Swoosh"]]])) + rom.write_bytes(0x10d962, bytearray([enemy_ids[world.acting_enemy_list["Electro Swoosh"]]])) + rom.write_bytes(0x10d965, bytearray([enemy_ids[world.acting_enemy_list["French Kiss of Death"]]])) + rom.write_bytes(0x10d969, bytearray([enemy_ids[world.acting_enemy_list["Mr. Molecule"]]])) + rom.write_bytes(0x10d96d, bytearray([enemy_ids[world.acting_enemy_list["Mr. Molecule"]]])) + rom.write_bytes(0x10d971, bytearray([enemy_ids[world.acting_enemy_list["Rowdy Mouse"]]])) + rom.write_bytes(0x10d974, bytearray([enemy_ids[world.acting_enemy_list["Attack Slug"]]])) + rom.write_bytes(0x10d978, bytearray([enemy_ids[world.acting_enemy_list["Rowdy Mouse"]]])) + rom.write_bytes(0x10d97f, bytearray([enemy_ids[world.acting_enemy_list["Rowdy Mouse"]]])) + rom.write_bytes(0x10d98b, bytearray([enemy_ids[world.acting_enemy_list["Attack Slug"]]])) + rom.write_bytes(0x10d98f, bytearray([enemy_ids[world.acting_enemy_list["Attack Slug"]]])) + rom.write_bytes(0x10d993, bytearray([enemy_ids[world.acting_enemy_list["Elder Batty"]]])) + rom.write_bytes(0x10d996, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!"]]])) + rom.write_bytes(0x10d99a, bytearray([enemy_ids[world.acting_enemy_list["Elder Batty"]]])) + rom.write_bytes(0x10d99e, bytearray([enemy_ids[world.acting_enemy_list["Elder Batty"]]])) + rom.write_bytes(0x10d9a1, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!"]]])) + rom.write_bytes(0x10d9a5, bytearray([enemy_ids[world.acting_enemy_list["Elder Batty"]]])) + rom.write_bytes(0x10d9a8, bytearray([enemy_ids[world.acting_enemy_list["Strong Crocodile"]]])) + rom.write_bytes(0x10d9ac, bytearray([enemy_ids[world.acting_enemy_list["Strong Crocodile"]]])) + rom.write_bytes(0x10d9af, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!"]]])) + rom.write_bytes(0x10d9b3, bytearray([enemy_ids[world.acting_enemy_list["Strong Crocodile"]]])) + rom.write_bytes(0x10d9b7, bytearray([enemy_ids[world.acting_enemy_list["Strong Crocodile"]]])) + rom.write_bytes(0x10d9bb, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!"]]])) + rom.write_bytes(0x10d9bf, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid"]]])) + rom.write_bytes(0x10d9c2, bytearray([enemy_ids[world.acting_enemy_list["Rowdy Mouse"]]])) + rom.write_bytes(0x10d9c6, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid"]]])) + rom.write_bytes(0x10d9c9, bytearray([enemy_ids[world.acting_enemy_list["Attack Slug"]]])) + rom.write_bytes(0x10d9cd, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid"]]])) + rom.write_bytes(0x10d9d1, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid"]]])) + rom.write_bytes(0x10d9d4, bytearray([enemy_ids[world.acting_enemy_list["Rowdy Mouse"]]])) + rom.write_bytes(0x10d9d8, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid"]]])) + rom.write_bytes(0x10d9dc, bytearray([enemy_ids[world.acting_enemy_list["Rowdy Mouse"]]])) + rom.write_bytes(0x10d9e0, bytearray([enemy_ids[world.acting_enemy_list["Rowdy Mouse"]]])) + rom.write_bytes(0x10d9e4, bytearray([enemy_ids[world.acting_enemy_list["Attack Slug"]]])) + rom.write_bytes(0x10d9e8, bytearray([enemy_ids[world.acting_enemy_list["Attack Slug"]]])) + rom.write_bytes(0x10d9ec, bytearray([enemy_ids[world.acting_enemy_list["Mole Playing Rough"]]])) + rom.write_bytes(0x10d9f0, bytearray([enemy_ids[world.acting_enemy_list["Mr. Batty"]]])) + rom.write_bytes(0x10d9f4, bytearray([enemy_ids[world.acting_enemy_list["Mr. Batty"]]])) + rom.write_bytes(0x10d9f7, bytearray([enemy_ids[world.acting_enemy_list["Mole Playing Rough"]]])) + rom.write_bytes(0x10d9fb, bytearray([enemy_ids[world.acting_enemy_list["Mr. Batty"]]])) + rom.write_bytes(0x10d9fe, bytearray([enemy_ids[world.acting_enemy_list["Mighty Bear"]]])) + rom.write_bytes(0x10da02, bytearray([enemy_ids[world.acting_enemy_list["Mr. Batty"]]])) + rom.write_bytes(0x10da06, bytearray([enemy_ids[world.acting_enemy_list["Mole Playing Rough"]]])) + rom.write_bytes(0x10da0a, bytearray([enemy_ids[world.acting_enemy_list["Mole Playing Rough"]]])) + rom.write_bytes(0x10da0d, bytearray([enemy_ids[world.acting_enemy_list["Mighty Bear"]]])) + rom.write_bytes(0x10da11, bytearray([enemy_ids[world.acting_enemy_list["Mighty Bear"]]])) + rom.write_bytes(0x10da15, bytearray([enemy_ids[world.acting_enemy_list["Mighty Bear"]]])) + rom.write_bytes(0x10da18, bytearray([enemy_ids[world.acting_enemy_list["Mr. Batty"]]])) + rom.write_bytes(0x10da1c, bytearray([enemy_ids[world.acting_enemy_list["Urban Zombie"]]])) + rom.write_bytes(0x10da1f, bytearray([enemy_ids[world.acting_enemy_list["Zombie Dog"]]])) + rom.write_bytes(0x10da23, bytearray([enemy_ids[world.acting_enemy_list["Urban Zombie"]]])) + rom.write_bytes(0x10da27, bytearray([enemy_ids[world.acting_enemy_list["Zombie Dog"]]])) + rom.write_bytes(0x10da2a, bytearray([enemy_ids[world.acting_enemy_list["No Good Fly"]]])) + rom.write_bytes(0x10da2e, bytearray([enemy_ids[world.acting_enemy_list["Zombie Possessor"]]])) + rom.write_bytes(0x10da32, bytearray([enemy_ids[world.acting_enemy_list["Zombie Possessor"]]])) + rom.write_bytes(0x10da35, bytearray([enemy_ids[world.acting_enemy_list["Urban Zombie"]]])) + rom.write_bytes(0x10da39, bytearray([enemy_ids[world.acting_enemy_list["Zombie Possessor"]]])) + rom.write_bytes(0x10da3c, bytearray([enemy_ids[world.acting_enemy_list["Urban Zombie"]]])) + rom.write_bytes(0x10da40, bytearray([enemy_ids[world.acting_enemy_list["Zombie Possessor"]]])) + rom.write_bytes(0x10da44, bytearray([enemy_ids[world.acting_enemy_list["Violent Roach"]]])) + rom.write_bytes(0x10da48, bytearray([enemy_ids[world.acting_enemy_list["Foppy"]]])) + rom.write_bytes(0x10da4c, bytearray([enemy_ids[world.acting_enemy_list["Foppy"]]])) + rom.write_bytes(0x10da50, bytearray([enemy_ids[world.acting_enemy_list["Foppy"]]])) + rom.write_bytes(0x10da54, bytearray([enemy_ids[world.acting_enemy_list["Foppy"]]])) + rom.write_bytes(0x10da58, bytearray([enemy_ids[world.acting_enemy_list["Foppy"]]])) + rom.write_bytes(0x10da5c, bytearray([enemy_ids[world.acting_enemy_list["Mostly Bad Fly"]]])) + rom.write_bytes(0x10da60, bytearray([enemy_ids[world.acting_enemy_list["Slimy Little Pile"]]])) + rom.write_bytes(0x10da63, bytearray([enemy_ids[world.acting_enemy_list["Mostly Bad Fly"]]])) + rom.write_bytes(0x10da67, bytearray([enemy_ids[world.acting_enemy_list["Slimy Little Pile"]]])) + rom.write_bytes(0x10da6a, bytearray([enemy_ids[world.acting_enemy_list["Mostly Bad Fly"]]])) + rom.write_bytes(0x10da6e, bytearray([enemy_ids[world.acting_enemy_list["Slimy Little Pile"]]])) + rom.write_bytes(0x10da72, bytearray([enemy_ids[world.acting_enemy_list["Slimy Little Pile"]]])) + rom.write_bytes(0x10da76, bytearray([enemy_ids[world.acting_enemy_list["Slimy Little Pile"]]])) + rom.write_bytes(0x10da7a, bytearray([enemy_ids[world.acting_enemy_list["Farm Zombie"]]])) + rom.write_bytes(0x10da7e, bytearray([enemy_ids[world.acting_enemy_list["Farm Zombie"]]])) + rom.write_bytes(0x10da82, bytearray([enemy_ids[world.acting_enemy_list["Struttin' Evil Mushroom"]]])) + rom.write_bytes(0x10da85, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10da89, bytearray([enemy_ids[world.acting_enemy_list["Struttin' Evil Mushroom"]]])) + rom.write_bytes(0x10da8c, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10da8f, bytearray([enemy_ids[world.acting_enemy_list["Ranboob"]]])) + rom.write_bytes(0x10da93, bytearray([enemy_ids[world.acting_enemy_list["Ranboob"]]])) + rom.write_bytes(0x10da97, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10da9a, bytearray([enemy_ids[world.acting_enemy_list["Ranboob"]]])) + rom.write_bytes(0x10da9e, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10daa1, bytearray([enemy_ids[world.acting_enemy_list["Ranboob"]]])) + rom.write_bytes(0x10daa5, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10daa8, bytearray([enemy_ids[world.acting_enemy_list["Struttin' Evil Mushroom"]]])) + rom.write_bytes(0x10daac, bytearray([enemy_ids[world.acting_enemy_list["Struttin' Evil Mushroom"]]])) + rom.write_bytes(0x10daaf, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10dab2, bytearray([enemy_ids[world.acting_enemy_list["Ranboob"]]])) + rom.write_bytes(0x10dab6, bytearray([enemy_ids[world.acting_enemy_list["Struttin' Evil Mushroom"]]])) + rom.write_bytes(0x10dab9, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10dabc, bytearray([enemy_ids[world.acting_enemy_list["Ranboob"]]])) + rom.write_bytes(0x10dac0, bytearray([enemy_ids[world.acting_enemy_list["Ranboob"]]])) + rom.write_bytes(0x10dac4, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10dac7, bytearray([enemy_ids[world.acting_enemy_list["Struttin' Evil Mushroom"]]])) + rom.write_bytes(0x10dacb, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10dace, bytearray([enemy_ids[world.acting_enemy_list["Struttin' Evil Mushroom"]]])) + rom.write_bytes(0x10dad2, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10dad6, bytearray([enemy_ids[world.acting_enemy_list["Struttin' Evil Mushroom"]]])) + rom.write_bytes(0x10dada, bytearray([enemy_ids[world.acting_enemy_list["Gigantic Ant"]]])) + rom.write_bytes(0x10dade, bytearray([enemy_ids[world.acting_enemy_list["Gigantic Ant"]]])) + rom.write_bytes(0x10dae2, bytearray([enemy_ids[world.acting_enemy_list["Thirsty Coil Snake"]]])) + rom.write_bytes(0x10dae5, bytearray([enemy_ids[world.acting_enemy_list["Gigantic Ant"]]])) + rom.write_bytes(0x10dae9, bytearray([enemy_ids[world.acting_enemy_list["Thirsty Coil Snake"]]])) + rom.write_bytes(0x10daed, bytearray([enemy_ids[world.acting_enemy_list["Thirsty Coil Snake"]]])) + rom.write_bytes(0x10daf1, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10daf4, bytearray([enemy_ids[world.acting_enemy_list["Thirsty Coil Snake"]]])) + rom.write_bytes(0x10daf8, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10dafc, bytearray([enemy_ids[world.acting_enemy_list["Noose Man"]]])) + rom.write_bytes(0x10daff, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10db03, bytearray([enemy_ids[world.acting_enemy_list["Noose Man"]]])) + rom.write_bytes(0x10db06, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10db0a, bytearray([enemy_ids[world.acting_enemy_list["Noose Man"]]])) + rom.write_bytes(0x10db0d, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10db11, bytearray([enemy_ids[world.acting_enemy_list["Noose Man"]]])) + rom.write_bytes(0x10db14, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10db18, bytearray([enemy_ids[world.acting_enemy_list["Noose Man"]]])) + rom.write_bytes(0x10db1b, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10db1f, bytearray([enemy_ids[world.acting_enemy_list["Noose Man"]]])) + rom.write_bytes(0x10db22, bytearray([enemy_ids[world.acting_enemy_list["Gigantic Ant"]]])) + rom.write_bytes(0x10db26, bytearray([enemy_ids[world.acting_enemy_list["Noose Man"]]])) + rom.write_bytes(0x10db29, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10db2d, bytearray([enemy_ids[world.acting_enemy_list["Noose Man"]]])) + rom.write_bytes(0x10db30, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10db34, bytearray([enemy_ids[world.acting_enemy_list["Noose Man"]]])) + rom.write_bytes(0x10db38, bytearray([enemy_ids[world.acting_enemy_list["Noose Man"]]])) + rom.write_bytes(0x10db3b, bytearray([enemy_ids[world.acting_enemy_list["Gigantic Ant"]]])) + rom.write_bytes(0x10db3f, bytearray([enemy_ids[world.acting_enemy_list["Musica"]]])) + rom.write_bytes(0x10db42, bytearray([enemy_ids[world.acting_enemy_list["Mystical Record"]]])) + rom.write_bytes(0x10db46, bytearray([enemy_ids[world.acting_enemy_list["Musica"]]])) + rom.write_bytes(0x10db49, bytearray([enemy_ids[world.acting_enemy_list["Mystical Record"]]])) + rom.write_bytes(0x10db4d, bytearray([enemy_ids[world.acting_enemy_list["Musica"]]])) + rom.write_bytes(0x10db51, bytearray([enemy_ids[world.acting_enemy_list["Scalding Coffee Cup"]]])) + rom.write_bytes(0x10db54, bytearray([enemy_ids[world.acting_enemy_list["Mystical Record"]]])) + rom.write_bytes(0x10db58, bytearray([enemy_ids[world.acting_enemy_list["Scalding Coffee Cup"]]])) + rom.write_bytes(0x10db5b, bytearray([enemy_ids[world.acting_enemy_list["Mystical Record"]]])) + rom.write_bytes(0x10db5f, bytearray([enemy_ids[world.acting_enemy_list["Scalding Coffee Cup"]]])) + rom.write_bytes(0x10db63, bytearray([enemy_ids[world.acting_enemy_list["Mystical Record"]]])) + rom.write_bytes(0x10db67, bytearray([enemy_ids[world.acting_enemy_list["Stinky Ghost"]]])) + rom.write_bytes(0x10db6b, bytearray([enemy_ids[world.acting_enemy_list["Deadly Mouse"]]])) + rom.write_bytes(0x10db6e, bytearray([enemy_ids[world.acting_enemy_list["Stinky Ghost"]]])) + rom.write_bytes(0x10db72, bytearray([enemy_ids[world.acting_enemy_list["Filthy Attack Roach"]]])) + rom.write_bytes(0x10db76, bytearray([enemy_ids[world.acting_enemy_list["Filthy Attack Roach"]]])) + rom.write_bytes(0x10db7a, bytearray([enemy_ids[world.acting_enemy_list["Deadly Mouse"]]])) + rom.write_bytes(0x10db7e, bytearray([enemy_ids[world.acting_enemy_list["Deadly Mouse"]]])) + rom.write_bytes(0x10db81, bytearray([enemy_ids[world.acting_enemy_list["Stinky Ghost"]]])) + rom.write_bytes(0x10db85, bytearray([enemy_ids[world.acting_enemy_list["Stinky Ghost"]]])) + rom.write_bytes(0x10db89, bytearray([enemy_ids[world.acting_enemy_list["Deadly Mouse"]]])) + rom.write_bytes(0x10db8c, bytearray([enemy_ids[world.acting_enemy_list["Stinky Ghost"]]])) + rom.write_bytes(0x10db90, bytearray([enemy_ids[world.acting_enemy_list["Filthy Attack Roach"]]])) + rom.write_bytes(0x10db94, bytearray([enemy_ids[world.acting_enemy_list["Filthy Attack Roach"]]])) + rom.write_bytes(0x10db98, bytearray([enemy_ids[world.acting_enemy_list["Filthy Attack Roach"]]])) + rom.write_bytes(0x10db9c, bytearray([enemy_ids[world.acting_enemy_list["Filthy Attack Roach"]]])) + rom.write_bytes(0x10dba0, bytearray([enemy_ids[world.acting_enemy_list["Deadly Mouse"]]])) + rom.write_bytes(0x10dba4, bytearray([enemy_ids[world.acting_enemy_list["Deadly Mouse"]]])) + rom.write_bytes(0x10dba8, bytearray([enemy_ids[world.acting_enemy_list["Thunder Mite"]]])) + rom.write_bytes(0x10dbac, bytearray([enemy_ids[world.acting_enemy_list["Tangoo"]]])) + rom.write_bytes(0x10dbb0, bytearray([enemy_ids[world.acting_enemy_list["Thunder Mite"]]])) + rom.write_bytes(0x10dbb3, bytearray([enemy_ids[world.acting_enemy_list["Tangoo"]]])) + rom.write_bytes(0x10dbb7, bytearray([enemy_ids[world.acting_enemy_list["Tangoo"]]])) + rom.write_bytes(0x10dbba, bytearray([enemy_ids[world.acting_enemy_list["Kiss of Death"]]])) + rom.write_bytes(0x10dbbe, bytearray([enemy_ids[world.acting_enemy_list["Thunder Mite"]]])) + rom.write_bytes(0x10dbc1, bytearray([enemy_ids[world.acting_enemy_list["Tangoo"]]])) + rom.write_bytes(0x10dbc5, bytearray([enemy_ids[world.acting_enemy_list["Tangoo"]]])) + rom.write_bytes(0x10dbc9, bytearray([enemy_ids[world.acting_enemy_list["Thunder Mite"]]])) + rom.write_bytes(0x10dbcd, bytearray([enemy_ids[world.acting_enemy_list["Conducting Menace"]]])) + rom.write_bytes(0x10dbd0, bytearray([enemy_ids[world.acting_enemy_list["Tangoo"]]])) + rom.write_bytes(0x10dbd4, bytearray([enemy_ids[world.acting_enemy_list["Conducting Menace"]]])) + rom.write_bytes(0x10dbd8, bytearray([enemy_ids[world.acting_enemy_list["Kiss of Death"]]])) + rom.write_bytes(0x10dbdc, bytearray([enemy_ids[world.acting_enemy_list["Kiss of Death"]]])) + rom.write_bytes(0x10dbdf, bytearray([enemy_ids[world.acting_enemy_list["Conducting Menace"]]])) + rom.write_bytes(0x10dbe3, bytearray([enemy_ids[world.acting_enemy_list["Conducting Menace"]]])) + rom.write_bytes(0x10dbe7, bytearray([enemy_ids[world.acting_enemy_list["Conducting Menace"]]])) + rom.write_bytes(0x10dbea, bytearray([enemy_ids[world.acting_enemy_list["Tangoo"]]])) + rom.write_bytes(0x10dbee, bytearray([enemy_ids[world.acting_enemy_list["Conducting Menace"]]])) + rom.write_bytes(0x10dbf1, bytearray([enemy_ids[world.acting_enemy_list["Tangoo"]]])) + rom.write_bytes(0x10dbf4, bytearray([enemy_ids[world.acting_enemy_list["Kiss of Death"]]])) + rom.write_bytes(0x10dbf8, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dbfc, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc00, bytearray([enemy_ids[world.acting_enemy_list["Fierce Shattered Man"]]])) + rom.write_bytes(0x10dc04, bytearray([enemy_ids[world.acting_enemy_list["Fierce Shattered Man"]]])) + rom.write_bytes(0x10dc07, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc0b, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc0f, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc13, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc17, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc1b, bytearray([enemy_ids[world.acting_enemy_list["Petrified Royal Guard"]]])) + rom.write_bytes(0x10dc1e, bytearray([enemy_ids[world.acting_enemy_list["Lethal Asp Hieroglyph"]]])) + rom.write_bytes(0x10dc22, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc25, bytearray([enemy_ids[world.acting_enemy_list["Guardian Hieroglyph"]]])) + rom.write_bytes(0x10dc29, bytearray([enemy_ids[world.acting_enemy_list["Fierce Shattered Man"]]])) + rom.write_bytes(0x10dc2d, bytearray([enemy_ids[world.acting_enemy_list["Fierce Shattered Man"]]])) + rom.write_bytes(0x10dc30, bytearray([enemy_ids[world.acting_enemy_list["Petrified Royal Guard"]]])) + rom.write_bytes(0x10dc34, bytearray([enemy_ids[world.acting_enemy_list["Petrified Royal Guard"]]])) + rom.write_bytes(0x10dc38, bytearray([enemy_ids[world.acting_enemy_list["Lethal Asp Hieroglyph"]]])) + rom.write_bytes(0x10dc3c, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc40, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc44, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc48, bytearray([enemy_ids[world.acting_enemy_list["Arachnid!!!"]]])) + rom.write_bytes(0x10dc4c, bytearray([enemy_ids[world.acting_enemy_list["Fierce Shattered Man"]]])) + rom.write_bytes(0x10dc50, bytearray([enemy_ids[world.acting_enemy_list["Fierce Shattered Man"]]])) + rom.write_bytes(0x10dc53, bytearray([enemy_ids[world.acting_enemy_list["Petrified Royal Guard"]]])) + rom.write_bytes(0x10dc57, bytearray([enemy_ids[world.acting_enemy_list["Petrified Royal Guard"]]])) + rom.write_bytes(0x10dc5a, bytearray([enemy_ids[world.acting_enemy_list["Lethal Asp Hieroglyph"]]])) + rom.write_bytes(0x10dc5e, bytearray([enemy_ids[world.acting_enemy_list["Fierce Shattered Man"]]])) + rom.write_bytes(0x10dc61, bytearray([enemy_ids[world.acting_enemy_list["Guardian Hieroglyph"]]])) + rom.write_bytes(0x10dc65, bytearray([enemy_ids[world.acting_enemy_list["Scalding Coffee Cup"]]])) + rom.write_bytes(0x10dc68, bytearray([enemy_ids[world.acting_enemy_list["Mystical Record"]]])) + rom.write_bytes(0x10dc6b, bytearray([enemy_ids[world.acting_enemy_list["Worthless Protoplasm"]]])) + rom.write_bytes(0x10dc6f, bytearray([enemy_ids[world.acting_enemy_list["Cute Li'l UFO"]]])) + rom.write_bytes(0x10dc73, bytearray([enemy_ids[world.acting_enemy_list["Cute Li'l UFO"]]])) + rom.write_bytes(0x10dc77, bytearray([enemy_ids[world.acting_enemy_list["Dali's Clock"]]])) + rom.write_bytes(0x10dc7b, bytearray([enemy_ids[world.acting_enemy_list["Robo-pump"]]])) + rom.write_bytes(0x10dc7e, bytearray([enemy_ids[world.acting_enemy_list["Enraged Fire Plug"]]])) + rom.write_bytes(0x10dc82, bytearray([enemy_ids[world.acting_enemy_list["Robo-pump"]]])) + rom.write_bytes(0x10dc86, bytearray([enemy_ids[world.acting_enemy_list["Enraged Fire Plug"]]])) + rom.write_bytes(0x10dc8a, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10dc8e, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10dc92, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10dc95, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dc99, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dc9d, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dca1, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10dca5, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10dca9, bytearray([enemy_ids[world.acting_enemy_list["Lesser Mook"]]])) + rom.write_bytes(0x10dcad, bytearray([enemy_ids[world.acting_enemy_list["Worthless Protoplasm"]]])) + rom.write_bytes(0x10dcb1, bytearray([enemy_ids[world.acting_enemy_list["Worthless Protoplasm"]]])) + rom.write_bytes(0x10dcb5, bytearray([enemy_ids[world.acting_enemy_list["Worthless Protoplasm"]]])) + rom.write_bytes(0x10dcb9, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dcbd, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dcc1, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dcc5, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dcc9, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dccd, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dcd1, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dcd5, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dcd8, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dcdc, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dcdf, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dce3, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dce7, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dceb, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dcee, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dcf2, bytearray([enemy_ids[world.acting_enemy_list["Mook Senior"]]])) + rom.write_bytes(0x10dcf5, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dcf9, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dcfd, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dd00, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dd04, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dd07, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dd0b, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + rom.write_bytes(0x10dd0f, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dd12, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + rom.write_bytes(0x10dd16, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + rom.write_bytes(0x10dd19, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dd1d, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dd20, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + rom.write_bytes(0x10dd24, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dd27, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dd2a, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + rom.write_bytes(0x10dd2e, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dd31, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10dd34, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + rom.write_bytes(0x10dd38, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + rom.write_bytes(0x10dd3b, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dd3f, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + rom.write_bytes(0x10dd42, bytearray([enemy_ids[world.acting_enemy_list["Military Octobot"]]])) + rom.write_bytes(0x10dd46, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dd49, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + rom.write_bytes(0x10dd4d, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dd50, bytearray([enemy_ids[world.acting_enemy_list["Military Octobot"]]])) + rom.write_bytes(0x10dd54, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dd57, bytearray([enemy_ids[world.acting_enemy_list["Military Octobot"]]])) + rom.write_bytes(0x10dd5b, bytearray([enemy_ids[world.acting_enemy_list["Atomic Power Robot"]]])) + rom.write_bytes(0x10dd5e, bytearray([enemy_ids[world.acting_enemy_list["Military Octobot"]]])) + rom.write_bytes(0x10dd62, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10dd66, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10dd6a, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10dd6e, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10dd72, bytearray([enemy_ids[world.acting_enemy_list["Uncontrollable Sphere"]]])) + rom.write_bytes(0x10dd75, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10dd79, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10dd7d, bytearray([enemy_ids[world.acting_enemy_list["Hyper Spinning Robo"]]])) + rom.write_bytes(0x10dd80, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10dd84, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10dd88, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10dd8c, bytearray([enemy_ids[world.acting_enemy_list["Conducting Spirit"]]])) + rom.write_bytes(0x10dd8f, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x10dd93, bytearray([enemy_ids[world.acting_enemy_list["Uncontrollable Sphere"]]])) + rom.write_bytes(0x10dd96, bytearray([enemy_ids[world.acting_enemy_list["Conducting Spirit"]]])) + rom.write_bytes(0x10dd9a, bytearray([enemy_ids[world.acting_enemy_list["Uncontrollable Sphere"]]])) + rom.write_bytes(0x10dd9e, bytearray([enemy_ids[world.acting_enemy_list["Conducting Spirit"]]])) + rom.write_bytes(0x10dda2, bytearray([enemy_ids[world.acting_enemy_list["Conducting Spirit"]]])) + rom.write_bytes(0x10dda6, bytearray([enemy_ids[world.acting_enemy_list["Hyper Spinning Robo"]]])) + rom.write_bytes(0x10dda9, bytearray([enemy_ids[world.acting_enemy_list["Conducting Spirit"]]])) + rom.write_bytes(0x10ddad, bytearray([enemy_ids[world.acting_enemy_list["Conducting Spirit"]]])) + rom.write_bytes(0x10ddb1, bytearray([enemy_ids[world.acting_enemy_list["Uncontrollable Sphere"]]])) + rom.write_bytes(0x10ddb4, bytearray([enemy_ids[world.acting_enemy_list["Conducting Spirit"]]])) + rom.write_bytes(0x10ddb8, bytearray([enemy_ids[world.acting_enemy_list["Hyper Spinning Robo"]]])) + rom.write_bytes(0x10ddbb, bytearray([enemy_ids[world.acting_enemy_list["Conducting Spirit"]]])) + rom.write_bytes(0x10ddbf, bytearray([enemy_ids[world.acting_enemy_list["Hyper Spinning Robo"]]])) + rom.write_bytes(0x10ddc3, bytearray([enemy_ids[world.acting_enemy_list["Hyper Spinning Robo"]]])) + rom.write_bytes(0x10ddc6, bytearray([enemy_ids[world.acting_enemy_list["Uncontrollable Sphere"]]])) + rom.write_bytes(0x10ddca, bytearray([enemy_ids[world.acting_enemy_list["Soul Consuming Flame"]]])) + rom.write_bytes(0x10ddce, bytearray([enemy_ids[world.acting_enemy_list["Psychic Psycho"]]])) + rom.write_bytes(0x10ddd2, bytearray([enemy_ids[world.acting_enemy_list["Evil Elemental"]]])) + rom.write_bytes(0x10ddd6, bytearray([enemy_ids[world.acting_enemy_list["Evil Elemental"]]])) + rom.write_bytes(0x10ddd9, bytearray([enemy_ids[world.acting_enemy_list["Soul Consuming Flame"]]])) + rom.write_bytes(0x10dddd, bytearray([enemy_ids[world.acting_enemy_list["Evil Elemental"]]])) + rom.write_bytes(0x10dde0, bytearray([enemy_ids[world.acting_enemy_list["Soul Consuming Flame"]]])) + rom.write_bytes(0x10dde4, bytearray([enemy_ids[world.acting_enemy_list["Evil Elemental"]]])) + rom.write_bytes(0x10dde8, bytearray([enemy_ids[world.acting_enemy_list["Evil Elemental"]]])) + rom.write_bytes(0x10ddeb, bytearray([enemy_ids[world.acting_enemy_list["Soul Consuming Flame"]]])) + rom.write_bytes(0x10ddef, bytearray([enemy_ids[world.acting_enemy_list["Soul Consuming Flame"]]])) + rom.write_bytes(0x10ddf3, bytearray([enemy_ids[world.acting_enemy_list["Soul Consuming Flame"]]])) + rom.write_bytes(0x10ddf7, bytearray([enemy_ids[world.acting_enemy_list["Psychic Psycho"]]])) + rom.write_bytes(0x10ddfa, bytearray([enemy_ids[world.acting_enemy_list["Major Psychic Psycho"]]])) + rom.write_bytes(0x10ddfe, bytearray([enemy_ids[world.acting_enemy_list["Evil Elemental"]]])) + rom.write_bytes(0x10de01, bytearray([enemy_ids[world.acting_enemy_list["Psychic Psycho"]]])) + rom.write_bytes(0x10de05, bytearray([enemy_ids[world.acting_enemy_list["Soul Consuming Flame"]]])) + rom.write_bytes(0x10de08, bytearray([enemy_ids[world.acting_enemy_list["Major Psychic Psycho"]]])) + rom.write_bytes(0x10de0c, bytearray([enemy_ids[world.acting_enemy_list["Soul Consuming Flame"]]])) + rom.write_bytes(0x10de0f, bytearray([enemy_ids[world.acting_enemy_list["Major Psychic Psycho"]]])) + rom.write_bytes(0x10de13, bytearray([enemy_ids[world.acting_enemy_list["Soul Consuming Flame"]]])) + rom.write_bytes(0x10de17, bytearray([enemy_ids[world.acting_enemy_list["Ghost of Starman"]]])) + rom.write_bytes(0x10de1a, bytearray([enemy_ids[world.acting_enemy_list["Nuclear Reactor Robot"]]])) + rom.write_bytes(0x10de1e, bytearray([enemy_ids[world.acting_enemy_list["Wild 'n Wooly Shambler"]]])) + rom.write_bytes(0x10de21, bytearray([enemy_ids[world.acting_enemy_list["Ultimate Octobot"]]])) + rom.write_bytes(0x10de25, bytearray([enemy_ids[world.acting_enemy_list["Ultimate Octobot"]]])) + rom.write_bytes(0x10de28, bytearray([enemy_ids[world.acting_enemy_list["Nuclear Reactor Robot"]]])) + rom.write_bytes(0x10de2c, bytearray([enemy_ids[world.acting_enemy_list["Squatter Demon"]]])) + rom.write_bytes(0x10de30, bytearray([enemy_ids[world.acting_enemy_list["Ghost of Starman"]]])) + rom.write_bytes(0x10de33, bytearray([enemy_ids[world.acting_enemy_list["Wild 'n Wooly Shambler"]]])) + rom.write_bytes(0x10de37, bytearray([enemy_ids[world.acting_enemy_list["Ghost of Starman"]]])) + rom.write_bytes(0x10de3a, bytearray([enemy_ids[world.acting_enemy_list["Nuclear Reactor Robot"]]])) + rom.write_bytes(0x10de3e, bytearray([enemy_ids[world.acting_enemy_list["Nuclear Reactor Robot"]]])) + rom.write_bytes(0x10de41, bytearray([enemy_ids[world.acting_enemy_list["Final Starman"]]])) + rom.write_bytes(0x10de45, bytearray([enemy_ids[world.acting_enemy_list["Ghost of Starman"]]])) + rom.write_bytes(0x10de48, bytearray([enemy_ids[world.acting_enemy_list["Final Starman"]]])) + rom.write_bytes(0x10de4c, bytearray([enemy_ids[world.acting_enemy_list["Ghost of Starman"]]])) + rom.write_bytes(0x10de4f, bytearray([enemy_ids[world.acting_enemy_list["Final Starman"]]])) + rom.write_bytes(0x10de52, bytearray([enemy_ids[world.acting_enemy_list["Nuclear Reactor Robot"]]])) + rom.write_bytes(0x10de56, bytearray([enemy_ids[world.acting_enemy_list["Bionic Kraken"]]])) + rom.write_bytes(0x10de5a, bytearray([enemy_ids[world.acting_enemy_list["Mobile Sprout"]]])) + rom.write_bytes(0x10de5d, bytearray([enemy_ids[world.acting_enemy_list["Ramblin' Evil Mushroom"]]])) + rom.write_bytes(0x10de61, bytearray([enemy_ids[world.acting_enemy_list["Mobile Sprout"]]])) + rom.write_bytes(0x10de65, bytearray([enemy_ids[world.acting_enemy_list["Mobile Sprout"]]])) + rom.write_bytes(0x10de69, bytearray([enemy_ids[world.acting_enemy_list["Insane Cultist"]]])) + rom.write_bytes(0x10de6d, bytearray([enemy_ids[world.acting_enemy_list["Insane Cultist"]]])) + rom.write_bytes(0x10de71, bytearray([enemy_ids[world.acting_enemy_list["Zombie Possessor"]]])) + rom.write_bytes(0x10de75, bytearray([enemy_ids[world.acting_enemy_list["Mr. Batty"]]])) + rom.write_bytes(0x10de79, bytearray([enemy_ids[world.acting_enemy_list["Mr. Batty"]]])) + rom.write_bytes(0x10de7c, bytearray([enemy_ids[world.acting_enemy_list["Zombie Possessor"]]])) + rom.write_bytes(0x10de80, bytearray([enemy_ids[world.acting_enemy_list["Skelpion"]]])) + rom.write_bytes(0x10de84, bytearray([enemy_ids[world.acting_enemy_list["Mad Taxi"]]])) + rom.write_bytes(0x10de88, bytearray([enemy_ids[world.acting_enemy_list["Criminal Caterpillar"]]])) + rom.write_bytes(0x10de8c, bytearray([enemy_ids[world.acting_enemy_list["Master Criminal Worm"]]])) + rom.write_bytes(0x10de94, bytearray([enemy_ids[world.acting_enemy_list["Coil Snake"]]])) + rom.write_bytes(0x10de98, bytearray([enemy_ids[world.acting_enemy_list["Coil Snake"]]])) + rom.write_bytes(0x10de9c, bytearray([enemy_ids[world.acting_enemy_list["Mole Playing Rough"]]])) + rom.write_bytes(0x10dea0, bytearray([enemy_ids[world.acting_enemy_list["Mole Playing Rough"]]])) + rom.write_bytes(0x10dea4, bytearray([enemy_ids[world.acting_enemy_list["Mole Playing Rough"]]])) + rom.write_bytes(0x10dea8, bytearray([enemy_ids[world.acting_enemy_list["Skate Punk"]]])) + rom.write_bytes(0x10deab, bytearray([enemy_ids[world.acting_enemy_list["Pogo Punk"]]])) + rom.write_bytes(0x10deae, bytearray([enemy_ids[world.acting_enemy_list["Yes Man Junior"]]])) + rom.write_bytes(0x10deb2, bytearray([enemy_ids[world.acting_enemy_list["Pogo Punk"]]])) + rom.write_bytes(0x10deb6, bytearray([enemy_ids[world.acting_enemy_list["Yes Man Junior"]]])) + rom.write_bytes(0x10deba, bytearray([enemy_ids[world.acting_enemy_list["Insane Cultist"]]])) + rom.write_bytes(0x10debe, bytearray([enemy_ids[world.acting_enemy_list["Unassuming Local Guy"]]])) + rom.write_bytes(0x10dec2, bytearray([enemy_ids[world.acting_enemy_list["Insane Cultist"]]])) + rom.write_bytes(0x10dec5, bytearray([enemy_ids[world.acting_enemy_list["Spiteful Crow"]]])) + rom.write_bytes(0x10dec9, bytearray([enemy_ids[world.acting_enemy_list["Slimy Little Pile"]]])) + rom.write_bytes(0x10decd, bytearray([enemy_ids[world.acting_enemy_list["Enraged Fire Plug"]]])) + rom.write_bytes(0x10ded1, bytearray([enemy_ids[world.acting_enemy_list["Robo-pump"]]])) + rom.write_bytes(0x10ded5, bytearray([enemy_ids[world.acting_enemy_list["Abstract Art"]]])) + rom.write_bytes(0x10ded9, bytearray([enemy_ids[world.acting_enemy_list["Sentry Robot"]]])) + rom.write_bytes(0x10dedd, bytearray([enemy_ids[world.acting_enemy_list["Shattered Man"]]])) + rom.write_bytes(0x10dee1, bytearray([enemy_ids[world.acting_enemy_list["Guardian Hieroglyph"]]])) + rom.write_bytes(0x10dee5, bytearray([enemy_ids[world.acting_enemy_list["Lethal Asp Hieroglyph"]]])) + rom.write_bytes(0x10dee9, bytearray([enemy_ids[world.acting_enemy_list["Mad Duck"]]])) + rom.write_bytes(0x10deed, bytearray([enemy_ids[world.acting_enemy_list["Worthless Protoplasm"]]])) + rom.write_bytes(0x10def1, bytearray([enemy_ids[world.acting_enemy_list["Rowdy Mouse"]]])) + rom.write_bytes(0x10dF00, bytearray([enemy_ids[world.acting_enemy_list["Black Antoid (2)"]]])) + rom.write_bytes(0x10df04, bytearray([enemy_ids[world.acting_enemy_list["Cop"]]])) + rom.write_bytes(0x10df1b, bytearray([enemy_ids[world.acting_enemy_list["Slimy Little Pile"]]])) + rom.write_bytes(0x10df22, bytearray([enemy_ids[world.acting_enemy_list["Tough Mobile Sprout"]]])) + rom.write_bytes(0x10df31, bytearray([enemy_ids[world.acting_enemy_list["Insane Cultist"]]])) + rom.write_bytes(0x10df4c, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) + rom.write_bytes(0x10df4f, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + rom.write_bytes(0x10df5e, bytearray([enemy_ids[world.acting_enemy_list["Even Slimier Little Pile"]]])) + + # Calls for help + + if not world.options.randomize_enemy_attacks: + rom.write_bytes(0x15A601, bytearray([enemy_ids[world.acting_enemy_list["Care Free Bomb"]]])) # Loaded Dice + rom.write_bytes(0x15A602, bytearray([enemy_ids[world.acting_enemy_list["Beautiful UFO"]]])) + rom.write_bytes(0x15A603, bytearray([enemy_ids[world.acting_enemy_list["High-class UFO"]]])) + rom.write_bytes(0x15A604, bytearray([enemy_ids[world.acting_enemy_list["Care Free Bomb"]]])) + + rom.write_bytes(0x15DD73, bytearray([enemy_ids[world.acting_enemy_list["Electro Swoosh"]]])) # Loaded Dice 2 + rom.write_bytes(0x15DD74, bytearray([enemy_ids[world.acting_enemy_list["Fobby"]]])) + rom.write_bytes(0x15DD75, bytearray([enemy_ids[world.acting_enemy_list["Uncontrollable Sphere"]]])) + rom.write_bytes(0x15DD76, bytearray([enemy_ids[world.acting_enemy_list["Electro Swoosh"]]])) + + rom.write_bytes(0x15AD5B, bytearray([enemy_ids[world.acting_enemy_list["Yes Man Junior"]]])) # Skate Punk + rom.write_bytes(0x15AD5C, bytearray([enemy_ids[world.acting_enemy_list["Pogo Punk"]]])) + + rom.write_bytes(0x15AED2, bytearray([enemy_ids[world.acting_enemy_list["Starman"]]])) # S Super + + rom.write_bytes(0x15B108, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) # SDX + rom.write_bytes(0x15DA86, bytearray([enemy_ids[world.acting_enemy_list["Starman Super"]]])) + + rom.write_bytes(0x15DC5B, bytearray([enemy_ids[world.acting_enemy_list["Slimy Little Pile"]]])) # Belch + rom.write_bytes(0x15B801, bytearray([enemy_ids[world.acting_enemy_list["Slimy Little Pile"]]])) + + rom.write_bytes(0x15DD15, bytearray([enemy_ids[world.acting_enemy_list["Even Slimier Little Pile"]]])) # Barf + + rom.write_bytes(0x0F92F4, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Skate Punk"]])) + rom.write_bytes(0x0F9305, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Pogo Punk"]])) + rom.write_bytes(0x0F8997, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Yes Man Junior"]])) + rom.write_bytes(0x0F89A8, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Pogo Punk"]])) + rom.write_bytes(0x0F89B9, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Skate Punk"]])) + rom.write_bytes(0x0F89CA, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Pogo Punk"]])) + rom.write_bytes(0x0F89DB, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Yes Man Junior"]])) + rom.write_bytes(0x0F89FD, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Skate Punk"]])) + + rom.write_bytes(0x0FA2A0, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA2B1, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA2C2, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA2D3, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA2E4, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA2F5, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA306, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA317, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA328, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA339, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA34A, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA35B, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA36C, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA37D, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA38E, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA39F, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA427, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA6BE, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA6CF, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA6E0, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Spiteful Crow"]])) + rom.write_bytes(0x0FA4E2, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Unassuming Local Guy"]])) + rom.write_bytes(0x0FA3B0, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA3C1, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + rom.write_bytes(0x0FA3D2, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]])) + + rom.write_bytes(0x0FCE85, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Shattered Man"]])) + rom.write_bytes(0x0FCE96, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Shattered Man"]])) + + rom.write_bytes(0x0FB6D0, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Rowdy Mouse"]])) + rom.write_bytes(0x0FB6E1, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Rowdy Mouse"]])) + rom.write_bytes(0x0FB6AE, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Worthless Protoplasm"]])) + rom.write_bytes(0x0FB6BF, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Worthless Protoplasm"]])) + rom.write_bytes(0x0FB68C, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Mad Duck"]])) + rom.write_bytes(0x0FB69D, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Mad Duck"]])) + + rom.write_bytes(0x0FD716, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD727, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD738, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Lethal Asp Hieroglyph"]])) + rom.write_bytes(0x0FD749, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Lethal Asp Hieroglyph"]])) + rom.write_bytes(0x0FD75A, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD76B, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD77C, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD78D, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Lethal Asp Hieroglyph"]])) + rom.write_bytes(0x0FD79E, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD7AF, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Lethal Asp Hieroglyph"]])) + rom.write_bytes(0x0FD7C0, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD7D1, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Lethal Asp Hieroglyph"]])) + rom.write_bytes(0x0FD7F3, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD804, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD815, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD826, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Lethal Asp Hieroglyph"]])) + rom.write_bytes(0x0FD837, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD848, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD859, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Lethal Asp Hieroglyph"]])) + rom.write_bytes(0x0FD86A, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD87B, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD88C, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Guardian Hieroglyph"]])) + rom.write_bytes(0x0FD89D, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Lethal Asp Hieroglyph"]])) + rom.write_bytes(0x0FD8AE, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Lethal Asp Hieroglyph"]])) + + rom.write_bytes(0x0F8E1B, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Cop"]])) + rom.write_bytes(0x0F8E2C, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Cop"]])) + rom.write_bytes(0x0F8E5F, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Cop"]])) + rom.write_bytes(0x0F8E70, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Cop"]])) + rom.write_bytes(0x0F8E81, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Cop"]])) + rom.write_bytes(0x0F8E92, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Cop"]])) + rom.write_bytes(0x0F8EA3, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Cop"]])) + rom.write_bytes(0x0F9316, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Cop"]])) + rom.write_bytes(0x0F9327, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Cop"]])) + + rom.write_bytes(0x0FE409, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Robo-pump"]])) + rom.write_bytes(0x0FE491, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Robo-pump"]])) + rom.write_bytes(0x0FE43C, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Abstract Art"]])) + + rom.write_bytes(0x0FD9F1, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Mad Duck"]])) + rom.write_bytes(0x0FDA02, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Mad Duck"]])) + rom.write_bytes(0x0FDA13, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Mad Duck"]])) + rom.write_bytes(0x0FDA24, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Slimy Little Pile"]])) + rom.write_bytes(0x0FDA35, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Slimy Little Pile"]])) + rom.write_bytes(0x0FDA46, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Slimy Little Pile"]])) + rom.write_bytes(0x0FDA57, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Gruff Goat"]])) + rom.write_bytes(0x0FDA68, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Gruff Goat"]])) + + rom.write_bytes(0x0FB736, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Slimy Little Pile"]])) + rom.write_bytes(0x0FB747, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Slimy Little Pile"]])) + rom.write_bytes(0x0FB758, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Slimy Little Pile"]])) + rom.write_bytes(0x0FB769, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Slimy Little Pile"]])) + rom.write_bytes(0x0FB77A, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Slimy Little Pile"]])) + + rom.write_bytes(0x0FC3E5, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Sentry Robot"]])) + rom.write_bytes(0x0FC3F6, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Sentry Robot"]])) + rom.write_bytes(0x0FC407, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Sentry Robot"]])) + rom.write_bytes(0x0FC418, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Sentry Robot"]])) + rom.write_bytes(0x0FC48F, struct.pack("H", world.enemy_sprites[world.acting_enemy_list["Sentry Robot"]])) + + dungeon_zoo = [ + "Mad Duck", + "Gruff Goat", + "Slimy Little Pile" + ] + + name_addresses = [ + 0x330544, + 0x330555, + 0x330566 + ] + + desc_addresses = [ + 0x33054B, + 0x33055C, + 0x33056D + ] + + normal_pointers = { + "Mad Duck": 0xC8796C, + "Gruff Goat": 0xC879A3, + "Slimy Little Pile": 0xC87A31 + } + + pointer = 0x313000 + + if world.enemy_sprites[world.acting_enemy_list["Insane Cultist"]] not in can_walkthrough: + rom.write_bytes(0x0983D2, bytearray([0x1f, 0x1e, 0x7A, 0x01, 0x00, 0x00, 0x00, 0x00])) + rom.write_bytes(0x098459, bytearray([0x1f, 0x1e, 0x7B, 0x01, 0x00, 0x00, 0x00, 0x00])) + rom.write_bytes(0x0984D1, bytearray([0x1f, 0x1e, 0x7C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00])) + rom.write_bytes(0x09855F, bytearray([0x1f, 0x1e, 0x7D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00])) + rom.write_bytes(0x0985CE, bytearray([0x1f, 0x1e, 0x7E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00])) + rom.write_bytes(0x098625, bytearray([0x1f, 0x1e, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00])) + rom.write_bytes(0x09869E, bytearray([0x1f, 0x1e, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00])) + + rom.write_bytes(0x098375, bytearray([0x44])) + rom.write_bytes(0x098425, bytearray([0x44])) + rom.write_bytes(0x098480, bytearray([0x44])) + rom.write_bytes(0x098518, bytearray([0x44])) + rom.write_bytes(0x098599, bytearray([0x44])) + rom.write_bytes(0x098603, bytearray([0x44])) + rom.write_bytes(0x09864C, bytearray([0x44])) + + for i in range(3): + + name = text_encoder(world.acting_enemy_list[dungeon_zoo[i]].replace(" (2)", ""), 255) + name.append(0x02) + + if world.acting_enemy_list[dungeon_zoo[i]] not in dungeon_zoo: + text = text_encoder(enemy_descriptions[world.acting_enemy_list[dungeon_zoo[i]]], 255) + text.append(0x02) + else: + text = text_encoder("ERROR", 255) + rom.write_bytes(pointer, name) + rom.write_bytes(name_addresses[i], struct.pack("I", pointer + 0xC00000)) + pointer += len(name) + rom.write_bytes(pointer, text) + if world.acting_enemy_list[dungeon_zoo[i]] not in dungeon_zoo: + rom.write_bytes(desc_addresses[i], struct.pack("I", pointer + 0xC00000)) + else: + rom.write_bytes(desc_addresses[i], struct.pack("I", + normal_pointers[world.acting_enemy_list[dungeon_zoo[i]]])) + pointer += len(text) + # Todo; action scripts for npc enemies? diff --git a/worlds/earthbound/modules/equipamizer.py b/worlds/earthbound/modules/equipamizer.py new file mode 100644 index 0000000000..5c7bdebd7d --- /dev/null +++ b/worlds/earthbound/modules/equipamizer.py @@ -0,0 +1,994 @@ +from dataclasses import dataclass +import copy +from ..game_data.text_data import text_encoder, calc_pixel_width +from ..Options import Armorizer, Weaponizer +from operator import attrgetter +import struct +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import EarthBoundWorld + from ..Rom import LocalRom + +@dataclass +class EBArmor: + address: int + equip_type: str + defense: int = 0 + aux_stat: int = 0 + poo_def: int = 0 + flash_res: int = 0 + freeze_res: int = 0 + fire_res: int = 0 + par_res: int = 0 + sleep_res: int = 0 + name: str = "None" + can_equip: str = "All" + total_resistance = 0 + double_price_item: str = "None" + + +@dataclass +class EBWeapon: + can_equip: str + equip_type: str + address: int + name: str = "None" + offense: int = 0 + aux_stat: int = 0 + poo_off: int = 0 + miss_rate: int = 0 + double_price_item: str = "None" + + +def roll_resistances(world: "EarthBoundWorld", element: str, armor: EBArmor) -> None: + chance = world.random.randint(0, 100) + if chance < world.options.armorizer_resistance_chance.value: + setattr(armor, element, world.random.randint(1, 3)) + else: + setattr(armor, element, 0) + + +def price_weapons(world: "EarthBoundWorld", weapons: list[EBWeapon], rom: "LocalRom") -> None: + for index, weapon in enumerate(weapons): + if weapon.can_equip == "Poo": + price = 10 * weapon.poo_off + else: + price = 10 * weapon.offense + + if price > 300: + price = price * 2 + + price += (20 * weapon.aux_stat) + price -= (50 * weapon.miss_rate) + price += world.random.randint(-20, 20) + price = max(5, price) + rom.write_bytes((weapon.address + 26), struct.pack("H", price)) + if weapon.double_price_item in summers_addresses: + price = min(0xFFFF, price * 2) + rom.write_bytes((summers_addresses[weapon.double_price_item] + 26), struct.pack("H", price)) + + +def price_armors(world: "EarthBoundWorld", armor_pricing_list: list[EBArmor], rom: "LocalRom") -> None: + for index, armor in enumerate(armor_pricing_list): + if armor.can_equip == "Poo": + price = 10 * armor.poo_def + else: + price = 10 * armor.defense + + if price > 300: + price = price * 2 + price += (20 * armor.aux_stat) + price += (50 * armor.fire_res) + price += (50 * armor.freeze_res) + price += (50 * armor.flash_res) + price += (50 * armor.par_res) + price += world.random.randint(-20, 20) + price = max(5, price) + rom.write_bytes((armor.address + 26), struct.pack("H", price)) + if armor.double_price_item in summers_addresses: + price = min(0xFFFF, price * 2) + rom.write_bytes((summers_addresses[armor.double_price_item] + 26), struct.pack("H", price)) + + +def apply_progressive_weapons(world: "EarthBoundWorld", weapons: list[str], progressives: list[str], rom: "LocalRom") -> None: + for index, item in enumerate(weapons): + weapon = world.weapon_list[item] + weapon.offense = progressives[index].offense + rom.write_bytes(weapon.address + 31, bytearray([weapon.offense])) + + +def apply_progressive_armor(world: "EarthBoundWorld", armors: list[str], progressives: list[str], rom: "LocalRom") -> None: + for index, item in enumerate(armors): + armor = world.armor_list[item] + armor.defense = progressives[index].defense + rom.write_bytes(armor.address + 31, bytearray([armor.defense])) + + +adjectives = [ + "Hard", + "Wild", + "Boring", + "Lavish", + "Grouchy", + "Elastic", + "Unsightly", + "Long", + "Wide", + "Cheap", + "Copper", + "Silver", + "Gold", + "Platinum", + "Diamond", + "Jade", + "Ruby", + "Sapphire", + "Pearl", + "Dull", + "Cold", + "Fair", + "Awful", + "Bad", + "Dry", + "Wet", + "Shiny", + "Damp", + "Elite", + "Beefy", + "Better", + "Alright", + "Okay", + "Metal", + "Pixie's", + "Cherub's", + "Demon's", + "Goddess", + "Sprite's", + "Fairy's", + "Devil's", + "Best", + "Spiteful", + "Travel", + "Great", + "Crystal", + "Baseball", + "Holmes", + "Red", + "Talisman", + "Defense", + "Mr. Saturn", + "Slumber", + "Lucky", + "Shiny", + "Souvenir", + "Silence", + "Ultimate", + "Charm", + "Saturn", + "Tenda", + "Sturdy", + "Sleek", + "Green", + "Blue", + "White", + "Yellow", + "Azure", + "Emerald", + "Handmade", + "Hank's", + "Real", + "Peace", + "Magic", + "Protect", + "Brass", + "Cursed", + "Rabbit's", + "Odd", + "Cheese", + "Casual", + "Silk", + "Gutsy", + "Hyper", + "Crusher", + "Thick", + "Deluxe", + "Chef's", + "Cracked", + "Plastic", + "Cotton", + "Mr. Baseball", + "Razor", + "Gilded", + "Master", + "Fighter's", + "Worn", + "Magicant", + "Happy", + "Well-Done", + "Rare", + "Gnarly", + "Wicked", + "Bionic", + "Combat", + "Tee ball", + "Sand lot", + "Minor league", + "Big league", + "Hall of fame", + "Famous", + "Legendary", + "Casey", + "French", + "Holy", + "Pop", + "Zip", + "Gaia", + "Baddest", + "Death", + "Spectrum", + "Laser", + "Moon", + "Toy", + "Magnum", + "Stun", + "Trick", + "Dirty", + "Washed", + "Laundered", + "Fresh", + "New", + "Old", + "Alien", + "T-rex's", + "Double", + "Non-stick", + "Football", + "Tennis", + "Golf", + "Hockey", + "Burnt", + "Boiled" +] + +char_nums = { + "Ness": 0x01, + "Paula": 0x02, + "Jeff": 0x03, + "Poo": 0x04 +} + +usage_bytes = { + "All": 0x0F, + "Ness": 0x01, + "Paula": 0x02, + "Jeff": 0x04, + "Poo": 0x08 +} + +type_bytes = { + "body": 0x14, + "arm": 0x18, + "other": 0x1C, + "Bash": 0x10, + "Shoot": 0x11 +} + +summers_addresses = { + "Platinum Band": 0x155A5C, + "Diamond Band": 0x155A83, + "Big League Bat": 0x15535A +} + +royal_names = [ + "of kings", + "of dukes", + "of princes", + "of barons", + "of lords", + "of sultans", + "of counts", + "of England" +] + + +def randomize_armor(world: "EarthBoundWorld", rom: "LocalRom") -> None: + if world.options.equipamizer_cap_stats: + armor_caps = { + "body": 30, + "arm": 80, + "other": 110 + + } + else: + armor_caps = { + "body": 127, + "arm": 127, + "other": 127 + } + + other_adjectives = adjectives.copy() + arm_adjectives = adjectives.copy() + body_adjectives = adjectives.copy() + taken_names = [] + + armor_dict = { + "arm": arm_adjectives, + "body": body_adjectives, + "other": other_adjectives + } + + equalized_names = [ + "Mild", + "Earth", + "Sea" + ] + + ult_names = [ + "Day", + "Sun", + "Star" + ] + + elemental_names = { + "Flash": [ + "Dark", + "Cloud", + "Night" + ], + "Freeze": [ + "Puddle", + "Drizzle", + "Rain" + ], + + "Fire": [ + "Smoke", + "Ember", + "Flame" + ] + } + + plain_elemental_names = [ + "Dark", + "Cloud", + "Night", + "Puddle", + "Drizzle", + "Rain", + "Smoke", + "Ember", + "Flame", + "Mild", + "Earth", + "Sea", + "Day", + "Sun", + "Star" + ] + + all_armor = [ + "Travel Charm", + "Great Charm", + "Crystal Charm", + "Rabbit's Foot", + "Flame Pendant", + "Rain Pendant", + "Night Pendant", + "Sea Pendant", + "Star Pendant", + "Cloak of Kings", + "Cheap Bracelet", + "Copper Bracelet", + "Silver Bracelet", + "Gold Bracelet", + "Platinum Band", + "Diamond Band", + "Pixie's Bracelet", + "Cherub's Band", + "Goddess Band", + "Bracer of Kings", + "Baseball Cap", + "Mr. Baseball Cap", + "Holmes Hat", + "Hard Hat", + "Coin of Slumber", + "Coin of Defense", + "Coin of Silence", + "Mr. Saturn Coin", + "Charm Coin", + "Lucky Coin", + "Talisman Coin", + "Shiny Coin", + "Souvenir Coin", + "Diadem of Kings", + "Earth Pendant", + "Saturn Ribbon", + "Ribbon", + "Red Ribbon", + "Defense Ribbon", + "Talisman Ribbon", + "Goddess Ribbon", + ] + + char_armor_names = { + "Ness": { + "body": "tee", + "arm": "mitt", + "other": "pack" + }, + + "Paula": { + "body": "dress", + "arm": "ring", + "other": "ribbon" + }, + + "Jeff": { + "body": "tie", + "arm": "watch", + "other": "glasses" + }, + } + + aux_stat = { + "arm": "Luck", + "body": "Speed", + "other": "Luck" + } + + armor_names = { + "body": ["pendant", "charm", "foot", "brooch", "shirt", + "amulet", "cloak", "suit", "plate", "vest", "coat", "jersey", "poncho"], + "arm": ["bracelet", "band", "bracer", "gauntlet", "sleeve", "glove", "bangle", "armlet", "sweatband"], + "other": ["cap", "hat", "coin", "crown", "diadem", "helmet", "mask", "wig", "pants", "jeans", "greaves", "boot"] + } + + res_strength = [ + ", just a little bit", + " somewhat", + "" + ] + + progressive_bracelets = [ + ] + + progressive_others = [ + ] + + world.armor_list = { + "Travel Charm": EBArmor(0x15583A, "body"), + "Great Charm": EBArmor(0x155861, "body"), + "Crystal Charm": EBArmor(0x155888, "body"), + "Rabbit's Foot": EBArmor(0x1558AF, "body"), + "Flame Pendant": EBArmor(0x1558D6, "body"), + "Rain Pendant": EBArmor(0x1558FD, "body"), + "Night Pendant": EBArmor(0x155924, "body"), + "Sea Pendant": EBArmor(0x15594B, "body"), + "Star Pendant": EBArmor(0x155972, "body"), + "Cloak of Kings": EBArmor(0x155999, "body"), + "Cheap Bracelet": EBArmor(0x1559C0, "arm"), + "Copper Bracelet": EBArmor(0x1559E7, "arm"), + "Silver Bracelet": EBArmor(0x155A0E, "arm"), + "Gold Bracelet": EBArmor(0x155A35, "arm"), + "Platinum Band": EBArmor(0x1570E8, "arm"), + "Diamond Band": EBArmor(0x15710F, "arm"), + "Pixie's Bracelet": EBArmor(0x155AAA, "arm"), + "Cherub's Band": EBArmor(0x155AD1, "arm"), + "Goddess Band": EBArmor(0x155AF8, "arm"), + "Bracer of Kings": EBArmor(0x155B1F, "arm"), + "Baseball Cap": EBArmor(0x155B46, "other"), + "Mr. Baseball Cap": EBArmor(0x155B94, "other"), + "Holmes Hat": EBArmor(0x155B6D, "other"), + "Hard Hat": EBArmor(0x155BBB, "other"), + "Ribbon": EBArmor(0x155BE2, "other"), + "Red Ribbon": EBArmor(0x155C09, "other"), + "Goddess Ribbon": EBArmor(0x155C30, "other"), + "Coin of Slumber": EBArmor(0x155C57, "other"), + "Coin of Defense": EBArmor(0x155C7E, "other"), + "Coin of Silence": EBArmor(0x1571AB, "other"), + "Mr. Saturn Coin": EBArmor(0x1575EF, "other"), + "Lucky Coin": EBArmor(0x155CA5, "other"), + "Charm Coin": EBArmor(0x1571D2, "other"), + "Talisman Coin": EBArmor(0x155CCC, "other"), + "Shiny Coin": EBArmor(0x155CF3, "other"), + "Souvenir Coin": EBArmor(0x155D1A, "other"), + "Diadem of Kings": EBArmor(0x155D41, "other"), + "Earth Pendant": EBArmor(0x156D8E, "body"), + "Defense Ribbon": EBArmor(0x157136, "other"), + "Talisman Ribbon": EBArmor(0x15715D, "other"), + "Saturn Ribbon": EBArmor(0x157184, "other"), + } + + for item in all_armor: + armor = world.armor_list[item] + if world.options.armorizer == Armorizer.option_chaos: + armor.equip_type = world.random.choice(["arm", "body", "other"]) + + if armor.equip_type == "arm": + progressive_bracelets.append(item) + elif armor.equip_type == "other" and armor.can_equip == "All": + progressive_others.append(item) + + if item in summers_addresses: + armor.double_price_item = item + armor.defense = world.random.randint(1, armor_caps[armor.equip_type]) + + chance = world.random.randint(0, 100) + if chance < 8: + armor.aux_stat = world.random.randint(1, 127) + else: + armor.aux_stat = 0 + + if armor.equip_type != "arm": + roll_resistances(world, "flash_res", armor) + roll_resistances(world, "freeze_res", armor) + roll_resistances(world, "fire_res", armor) + roll_resistances(world, "par_res", armor) + armor.sleep_res = 0 + else: + armor.flash_res = 0 + armor.freeze_res = 0 + armor.fire_res = 0 + armor.par_res = 0 + # Only Arm gear can have sleep resistance; arm gear cannot have elemental resistance + roll_resistances(world, "sleep_res", armor) + + if armor.flash_res + armor.freeze_res + armor.fire_res == 0: + # If no resistances are active use a normal name + front_name = world.random.choice(armor_dict[armor.equip_type]) + armor_dict[armor.equip_type].remove(front_name) + elif armor.flash_res == armor.freeze_res == armor.fire_res: + # Get a combined name for the level + front_name = equalized_names[armor.flash_res - 1] + elif armor.par_res == armor.flash_res == armor.freeze_res == armor.fire_res: + # Should be used if Paralysis + the others all succeed + front_name = ult_names[armor.flash_res - 1] + else: + # If resistances are inequal, use the strongest as the name and pull a name from its strength + # If 2 are equal pick a random of them + names = ("Flash", "Freeze", "Fire") + strengths = (armor.flash_res, armor.freeze_res, armor.fire_res) + best_elements = [(name, strength) for name, strength in zip(names, strengths) if strength == max(strengths)] + best_name, best_strength = world.random.choice(best_elements) + front_name = elemental_names[best_name][best_strength - 1] + + chance = world.random.randint(0, 100) + if chance < 10: + armor.can_equip = world.random.choice(["Ness", "Paula", "Jeff", "Poo"]) + else: + armor.can_equip = "All" + + if armor.can_equip == "Poo": + back_name = world.random.choice(royal_names) + front_name = world.random.choice(armor_names[armor.equip_type]).capitalize() + elif armor.can_equip in ["Ness", "Paula", "Jeff"]: + back_name = char_armor_names[armor.can_equip][armor.equip_type] + else: + back_name = world.random.choice(armor_names[armor.equip_type]) + + armor.name = front_name + " " + back_name + if armor.name in taken_names: + front_name = world.random.choice(armor_dict[armor.equip_type]) + armor_dict[armor.equip_type].remove(front_name) + armor.name = front_name + " " + back_name + + pixel_length = calc_pixel_width(armor.name) + first_armor = False + if armor.can_equip == "Poo": + names_to_try = royal_names.copy() + else: + names_to_try = armor_names[armor.equip_type].copy() + + while pixel_length > 70 or armor.name in taken_names: + # First we replace any spaces with half-width spaces, a common tech used in vanilla to fix long names + if first_armor is False: + armor.name = armor.name.replace(" ", " ") + first_armor = True + else: + if names_to_try and front_name not in plain_elemental_names: + # If it's still too long, change the second part of the name to try and roll a shorter name + back_name = world.random.choice(names_to_try) + names_to_try.remove(back_name) + else: + # If it's *STILL* too long, chop a letter off the end of the front + front_name = front_name[:-1] + if front_name == "": + # we ran out of letters rip + front_name = "Long" + first_armor = False + armor.name = front_name + " " + back_name + + pixel_length = calc_pixel_width(armor.name) + + taken_names.append(armor.name) + armor.total_resistance = (1 * armor.fire_res) + (4 * armor.freeze_res) + (16 * armor.flash_res) + (64 * armor.par_res) + rom.write_bytes(armor.address + 28, bytearray([usage_bytes[armor.can_equip]])) + rom.write_bytes(armor.address + 25, bytearray([type_bytes[armor.equip_type]])) + + sortable_armor = copy.deepcopy(world.armor_list) + sorted_armor = sorted(sortable_armor.values(), key=attrgetter("defense")) + + sorted_arm_gear = [armor for armor in sorted_armor if armor.equip_type == "arm"] + sorted_body_gear = [armor for armor in sorted_armor if armor.equip_type == "body"] + sorted_other_gear = [armor for armor in sorted_armor if armor.equip_type == "other"] + + sorts = [ + sorted_arm_gear, + sorted_other_gear, + sorted_body_gear, + ] + + prog_armors = [ + progressive_bracelets, + progressive_others + ] + + if world.options.progressive_armor: + for i in range(2): + apply_progressive_armor(world, prog_armors[i], sorts[i], rom) + + for i in range(3): + price_armors(world, sorts[i], rom) + + for item in all_armor: + armor = world.armor_list[item] + + if armor.can_equip != "Poo": + armor.poo_def = 216 # defense is signed, all non-kings equipment has this value + else: + armor.poo_def = armor.defense + + rom.write_bytes(armor.address + 31, bytearray([armor.defense, armor.poo_def, armor.aux_stat, armor.total_resistance])) + + item_name = text_encoder(armor.name, 25) + item_name.extend([0x00]) + + description = f" “{armor.name}”\n" + if armor.can_equip != "All": + description += f"@♪'s {armor.equip_type} equipment.\n" + else: + if armor.equip_type == "other": + description += "@Must be equipped as “other”.\n" + else: + description += f"@Must be equipped on your {armor.equip_type}.\n" + + if armor.can_equip == "Poo": + description += f"@+{armor.poo_def} Defense.\n" + else: + description += f"@+{armor.defense} Defense.\n" + if armor.aux_stat > 0: + description += f"@+{armor.aux_stat} {aux_stat[armor.equip_type]}. \n" + + if armor.flash_res > 0: + description += f"@Protects against Flash attacks{res_strength[armor.flash_res - 1]}.\n" + + if armor.freeze_res > 0: + description += f"@Protects against Freeze attacks{res_strength[armor.freeze_res - 1]}.\n" + + if armor.fire_res > 0: + description += f"@Protects against Fire attacks{res_strength[armor.fire_res - 1]}.\n" + + if armor.par_res > 0: + description += f"@Protects against Paralysis{res_strength[armor.par_res - 1]}.\n" + + if armor.sleep_res > 0: + description += f"@Protects against Sleep{res_strength[armor.sleep_res - 1]}.\n" + + description = text_encoder(description, 0x100) + description = description[:-2] + description.extend([0x13, 0x02]) + + if armor.can_equip != "All": + index = description.index(0xAC) + description[index:index + 1] = bytearray([0x1C, 0x02, char_nums[armor.can_equip]]) + + rom.write_bytes(armor.address, item_name) + rom.write_bytes((0x310000 + world.description_pointer), description) + rom.write_bytes((armor.address + 35), struct.pack("I", (0xF10000 + world.description_pointer))) + if item in ["Platinum Band", "Diamond Band"]: + rom.write_bytes(summers_addresses[item] + 28, bytearray([usage_bytes[armor.can_equip]])) + rom.write_bytes(summers_addresses[item] + 31, bytearray([armor.defense, armor.poo_def, armor.aux_stat, armor.total_resistance])) + rom.write_bytes(summers_addresses[item] + 25, bytearray([type_bytes[armor.equip_type]])) + rom.write_bytes(summers_addresses[item], item_name) + rom.write_bytes((summers_addresses[item] + 35), struct.pack("I", (0xF10000 + world.description_pointer))) + world.description_pointer += len(description) + + +def randomize_weapons(world: "EarthBoundWorld", rom: "LocalRom") -> None: + if world.options.equipamizer_cap_stats: + weapon_cap = 120 + else: + weapon_cap = 127 + + weapon_names = { + "Ness": ["bat", "stick", "club", "board", "racket", "cue", "pole", "paddle"], + "Paula": ["fry pan", "frypan", "skillet", "whisk", "saucepan", "pin"], + "Jeff": ["gun", "beam", "air gun", "beam gun", "cannon", "blaster", "pistol", "revolver", "shotgun", "rifle"], + "Poo": ["Sword", "Katana", "Knife", "Scissor", "Cutter", "Blade", "Chisel", "Saw", "Axe", "Scalpel", "Sabre"], + "All": ["yo-yo", "slingshot", "boomerang", "chakram", "bow"] + } + + taken_names = [] + + miss_rates = { + "Ness": 1, + "Paula": 1, + "Jeff": 0, + "Poo": 0, + "All": 3 + } + + progressive_bats = [ + ] + + progressive_pans = [ + ] + + progressive_guns = [ + ] + + progressive_alls = [ + ] + + starting_weapons = { + "Ness": "Tee Ball Bat", + "Paula": "Fry Pan", + "Jeff": "Pop Gun", + "Poo": "None" + } + + starting_weapon = starting_weapons[world.starting_character] + + world.weapon_list = { + "Cracked Bat": EBWeapon("Ness", "Bash", 0x155297), + "Tee Ball Bat": EBWeapon("Ness", "Bash", 0x1552BE), + "Sand Lot Bat": EBWeapon("Ness", "Bash", 0x1552E5), + "Minor League Bat": EBWeapon("Ness", "Bash", 0x15530C), + "Mr. Baseball Bat": EBWeapon("Ness", "Bash", 0x155333), + "Big League Bat": EBWeapon("Ness", "Bash", 0x157073), + "Hall of Fame Bat": EBWeapon("Ness", "Bash", 0x155381), + "Magicant Bat": EBWeapon("Ness", "Bash", 0x1553A8), + "Legendary Bat": EBWeapon("Ness", "Bash", 0x1553CF), + "Gutsy Bat": EBWeapon("Ness", "Bash", 0x1553F6), + "Casey Bat": EBWeapon("Ness", "Bash", 0x15541D), + "Fry Pan": EBWeapon("Paula", "Bash", 0x155444), + "Thick Fry Pan": EBWeapon("Paula", "Bash", 0x15546B), + "Deluxe Fry Pan": EBWeapon("Paula", "Bash", 0x155492), + "Chef's Fry Pan": EBWeapon("Paula", "Bash", 0x1554B9), + "French Fry Pan": EBWeapon("Paula", "Bash", 0x1554E0), + "Magic Fry Pan": EBWeapon("Paula", "Bash", 0x155507), + "Holy Fry Pan": EBWeapon("Paula", "Bash", 0x15552E), + "Sword of Kings": EBWeapon("Poo", "Bash", 0x155555), + "Pop Gun": EBWeapon("Jeff", "Shoot", 0x15557C), + "Stun Gun": EBWeapon("Jeff", "Shoot", 0x1555A3), + "Toy Air Gun": EBWeapon("Jeff", "Shoot", 0x1555CA), + "Magnum Air Gun": EBWeapon("Jeff", "Shoot", 0x1555F1), + "Zip Gun": EBWeapon("Jeff", "Shoot", 0x155618), + "Laser Gun": EBWeapon("Jeff", "Shoot", 0x15563F), + "Hyper Beam": EBWeapon("Jeff", "Shoot", 0x155666), + "Crusher Beam": EBWeapon("Jeff", "Shoot", 0x15568D), + "Spectrum Beam": EBWeapon("Jeff", "Shoot", 0x1556B4), + "Death Ray": EBWeapon("Jeff", "Shoot", 0x1556DB), + "Baddest Beam": EBWeapon("Jeff", "Shoot", 0x155702), + "Moon Beam Gun": EBWeapon("Jeff", "Shoot", 0x155729), + "Gaia Beam": EBWeapon("Jeff", "Shoot", 0x155750), + "Yo-yo": EBWeapon("All", "Shoot", 0x155777), + "Slingshot": EBWeapon("All", "Shoot", 0x15579E), + "Bionic Slingshot": EBWeapon("All", "Shoot", 0x1557C5), + "Trick Yo-yo": EBWeapon("All", "Shoot", 0x1557EC), + "Combat Yo-yo": EBWeapon("All", "Shoot", 0x155813), + "T-Rex's Bat": EBWeapon("Ness", "Bash", 0x15704C), + "Ultimate Bat": EBWeapon("Ness", "Bash", 0x15709A), + "Double Beam": EBWeapon("Jeff", "Shoot", 0x1570C1), + "Non-stick Frypan": EBWeapon("Paula", "Bash", 0x1575C8) + } + + all_weapons = [ + "Cracked Bat", + "Tee Ball Bat", + "Sand Lot Bat", + "Minor League Bat", + "Mr. Baseball Bat", + "T-Rex's Bat", + "Big League Bat", + "Hall of Fame Bat", + "Ultimate Bat", + "Casey Bat", + "Magicant Bat", + "Legendary Bat", + "Gutsy Bat", + + "Fry Pan", + "Thick Fry Pan", + "Deluxe Fry Pan", + "Chef's Fry Pan", + "Non-stick Frypan", + "French Fry Pan", + "Holy Fry Pan", + "Magic Fry Pan", + + "Sword of Kings", + "Pop Gun", + "Stun Gun", + "Toy Air Gun", + "Magnum Air Gun", + "Zip Gun", + "Laser Gun", + "Hyper Beam", + "Double Beam", + "Crusher Beam", + "Spectrum Beam", + "Death Ray", + "Baddest Beam", + "Moon Beam Gun", + "Gaia Beam", + "Yo-yo", + "Slingshot", + "Bionic Slingshot", + "Trick Yo-yo", + "Combat Yo-yo" + ] + + for item in all_weapons: + weapon = world.weapon_list[item] + + if world.options.weaponizer == Weaponizer.option_chaos: + chance = world.random.randint(1, 100) + if chance < 8: + weapon.can_equip = "All" + else: + weapon.can_equip = world.random.choice(["Ness", "Paula", "Jeff", "Poo"]) + + if item == starting_weapon: + weapon.can_equip = world.starting_character + + if item in summers_addresses: + weapon.double_price_item = item + + if weapon.can_equip == "Ness": + progressive_bats.append(item) + elif weapon.can_equip == "Paula": + progressive_pans.append(item) + elif weapon.can_equip == "Jeff": + progressive_guns.append(item) + + if item == starting_weapon and not world.options.progressive_weapons: # Todo; remove not progressive weapons + weapon.offense = 10 + else: + if world.options.progressive_weapons: + weapon.offense = world.random.randint(10, weapon_cap) + else: + weapon.offense = world.random.randint(1, weapon_cap) + + if weapon.can_equip == "Poo": + front_name = world.random.choice(weapon_names[weapon.can_equip]) + back_name = world.random.choice(royal_names) + else: + front_name = world.random.choice(adjectives) + back_name = world.random.choice(weapon_names[weapon.can_equip]) + + chance = world.random.randint(0, 100) + if chance < 8: + weapon.aux_stat = world.random.randint(1, 127) + else: + weapon.aux_stat = 0 + + if weapon.can_equip in ["Jeff", "All"]: + weapon.equip_type = "Shoot" + else: + weapon.equip_type = "Bash" + + chance = world.random.randint(1, 100) + if chance < 4 and item != starting_weapon: + weapon.miss_rate = 12 + else: + weapon.miss_rate = miss_rates[weapon.can_equip] + + weapon.name = front_name + " " + back_name + + pixel_length = calc_pixel_width(weapon.name) + half_space = False + + if weapon.can_equip == "Poo": + names_to_try = royal_names.copy() + else: + names_to_try = weapon_names[weapon.can_equip].copy() + + while pixel_length > 70 or weapon.name in taken_names: + # First we replace any spaces with half-width spaces, a common tech used in vanilla to fix long names + if half_space is False: + weapon.name = weapon.name.replace(" ", " ") + half_space = True + else: + if names_to_try: + # If it's still too long, change the second part of the name to try and roll a shorter name + back_name = world.random.choice(names_to_try) + names_to_try.remove(back_name) + else: + # If it's *STILL* too long, chop a letter off the end of the front + front_name = front_name[:-1] + if front_name == "": + # we ran out of letters rip + front_name = "Long" + half_space = False + weapon.name = front_name + " " + back_name + pixel_length = calc_pixel_width(weapon.name) + rom.write_bytes(weapon.address + 28, bytearray([usage_bytes[weapon.can_equip]])) + rom.write_bytes(weapon.address + 25, bytearray([type_bytes[weapon.equip_type]])) + taken_names.append(weapon.name) + + sortable_weapons = copy.deepcopy(world.weapon_list) + sorted_weapons = sorted(sortable_weapons.values(), key=attrgetter("offense")) + + sorted_bats = [weapon for weapon in sorted_weapons if weapon.can_equip == "Ness"] + sorted_pans = [weapon for weapon in sorted_weapons if weapon.can_equip == "Paula"] + sorted_guns = [weapon for weapon in sorted_weapons if weapon.can_equip == "Jeff"] + sorted_swords = [weapon for weapon in sorted_weapons if weapon.can_equip == "Poo"] + sorted_alls = [weapon for weapon in sorted_weapons if weapon.can_equip == "All"] + + sorts = [ + sorted_bats, + sorted_pans, + sorted_guns, + sorted_alls, + sorted_swords + ] + + prog_weapons = [ + progressive_bats, + progressive_pans, + progressive_guns, + progressive_alls + ] + + for i in range(5): + price_weapons(world, sorts[i], rom) + + if world.options.progressive_weapons: + for i in range(4): + apply_progressive_weapons(world, prog_weapons[i], sorts[i], rom) + + for item in all_weapons: + weapon = world.weapon_list[item] + + if weapon.can_equip == "Poo": + weapon.poo_off = weapon.offense + else: + weapon.poo_off = 250 + + rom.write_bytes(weapon.address + 31, bytearray([ + weapon.offense, weapon.poo_off, weapon.aux_stat, weapon.miss_rate])) + + item_name = text_encoder(weapon.name, 25) + item_name.extend([0x00]) + + description = f" “{weapon.name}”\n" + if weapon.can_equip != "All": + description += f"@♪ can equip this weapon.\n" + + description += f"@+{weapon.offense} Offense.\n" + if weapon.aux_stat > 0: + description += f"@+{weapon.aux_stat} Guts.\n" + + if weapon.miss_rate == 12: + description += "@If you use this, you might just whiff.\n" + + description = text_encoder(description, 0x100) + description = description[:-2] + description.extend([0x13, 0x02]) + + if weapon.can_equip != "All": + index = description.index(0xAC) + description[index:index + 1] = bytearray([0x1C, 0x02, char_nums[weapon.can_equip]]) + + rom.write_bytes(weapon.address, item_name) + rom.write_bytes((0x310000 + world.description_pointer), description) + rom.write_bytes((weapon.address + 35), struct.pack("I", (0xF10000 + world.description_pointer))) + if item == "Big League Bat": + rom.write_bytes(summers_addresses[item] + 28, bytearray([usage_bytes[weapon.can_equip]])) + rom.write_bytes(summers_addresses[item] + 31, bytearray([weapon.offense, weapon.poo_off, weapon.aux_stat, weapon.miss_rate])) + rom.write_bytes(summers_addresses[item] + 25, bytearray([type_bytes[weapon.equip_type]])) + rom.write_bytes(summers_addresses[item], item_name) + rom.write_bytes((summers_addresses[item] + 35), struct.pack("I", (0xF10000 + world.description_pointer))) + world.description_pointer += len(description) + diff --git a/worlds/earthbound/modules/flavor_data.py b/worlds/earthbound/modules/flavor_data.py new file mode 100644 index 0000000000..f04f235586 --- /dev/null +++ b/worlds/earthbound/modules/flavor_data.py @@ -0,0 +1,328 @@ +from ..game_data.text_data import eb_text_table +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import EarthBoundWorld + +random_flavors = [ + "Mint flavor", + "Strawberry flavor", + "Banana flavor", + "Peanut flavor", + "Crystal flavor", + "Cherry flavor", + "Grape flavor", + "Blueberry flavor", + "Handheld flavor", + "Rotten flavor", + "Golden flavor", + "Herbal flavor", + "Cherry Cola flavor", + "Salt and Pepper flavor", + "Pizza flavor", + "Cotton Candy flavor", + "Potato flavor", + "Lemon-lime flavor", + "Raisin flavor", + "Chocolate flavor", + "Ginger Ale flavor", + "Orange Cream flavor", + "Choco Cream flavor", + "Doomed flavor", + "Farm flavor", + "Negative flavor", + "Astral flavor", + "Sunflower flavor", + "Encore flavor", + "Experimental flavor", + "Blueblue flavor", + "Deeppurple flavor", + "Rivalry flavor", + "Sugar flavor", + "Faith flavor", + "Wisdom flavor", + "Hamburger flavor", + "Spearmint flavor", + "Tuna flavor", + "Milk flavor", + "Peppermint flavor", + "Toothpaste flavor", + "Barbecue flavor", + "Lavender flavor", + "Apple flavor", + "Peach flavor", + "Bubblegum flavor", + "Orange flavor", + "Toilet flavor", + "Lemonade flavor", + "Garlic flavor" +] + + +flavor_data = { + "Cherry flavor": [0x00, 0x00, 0xde, 0x5f, 0x9c, 0x2d, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x77, 0xf2, 0x41, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0xbf, 0x57, 0xda, 0x28, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xba, 0x49, 0x3f, 0x56, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0x44, 0x06, 0x44, 0x2a, 0x80, 0x3b, 0x7f, 0x67, 0xda, 0x28, 0xaa, 0x28], + + "Grape flavor": [0x00, 0x00, 0xde, 0x5f, 0x9c, 0x2d, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x77, 0x2f, 0x4a, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0xbf, 0x57, 0x13, 0x4c, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xc8, 0x40, 0x2f, 0x55, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0x44, 0x30, 0x44, 0x30, 0x80, 0x3b, 0x5f, 0x63, 0xb2, 0x69, 0xc7, 0x28], + + "Blueberry flavor": [0x00, 0x00, 0xde, 0x5f, 0x9c, 0x2d, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x77, 0x4d, 0x4a, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0xbf, 0x57, 0x86, 0x7d, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x04, 0x41, 0x04, 0x56, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xbd, 0x77, 0x63, 0x30, 0x63, 0x30, 0x80, 0x3b, 0xb9, 0x77, 0xa4, 0x55, 0xc4, 0x28], + + "Handheld flavor": [0x00, 0x00, 0xff, 0x7f, 0xab, 0x29, 0xa3, 0x0c, 0x80, 0x3b, 0xff, 0x77, 0x6f, 0x36, 0xa3, 0x0c, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0xd4, 0x4e, 0xeb, 0x25, 0xa3, 0x0c, + 0x80, 0x3b, 0xff, 0x77, 0xec, 0x2d, 0x57, 0x5f, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xff, 0x77, 0x89, 0x25, 0xa3, 0x0c, 0x80, 0x3b, 0x50, 0x3e, 0xab, 0x29, 0x47, 0x1d], + + "Rotten flavor": [0x00, 0x00, 0xbf, 0x57, 0x9c, 0x2d, 0x25, 0x14, 0x80, 0x3b, 0xa8, 0x42, 0x84, 0x31, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0xbe, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0x16, 0x56, 0x84, 0x18, 0xc7, 0x24, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0x16, 0x56, 0x10, 0x20, 0x10, 0x20, 0x80, 0x3b, 0x18, 0x42, 0x8a, 0x30, 0x44, 0x20], + + "Golden flavor": [0x00, 0x00, 0xbf, 0x57, 0x9c, 0x2d, 0x25, 0x14, 0x80, 0x3b, 0xbf, 0x4b, 0x18, 0x22, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0xbe, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0xff, 0x6f, 0x50, 0x08, 0x58, 0x11, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xff, 0x6f, 0x9f, 0x30, 0x9f, 0x30, 0x80, 0x3b, 0xff, 0x63, 0xfd, 0x2a, 0xaa, 0x1c], + + "Herbal flavor": [0x00, 0x00, 0xbf, 0x57, 0x9c, 0x2d, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x77, 0x6d, 0x46, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0xbe, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0xdd, 0x6f, 0x86, 0x21, 0x69, 0x22, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xdd, 0x6f, 0x48, 0x6e, 0x48, 0x6e, 0x80, 0x3b, 0xba, 0x63, 0xaa, 0x2a, 0x06, 0x29], + + "Cherry Cola flavor": [0x00, 0x00, 0xde, 0x5f, 0x9c, 0x2d, 0x08, 0x14, 0x80, 0x3b, 0x9f, 0x2d, 0x76, 0x24, 0x08, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0xbf, 0x57, 0x9f, 0x2d, 0x08, 0x14, + 0x80, 0x3b, 0xff, 0x5e, 0x73, 0x04, 0x89, 0x00, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xff, 0x5e, 0x89, 0x00, 0x89, 0x00, 0x80, 0x3b, 0x9f, 0x2d, 0x89, 0x00, 0x08, 0x14], + + "Salt and Pepper flavor": [0x00, 0x00, 0xff, 0x7f, 0x39, 0x67, 0xa5, 0x20, 0x80, 0x3b, 0xff, 0x77, 0x0d, 0x4e, 0xa5, 0x20, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0x51, 0x4e, 0xdd, 0x7f, 0xa5, 0x20, + 0x00, 0x00, 0xff, 0x7f, 0x31, 0x52, 0x59, 0x77, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xff, 0x7f, 0x00, 0x00, 0x40, 0x10, 0x80, 0x3b, 0x30, 0x46, 0x6a, 0x2d, 0x83, 0x14], + + "Pizza flavor": [0x00, 0x00, 0xde, 0x5f, 0x39, 0x67, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x77, 0x1e, 0x0e, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x00, 0x00, 0x7f, 0x5b, 0xb5, 0x10, 0xbe, 0x2a, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0x52, 0x79, 0x52, 0x79, 0x80, 0x3b, 0x7f, 0x5b, 0xbe, 0x2a, 0xc7, 0x28], + + "Cotton Candy flavor": [0x00, 0x00, 0xde, 0x5f, 0x3f, 0x7f, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x77, 0x6a, 0x56, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x1b, 0x1c, 0x1b, 0x1c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x00, 0x00, 0x9f, 0x73, 0xf1, 0x62, 0xfe, 0x3d, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0x52, 0x79, 0x52, 0x79, 0x80, 0x3b, 0x9f, 0x73, 0xfe, 0x3d, 0xc7, 0x28], + + "Crystal flavor": [0x00, 0x00, 0xde, 0x5f, 0x8c, 0x31, 0x02, 0x28, 0x80, 0x3b, 0xff, 0x77, 0x6d, 0x3a, 0x02, 0x28, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x02, 0x28, + 0x80, 0x3b, 0xff, 0x7f, 0x00, 0x40, 0x00, 0x40, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0x52, 0x79, 0x52, 0x79, 0x80, 0x3b, 0xad, 0x35, 0x5a, 0x6b, 0xc6, 0x18], + + "Potato flavor": [0x00, 0x00, 0xde, 0x5f, 0x3f, 0x67, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x7b, 0x55, 0x4e, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0x48, 0x10, 0x57, 0x4a, 0x1b, 0x57, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0x48, 0x10, 0x18, 0x19, 0x18, 0x15, 0x80, 0x3b, 0xff, 0x73, 0x1c, 0x57, 0xca, 0x28], + + "Lemon-lime flavor": [0x00, 0x00, 0xde, 0x5f, 0x3f, 0x67, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x5b, 0x9e, 0x17, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x57, 0x25, 0x0a, 0x25, 0x14, + 0x80, 0x3b, 0x25, 0x0a, 0xfd, 0x37, 0xaf, 0x17, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0x25, 0x0a, 0xcf, 0x17, 0xcf, 0x17, 0x80, 0x3b, 0x25, 0x0a, 0xcf, 0x17, 0xc7, 0x28], + + "Raisin flavor": [0x00, 0x00, 0xde, 0x5f, 0x3f, 0x67, 0x25, 0x14, 0x80, 0x3b, 0x94, 0x61, 0x0a, 0x41, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0xfb, 0x6e, 0x44, 0x18, 0xc7, 0x20, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xfb, 0x6e, 0x95, 0x20, 0x95, 0x20, 0x80, 0x3b, 0xfb, 0x6e, 0x0c, 0x55, 0x84, 0x20], + + "Chocolate flavor": [0x00, 0x00, 0xde, 0x5f, 0x8e, 0x09, 0x43, 0x0c, 0x80, 0x3b, 0x37, 0x3a, 0x10, 0x21, 0x43, 0x0c, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x43, 0x0c, + 0x80, 0x3b, 0x3c, 0x57, 0x25, 0x0c, 0x8a, 0x10, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0x3c, 0x57, 0x38, 0x32, 0x38, 0x32, 0x80, 0x3b, 0xd2, 0x31, 0x88, 0x14, 0x43, 0x0c], + + "Ginger Ale flavor": [0x00, 0x00, 0xde, 0x5f, 0x8e, 0x09, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x6f, 0x6d, 0x3a, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xbf, 0x57, 0xed, 0x12, 0x25, 0x14, + 0x80, 0x3b, 0x9f, 0x57, 0xed, 0x12, 0x80, 0x11, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0x9f, 0x57, 0xb6, 0x09, 0xb6, 0x09, 0x80, 0x3b, 0x9f, 0x57, 0x80, 0x11, 0xe0, 0x00], + + "Orange Cream flavor": [0x00, 0x00, 0xde, 0x5f, 0x8e, 0x09, 0x25, 0x14, 0x80, 0x3b, 0x9f, 0x6b, 0x9f, 0x2a, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xbf, 0x57, 0x5f, 0x12, 0x25, 0x14, + 0x80, 0x3b, 0xda, 0x09, 0x3f, 0x53, 0x5f, 0x12, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xda, 0x09, 0x3f, 0x53, 0x3f, 0x53, 0x80, 0x3b, 0x9f, 0x6b, 0x5f, 0x12, 0x89, 0x00], + + "Amethyst flavor": [0x00, 0x00, 0xde, 0x5f, 0x8e, 0x09, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x77, 0xf2, 0x41, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xdf, 0x67, 0x3c, 0x78, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x73, 0xaf, 0x40, 0x3c, 0x78, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xde, 0x73, 0x1f, 0x68, 0x1f, 0x68, 0x80, 0x3b, 0x7f, 0x67, 0x3c, 0x78, 0xaf, 0x40], + + "Choco Cream flavor": [0x00, 0x00, 0xde, 0x5f, 0x8e, 0x09, 0x25, 0x14, 0x28, 0x21, 0xee, 0x39, 0x08, 0x25, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xdf, 0x67, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0xc8, 0x28, 0x18, 0x6b, 0xdf, 0x77, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xc8, 0x28, 0x70, 0x4b, 0x70, 0x4b, 0x80, 0x3b, 0xdf, 0x7b, 0xf8, 0x5e, 0x06, 0x29], + + "Doomed flavor": [0x00, 0x00, 0x1f, 0x00, 0x8e, 0x09, 0x25, 0x14, 0x00, 0x00, 0x19, 0x00, 0x0a, 0x00, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xdf, 0x67, 0x1f, 0x00, 0x25, 0x14, + 0x80, 0x3b, 0x1f, 0x00, 0x4a, 0x29, 0x2a, 0x29, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0x19, 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3b, 0xef, 0x3d, 0x6b, 0x2d, 0x84, 0x10], + + "Farm flavor": [0x00, 0x00, 0xbd, 0x32, 0x8e, 0x09, 0x4a, 0x04, 0x00, 0x00, 0xde, 0x32, 0x1a, 0x1e, 0x4a, 0x04, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xdf, 0x67, 0x7f, 0x02, 0x4a, 0x04, + 0x80, 0x3b, 0x4a, 0x00, 0x1f, 0x3b, 0x9d, 0x2e, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0x5f, 0x43, 0xbb, 0x3a, 0xbb, 0x3a, 0x80, 0x3b, 0x5e, 0x02, 0x36, 0x01, 0xf0, 0x04], + + "Inverted flavor": [0x00, 0x00, 0x00, 0x00, 0x8e, 0x09, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, + 0x80, 0x3b, 0x00, 0x00, 0xff, 0x7f, 0xff, 0x7f, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0xff, 0x7f, 0x80, 0x3b, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x00], + + "Negative flavor": [0x00, 0x00, 0xff, 0x7f, 0x8e, 0x09, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x00, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, + 0x80, 0x3b, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3b, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00], + + "Astral flavor": [0x00, 0x00, 0x5b, 0x7f, 0x8e, 0x09, 0x21, 0x14, 0x00, 0x00, 0xff, 0x77, 0xed, 0x58, 0x21, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xfa, 0x7a, 0x92, 0x6c, 0x21, 0x14, + 0x80, 0x3b, 0x5b, 0x7f, 0xed, 0x58, 0x87, 0x38, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0x5b, 0x7f, 0xd3, 0x79, 0xd3, 0x79, 0x80, 0x3b, 0xfa, 0x7a, 0xa8, 0x38, 0x21, 0x1c], + + "Sunflower flavor": [0x00, 0x00, 0xdf, 0x63, 0x8e, 0x09, 0x65, 0x04, 0x00, 0x00, 0xbf, 0x57, 0xb3, 0x15, 0x65, 0x04, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xdf, 0x57, 0x9a, 0x12, 0x65, 0x04, + 0x80, 0x3b, 0xdf, 0x63, 0x1c, 0x37, 0xdf, 0x37, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xdf, 0x63, 0x70, 0x09, 0x70, 0x09, 0x80, 0x3b, 0xdf, 0x57, 0xdb, 0x26, 0x4e, 0x15], + + "Encore flavor": [0x00, 0x00, 0xff, 0x7f, 0x73, 0x4e, 0x84, 0x1c, 0x00, 0x00, 0xbd, 0x7f, 0x8b, 0x45, 0x84, 0x1c, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0x5f, 0x6f, 0x4a, 0x59, 0x84, 0x1c, + 0x80, 0x3b, 0xff, 0x7f, 0x12, 0x7e, 0xbf, 0x27, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xff, 0x7f, 0x7f, 0x3c, 0x7f, 0x3c, 0x80, 0x3b, 0x5f, 0x6f, 0x7e, 0x40, 0x31, 0x1c], + + "Experimental flavor": [0x00, 0x00, 0x9e, 0x5f, 0x80, 0x65, 0x64, 0x08, 0x00, 0x00, 0xff, 0x77, 0x2c, 0x15, 0x64, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0x35, 0x7f, 0x0a, 0x7a, 0x64, 0x08, + 0x80, 0x3b, 0x9e, 0x5f, 0x50, 0x19, 0xec, 0x10, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0x9e, 0x5f, 0x4a, 0x7a, 0x4a, 0x7a, 0x80, 0x3b, 0x35, 0x7f, 0x47, 0x76, 0xe4, 0x38], + + "Blueblue flavor": [0x00, 0x00, 0x97, 0x7b, 0x00, 0x4c, 0x21, 0x14, 0x00, 0x00, 0x0c, 0x66, 0xc3, 0x28, 0x21, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0x08, 0x6e, 0x24, 0x55, 0x21, 0x14, + 0x80, 0x3b, 0x97, 0x7b, 0x82, 0x20, 0x62, 0x45, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0x97, 0x7b, 0x27, 0x71, 0x27, 0x71, 0x80, 0x3b, 0x08, 0x6e, 0x43, 0x49, 0x82, 0x1c], + + "Deeppurple flavor": [0x00, 0x00, 0xfb, 0x7a, 0x13, 0x4c, 0x25, 0x10, 0x00, 0x00, 0x16, 0x69, 0x8b, 0x40, 0x25, 0x10, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0xeb, 0x33, 0x73, 0x70, 0x2b, 0x44, 0x21, 0x14, + 0x80, 0x3b, 0xfb, 0x7a, 0x29, 0x30, 0x4c, 0x44, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xfb, 0x7a, 0x17, 0x6c, 0x17, 0x6c, 0x80, 0x3b, 0x73, 0x70, 0x6c, 0x48, 0x45, 0x1c], + + "Rivalry flavor": [0x00, 0x00, 0xfe, 0x5e, 0x0c, 0x7c, 0x25, 0x04, 0x00, 0x00, 0x5e, 0x1d, 0x70, 0x0c, 0x25, 0x04, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0xeb, 0x33, 0x15, 0x7f, 0xb3, 0x14, 0x25, 0x04, + 0x80, 0x3b, 0xfe, 0x5e, 0xea, 0x59, 0x6d, 0x6a, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xfe, 0x5e, 0xc0, 0x6d, 0xc0, 0x6d, 0x80, 0x3b, 0x15, 0x7f, 0x86, 0x55, 0xe4, 0x34], + + "Sugar flavor": [0x00, 0x00, 0x9c, 0x73, 0x39, 0x67, 0x63, 0x0c, 0x00, 0x00, 0x9c, 0x73, 0x52, 0x4a, 0x63, 0x0c, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0xeb, 0x33, 0x9c, 0x73, 0x4a, 0x29, 0x63, 0x0c, + 0x80, 0x3b, 0x42, 0x08, 0xff, 0x7f, 0x39, 0x67, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0x9c, 0x73, 0x42, 0x08, 0x42, 0x08, 0xe0, 0x33, 0x9c, 0x73, 0xf7, 0x5e, 0x8c, 0x31], + + "Faith flavor": [0x00, 0x00, 0xfe, 0x77, 0x3f, 0x67, 0x45, 0x10, 0x00, 0x00, 0xbe, 0x63, 0x7b, 0x3e, 0x45, 0x10, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0xeb, 0x33, 0x5d, 0x43, 0x9f, 0x40, 0x45, 0x10, + 0xec, 0x33, 0xfe, 0x77, 0xdd, 0x72, 0x3c, 0x66, 0x80, 0x3b, 0x4a, 0x29, 0x08, 0x21, 0xa5, 0x14, + 0x00, 0x00, 0xdf, 0x77, 0x1d, 0x28, 0x1d, 0x28, 0xe0, 0x33, 0xdf, 0x6a, 0x9f, 0x51, 0x4e, 0x1c], + + "Wisdom flavor": [0x00, 0x00, 0xfe, 0x77, 0x80, 0x19, 0x40, 0x04, 0x00, 0x00, 0xb3, 0x46, 0x89, 0x1d, 0x40, 0x04, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0xeb, 0x33, 0xb3, 0x46, 0x20, 0x1d, 0x40, 0x04, + 0xec, 0x33, 0xc1, 0x10, 0x24, 0x2e, 0x80, 0x25, 0x80, 0x3b, 0x4a, 0x29, 0x08, 0x21, 0xa5, 0x14, + 0x00, 0x00, 0xfe, 0x77, 0x29, 0x25, 0x29, 0x25, 0xe0, 0x33, 0xcc, 0x46, 0x24, 0x2e, 0x20, 0x11], + + "Hamburger flavor": [0x00, 0x00, 0xbf, 0x6b, 0x3f, 0x67, 0x25, 0x14, 0x80, 0x3b, 0xdc, 0x36, 0xd1, 0x19, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x6b, 0xfd, 0x1a, 0x25, 0x14, + 0x80, 0x3b, 0x00, 0x00, 0x54, 0x08, 0x9f, 0x2f, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xff, 0x77, 0x0d, 0x1b, 0x0d, 0x1b, 0x80, 0x3b, 0x50, 0x11, 0x16, 0x2e, 0x85, 0x10], + + "Spearmint flavor": [0x00, 0x00, 0xde, 0x5f, 0x07, 0x1f, 0x25, 0x14, 0x00, 0x00, 0xff, 0x77, 0x8f, 0x3e, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xbf, 0x57, 0x4e, 0x7d, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xa6, 0x1e, 0x6e, 0x3f, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xde, 0x5f, 0x50, 0x71, 0x50, 0x71, 0x80, 0x3b, 0xf9, 0x67, 0x4d, 0x3b, 0x88, 0x24], + + "Tuna flavor": [0x00, 0x00, 0xde, 0x5f, 0x07, 0x1f, 0x25, 0x14, 0x00, 0x00, 0xff, 0x77, 0x93, 0x42, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xbf, 0x57, 0x4e, 0x7d, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0x58, 0x29, 0x14, 0x21, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xde, 0x5f, 0x52, 0x79, 0x52, 0x79, 0x80, 0x3b, 0x1f, 0x63, 0x9b, 0x31, 0x68, 0x14], + + "Milk flavor": [0x00, 0x00, 0xde, 0x5f, 0x07, 0x1f, 0x25, 0x14, 0x00, 0x00, 0xff, 0x77, 0x73, 0x4e, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xbf, 0x57, 0x4e, 0x7d, 0x25, 0x14, + 0x80, 0x3b, 0x42, 0x08, 0xb5, 0x4e, 0x7b, 0x67, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xde, 0x5f, 0x52, 0x79, 0x52, 0x79, 0x80, 0x3b, 0xbd, 0x77, 0xf7, 0x5e, 0xc7, 0x28], + + "Peppermint flavor": [0x00, 0x00, 0xfe, 0x73, 0xde, 0x5f, 0x25, 0x14, 0x45, 0x1a, 0x7f, 0x4e, 0xd9, 0x00, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xff, 0x7f, 0xd9, 0x00, 0x25, 0x14, + 0x80, 0x3b, 0x42, 0x08, 0xff, 0x7f, 0xd9, 0x00, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xff, 0x7f, 0x13, 0x18, 0x13, 0x00, 0x80, 0x3b, 0xff, 0x7f, 0xdf, 0x18, 0x68, 0x14], + + "Toothpaste flavor": [0x00, 0x00, 0xfe, 0x73, 0xde, 0x5f, 0x25, 0x14, 0x45, 0x1a, 0xf3, 0x7f, 0x20, 0x7f, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xff, 0x7f, 0x20, 0x7f, 0x25, 0x14, + 0x80, 0x3b, 0x42, 0x08, 0xec, 0x7f, 0x26, 0x7f, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xff, 0x7f, 0x66, 0x7e, 0x66, 0x7e, 0x80, 0x3b, 0xf3, 0x7f, 0x20, 0x67, 0x68, 0x14], + + "Barbecue flavor": [0x00, 0x00, 0xde, 0x5f, 0x4c, 0x00, 0x06, 0x00, 0x45, 0x1a, 0xd3, 0x00, 0x4c, 0x00, 0x06, 0x00, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xd3, 0x00, 0x0c, 0x00, 0x06, 0x00, + 0x80, 0x3b, 0xff, 0x7f, 0x0c, 0x00, 0x99, 0x01, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0x7f, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x80, 0x3b, 0xb0, 0x14, 0x4c, 0x00, 0x06, 0x00], + + "Lavender flavor": [0x00, 0x00, 0xde, 0x5f, 0x39, 0x7f, 0x25, 0x14, 0x45, 0x1a, 0xff, 0x77, 0x93, 0x3e, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x00, 0x00, 0xbf, 0x57, 0x79, 0x7e, 0x25, 0x14, + 0x80, 0x3b, 0x86, 0x10, 0x39, 0x7f, 0x3f, 0x7f, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x00, 0x00, 0xde, 0x5f, 0x73, 0x7e, 0x73, 0x7e, 0x80, 0x3b, 0x3f, 0x7f, 0x39, 0x7f, 0x25, 0x14], + + "Apple flavor": [0x00, 0x00, 0xde, 0x5f, 0x1F, 0x00, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x77, 0x6d, 0x3a, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xdf, 0x18, 0x19, 0x00, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0x52, 0x79, 0x52, 0x79, 0x80, 0x3b, 0x3f, 0x67, 0xdf, 0x18, 0xc7, 0x28], + + "Orange flavor": [0x00, 0x00, 0xde, 0x5f, 0x9F, 0x01, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x77, 0x6d, 0x3a, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0x0c, 0x00, 0x9f, 0x19, 0x7f, 0x1a, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0x79, 0x02, 0x79, 0x02, 0x80, 0x3b, 0x3f, 0x67, 0xff, 0x2a, 0xc7, 0x28], + + "Toilet flavor": [0x00, 0x00, 0xde, 0x5f, 0xff, 0x7f, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x67, 0x93, 0x01, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0x32, 0x01, 0x33, 0x7f, 0x66, 0x7e, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0x8c, 0x01, 0x3f, 0x1b, 0x3f, 0x1b, 0x80, 0x3b, 0xff, 0x7f, 0x9c, 0x7f, 0xc7, 0x28], + + "Peach flavor": [0x00, 0x00, 0xde, 0x5f, 0x3f, 0x1b, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x77, 0x6d, 0x3a, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0xc6, 0x00, 0x7f, 0x32, 0x3f, 0x33, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0x52, 0x79, 0x52, 0x79, 0x80, 0x3b, 0x3f, 0x4f, 0x7f, 0x32, 0xc7, 0x28], + + "Bubblegum flavor": [0x00, 0x00, 0xde, 0x5f, 0x3f, 0x67, 0x25, 0x14, 0x80, 0x3b, 0x3f, 0x67, 0x7f, 0x7e, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xbf, 0x57, 0x4f, 0x79, 0x25, 0x14, + 0x80, 0x3b, 0x86, 0x10, 0x3f, 0x7f, 0x79, 0x7e, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0x86, 0x10, 0x9f, 0x65, 0x9f, 0x65, 0x80, 0x3b, 0x3f, 0x7f, 0x7f, 0x7e, 0xc7, 0x28], + + "Lemonade flavor": [0x00, 0x00, 0xde, 0x5f, 0x3f, 0x67, 0x25, 0x14, 0x80, 0x3b, 0xde, 0x63, 0x1e, 0x5f, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0x3f, 0x67, 0x4e, 0x7d, 0x25, 0x14, + 0x80, 0x3b, 0xc6, 0x00, 0x1e, 0x5f, 0xff, 0x4f, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0x52, 0x79, 0x52, 0x79, 0x80, 0x3b, 0x9e, 0x5f, 0x1e, 0x5f, 0xc7, 0x28], + + "Garlic flavor": [0x00, 0x00, 0xff, 0x03, 0xff, 0x03, 0x25, 0x14, 0x80, 0x3b, 0xff, 0x33, 0x19, 0x64, 0x25, 0x14, + 0x80, 0x3b, 0xde, 0x5f, 0xbf, 0x4c, 0xbf, 0x4c, 0x80, 0x3b, 0xff, 0x1b, 0x13, 0x4c, 0x25, 0x14, + 0x80, 0x3b, 0xc6, 0x00, 0x79, 0x02, 0x3f, 0x1b, 0x80, 0x3b, 0xe7, 0x1c, 0xa5, 0x14, 0x42, 0x08, + 0x80, 0x3b, 0xde, 0x5f, 0x13, 0x4c, 0x13, 0x4c, 0x80, 0x3b, 0xff, 0x33, 0x19, 0x64, 0xc7, 0x28] + +} + +vanilla_flavor_pointers = { + "Mint flavor": [0x202008, 0x34B000, 0x34B110], + "Strawberry flavor": [0x202048, 0x34B040, 0x34B112], + "Banana flavor": [0x202088, 0x34B080, 0x34B114], + "Peanut flavor": [0x2020C8, 0x34B0C0, 0x34B116] +} + + +def create_flavors(world: "EarthBoundWorld") -> None: + """Shuffle flavors (textbox palettes). Vanilla flavors are copied from the ROM itself and not stored here.""" + world.flavor_text = [] + world.flavor_pointer = [0x01F72B, 0x01F746, 0x01F761, 0x01F77C] + flavor_num = 0 + for flavor in world.available_flavors: + encoded_flavor = [] + for char in flavor: + encoded_flavor.extend(eb_text_table[char]) + encoded_flavor.extend([0x00]) + world.flavor_text.append(encoded_flavor) + flavor_num += 1 diff --git a/worlds/earthbound/modules/hint_data.py b/worlds/earthbound/modules/hint_data.py new file mode 100644 index 0000000000..033894c220 --- /dev/null +++ b/worlds/earthbound/modules/hint_data.py @@ -0,0 +1,365 @@ +from ..game_data.local_data import item_id_table, character_item_table, party_id_nums +from ..game_data.text_data import text_encoder +from ..game_data.static_location_data import location_groups +from ..modules.shopsanity import shop_locations +from ..Options import ShopRandomizer, MagicantMode +import struct +from BaseClasses import Location +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import EarthBoundWorld + from ..Rom import LocalRom + +def setup_hints(world: "EarthBoundWorld") -> None: + hint_types = [ + # gives a hint for a specific out of the way location in this player's world, regardless of what item it is + "item_at_location", + "region_progression_check", # woth or foolish hint, checks specific location groups of this world so as to be more helpful. + "hint_for_good_item", # gives the exact location and sender of a good item for the local player + "item_in_local_region", # Hints a random item that can be found in a specific local location group + "prog_item_at_region", # Hints the region that a good item can be found for this player + "joke_hint", # Doesn't hint anything + "dungeon_location" # Hints what dungeon can be found at a specific entrance + ] + world.in_game_hint_types = [] + world.hinted_locations = {} + world.hinted_items = {} + world.hinted_regions = {} + world.hinted_dungeons = {} + + # may not need to be world. + world.local_hintable_locations = [ + "Onett - Mayor Pirkle", + "Onett - South Road Present", + "Onett - Meteor Item", + "Onett - Treehouse Guy", + "Twoson - Orange Kid Donation", + "Twoson - Everdred Meeting", + "Twoson - Apple Kid Invention", + "Fourside - Post-Moonside Delivery", + "Lost Underworld - Talking Rock", + "Dungeon Man - 2F Hole Present", + "Poo - Starting Item", + "Summers - Magic Cake", + "Deep Darkness - Teleporting Monkey", + "Twoson - Insignificant Location", + "Peaceful Rest Valley - North Side Present", + "Twoson - Paula's Mother", + "Happy-Happy Village - Prisoner", + "Threed - Boogey Tent Trashcan", + "Threed - Zombie Prisoner", + "Grapefruit Falls - Saturn Cave Present", + "Saturn Valley - Saturn Coffee", + "Dusty Dunes - South Side Present", + "Stonehenge - Tony Item", + "Stonehenge - Kidnapped Mr. Saturn", + "Stonehenge - Dead End Present", + "Stonehenge - Near End of the Maze Present", + "Stonehenge - Bridge Room East Balcony Present", + "Gold Mine - B1F Isolated Present", + "Fourside - Venus Gift", + "Fourside - Bakery 2F Gift", + "Fourside - Department Store Blackout", + "Monotoli Building - Monotoli Character", + "Dungeon Man - 1F Exit Ledge Present", + "Deep Darkness - Barf Character", + "Lumine Hall - B1F West Alcove Present", + "Cave of the Present - Star Master", + "Cave of the Present - Broken Phase Distorter", + "Fire Spring - 1st Cave Present", + "Tenda Village - Tenda Tea", + "Deep Darkness - Barf Character", + "Dalaam - Trial of Mu", + "Pyramid - Northwest Door Sarcophagus" + ] + + world.local_hintable_items = [ + "Franklin Badge", + "Key to the Shack", + "Key to the Cabin", + "Key to the Tower", + "Key to the Locker", + "Bad Key Machine", + "Pencil Eraser", + "Eraser Eraser", + "UFO Engine", + "Yogurt Dispenser", + "Zombie Paper", + "King Banana", + "Signed Banana", + "Tendakraut", + "Jar of Fly Honey", + "Wad of Bills", + "Tiny Ruby", + "Diamond", + "Meteorite Piece", + "Hieroglyph Copy", + "Piggy Nose", + "Carrot Key", + "Police Badge", + "Letter For Tony", + "Mining Permit", + "Contact Lens", + "Insignificant Item", + "Pak of Bubble Gum", + "Sea Pendant", + "Shyness Book", + "Hawk Eye", + "Ness", + "Paula", + "Jeff", + "Poo", + "Onett Teleport", + "Twoson Teleport", + "Happy-Happy Village Teleport", + "Threed Teleport", + "Saturn Valley Teleport", + "Dusty Dunes Teleport", + "Fourside Teleport", + "Winters Teleport", + "Summers Teleport", + "Scaraba Teleport", + "Dalaam Teleport", + "Deep Darkness Teleport", + "Tenda Village Teleport", + "Lost Underworld Teleport" + ] + + world.joke_hints = [ + "you can find 6 hint shops around the world.", + "if you want to hint for an item, use !hint in your text client!", + "the mouse at the Fourside Department Store knows what the Spook has.", + "my business may be a scam.", + "there's a guy near Threed's hotel who saw the Zombies take someone away.", + "you can use the Y button to run or mash through text.", + "you can submit custom window flavors in the game's Archipelago thread.", + "you can buy a ruler at the Fourside Department Store.", + "you can store a lot of items in your backpack with the R button.", + "Giygas's guard may actually be from another seed...", + "if you have multiple of something important, you can throw away the extras.", + "the chicken crossed the road because it was trying to use Teleport α.", + "Figment's Ice Palace can probably be found in Ice Palace.", + "you can talk to the hint shop owners for a hint.", + "deliveryman are bad at using keys.", + "PK scramble is a pretty good time.", + "Apple Kid researched the Power of the Earth with Dr. Andonuts.", + "you can find beta Archipelago games on the Archipelago discord.", + "you can randomize EarthBound with Archipelago.", + "hint prices double with each one bought.", + "you probably should have kept your money.", + "there's a secret option to plando Lumine Hall's text.", + "this isn't a very good hint.", + "some hints are good hints.\n@But not this one." + ] + + hintable_location_groups = location_groups.copy() + + if world.options.shop_randomizer != ShopRandomizer.option_shopsanity: + hintable_location_groups["Onett"] = hintable_location_groups["Onett"] - shop_locations + hintable_location_groups["Twoson"] = hintable_location_groups["Twoson"] - shop_locations + hintable_location_groups["Happy-Happy Village"] = hintable_location_groups["Happy-Happy Village"] - shop_locations + hintable_location_groups["Threed"] = hintable_location_groups["Threed"] - shop_locations + hintable_location_groups["Grapefruit Falls"] = hintable_location_groups["Grapefruit Falls"] - shop_locations + hintable_location_groups["Saturn Valley"] = hintable_location_groups["Saturn Valley"] - shop_locations + hintable_location_groups["Dusty Dunes Desert"] = hintable_location_groups["Dusty Dunes Desert"] - shop_locations + hintable_location_groups["Winters"] = hintable_location_groups["Winters"] - shop_locations + hintable_location_groups["Dr. Andonuts's Lab"] = hintable_location_groups["Dr. Andonuts's Lab"] - shop_locations + hintable_location_groups["Fourside"] = hintable_location_groups["Fourside"] - shop_locations + hintable_location_groups["Moonside"] = hintable_location_groups["Moonside"] - shop_locations + hintable_location_groups["Summers"] = hintable_location_groups["Summers"] - shop_locations + hintable_location_groups["Dalaam"] = hintable_location_groups["Dalaam"] - shop_locations + hintable_location_groups["Scaraba"] = hintable_location_groups["Scaraba"] - shop_locations + hintable_location_groups["Deep Darkness"] = hintable_location_groups["Deep Darkness"] - shop_locations + hintable_location_groups["Lost Underworld"] = hintable_location_groups["Lost Underworld"] - shop_locations + hintable_location_groups["Magicant"] = hintable_location_groups["Magicant"] - shop_locations + + del hintable_location_groups["Burglin Park"] + del hintable_location_groups["the Scaraba Bazaar"] + del hintable_location_groups["the Twoson Department Store"] + del hintable_location_groups["the Fourside Department Store"] + del hintable_location_groups["the Saturn Valley Shop"] + + if world.options.magicant_mode >= 2: + del hintable_location_groups["Magicant"] + + if not world.options.giygas_required: + del hintable_location_groups["Cave of the Past"] + + if world.options.magicant_mode.value in [0, 3]: + world.local_hintable_items.append("Magicant Teleport") + + for item in world.multiworld.precollected_items[world.player]: + if item.name in world.local_hintable_items: + world.local_hintable_items.remove(item.name) + + for item in world.options.start_hints.value: + if item in world.local_hintable_items: + world.local_hintable_items.remove(item) + + if world.starting_area_teleport in world.local_hintable_items: + world.local_hintable_items.remove(world.starting_area_teleport) + + if world.local_hintable_items == []: + hint_types.remove("hint_for_good_item") + hint_types.remove("prog_item_at_region") + + if not world.options.dungeon_shuffle: + hint_types.remove("dungeon_location") + + if world.options.giygas_required: + world.local_hintable_locations.append("Cave of the Past - Present") + + if world.options.magicant_mode == MagicantMode.option_psi_location: + world.local_hintable_locations.append("Magicant - Ness's Nightmare") + + for i in range(6): + world.in_game_hint_types.append(world.random.choice(hint_types)) + + for index, hint in enumerate(world.in_game_hint_types): + if hint == "item_at_location": + location = world.random.choice(world.local_hintable_locations) + world.hinted_locations[index] = location + + elif hint == "region_progression_check": + group, group_locs = world.random.choice(list(hintable_location_groups.items())) + world.hinted_regions[index] = group + + elif hint == "hint_for_good_item" or hint == "prog_item_at_region": + item = world.random.choice(world.local_hintable_items) + world.hinted_items[index] = item + + elif hint == "item_in_local_region": + group, group_locs = world.random.choice(list(hintable_location_groups.items())) + location = world.random.choice(sorted(group_locs)) + world.hinted_regions[index] = group + world.hinted_locations[index] = location + + elif hint == "dungeon_location": + dungeon = world.random.choice(list(world.dungeon_connections.keys())) + world.hinted_dungeons[index] = dungeon + + +def parse_hint_data(world: "EarthBoundWorld", location: Location, rom: "LocalRom", hint: str, index: int) -> None: + if hint == "item_at_location": + if world.player == location.item.player and location.item.name in character_item_table and location.item.name != "Photograph": + player_text = "your friend " + item_text = bytearray([0x1C, 0x02, party_id_nums[location.item.name]]) # In-game text command to display party member names + elif world.player == location.item.player: + player_text = "your " + if location.item.name in item_id_table: + item_text = bytearray([0x1C, 0x05, item_id_table[location.item.name]]) # In-game text command to display item names + else: + # if the item doesn't have a name (e.g it's PSI) + item_text = text_encoder(location.item.name, 128) + else: + player_text = f"{world.multiworld.get_player_name(location.item.player)}'s " + item_text = text_encoder(location.item.name, 128) + + player_text = text_encoder(player_text, 255) + location_text = text_encoder(f" can be found at\n@{location.name}.", 255) + text = player_text + item_text + location_text + # [player]'s [item] can be found at [location]. + text.append(0x02) + + elif hint == "region_progression_check": + if world.progression_count == 1: + text = f"you can find {world.progression_count} important item at {world.hinted_area}." + else: + text = f"you can find {world.progression_count} important items at {world.hinted_area}." + text = text_encoder(text, 255) + text.append(0x02) + + elif hint == "hint_for_good_item" or hint == "prog_item_at_region" or hint == "item_in_local_region": + if location.item.name in character_item_table and location.item.player == world.player and location.item.name != "Photograph": + item_text = text_encoder("your friend ", 255) + item_text.extend([0x1C, 0x02, party_id_nums[location.item.name]]) + elif location.item.name in item_id_table and location.item.player == world.player: + item_text = text_encoder("your ", 255) + item_text.extend([0x1C, 0x05, item_id_table[location.item.name]]) + elif location.item.player == world.player: + item_text = text_encoder(f"your {location.item.name}", 128) + else: + item_text = f"{world.multiworld.get_player_name(location.item.player)}'s {location.item.name}" + item_text = text_encoder(item_text, 255) + item_text.extend(text_encoder(" can be found ", 255)) + + if location.player != world.player: + player_text = text_encoder(f"by {world.multiworld.get_player_name(location.player)}\n", 255) + else: + player_text = text_encoder("\n", 255) + + if hint == "hint_for_good_item": + location_text = text_encoder(f"@at {location.name}.", 255) + # your [item] can be found by [player] at [location] + + else: + location_name_groups = world.multiworld.worlds[location.player].location_name_groups + possible_location_groups = [ + group_name for group_name, group_locations in location_name_groups.items() + if location.name in group_locations and group_name != "Everywhere" + ] + if not possible_location_groups: + if location.parent_region.name == "Menu": + area = "" + else: + area = f" near {location.parent_region.name}" + else: + area = f" near {world.random.choice(possible_location_groups)}" + location_text = text_encoder(f"@somewhere{area}.", 255) + # your [item] can be found by [player] somewhere near [location group] + text = item_text + player_text + location_text + text.append(0x02) + + elif hint == "joke_hint": + text = world.random.choice(world.joke_hints) + text = text_encoder(text, 255) + text.append(0x02) + + elif hint == "dungeon_location": + dungeon = world.hinted_dungeons[index] + text = f"{dungeon} leads to {world.dungeon_connections[dungeon]}." + text = text_encoder(text, 255) + text.append(0x02) + + else: + text = 0x00 + + hint_addresses = [ + 0x070376, + 0x0703A8, + 0x0703DA, + 0x07040C, + 0x07043E, + 0x070470 + ] + + scoutable_hint_addresses = [ + 0x2EF3D5, + 0x2EF3EB, + 0x2EF401, + 0x2EF417, + 0x2EF42D, + 0x2EF443 + ] + rom.write_bytes(0x310000 + world.hint_pointer, text) + rom.write_bytes(hint_addresses[world.hint_number], struct.pack("I", 0xF10000 + world.hint_pointer)) + + if hint in ["item_at_location", "hint_for_good_item"]: + rom.write_bytes(scoutable_hint_addresses[world.hint_number], struct.pack("I", 0xEEF451)) + rom.write_bytes(0x310252 + (world.hint_number * 3), bytearray([0x01])) + world.hint_man_hints.append((location.address, location.player)) + else: + rom.write_bytes(scoutable_hint_addresses[world.hint_number], struct.pack("I", 0xEEF4B2)) + world.hint_man_hints.append(("NULL", 0)) + + world.hint_pointer = world.hint_pointer + len(text) + world.hint_number += 1 + + # Word on the street is that PLAYER's ITEM can be found at LOCATION + # Word on the street is that REGION has X important items + # Word on the street is that your ITEM can be found by PLAYER at LOCATION + # Word on the street is that PLAYER's ITEM can be found somewhere near REGION... + # Word on the street is that your ITEM can be found somewhere near REGION... + # char item hint? + # That's all for today. + # Like text part 1, extend 0x1C 0x05 0xItem Item, extend (the rest of the string) diff --git a/worlds/earthbound/modules/music_rando.py b/worlds/earthbound/modules/music_rando.py new file mode 100644 index 0000000000..4b3cb82d8d --- /dev/null +++ b/worlds/earthbound/modules/music_rando.py @@ -0,0 +1,305 @@ +from ..Options import RandomizeOverworldMusic, RandomizeFanfares +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from . import EarthBoundWorld + from .Rom import LocalRom + +town_songs = [ + 0x2E, + 0x2F, + 0x30, + 0x38, + 0x3B, + 0x3D, + 0x41, + 0x42, + 0x52, + 0x80, + 0x81, + 0x82 +] + +overworld_songs = [ + 0x1D, + 0x2C, + 0x33, + 0x34, + 0x35, + 0x36, + 0x3E, + 0x40, + 0x43, + 0x44, + 0x6B, + 0x72, + 0x79, + 0x88, + 0x92, + 0x97, + 0x99, + 0x9A, + 0x9F + ] + +dungeon_songs = [ + 0x28, + 0x29, + 0x2A, + 0x2B, + 0x2D, + 0x31, + 0x32, + 0x37, + 0x2D, + 0x3F, + 0x46, + 0x6A, + 0x6C, + 0x75, + 0x84, + 0x85 +] + +interior_songs = [ + 0x10, + 0x11, + 0x12, + 0x13, + 0x14, + 0x15, + 0x16, + 0x17, + 0x18, + 0x19, + 0x1A, + 0x1C, + 0x39, + 0x70, + 0x78, + 0x7D, + 0x83, + 0x8C, + 0x98 + ] + +cutscene_songs = [ + 0x3A, + 0x3C, + 0x48, + 0x4C, + 0x4D, + 0x4E, + 0x4F, + 0x50, + 0x51, + 0x53, + 0x55, + 0x56, + 0x57, + 0x58, + 0x59, + 0x5C, + 0x77, + 0x86, + 0x90, + 0x9B, + 0xA9, + 0xAA, + 0xAB, + 0xAC, + 0xBB +] + +wakeup_songs = [ + 0x1B, + 0x5A, + 0xAD, + 0xB2, + 0xB5, + 0xBC, +] + +rare_songs = [ + 0x1E, + 0x1F, + 0x45, + 0x47, + 0x70, + 0x74, + 0x76, + 0x96, + +] + +non_randomized = [ + 0x01, + 0x02, + 0x03, + 0x04, + 0x06, + 0x07, + 0x0A, + 0x0D, + 0x0E, + 0x20, + 0x21, + 0x22, + 0x23, + 0x24, + 0x25, + 0x26, + 0x27, + 0x4B, + 0x5D, + 0x5E, + 0x5F, + 0x73, + 0x7A, + 0x87, + 0x89, + 0x8A, + 0x8B, + 0x9D, + 0xAE, + 0xAF, + 0xB6, + 0xBE, + 0xBF +] + +battle_songs = [ + 0x49, + 0x4A, + 0x60, + 0x61, + 0x62, + 0x63, + 0x64, + 0x65, + 0x66, + 0x67, + 0x68, + 0x69, + 0x8D, + 0x94, + 0x95, + 0xB9, + 0xBA +] + + +def music_randomizer(world: "EarthBoundWorld", rom: "LocalRom") -> None: + fanfares = [ + 0x05, + 0x08, + 0x09, + 0x0B, + 0x0C, + 0x0F, + 0x54, + 0x5B, + 0x6D, + 0x6E, + 0x6F, + 0x71, + 0x7B, + 0x7C, + 0x7E, + 0x7F, + 0xB7, + 0xB8, + 0x8E, + 0x8F, + 0x91, + 0x93, + 0x9C, + 0x9E, + 0xA0, + 0xA1, + 0xA2, + 0xA3, + 0xA4, + 0xA5, + 0xA6, + 0xA7, + 0xA8, + 0xB0, + 0xB1, + 0xB3, + 0xB4, + 0xB7, + 0xB8, + 0xBD + ] + + # Todo; options here + global_tracklist = list(range(0xC0)) # Initialize the list; this ideally should be vanilla + + if world.options.randomize_fanfares == RandomizeFanfares.option_on_no_sound_stone_fanfares: + for i in range(9): + fanfares.remove(0xA0 + i) + + if world.options.randomize_fanfares: + shuffled_fanfares = fanfares.copy() + world.random.shuffle(shuffled_fanfares) + for track_id, song in enumerate(fanfares): + global_tracklist[song] = shuffled_fanfares[track_id] + + if world.options.randomize_battle_music: + shuffled_battle_songs = battle_songs.copy() + world.random.shuffle(shuffled_battle_songs) + for track_id, song in enumerate(battle_songs): + global_tracklist[song] = shuffled_battle_songs[track_id] + + if world.options.randomize_overworld_music == RandomizeOverworldMusic.option_match_type: + shuffled_town_songs = town_songs.copy() + shuffled_overworld_songs = overworld_songs.copy() + shuffled_interior_songs = interior_songs.copy() + shuffled_dungeon_songs = dungeon_songs.copy() + shuffled_cutscene_songs = cutscene_songs.copy() + shuffled_rare_songs = rare_songs.copy() + shuffled_wakeup_songs = wakeup_songs.copy() + + world.random.shuffle(shuffled_town_songs) + world.random.shuffle(shuffled_overworld_songs) + world.random.shuffle(shuffled_interior_songs) + world.random.shuffle(shuffled_dungeon_songs) + world.random.shuffle(shuffled_cutscene_songs) + world.random.shuffle(shuffled_rare_songs) + world.random.shuffle(shuffled_wakeup_songs) + + for track_id, song in enumerate(town_songs): + global_tracklist[song] = shuffled_town_songs[track_id] + + for track_id, song in enumerate(overworld_songs): + global_tracklist[song] = shuffled_overworld_songs[track_id] + + for track_id, song in enumerate(interior_songs): + global_tracklist[song] = shuffled_interior_songs[track_id] + + for track_id, song in enumerate(dungeon_songs): + global_tracklist[song] = shuffled_dungeon_songs[track_id] + + for track_id, song in enumerate(cutscene_songs): + global_tracklist[song] = shuffled_cutscene_songs[track_id] + + for track_id, song in enumerate(rare_songs): + global_tracklist[song] = shuffled_rare_songs[track_id] + + for track_id, song in enumerate(wakeup_songs): + global_tracklist[song] = shuffled_wakeup_songs[track_id] + + elif world.options.randomize_overworld_music == RandomizeOverworldMusic.option_full: + all_overworld_songs = (town_songs + overworld_songs + interior_songs + + dungeon_songs + cutscene_songs + rare_songs + wakeup_songs) + + shuffled_overworld_songs = all_overworld_songs.copy() + world.random.shuffle(shuffled_overworld_songs) + + for track_id, song in enumerate(all_overworld_songs): + global_tracklist[song] = shuffled_overworld_songs[track_id] + + rom.write_bytes(0x17FDA0, bytearray(global_tracklist)) + + +# Should the Melodies be fanfares? diff --git a/worlds/earthbound/modules/palette_shuffle.py b/worlds/earthbound/modules/palette_shuffle.py new file mode 100644 index 0000000000..0ecb81af8e --- /dev/null +++ b/worlds/earthbound/modules/palette_shuffle.py @@ -0,0 +1,52 @@ +from ..game_data.palettes_organized import map_palettes, nice_palettes, ugly_palettes, nonsense_palettes +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from . import EarthBoundWorld + from .Rom import LocalRom + + +event_palettes = { + "Happy-Happy Village": 0x8367, + "Threed": 0x85A7, + "Deep Darkness": 0x8F67 + } + + +def randomize_psi_palettes(world: "EarthBoundWorld", rom: "LocalRom") -> None: + spell_palettes = [] + for i in range(34): + spell_palettes.append(0x0CF47F + (i * 8)) + + for i in range(7): + spell_palettes.append(0x360710 + (i * 8)) + + shuffled_palettes = spell_palettes.copy() + + if world.options.randomize_psi_palettes == 1: + world.random.shuffle(shuffled_palettes) + + elif world.options.randomize_psi_palettes == 2: + for i in range(0x010E): + rom.write_bytes(0x0CF47F + i, bytearray([world.random.randint(0x00, 0xFF)])) + + for i in range(0x50): + rom.write_bytes(0x36F710 + i, bytearray([world.random.randint(0x00, 0xFF)])) + + for index, pointer in enumerate(spell_palettes): + rom.copy_bytes(pointer, 8, shuffled_palettes[index]) + + +def map_palette_shuffle(world: "EarthBoundWorld", rom: "LocalRom") -> None: + for i in range(168): + rom.copy_bytes(0x1A7CA7 + (i * 192), 191, 0x381000 + (i * 192)) + + for item in map_palettes: + choosable_palettes = nice_palettes[item] + if world.options.map_palette_shuffle > 1: + choosable_palettes += ugly_palettes[item] + if world.options.map_palette_shuffle > 2: + choosable_palettes += nonsense_palettes[item] + + chosen_palette = world.random.choice(choosable_palettes) + rom.copy_bytes(0x381002 + (chosen_palette * 192), 29, 0x1A7CA9 + (map_palettes[item] * 192)) + rom.copy_bytes(0x381022 + (chosen_palette * 192), 157, 0x1A7CC9 + (map_palettes[item] * 192)) # The event palette pointer is between these 2 blocks diff --git a/worlds/earthbound/modules/psi_shuffle.py b/worlds/earthbound/modules/psi_shuffle.py new file mode 100644 index 0000000000..2be424ad91 --- /dev/null +++ b/worlds/earthbound/modules/psi_shuffle.py @@ -0,0 +1,515 @@ +import struct +from ..Options import PSIShuffle +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from . import EarthBoundWorld + from .Rom import LocalRom + + +def shuffle_psi(world: "EarthBoundWorld") -> None: + world.offensive_psi_slots = [ + "Special", + "Flash", + "Fire", + "Freeze", + "Thunder", + "Starstorm", + "Blast", + "Missile" + ] + + world.assist_psi_slots = [ + "Hypnosis", + "Paralysis", + "Offense Up", + "Defense Down", + "Brainshock", + "Defense up", + "Drain", + "Disable", + "Stop", + "Neutralize" + ] + + world.shield_slots = [ + "Shield", + "PSI Shield" + ] + + world.jeff_offense_items = [] + world.jeff_assist_items = [] + + world.psi_address = { + "Special": [0x158A5F, 4], + "Flash": [0x158B4F, 4], + "Fire": [0x158A9B, 4], + "Freeze": [0x158AD7, 4], + "Thunder": [0x158B13, 4], + "Starstorm": [0x3503FC, 4], + + "Shield": [0x158C21, 4], + "PSI Shield": [0x158C5D, 4], + + "Hypnosis": [0x158CD5, 2], + "Paralysis": [0x158D11, 2], + "Offense Up": [0x158C99, 2], + "Defense Down": [0x158CB7, 2], + "Brainshock": [0x158D2F, 2], + + "Blast": [0x35041A, 4], + "Missile": [0x350456, 4], + + "Defense up": [0x350492, 2], + "Drain": [0x3504B0, 2], + "Disable": [0x3504Ce, 2], + "Stop": [0x3504EC, 2], + "Neutralize": [0x35050A, 2], + } + + if world.options.psi_shuffle: + world.random.shuffle(world.offensive_psi_slots) + + if world.options.psi_shuffle != PSIShuffle.option_extended: + adjust_psi_list(world.offensive_psi_slots, "Blast", 7) + adjust_psi_list(world.offensive_psi_slots, "Missile", 7) + + if not world.options.allow_flash_as_favorite_thing: + if world.offensive_psi_slots[0] == "Flash": + adjust_psi_list(world.offensive_psi_slots, "Flash", world.random.randint(1, 5)) # Randomize which slot gets Flash + + world.random.shuffle(world.assist_psi_slots) + + if world.options.psi_shuffle != PSIShuffle.option_extended: + adjust_psi_list(world.assist_psi_slots, "Defense up", 10) + adjust_psi_list(world.assist_psi_slots, "Drain", 10) + adjust_psi_list(world.assist_psi_slots, "Disable", 10) + adjust_psi_list(world.assist_psi_slots, "Stop", 10) + adjust_psi_list(world.assist_psi_slots, "Neutralize", 10) + + world.jeff_offense_items.extend(world.offensive_psi_slots[-2:]) + world.jeff_assist_items.extend(world.assist_psi_slots[-5:]) + world.offensive_psi_slots = world.offensive_psi_slots[:-2] + world.assist_psi_slots = world.assist_psi_slots[:-5] + + world.random.shuffle(world.shield_slots) + + shield_data = {key: world.psi_address[key] for key in world.shield_slots} + assist_data = {key: world.psi_address[key] for key in world.assist_psi_slots} + assist_data_plus = {key: world.psi_address[key] for key in world.jeff_assist_items} + offense_data_plus = {key: world.psi_address[key] for key in world.jeff_offense_items} + + world.psi_address = {key: world.psi_address[key] for key in world.offensive_psi_slots} + world.psi_address.update(shield_data) + world.psi_address.update(assist_data) + world.psi_address.update(offense_data_plus) + world.psi_address.update(assist_data_plus) + + world.psi_slot_data = [ + [[0x09, 0x00], [0x0B, 0x00], [0x0D, 0x00], [0x0F, 0x00]], # Special + [[0x09, 0x01], [0x0B, 0x01], [0x0D, 0x01], [0x0F, 0x01]], # Flash + [[0x09, 0x00], [0x0B, 0x00], [0x0D, 0x00], [0x0F, 0x00]], # Fire + [[0x09, 0x01], [0x0B, 0x01], [0x0D, 0x01], [0x0F, 0x01]], # Freeze + [[0x09, 0x02], [0x0B, 0x02], [0x0D, 0x02], [0x0F, 0x02]], # Thunder + [[0x09, 0x00], [0x0B, 0x00], [0x0D, 0x00], [0x0F, 0x00]], # Starstorm + + [[0x09, 0x00], [0x0B, 0x00], [0x0D, 0x00], [0x0F, 0x00]], # Shield + [[0x09, 0x00], [0x0B, 0x00], [0x0D, 0x00], [0x0F, 0x00]], # PSI Shield + + [[0x09, 0x01], [0x0B, 0x01]], # Hypnosis + [[0x09, 0x02], [0x0B, 0x02]], # Paralysis + [[0x09, 0x01], [0x0B, 0x01]], # Offense Up + [[0x09, 0x02], [0x0B, 0x02]], # Defense Down + [[0x09, 0x01], [0x0B, 0x01]], # Brainshock + + [[0x09, 0x00], [0x0B, 0x00], [0x0D, 0x00], [0x0F, 0x00]], # Blast + [[0x09, 0x00], [0x0B, 0x00], [0x0D, 0x00], [0x0F, 0x00]], # Missile + + [[0x09, 0x01], [0x0B, 0x01]], # Defense up + [[0x09, 0x02], [0x0B, 0x02]], # Drain + [[0x09, 0x01], [0x0B, 0x01]], # Disable + [[0x09, 0x02], [0x0B, 0x02]], # Stop + [[0x09, 0x01], [0x0B, 0x01]], # Neutralize + ] + + world.psi_level_data = [ + [[0x08, 0x00, 0x00], [0x16, 0x00, 0x00], [0x31, 0x00, 0x00], [0x4B, 0x00, 0x00]], # Special + [[0x12, 0x00, 0x00], [0x26, 0x00, 0x00], [0x3D, 0x00, 0x00], [0x43, 0x00, 0x00]], # Flash + [[0x00, 0x03, 0x00], [0x00, 0x13, 0x00], [0x00, 0x25, 0x00], [0x00, 0x40, 0x00]], # Fire + [[0x00, 0x01, 0x01], [0x00, 0x0B, 0x01], [0x00, 0x1F, 0x21], [0x00, 0x2E, 0x00]], # Freeze + [[0x00, 0x08, 0x01], [0x00, 0x19, 0x01], [0x00, 0x39, 0x29], [0x00, 0x00, 0x37]], # Thunder + [[0x00, 0x00, 0x00], [0x00, 0x00, 0x00], [0x00, 0x00, 0x00], [0x00, 0x00, 0x00]], # Starstorm + + [[0x0C, 0x00, 0x0E], [0x00, 0x00, 0x0F], [0x22, 0x00, 0x10], [0x00, 0x00, 0x33]], # Shield + [[0x00, 0x06, 0x00], [0x00, 0x1B, 0x00], [0x00, 0x33, 0x00], [0x00, 0x3C, 0x00]], # PSI Shield + + [[0x04, 0x00, 0x00], [0x1B, 0x00, 0x00]], # Hypnosis + [[0x0E, 0x00, 0x00], [0x1D, 0x00, 0x00]], # Paralysis + [[0x00, 0x15, 0x00], [0x00, 0x28, 0x00]], # Offense Up + [[0x00, 0x1D, 0x00], [0x00, 0x36, 0x00]], # Defense Down + [[0x00, 0x00, 0x18], [0x00, 0x00, 0x2C]], # Brainshock + + # Level-up data needs to be zeroed out for these slots + [[0x00, 0x00, 0x00], [0x00, 0x00, 0x00], [0x00, 0x00, 0x00], [0x00, 0x00, 0x00]], # Blast + [[0x00, 0x00, 0x00], [0x00, 0x00, 0x00], [0x00, 0x00, 0x00], [0x00, 0x00, 0x00]], # Missile + + [[0x00, 0x00, 0x00], [0x00, 0x00, 0x00]], # Defense up + [[0x00, 0x00, 0x00], [0x00, 0x00, 0x00]], # Drain + [[0x00, 0x00, 0x00], [0x00, 0x00, 0x00]], # Disable + [[0x00, 0x00, 0x00], [0x00, 0x00, 0x00]], # Stop + [[0x00, 0x00, 0x00], [0x00, 0x00, 0x00]] # Neutralize + + ] + + world.bomb_names = { + "Special": ["Psycho bomb", "Mad psycho bomb", "Psywave emitter", "Psywave blaster", "Broken radio"], + "Flash": ["Smoke bomb", "Flashbang", "Flash pan", "Digital camera", "Broken camera"], + "Freeze": ["Ice bomb", "Dry ice bomb", "Frost ray", "Freeze ray", "Broken minifridge"], + "Fire": ["Fire bomb", "Napalm bomb", "Blowtorch", "Flamethrower", "Broken grill"], + "Thunder": ["Electric bomb", "EMP bomb", "Shock coil", "Tesla coil", "Broken spring"], + "Starstorm": ["Comet bomb", "Nova bomb", "Meteor radar", "Star radar", "Broken radar"], + "Blast": ["Bomb", "Super bomb", "Bazooka", "Heavy bazooka", "Broken bazooka"], + "Missile": ["Rocket", "Nitro rocket", "Missile launcher", "Nitro launcher", "Broken vacuum"] + } + + world.rocket_names = { + "Special": ["Psionic shard", "Psionic orb", "Psionic crystal"], + "Flash": ["Flashbulb", "Bright bulb", "Magna bulb"], + "Freeze": ["LN2 bottle", "LN2 jug", "LN2 bucket"], + "Fire": ["Flare", "Big flare", "Blitz flare"], + "Thunder": ["Sparkler", "Big sparkler", "Mega sparkler"], + "Starstorm": ["Meteor missile", "Star missile", "Nova missile"], + "Blast": ["Firecracker", "Big firecracker", "Super firecracker"], + "Missile": ["Bottle rocket", "Big bottle rocket", "Multi bottle rocket"] + } + + world.spray_names = { + "Hypnosis": "Chloroform spray", + "Paralysis": "Nerve spray", + "Offense Up": "Offense spray", + "Defense Down": "Weakness spray", + "Brainshock": "Confusion spray", + "Defense up": "Defense spray", + "Drain": "HP-straw", + "Disable": "Distraction spray", + "Stop": "Slime spray", + "Neutralize": "Shield-off spray" + } + world.broken_gadgets = { + "Hypnosis": ["Broken watch", "Broken screen"], + "Paralysis": ["Broken razor", "Broken fan"], + "Offense Up": ["Broken faucet", "Broken tuba"], + "Defense Down": ["Broken sprinkler", "Broken trombone"], + "Brainshock": ["Broken toaster", "Broken fryer"], + "Defense up": ["Broken nozzle", "Broken trumpet"], + "Drain": ["Broken hose", "Broken tube"], + "Disable": ["Broken machine", "Broken device"], + "Stop": ["Broken iron", "Broken steamer"], + "Neutralize": ["Broken pipe", "Broken board"] + } + + world.broken_desc = { + "Hypnosis": [0x00EEEBA4, 0x00EEEBCC], + "Paralysis": [0x00EEEC06, 0x00EEEC28], + "Offense Up": [0x00EEEC4D, 0x00EEEC75], + "Defense Down": [0x00EEECA5, 0x00EEECCB], + "Brainshock": [0x00EEED00, 0x00EEED2B], + "Defense up": [0x00EEED5A, 0x00C53929], + "Drain": [0x00EEED8A, 0x00C538E0], + "Disable": [0x00C53772, 0x00EEEDB2], + "Stop": [0x00C53870, 0x00EEEE03], + "Neutralize": [0x00C53897, 0x00EEEE2F] + } + + world.gadget_names = { + "Hypnosis": ["Hypno pendulum", "Hypno screen"], + "Paralysis": ["Nerve taser", "Nerve ray"], + "Offense Up": ["Offensalizer", "Offense shower"], + "Defense Down": ["Weakalizer", "Weakness shower"], + "Brainshock": ["Mind jammer", "Mind fryer"], + "Defense up": ["Defensalizer", "Defense shower"], + "Drain": ["HP-sucker", "Hungry HP-sucker"], + "Disable": ["Counter-PSI unit", "PSI-nullifier unit"], + "Stop": ["Slime generator", "Slime blaster"], + "Neutralize": ["Shield killer", "Neutralizer"] + } + + world.starstorm_address = { + "Special": [0x002D, 0x003C], + "Flash": [0x011D, 0x012C], + "Fire": [0x0069, 0x0078], + "Freeze": [0x00A5, 0x00B4], + "Thunder": [0x00E1, 0x00F0], + "Starstorm": [0x013B, 0x014A], + "Blast": [0x0438, 0x0447], + "Missile": [0x0474, 0x0483] + } + + world.starstorm_spell_id = { + "Special": [0x03, 0x04], + "Flash": [0x13, 0x14], + "Fire": [0x07, 0x08], + "Freeze": [0x0B, 0x0C], + "Thunder": [0x0F, 0x10], + "Starstorm": [0x15, 0x16], + "Blast": [0x48, 0x49], + "Missile": [0x4C, 0x4D] + } + + world.jeff_addresses = [ + 0x156665, # Bomb + 0x15668C, # Super Bomb + 0x156443, # Bazooka + 0x15646A, # Heavy bazooka + 0x1551FB, # broken bazooka + + 0x1565F0, # Bottle Rocket + 0x156617, # Big Bottle Rocket + 0x15663E, # multi Bottle Rocket + ] + + world.gadget_addresses = [ + [0, 0x1567EB], # defense shower + [0x156491, 0x1564B8], # HP-Sucker + [0x1563F5], # Counter-PSI Unit + [0x156506], # Slime Generator + [0x15641C, 0x156DB5], # Shield Killer + ] + + world.broken_gadget_addresses = [ + 0x155222, + 0x1551D4, + 0x15509C, + 0x15515F, + 0x155186 + ] + + world.bomb_desc = { + "Special": [0x00EED4D8, 0x00EED521, 0x00EEDA4F, 0x00EEDA6B, 0x00EEDCFB], + "Flash": [0x00EED538, 0x00EED5AB, 0x00EEDA87, 0x00EEDAD7, 0x00EEDD1D], + "Fire": [0x00EED659, 0x00EED6CC, 0x00EEDB37, 0x00EEDB68, 0x00EEDD40], + "Freeze": [0x00EED744, 0x00EED79D, 0x00EEDB85, 0x00EEDBA2, 0x00EEDD64], + "Thunder": [0x00EED822, 0x00EED88E, 0x00EEDBBF, 0x00EEDBE4, 0x00EEDDA0], + "Starstorm": [0x00EED4D8, 0x00EED521, 0x00EEDA4F, 0x00EEDCD2, 0x00EEDDC3], + "Blast": [0x00C54EA7, 0x00C54EF7, 0x00C54AA1, 0x00C54AF5, 0x00C53908], + "Missile": [0x00EED9A5, 0x00EED9FF, 0x00EEDC09, 0x00EEDC40, 0x00EEDDEE] + } + + world.rocket_desc = { + "Special": [0x00EEDE25, 0x00EEDE41, 0x00EEDE80], + "Flash": [0x00EEDEDC, 0x00EEDF37, 0x00EEDFAE], + "Fire": [0x00EEE013, 0x00EEE031, 0x00EEE061], + "Freeze": [0x00EEE098, 0x00EEE0B5, 0x00EEE11E], + "Thunder": [0x00EEE190, 0x00EEE1B6, 0x00EEE220], + "Starstorm": [0x00EEE28B, 0x00EEE2A7, 0x00EEE2DB], + "Blast": [0x00EEE344, 0x00EEE35B, 0x00EEE36E], + "Missile": [0x00C54E01, 0x00C54E20, 0x00C54E54] + } + + world.spray_desc = { + "Hypnosis": 0x00EEE653, + "Paralysis": 0x00EEE688, + "Offense Up": 0x00EEE6B9, + "Defense Down": 0x00EEE705, + "Brainshock": 0x00EEE751, + "Defense up": 0x00C2558D, + "Drain": 0x00EEE802, + "Disable": 0x00EEE838, + "Stop": 0x00EEE7D0, + "Neutralize": 0x00EEE78F + } + + world.gadget_desc = { + "Hypnosis": [0x00EEE87B, 0x00EEE8AA], + "Paralysis": [0x00EEE8DA, 0x00EEE905], + "Offense Up": [0x00EEE933, 0x00EEE97F], + "Defense Down": [0x00EEE9C2, 0x00EEEA0E], + "Brainshock": [0x00EEEA9D, 0x00EEEAD2], + "Defense up": [0x00EEEA51, 0x00C5519F], + "Drain": [0x00C54B67, 0x00C54BB0], + "Disable": [0x00C54A3A, 0x00EEEB5E], + "Stop": [0x00C54C32, 0x00EEEB09], + "Neutralize": [0x00C54A6C, 0x00C559D9] + } + + world.bomb_actions = { + "Special": [0x01AC, 0x01AD, 0x01CF, 0x01D0], + "Flash": [0x01AE, 0x01AF, 0x01D1, 0x01D2], + "Fire": [0x01B0, 0x01B1, 0x01D3, 0x01D4], + "Freeze": [0x01B2, 0x01B3, 0x01D5, 0x01D6], + "Thunder": [0x01B4, 0x01B5, 0x01D7, 0x01D8], + "Starstorm": [0x01B6, 0x01B7, 0x01D9, 0x01DA], + "Blast": [0x00A7, 0x00A8, 0x0136, 0x0137], + "Missile": [0x01B8, 0x01B9, 0x01DB, 0x01DC] + } + + world.missile_actions = { + "Special": [0x01BA, 0x01BB, 0x01BC], + "Flash": [0x01BD, 0x01BE, 0x01BF], + "Fire": [0x01C0, 0x01C1, 0x01C2], + "Freeze": [0x01C3, 0x01C4, 0x01C5], + "Thunder": [0x01C6, 0x01C7, 0x01C8], + "Starstorm": [0x01C9, 0x01CA, 0x01CB], + "Blast": [0x01CC, 0x01CD, 0x01CE], + "Missile": [0x00A3, 0x00A4, 0x00A5] + } + + world.gadget_actions = { + "Hypnosis": [0x01E7, 0x01E8], + "Paralysis": [0x01E9, 0x01EA], + "Offense Up": [0x01EB, 0x01EC], + "Defense Down": [0x01ED, 0x01EE], + "Brainshock": [0x01EF, 0x01F0], + "Defense up": [0x00B7, 0x00B8], + "Drain": [0x00A1, 0x00B0], + "Disable": [0x009F, 0x01F1], + "Stop": [0x00A9, 0x01F2], + "Neutralize": [0x00A0, 0x00F7] + } + + world.jeff_item_counts = [ + 5, # Bomb + 3 # Bottle Rocket + ] + + world.gadget_counts = [ + 1, # defense shower + 2, # HP-Sucker + 1, # Counter PSI unit + 1, # Slime generator + 2 # Neutralizer + ] + + world.gadget_ids = [ + [0x00, 0x9D], + [0x87, 0x88], + [0x83], + [0x8A], + [0x84, 0xC3] + ] + + world.broken_gadget_ids = [ + 0x0E, # Broken trumpet + 0x0C, # Broken tube + 0x04, # Broken machine + 0x09, # Broken iron + 0x0A # Broken pipe + ] + + world.jeff_item_names = [ + world.bomb_names, + world.rocket_names + ] + + world.jeff_help_text = [ + world.bomb_desc, + world.rocket_desc + ] + + world.attack_types = [ + world.bomb_actions, + world.missile_actions + ] + + +def write_psi(world: "EarthBoundWorld", rom: "LocalRom") -> None: + from ..game_data.text_data import text_encoder + psi_num = 0 + for spell, (address, levels) in world.psi_address.items(): + for i in range(levels): + rom.write_bytes(address + 9, bytearray(world.psi_slot_data[psi_num][i])) + rom.write_bytes(address + 6, bytearray(world.psi_level_data[psi_num][i])) + if psi_num == 0: + rom.write_bytes(address, bytearray([0x01])) + elif psi_num == 5 and i > 1: + rom.write_bytes(0x01C4AB + (0x9E * (i - 2)), struct.pack("H", world.starstorm_address[spell][i - 2])) # Menu spells + rom.write_bytes(0x01C536 + (0x78 * (i - 2)), bytearray([world.starstorm_spell_id[spell][i - 2]])) # What spell is controlled by the PSI flags + rom.write_bytes(0x2E957F + (0x11 * (i - 2)), bytearray([world.starstorm_spell_id[spell][i - 2]])) # The global Poo PSI text + rom.write_bytes(address + 9, bytearray(world.psi_slot_data[psi_num][i - 2])) + + if spell == "Special" and psi_num != 0: + rom.write_bytes(address, bytearray([0x12])) + + address += 15 + if spell == "Starstorm" and i == 1: + address = 0x158B8B + # todo; expanded psi + # todo; animation for Starstorm L/D + # todo; swap enemy actions for Special? + # todo; cleanup stuff + psi_num += 1 + + # rom.write_bytes(0x2E957F + (0x11 * (i - 2)), bytearray([world.starstorm_spell_id[spell][i - 2]])) + # Starstorm spell for the item locally + rom.write_bytes(0x2EAE2E, bytearray([world.starstorm_spell_id[world.offensive_psi_slots[5]][0]])) + rom.write_bytes(0x2EAE38, bytearray([world.starstorm_spell_id[world.offensive_psi_slots[5]][1]])) + + jeff_item_num = 0 + jeff_item_index = 0 + for item in world.jeff_offense_items: + for i in range(world.jeff_item_counts[jeff_item_num]): + address = world.jeff_addresses[jeff_item_index] + jeff_item_index += 1 + name = world.jeff_item_names[jeff_item_num][item][i] + description = world.jeff_help_text[jeff_item_num][item][i] + name_encoded = text_encoder(name, 22) + name_encoded.extend(([0x00])) + rom.write_bytes(address, name_encoded) + rom.write_bytes(address + 35, struct.pack("I", description)) + if "Broken" not in name: # broken items don't need attack data + attack = world.attack_types[jeff_item_num][item][i] + rom.write_bytes(address + 29, struct.pack("H", attack)) + jeff_item_num += 1 + jeff_item_num = 0 + name = world.spray_names[world.jeff_assist_items[0]] + name_encoded = text_encoder(name, 22) + name_encoded.extend(([0x00])) + description = world.spray_desc[world.jeff_assist_items[0]] + address = 0x156887 + action = world.gadget_actions[world.jeff_assist_items[0]][0] + rom.write_bytes(address, name_encoded) + rom.write_bytes(address + 35, struct.pack("I", description)) + rom.write_bytes(address + 29, struct.pack("H", action)) + + for item in world.jeff_assist_items: + for i in range(world.gadget_counts[jeff_item_num]): + if jeff_item_num == 0: + i = 1 + name = world.gadget_names[item][i] + name_encoded = text_encoder(name, 22) + name_encoded.extend(([0x00])) + description = world.gadget_desc[item][i] + action = world.gadget_actions[world.jeff_assist_items[jeff_item_num]][i] + address = world.gadget_addresses[jeff_item_num][i] + rom.write_bytes(address, name_encoded) + rom.write_bytes(address + 35, struct.pack("I", description)) + rom.write_bytes(address + 29, struct.pack("H", action)) + rom.write_bytes(description - 0xC00000 + 5, bytearray([world.gadget_ids[jeff_item_num][i]])) + jeff_item_num += 1 + + for i in range(5): + item = world.jeff_assist_items[i] + if i < 2: + level = 1 + else: + level = 0 + address = world.broken_gadget_addresses[i] + name = world.broken_gadgets[item][level] + description = world.broken_desc[item][level] + name_encoded = text_encoder(name, 22) + name_encoded.extend(([0x00])) + rom.write_bytes(address, name_encoded) + rom.write_bytes(address + 35, struct.pack("I", description)) + rom.write_bytes(description - 0xC00000 + 5, bytearray([world.broken_gadget_ids[i]])) + + rom.write_bytes(0x15A8EB, bytearray(struct.pack("H", world.gadget_actions[world.jeff_assist_items[4]][1]))) + rom.write_bytes(0x15BB45, bytearray(struct.pack("H", world.gadget_actions[world.jeff_assist_items[0]][0]))) + rom.write_bytes(0x15BBA5, bytearray(struct.pack("H", world.gadget_actions[world.jeff_assist_items[4]][0]))) + rom.write_bytes(0x15DF41, bytearray(struct.pack("H", world.gadget_actions[world.jeff_assist_items[4]][0]))) + rom.write_bytes(0x15DF3F, bytearray(struct.pack("H", world.gadget_actions[world.jeff_assist_items[4]][1]))) + rom.write_bytes(0x15BA2B, bytearray(struct.pack("H", world.gadget_actions[world.jeff_assist_items[1]][0]))) + rom.write_bytes(0x15C06D, bytearray(struct.pack("H", world.gadget_actions[world.jeff_assist_items[1]][1]))) + + +def adjust_psi_list(psi_input: list[str], spell: str, index: int) -> None: + """Move a spell in the PSI table to a different entry/slot""" + psi_input.insert(index, (psi_input.pop(psi_input.index(spell)))) diff --git a/worlds/earthbound/modules/shopsanity.py b/worlds/earthbound/modules/shopsanity.py new file mode 100644 index 0000000000..26ca52c1d8 --- /dev/null +++ b/worlds/earthbound/modules/shopsanity.py @@ -0,0 +1,449 @@ +from ..game_data.local_data import psi_item_table, character_item_table, special_name_table, item_id_table, money_item_table +from ..game_data.text_data import calc_pixel_width, text_encoder +from ..game_data.static_location_data import location_ids +from ..Options import ShopRandomizer, MagicantMode, MonkeyCavesMode +from BaseClasses import ItemClassification, Location +import struct +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from . import EarthBoundWorld + from .Rom import LocalRom + +high_purchase_areas = { + "Twoson", + "Fourside", + "Scaraba", + "Andonuts Lab Area" # long walk with no atm +} + +shop_locations = { + "Onett Drugstore - Right Counter Slot 1", + "Onett Drugstore - Right Counter Slot 2", + "Onett Drugstore - Right Counter Slot 3", + "Onett Drugstore - Right Counter Slot 4", + "Onett Drugstore - Right Counter Slot 5", + "Onett Drugstore - Left Counter", + "Summers - Beach Cart", + "Onett Burger Shop - Slot 1", + "Onett Burger Shop - Slot 2", + "Onett Burger Shop - Slot 3", + "Onett Burger Shop - Slot 4", + "Onett Bakery - Slot 1", + "Onett Bakery - Slot 2", + "Onett Bakery - Slot 3", + "Onett Bakery - Slot 4", + "Twoson Department Store Burger Shop - Slot 1", + "Twoson Department Store Burger Shop - Slot 2", + "Twoson Department Store Burger Shop - Slot 3", + "Twoson Department Store Burger Shop - Slot 4", + "Twoson Department Store Bakery - Slot 1", + "Twoson Department Store Bakery - Slot 2", + "Twoson Department Store Bakery - Slot 3", + "Twoson Department Store Bakery - Slot 4", + "Twoson Department Store Top Floor - Right Counter Slot 1", + "Twoson Department Store Top Floor - Right Counter Slot 2", + "Twoson Department Store Top Floor - Right Counter Slot 3", + "Twoson Department Store Top Floor - Right Counter Slot 4", + "Twoson Department Store Top Floor - Right Counter Slot 5", + "Twoson Department Store Top Floor - Right Counter Slot 6", + "Twoson Department Store Top Floor - Left Counter Slot 1", + "Summers - Magic Cake Cart Shop Slot", + "Burglin Park Junk Shop - Slot 1", + "Burglin Park Junk Shop - Slot 2", + "Burglin Park Junk Shop - Slot 3", + "Burglin Park Junk Shop - Slot 4", + "Burglin Park Junk Shop - Slot 5", + "Burglin Park Junk Shop - Slot 6", + "Burglin Park Bread Stand - Slot 1", + "Burglin Park Bread Stand - Slot 2", + "Burglin Park Bread Stand - Slot 3", + "Burglin Park Bread Stand - Slot 4", + "Burglin Park Bread Stand - Slot 5", + "Burglin Park Bread Stand - Slot 6", + "Burglin Park - Banana Stand", + "Happy-Happy Village Drugstore - Right Counter Slot 1", + "Happy-Happy Village Drugstore - Right Counter Slot 2", + "Happy-Happy Village Drugstore - Right Counter Slot 3", + "Happy-Happy Village Drugstore - Right Counter Slot 4", + "Happy-Happy Village Drugstore - Right Counter Slot 5", + "Threed Drugstore - Right Counter Slot 1", + "Threed Drugstore - Right Counter Slot 2", + "Threed Drugstore - Right Counter Slot 3", + "Threed Drugstore - Right Counter Slot 4", + "Threed Drugstore - Right Counter Slot 5", + "Threed Drugstore - Left Counter Slot 1", + "Threed Drugstore - Left Counter Slot 2", + "Threed Drugstore - Left Counter Slot 3", + "Threed Drugstore - Left Counter Slot 4", + "Threed Drugstore - Left Counter Slot 5", + "Threed - Arms Dealer Slot 1", + "Threed - Arms Dealer Slot 2", + "Threed - Arms Dealer Slot 3", + "Threed - Arms Dealer Slot 4", + "Threed Bakery - Slot 1", + "Threed Bakery - Slot 2", + "Threed Bakery - Slot 3", + "Threed Bakery - Slot 4", + "Threed Bakery - Slot 5", + "Threed Bakery - Slot 6", + "Threed Bakery - Slot 7", + "Scaraba - Expensive Water Guy", + "Winters Drugstore - Slot 1", + "Winters Drugstore - Slot 2", + "Winters Drugstore - Slot 3", + "Winters Drugstore - Slot 4", + "Winters Drugstore - Slot 5", + "Winters Drugstore - Slot 6", + "Winters Drugstore - Slot 7", + "Saturn Valley Shop - Center Saturn Slot 1", + "Saturn Valley Shop - Center Saturn Slot 2", + "Saturn Valley Shop - Center Saturn Slot 3", + "Saturn Valley Shop - Center Saturn Slot 4", + "Saturn Valley Shop - Center Saturn Slot 5", + "Dusty Dunes Drugstore - Counter Slot 1", + "Dusty Dunes Drugstore - Counter Slot 2", + "Dusty Dunes Drugstore - Counter Slot 3", + "Dusty Dunes Drugstore - Counter Slot 4", + "Dusty Dunes Drugstore - Counter Slot 5", + "Dusty Dunes - Arms Dealer Slot 1", + "Dusty Dunes - Arms Dealer Slot 2", + "Dusty Dunes - Arms Dealer Slot 3", + "Dusty Dunes - Arms Dealer Slot 4", + "Fourside Bakery - Slot 1", + "Fourside Bakery - Slot 2", + "Fourside Bakery - Slot 3", + "Fourside Bakery - Slot 4", + "Fourside Bakery - Slot 5", + "Fourside Bakery - Slot 6", + "Fourside Department Store - Tool Shop Slot 1", + "Fourside Department Store - Tool Shop Slot 2", + "Fourside Department Store - Tool Shop Slot 3", + "Fourside Department Store - Tool Shop Slot 4", + "Fourside Department Store - Tool Shop Slot 5", + "Fourside Department Store - Tool Shop Slot 6", + "Fourside Department Store - Tool Shop Slot 7", + "Fourside Department Store - Shop Shop Slot 1", + "Fourside Department Store - Shop Shop Slot 2", + "Fourside Department Store - Shop Shop Slot 3", + "Fourside Department Store - Shop Shop Slot 4", + "Fourside Department Store - Food Shop Slot 1", + "Fourside Department Store - Food Shop Slot 2", + "Fourside Department Store - Food Shop Slot 3", + "Fourside Department Store - Food Shop Slot 4", + "Fourside Department Store - Food Shop Slot 5", + "Fourside Department Store - 2F Cart Slot 1", + "Fourside Department Store - 2F Cart Slot 2", + "Fourside Department Store - 2F Cart Slot 3", + "Fourside Department Store - 2F Cart Slot 4", + "Fourside Department Store - 2F Cart Slot 5", + "Fourside Department Store - 2F Cart Slot 6", + "Fourside Department Store - 2F Cart Slot 7", + "Fourside Department Store - Toys Shop Slot 1", + "Fourside Department Store - Toys Shop Slot 2", + "Fourside Department Store - Toys Shop Slot 3", + "Fourside Department Store - Toys Shop Slot 4", + "Fourside Department Store - Toys Shop Slot 5", + "Fourside Department Store - Toys Shop Slot 6", + "Fourside Department Store - Sports Shop Slot 1", + "Fourside Department Store - Sports Shop Slot 2", + "Fourside Department Store - Sports Shop Slot 3", + "Fourside Department Store - Sports Shop Slot 4", + "Fourside Department Store - Burger Shop Slot 1", + "Fourside Department Store - Burger Shop Slot 2", + "Fourside Department Store - Burger Shop Slot 3", + "Fourside Department Store - Burger Shop Slot 4", + "Fourside Department Store - Burger Shop Slot 5", + "Fourside Department Store - Arms Dealer Slot 1", + "Fourside Department Store - Arms Dealer Slot 2", + "Fourside Department Store - Arms Dealer Slot 3", + "Fourside Department Store - Arms Dealer Slot 4", + "Fourside Department Store - Arms Dealer Slot 5", + "Fourside - Northeast Alley Junk Shop Slot 1", + "Fourside - Northeast Alley Junk Shop Slot 2", + "Fourside - Northeast Alley Junk Shop Slot 3", + "Fourside - Northeast Alley Junk Shop Slot 4", + "Magicant - Shop Slot 1", + "Magicant - Shop Slot 2", + "Summers - Scam Shop Slot 1", + "Summers - Scam Shop Slot 2", + "Summers - Scam Shop Slot 3", + "Summers - Scam Shop Slot 4", + "Summers - Scam Shop Slot 5", + "Summers - Scam Shop Slot 6", + "Summers - Scam Shop Slot 7", + "Summers Harbor - Shop Slot 1", + "Summers Harbor - Shop Slot 2", + "Summers Harbor - Shop Slot 3", + "Summers Harbor - Shop Slot 4", + "Summers Harbor - Shop Slot 5", + "Summers Harbor - Shop Slot 6", + "Summers Harbor - Shop Slot 7", + "Summers Restaurant - Slot 1", + "Summers Restaurant - Slot 2", + "Summers Restaurant - Slot 3", + "Summers Restaurant - Slot 4", + "Summers Restaurant - Slot 5", + "Summers Restaurant - Slot 6", + "Scaraba - Indoors Shop Slot 1", + "Scaraba - Indoors Shop Slot 2", + "Scaraba - Indoors Shop Slot 3", + "Scaraba - Indoors Shop Slot 4", + "Scaraba - Indoors Shop Slot 5", + "Scaraba - Indoors Shop Slot 6", + "Scaraba Bazaar - Red Snake Carpet Slot 1", + "Scaraba Bazaar - Red Snake Carpet Slot 2", + "Scaraba Bazaar - Red Snake Carpet Slot 3", + "Scaraba Bazaar - Bottom Left Carpet Slot 1", + "Scaraba Bazaar - Bottom Left Carpet Slot 2", + "Scaraba Bazaar - Bottom Left Carpet Slot 3", + "Scaraba Bazaar - Bottom Left Carpet Slot 4", + "Scaraba Bazaar - Bottom Left Carpet Slot 5", + "Scaraba Bazaar - Bottom Left Carpet Slot 6", + "Scaraba Hotel - Arms Dealer Slot 1", + "Scaraba Hotel - Arms Dealer Slot 2", + "Scaraba Hotel - Arms Dealer Slot 3", + "Scaraba Hotel - Arms Dealer Slot 4", + "Deep Darkness - Businessman Slot 1", + "Deep Darkness - Businessman Slot 2", + "Deep Darkness - Businessman Slot 3", + "Deep Darkness - Businessman Slot 4", + "Deep Darkness - Businessman Slot 5", + "Deep Darkness - Businessman Slot 6", + "Deep Darkness - Businessman Slot 7", + "Happy-Happy Village - Trust Shop Slot 1", + "Happy-Happy Village - Trust Shop Slot 2", + "Saturn Valley Shop - Post-Belch Saturn Slot 1", + "Saturn Valley Shop - Post-Belch Saturn Slot 2", + "Saturn Valley Shop - Post-Belch Saturn Slot 3", + "Saturn Valley Shop - Post-Belch Saturn Slot 4", + "Scaraba - Southern Camel Shop Slot 1", + "Scaraba - Southern Camel Shop Slot 2", + "Scaraba - Southern Camel Shop Slot 3", + "Scaraba - Southern Camel Shop Slot 4", + "Scaraba - Southern Camel Shop Slot 5", + "Scaraba - Southern Camel Shop Slot 6", + "Scaraba - Southern Camel Shop Slot 7", + "Deep Darkness - Arms Dealer Slot 1", + "Deep Darkness - Arms Dealer Slot 2", + "Deep Darkness - Arms Dealer Slot 3", + "Deep Darkness - Arms Dealer Slot 4", + "Lost Underworld - Tenda Camp Shop Slot 1", + "Lost Underworld - Tenda Camp Shop Slot 2", + "Lost Underworld - Tenda Camp Shop Slot 3", + "Lost Underworld - Tenda Camp Shop Slot 4", + "Lost Underworld - Tenda Camp Shop Slot 5", + "Lost Underworld - Tenda Camp Shop Slot 6", + "Lost Underworld - Tenda Camp Shop Slot 7", + "Happy-Happy Village Drugstore - Left Counter Slot 1", + "Happy-Happy Village Drugstore - Left Counter Slot 2", + "Happy-Happy Village Drugstore - Left Counter Slot 3", + "Happy-Happy Village Drugstore - Left Counter Slot 4", + "Happy-Happy Village Drugstore - Left Counter Slot 5", + "Happy-Happy Village Drugstore - Left Counter Slot 6", + "Happy-Happy Village Drugstore - Left Counter Slot 7", + "Grapefruit Falls - Hiker Shop Slot 1", + "Grapefruit Falls - Hiker Shop Slot 2", + "Grapefruit Falls - Hiker Shop Slot 3", + "Saturn Valley Shop - Top Saturn Slot 1", + "Saturn Valley Shop - Top Saturn Slot 2", + "Saturn Valley Shop - Top Saturn Slot 3", + "Saturn Valley Shop - Top Saturn Slot 4", + "Saturn Valley Shop - Top Saturn Slot 5", + "Saturn Valley Shop - Top Saturn Slot 6", + "Saturn Valley Shop - Top Saturn Slot 7", + "Dusty Dunes Drugstore - Left Shop Slot 1", + "Dusty Dunes Drugstore - Left Shop Slot 2", + "Dusty Dunes Drugstore - Left Shop Slot 3", + "Dusty Dunes Drugstore - Left Shop Slot 4", + "Dusty Dunes Drugstore - Left Shop Slot 5", + "Dusty Dunes Drugstore - Left Shop Slot 6", + "Dusty Dunes Drugstore - Left Shop Slot 7", + "Dusty Dunes - Mine Food Cart Slot 1", + "Dusty Dunes - Mine Food Cart Slot 2", + "Dusty Dunes - Mine Food Cart Slot 3", + "Dusty Dunes - Mine Food Cart Slot 4", + "Dusty Dunes - Mine Food Cart Slot 5", + "Dusty Dunes - Mine Food Cart Slot 6", + "Dusty Dunes - Mine Food Cart Slot 7", + "Moonside Hotel - Shop Slot 1", + "Moonside Hotel - Shop Slot 2", + "Moonside Hotel - Shop Slot 3", + "Moonside Hotel - Shop Slot 4", + "Moonside Hotel - Shop Slot 5", + "Dalaam Restaurant - Slot 1", + "Dalaam Restaurant - Slot 2", + "Dalaam Restaurant - Slot 3", + "Dalaam Restaurant - Slot 4", + "Scaraba Bazaar - Delicacy Shop Slot 1", + "Scaraba Bazaar - Delicacy Shop Slot 2", + "Scaraba Bazaar - Delicacy Shop Slot 3", + "Scaraba Bazaar - Delicacy Shop Slot 4", + "Scaraba Bazaar - Delicacy Shop Slot 5", + "Scaraba Bazaar - Delicacy Shop Slot 6", + "Scaraba Bazaar - Delicacy Shop Slot 7", + "Twoson/Scaraba - Shared Condiment Shop Slot 1", + "Twoson/Scaraba - Shared Condiment Shop Slot 2", + "Twoson/Scaraba - Shared Condiment Shop Slot 3", + "Twoson/Scaraba - Shared Condiment Shop Slot 4", + "Twoson/Scaraba - Shared Condiment Shop Slot 5", + "Twoson/Scaraba - Shared Condiment Shop Slot 6", + "Twoson/Scaraba - Shared Condiment Shop Slot 7", + "Andonuts Lab - Caveman Shop Slot 1", + "Andonuts Lab - Caveman Shop Slot 2", + "Andonuts Lab - Caveman Shop Slot 3", + "Andonuts Lab - Caveman Shop Slot 4", + "Andonuts Lab - Caveman Shop Slot 5" +} + + +def write_shop_checks(world: "EarthBoundWorld", rom: "LocalRom", shop_checks: list[Location]) -> None: + unsellable_filler_prices = { + "Broken Machine": 150, + "Broken Air Gun": 110, + "Broken Laser": 250, + "Broken Pipe": 250, + "Broken Tube": 800, + "Broken Bazooka": 900, + "Broken Trumpet": 500, + "Broken Harmonica": 1500, + "Counter-PSI Unit": 300, + "Shield Killer": 500, + "Heavy Bazooka": 1800, + "Hungry HP-Sucker": 1600, + "Defense Shower": 1000, + "Neutralizer": 5000, + "Brain Stone": 2, + "Monkey's Love": 2 + } + # Unique non-progression items that have no price by default. If they're on a shop, + # give them a base price. (prog items are handled by the "price" variable) + # Equipamizer already assigns prices to Equipment with no price, so they can be exempt. + if not world.options.armorizer: + unsellable_filler_prices["Cloak of Kings"] = 2000 + unsellable_filler_prices["Diadem of Kings"] = 1500 + unsellable_filler_prices["Bracer of Kings"] = 3500 + + if not world.options.weaponizer: + unsellable_filler_prices["Magicant Bat"] = 3000 + unsellable_filler_prices["Legendary Bat"] = 5000 + unsellable_filler_prices["Magnum Air Gun"] = 220 + unsellable_filler_prices["Laser Gun"] = 500 + unsellable_filler_prices["Baddest Beam"] = 3000 + + if world.options.shop_randomizer == ShopRandomizer.option_shopsanity: + rom.write_bytes(0x04FD77, bytearray([world.options.scout_shop_checks])) + for location in shop_checks: + + flag = location.address - 0xEB1000 + if location.item.player == world.player: + if world.options.remote_items: + if location.item.name in special_name_table or location.item.name in money_item_table: + item_type = 0x04 + item_id = 0xAD + else: + item_type = 0x05 + item_id = item_id_table[location.item.name] + else: + if location.item.name in psi_item_table: + item_type = 0x01 + item_id = psi_item_table[location.item.name] + elif location.item.name == "Photograph" and location.item.player == world.player: + item_type = 0x06 + item_id = 0xAD + elif location.item.name in character_item_table: + item_type = 0x02 + item_id = character_item_table[location.item.name][0] + elif location.item.name in money_item_table: + item_type = 0x07 + item_id = list(money_item_table).index(location.item.name) + 1 + else: + item_type = 0x00 + item_id = item_id_table[location.item.name] + + if location.item.name in unsellable_filler_prices and location.item.player == world.player: + rom.write_bytes(0x15501A + (item_id_table[location.item.name] * 39), + struct.pack("H", unsellable_filler_prices[location.item.name])) + + else: + item_type = 0x04 + item_id = 0xAD + + if ItemClassification.trap in location.item.classification: + price = 0 + else: + price = world.random.randint(1, (75 * world.area_levels[location.parent_region.name])) + + if location.parent_region.name in high_purchase_areas: + price = int(price / 1.5) + + item_struct = struct.pack(' 78: + menu_item_name = menu_item_name[:-1] + pixel_length = calc_pixel_width(menu_item_name) + menu_item_name = text_encoder(menu_item_name, 0x30) + player_name = text_encoder(world.multiworld.get_player_name(location.item.player), 16) + player_name.append(0x00) + rom.write_bytes(0x341190 + (flag * 0x30), menu_item_name) + rom.write_bytes(0x3466D0 + (flag * 0x11), player_name) + rom.write_bytes(0x351100 + (flag * 127), menu_long_name) + + rom.write_bytes(0x019DE5, struct.pack("I", 0xF007805C)) # Build the shop menus + rom.write_bytes(0x019E23, struct.pack("I", 0xF008465C)) # Display the item name + rom.write_bytes(0x019E8F, struct.pack("I", 0xF0094E5C)) # Display the item price + rom.write_bytes(0x011AC6, struct.pack("I", 0xF009985C)) # display the player name + rom.write_bytes(0x019EDD, struct.pack("I", 0xF00AA45C)) # Transfer the used data and player selection into a script for processing + rom.write_bytes(0x019ED3, struct.pack("I", 0xF00ADD5C)) # Display SOLD OUT + rom.write_bytes(0x019B66, struct.pack("I", 0xF00B0B5C)) # Prevent items for other players flashing the "you can equip this" + rom.write_bytes(0x019DA0, struct.pack("I", 0xF00B275C)) # Preserve the greyed out HP/PP palette + + rom.write_bytes(0x05E0A9, struct.pack("I", 0xF4900008)) # Compare the price of the item with money on hand + rom.write_bytes(0x05E0B6, struct.pack("I", 0xF4905808)) # Display the item we bought and ask to confirm + # The player bought the item; set a flag and give it to them + rom.write_bytes(0x05E0CE, struct.pack("I", 0xF493C30A)) + rom.write_bytes(0x05E0C8, struct.pack("I", 0xF493C3)) + rom.write_bytes(0x05DF1E, struct.pack("I", 0xF496140A)) + # Prevent the game from checking inventory space if not needed + rom.write_bytes(0x05E029, struct.pack("I", 0xF496340A)) + rom.write_bytes(0x05E04C, struct.pack("I", 0xF496590A)) + rom.write_bytes(0x05E1AE, struct.pack("I", 0xF00EB8)) # Post-shop cleanup + + rom.write_bytes(0x05E1A5, struct.pack("I", 0xF00EAA)) + rom.write_bytes(0x05E119, struct.pack("I", 0xF00EB1)) + rom.write_bytes(0x05E0F2, struct.pack("I", 0xF00EC0)) + + rom.write_bytes(0x3407E0, bytearray([item_id_table[world.filler_shop[0]], 0x00, 0x00, 0x00, 0x49, 0x01])) + rom.write_bytes(0x3407E6, bytearray([item_id_table[world.filler_shop[1]], 0x00, 0x00, 0x00, 0x4A, 0x01])) + + rom.write_bytes(0x3408DC, bytearray([0xE0, 0x00, 0x00, 0x00, 0xFF, 0xFF])) + rom.write_bytes(0x3408E2, bytearray([0x5D, 0x00, 0x00, 0x00, 0xFF, 0xFF])) + rom.write_bytes(0x3408E8, bytearray([0x5A, 0x00, 0x00, 0x00, 0xFF, 0xFF])) + rom.write_bytes(0x3408EE, bytearray([0x7F, 0x00, 0x00, 0x00, 0xFF, 0xFF])) + rom.write_bytes(0x3408F4, bytearray([0x5F, 0x00, 0x00, 0x00, 0xFF, 0xFF])) + rom.write_bytes(0x3408FA, bytearray([0x6C, 0x00, 0x00, 0x00, 0xFF, 0xFF])) + rom.write_bytes(0x340900, bytearray([0x8C, 0x00, 0x00, 0x00, 0xFF, 0xFF])) + + if world.options.magicant_mode >= MagicantMode.option_alternate_goal: # 2 + rom.write_bytes(0x3405E8, bytearray([item_id_table[world.magicant_junk[6]], 0x00, 0x00, 0x00, 0xF5, 0x00])) + rom.write_bytes(0x3405EE, bytearray([item_id_table[world.magicant_junk[7]], 0x00, 0x00, 0x00, 0xF6, 0x00])) + else: + filler_shop_items = world.filler_drops.copy() + filler_shop_items = [x for x in filler_shop_items if x not in [227, 228, 229, 230, 231, 0]] + for location in location_ids: + if location_ids[location] >= 0xEB1000: + slot = location_ids[location] - 0xEB1000 + rom.write_bytes(0x1576B9 + slot, bytearray([world.random.choice(filler_shop_items)])) + rom.write_bytes(0x1576e3, bytearray([0xEF])) + rom.write_bytes(0x15779c, bytearray([0x5A])) + if world.options.monkey_caves_mode < MonkeyCavesMode.option_shop: # 2 + rom.write_bytes(0x15776b, bytearray([0xE0])) + rom.write_bytes(0x157775, bytearray([0x8C])) + rom.write_bytes(0x157778, bytearray([0x6C])) + rom.write_bytes(0x157781, bytearray([0x5D])) + rom.write_bytes(0x157848, bytearray([0x7F])) # DD Drugstore left counter 1 + rom.write_bytes(0x157802, bytearray([world.random.choice(filler_shop_items)])) + rom.write_bytes(0x157803, bytearray([world.random.choice(filler_shop_items)])) diff --git a/worlds/earthbound/setup_game.py b/worlds/earthbound/setup_game.py new file mode 100644 index 0000000000..19ba990c79 --- /dev/null +++ b/worlds/earthbound/setup_game.py @@ -0,0 +1,501 @@ +from .modules.flavor_data import random_flavors +from .game_data.text_data import lumine_hall_text, eb_text_table, text_encoder +from .game_data.local_data import item_id_table +from .modules.psi_shuffle import shuffle_psi +from .modules.boss_shuffle import initialize_bosses +from .modules.enemy_shuffler import shuffle_enemies +from .modules.dungeon_er import shuffle_dungeons +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from . import EarthBoundWorld + +def setup_gamevars(world: "EarthBoundWorld") -> None: + """Initialize or roll most world variables""" + + world.slime_pile_wanted_item = world.random.choice([ + "Cookie", + "Bag of Fries", + "Hamburger", + "Boiled Egg", + "Fresh Egg", + "Picnic Lunch", + "Pasta di Summers", + "Pizza", + "Chef's Special", + "Large Pizza", + "PSI Caramel", + "Magic Truffle", + "Brain Food Lunch", + "Rock Candy", + "Croissant", + "Bread Roll", + "Can of Fruit Juice", + "Royal Iced Tea", + "Protein Drink", + "Kraken Soup", + "Bottle of Water", + "Cold Remedy", + "Vial of Serum", + "IQ Capsule", + "Guts Capsule", + "Speed Capsule", + "Vital Capsule", + "Luck Capsule", + "Ketchup Packet", + "Sugar Packet", + "Tin of Cocoa", + "Carton of Cream", + "Sprig of Parsley", + "Jar of Hot Sauce", + "Salt Packet", + "Jar of Delisauce", + "Trout Yogurt", + "Banana", + "Calorie Stick", + "Gelato de Resort", + "Magic Tart", + "Cup of Noodles", + "Repel Sandwich", + "Repel Superwich", + "Lucky Sandwich", + "Cup of Coffee", + "Double Burger", + "Mammoth Burger", + "Peanut Cheese Bar", + "Piggy Jelly", + "Bowl of Rice Gruel", + "Bean Croquette", + "Molokheiya Soup", + "Plain Roll", + "Kabob", + "Plain Yogurt", + "Beef Jerky", + "Spicy Jerky", + "Luxury Jerky", + "Bottle of DXwater", + "Magic Pudding", + "Popsicle"]) + + if world.options.progressive_weapons: + for i in range(3): + world.common_gear.append("Progressive Bat") + world.common_gear.append("Progressive Gun") + world.common_gear.append("Progressive Fry Pan") + for i in range(3): + world.uncommon_gear.append("Progressive Bat") + world.uncommon_gear.append("Progressive Gun") + world.uncommon_gear.append("Progressive Fry Pan") + world.rare_gear.append("Progressive Bat") + world.rare_gear.append("Progressive Gun") + world.rare_gear.append("Progressive Fry Pan") + else: + world.common_gear.extend([ + "Cracked Bat", + "Tee Ball Bat", + "Sand Lot Bat", + "Minor League Bat", + "Fry Pan", + "Thick Fry Pan", + "Deluxe Fry Pan", + "Toy Air Gun", + "Zip Gun" + ]) + + world.uncommon_gear.extend([ + "Mr. Baseball Bat", + "T-Rex's Bat", + "Big League Bat", + "Chef's Fry Pan", + "Non-Stick Frypan", + "French Fry Pan", + "Hyper Beam", + "Crusher Beam" + ]) + + world.rare_gear.extend([ + "Hall of Fame Bat", + "Ultimate Bat", + "Gutsy Bat", + "Casey Bat", + "Holy Fry Pan", + "Magic Fry Pan" + ]) + + if world.options.progressive_armor: + for i in range(3): + world.common_gear.append("Progressive Bracelet") + world.common_gear.append("Progressive Other") + for i in range(3): + world.uncommon_gear.append("Progressive Bracelet") + world.uncommon_gear.append("Progressive Other") + world.rare_gear.append("Progressive Bracelet") + world.rare_gear.append("Progressive Other") + else: + world.common_gear.extend([ + "Cheap Bracelet", + "Copper Bracelet", + "Baseball Cap", + "Mr. Baseball Cap", + "Holmes Hat", + "Hard Hat", + "Coin of Defense" + ]) + + world.uncommon_gear.extend([ + "Platinum Band", + "Diamond Band", + "Lucky Coin", + "Silver Bracelet", + "Gold Bracelet", + "Coin of Slumber", + "Coin of Silence" + ]) + + world.rare_gear.extend([ + "Talisman Coin", + "Shiny Coin", + "Charm Coin" + ]) + + world.multiworld.push_precollected(world.create_item(world.starting_character)) + + valid_starts = 14 + if world.options.magicant_mode != 00: + valid_starts -= 1 + + if world.options.random_start_location: + world.start_location = world.random.randint(1, valid_starts) + else: + world.start_location = 0 + + if world.options.prefixed_items: + world.multiworld.itempool.append(world.create_item("Counter-PSI Unit")) + world.multiworld.itempool.append(world.create_item("Shield Killer")) + world.multiworld.itempool.append(world.create_item("Hungry HP-Sucker")) + world.multiworld.itempool.append(world.create_item("Defense Shower")) + world.multiworld.itempool.append(world.create_item("Heavy Bazooka")) + world.common_items.append("Defense Spray") + world.uncommon_items.append("Slime Generator") + if world.options.progressive_weapons: + for i in range(3): + world.multiworld.itempool.append(world.create_item("Progressive Gun")) + world.common_gear.append("Progressive Gun") + world.uncommon_gear.append("Progressive Gun") + world.rare_gear.append("Progressive Gun") + else: + world.multiworld.itempool.append(world.create_item("Magnum Air Gun")) + world.multiworld.itempool.append(world.create_item("Laser Gun")) + world.multiworld.itempool.append(world.create_item("Baddest Beam")) + world.uncommon_gear.append("Spectrum Beam") + world.rare_gear.append("Gaia Beam") + world.common_gear.append("Double Beam") + else: + world.multiworld.itempool.append(world.create_item("Broken Machine")) + world.multiworld.itempool.append(world.create_item("Broken Pipe")) + world.multiworld.itempool.append(world.create_item("Broken Tube")) + world.multiworld.itempool.append(world.create_item("Broken Trumpet")) + world.multiworld.itempool.append(world.create_item("Broken Bazooka")) + world.common_items.append("Broken Spray Can") + world.uncommon_items.append("Broken Iron") + + if world.options.progressive_weapons: + for i in range(3): + world.multiworld.itempool.append(world.create_item("Progressive Gun")) + world.common_gear.append("Progressive Gun") + world.uncommon_gear.append("Progressive Gun") + world.rare_gear.append("Progressive Gun") + else: + world.multiworld.itempool.append(world.create_item("Broken Air Gun")) + world.multiworld.itempool.append(world.create_item("Broken Laser")) + world.multiworld.itempool.append(world.create_item("Broken Harmonica")) + world.common_gear.append("Broken Gadget") + world.uncommon_gear.append("Broken Cannon") + world.rare_gear.append("Broken Antenna") + + for i in range(world.options.total_photos): + world.multiworld.itempool.append(world.create_item("Photograph")) + world.event_count += 1 + + world.franklinbadge_elements = [ + "thunder", + "fire", + "freeze", + "flash", + "starstorm", + "special", + "explosive" + ] + + world.starting_progressive_bats = 0 + world.starting_progressive_pans = 0 + world.starting_progressive_guns = 0 + world.starting_progressive_bracelets = 0 + world.starting_progressive_others = 0 + + if world.options.prefixed_items: + world.broken_guns = [ + "Magnum Air Gun", + "Laser Gun", + "Double Beam", + "Spectrum Beam", + "Baddest Beam", + "Gaia Beam" + ] + else: + world.broken_guns = [ + "Broken Air Gun", + "Broken Laser", + "Broken Gadget", + "Broken Cannon", + "Broken Harmonica", + "Broken Antenna" + ] + + world.bats = [ + "Sand Lot Bat", + "Minor League Bat", + "Mr. Baseball Bat", + "T-Rex's Bat", + "Big League Bat", + "Hall of Fame Bat", + "Casey Bat", + "Magicant Bat", + "Legendary Bat" + ] + + world.pans = [ + "Fry Pan", + "Thick Fry Pan", + "Deluxe Fry Pan", + "Chef's Fry Pan", + "Non-Stick Fry Pan", + "French Fry Pan", + "Holy Fry Pan", + "Magic Fry Pan" + ] + + world.guns = [ + "Pop Gun", + "Stun Gun", + "Toy Air Gun", + world.broken_guns[0], + "Zip Gun", + world.broken_guns[1], + "Hyper Beam", + world.broken_guns[2], + "Crusher Beam", + world.broken_guns[3], + "Death Ray", + world.broken_guns[4], + "Moon Beam Gun", + world.broken_guns[5] + ] + + world.bracelets = [ + "Cheap Bracelet", + "Copper Bracelet", + "Silver Bracelet", + "Gold Bracelet", + "Platinum Band", + "Diamond Band", + "Pixie's Bracelet", + "Cherub's Band", + "Goddess Band" + ] + + world.others = [ + "Baseball Cap", + "Mr. Baseball Cap", + "Holmes Hat", + "Hard Hat", + "Coin of Slumber", + "Coin of Defense", + "Coin of Slience" + "Mr. Saturn Coin", + "Charm Coin", + "Lucky Coin", + "Talisman Coin", + "Shiny Coin", + "Souvenir Coin" + + ] + + world.progressive_item_groups = { + "Progressive Bat": world.bats, + "Progressive Fry Pan": world.pans, + "Progressive Gun": world.guns, + "Progressive Bracelet": world.bracelets, + "Progressive Other": world.others + } + + world.start_prog_counts = { + "Progressive Bat": world.starting_progressive_bats, + "Progressive Fry Pan": world.starting_progressive_pans, + "Progressive Gun": world.starting_progressive_guns, + "Progressive Bracelet": world.starting_progressive_bracelets, + "Progressive Other": world.starting_progressive_others + } + + if world.options.randomize_franklinbadge_protection: + world.franklin_protection = world.random.choice(world.franklinbadge_elements) + else: + world.franklin_protection = "thunder" + + if world.options.random_start_location: + world.valid_teleports = [ + "Onett Teleport", + "Twoson Teleport", + "Happy-Happy Village Teleport", + "Threed Teleport", + "Saturn Valley Teleport", + "Fourside Teleport", + "Winters Teleport", + "Summers Teleport", + "Dalaam Teleport", + "Scaraba Teleport", + "Deep Darkness Teleport", + "Tenda Village Teleport", + "Lost Underworld Teleport" + ] + + if world.options.magicant_mode == 0: + world.valid_teleports.append("Magicant Teleport") + + del world.valid_teleports[world.start_location - 1] + + world.starting_teleport = world.random.choice(world.valid_teleports) + world.multiworld.push_precollected(world.create_item(world.starting_teleport)) + + filler_items = (world.common_items + world.uncommon_items + world.rare_items + world.common_gear + + world.uncommon_gear + world.rare_gear) + + if world.options.progressive_weapons: + remove_items = {"Progressive Bat", "Progressive Fry Pan", "Progressive Gun"} + filler_items = [item for item in filler_items if item not in remove_items] + + if world.options.progressive_armor: + remove_items = {"Progressive Bracelet", "Progressive Other"} + filler_items = [item for item in filler_items if item not in remove_items] + + world.filler_drops = [item_id_table[i] for i in filler_items if i in item_id_table] + world.filler_drops.append(0x00) + if world.options.prefixed_items: + world.filler_drops.extend([0xA1, 0xD7, 0x8A, 0x2C, 0x30]) + else: + world.filler_drops.extend([0x07, 0x05, 0x09, 0x0B, 0x10]) + + world.filler_shop = [] + if world.options.magicant_mode.value >= 2: + world.magicant_junk = [] + for i in range(8): + world.magicant_junk.append(world.random.choice(filler_items)) + for i in range(2): + world.filler_shop.append(world.random.choice(filler_items)) + + world.available_flavors = [] + if world.options.random_flavors: + for i in range(4): + world.available_flavors = world.random.sample(random_flavors, 4) + else: + world.available_flavors = [ + "Mint flavor", + "Strawberry flavor", + "Banana flavor", + "Peanut flavor" + ] + + world.lumine_text = [] + world.prayer_player = [] + if world.options.plando_lumine_hall_text == "": + lumine_str = world.random.choice(lumine_hall_text) + else: + lumine_str = world.options.plando_lumine_hall_text.value + + for char in lumine_str[:213]: + world.lumine_text.extend(eb_text_table[char]) + world.lumine_text.extend([0x00]) + world.starting_money = world.options.starting_money.value + + # todo; move to text converter + prayer_player = world.multiworld.get_player_name(world.random.randint(1, world.multiworld.players)) + for char in prayer_player[:24]: + if char in eb_text_table: + world.prayer_player.extend(eb_text_table[char]) + else: + world.prayer_player.extend([0x6F]) + world.prayer_player.extend([0x00]) + + world.credits_player = world.multiworld.get_player_name(world.player) + world.credits_player = text_encoder(world.credits_player, 16) + world.credits_player.extend([0x00]) + shuffle_psi(world) + initialize_bosses(world) + shuffle_enemies(world) + shuffle_dungeons(world) + + +def place_static_items(world: "EarthBoundWorld") -> None: + """Places all locked items. Some are events. Some are filler items that + need to be placed depending on certain settings.""" + + world.get_location("Belch Defeated").place_locked_item(world.create_item("Threed Tunnels Clear")) + world.get_location("Dungeon Man Submarine").place_locked_item(world.create_item("Submarine to Deep Darkness")) + world.get_location("Any ATM").place_locked_item(world.create_item("ATM Access")) + + world.get_location("Giant Step Sanctuary").place_locked_item(world.create_item("Melody")) + world.get_location("Lilliput Steps Sanctuary").place_locked_item(world.create_item("Melody")) + world.get_location("Milky Well Sanctuary").place_locked_item(world.create_item("Melody")) + world.get_location("Rainy Circle Sanctuary").place_locked_item(world.create_item("Melody")) + world.get_location("Magnet Hill Sanctuary").place_locked_item(world.create_item("Melody")) + world.get_location("Pink Cloud Sanctuary").place_locked_item(world.create_item("Melody")) + world.get_location("Lumine Hall Sanctuary").place_locked_item(world.create_item("Melody")) + world.get_location("Fire Spring Sanctuary").place_locked_item(world.create_item("Melody")) + + world.get_location("Carpainter Defeated").place_locked_item(world.create_item("Valley Bridge Repair")) + + if world.options.giygas_required: + world.get_location("Giygas").place_locked_item(world.create_item("Saved Earth")) # Normal final boss + if world.options.magicant_mode == 1: + # If required magicant + world.get_location("Magicant - Ness's Nightmare").place_locked_item(world.create_item("Power of the Earth")) + world.get_location("Sanctuary Goal").place_locked_item(world.create_item("Magicant Unlock")) + else: + # If not required, place this condition on sanctuary goal + world.get_location("Sanctuary Goal").place_locked_item(world.create_item("Power of the Earth")) + else: + if world.options.magicant_mode == 1: + # If Magicant required but not Giygas, place goal + world.get_location("Magicant - Ness's Nightmare").place_locked_item(world.create_item("Saved Earth")) + world.get_location("Sanctuary Goal").place_locked_item(world.create_item("Magicant Unlock")) + else: + # If neither final boss, place goal + world.get_location("Sanctuary Goal").place_locked_item(world.create_item("Saved Earth")) + + if world.options.alternate_sanctuary_goal: + world.get_location("+2 Sanctuaries").place_locked_item(world.create_item("Alternate Goal")) + + if world.options.magicant_mode == 2: + world.get_location("+1 Sanctuary").place_locked_item(world.create_item("Magicant Unlock")) + world.get_location("Magicant - Ness's Nightmare").place_locked_item(world.create_item("Alternate Goal")) + + if not world.options.monkey_caves_mode: + world.get_location("Monkey Caves - 1F Right Chest").place_locked_item(world.create_item("Wet Towel")) + world.get_location("Monkey Caves - 1F Left Chest").place_locked_item(world.create_item("Pizza")) + world.get_location("Monkey Caves - West 2F Left Chest").place_locked_item(world.create_item("Pizza")) + world.get_location("Monkey Caves - West 2F Right Chest #1").place_locked_item(world.create_item("Hamburger")) + world.get_location("Monkey Caves - West 2F Right Chest #2").place_locked_item(world.create_item("Ruler")) + world.get_location("Monkey Caves - East 2F Left Chest").place_locked_item(world.create_item("Protein Drink")) + world.get_location("Monkey Caves - East 2F Right Chest").place_locked_item(world.create_item("Hamburger")) + world.get_location("Monkey Caves - East West 3F Right Chest #1").place_locked_item(world.create_item("Hamburger")) + world.get_location("Monkey Caves - East West 3F Right Chest #2").place_locked_item(world.create_item("Picnic Lunch")) + + if world.options.shop_randomizer == 2: + world.get_location("Twoson Department Store Bakery - Slot 1").place_locked_item(world.create_item("Plain Roll")) + world.get_location("Fourside Department Store - Burger Shop Slot 4").place_locked_item(world.create_item("Hamburger")) + + if world.options.monkey_caves_mode < 2: + world.get_location("Fourside Bakery - Slot 4").place_locked_item(world.create_item("Repel Sandwich")) + world.get_location("Fourside Department Store - Tool Shop Slot 7").place_locked_item(world.create_item("Ruler")) + world.get_location("Fourside Department Store - Shop Shop Slot 3").place_locked_item(world.create_item("Protein Drink")) + world.get_location("Fourside Department Store - Food Shop Slot 5").place_locked_item(world.create_item("Picnic Lunch")) + world.get_location("Dusty Dunes Drugstore - Left Shop Slot 1").place_locked_item(world.create_item("Wet Towel")) diff --git a/worlds/earthbound/src/earthbound_basepatch.bsdiff4 b/worlds/earthbound/src/earthbound_basepatch.bsdiff4 new file mode 100644 index 0000000000000000000000000000000000000000..9ba2b74a04d92870527b83f28e40b3c903a945c5 GIT binary patch literal 52812 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�&t#PIX(#SSZP{9$ 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 T6$C7I|BJaIoG3^EL@CFBj>FU% literal 0 HcmV?d00001 diff --git a/worlds/earthbound/src/eb.asm b/worlds/earthbound/src/eb.asm new file mode 100644 index 0000000000..1ae0aff35e --- /dev/null +++ b/worlds/earthbound/src/eb.asm @@ -0,0 +1,18902 @@ +hirom +ORG $C67F00 +CharLastInvSlot: +dw $99FE,$9A5D,$9ABC,$9B1B + +TeleSectorID: +dw $FFFF,$5A85,$5A91,$5AAD,$5AED,$5B09,$5B31,$5AD1,$5B4D,$5B5D,$5B79,$5B91,$5B99,$5BAD,$5AB1,$5B89,$5B29,$5A8D + +TeleFlags: +dw $0001,$0002,$1000,$0004,$0010,$2000,$0020,$0008,$0040,$0100,$0080,$0400,$0800,$4000,$0004,$0200,$0020,$1000 + +TeleportFlags: +dw $0000,$00D1,$00D2,$00D3,$00D4,$00D5,$00D6,$00D7,$00D8,$00D9,$00DA,$00DB,$00DC,$00DD,$00DE,$00DF + +StartingScripts: +dw $0000,$0068,$01A6,$0205,$01D5,$0014,$0022,$0064,$0177,$005E,$0062,$00C7,$00C8,$012F,$001F,$0279,$00AF,$0031,$000E,$011F,$0088,$00C9,$0095,$003B,$003C,$0220,$0137,$0027,$01C2,$0225,$000F + +UnsetScripts: +dw $006B,$ED02,$000B,$005F + +CharUnlockPointers: +dw $F830,$F837,$F83E,$F845,$F955,$F849, $F850 + +ORG $03FE10 +db $1C,$02,$FE,$50,$9A,$9F,$99,$9E,$95,$94,$50,$A9,$9F,$A5,$A2,$50,$A0,$91,$A2,$A4,$A9,$51,$1F,$00,$00,$0B,$10,$78,$10,$78,$10,$78,$10,$3C,$1F,$03,$13,$02 + +SoundStoneScripts: +dw $00B6,$00B7,$00B8,$00B9,$00BA,$00BB,$00BC,$00BD + +ORG $D56A5B +db $71,$a2,$93,$98,$99,$a0,$95,$9c,$91,$97,$9f,$50,$79,$a4,$95,$9d + +ORG $C4FD80 +db $03,$00,$e5,$04,$88,$80,$e2,$04,$c0,$38,$D3,$00,$72,$a4 ;Tenda Village door. adds guard +db $01,$00,$DF,$01,$E5,$05 ;Threed cemetary hallway. Locks the door to the pit. +db $02,$00,$9F,$00,$20,$4F,$A0,$00,$70,$00 ;Scraba south of pyramid. Adds shortcut NPCs +db $02,$00,$c5, $02, $f8, $58, $6f, $02, $50, $00; Desert West tunnel. Adds ghost + +ORG $C4FE74 +db $01, $00, $25, $05, $41, $75 + +ORG $CF9788 +db $01,$61,$00,$06,$5E,$02,$20,$01,$01,$26,$70,$C6,$00 ;Tenda guard NPC + +ORG $CF9415 +db $04,$01 + +ORG $CF941C +db $00, $0A, $00, $61 + +ORG $C4FD50 +NewSectorPointers: +dw $FD80,$FD8E,$FD94,$FD9E,$FDA8,$FDC2,$FDD0,$FE74,$FE80,$FEE0,$FEEA,$FF00, $FF0A + +ORG $D5F880 +SpecialNameTable: +dw $A810, $A81F, $A82F, $A84C, $A85C, $A873, $A888, $A89A, $A8AB, $A8BC, $A8CD, $A8DD, $A8F4, $A90B, $A924, $A938, $A93E, $A943, $A947, #SpecialTexMagicant +dw #SpecialTexNess +dw #SpecialTexPhotoGuy +dw #DisplayDollars10 +dw #DisplayDollars100 +dw #DisplayDollars1000 + + + +ORG $D7FC7C +StartingTeleports: + +ORG $D7FC8D +StartingChars: + +macro FUNCTION_PROLOGUE(locals) + rep #$31 + phd ; PUSH current frame pointer + pha ; Always push, in case this function takes an arg + tdc + adc.w #$FFEE + tcd + pla ; POP possible arg +endmacro + +;2ff4b0 is freespace + + +ORG $C04D46 +JML GetItemRemote + +ORG $C1FEAE +JML InitIntro + +ORG $C06982 +JML SetTeleFlags + +ORG $C0D622 +JML IgnoreTeleportEnemies + +ORG $C0B8EE +JML GetRemoteTeleport + +ORG $C14FD7 +JML GetCharNameFromServ + +ORG $C146D6 +JML GetPlayerName + +ORG $C14FDB +JML LoadPlayerName + +ORG $C1938F +JML DrawPlayerName + +ORG $C2165E +JML SetMelodyCount + +ORG $C0B904 +JML PocketStorage + +ORG $C14D05 +JML SkipArchiSpaceCheck + +ORG $C156A9 +JML CheckArchiItemInv + +ORG $C19222 +JML GetServerItemName + +ORG $C02264 +JML AddNewNPCSectors + +ORG $C48402 +JML GetLumiText + +ORG $C18B5D +JML DelArchFromInv + +ORG $C07960 +JML SetAnimSpeed + +ORG $C22A35 +;JML SaveAPData + +ORG $C14F56 +JML ExtraKeyItems + +ORG $C4844C +JML GetLumiTextMain + +ORG $C486F4 +JML GetLumiTextSub + +ORG $C18B55 +;JML TestArchiItemSpace + +ORG $C1F06B +JML LoadAPData + +ORG $C17DD4 +JML SpecialNameDirect + +ORG $C2164A +JML RepelEnemies + +ORG $C1FEB2 +JML GetStartingData + +ORG $C1FEB6 +JML GetStartingNames + +ORG $C40BCE +JML ResetGame + +ORG $C04AA6 +JML ClearNameOnBattle + +ORG $C1F299 +JSL CopyAPData + +ORG $C1F3B3 +JSL DeleteAPData + +ORG $C07902 +JMP MagicantSoloAnimSpeedFix + +;;;;;;;;;;;;;;;;;;;;;;;;; +;Franklin badge checks +ORG $C29549 +JML ReflectSpecial + +ORG $C29597 +JML ReflectFire + +ORG $C2901E +JML ReflectFireBall + +ORG $C295F4 +JML ReflectFreeze + +ORG $C298B6 +JML ReflectFlash + +ORG $C29A90 +JML ReflectStarstorm + +ORG $C2A666 +JML ReflectExplode + +ORG $C2A66B +JML SkipExplosionDeathReflect +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $C0B967 +JSL PlayerJustDied + +ORG $C272C8 +JML CheckDeathHealing + +ORG $C272D0 +JML OverrideDeathlinkText + +ORG $C273B0 +JML OverrideDeathlinkHeal + +ORG $C25F16 +JSL SendDeathInBattle +;Deathlink stuff +;;;;;;;;;;;;;;;;;;;;; +ORG $C18A1D +JML ClearStoredAPItem + +ORG $C2AD2A +JML PrayerReflectIgnore + +ORG $C1915F +JML GetProgressiveGoingtoStorage + +ORG $C2E8ED +JML GetNewSwirlColorNormal + +ORG $C2E91D +JML GetNewSwirlColorGood + +ORG $C2E93A +JML GetNewSwirlColorBad + +ORG $C2E94B +JML PokeySwirl + +ORG $C0F67A +JML GetSeedPlayer + +ORG $C1ED67 +JML DrawWorldVersion + +ORG $C1FD57 +JML Set24BitStartingEXP + +ORG $C0946C +JML TransferGiftToInv + +ORG $C19A62 +JML GetDynamicWindowTitle + +ORG $C4FBBD +JML GetRandomizedTrack + +ORG $C105C9 +JML LoadExpandedWindowTable + +ORG $C2A5B2 +JSL early_missile_damage + +ORG $C4F2E8 +JML ReadDynamicPhotoMapPositionY + +ORG $C4F2F1 +JML ReadDynamicPhotoMapPositionX + +ORG $C4F3E7 +JML ReadDynamicPhotoCharPosX + +ORG $C4F400 +JML ReadDynamicPhotoCharPosY + +ORG $C46D80 +JML SpawnDynamicPhotomanX + +ORG $C46D93 +JML SpawnDynamicPhotomanY + +ORG $C4F429 +JML IncrementCurPhotoCount + +ORG $C15F3A +JML CheckTotalEnergy + +ORG $C192DE +JML DisplayEnergy + +ORG $C2EF3D +JML LoadEnemyToVram + +ORG $C2BDC1 +JML AllowDynamicCallEnemyLoad + +ORG $C2EFA2 +JML AllowEnemyToSpawn + +ORG $C2EFC6 +JML ForceLoadSingle + +ORG $C2EEEF +JML InitializeLoadingEnemies + +ORG $C2EFF7 +JSL SetupVramForSpriteLoad + +ORG $C1F3D0 +JSL CloseVersionWindow + +ORG $C27F2C +JSL FixGiygasReflect + +ORG $C13660 +JML HandleUnusableWarpPad + +ORG $C0089A +JML LoadPhotoColor + +ORG $00FA22 +JML GetRemoteMoney + +ORG $C2A03F +JML ClearStatusVars + +;new jmls + + +ORG $C1FEBC +LDA #$0000 +;Skip flyover + +ORG $C02F30 +LDA $0066 +AND #$00FF +BIT #$0040 +BNE $03 + +ORG $C031B8 +LDA $0066 +AND #$00FF +BIT #$0040 +BNE $03 + +ORG $D57E3B +db $00 + +ORG $D57E47 +db $00 + +ORG $D7BAAE +db $04 + +ORG $D7BAAC +db $04 + +ORG $D7BAB0 +db $04 + +ORG $D7BA28 +db $04 + +ORG $D7BA68 +dw $0004,$0004 + +ORG $D7BAA6 +dw $0004,$0004 + +ORG $D7BB66 +dw $0004,$0004 + +ORG $D7BB6C +dw $0004,$0004 + +ORG $D7BAE6 +dw $0004,$0004,$0004,$0004,$0004 + +ORG $D7BB26 +dw $0004,$0004,$0004,$0004,$0004 + +ORG $D7BAF0 +db $04 + +ORG $D7BB30 +db $04 + +ORG $D7BB70 +db $04 + +; Flags for Tenda VIllage, was $02, now $00 to disable mice +ORG $D7B200 +dw $0000, $0000 + +ORG $D7B240 +dw $0000, $0000, $0000 + +ORG $D7B280 +dw $0000, $0000, $0000 + +ORG $D7B2C0 +dw $0000, $0000, $0000 + +ORG $C13CF4 +NOP +NOP + +ORG $C04575 +LDA #$0000 + +ORG $C02F45 +NOP +NOP +NOP + +ORG $C031CD +NOP +NOP +NOP + +ORG $C1FEBA +NOP +NOP + +ORG $C3E0E5 +dw $00F0 + +ORG $C3E11C +dw $A8E6 + +ORG $C45631 +;db $00 + +ORG $CF2DAC +db $38 + +ORG $CF2DB1 +db $38 + +ORG $CF2DBB +db $38 + +ORG $CF2DBB +db $38 + +ORG $CF2DC0 +db $38 + +ORG $CF2DC5 +db $38 + +ORG $CF2DCA +db $38 + +ORG $CF2DD4 +db $38 + +ORG $CF2ECD +db $38 + +ORG $CF2ED2 +db $38 + +ORG $CF2ED7 +db $38 + +ORG $CF2EDC +db $38 + +ORG $CF2EF0 +db $38 + +ORG $CF2EEB +db $38 + +ORG $CF2EE1 +db $38 + +ORG $CF2EE6 +db $38 + +ORG $CF2EF5 +db $38 + +ORG $C86281 +db $D1 + +ORG $CF975D +db $00 + +ORG $C66A9F +db $0A,$63,$A9,$EE + +ORG $C73948 +db $49 + +ORG $C68C3F +db $02 + +ORG $C7BF86 +db $0A,$12,$9C,$EE,$00 ;Giant step redirect + +ORG $C7C056 +db $0A,$12,$9C,$EE,$00 ;Lilliput Steps redirect + +ORG $C7C1F5 +db $0A,$12,$9C,$EE,$00 ;Milky Well redirect + +ORG $C7C126 +db $0A, $12, $9C, $EE; Rainy Circle Redirect + +ORG $C7C2C0 +db $0A, $12, $9C, $EE ; Magnet Hill Redirect + +ORG $C7C388 +db $0A,$12,$9C,$EE ;Pink Cloud Redirect + +ORG $C7C476 +db $0A,$12,$9C,$EE ;Lumine Hall redirect + +ORG $C7C47A +db $0A, $C6, $A0, $EE + +ORG $EEA0C6 +db $1F, $15, $6a, $00, $60, $01, $01, $0A, $80, $C4, $C7; Fix stupid lumine hole stuff + +ORG $C7C538 +db $0A,$12,$9C,$EE ;Fire Spring redirect + +ORG $C5F228 +db $07,$D2,$03,$1B,$03,$40,$F2,$C5,$00,$1F,$02,$71,$13,$18,$04,$10,$20,$04,$D2,$03,$0A,$71,$92,$FE,$13,$02 + +ORG $C95AA1 +db $D2,$00 + +ORG $C95AB7 +db $00 + +ORG $C95B5B +db $07 + +ORG $CFA96D +db $01 + +ORG $CFA98F +db $01 + +ORG $C91C68 +db $0A, $C1, $1C, $C9 + +ORG $C7699E +db $1D, $05, $FF, $CA, $1B, $02, $07, $42, $C7, $00, $70, $58, $1C, $02, $01, $50 +db $98, $91, $9E, $94, $95, $94, $50, $9F, $A6, $95, $A2, $50, $A4, $98, $95, $50 +db $1C, $05, $CA, $5E, $59, $1F, $02, $76, $10, $40, $00, $70, $89, $7F, $85, $50 +db $98, $91, $94, $50, $99, $A4, $50, $A4, $98, $99, $A3, $50, $A7, $98, $9F, $9C +db $95, $50, $A4, $99, $9D, $95, $6F, $51, $03, $00, $70, $7A, $A5, $A3, $A4, $50 +db $A7, $98, $95, $9E, $50, $79, $50, $A7, $91, $A3, $50, $91, $92, $9F, $A5, $A4 +db $50, $A4, $9F, $00, $50, $50, $97, $9F, $50, $97, $95, $A4, $50, $9C, $A5, $9E +db $93, $98, $5C, $50, $A4, $9F, $9F, $5E, $5E, $5E, $03, $00, $70, $73, $9F, $9D +db $95, $50, $A7, $99, $A4, $98, $50, $9D, $95, $5E, $5E, $5E, $03, $50, $79, $57 +db $9C, $9C, $50, $A3, $98, $9F, $A7, $50, $A9, $9F, $A5, $00, $50, $50, $A3, $9F +db $9D, $95, $50, $A2, $95, $91, $9C, $50, $6C, $A0, $A2, $9F, $97, $A2, $95, $A3 +db $A3, $99, $9F, $9E, $6E, $5C, $50, $91, $9C, $A2, $99, $97, $98, $A4, $51, $13 +db $1D, $01, $FF, $CA, $04, $1B, $02, $0A, $F1, $6A, $C7, $00 ;Captain strong pre-fight text + +ORG $C76A6D +db $70, $75, $A6, $95, $9E, $50, $91, $96, $A4, $95, $A2, $50, $91, $9C, $9C, $50 +db $A4, $98, $99, $A3, $50, $A4, $99, $9D, $95, $5C, $10, $14, $50, $50, $79, $57 +db $9D, $50, $83, $84, $79, $7C, $7C, $50, $99, $9E, $50, $72, $7B, $51, $13, $0A +db $F1, $6A, $C7, $00, $C7, $00, $A7 ;Captain Strong rematch text + +ORG $C74207 +db $07, $69, $00, $1B, $03, $0B, $6B, $C7, $00, $07, $1B, $02, $1B, $03, $6D, $6A +db $C7, $00, $70, $77, $A2, $A2, $5E, $03, $50, $79, $57, $A6, $95, $50, $92, $95 +db $95, $9E, $50, $A3, $A4, $A5, $93, $9B, $50, $99, $9E, $50, $72, $7B, $50, $9D +db $9F, $94, $95, $50, $96, $9F, $A2, $50, $10, $10, $A4, $98, $A2, $95, $95, $50 +db $10, $10, $98, $9F, $A5, $A2, $A3, $5C, $03, $00, $50, $50, $A7, $91, $99, $A4 +db $99, $9E, $97, $50, $9F, $9E, $50, $9D, $A9, $50, $1C, $05, $CA, $51, $00, $70 +db $7C, $95, $A4, $50, $9D, $95, $50, $9B, $9E, $9F, $A7, $50, $99, $96, $50, $A9 +db $9F, $A5, $50, $A3, $95, $95, $50, $99, $A4, $5E, $03, $00, $70, $7D, $91, $A9 +db $92, $95, $50, $79, $50, $A3, $98, $9F, $A5, $9C, $94, $57, $A6, $95, $50, $A0 +db $9C, $91, $A9, $95, $94, $50, $86, $86, $86, $86, $86, $86, $50, $99, $9E, $A3 +db $A4, $95, $91, $94, $5E, $5E, $5E, $13, $02 ;Captain strong normal text + +ORG $EEC593 +db $70, $71, $93, $A4, $A5, $91, $9C, $9C, $A9, $5C, $50, $79, $57, $9D, $50, $9F +db $9e, $95, $50, $9f, $96, $50, $a4, $98, $95, $50, $aa, $9f, $9d, $92, $99, $95 +db $a3, $5e, $03, $00, $70, $79, $50, $a7, $91, $a3, $50, $a3, $9f, $50, $92, $91 +db $94, $50, $91, $A4, $50, $92, $95, $99, $9E, $97, $50, $91, $50, $AA, $9F, $9D +db $92, $99, $95, $5C, $10, $15, $50, $A4, $98, $95, $A9, $50, $A4, $98, $A2, $95 +db $a7, $50, $9d, $95, $50, $99, $9e, $50, $98, $95, $a2, $95, $51, $13, $02 ;Threed zombie meme text + +ORG $EE9A94 +db $70, $7f, $98, $5c, $50, $98, $95, $a9, $5c, $10, $15, $50, $1c, $02, $01, $5e +db $03, $00, $70, $79, $50, $94, $a2, $9f, $a6, $95, $50, $a4, $98, $95, $50, $83 +db $9b, $a9, $50, $82, $a5, $9e, $9e, $95, $a2, $50, $98, $95, $a2, $95, $50, $a4 +db $9f, $50, $a3, $91, $a6, $95, $50, $a9, $9f, $a5, $50, $96, $a2, $9f, $9d, $50 +db $a4, $98, $95, $50, $aa, $9f, $9d, $92, $99, $95, $a3, $5c, $03, $00, $70, $92 +db $a5, $a4, $50, $99, $a4, $50, $9c, $9f, $9f, $9b, $a3, $50, $9c, $99, $9b, $95 +db $50, $79, $50, $a7, $91, $a3, $50, $a4, $9f, $9f, $50, $95, $91, $a2, $9c, $a9 +db $5e, $03, $00, $70, $7f, $98, $5c, $50, $a7, $95, $9c, $9c, $5e, $03, $00, $70 +db $79, $50, $97, $a5, $95, $a3, $a3, $50, $a9, $9f, $a5, $50, $a0, $a2, $9f, $92 +db $91, $92, $9c, $a9, $50, $a3, $98, $9f, $a5, $9c, $94, $9e, $57, $a4, $50, $a4 +db $a2, $a5, $a3, $a4, $50, $a2, $91, $9e, $94, $9f, $9d, $50, $a0, $a3, $a9, $93 +db $98, $99, $93, $50, $9d, $95, $a3, $a3, $91, $97, $95, $a3, $5e, $03, $00, $70 +db $75, $a3, $a0, $95, $93, $99, $91, $9c, $9c, $a9, $50, $9f, $9e, $95, $a3, $50 +db $96, $a2, $9f, $9d, $50, $aa, $9f, $9d, $92, $99, $95, $a3, $5e, $03, $00, $70 +db $84, $98, $91, $9e, $9b, $a3, $50, $96, $9f, $a2, $50, $a3, $91, $a6, $99, $9e +db $97, $50, $9d, $95, $5c, $10, $15, $50, $92, $a9, $50, $a4, $98, $95, $50, $a7 +db $91, $a9, $5e, $03, $00, $0A, $79, $AF, $EE, $00, $1b, $03, $B3, $9B, $EE, $00 +db $1f, $1e, $e1, $01, $06, $04, $2f, $00, $02;Threed character + +ORG $D5F710 +PaulaUnlocktext: +db $08 +dd $C7966C +db $18, $04, $1f, $11, $02, $1f, $00, $00, $0b +db $10, $78, $50, $08, $10, $F8, $D5, $00, $1f, $03, $18, $01, $01, $70, $1c, $02 +db $02, $50, $9a, $9f, $16, $b9, $94, $15, $a8, $03, $18, $04, $02; Paula Join + +PooUnlockText: +db $08 +dd $C929CD +db $18, $04, $1f, $11, $04, $1f, $00, $00, $0b, $10, $78, $50 +db $08, $10, $F8, $D5, $00, $1f, $03, $18, $01, $01, $70, $1c, $02, $04, $50, $9a +db $9f, $16, $b9, $94, $15, $a8, $03, $01, $08, $6B, $F7, $D5, $FF, $18, $04, $02; Poo join + +ORG $C884D0 +JeffUnlockText: +db $08 +dd $C88533 +db $13, $18, $04, $1f, $00, $00, $0b, $10, $78, $50, $08, $10 +db $F8, $D5, $00, $1f, $03, $18, $01, $01, $70, $1c, $02, $03, $50, $9a, $9f, $16 +db $b9, $94, $15, $a8, $03, $18, $04, $1f, $11, $03, $02; Jeff join + +FlyingManUnlockText: +db $08 +dd $C76FCE +db $18, $04, $08, $1A, $F8, $D5, $00, $1F, $11, $0B, $02; FlyingMan join + +ORG $C75C33 +db $70, $79, $57, $9d, $50, $a4, $98, $95, $50, $1c, $05, $03, $51, $03, $00, $70 +db $79, $50, $9b, $9e, $9f, $a7, $50, $79, $50, $9d, $91, $a9, $50, $9e, $9f, $a4 +db $50, $9c, $9f, $9f, $9b, $50, $9c, $99, $9b, $95, $50, $9d, $a5, $93, $98, $5c +db $10, $15, $50, $92, $a5, $a4, $50, $79, $57, $9d, $50, $a3, $a4, $a2, $9f, $9e +db $97, $95, $a2, $50, $a4, $98, $91, $9e, $50, $a4, $98, $95, $50, $91, $a6, $95 +db $a2, $91, $97, $95, $50, $92, $95, $91, $a2, $51, $03, $1d, $03, $ff, $1b, $02 +db $bb, $5c, $c7, $00, $00, $50, $50, $58, $84, $98, $95, $50, $1c, $05, $03, $50 +db $9a, $9f, $99, $9e, $a3, $50, $a9, $9f, $a5, $5e, $59, $1f, $02, $10, $10, $30 +db $1d, $00, $ff, $03, $1f, $41, $13, $02, $00, $70, $89, $9f, $a5, $50, $94, $9f +db $9e, $57, $a4, $50, $98, $91, $a6, $95, $50, $a2, $9f, $9f, $9d, $50, $96, $9f +db $a2, $50, $9d, $95, $5c, $10, $15, $50, $a4, $98, $9f, $a5, $97, $98, $5e, $10 +db $20, $50, $79, $57, $9c, $9c, $50, $a7, $91, $99, $a4, $50, $98, $95, $a2, $95 +db $50, $a5, $9e, $a4, $99, $9c, $50, $a9, $9f, $a5, $50, $9d, $91, $9b, $95, $50 +db $a3, $9f, $9d, $95, $50, $a3, $a0, $91, $93, $95, $5e, $07, $68, $00, $13, $02; SuperBear join + +db $70, $84, $98, $91, $9e, $9b, $50, $a9, $9f, $a5, $50, $96, $9f, $a2, $50, $96 +db $99, $9e, $94, $99, $9e, $97, $50, $9d, $95, $5e, $03, $00, $70, $79, $50, $9b +db $9e, $9f, $a7, $50, $a4, $98, $99, $a3, $50, $9d, $91, $a9, $50, $92, $95, $50 +db $98, $91, $a2, $94, $50, $a4, $9f, $50, $92, $95, $9c, $99, $95, $a6, $95, $5c +db $10, $15, $50, $92, $a5, $a4, $50, $79, $57, $9d, $50, $91, $93, $a4, $a5, $91 +db $9c, $9c, $a9, $50, $91, $50, $a2, $95, $9c, $99, $93, $50, $96, $a2, $9f, $9d +db $50, $91, $50, $96, $91, $a2, $5d, $91, $a7, $91, $a9, $50, $a7, $9f, $a2, $9c +db $94, $5e, $03, $00, $70, $7d, $a9, $50, $a4, $a2, $a5, $95, $50, $96, $9f, $a2 +db $9d, $50, $99, $a3, $50, $a4, $98, $91, $a4, $50, $9f, $96, $50, $91, $50, $1c +db $05, $ad, $5e, $03, $00, $70, $79, $9e, $50, $91, $9e, $9f, $a4, $98, $95, $a2 +db $50, $a4, $99, $9d, $95, $50, $91, $9e, $94, $50, $a0, $9c, $91, $93, $95, $5c +db $10, $15, $50, $a7, $95, $50, $9d, $91, $a9, $50, $9d, $95, $95, $a4, $50, $91 +db $97, $91, $99, $9e, $5e, $03, $00, $70, $85, $9e, $a4, $99, $9c, $50, $a4, $98 +db $95, $9e, $5c, $10, $15, $50, $1c, $02, $fe, $50, $a3, $95, $9e, $94, $a3, $50 +db $a4, $98, $95, $99, $a2, $50, $a2, $95, $97, $91, $a2, $94, $a3, $51, $13, $02;AP Item join + +ORG $C91D5E +db $70, $7c, $9f, $9f, $9b, $a3, $50, $9c, $99, $9b, $95, $50, $99, $a4, $57, $a3, $50 +db $a2, $95, $91, $94, $a9, $50, $a4, $9f, $50, $97, $9f, $50, $a4, $9f, $50, $87 +db $99, $9e, $a4, $95, $a2, $a3, $5e, $03, $00, $70, $0a, $33, $1e, $c9, $00;Fixed Sky Runner + +ORG $C91CC1 +db $0A, $03,$5E,$C7,$00 + +ORG $C91E94 +;db $ed, $1d, $05, $ff, $9e, $1d, $01, $ff, $9e, $0A, $2C, $20, $C9, $00 + +ORG $CFA949 +db $47,$00,$01 + +ORG $CFA93A +db $02 + +ORG $CF8915 +db $20,$A8 + +ORG $CFA977 +db $03,$00 + +ORG $CFA976 +db $01 + +ORG $CFA97E +db $01,$94,$9A,$EE + +ORG $CFA979 +db $04,$5E,$02 + +ORG $C73236 +db $0a, $0b, $EB,$C5,$03,$00 ;Library redirect + +ORG $D5F02B +db $e0,$00,$90,$02,$02,$1e,$00 + +ORG $D5F033 +db $e0,$00,$80,$02,$04,$21,$00 + +ORG $CF942D +db $00,$D6,$00,$61 + +ORG $61000A +db $70, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $03, $00, $70, $79, $50, $93, $91, $9e, $50, $a4, $a2, $91, $9e, $a3 +db $a0, $9f, $a2, $a4, $50, $a9, $9f, $a5, $50, $91, $93, $a2, $9f, $a3, $a3, $50 +db $a4, $98, $95, $50, $a2, $99, $a6, $95, $a2, $5e, $03, $07, $d9, $03, $1b, $03 +db $bd, $00, $61, $00, $00, $70, $78, $9f, $a7, $95, $a6, $95, $a2, $5c, $10, $15 +db $50, $99, $a4, $50, $a3, $95, $95, $9d, $a3, $50, $a9, $9f, $a5, $50, $91, $a2 +db $95, $50, $9e, $9f, $a4, $50, $a9, $95, $a4, $50, $a2, $95, $91, $94, $a9, $5e +db $03, $00, $70, $73, $9f, $9d, $95, $50, $92, $91, $93, $9b, $50, $a7, $98, $95 +db $9e, $50, $a9, $9f, $a5, $50, $98, $91, $a6, $95, $50, $93, $9f, $9e, $a1, $a5 +db $95, $a2, $95, $94, $50, $a4, $98, $95, $50, $a0, $a9, $a2, $91, $9d, $99, $94 +db $5e, $13, $02, $00, $70, $71, $9e, $94, $50, $91, $a7, $91, $a9, $50, $a7, $95 +db $50, $97, $9f, $51, $10, $20, $18, $04, $1f, $21, $90, $02; Rock text + +db $70, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $03, $00, $70, $79, $57, $9d, $50, $9e, $9f, $a4, $50, $a6, $95, $a2 +db $a9, $50, $a0, $a2, $9f, $a5, $94, $50, $9f, $96, $50, $9d, $a9, $50, $9e, $91 +db $9d, $95, $5e, $03, $00, $70, $87, $91, $9e, $a4, $50, $a4, $9f, $50, $93, $a2 +db $9f, $a3, $a3, $50, $a4, $98, $95, $50, $a2, $99, $a6, $95, $a2, $6f, $03, $19 +db $02, $89, $95, $a3, $02, $19, $02, $7e, $9f, $02, $00, $1c, $07, $02, $11, $09 +db $02, $55, $01, $61, $00, $6e, $01, $61, $00, $0a, $6e, $01, $61, $00, $00, $12 +db $70, $71, $9e, $94, $50, $98, $95, $a2, $95, $50, $a7, $95, $50, $97, $9f, $51 +db $10, $20, $18, $04, $1f, $21, $91, $02, $12, $70, $7f, $9b, $91, $a9, $5e, $10 +db $20, $50, $79, $57, $9c, $9c, $50, $92, $95, $50, $98, $95, $a2, $95, $5c, $10 +db $0a, $50, $99, $96, $50, $a9, $9f, $a5, $50, $93, $98, $91, $9e, $97, $95, $50 +db $a9, $9f, $a5, $a2, $50, $9d, $99, $9e, $94, $5e, $13, $02; John text + +db $16, $50, $5e, $03, $00, $08, $10, $f7, $d5, $00, $1b, $03, $32, $02, $fe, $00 +db $1f, $1e, $44, $04, $06, $04, $7D, $02, $02; Dalaam Character text + +db $0e, $01, $0d, $01, $1d, $19, $00, $1b, $03, $E8, $01, $61, $00, $19, $10 +db $00, $0b, $04, $1b, $03, $d9, $01, $61, $00, $0f, $0a, $BD, $01, $61, $00, $04 +db $D8, $00, $1f, $15, $6a, $00, $53, $01, $01, $0a, $0d, $22, $c9, $00, $02; Trial of Mu + +ORG $C9D61C +db $0A, $A2, $01, $61, $00; Dalaam Char redir + +ORG $C92203 +db $0A, $BB, $01, $61, $00 + +ORG $C5EB0B +db $07,$ff,$01,$1b,$03,$14,$ed,$c5,$00,$70,$89,$9f,$a5,$50,$a7,$91 +db $9e,$a4,$50,$91,$50,$9d,$91,$a0,$6f,$03,$00,$70,$87,$95,$50,$94 +db $9F, $9E, $57, $A4, $50, $98, $91, $A6, $95, $50, $9D, $91, $A0, $A3, $50, $91 +db $9E, $A9, $9D, $9F, $A2, $95, $5C, $10, $10, $50, $9B, $99, $94, $5E, $03, $00 +db $70, $75, $A6, $95, $A2, $A9, $9F, $9E, $95, $50, $9A, $A5, $A3, $A4, $50, $A5 +db $a3, $95, $a3, $50, $80, $9f, $a0, $a4, $a2, $91, $93, $9b, $95, $a2, $50, $a4 +db $98, $95, $A3, $95, $50, $94, $91, $A9, $A3, $5E, $03, $00, $70, $75, $A6, $95 +db $9E, $50, $99, $96, $50, $A9, $9F, $A5, $50, $94, $9F, $9E, $57, $A4, $5C, $10 +db $13, $50, $A9, $9F, $A5, $50, $93, $91, $9E, $50, $9A, $A5, $A3, $A4, $50, $A0 +db $a2, $95, $a3, $a3, $50, $88, $50, $a4, $9f, $50, $a2, $95, $9d, $95, $9d, $92 +db $95, $A2, $50, $A7, $98, $91, $A4, $50, $A4, $98, $95, $50, $9D, $91, $A0, $50 +db $a7, $9f, $a5, $9c, $94, $50, $9c, $9f, $9f, $9b, $50, $9c, $99, $9b, $95, $5c +db $10, $15, $50, $99, $96, $50, $A9, $9F, $A5, $50, $94, $99, $94, $50, $98, $91 +db $a6, $95, $50, $9f, $9e, $95, $5e, $03, $00, $70, $87, $95, $50, $94, $9f, $5c +db $10, $15, $50, $98, $9F, $A7, $95, $A6, $95, $A2, $5C, $10, $15, $50, $98, $91 +db $a6, $95, $50, $a2, $95, $9E, $A4, $91, $9C, $A3, $50, $96, $9F, $A2, $50, $1C +db $05, $05, $A3, $5E, $03, $00, $70, $87, $9F, $A5, $9C, $94, $50, $A9, $9F, $A5 +db $50, $9C, $99, $9B, $95, $50, $9F, $9E, $95, $6F, $03, $00, $19, $02, $89, $95 +db $a3, $02, $19, $02, $7e, $9f, $02, $1c, $07, $02, $11, $12, $09, $02, $78, $ec +db $c5, $00, $41, $ec, $c5, $00, $70, $89, $95, $91, $98, $5c, $10, $15, $50, $99 +db $a4, $57, $a3, $50, $a0, $a2, $9F, $92, $91, $92, $9C, $A9, $50, $95, $91, $A3 +db $99, $95, $A2, $50, $A4, $9F, $50, $94, $9F, $A7, $9E, $9C, $9F, $91, $94, $5C +db $50, $10, $10, $91, $9E, $A9, $A7, $91, $A9, $A3, $5E, $13, $02, $70, $7F, $9B +db $91, $A9, $5E, $50, $10, $15, $76, $95, $95, $9C, $50, $96, $A2, $95, $95, $50 +db $a4, $9F, $50, $a2, $95, $a4, $A5, $A2, $9E, $50, $99, $A4, $50, $a7, $98, $95 +db $9E, $95, $A6, $95, $A2, $5E, $13, $1D, $03, $FF, $1B, $02, $B0, $EC, $C5, $00 +db $0A, $99, $33, $C7, $00, $00, $70, $5E, $5E, $5E, $79, $A3, $50, $A7, $98, $91 +db $a4, $50, $79, $50, $a7, $9f, $a5, $9c, $94, $50, $a3, $91, $a9, $5c, $10, $15 +db $50, $99, $96, $50, $A9, $9F, $A5, $50, $98, $91, $94, $50, $A2, $9F, $9F, $9D +db $50, $A4, $9F, $50, $98, $9F, $9C, $94, $50, $99, $A4, $5E, $03, $00, $70, $83 +db $9F, $A2, $A2, $A9, $5C, $10, $15, $50, $9B, $99, $94, $5E, $50, $89, $9F, $A5 +db $57, $9C, $9C, $50, $98, $91, $A6, $95, $50, $A4, $9F, $50, $9D, $91, $9B, $95 +db $50, $A3, $A0, $91, $93, $95, $5E, $13, $02, $70, $87, $95, $57, $A2, $95, $50 +db $98, $9F, $A3, $A4, $99, $9E, $97, $50, $91, $50, $73, $9C, $99, $A1, $A5, $95 +db $50, $A4, $9F, $A5, $A2, $9E, $91, $9D, $95, $9E, $A4, $50, $9F, $9E, $50, $76 +db $a2, $99, $94, $91, $a9, $50, $a4, $9f, $50, $92, $9f, $9f, $a3, $a4, $50, $91 +db $a4, $a4, $95, $9e, $94, $91, $9e, $93, $95, $5e, $03, $00, $70, $87, $95, $50 +db $94, $9F, $9E, $57, $A4, $50, $98, $91, $A6, $95, $50, $9D, $91, $9E, $A9, $50 +db $a0, $91, $a2, $a4, $99, $93, $99, $a0, $91, $9e, $a4, $a3, $50, $a9, $95, $a4 +db $5C, $10, $15, $50, $A4, $98, $9F, $A5, $97, $98, $5E, $13, $02 ;Library text + +ORG $C8EB99 +db $0A, $AD, $71, $C6, $00 + +ORG $C671AD +db $03, $0e, $01, $0d, $01, $1d, $19, $00, $1b, $03, $cc, $71, $c6, $00, $19, $10 +db $00, $0b, $03, $1b, $03, $1C, $72, $c6, $00, $0f, $0a, $b0, $71, $c6, $00, $00 +db $70, $79, $57, $9d, $50, $91, $50, $a4, $95, $9e, $a4, $50, $a4, $98, $91, $a4 +db $50, $95, $91, $a4, $a3, $50, $9e, $95, $a2, $94, $a3, $51, $03, $00, $70, $89 +db $9f, $a5, $50, $94, $9f, $9e, $57, $a4, $50, $9c, $9f, $9f, $9b, $50, $9c, $99 +db $9b, $95, $50, $91, $50, $9e, $95, $a2, $94, $5c, $10, $15, $50, $a3, $9f, $50 +db $83, $73, $82, $71, $7d, $51, $03, $18, $04, $1f, $03, $05, $0B, $00, $02, $18 +db $02, $10, $01, $0a, $9e, $eb, $c8, $00, $30, $16, $b0, $51, $6e, $13, $70, $02; Boogey tent text + +db $07, $47, $00, $1b, $02, $86, $72, $c6, $00, $18, $01, $01, $70, $84, $98, $95 +db $50, $9d, $91, $a3, $a4, $95, $a2, $50, $99, $a3, $50, $97, $9f, $9e, $95, $6f +db $03, $00, $70, $10, $20, $5e, $10, $20, $5e, $10, $20, $5e, $79, $50, $94, $9f +db $9e, $57, $a4, $50, $92, $95, $9c, $99, $95, $a6, $95, $50, $a9, $9f, $a5, $5c +db $10, $15, $50, $a3, $9f, $50, $a7, $95, $57, $a2, $95, $50, $a3, $a4, $91, $a9 +db $99, $9e, $97, $50, $a0, $a5, $a4, $5e, $13, $02; Zombie belch text + +ORG $CF66F5 +db $03 + +ORG $C8ECA3 +db $0A, $2D, $72, $C6 +;have to check the zombie pointer text bn + + + +ORG $C5F1FA +db $02, $70, $71, $9E, $A9, $92, $9F, $94, $A9, $50, $A7, $91, $9E, $A4, $50, $91 +db $50, $A0, $95, $91, $9E, $A5, $A4, $6F, $10, $20, $1F, $1E, $2E, $00, $08, $1F +db $02, $2A, $18, $04, $10, $80, $05, $2F, $01, $0A, $00, $AA, $EE ;Buzz Buzz text + +ORG $EE9210 +OnettTeleTex: +db $18, $01, $01, $01 +db $0A +dd OnettLeaderName +OnettLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $7F, $9E, $95, $A4, $A4, $51, $59, $1F, $02, $67, $04, $D1, $00, $13, $02 ;Onett + +TwosonTeleTex: +db $18, $01, $01, $01 +db $0A +dd TwosonLeaderName +TwosonLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $84, $A7, $9F, $A3, $9F, $9E, $51, $59, $1F, $02, $67, $04, $D2, $00, $13 +db $02 ;Twoson + +HappyTeleTex: +db $18, $01, $01, $01 +db $0A +dd HappyLeaderName +HappyLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $78, $91, $A0, $A0, $A9, $5D, $78, $91, $A0, $A0, $A9, $50, $86, $99, $9C +db $9C, $91, $97, $95, $51, $59, $1F, $02, $67, $04, $DD, $00, $13, $02 ;Happy-Happy + +ThreedTeleTex: +db $18, $01, $01, $01 +db $0A +dd ThreedLeaderName +ThreedLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $84, $98, $A2, $95, $95, $94, $51, $59, $1F, $02, $67, $04, $D3, $00, $13 +db $02 ;Threed + +SaturnTeleTex: +db $18, $01, $01, $01 +db $0A +dd SaturnLeaderName +SaturnLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $83, $91, $A4, $A5, $A2, $9E, $50, $86, $91, $9C, $9C, $95, $A9, $51, $59 +db $1F, $02, $67, $04, $D5, $00, $13, $02 ;Saturn Valley + +DunesTeleTex: +db $18, $01, $01, $01 +db $0A +dd DunesLeaderName +DunesLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $74, $A5, $A3, $A4, $A9, $50, $74, $A5, $9E, $95, $A3, $50, $74, $95, $A3 +db $95, $A2, $A4, $51, $59, $1F, $02, $67, $04, $DE, $00, $13, $02;Dusty Dunes + +FoursTeleTex: +db $18, $01, $01, $01 +db $0A +dd FoursLeaderName +FoursLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $76, $9F, $A5, $A2, $A3, $99, $94, $95, $51, $59, $1F, $02, $67, $04, $D6 +db $00, $13, $02; Fourside + +WintersTeleTex: +db $18, $01, $01, $01 +db $0A +dd WintersLeaderName +WintersLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $87, $99, $9E, $A4, $95, $A2, $A3, $51, $59, $1F, $02, $67, $04, $D4, $00 +db $13, $02 ;Winters + +SummersTeleTex: +db $18, $01, $01, $01 +db $0A +dd SummersLeaderName +SummersLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $83, $A5, $9D, $9D, $95, $A2, $A3, $51, $59, $1F, $02, $67, $04, $D7, $00 +db $13, $02 ;Summers + +ScarabaTeleTex: +db $18, $01, $01, $01 +db $0A +dd ScarabaLeaderName +ScarabaLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $83, $93, $91, $A2, $91, $92, $91, $51, $59, $1F, $02, $67, $04, $D9, $00 +db $13, $02 ;Scaraba + +DalaamTeleTex: +db $18, $01, $01, $01 +db $0A +dd DalaamLeaderName +DalaamLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $74, $91, $9C, $91, $91, $9D, $51, $59, $1F, $02, $67, $04, $D8, $00, $13 +db $02 ;Dalaam + +DarkTeleTex: +db $18, $01, $01, $01 +db $0A +dd DarkLeaderName +DarkLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $A4, $98, $95, $50, $74, $95, $95, $A0, $50, $74, $91, $A2, $9B, $9E, $95 +db $A3, $A3, $51, $59, $1F, $02, $67, $04, $DA, $00, $13, $02; Deep Darkness + +TendaTeleTex: +db $18, $01, $01, $01 +db $0A +dd TendaLeaderName +TendaLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $84, $95, $9E, $94, $91, $50, $86, $99, $9C, $9C, $91, $97, $95, $51, $59 +db $1F, $02, $67, $04, $DB, $00, $13, $02 ;Tenda Village + +UnderworldTeleTex: +db $18, $01, $01, $01 +db $0A +dd UnderLeaderName +UnderLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $A4, $98, $95, $50, $7C, $9F, $A3, $A4, $50, $85, $9E, $94, $95, $A2, $A7 +db $9F, $A2, $9C, $94, $51, $59, $1F, $02, $67, $04, $DC, $00, $13, $02; Lost Underworld + +MagicantTeleTex: +db $18, $01, $01, $01 +db $0A +dd MagicLeaderName +MagicLeaderDone: +db $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $A4, $9F, $50, $A4, $95, $9C, $95, $A0, $9F, $A2, $A4, $50, $A4, $9F +db $50, $7D, $91, $97, $99, $93, $91, $9E, $A4, $51, $59, $1F, $02, $67, $04, $DF +db $00, $13, $02 ;Magicant + +db $18, $01, $01, $01, $70, $58, $1C, $02, $01, $50, $9C, $95, $91, $A2, $9E, $95 +db $94, $50, $9E, $9F, $A4, $98, $99, $9E, $97, $51, $59, $1F, $02, $79, $13, $02;Nothing + +PooPsiTex: +db $18, $01, $01, $01, $70, $58, $1C, $02, $04, $50, $A2, $95, $91, $9C, $99, $AA +db $95, $94, $50, $A4, $98, $95, $50, $A0, $9F, $A7, $95, $A2, $50, $9F, $96, $50 +db $07, $D1, $03, $1B, $03, $8E, $95, $EE, $FF, $1C, $12, $15, $51, $59, $1F, $02 +db $67, $1F, $71, $04, $02, $04, $D1, $03, $13, $02, $1C, $12, $16, $51, $59, $1F +db $02, $67, $1F, $71, $04, $03, $13, $02; Starstorm + +ORG $EEA500 ;You Win +db $08, $01, $95, $EE, $00, $18, $00, $02, $00, $00, $00, $00, $00, $00, $00, $00; I assume the first part of this to be the automated Magicant teleport? + +ORG $EE9C12 +db $07, $D5, $03, $1B, $03, $10, $A5, $EE, $00, $07, $D4, $03, $1B, $03, $00, $A5 +db $EE, $00, $07, $D3, $03, $1B, $03, $D0, $9B, $EE, $00, $18, $00, $00, $02 ;Sanc text + +ORG $EE9620 +db $18, $01, $01, $19, $02, $83, $A4, $9F, $A2, $95, $02, $19, $02, $84, $91, $9B +db $95, $02, $19, $02, $74, $95, $9C, $95, $A4, $95, $02, $1C, $07, $03, $11, $09 +db $03, $50, $96, $EE, $00, $99, $96, $EE, $00, $84, $C6, $EE, $00, $18, $04, $02 +db $08, $31, $E4, $C5, $00, $1B, $02, $20, $96, $EE, $00, $1D, $0C, $01, $01, $18 +db $07, $02, $00, $00, $00, $00, $1B, $03, $6C, $96, $EE, $00, $08, $56, $E4 +db $C5, $00, $01, $1B, $02, $20, $96, $EE, $00, $1B, $00, $0A +dl StorageStoreCheck +db $0A +dd StorageStoreCheck +db $00 +BackFromCheck: +db $1B, $01, $19, $19, $00, $00, $1B, $01, $1D, $12, $00 +db $00, $01, $0A, $50, $96, $EE, $18, $04, $02, $02, $0E, $01, $19, $14, $1B, $02 +db $20, $96, $EE, $00, $1A, $07, $01, $1B, $02, $D6, $96, $EE, $00, $1B, $04, $1B +db $00, $18, $02, $08, $4A, $E5, $C5, $00, $1B, $02, $99, $96, $EE, $00, $1B, $05, $18 +db $03, $0D, $18, $00, $18, $03, $01, $1B, $06, $1D, $13, $00, $00, $19, $19 +db $00, $00, $00, $0A, $99, $96, $EE, $18, $04, $0A, $20, $96 +db $EE, $00 +db $08, $F8, $C6, $EE, $00, $01, $1B, $02, $84, $C6, $EE, $00, $1B, $00, $19, $19 +db $00, $00, $1D, $0B, $00, $1B, $02, $DD, $96, $EE, $00, $1B, $01, $1D, $0F, $00 +db $00, $01, $0A, $DD, $96, $EE, $00, $18, $04, $02, $DD, $96, $EE, $18, $04 ;Pocket Storage menu + +ORG $C67026 +db $07, $9B, $00, $1B, $02, $35, $D7, $C9, $00, $1D, $05, $FF, $AF, $1B, $03, $7A +db $70, $C6, $00, $70, $7D, $95, $5E, $03, $00, $70, $77, $A5, $91, $A2, $94, $5E +db $03, $00, $70, $74, $91, $A2, $9B, $9E, $95, $A3, $A3, $50, $A4, $98, $99, $A3 +db $50, $A7, $91, $A9, $5E, $03, $00, $70, $72, $A2, $99, $9E, $97, $50, $1C, $05 +db $AF, $5E, $03, $00, $70, $84, $98, $95, $9E, $50, $A7, $95, $50, $A4, $91, $9C +db $9B, $5E, $13, $02, $70, $89, $9F, $A5, $50, $92, $A2, $99, $9E, $97, $50, $1C +db $05, $AF, $5E, $03, $00, $70, $7D, $95, $5E, $03, $00, $70, $74, $99, $A3, $A0 +db $95, $9C, $50, $94, $91, $A2, $9B, $9E, $95, $A3, $A3, $5E, $03, $00, $70, $89 +db $9F, $A5, $50, $A7, $91, $99, $A4, $5E, $03, $00, $50, $50, $1F, $02, $76, $58 +db $84, $98, $95, $50, $84, $95, $9E, $94, $91, $50, $A4, $9F, $9F, $9B, $50, $A4 +db $98, $95, $50, $78, $91, $A7, $9B, $50, $95, $A9, $95, $50, $91, $9E, $94, $50 +db $a2, $a5, $a3, $98, $95, $94, $50, $9F, $A5, $A4, $50, $A4, $98, $95, $50, $94 +db $9F, $9F, $A2, $5E, $5E, $5E, $59, $13, $18, $04, $1F, $1E, $D3, $00, $06, $10 +db $20, $1F, $02, $5F, $10, $C0, $04, $20, $01, $1D, $01, $FF, $AF, $02 ;Tenda guard text + +ORG $EE9871 +db $07, $DA, $03, $1B, $03, $EA, $95, $EE, $00, $04, $DA, $03, $50, $50, $1F, $02 +db $44, $10, $60, $18, $01, $01, $58, $84, $98, $99, $A3, $50, $99, $A3, $50, $A3 +db $9F, $9D, $95, $50, $A3, $A4, $A2, $91, $9E, $97, $95, $50, $A4, $95, $91, $10 +db $30, $5E, $10, $30, $5E, $10, $30, $5E, $59, $13, $18, $04, $04, $DA, $03, $FE +db $0A, $AF, $92, $EE, $1F, $02, $44, $10, $60, $18, $01, $01, $50, $50, $58, $89 +db $9F, $A5, $57, $A6, $95, $50, $97, $9F, $A4, $A4, $95, $9E, $50, $A5, $A3, $95 +db $94, $50, $A4, $9F, $50, $A4, $98, $95, $50, $A4, $91, $A3, $A4, $95, $5E, $59 ;Tea text +db $13, $02 + +db $18, $01, $01, $50, $50, $58, $83, $95, $9e, $a4, $50, $91, $50, $1c, $05, $ad +db $50, $a4, $9f, $50, $1c, $02, $01, $51, $59, $1f, $02, $66, $10, $20, $13, $02; Got AP item, for PSI checks + +ORG $C9DC18 +db $0A,$A6,$95,$EE,$00 + +ORG $CF2375 +db $00,$00,$00,$00,$20,$81 ;Tenda door + +ORG $CF2396 +db $00,$00,$00,$00,$00,$00 + +ORG $CF0D87 +db $E5,$FA,$C6,$00,$1D,$82 ;Lock threed zombie door + +ORG $CF9426 +db $66 + +ORG $C483BE +LDA #$AAAA + +ORG $CF61EB +dw $0001 + +ORG $CF6B59 +dw $0002 + +ORG $C9DAFD +db $00 + +ORG $C9DAFF +dw $03D7 + +db $02 + +ORG $C557F0 +db $70, $79, $a4, $50, $91, $a0, $a0, $95, $91, $a2, $a3, $50, $a4, $9f, $50, $92 +db $95, $50, $91, $50, $a2, $95, $a6, $99, $95, $a7, $50, $96, $9f, $a2, $50, $91 +db $50, $83, $93, $91, $a2, $91, $92, $91, $5d, $a4, $98, $95, $9d, $95, $94, $50 +db $a2, $95, $a3, $a4, $91, $a5, $a2, $91, $9e, $a4, $5e, $13, $02 + +ORG $EFA0DC +db $70, $84, $98, $95, $50, $98, $99, $95, $a2, $9f, $97, $9c, $a9, $a0, $98, $a3 +db $50, $94, $95, $a0, $99, $93, $a4, $50, $91, $50, $a2, $95, $a6, $99, $95, $a7 +db $50, $96, $9f, $a2, $50, $91, $50, $a2, $95, $a3, $a4, $91, $a5, $a2, $91, $9e +db $a4, $50, $9f, $a7, $9e, $95, $94, $50, $92, $a9, $50, $a4, $98, $95, $50, $83 +db $a0, $98, $99, $9e, $a8, $5e, $03, $00, $70, $84, $98, $95, $50, $a2, $95, $a6 +db $99, $95, $a7, $50, $97, $9f, $95, $a3, $50, $9f, $9e, $50, $91, $a4, $50, $9c +db $95, $9e, $97, $a4, $98, $50, $91, $92, $9f, $a5, $a4, $50, $a4, $98, $95, $50 +db $a0, $9f, $9f, $a2, $50, $a1, $a5, $91, $9c, $99, $a4, $a9, $50, $9f, $96, $50 +db $a4, $98, $95, $50, $96, $9f, $9f, $94, $50, $92, $95, $99, $9e, $97, $50, $a3 +db $95, $a2, $a6, $95, $94, $5c, $10, $15, $50, $91, $9e, $94, $50, $91, $a0, $a0 +db $95, $91, $a2, $a3, $50, $a4, $9f, $50, $92, $95, $50, $a3, $99, $97, $9e, $95 +db $94, $50, $92, $a9, $50, $6C, $82, $91, $9d, $50, $82, $91, $99, $a3, $99, $9e +db $5e, $6E, $13, $02 + +ORG $C87209 +db $1d, $05, $ff, $b9, $1b, $02, $20, $72, $c8, $00, $0a, $17, $72, $c8 + +ORG $CF5DAB +db $3F + +ORG $C573C1 +db $0A,$DC,$73,$C5,$00 + +ORG $C573DC +;CLEANUP: can I subrotuine here +db $18, $01, $01, $70, $83, $9f, $5c, $50, $9e, $9f, $a7, $50, $79, $50, $a7, $99 +db $9c, $9c, $50, $a4, $95, $91, $93, $98, $50, $a9, $9f, $a5, $50, $a4, $98, $95 +db $50, $a3, $95, $93, $a2, $95, $a4, $50, $9f, $96, $50, $9d, $a9, $50, $a0, $9f +db $a7, $95, $a2, $5e, $5e, $5e, $03, $00, $70, $89, $9f, $a5, $50, $9d, $a5, $a3 +db $a4, $50, $9c, $95, $91, $a2, $9e, $50, $a4, $98, $99, $a3, $50, $a0, $9f, $a7 +db $95, $a2, $5c, $10, $15, $50, $95, $a6, $95, $9e, $50, $99, $96, $50, $a9, $9f +db $a5, $50, $94, $9f, $9e, $57, $a4, $50, $a7, $91, $9e, $a4, $50, $a4, $9f, $5e +db $03, $08, $54, $95, $FE, $00, $04, $d9, $03, $02, $9b, $32, $c9, $00 + +ORG $C93284 +db $0A,$AB,$32,$C9,$00 + +ORG $CF7B49 +db $7E + +ORG $CF794B +db $00 + +ORG $C9AF4B +db $D9,$00 + +ORG $CFDA7E +db $D8,$03,$02; Dungeon Man signs + +ORG $CFDA8F +db $D8,$03,$01; Dungeon Man signs + +ORG $CFD908 +db $D8, $03, $01;Submarine Visibility + +ORG $C57C2E +db $04, $d8, $03, $0a, $39, $7c, $c5, $6f, $7c + +ORG $C57C3D +db $01 + +ORG $C93529 +db $01 + +ORG $C5796B +db $D9 +;;;;;;;;;;;;;;;;;;; +ORG $C9C999 +db $D8, $00 + +ORG $C9CBC0 +db $18,$01,$01, $0A,$9F,$C9,$C9 + +ORG $C9CA28 +db $02 + +ORG $CFD211 +db $01 + +ORG $C87220 +;Sphinx tetx +db $18, $01, $01 +db $70, $89, $9f, $a5, $57, $a6, $95, $50, $92, $a2, $9f, $a5, $97, $98, $a4, $50 +db $a4, $98, $95, $50, $91, $9e, $93, $99, $95, $9e, $a4, $50, $9d, $91, $9e, $a5 +db $a3, $93, $a2, $99, $a0, $a4, $a3, $5e, $10, $20, $50, $89, $9f, $a5, $50, $9d +db $91, $a9, $50, $a0, $a2, $9f, $93, $95, $95, $94, $5e, $13, $08, $15, $30, $c9 +db $00, $04, $56, $01, $02 + + +ORG $C5749A +db $0A,$F3,$74,$C5,$00 + +ORG $C87203 +db $56 + +ORG $C92967 +db $87, $9f, $a7, $51, $50, $7c, $9f, $9f, $9b, $50, $91, $a4, $50, $a4, $98, $99 +db $a3, $50, $97, $a5, $a9, $50, $a3, $a4, $91, $9e, $94, $99, $9e, $97, $50, $9f +db $9e, $50, $91, $50, $a2, $9f, $93, $9b, $51, $13, $08, $18, $96, $fe, $00, $18 +db $04, $02; Mu training text + +ORG $D5F810 +db $10, $78, $10, $78, $10, $3C, $1D, $19, $01, $02, $1D, $19, $01, $0A, $B9, $82, $C6, $00 + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $C78641 + +db $0A, $A0, $E8, $C5, $00; Desert bus text + +ORG $CF6219 +db $04, $00; Desert tunnel + +ORG $CFB2E5 +db $31,$01,$02,$2E,$00,$47,$00 + +ORG $C3AF4E +db $19, $50, $FE + +ORG $C3FE50 +db $42, $2f, $a8, $c0, $1a, $5c, $bb, $1a, $64, $FE, $42, $8d, $a8, $c0, $C3, $00 +db $96, $FE, $09, $42 + +db $0e, $05, $12, $00, $42, $43, $a9, $c0, $ff, $42, $85, $a6, $c0, $80, $01, $1a +db $44, $ab, $06, $01, $42, $43, $a9, $c0, $ff, $42, $c6, $a8, $c0, $0a, $64, $FE +db $1b, $23 + +db $06, $01, $42, $43, $a9, $c0, $ff, $42, $c6, $a8, $c0, $0a, $64, $FE, $1b, $23 + +ORG $C3FE96 +db $18, $01, $01, $1f, $02, $60, $70, $87, $9f, $9f, $9f, $9f, $51, $10, $14, $17 +db $83, $9f, $9f, $9f, $51, $10, $0f, $17, $83, $9f, $9f, $9f, $9f, $9f, $9f, $9f +db $51, $03, $00, $70, $58, $77, $9f, $15, $85, $51, $10, $0f, $50, $50, $77, $9f +db $15, $85, $51, $59, $03, $18, $04, $1f, $15, $31, $01, $63, $00, $01, $1f, $15 +db $31, $01, $64, $00, $01, $1f, $61, $1f, $21, $41, $02 + +ORG $C5E8A0 +db $07, $47, $00, $1b, $03, $4a, $e9, $c5, $00, $70, $58, $71, $50, $9e, $9f, $a4 +db $99, $93, $95, $50, $99, $a3, $50, $a0, $9f, $a3, $a4, $95, $94, $50, $9f, $9e +db $50, $a4, $98, $95, $50, $92, $a5, $a3, $50, $a3, $93, $98, $95, $94, $a5, $9c +db $95, $5e, $03, $00, $70, $74, $a5, $95, $50, $a4, $9f, $50, $a2, $95, $a0, $9f +db $a2, $a4, $a3, $50, $9f, $96, $50, $a0, $91, $a2, $91, $9e, $9f, $a2, $9d, $91 +db $9c, $50, $91, $93, $a4, $99, $a6, $99, $a4, $a9, $5c, $10, $15, $50, $92, $a5 +db $a3, $50, $a2, $9f, $a5, $a4, $95, $a3, $50, $a4, $9f, $50, $84, $98, $a2, $95 +db $95, $94, $50, $98, $91, $a6, $95, $50, $92, $95, $95, $9e, $50, $a4, $95, $9d +db $a0, $9f, $a2, $91, $a2, $99, $9c, $a9, $50, $a3, $a5, $a3, $a0, $95, $9e, $94 +db $95, $94, $5e, $03, $00, $70, $5d, $76, $9f, $a5, $a2, $a3, $99, $94, $95, $50 +db $72, $a5, $a3, $50, $73, $9f, $5e, $59, $13, $02, $70, $58, $1c, $02, $00, $0a +db $46, $86, $c7, $00 + +ORG $D5EDB3 +db $35,$00,$e5,$04,$03,$20 + +ORG $CFBE73 +db $85, $00, $02, $0A, $00, $E9, $02, $01, $07, $1F, $C6 + +ORG $CFBE89 +db $DE, $00, $01 + +ORG $C61F0E +db $0A, $D6, $1C, $C8 + +ORG $C81CD6 +db $70, $85, $9b, $99, $95, $50, $85, $9b, $17, $fc, $9b, $99, $95, $03, $00, $70 +db $58, $79, $50, $91, $9d, $50, $7d, $91, $9e, $50, $7b, $5e, $50, $7d, $91, $9e +db $5e, $59, $03, $00, $70, $85, $9b, $99, $95, $50, $85, $9b, $17, $fc, $9b, $99 +db $95, $03, $00, $70, $58, $84, $91, $9c, $91, $50, $82, $91, $9d, $91, $98, $50 +db $91, $a3, $9b, $95, $94, $50, $9d, $95, $50, $a4, $9f, $50, $97, $a5, $91, $a2 +db $94, $50, $a4, $98, $99, $a3, $50, $94, $9f, $9f, $a2, $5e, $59, $03, $00, $70 +db $85, $9b, $99, $95, $50, $85, $9b, $17, $fc, $9b, $99, $95, $03, $00, $70, $58 +db $79, $96, $50, $a9, $9f, $a5, $50, $97, $99, $a6, $95, $50, $9d, $95, $50, $a4 +db $98, $95, $50, $1c, $05, $a6, $5c, $10, $05, $50, $79, $57, $9c, $9c, $50, $9c +db $95, $a4, $50, $a9, $9f, $a5, $50, $a4, $98, $a2, $9f, $a5, $97, $98, $5e, $59 +db $0a, $84, $1f, $c6 + +ORG $C61FFA +db $1D + +ORG $C62005 +db $E9, $02 + +ORG $C61F08 +db $E9, $02 + +ORG $CFC032 +db $E9, $02 + +ORG $CF15E3 +db $01 + +ORG $C627D8 +db $0A, $4F, $51, $C9 + +ORG $C9514F +db $70, $58, $79, $50, $a7, $9f, $a5, $9c, $94, $50, $a4, $95, $91, $93, $98, $50 +db $a9, $9f, $a5, $50, $a4, $95, $9c, $95, $a0, $9f, $a2, $a4, $91, $a4, $99, $9f +db $9e, $5c, $10, $0f, $50, $92, $a5, $a4, $50, $99, $a4, $50, $a3, $95, $95, $9d +db $a3, $50, $a9, $9f, $a5, $50, $91, $9c, $a2, $95, $91, $94, $a9, $50, $9b, $9e +db $9f, $a7, $50, $99, $a4, $51, $59, $07, $65, $02, $1b, $03, $ec, $51, $c9, $00 +db $03, $00, $70, $7b, $a9, $99, $9b, $99, $50, $9b, $91, $03, $00, $70, $58, $79 +db $9e, $a3, $a4, $95, $91, $94, $5c, $50, $79, $57, $9c, $9c, $50, $a4, $95, $91 +db $93, $98, $50, $a9, $9f, $a5, $50, $a4, $98, $99, $a3, $51, $59, $13, $18, $04 +db $1f, $02, $32, $10, $20, $1f, $02, $26, $10, $30, $1f, $02, $31, $10, $10, $1f +db $02, $41, $10, $55, $08, $55, $93, $fe, $00, $04, $65, $02, $02, $13, $02 + +ORG $CFBC05 +db $00 + + +;Dusty Dunes Miner +ORG $C60365 +db $1d, $05, $ff, $cb, $1b, $03, $01, $04, $c6, $00, $70, $78, $95, $a9, $5e, $03 +db $00, $70, $79, $50, $a7, $91, $a3, $50, $9d, $99, $9e, $99, $9e, $97, $50, $96 +db $9f, $a2, $50, $1c, $05, $5a, $a3, $5c, $10, $10, $50, $92, $a5, $a4, $50, $79 +db $50, $9c, $9f, $a3, $a4, $50, $9d, $a9, $50, $a0, $95, $a2, $9d, $99, $a4, $50 +db $92, $95, $93, $91, $a5, $a3, $95, $50, $79, $57, $9d, $50, $6C, $9e, $9f, $a4 +db $50, $9c, $99, $93, $95, $9e, $a3, $95, $94, $6E, $5e, $03, $00, $70, $79, $96 +db $50, $a9, $9f, $a5, $50, $92, $a2, $99, $9e, $97, $50, $9d, $95, $50, $91, $50 +db $a0, $95, $a2, $9d, $99, $a4, $5c, $10, $10, $50, $79, $57, $9c, $9c, $50, $a3 +db $98, $91, $a2, $95, $50, $a7, $98, $91, $a4, $95, $a6, $95, $a2, $50, $9c, $9f +db $9f, $a4, $50, $79, $50, $96, $99, $9e, $94, $5e, $13, $02, $70, $89, $9f, $a5 +db $57, $a6, $95, $50, $97, $9f, $a4, $50, $91, $50, $9d, $99, $9e, $99, $9e, $97 +db $50, $a0, $95, $a2, $9d, $99, $a4, $51, $1f, $02, $76, $10, $20, $1d, $01, $ff +db $cb, $71, $9c, $a2, $99, $97, $98, $a4, $5c, $50, $9e, $95, $a7, $50, $96, $9f +db $a2, $95, $9d, $91, $9e, $5e, $03, $00, $70, $84, $98, $95, $a2, $95, $57, $a3 +db $50, $9e, $9f, $50, $a4, $99, $9d, $95, $50, $a4, $9f, $50, $a7, $91, $a3, $a4 +db $95, $5c, $10, $10, $50, $a3, $9f, $50, $a7, $95, $57, $a2, $95, $50, $a2, $a5 +db $9e, $9e, $99, $9e, $97, $50, $91, $a4, $50, $96, $a5, $9c, $9c, $50, $a0, $9f +db $a7, $95, $a2, $51, $03, $00, $04, $ae, $00, $18, $04, $1f, $21, $23, $1f, $e5 +db $ff, $1f, $16, $f8, $02, $01, $18, $01, $01, $70, $78, $9f, $9f, $51, $03, $00 +db $70, $84, $9f, $9c, $94, $50, $a9, $9f, $a5, $50, $99, $a4, $57, $94, $50, $92 +db $95, $50, $a1, $a5, $99, $93, $9b, $51, $03, $00, $70, $84, $98, $95, $a2, $95 +db $57, $a3, $50, $9a, $a5, $a3, $a4, $50, $9f, $9e, $95, $50, $a0, $a2, $9f, $92 +db $9c, $95, $9d, $5e, $5e, $5e, $03, $00, $0a, $28, $12, $c6, $00 + +ORG $C61229 +db $79, $50, $91, $9c, $9d, $9f, $a3, $a4, $50, $96, $9f, $a5, $9e, $94, $50, $1C +db $05, $70, $a3, $5c, $50, $92, $a5, $a4 + +ORG $D5ECC3 +db $c0,$01,$b5,$04,$03,$1d + +ORG $C60351 +db $48, $00, $0B, $05, $C6 + +ORG $C60358 +db $AE, $00, $28, $12, $C6 + +ORG $C6050B +db $70, $89, $9f, $a5, $50, $94, $99, $94, $50, $99, $a4, $51, $03, $00, $70, $87 +db $98, $99, $9c, $95, $50, $a9, $9f, $a5, $50, $a7, $95, $a2, $95, $50, $94, $9f +db $a7, $9e, $50, $a4, $98, $95, $a2, $95, $5c, $50, $79, $50, $a3, $91, $a7, $50 +db $a3, $9f, $9d, $95, $a4, $98, $99, $9e, $97, $50, $97, $9c, $99, $9d, $9d, $95 +db $a2, $99, $9e, $97, $50, $99, $9e, $50, $a4, $98, $95, $50, $93, $91, $a6, $95 +db $50, $a7, $91, $9c, $9c, $5e, $03, $00, $70, $71, $a3, $50, $a0, $a2, $9f, $9d +db $99, $a3, $95, $94, $5c, $50, $a9, $9f, $a5, $50, $93, $91, $9e, $50, $98, $91 +db $a6, $95, $50, $99, $a4, $5e, $03, $1d, $00, $ff, $b6, $1b, $02, $ac, $05, $c6 +db $00, $1d, $0e, $ff, $01, $08, $b6, $dc, $c7, $ff, $0a, $a7, $05, $C6, $50, $97 +db $9f, $a4, $50, $a4, $98, $95, $50, $1c, $05, $b6, $51, $59, $04, $5a, $00, $13 +db $02, $70, $89, $9f, $a5, $50, $94, $9f, $9e, $57, $a4, $50, $98, $91, $a6, $95 +db $50, $91, $9e, $a9, $50, $a2, $9f, $9f, $9d, $50, $96, $9f, $a2, $50, $99, $a4 +db $5c, $50, $a4, $98, $9f, $a5, $97, $98, $5e, $13, $02; Miner + +ORG $C6034A +db $5A, $00, $5F, $00, $C6 + +ORG $C6005F +db $70, $79, $50, $98, $9f, $a0, $95, $50, $a4, $98, $95, $50, $93, $99, $a4, $a9 +db $50, $94, $9f, $95, $a3, $9e, $57, $a4, $50, $96, $99, $9e, $94, $50, $9f, $a5 +db $a4, $50, $91, $92, $9f, $a5, $a4, $50, $a4, $98, $99, $a3, $50, $98, $9f, $9c +db $95, $5e, $5e, $5e, $13, $02 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $C8B53F +db $70, $7d, $a9, $50, $a7, $99, $96, $95, $50, $a7, $91, $9e, $a4, $a3, $50, $a4 +db $9f, $50, $a3, $a4, $91, $a9, $50, $98, $95, $a2, $95, $50, $91, $9e, $94, $50 +db $a3, $a4, $91, $a2, $95, $50, $91, $a4, $50, $91, $50, $a2, $9f, $93, $9b, $50 +db $91, $9c, $9c, $50, $94, $91, $a9, $5e, $03, $00, $70, $7f, $9e, $50, $a4, $9f +db $a0, $50, $9f, $96, $50, $a4, $98, $91, $a4, $5c, $10, $07, $50, $a4, $98, $95 +db $50, $7b, $a2, $91, $9b, $95, $9e, $50, $98, $91, $a3, $50, $92, $95, $95, $9e +db $50, $a4, $95, $a2, $a2, $9f, $a2, $99, $aa, $99, $9e, $97, $50, $a4, $98, $95 +db $50, $a3, $95, $91, $a3, $5e, $03, $00, $70, $79, $57, $9d, $50, $9e, $9f, $a4 +db $50, $98, $91, $a0, $a0, $a9, $50, $91, $92, $9f, $a5, $a4, $50, $99, $a4, $5c +db $10, $08, $50, $92, $a5, $a4, $50, $79, $50, $98, $91, $a6, $95, $50, $a4, $9f +db $50, $94, $9f, $50, $9d, $a9, $50, $9a, $9f, $92, $50, $91, $a3, $50, $91, $50 +db $a3, $91, $99, $9c, $9f, $a2, $5e, $03, $00, $70, $87, $91, $9e, $a4, $50, $a4 +db $9f, $50, $a3, $91, $99, $9c, $50, $a4, $9f, $50, $83, $93, $91, $a2, $91, $92 +db $91, $6f, $03, $00, $0a, $7b, $b7, $c8; Summers sailor + +ORG $C8B52B +db $DB, $03 + +ORG $C8B532 +db $69, $02 + +ORG $C68955 +db $70, $78, $95, $9c, $9c, $9f, $5c, $10, $07, $50, $99, $a3, $50, $a4, $98, $99 +db $a3, $50, $19, $10, $01, $1b, $00, $1c, $02, $ff, $6f, $03, $00, $70, $83, $9f +db $a2, $a2, $a9, $50, $96, $9f, $a2, $50, $93, $9f, $9e, $a4, $91, $93, $a4, $99 +db $9e, $97, $50, $a9, $9f, $a5, $50, $9c, $99, $9b, $95, $50, $a4, $98, $99, $a3 +db $5c, $03, $00, $70, $92, $a5, $a4, $50, $79, $50, $a2, $95, $91, $9c, $9c, $a9 +db $50, $9e, $95, $95, $94, $50, $a9, $9f, $a5, $50, $a4, $9f, $50, $93, $91, $a4 +db $93, $98, $50, $a5, $a0, $50, $9f, $9e, $50, $a9, $9f, $a5, $a2, $50, $91, $a3 +db $a9, $9e, $93, $50, $a0, $a2, $9f, $97, $a2, $95, $a3, $a3, $5e, $03, $00, $70 +db $79, $50, $9b, $9e, $9f, $a7, $50, $a9, $9f, $a5, $57, $a2, $95, $50, $92, $a5 +db $a3, $a9, $50, $a3, $91, $a6, $99, $9e, $97, $50, $a4, $98, $95, $50, $a7, $9f +db $a2, $9c, $94, $50, $91, $9e, $94, $50, $91, $9c, $9c, $5c, $10, $08, $50, $92 +db $a5, $a4, $50, $79, $57, $9d, $50, $a3, $a4, $99, $9c, $9c, $50, $99, $9e, $50 +db $72, $7b, $5e, $03, $00, $70, $74, $9f, $9e, $57, $a4, $50, $a7, $9f, $a2, $a2 +db $a9, $5d, $10, $10, $50, $79, $50, $98, $99, $9e, $a4, $95, $94, $50, $9d, $9f +db $a2, $95, $50, $99, $a4, $95, $9d, $a3, $5e, $50, $79, $50, $9a, $a5, $a3, $a4 +db $50, $9e, $95, $95, $94, $50, $9d, $a9, $5e, $5e, $5e, $03, $00, $70, $87, $98 +db $91, $a4, $6f, $03, $00, $70, $87, $98, $91, $a4, $6f, $03, $00, $70, $84, $98 +db $99, $a3, $50, $99, $a3, $50, $a4, $98, $95, $50, $a7, $a2, $9f, $9e, $97, $50 +db $9d, $a5, $9c, $a4, $99, $a7, $9f, $a2, $9c, $94, $6f, $03, $00, $70, $7f, $9f +db $a0, $a3, $51, $03, $00, $70, $77, $9f, $a4, $a4, $91, $50, $97, $9f, $51, $0A +db $A3, $8A, $C6, $a6, $95, $a2, $50, $a4, $91, $9c, $9b, $95, $94, $51, $03, $00 +db $70, $5a, $72, $95, $95, $95, $95, $95, $a0, $5a, $13, $18, $04, $1f, $03, $04 +db $11, $04, $02; Summers Tony Call + +ORG $C8B9BC +db $D7, $00 + +ORG $C8A020 +db $3D, $00 + +ORG $C77EE8 +db $19, $1F, $1B, $04, $70, $0A, $BC, $7E, $C7 + +ORG $D56FCC +db $4F + +ORG $C8A992 +db $7F, $AA + +ORG $CF1DCB +db $DC, $A0, $EF + +ORG $C8AAE6 +db $0A, $3D, $6E, $C8 + +ORG $C86E3D +db $07, $57, $01, $1b, $03, $ed, $aa, $c8, $00, $0a, $b0, $ab, $c8 + +ORG $C8B226 +db $04 + +ORG $C920C5 +db $08, $01, $95, $fe, $00, $18, $04, $1f, $21, $24, $1f, $ec, $ff, $06, $02; Get magic cake item + +ORG $D5ECCB +db $89, $02, $63, $01, $05, $00; Warp to summers cart + +ORG $C8B199 +db $3D; Magic Tart shop + +ORG $C92E90 +db $0A, $50, $06, $61 + +ORG $610650 +db $0e, $01, $0d, $01, $1d, $19, $00, $1b, $03, $6e, $06, $61, $00, $19, $10, $00 +db $0b, $04, $1b, $03, $87, $08, $61, $00, $0f, $0a, $52, $06, $61, $00, $0e, $01 +db $0d, $01, $1d, $19, $00, $1b, $03, $8c, $06, $61, $00, $19, $10, $00, $0b, $03 +db $1b, $03, $bd, $07, $61, $00, $0f, $0a, $70, $06, $61, $00, $0e, $01, $0d, $01 +db $1d, $19, $00, $1b, $03, $aa, $06, $61, $00, $19, $10, $00, $0b, $02, $1b, $03 +db $38, $07, $61, $00, $0f, $0a, $8e, $06, $61, $00, $70, $83, $9f, $5e, $5e, $5e +db $50, $a9, $9f, $a5, $57, $a2, $95, $50, $96, $a2, $9f, $9d, $50, $7f, $9e, $95 +db $a4, $a4, $6f, $03, $00, $70, $89, $9f, $a5, $50, $9d, $a5, $a3, $a4, $50, $92 +db $95, $50, $9f, $9e, $50, $91, $50, $a0, $a2, $95, $a4, $a4, $a9, $50, $99, $9d +db $a0, $9f, $a2, $a4, $91, $9e, $a4, $50, $9a, $9f, $a5, $a2, $9e, $95, $a9, $5c +db $10, $07, $50, $a4, $9f, $50, $93, $9f, $9d, $95, $50, $a3, $9f, $50, $96, $91 +db $a2, $5e, $03, $00, $70, $79, $50, $92, $95, $a4, $50, $a9, $9f, $a5, $50, $9d +db $a5, $a3, $a4, $50, $9d, $99, $a3, $a3, $50, $98, $9f, $9d, $95, $50, $95, $a6 +db $95, $a2, $a9, $50, $9f, $9e, $93, $95, $50, $99, $9e, $50, $91, $a7, $98, $99 +db $9c, $95, $51, $03, $0a, $88, $2f, $c9, $08, $7f, $dc, $c7, $00, $1b, $03, $aa +db $06, $61, $00 +db $0A +dl PaulaBoatText +NotSoloPaula: +db $5e, $5e, $50, $a4, $98, $91, $a4, $50, $97 +db $99, $a2, $9c, $50, $9f, $a6, $95, $a2, $50, $a4, $98, $95, $a2, $95, $5e, $5e +db $5e, $03, $00, $70, $a9, $9f, $a5, $a2, $50, $92, $a5, $94, $94, $a9, $5c, $10 +db $07, $50, $a2, $99, $97, $98, $a4, $6f, $5e, $5e, $5e, $10, $14, $50, $89, $9f +db $a5, $50, $a4, $a7, $9f, $50, $9f, $9e, $50, $91, $50, $a2, $9f, $9d, $91, $9e +db $a4, $99, $93, $50, $a6, $91, $93, $91, $a4, $99, $9f, $9e, $6f, $03, $00, $70 +db $78, $91, $51, $10, $07, $50, $79, $57, $9d, $50, $9a, $a5, $a3, $a4, $50, $9b +db $99, $94, $94, $99, $9e, $97, $51, $03, $00, $0a, $88, $2f, $c9, $08, $7f, $dc +db $c7, $00, $1b, $03, $8c, $06, $61, $00 +db $0A +dl JeffBoatText +NotSoloJeff: +db $5e, $5e, $50, $a4 +db $98, $91, $a4, $50, $97, $a5, $a9, $50, $a7, $99, $a4, $98, $50, $a4, $98, $95 +db $50, $97, $9c, $91, $a3, $a3, $95, $a3, $5e, $5e, $5e, $03, $00, $70, $a9, $9f +db $a5, $a2, $50, $92, $a5, $94, $94, $a9, $5c, $10, $07, $50, $a2, $99, $97, $98 +db $a4, $6f, $5e, $5e, $5e, $10, $14, $50, $78, $95, $50, $93, $91, $9d, $95, $50 +db $96, $a2, $9f, $9d, $50, $87, $99, $9e, $a4, $95, $a2, $a3, $6f, $03, $00, $70 +db $84, $98, $91, $a4, $57, $a3, $50, $a0, $a2, $95, $a4, $a4, $a9, $50, $96, $91 +db $a2, $50, $91, $a7, $91, $a9, $5e, $03, $00, $70, $89, $9f, $a5, $50, $97, $a5 +db $a9, $a3, $50, $9d, $a5, $a3, $a4, $50, $92, $95, $50, $97, $9f, $9f, $94, $50 +db $96, $a2, $99, $95, $9e, $94, $a3, $51, $03, $00, $70, $7d, $91, $a9, $92, $95 +db $50, $98, $95, $50, $93, $9f, $a5, $9c, $94, $50, $96, $99, $a8, $50, $a4, $98 +db $95, $50, $95, $9e, $97, $99, $9e, $95, $50, $96, $9f, $a2, $50, $9d, $95, $6f +db $03, $00, $0a, $88, $2f, $c9, $00, $08, $7f, $dc, $c7, $00, $1b, $03, $6e, $06 +db $61, $00, $0a, $9e, $2e, $c9 + +ORG $C92CDC +db $db, $03 + +ORG $C31001 +db $db, $03 + +ORG $C3107B +db $db, $03 + +ORG $C92DDB +db $db, $03 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $CFB3FC +db $00 + +ORG $CFB3F5 +db $3D + +ORG $D015BA +db $C0, $FF + +ORG $D0FFC0 +db $DC, $83, $02, $00, $1d, $01, $AA, $00, $21, $01, $b5; Winters gate map change + +ORG $C6CF2D; Snow Wood guard +db $0A, $73, $5F, $C7 + +ORG $C75F73 +db $06, $dc, $03, $4a, $f0, $c5, $00, $70, $7d, $91, $a8, $a7, $95, $9c, $9c, $50 +db $93, $91, $a5, $97, $98, $a4, $50, $9d, $95, $50, $93, $98, $95, $91, $a4, $99 +db $9e, $97, $50, $9f, $9e, $50, $91, $50, $9d, $91, $a4, $98, $50, $a4, $95, $a3 +db $a4, $5c, $10, $07, $50, $a3, $9f, $50, $98, $95, $50, $9d, $91, $94, $95, $50 +db $9d, $95, $50, $a3, $a4, $91, $9e, $94, $50, $9f, $a5, $a4, $50, $98, $95, $a2 +db $95, $5e, $03, $1d, $05, $ff, $a7, $1b, $03, $89, $ef, $c5, $ff, $00, $0e, $01 +db $0d, $01, $1d, $19, $00, $1b, $03, $f0, $5f, $c7, $00, $19, $10, $00, $0b, $03 +db $1b, $03, $79, $60, $c7, $00, $0f, $0a, $d3, $5f, $c7, $00, $00, $70, $79, $57 +db $9d, $50, $a3, $9f, $a2, $a2, $a9, $5c, $10, $07, $50, $19, $10, $01, $1b, $04 +db $1c, $02, $00, $5c, $03, $00, $70, $92, $a5, $a4, $50, $7d, $91, $a8, $a7, $95 +db $9c, $9c, $50, $a3, $91, $a9, $a3, $50, $79, $50, $93, $91, $9e, $57, $a4, $50 +db $9c, $95, $a4, $50, $91, $9e, $a9, $9f, $9e, $95, $50, $99, $9e, $a4, $9f, $50 +db $a4, $98, $95, $50, $a3, $93, $98, $9f, $9f, $9c, $50, $a4, $98, $91, $a4, $57 +db $a3, $50, $9e, $9f, $a4, $50, $91, $50, $a2, $95, $97, $99, $a3, $a4, $95, $a2 +db $95, $94, $50, $a3, $a4, $a5, $94, $95, $9e, $a4, $5e, $03, $00, $70, $84, $98 +db $9f, $a3, $95, $50, $91, $a2, $95, $50, $a4, $98, $95, $50, $a2, $a5, $9c, $95 +db $a3, $5e, $5e, $5e, $13, $02, $0e, $03, $08, $7f, $dc, $c7, $00, $1b, $03, $f0 +db $5f, $c7, $00, $70, $78, $95, $a9, $5c, $50, $1c, $02, $03, $5e, $50, $7d, $91 +db $a8, $a7, $95, $9c, $9c, $50, $a3, $91, $a9, $a3, $50, $a9, $9f, $a5, $57, $a2 +db $95, $50, $a3, $a5, $a3, $a0, $95, $9e, $94, $95, $94, $50, $a5, $9e, $a4, $99 +db $9c, $50, $a4, $98, $95, $50, $a7, $9f, $a2, $9c, $94, $50, $99, $a3, $50, $a3 +db $91, $a6, $95, $94, $5e, $03, $00, $70, $7e, $9f, $5c, $10, $08, $50, $9e, $9f +db $5c, $10, $08, $50, $a9, $9f, $a5, $57, $a2, $95, $50, $9e, $9f, $a4, $50, $99 +db $9e, $50, $a4, $a2, $9f, $a5, $92, $9c, $95, $50, $9f, $a2, $50, $91, $9e, $a9 +db $a4, $98, $99, $9e, $97, $5e, $03, $0a, $3e, $ef, $c5 + +ORG $C5EF3E +db $00, $70, $78, $95, $50, $9a, $a5, $a3, $a4, $50, $94, $9f, $95, $a3, $9e, $57 +db $a4, $50, $a7, $91, $9e, $a4, $50, $a9, $9f, $a5, $50, $a4, $9f, $50, $a7, $9f +db $a2, $a2, $a9, $50, $91, $92, $9f, $a5, $a4, $50, $a3, $a4, $a5, $94, $a9, $99 +db $9e, $97, $50, $a7, $98, $99, $9c, $95, $50, $9f, $9e, $50, $91, $9e, $50, $91 +db $94, $a6, $95, $9e, $a4, $a5, $a2, $95, $5e, $13, $02, $00, $70, $87, $98, $91 +db $a4, $57, $a3, $50, $a4, $98, $91, $a4, $6f, $03, $00, $70, $89, $9f, $a5, $50 +db $98, $91, $a6, $95, $50, $91, $50, $9c, $95, $a4, $a4, $95, $a2, $50, $a4, $9f +db $50, $94, $a2, $9f, $a0, $50, $9f, $96, $96, $50, $96, $9f, $a2, $50, $84, $9f +db $9e, $a9, $6f, $03, $00, $70, $87, $95, $9c, $9c, $10, $30, $5e, $10, $30, $5e +db $10, $30, $5e, $50, $79, $50, $97, $a5, $95, $a3, $a3, $50, $99, $a4, $57, $a3 +db $50, $91, $9c, $a2, $99, $97, $98, $a4, $50, $a4, $9f, $50, $9c, $95, $a4, $50 +db $a9, $9f, $a5, $50, $99, $9e, $50, $a3, $9f, $50, $a9, $9f, $a5, $50, $93, $91 +db $9e, $50, $94, $a2, $9f, $a0, $50, $99, $a4, $50, $9f, $96, $96, $5e, $10, $30 +db $5e, $10, $30, $5e, $10, $30, $03, $00, $70, $7a, $a5, $a3, $a4, $50, $a3, $a4 +db $91, $a9, $50, $9f, $a5, $a4, $50, $9f, $96, $50, $a4, $a2, $9f, $a5, $92, $9c +db $95, $51, $03, $18, $04, $04, $dc, $03, $1f, $e9, $7f, $02, $1f, $16, $7f, $02 +db $01, $1f, $02, $77, $1f, $15, $2e, $00, $07, $01, $01, $02, $70, $78, $a5, $a2 +db $a2, $a9, $50, $a5, $a0, $50, $91, $9e, $94, $50, $94, $9f, $50, $a7, $98, $91 +db $a4, $50, $a9, $9f, $a5, $50, $9e, $95, $95, $94, $50, $a4, $9f, $51, $13, $02 + +ORG $CF6027 +db $7D ;Boarding school event music + +ORG $C6FA03 +db $FF ;Skips broken key text + +ORG $C6FA0A +db $CD ;Opens locker with locker key + +ORG $C6FA26 +db $CD + +ORG $C6FA2A +db $75 + +ORG $C6F98C +db $0a, $26, $FE, $C4 + +ORG $C6F932 +db $0a, $41, $FE, $C4 + +ORG $C6F905 +db $0a, $F0, $FD, $C4 + +ORG $C6F95F +db $0a, $0B, $FE, $C4 + +ORG $C4FDF0 +db $07, $58, $00, $1b, $03, $93, $fa, $c6, $00, $08, $0b, $f9, $c6, $00, $1d, $03; FIX TEXT JUMPS!!!! +db $ff, $1b, $02, $0A, $FE, $C4, $00, $04, $58, $00, $02, $07, $F4, $03, $1b, $03 +db $93, $fa, $c6, $00, $08, $65, $f9, $c6, $00, $1d, $03, $ff, $1b, $02, $0a, $FE +db $C4, $00, $04, $F4, $03, $02, $07, $17, $00, $1b, $03, $93, $fa, $c6, $00, $08 +db $92, $f9, $c6, $00, $1d, $03, $ff, $1b, $02, $0a, $FE, $C4, $00, $04, $17, $00 +db $02, $07, $4e, $01, $1b, $03, $93, $fa, $c6, $00, $08, $38, $f9, $c6, $00, $1d +db $03, $ff, $1b, $02, $0A, $FE, $C4, $00, $04, $4e, $01, $02; Fix locker checks + +ORG $C6AA44 +db $70, $7f, $98, $5c, $10, $0f, $50, $a9, $9f, $a5, $50, $a3, $a4, $91, $a2, $a4 +db $9c, $95, $94, $50, $9d, $95, $5e, $03, $00, $70, $79, $57, $9d, $50, $a7, $9f +db $a2, $9b, $99, $9e, $97, $50, $9f, $9e, $50, $71, $a2, $93, $98, $99, $a0, $95 +db $9c, $91, $97, $9f, $50, $99, $9e, $a4, $95, $97, $a2, $91, $a4, $99, $9f, $9e +db $50, $96, $9f, $a2, $50, $a4, $98, $95, $50, $83, $a5, $a0, $95, $a2, $50, $72 +db $91, $92, $a9, $50, $7d, $91, $97, $99, $93, $50, $74, $a2, $95, $91, $9d, $50 +db $72, $9f, $a9, $5c, $03, $00, $70, $92, $a5, $a4, $50, $99, $a4, $50, $99, $a3 +db $9e, $57, $a4, $50, $97, $9f, $99, $9e, $97, $50, $a6, $95, $a2, $a9, $50, $a7 +db $95, $9c, $9c, $5e, $03, $00, $70, $79, $96, $50, $9f, $9e, $9c, $a9, $50, $80 +db $98, $91, $a2, $50, $a7, $95, $a2, $95, $50, $98, $95, $a2, $95, $5e, $03, $00 +db $70, $78, $95, $57, $94, $50, $92, $95, $50, $91, $92, $9c, $95, $50, $a4, $9f +db $50, $a0, $a2, $9f, $a6, $99, $94, $95, $50, $91, $50, $97, $a2, $95, $91, $a4 +db $50, $94, $95, $91, $9c, $50, $9f, $96, $50, $98, $95, $9c, $a0, $5e, $03, $00 +db $70, $71, $9e, $a9, $a7, $91, $a9, $a3, $5c, $10, $0f, $50, $79, $57, $94, $50 +db $9c, $9f, $a6, $95, $50, $a4, $9f, $50, $98, $95, $9c, $a0, $50, $a9, $9f, $a5 +db $50, $a7, $99, $a4, $98, $50, $a9, $9f, $a5, $a2, $50, $91, $94, $a6, $95, $9e +db $a4, $a5, $a2, $95, $5c, $03, $00, $70, $92, $a5, $a4, $50, $79, $57, $9d, $50 +db $93, $9f, $9d, $9d, $99, $a4, $a4, $95, $94, $50, $a4, $9f, $50, $9d, $a9, $50 +db $a7, $9f, $a2, $9b, $5e, $50, $79, $50, $93, $91, $9e, $50, $91, $a4, $50, $9c +db $95, $91, $a3, $a4, $50, $97, $99, $a6, $95, $50, $a9, $9f, $a5, $50, $a4, $98 +db $99, $a3, $50, $1c, $05, $01, $5e, $03, $0a, $d5, $ab, $c6, $00 + +ORG $C6ABD5; Maxwell +db $00, $1d, $00, $ff, $cd, $1b, $02, $da, $ac, $c6, $00, $1d, $03, $ff, $1d, $0e +db $00, $cd, $08, $b6, $dc, $c7, $00, $03, $00, $70, $77, $9f, $9f, $94, $50, $9c +db $a5, $93, $9b, $50, $9f, $a5, $a4, $50, $a4, $98, $95, $a2, $95, $51, $13, $04 +db $5d, $02, $02 + +ORG $CFB163 +db $49, $00, $02; Consistency for gate man + +ORG $C6CDAF +db $70, $79, $50, $93, $91, $9e, $57, $a4, $50, $92, $16, $ad, $15, $23, $15, $91 +db $94, $9f, $15, $0a, $a3, $9f, $50, $9e, $16, $a6, $17, $17, $13, $02; Cookie guy + +ORG $CFB0CA +db $49, $00, $02; Tony in bed + +ORG $CFB0D6 +db $00, $00, $04, $5E, $02 + +ORG $CFB0DE +db $10, $99, $EE + +ORG $EE9910 +db $70, $71, $a2, $95, $50, $a9, $9f, $a5, $50, $9c, $9f, $9f, $9b, $99, $9e, $97 +db $50, $96, $9f, $a2, $50, $84, $9f, $9e, $a9, $6f, $03, $00, $70, $78, $95, $57 +db $a3, $50, $9e, $9f, $a4, $50, $98, $95, $a2, $95, $50, $a2, $99, $97, $98, $a4 +db $50, $9e, $9f, $a7, $5e, $10, $10, $50, $78, $95, $50, $a3, $91, $99, $94, $50 +db $98, $95, $50, $a7, $91, $a3, $50, $97, $9f, $99, $9e, $97, $50, $a4, $9f, $50 +db $99, $9e, $a6, $95, $a3, $a4, $99, $97, $91, $a4, $95, $50, $83, $a4, $9f, $9e +db $95, $98, $95, $9e, $97, $95, $5c, $03, $00, $70, $92, $a5, $a4, $50, $9e, $95 +db $a6, $95, $a2, $50, $93, $91, $9d, $95, $50, $92, $91, $93, $9b, $5e, $5e, $5e +db $03, $00, $70, $79, $57, $9d, $50, $a3, $a4, $91, $a2, $a4, $99, $9e, $97, $50 +db $a4, $9f, $50, $97, $95, $a4, $50, $91, $50, $9c, $99, $a4, $a4, $9c, $95, $50 +db $a7, $9f, $a2, $a2, $99, $95, $94, $5e, $03, $00, $70, $79, $96, $50, $a9, $9f +db $a5, $50, $94, $9f, $9e, $57, $a4, $50, $9d, $99, $9e, $94, $5c, $50, $79, $57 +db $9d, $50, $93, $9f, $9d, $99, $9e, $97, $50, $a7, $99, $a4, $98, $50, $a9, $9f +db $a5, $51, $03, $00, $0A, $D4, $B0, $EE, $00, $1b, $03, $F7, $99, $EE, $00, $1f +db $1e, $50, $02, $06, $04, $80, $00, $02; Winters character slot + +ORG $D808FB +;db $82 Winters bed FIX THIS!!!!!! + +ORG $C7A1BA +db $02; Leaving Snow Wood hotspot. also free text? + +ORG $C6AE5C +db $0A, $A3, $AE, $C6 + +ORG $CFB1FC +db $49, $00, $02 + +ORG $C6AA30 +db $5D, $02 + +ORG $C6AD75 +db $0A, $BB, $A1, $C7 + +ORG $C7A1BB +db $70, $87, $95, $57, $a2, $95, $50, $9e, $9f, $a4, $50, $a3, $95, $9c, $9c, $99 +db $9e, $97, $50, $9d, $9f, $9e, $9b, $95, $a9, $a3, $50, $91, $9e, $a9, $9d, $9f +db $a2, $95, $5e, $03, $00, $70, $84, $98, $95, $50, $9c, $91, $a3, $a4, $50, $9f +db $9e, $95, $50, $a7, $95, $50, $98, $91, $94, $50, $a2, $91, $9e, $50, $91, $a7 +db $91, $a9, $50, $a4, $9f, $50, $a4, $98, $95, $50, $a3, $9f, $a5, $a4, $98, $5e +db $03, $00, $70, $71, $9c, $9c, $50, $79, $50, $98, $91, $a6, $95, $50, $99, $a3 +db $50, $a4, $98, $99, $a3, $50, $1c, $05, $68, $5e, $03, $00, $70, $79, $a4, $50 +db $93, $9f, $a3, $a4, $a3, $50, $91, $50, $92, $a5, $93, $9b, $5e, $03, $00, $70 +db $83, $a4, $99, $9c, $9c, $50, $a7, $91, $9e, $a4, $50, $99, $a4, $6f, $0a, $e8 +db $ad, $c6, $03 + +ORG $C6AE07 +db $0A, $4D, $A2, $C7 + +ORG $C7A24D +db $70, $7f, $9b, $91, $a9, $5c, $10, $0f, $50, $92, $a5, $a4, $50, $79, $50, $93 +db $91, $9e, $57, $a4, $50, $97, $a5, $a2, $91, $9e, $a4, $95, $95, $50, $99, $a4 +db $57, $9c, $9c, $50, $92, $95, $50, $98, $95, $a2, $95, $50, $96, $9f, $a2, $95 +db $a6, $95, $a2, $5e, $5e, $5e, $13, $02 + +ORG $C6AEC3 +db $0A, $D7, $AE, $C6 + +ORG $C6AE77 +db $70, $79, $a4, $57, $a3, $50, $9e, $9f, $a4, $50, $a3, $95, $9c, $9c, $99, $9e +db $97, $5c, $10, $0f, $50, $a3, $9f, $50, $a4, $98, $99, $a3, $50, $9f, $9e, $95 +db $57, $a3, $50, $96, $a2, $95, $95, $5e, $10, $00 + +ORG $CFB363 +db $00 + +ORG $C6B18D +db $06, $76, $02, $77, $b2, $c6, $00, $70, $7b, $99, $5d, $9b, $9b, $a9, $95, $5d +db $9b, $a9, $95, $5d, $9b, $a9, $95, $5d, $9b, $99, $99, $99, $5e, $03, $00, $70 +db $58, $79, $50, $94, $9f, $9e, $57, $a4, $50, $98, $91, $a6, $95, $50, $91, $9e +db $a9, $50, $16, $e6, $10, $05, $95, $10, $05, $95, $10, $05, $95, $a7, $15, $1b +db $97, $a5, $9d, $5e, $10, $10, $50, $73, $91, $9e, $50, $79, $50, $98, $91, $a6 +db $95, $50, $a3, $9f, $9d, $95, $50, $9f, $96, $50, $a9, $9f, $a5, $a2, $a3, $6f +db $59, $03, $00, $19, $02, $89, $95, $a3, $02, $19, $02, $7e, $9f, $02, $1c, $07 +db $02, $11, $09, $02, $2d, $b2, $c6, $00, $09, $b2, $c6, $00, $12, $70, $7b, $95 +db $95, $50, $9b, $95, $95, $5e, $03, $00, $70, $58, $89, $9f, $a5, $50, $9d, $91 +db $9b, $95, $50, $9d, $95, $50, $a3, $9f, $50, $a3, $91, $94, $51, $59, $13, $02 +db $1d, $05, $ff, $68, $1b, $02, $02, $b2, $c6, $00, $1d, $01, $ff, $68, $1f, $02 +db $76, $10, $10, $12, $70, $58, $84, $98, $95, $50, $9d, $9f, $9e, $9b, $95, $a9 +db $50, $a4, $9f, $9f, $9b, $50, $a4, $98, $95, $50, $95, $9e, $a4, $99, $a2, $95 +db $50, $a0, $91, $93, $9b, $50, $96, $a2, $9f, $9d, $19, $10, $01, $1b, $04, $50 +db $1c, $02, $00, $5e, $59, $03, $00, $04, $76, $02, $70, $7b, $99, $5d, $9b, $9b +db $a9, $95, $5d, $9b, $a9, $95, $5d, $9b, $a9, $95, $5d, $9b, $99, $99, $99, $5e +db $03, $00, $0a, $17, $bc, $c6; Bubble monkey gum check + +ORG $C6BC00 +db $0A, $8D, $B1, $C6 + +ORG $C99B52 +db $49 + +ORG $CFB262 +db $B2, $01, $02 + +ORG $CFB25D +db $b6 + +ORG $CFB284 +db $B2, $01, $02; Saturn in lab + +ORG $CF7459 +db $02, $00, $69, $02, $68, $98, $BB, $00 + +ORG $CFB275 +db $00 + +ORG $CFB27F +db $AB + +ORG $CFB282 +db $B2 + +ORG $CFB265 +db $99, $C0, $C6 + +ORG $CFB287 +db $35, $C0, $C6 + +ORG $CFB527 +db $8F, $00 + +ORG $CFB5D1 +db $64, $00 + +ORG $CFB53D +db $49, $00, $02 + +ORG $CFB5EA +db $14, $F6, $2F + +ORG $C6C7DA +db $49 + +ORG $2FF600 +db $05, $FE, $02, $06, $de, $03, $97, $F7, $2F, $00, $06, $b2, $01, $98, $f7, $2f +db $00, $02 + +ORG $CF1111 +db $00, $F6, $2F + +ORG $C6C7E7 +db $70, $7d, $a9, $50, $9d, $91, $a3, $a4, $95, $a2, $5c, $10, $0f, $50, $71, $a0 +db $a0, $9c, $95, $50, $7b, $99, $94, $5c, $10, $0f, $50, $98, $91, $a3, $50, $93 +db $9f, $9d, $a0, $9c, $95, $a4, $95, $94, $50, $98, $99, $a3, $50, $a5, $9c, $a4 +db $99, $9d, $91, $a4, $95, $50, $99, $9e, $a6, $95, $9e, $a4, $99, $9f, $9e, $5e +db $03, $00, $70, $84, $98, $91, $a4, $57, $a3, $50, $a2, $99, $97, $98, $a4, $5e +db $10, $10, $50, $84, $98, $95, $50, $1c, $05, $e0, $5e, $03, $00, $70, $79, $50 +db $91, $93, $a4, $a5, $91, $9c, $9c, $a9, $50, $93, $9f, $9e, $a4, $a2, $99, $92 +db $a5, $a4, $95, $94, $50, $91, $9e, $50, $99, $9e, $a6, $91, $9c, $a5, $91, $92 +db $9c, $95, $50, $91, $9d, $9f, $a5, $9e, $a4, $50, $a4, $9f, $50, $a4, $98, $95 +db $50, $a0, $a2, $9f, $9a, $95, $93, $a4, $5e, $5e, $5e, $03, $0a, $0c, $bf, $c6 + +ORG $C6BF0C +db $00, $70, $71, $96, $a4, $95, $a2, $50, $a4, $98, $91, $a4, $5c, $10, $0f, $50 +db $98, $95, $50, $a3, $91, $99, $94, $50, $98, $95, $50, $a7, $91, $a3, $50, $98 +db $95, $91, $94, $99, $9e, $97, $50, $98, $9f, $9d, $95, $50, $a4, $9f, $50, $84 +db $a7, $9f, $a3, $9f, $9e, $5e, $03, $00, $70, $79, $50, $92, $95, $9c, $99, $95 +db $a6, $95, $50, $98, $95, $50, $a7, $91, $9e, $a4, $95, $94, $50, $a9, $9f, $a5 +db $50, $a4, $9f, $50, $98, $91, $a6, $95, $50, $98, $99, $a3, $50, $99, $9e, $a6 +db $95, $9e, $a4, $99, $9f, $9e, $5e, $03, $0a, $8c, $c8, $c6; Apple kid mouse text + +ORG $C6C099 +db $0A, $50, $F9, $2F + +ORG $2FF950 +db $06, $dd, $03, $35, $fb, $2f, $00, $70, $19, $10, $01, $1b, $04, $1c, $02, $00 +db $5c, $10, $0f, $50, $92, $a5, $94, $94, $a9, $51, $10, $10, $50, $89, $9f, $a5 +db $50, $a3, $91, $a6, $95, $94, $50, $a5, $a3, $51, $03, $00, $70, $79, $50, $a7 +db $91, $a3, $50, $a3, $a4, $a5, $94, $a9, $99, $9e, $97, $5c, $10, $0f, $50, $a7 +db $98, $95, $9e, $50, $79, $50, $98, $95, $91, $a2, $94, $50, $a4, $98, $99, $a3 +db $50, $a7, $95, $99, $a2, $94, $50, $9e, $9f, $99, $a3, $95, $50, $9f, $a5, $a4 +db $a3, $99, $94, $95, $5e, $5e, $5e, $03, $00, $70, $79, $50, $a7, $95, $9e, $a4 +db $50, $a4, $9f, $50, $93, $98, $95, $93, $9b, $50, $99, $a4, $50, $9f, $a5, $a4 +db $5c, $10, $0f, $50, $91, $9e, $94, $50, $a4, $98, $95, $9e, $50, $79, $50, $a7 +db $9f, $a5, $9e, $94, $50, $a5, $a0, $50, $98, $95, $a2, $95, $5e, $03, $00, $70 +db $78, $9d, $6f, $10, $15, $50, $89, $9f, $a5, $57, $a2, $95, $50, $98, $95, $a2 +db $95, $50, $96, $9f, $a2, $50, $a4, $98, $95, $50, $1c, $05, $e0, $6f, $03, $00 +db $70, $7f, $98, $51, $50, $79, $50, $9d, $a5, $a3, $a4, $50, $98, $91, $a6, $95 +db $50, $a4, $91, $9b, $95, $9e, $50, $99, $a4, $50, $a7, $99, $a4, $98, $50, $9d +db $95, $5e, $03, $00, $70, $79, $50, $94, $9f, $9e, $57, $a4, $50, $9e, $95, $95 +db $94, $50, $99, $a4, $50, $91, $9e, $a9, $9d, $9f, $a2, $95, $5c, $50, $a4, $98 +db $9f, $a5, $97, $98, $5c, $10, $0f, $50, $a3, $9f, $50, $a9, $9f, $a5, $50, $93 +db $91, $9e, $50, $98, $91, $a6, $95, $50, $99, $a4, $5e, $03, $00, $70, $1d, $19 +db $00, $1d, $00, $ff, $ad, $1b, $02, $95, $fa, $2f, $00, $1f, $02, $74, $10, $10 +db $1c, $02, $fe, $50, $97, $9f, $a4, $50, $a4, $98, $95, $50, $1c, $05, $e0, $51 +db $04, $dd, $03, $13, $02, $7f, $98, $5e, $5e, $5e, $10, $10, $50, $89, $9f, $a5 +db $50, $94, $9f, $9e, $57, $a4, $50, $98, $91, $a6, $95, $50, $95, $9e, $9f, $a5 +db $97, $98, $50, $a2, $9f, $9f, $9d, $50, $96, $9f, $a2, $50, $99, $a4, $5e, $03 +db $00, $70, $87, $95, $9c, $9c, $5c, $10, $0f, $50, $79, $57, $9c, $9c, $50, $98 +db $91, $9e, $97, $50, $9f, $9e, $50, $a4, $9f, $50, $99, $a4, $50, $96, $9f, $a2 +db $50, $9e, $9f, $a7, $5e, $03, $00, $70, $79, $96, $50, $a9, $9f, $a5, $50, $a7 +db $91, $9e, $a4, $50, $a4, $9f, $50, $9d, $95, $95, $a4, $50, $a5, $a0, $50, $a7 +db $99, $a4, $98, $50, $9d, $95, $50, $9c, $91, $a4, $95, $a2, $5c, $50, $10, $0f +db $50, $79, $57, $9c, $9c, $50, $92, $95, $50, $91, $a2, $9f, $a5, $9e, $94, $50 +db $74, $a2, $5e, $50, $71, $9e, $94, $9f, $9e, $a5, $a4, $a3, $57, $a3, $50, $9c +db $91, $92, $5e, $13, $02, $70, $79, $57, $a6, $95, $50, $92, $95, $95, $9e, $50 +db $a4, $98, $99, $9e, $9b, $99, $9e, $97, $50, $91, $92, $9f, $a5, $a4, $50, $6C +db $71, $a2, $93, $98, $99, $a0, $95, $9c, $91, $97, $9f, $6E, $50, $9c, $91, $a4 +db $95, $9c, $a9, $5e, $13, $02; Stonehenge item + +ORG $CFB5E7 +db $49, $00, $02 + +ORG $CFB5E2 +db $8F + +ORG $CF0EC6 +db $86, $f7, $2f + +ORG $CF111C +db $86, $F7, $2F + +ORG $2FF786 +db $02, $de, $03, $97, $f7, $2f, $00, $06, $b2, $01, $98, $f7, $2f, $00, $04, $d8 +db $02, $02, $05, $d8, $02, $02 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $CF5B2B +db $2F; Everdred music + +ORG $CF1678 +db $00, $00, $00, $00, $00, $00; Dept. Store entrance + +ORG $D4E300 +db $1F, $1F, $20, $3F, $5F, $40, $5F, $40, $5F, $50, $5F, $41, $5E, $43, $5D, $47 +db $1F, $1F, $3F, $3F, $60, $60, $7F, $7F, $7F, $7F, $7F, $7F, $7F, $7E, $7F, $7D +db $FC, $FC, $06, $FE, $EA, $0E, $FA, $0E, $FA, $2E, $FA, $8E, $FA, $8E, $FA, $0E +db $FC, $FC, $FE, $FE, $1E, $1E, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE +db $58, $4F, $5C, $47, $5E, $43, $5D, $47, $5F, $56, $5F, $40, $7F, $7F, $00, $00 +db $7F, $78, $7F, $7C, $7F, $7E, $7F, $7D, $7F, $7F, $7F, $7F, $7F, $7F, $00, $00 +db $FA, $8E, $7A, $CE, $FA, $8E, $FA, $0E, $FA, $2E, $FA, $0E, $FC, $FC, $00, $00 +db $FE, $FE, $FE, $7E, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FC, $FC, $00, $00 +db $1F, $1F, $20, $3F, $5F, $40, $5F, $40, $5F, $50, $5F, $41, $5E, $43, $5D, $47 +db $1F, $1F, $3F, $3F, $60, $60, $7F, $7F, $7F, $7F, $7F, $7F, $7F, $7E, $7F, $7D +db $FC, $FC, $06, $FE, $EA, $0E, $FA, $0E, $FA, $2E, $FA, $8E, $FA, $8E, $FA, $0E +db $FC, $FC, $FE, $FE, $1E, $1E, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE +db $58, $4F, $5C, $47, $5E, $43, $5D, $47, $5F, $56, $5F, $40, $7F, $7F, $00, $00 +db $7F, $78, $7F, $7C, $7F, $7E, $7F, $7D, $7F, $7F, $7F, $7F, $7F, $7F, $00, $00 +db $FA, $8E, $7A, $CE, $FA, $8E, $FA, $0E, $FA, $2E, $FA, $0E, $FC, $FC, $00, $00 +db $FE, $FE, $FE, $7E, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FC, $FC, $00, $00 + +ORG $D49760 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $3f, $3f, $7f, $7f +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $3f, $00, $7f +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $fc, $fc, $f8, $f8 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $fc, $00, $f8 + +ORG $6F3F1A +db $0E + +ORG $6F4091 +db $0E + +ORG $CF7F39 +db $6C, $68 + +ORG $C4FDA8 +db $06, $00, $a9, $03, $70, $88, $aa, $03, $70, $a0, $98, $03, $80, $f8, $BE, $02 +db $6c, $68, $bf, $02, $7A, $68, $A3, $03, $98, $88; Electric box stuff + +ORG $CF688D +db $05, $00 + +ORG $CFB834 +db $03, $6E, $01 + +ORG $CFB83C +db $00, $10, $97, $EE + +ORG $08957A +db $02 + +ORG $CFB829 +db $00, $00, $00 + +ORG $08958D +db $06, $39, $01, $d5, $95, $08, $00, $1f, $07, $02, $10, $0a, $1f, $01, $00, $1f +db $e1, $1f, $00, $01, $10, $14, $1f, $e1, $14, $01, $01, $10, $14, $1f, $e1, $1f +db $00, $01, $10, $01, $1f, $e1, $14, $01, $01, $10, $01, $1f, $e1, $1f, $00, $01 +db $10, $20, $04, $39, $00, $04, $39, $01, $04, $2b, $02, $1f, $1e, $98, $03, $06 +db $1f, $1e, $a3, $03, $06, $1f, $03, $02, $1f, $07, $02, $10, $0a, $1f, $01, $00 +db $1f, $e1, $14, $01, $01, $10, $14, $1f, $e1, $1f, $00, $01, $10, $14, $1f, $e1 +db $14, $01, $01, $10, $01, $1f, $e1, $1f, $00, $01, $10, $01, $1f, $e1, $14, $01 +db $01, $10, $20, $05, $39, $00, $05, $39, $01, $05, $2b, $02, $1f, $03, $02, $95; Electric box event + +ORG $EE9710 +db $06, $8B, $00, $4d, $98, $EE, $00, $0e, $01, $0d, $01, $1d, $19, $00, $1b, $03 +db $35, $97, $EE, $00, $19, $10, $00, $0b, $03, $1b, $03, $79, $97, $EE, $00, $0f +db $0a, $19, $97, $EE, $00, $70, $58, $79, $a4, $57, $a3, $50, $91, $9e, $50, $95 +db $9c, $95, $93, $a4, $a2, $99, $93, $91, $9c, $50, $92, $9f, $a8, $5e, $10, $10 +db $50, $79, $a4, $50, $a7, $9f, $a5, $9c, $94, $50, $a4, $91, $9b, $95, $50, $91 +db $50, $97, $95, $9e, $99, $a5, $a3, $50, $a4, $9f, $50, $9f, $a0, $95, $a2, $91 +db $a4, $95, $50, $99, $a4, $5e, $59, $13, $02, $0e, $03, $08, $7f, $dc, $c7, $00 +db $1b, $03, $35, $97, $EE, $00, $70, $58, $1c, $02, $03, $50, $9f, $a0, $95, $9e +db $95, $94, $50, $a4, $98, $95, $50, $95, $9c, $95, $93, $a4, $a2, $99, $93, $91 +db $9c, $50, $92, $9f, $a8, $5e, $1f, $02, $75, $10, $15, $00, $70, $84, $98, $95 +db $a2, $95, $57, $a3, $50, $91, $9e, $50, $99, $9d, $a0, $9f, $a2, $a4, $91, $9e +db $a4, $5d, $9c, $9f, $9f, $9b, $99, $9e, $97, $50, $a3, $a7, $99, $a4, $93, $98 +db $50, $98, $95, $a2, $95, $5e, $10, $10, $50, $80, $a5, $9c, $9c, $50, $99, $a4 +db $6f, $00, $19, $02, $89, $95, $a3, $02, $19, $02, $7e, $9f, $02, $1c, $07, $02 +db $11, $09, $02, $20, $98, $EE, $00, $fb, $97, $EE, $00, $12, $70, $19, $10, $01 +db $1b, $04, $1c, $02, $00, $50, $94, $99, $94, $50, $9e, $9f, $a4, $50, $a0, $a5 +db $9c, $9c, $50, $a4, $98, $95, $50, $a3, $a7, $99, $a4, $93, $98, $5e, $13, $02 +db $12, $70, $19, $10, $01, $1b, $04, $1c, $02, $00, $50, $a0, $a5, $9c, $9c, $95 +db $94, $50, $a4, $98, $95, $50, $a3, $a7, $99, $a4, $93, $98, $5e, $1f, $02, $77 +db $10, $15, $1f, $02, $75, $10, $20, $18, $04, $0a, $8d, $95, $08, $70, $58, $84 +db $98, $95, $50, $95, $9c, $95, $93, $a4, $a2, $99, $93, $91, $9c, $50, $92, $9f +db $a8, $50, $99, $a3, $50, $9c, $9f, $93, $9b, $95, $94, $5e, $5e, $5e, $59, $13 +db $02; Electric box text + +ORG $CFB824 +db $5F, $01 + +ORG $C8972A +db $70, $58, $79, $50, $98, $95, $91, $a2, $94, $50, $a4, $98, $91, $a4, $50, $91 +db $50, $a3, $93, $91, $a2, $a9, $50, $9d, $9f, $9e, $a3, $a4, $95, $a2, $50, $9c +db $99, $a6, $95, $a3, $50, $9f, $9e, $50, $a4, $98, $95, $50, $a4, $9f, $a0, $50 +db $96, $9c, $9f, $9f, $a2, $5e, $03, $00, $70, $84, $98, $95, $a9, $50, $a3, $91 +db $a9, $50, $99, $a4, $50, $9f, $9e, $9c, $a9, $50, $93, $9f, $9d, $95, $a3, $50 +db $9f, $a5, $a4, $50, $a7, $98, $95, $9e, $50, $a4, $98, $95, $50, $9c, $99, $97 +db $98, $a4, $a3, $50, $91, $a2, $95, $50, $a4, $a5, $a2, $9e, $95, $94, $50, $9f +db $96, $96, $5e, $5e, $5e, $03, $00, $70, $79, $50, $92, $95, $a4, $50, $98, $95 +db $50, $98, $91, $a3, $50, $a3, $9f, $9d, $95, $50, $97, $9f, $9f, $94, $50, $a4 +db $a2, $95, $91, $a3, $a5, $a2, $95, $5e, $5e, $5e, $50, $10, $10, $50, $79, $50 +db $97, $a5, $95, $a3, $a3, $50, $99, $a4, $57, $a3, $50, $91, $50, $9d, $9f, $a5 +db $a3, $95, $57, $a3, $50, $a3, $99, $a8, $a4, $98, $50, $a3, $95, $9e, $a3, $95 +db $5e, $59, $13, $02; Mouse hint + +ORG $C82CFC +db $0A, $F9, $99, $EE + +ORG $EE99F9 +db $70, $5e, $5e, $5e, $79, $96, $50, $a9, $9f, $a5, $57, $a2, $95, $50, $98, $95 +db $a2, $95, $50, $96, $9f, $a2, $50, $91, $50, $a4, $a2, $95, $91, $a3, $a5, $a2 +db $95, $5c, $50, $a4, $98, $95, $a2, $95, $57, $a3, $50, $9e, $9f, $9e, $95, $50 +db $a4, $9f, $50, $92, $95, $50, $96, $9f, $a5, $9e, $94, $5e, $5e, $5e, $03, $00 +db $70, $7d, $a9, $50, $a0, $9f, $a7, $95, $a2, $50, $99, $a3, $50, $91, $50, $93 +db $a5, $a2, $a3, $95, $5e, $5e, $5e, $03, $00, $70, $71, $9e, $94, $50, $79, $50 +db $92, $95, $a3, $a4, $9f, $a7, $50, $a4, $98, $91, $a4, $50, $93, $a5, $a2, $a3 +db $95, $50, $9f, $9e, $a4, $9f, $50, $a9, $9f, $a5, $51, $03, $00, $70, $77, $a7 +db $91, $91, $91, $91, $91, $a2, $a2, $a2, $a2, $97, $98, $51, $51, $03, $18, $04 +db $10, $30, $08, $40, $92, $fe, $00, $0a, $50, $2d, $c8; Dept store spook + +ORG $CFC51C +db $91, $00, $02 + +ORG $C86DFE +db $14, $6E, $C8 + +ORG $CF1B8F +db $AE, $9B, $EE + +ORG $EE9BAE +db $08, $82, $90, $c6, $00, $19, $10, $01, $1b, $04, $70, $6f, $10, $1e, $6f, $10 +db $1e, $6f, $10, $13, $1f, $21, $9c, $19, $26, $00, $02; Moonside warp + +ORG $CFE6E9 +db $4B, $00, $01 + +ORG $C9A08E +db $0A, $93, $A0, $C9 + +ORG $CFC9CE +db $40, $00 + +ORG $C7B550 +db $0A, $DC, $B6, $C7 + +ORG $C7B709 +db $0A + +ORG $C7A9B6 +db $70, $89, $9f, $a5, $57, $a2, $95, $50, $75, $94, $a5, $91, $a2, $94, $9f, $5c +db $10, $0f, $50, $a2, $99, $97, $98, $a4, $6f, $03, $00, $70, $79, $5c, $10, $0f +db $50, $a5, $98, $5c, $10, $0f, $50, $98, $91, $a6, $95, $50, $91, $50, $a0, $91 +db $93, $9b, $91, $97, $95, $50, $96, $9f, $a2, $50, $a9, $9f, $a5, $5e, $5e, $5e +db $10, $10, $50, $79, $a4, $57, $a3, $50, $a4, $98, $95, $50, $1c, $05, $ac, $50 +db $a9, $9f, $a5, $50, $9f, $a2, $94, $95, $a2, $95, $94, $5c, $10, $0f, $50, $a2 +db $99, $97, $98, $a4, $6f, $03, $00, $70, $83, $a0, $95, $93, $99, $91, $9c, $50 +db $94, $95, $9c, $99, $a6, $95, $a2, $a9, $5c, $10, $0f, $50, $9f, $a2, $50, $a3 +db $9f, $9d, $95, $a4, $98, $99, $9e, $97, $5e, $10, $10, $50, $7e, $9f, $6f, $10 +db $10, $50, $87, $95, $9c, $9c, $5c, $10, $10, $50, $a5, $98, $5e, $5e, $5e, $03 +db $00, $70, $83, $99, $9e, $93, $95, $50, $79, $57, $9d, $50, $91, $9c, $a2, $95 +db $91, $94, $a9, $50, $98, $95, $a2, $95, $5c, $10, $0f, $50, $9c, $95, $a4, $57 +db $a3, $50, $9a, $a5, $a3, $a4, $50, $a3, $91, $a9, $50, $99, $a4, $50, $99, $a3 +db $50, $a9, $9f, $a5, $5e, $03, $00, $70, $71, $98, $95, $9d, $5e, $5e, $5e, $10 +db $10, $50, $78, $95, $a2, $95, $57, $a3, $50, $a9, $9f, $a5, $a2, $50, $a0, $91 +db $93, $9b, $91, $97, $95, $5c, $50, $6C, $75, $94, $a5, $91, $a2, $94, $9f, $5e +db $6E, $03, $1d, $00, $ff, $ac, $1b, $02, $e2, $aa, $c7, $00, $1f, $02, $74, $00 +db $10, $30, $70, $58, $1c, $02, $fe, $50, $97, $9f, $a4, $50, $a4, $98, $95, $50 +db $1c, $05, $ac, $5e, $59, $13, $18, $04, $0a, $0F, $b7, $c7, $00, $70, $7f, $98 +db $5c, $10, $0f, $50, $a9, $9f, $a5, $50, $94, $9f, $9e, $57, $a4, $50, $98, $91 +db $a6, $95, $50, $91, $9e, $a9, $50, $a2, $9f, $9f, $9d, $50, $a4, $9f, $50, $93 +db $91, $a2, $a2, $a9, $50, $99, $a4, $5e, $10, $10, $50, $87, $95, $9c, $9c, $5c +db $10, $0f, $50, $79, $57, $9d, $50, $9e, $9f, $a4, $50, $a4, $91, $9b, $99, $9e +db $97, $50, $a4, $98, $99, $a3, $50, $a4, $98, $99, $9e, $97, $50, $92, $91, $93 +db $9b, $5e, $03, $0a, $E7, $B1, $EE; Moonside item NPC + +ORG $C7B719 +db $05, $4F, $02, $02 + +ORG $C7B716 +db $04, $DF, $03 + +ORG $EEB1E7 +db $01 +db $70, $79, $57, $9c, $9c, $50, $a7, $91, $99, $a4, $50, $a5, $9e, $a4, $99, $9c +db $50, $a9, $9f, $a5, $50, $93, $91, $9e, $50, $a4, $91, $9b, $95, $50, $99, $a4 +db $5e, $10, $10, $50, $89, $95, $91, $98, $5e, $03, $18, $04, $1f, $f2, $40, $00 +db $7c, $02, $1f, $61, $04, $50, $02, $05, $4f, $02, $1f, $1f, $40, $00, $06, $1f +db $17, $c8, $03, $5e, $02, $06, $02 + +ORG $C374DD +db $2E + +ORG $C374C4 +db $07 + +ORG $C7B576 +db $1d, $00, $ff, $ac, $1b, $02, $df, $b5, $c7, $00, $70, $78, $95, $a2, $95, $57 +db $a3, $50, $a9, $9f, $a5, $a2, $50, $a0, $91, $93, $9b, $91, $97, $95, $5e, $00 +db $1f, $02, $74, $10, $20, $70, $58, $1c, $02, $ff, $50, $97, $9f, $a4, $50, $a4 +db $98, $95, $50, $1c, $05, $ac, $51, $59, $03, $00, $70, $7d, $a9, $50, $9a, $9f +db $92, $50, $99, $a3, $50, $94, $9f, $9e, $95, $5e, $10, $10, $50, $79, $57, $9d +db $50, $9f, $a5, $a4, $a4, $91, $50, $98, $95, $a2, $95, $51, $13, $05, $50, $02 +db $04, $df, $03, $18, $04, $0a, $0F, $b7, $c7, $70, $89, $9f, $a5, $50, $83, $84 +db $79, $7c, $7c, $50, $94, $9f, $9e, $57, $a4, $50, $98, $91, $a6, $95, $50, $95 +db $9e, $9f, $a5, $97, $98, $50, $a2, $9f, $9f, $9d, $5e, $10, $10, $50, $79, $50 +db $97, $a5, $95, $a3, $a3, $50, $a9, $9f, $a5, $50, $9d, $a5, $a3, $a4, $50, $9e +db $9f, $a4, $50, $a7, $91, $9e, $a4, $50, $a4, $98, $99, $a3, $50, $a0, $91, $93 +db $9b, $91, $97, $95, $5e, $5e, $5e, $13, $02; Moonside item failure text + +ORG $CFC9D1 +db $5E, $02 + +ORG $CFC9C2 +db $49, $00 + +ORG $C292AB +NOP +NOP + +ORG $C7B70E +db $02, $1f, $f2, $40, $00, $7f, $02, $1f, $61, $04, $df, $03, $05, $4f, $02, $02 + +ORG $D5E11D +db $00 + +ORG $CFC43F +db $49, $00 + +ORG $CFC450 +db $49, $00 + +ORG $CFC461 +db $49, $00 + +ORG $CFC472 +db $49, $00 + +ORG $CFC483 +db $49, $00 + +ORG $CF60C1 +db $68 + +ORG $CFC373 +db $49, $00, $02 + +ORG $CFC397 +db $00 + +ORG $C6EF20 +db $0A, $6F, $EE, $C6 + +ORG $C6EE6F +db $00, $08, $8a, $85, $c8, $00, $1b, $03, $83, $ee, $c6, $00, $04, $98, $02, $1f +db $1e, $69, $03, $06, $02; Paula in Fourside + +ORG $CFC384 +db $98, $02 + +ORG $CFC3D9 +db $49, $00 + +ORG $CFC3C8 +db $49, $00 + +ORG $CF1897 +db $49 + +ORG $CF188D +db $00 + +ORG $C6EA3C +db $E5, $02 + +ORG $C6EA72 +db $70, $83, $9f, $50, $9d, $a5, $93, $98, $50, $9d, $99, $a3, $96, $9f, $a2, $a4 +db $a5, $9e, $95, $50, $98, $91, $a3, $50, $92, $95, $96, $91, $9c, $9c, $95, $9e +db $50, $9d, $95, $50, $a3, $99, $9e, $93, $95, $50, $79, $50, $a4, $9f, $9f, $9b +db $50, $a4, $98, $95, $50, $1c, $05, $32, $5e, $03, $00, $70, $79, $50, $94, $9f +db $9e, $57, $a4, $50, $a7, $91, $9e, $a4, $50, $99, $a4, $50, $91, $9e, $a9, $9d +db $9f, $a2, $95, $5e, $10, $10, $50, $79, $57, $9d, $50, $a2, $95, $91, $9c, $9c +db $a9, $50, $9a, $a5, $a3, $a4, $50, $91, $50, $a2, $95, $97, $a5, $9c, $91, $a2 +db $50, $9f, $9c, $94, $50, $9d, $91, $9e, $5e, $5e, $5e, $03, $00, $70, $80, $9c +db $95, $91, $a3, $95, $5c, $10, $0f, $50, $a4, $91, $9b, $95, $50, $a4, $98, $99 +db $a3, $50, $91, $a3, $50, $91, $9e, $50, $91, $a0, $9f, $9c, $9f, $97, $a9, $50 +db $96, $9f, $a2, $50, $91, $9e, $a9, $50, $a4, $a2, $9f, $a5, $92, $9c, $95, $50 +db $79, $57, $a6, $95, $50, $93, $91, $a5, $a3, $95, $94, $5e, $03, $00, $1d, $00 +db $ff, $32, $1b, $02, $59, $eb, $c6, $00, $1f, $02, $74, $10, $20, $70, $58, $1b +db $04, $1c, $02, $00, $50, $97, $9f, $a4, $50, $a4, $98, $95, $50, $1c, $05, $32 +db $5e, $59, $04, $e5, $02, $13, $02, $70, $7d, $91, $a9, $92, $95, $50, $9e, $9f +db $a4, $5e, $10, $10, $50, $79, $57, $9c, $9c, $50, $98, $9f, $9c, $94, $50, $9f +db $9e, $a4, $9f, $50, $99, $a4, $50, $a5, $9e, $a4, $99, $9c, $50, $a9, $9f, $a5 +db $50, $98, $91, $a6, $95, $50, $a2, $9f, $9f, $9d, $50, $96, $9f, $a2, $50, $99 +db $a4, $5e, $5e, $5e, $13, $02; Monotoli item + +ORG $C6EE2F +db $74, $9f, $50, $79, $50, $9c, $9f, $9f, $9b, $50, $97, $9f, $9f, $94, $50, $99 +db $9e, $50, $a4, $98, $99, $a3, $50, $98, $91, $a4, $6f, $13, $02 + +ORG $C6D3A2 +db $C1, $D3, $C6 + +ORG $C6D3C0 +db $12 + +ORG $C88BEC +db $70, $87, $95, $57, $a2, $95, $50, $98, $95, $91, $94, $95, $94, $50, $a4, $9f +db $50, $84, $98, $a2, $95, $95, $94, $5e, $50, $76, $95, $95, $9c, $50, $96, $a2 +db $95, $95, $50, $a4, $9f, $50, $a4, $91, $97, $50, $91, $9c, $9f, $9e, $97, $51 +db $0a, $21, $8c, $c8; Runaway five text 2 + +ORG $C88C40 +db $70, $84, $98, $91, $a4, $50, $9c, $91, $94, $a9, $50, $99, $9e, $50, $a4, $98 +db $95, $50, $9c, $9f, $92, $92, $a9, $5e, $5e, $5e, $10, $10, $50, $9e, $9f, $a7 +db $50, $a3, $98, $95, $50, $9c, $9f, $9f, $9b, $a3, $50, $9c, $99, $9b, $95, $50 +db $91, $50, $a3, $a4, $91, $a2, $51, $03, $18, $04, $1f, $ea, $b9, $00, $15, $73 +db $16, $4e, $50, $1f, $61, $1f, $f2, $ba, $00, $d9, $01, $16, $4e, $1f, $f2, $bb +db $00, $d9, $01, $15, $73, $50, $1f, $61, $10, $e0, $04, $3d, $01, $05, $18, $02 +db $1f, $03, $04, $93, $00, $02; Rest of the runaway 5 cutscene + +ORG $CF674B +db $06, $00 + +ORG $C4FDC2 +db $03, $00, $54, $03, $88, $b0, $53, $03, $90, $98, $48, $03, $40, $D0; Venus outside door + +ORG $CFC14E +db $A5, $00, $03, $5E, $02 + +ORG $CF663D +db $07 + +ORG $C4FDD0 +db $02, $00, $e2, $03, $ff, $ff, $c0, $03, $e0, $e0 + +ORG $CF17D8 +db $00, $00, $00 + +ORG $CF776D +db $02, $00, $b7, $03, $70, $c0, $d8, $03, $78, $48 + +ORG $C88CA6 +db $04, $0b, $00, $1f, $41, $05, $04, $47, $00, $03, $00, $18, $04, $0a, $0a, $9c +db $c8 + +ORG $C89C06 +db $0A, $A6, $8C, $C8 + +ORG $C89C96 +db $0A, $B7, $8C, $C8 + +ORG $C88CB7 +db $07, $76, $01, $1b, $03, $c3, $8c, $c8, $00, $05, $47, $00, $1f, $15, $f3, $00 +db $c9, $00, $ff, $0a, $9d, $9c, $c8;Runaway five day bus + +ORG $C89CE6 +db $CF, $8C, $C8 + +ORG $C88CCF +db $06, $47, $00, $0a, $9d, $c8, $00, $0a, $c8, $9c, $c7 + +ORG $C89D96 +db $18, $04, $02 + +ORG $C99D48 +db $3B, $9D, $C9;Disable venus theater + +ORG $C99D4C +db $0A, $38, $92, $C8;Runaway five theater text + +ORG $C89238 +db $18, $01, $01, $70, $58, $71, $50, $93, $a2, $9f, $a7, $94, $50, $9f, $96, $50 +db $9e, $9f, $99, $a3, $a9, $50, $96, $91, $9e, $a3, $50, $a0, $a2, $95, $a6, $95 +db $9e, $a4, $a3, $50, $a4, $98, $95, $50, $94, $9f, $9f, $a2, $50, $96, $a2, $9f +db $9d, $50, $9f, $a0, $95, $9e, $99, $9e, $97, $5e, $59, $13, $18, $04, $02; Runaway five theater text + +ORG $CF19EC +db $D6, $00 + +ORG $C6D5AE +db $70, $84, $98, $91, $9e, $9b, $a3, $50, $96, $9f, $a2, $50, $9b, $99, $93, $9b +db $99, $9e, $97, $50, $a4, $98, $9f, $a3, $95, $50, $93, $98, $a5, $9d, $a0, $a3 +db $5e, $10, $0f, $5e, $10, $0f, $5e, $10, $0f, $50, $79, $50, $9d, $95, $91, $9e +db $5c, $10, $10, $50, $a4, $98, $95, $50, $82, $a5, $9e, $91, $a7, $91, $a9, $50 +db $76, $99, $a6, $95, $50, $9f, $a5, $a4, $a4, $91, $50, $98, $95, $a2, $95, $5e +db $03, $00, $70, $7e, $9f, $a7, $50, $79, $57, $9d, $50, $96, $a2, $95, $95, $50 +db $a4, $9f, $50, $a3, $a4, $91, $a2, $a4, $50, $9d, $a9, $50, $a3, $9f, $9c, $9f +db $50, $93, $91, $a2, $95, $95, $a2, $5e, $10, $14, $50, $87, $98, $a9, $50, $94 +db $9f, $9e, $57, $a4, $50, $a9, $9f, $a5, $50, $a4, $91, $9b, $95, $50, $a4, $98 +db $99, $a3, $50, $1c, $05, $11, $50, $91, $a3, $50, $91, $50, $97, $99, $96, $a4 +db $6f, $03, $01, $70, $79, $a4, $57, $a3, $50, $a3, $99, $97, $9e, $95, $94, $5c +db $10, $0f, $50, $95, $a6, $95, $9e, $5e, $03, $1d, $00, $ff, $03, $0a, $77, $92 +db $c8 + +ORG $C89277 +db $1b, $03, $c2, $92, $c8, $00, $01, $70, $84, $9f, $9f, $50, $92, $91, $94, $5e +db $10, $0f, $50, $a9, $9f, $a5, $57, $a2, $95, $50, $93, $91, $a2, $a2, $a9, $99 +db $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $50, $9a, $a5, $9e, $9b +db $5e, $10, $0f, $50, $77, $95, $a4, $50, $a2, $99, $94, $50, $9f, $96, $50, $a3 +db $9f, $9d, $95, $a4, $98, $99, $9e, $97, $51, $13, $02, $00, $1f, $02, $74, $10 +db $20, $70, $58, $1b, $04, $1c, $02, $00, $50, $97, $9f, $a4, $50, $a4, $98, $95 +db $50, $1c, $05, $11, $5e, $59, $03, $04, $8c, $00, $05, $93, $00, $70, $87, $95 +db $9c, $9c, $5c, $10, $0a, $50, $79, $57, $9d, $50, $9f, $9e, $5e, $10, $10, $50 +db $83, $95, $95, $50, $a9, $9f, $a5, $50, $91, $a2, $9f, $a5, $9e, $94, $51, $03 +db $18, $04, $1f, $16, $48, $03, $01, $1f, $02, $08, $10, $0a, $1f, $1e, $48, $03 +db $01, $1f, $02, $09, $02; Venus text + +ORG $CFC153 +db $93, $00, $02 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $EF95E9 +db $83, $9f, $9d, $95, $92, $9f, $94, $a9, $50, $9c, $95, $96, $a4, $50, $a4, $98 +db $99, $a3, $50, $1c, $05, $11, $50, $99, $9e, $50, $98, $95, $a2, $95, $5e, $10 +db $0f, $50, $7d, $91, $a9, $92, $95, $50, $99, $a4, $50, $a7, $99, $9c, $9c, $50 +db $98, $95, $9c, $a0, $50, $a9, $9f, $a5, $5e, $03, $0a, $58, $96, $ef + +ORG $EF969D +db $0A, $1C, $93, $C8 + +ORG $C8931C +db $95, $50, $a9, $9f, $a5, $50, $96, $99, $9e, $94, $50, $a4, $98, $95, $50, $9b +db $95, $a9, $5e, $03, $0a, $ae, $96, $ef + +ORG $EF96CC +db $02; Paula text script + +ORG $EF952F +db $EC, $03, $29, $96, $C7 + +ORG $C7961A +db $0A, $08, $AF, $EE, $00, $18, $01, $01, $06, $56, $00 +dd CabinPostItemRescue +db $70 +db $72, $a9, $50, $a4, $98, $95, $50, $a7, $91, $a9, $5c, $10, $0a, $50, $79, $50 +db $96, $9f, $a5, $9e, $94, $50, $a4, $98, $99, $a3, $1c, $05, $11, $50, $98, $95 +db $a2, $95, $5e, $10, $0f, $0A, $34, $AF, $EE, $34, $AF, $EE, $1b, $02, $34, $93 +db $c8, $00, $10, $0f, $50, $79, $57, $94, $50, $9c, $99, $9b, $0A +dl CabinTextFixNew + +ORG $C796BB +db $02; End Paula + +ORG $CF09E7 +db $49; Always enable happy-happy building + +ORG $C98A64 +db $0A, $34, $93, $C8 + +ORG $C89334 +db $06, $e0, $03, $44, $93, $c8, $ff, $16, $1a, $a2, $15, $94, $0a, $69, $8a, $c9 +db $70, $84, $98, $91, $9e, $9b, $50, $a9, $9f, $a5, $50, $96, $9f, $a2, $50, $a9 +db $9f, $a5, $a2, $50, $97, $95, $9e, $95, $a2, $9f, $a3, $99, $a4, $a9, $5e, $13 +db $02, $04, $e0, $03, $0a, $7a, $90, $c7 + +ORG $C98AAE +db $65, $93, $C8 + +ORG $C98B1F +db $0A, $6C, $93, $C8 + +ORG $C8936C +db $06, $e0, $03, $dc, $93, $c8, $ff, $5e, $10, $0f, $50, $79, $57, $94, $50, $9c +db $99, $9b, $95, $50, $a4, $9f, $50, $97, $99, $a6, $95, $50, $a9, $9f, $a5, $50 +db $a4, $98, $99, $a3, $50, $a3, $9f, $a5, $a6, $95, $9e, $99, $a2, $50, $9f, $96 +db $50, $9f, $a5, $a2, $50, $a6, $99, $9c, $9c, $91, $97, $95, $5e, $03, $1d, $03 +db $ff, $1b, $02, $e1, $93, $c8, $ff, $1d, $0e, $ff, $11, $08, $cf, $dc, $c7, $ff +db $0a, $d5, $93, $c8, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $04, $e0, $03, $13, $18, $04, $02 +db $5e, $13, $18, $04, $02, $70, $89, $9f, $a5, $57, $a2, $95, $50, $93, $91, $a2 +db $a2, $a9, $99, $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $50, $a3 +db $a4, $a5, $96, $96, $5e, $13, $18, $04, $02, $05; Donations text + +ORG $C98207 +db $70, $78, $95, $a2, $95, $57, $a3, $50, $91, $50, $a3, $a9, $9d, $92, $9f, $9c +db $50, $9f, $96, $50, $9d, $a9, $50, $a2, $95, $9d, $9f, $a2, $a3, $95, $5e, $10 +db $0f, $01, $50, $50, $84, $91, $9b, $95, $50, $99, $a4, $50, $91, $9e, $94, $50 +db $97, $9f, $5e, $0a, $46, $82, $c9; Carpainter text + +ORG $C9A143 +db $49 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $CF068E +db $49 + +ORG $C99ACC +db $02 + +ORG $C799D7 +db $0A, $DD, $99, $C7 + +ORG $C79A5E +db $0A, $05, $94, $C8 + +ORG $C89405 +db $05, $06, $00, $1f, $61, $05, $18, $02, $1f, $03, $02; Runaway five stuff + +ORG $C79BEC +db $0A, $10, $94, $C8 + +ORG $C89410 +db $04, $0b, $00, $70, $7f, $17, $34, $0a, $f0, $9b, $c7; Bus enemy flag + +ORG $C79C7A +db $CF, $8C, $C8; Bus direct + +ORG $C95C0E +db $0A, $1B, $94, $C8 + +ORG $C95C66 +db $0A, $E4, $9C, $EE; Everdred flag + +ORG $C8941B +db $06, $42, $00, $F0, $9C, $EE, $00, $0a, $2a, $5c, $c9, $19, $10, $01, $0b, $02 +db $1b, $03, $44, $94, $c8, $00, $19, $10, $02, $0b, $02, $1b, $03, $86, $94, $c8 +db $00, $17, $fe, $91, $98, $0a, $de, $5c, $c9, $70, $84, $98, $91, $a4, $50, $9d +db $a5, $a3, $a4, $50, $92, $95, $50, $a7, $98, $a9, $50, $a9, $9f, $a5, $50, $a2 +db $95, $a3, $93, $a5, $95, $94, $50, $a9, $9f, $a5, $a2, $a3, $95, $9c, $96, $5e +db $10, $0f, $50, $87, $98, $a9, $50, $94, $9f, $9e, $57, $a4, $50, $a9, $9f, $a5 +db $50, $93, $9f, $9d, $95, $50, $99, $9e, $6f, $13, $02, $0a, $40, $9C, $EE + +ORG $C95CDA +db $0A, $26, $94, $C8 + +ORG $C95CFC +db $79, $50, $98, $95, $91, $a2, $50, $a3, $98, $95, $57, $a3, $50, $9e, $9f, $a4 +db $50, $91, $a2, $9f, $a5, $9e, $94, $50, $98, $95, $a2, $95, $5c, $10, $0a, $50 +db $a4, $98, $9f, $a5, $97, $98, $5e, $0a, $9c, $5d, $c9 + +ORG $EE9C40 +db $08, $7f, $dc, $c7, $00, $1b, $03, $87, $9C, $EE, $00, $70, $84, $98, $91, $a4 +db $50, $9d, $a5, $a3, $a4, $50, $92, $95, $50, $a7, $98, $a9, $50, $a3, $98, $95 +db $57, $a3, $50, $a7, $99, $a4, $98, $50, $a9, $9f, $a5, $5e, $10, $0f, $50, $87 +db $98, $a9, $50, $94, $9f, $9e, $57, $a4, $50, $a9, $9f, $a5, $50, $93, $9f, $9d +db $95, $50, $99, $9e, $6f, $13, $02, $70, $79, $50, $98, $95, $91, $a2, $94, $50 +db $a3, $9f, $9d, $95, $92, $9f, $94, $a9, $50, $a2, $95, $a3, $93, $a5, $95, $94 +db $50, $98, $95, $a2, $5e, $10, $0f, $50, $83, $98, $95, $57, $a3, $50, $9e, $9f +db $a4, $50, $a7, $99, $a4, $98, $50, $a9, $9f, $a5, $5c, $10, $0a, $50, $99, $a3 +db $50, $a3, $98, $95, $6f, $03, $00, $70, $73, $9f, $9d, $95, $50, $92, $91, $93 +db $9b, $50, $99, $96, $50, $a9, $9f, $a5, $50, $96, $99, $9e, $94, $50, $98, $95 +db $a2, $5e, $13, $02, $18, $01, $01, $17, $fe, $04, $42, $00, $0a, $6b, $5c, $c9 +db $06, $55, $00, $d7, $60, $c9, $00, $06, $e1, $03, $02, $9D, $EE, $ff, $0a, $c6 +db $5d, $c9, $19, $10, $01, $0b, $02, $1b, $03, $1C, $9D, $EE, $ff, $19, $10, $02 +db $0b, $02, $1b, $03, $42, $9D, $EE, $ff, $0a, $a5, $5e, $c9, $70, $79, $a4, $57 +db $a3, $50, $97, $9f, $9f, $94, $50, $a4, $9f, $50, $a3, $95, $95, $50, $a9, $9f +db $a5, $5c, $10, $0a, $50, $1c, $02, $02, $5e, $10, $0f, $00, $50, $50, $0a, $18 +db $5f, $c9, $0a, $0a, $5f, $c9; Everdred item text + +ORG $C95F9E +db $91, $50, $1c, $05, $11, $5e, $0a, $ab, $5f, $c9 + +ORG $C818D4 +db $04, $2A, $00, $02; Apple kid mouse + +ORG $C7916C +db $02 + +ORG $CF083B +db $00, $00 + +ORG $C818BF +db $0A, $46, $9D, $EE + +ORG $EE9D46 +db $50, $79, $57, $9d, $50, $a7, $9f, $a2, $9b, $99, $9e, $97, $50, $9f, $9e, $50 +db $a4, $98, $99, $a3, $50, $93, $9f, $9f, $9c, $50, $99, $9e, $a6, $95, $9e, $a4 +db $99, $9f, $9e, $50, $a4, $98, $91, $a4, $50, $9c, $95, $a4, $a3, $50, $a9, $9f +db $a5, $50, $a0, $9c, $91, $a9, $50, $a6, $99, $94, $95, $9f, $50, $97, $91, $9d +db $95, $a3, $5c, $03, $50, $00, $70, $95, $a8, $93, $95, $a0, $a4, $50, $a4, $98 +db $95, $50, $99, $a4, $95, $9d, $a3, $50, $91, $a2, $95, $50, $99, $9e, $50, $a2 +db $91, $9e, $94, $9f, $9d, $50, $a0, $9c, $91, $93, $95, $a3, $5e, $10, $15, $01 +db $50, $50, $89, $9f, $a5, $50, $93, $91, $9e, $50, $95, $a6, $95, $9e, $50, $a0 +db $9c, $91, $a9, $50, $99, $a4, $50, $a7, $99, $a4, $98, $50, $9f, $a4, $98, $95 +db $a2, $50, $a0, $95, $9f, $a0, $9c, $95, $50, $9f, $a2, $50, $97, $91, $9d, $95 +db $a3, $5e, $03, $00, $70, $79, $57, $9d, $50, $93, $91, $9c, $9c, $99, $9e, $97 +db $50, $99, $a4, $50, $10, $0a, $6C, $79, $a3, $9c, $91, $9e, $94, $a3, $6E, $5e +db $10, $0a, $50, $87, $91, $9e, $9e, $91, $50, $a4, $a2, $a9, $50, $99, $a4, $5e +db $5e, $5e, $6f, $10, $10, $50, $7e, $9f, $5c, $50, $79, $50, $97, $a5, $95, $a3 +db $a3, $50, $9e, $9f, $a4, $5e, $03, $01, $70, $87, $95, $9c, $9c, $5c, $50, $79 +db $57, $9c, $9c, $50, $92, $95, $50, $9f, $a6, $95, $a2, $50, $91, $a4, $50, $72 +db $a5, $a2, $97, $9c, $99, $9e, $50, $80, $91, $a2, $9b, $50, $99, $96, $50, $a9 +db $9f, $a5, $50, $9e, $95, $95, $94, $50, $9d, $95, $5e, $10, $0f, $50, $72, $a9 +db $50, $a4, $98, $95, $50, $a7, $91, $a9, $5c, $10, $0a, $50, $a9, $9f, $a5, $50 +db $a3, $98, $9f, $a5, $9c, $94, $50, $93, $98, $95, $93, $9b, $50, $9f, $a5, $a4 +db $50, $a4, $98, $95, $50, $9d, $9f, $a5, $a3, $95, $5e, $10, $10, $50, $78, $95 +db $50, $9c, $9f, $9f, $9b, $a3, $50, $9c, $99, $9b, $95, $50, $98, $95, $50, $a7 +db $91, $9e, $a4, $a3, $50, $a4, $9f, $50, $97, $99, $a6, $95, $50, $a9, $9f, $a5 +db $50, $a3, $9f, $9d, $95, $a4, $98, $99, $9e, $97, $5e, $13, $04, $2a, $00, $04 +db $70, $00, $02; Apple Kid text + +ORG $CF809F +db $69, $01, $d0, $60 + +ORG $CF8091 +db $04 + +ORG $CF9828 +db $00 + +ORG $C804EE +db $E1, $03 +;;;;;;;;;;;;;;;;;;;;;; +ORG $C87E3F +db $D1 + +ORG $CF6C1B +db $04 + +ORG $CF6D1F +db $00 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $CFB9D2 +db $74, $01, $01 + +ORG $CFB9E3 +db $74, $01, $01 + +ORG $CFBAC0 +db $E3, $03, $01; Phase Distorter 2 + +;ORG $CFBABE +;db $1F; Always make the Phase Distorter enterable + +ORG $C7F182 +db $84, $98, $95, $50, $80, $98, $91, $a3, $95, $50, $74, $99, $a3, $a4, $9f, $a2 +db $a4, $95, $a2, $50, $62, $50, $99, $a3, $50, $9e, $95, $91, $a2, $9c, $a9, $50 +db $93, $9f, $9d, $a0, $9c, $95, $a4, $95, $5e, $10, $0f, $50, $89, $9f, $a5, $50 +db $93, $91, $9e, $50, $a4, $a2, $a9, $50, $a4, $9f, $50, $a5, $a3, $95, $50, $99 +db $a4, $5c, $10, $0a, $50, $92, $a5, $a4, $50, $79, $50, $94, $9f, $a5, $92, $a4 +db $50, $99, $a4, $50, $a7, $99, $9c, $9c, $50, $a7, $9f, $a2, $9b, $50, $99, $9e +db $50, $a4, $98, $99, $a3, $50, $a3, $a4, $91, $a4, $95, $5e, $5e, $5e, $03, $00 +db $70, $79, $96, $50, $9f, $9e, $9c, $a9, $50, $a7, $95, $50, $98, $91, $94, $50 +db $a3, $9f, $9d, $95, $50, $8a, $95, $a8, $9f, $9e, $a9, $a4, $95, $5e, $5e, $5e +db $13, $1f, $f1, $e5, $02, $1f, $01, $02; Andonutes Text 1 + +ORG $C9B94E +db $78, $9d, $9d, $9d, $5e, $5e, $5e, $50, $79, $50, $94, $99, $94, $9e, $57, $a4 +db $50, $a4, $98, $99, $9e, $9b, $50, $99, $a4, $50, $a7, $9f, $a5, $9c, $94, $50 +db $a7, $9f, $a2, $9b, $5e, $5e, $5e, $03, $00, $70, $79, $96, $50, $9f, $9e, $9c +db $a9, $50, $a7, $95, $50, $98, $91, $94, $50, $91, $50, $a0, $99, $95, $93, $95 +db $50, $9f, $96, $50, $91, $50, $9d, $95, $a4, $95, $9f, $a2, $99, $a4, $95, $5c +db $10, $0a, $50, $79, $50, $93, $9f, $a5, $9c, $94, $50, $a3, $a9, $9e, $a4, $98 +db $95, $a3, $99, $aa, $95, $50, $a4, $98, $95, $50, $8a, $95, $a8, $9f, $9e, $a9 +db $a4, $95, $50, $9e, $95, $95, $94, $95, $94, $50, $a4, $9f, $50, $93, $9f, $9d +db $a0, $9c, $95, $a4, $95, $50, $99, $a4, $5e, $13, $18, $04, $04, $E3, $03, $02; Andonuts Text 2 + +ORG $C7F17B +db $E3, $03; Andonuts Text 3 flag + +ORG $C7F3F4 +db $04, $85, $00, $1f, $f1, $e5, $02, $1f, $01, $04, $7E, $01, $04, $47, $01, $04 +db $4A, $01, $04, $4B, $01, $04, $49, $01, $02 + +ORG $C6306B +db $0A, $C9, $9E, $EE + +ORG $EE9EC9 +db $19, $02, $73, $91, $9c, $9c, $02, $19, $02, $87, $91, $a2, $a0, $02, $1c, $07 +db $03, $11, $09, $03, $e1, $15, $c9, $00, $a8, $30, $c6, $00, $ea, $9e, $ee, $00 +db $02, $18, $04, $04, $07, $03, $1f, $17, $00, $00, $b8, $01, $01, $04, $e3, $03 +db $05, $4c, $01, $1f, $eb, $ff, $06, $04, $f8, $02, $1f, $03, $1f, $1e, $fa, $04 +db $09, $10, $b4, $1f, $21, $e5, $1f, $e5, $ff, $15, $73, $16, $3e, $10, $64, $1f +db $17, $e5, $02, $B9, $01, $04, $10, $50, $08, $6b, $dd, $c7, $00, $05, $f8, $02 +db $1f, $03, $1f, $ec, $ff, $01, $1f, $15, $6a, $00, $52, $01, $01, $08, $b8, $b4 +db $c9, $00, $19, $26, $01, $1f, $66, $01, $07, $3c, $bc, $c9, $00, $1f, $66, $02 +db $29, $17, $59, $ef, $00, $05, $e3, $03, $1E, $01, $e5, $02, $f1, $01, $02; Phase Distorter 2 Menu + +ORG $C33595 +db $06, $02, $19, $AA, $A2 + +ORG $C9BBD6 +db $00, $00, $00, $00 + +ORG $C9BBDB +db $1f, $15, $6a, $00, $50, $01, $01, $50, $50, $08, $b8, $b4, $c9, $00, $1f, $eb +db $ff, $06, $04, $f8, $02, $1f, $03, $1f, $1e, $e5, $02, $09, $10, $b4, $1f, $21 +db $5e, $1f, $e5, $ff, $15, $73, $16, $3e, $10, $64, $1f, $17, $fa, $04, $51, $01 +db $04, $10, $50, $08, $6b, $dd, $c7, $00, $05, $f8, $02, $1f, $03, $1f, $ec, $ff +db $01, $1f, $15, $6a, $00, $52, $01, $01, $08, $b8, $b4, $c9 + +ORG $C9BC28 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +ORG $D5F2D3 +db $30, $00, $B6 + +ORG $CFBAC3 +;db $6D, $FE, $C4; Valley phase distorter + +ORG $CF6253 +db $08, $00 + +ORG $CFE102 +db $00 + +ORG $CFE103 +dd StarMasterText + +ORG $CFE0FB +db $62, $00, $03 + +ORG $C76F96 + +ORG $C9BD69 +db $70, $77, $9f, $9f, $94, $50, $9e, $95, $a7, $a3, $5c, $10, $0a, $50, $95, $a6 +db $95, $a2, $a9, $9f, $9e, $95, $51, $03, $00, $70, $79, $57, $a6, $95, $50, $9a +db $a5, $a3, $a4, $50, $96, $99, $9e, $99, $a3, $98, $95, $94, $50, $9d, $a9, $50 +db $9c, $91, $a4, $95, $a3, $a4, $50, $99, $9e, $a6, $95, $9e, $a4, $99, $9f, $9e +db $5c, $10, $0a, $50, $a4, $98, $95, $50, $80, $98, $91, $a3, $95, $50, $74, $99 +db $a3, $a4, $9f, $a2, $a4, $95, $a2, $50, $63, $5e, $03, $00, $70, $85, $a3, $99 +db $9e, $97, $50, $a4, $98, $95, $50, $80, $98, $91, $a3, $95, $50, $74, $99, $a3 +db $a4, $9f, $a2, $a4, $95, $a2, $50, $63, $5c, $10, $0a, $50, $a9, $9f, $a5, $57 +db $9c, $9c, $50, $92, $95, $50, $91, $92, $9c, $95, $50, $a4, $9f, $50, $a4, $a2 +db $91, $a6, $95, $9c, $50, $99, $9e, $a4, $9f, $50, $a4, $98, $95, $50, $a0, $91 +db $a3, $a4, $50, $a4, $9f, $50, $93, $9f, $9e, $96, $a2, $9f, $9e, $a4, $50, $a4 +db $98, $95, $50, $a5, $9c, $a4, $99, $9d, $91, $a4, $95, $50, $95, $a6, $99, $9c +db $5e, $03, $00, $70, $85, $9e, $96, $9f, $a2, $a4, $a5, $9e, $91, $a4, $95, $9c +db $a9, $5c, $10, $0a, $50, $99, $a4, $50, $93, $91, $9e, $50, $9f, $9e, $9c, $a9 +db $50, $92, $95, $50, $a5, $a3, $95, $94, $50, $92, $a9, $50, $a3, $9f, $9d, $95 +db $9f, $9e, $95, $50, $a7, $98, $9f, $50, $98, $91, $a3, $50, $91, $92, $a3, $9f +db $a2, $92, $95, $94, $50, $a4, $98, $95, $50, $a0, $9f, $a7, $95, $a2, $50, $9f +db $96, $50, $a4, $98, $95, $50, $75, $91, $a2, $a4, $98, $50, $99, $9e, $a4, $9f +db $50, $a4, $98, $95, $99, $a2, $50, $98, $95, $91, $a2, $a4, $5e, $03, $06, $d6 +db $03, $c5, $be, $c9, $ff, $00, $70, $7f, $98, $5c, $10, $0a, $50, $99, $96, $50 +db $9f, $9e, $9c, $a9, $50, $79, $50, $a7, $95, $a2, $95, $50, $a3, $a4, $99, $9c +db $9c, $50, $a9, $9f, $a5, $9e, $97, $5e, $5e, $5e, $13, $02, $00, $70, $87, $98 +db $91, $6f, $10, $0f, $50, $89, $9f, $a5, $50, $a3, $91, $a9, $50, $a9, $9f, $a5 +db $50, $91, $9c, $a2, $95, $91, $94, $a9, $50, $98, $91, $a6, $95, $6f, $03, $00 +db $70, $87, $95, $9c, $9c, $5c, $10, $0a, $50, $a4, $98, $95, $9e, $5c, $10, $05 +db $50, $9c, $95, $a4, $57, $a3, $50, $97, $95, $a4, $50, $a3, $a4, $91, $a2, $a4 +db $95, $94, $51, $03, $0a, $32, $c0, $c9 + +ORG $C8886A +db $0A, $5A, $9F, $EE;Belch Base + +ORG $EE9F5A +db $70, $89, $9f, $a5, $50, $97, $9f, $a4, $50, $a4, $98, $95, $50, $97, $9f, $9f +db $94, $a3, $6f, $03, $00, $1d, $05, $ff, $69, $1b, $03, $f5, $9f, $ee, $ff, $70 +db $7e, $9f, $6f, $10, $0f, $50, $74, $9f, $50, $a9, $9f, $a5, $50, $a4, $98, $99 +db $9e, $9b, $50, $a7, $95, $57, $a2, $95, $50, $a3, $a4, $a5, $a0, $99, $94, $50 +db $95, $9e, $9f, $a5, $97, $98, $50, $a4, $9f, $50, $9c, $95, $a4, $50, $a3, $9f +db $9d, $95, $50, $a0, $a5, $9e, $9b, $50, $99, $9e, $5c, $10, $07, $50, $9a, $a5 +db $a3, $a4, $50, $96, $9f, $a2, $50, $a7, $91, $99, $a4, $99, $9e, $97, $50, $63 +db $50, $9d, $99, $9e, $a5, $a4, $95, $a3, $6f, $03, $00, $70, $77, $99, $a6, $95 +db $50, $a5, $a3, $50, $76, $9c, $a9, $50, $78, $9f, $9e, $95, $a9, $50, $9f, $a2 +db $50, $92, $95, $91, $a4, $50, $99, $a4, $51, $13, $02, $10, $0f, $18, $04, $1f +db $02, $76, $18, $01, $01, $19, $10, $01, $1b, $04, $70, $58, $1c, $02, $00, $50 +db $98, $91, $9e, $94, $95, $94, $50, $9f, $a6, $95, $a2, $50, $a4, $98, $95, $50 +db $1c, $05, $69, $5e, $59, $03, $00, $70, $7f, $9b, $91, $a9, $5e, $10, $0f, $50 +db $89, $9f, $a5, $50, $93, $91, $9e, $50, $93, $9f, $9d, $95, $50, $99, $9e, $5e +db $03, $1d, $01, $ff, $69, $0a, $9f, $88, $c8 + +ORG $C9AA92 +db $49 + +ORG $EF617B +db $0A, $43, $A0, $EE + +ORG $EEA043 +db $18, $01, $01, $70, $74, $99, $94, $50, $a9, $9f, $a5, $50, $92, $a2, $99, $9e +db $97, $50, $a4, $98, $95, $50, $6C, $1C, $05, $01, $0a, $64, $a0, $ee, $00, $00 +db $00, $6E, $6f, $03, $00, $70, $79, $a4, $57, $a3, $50, $a4, $98, $95, $50, $a0 +db $95, $a2, $96, $95, $93, $a4, $50, $a3, $9e, $91, $93, $9b, $50, $96, $9f, $a2 +db $50, $a0, $9c, $9f, $a4, $a4, $99, $9e, $97, $50, $a7, $9f, $a2, $9c, $94, $50 +db $94, $9f, $9d, $99, $9e, $91, $a4, $99, $9f, $9e, $5e, $03, $00, $0a, $b0, $61 +db $ef + +ORG $EF61F6 +db $D3 + +ORG $C27F5C +db $00 + +ORG $C27F60 +db $00 + +ORG $EF65ED +db $70, $84, $98, $95, $50, $97, $98, $9f, $a3, $a4, $a3, $50, $91, $a2, $9f, $a5 +db $9e, $94, $50, $84, $98, $a2, $95, $95, $94, $50, $a7, $99, $9c, $9c, $50, $a6 +db $91, $9e, $99, $a3, $98, $5e, $0a, $18, $66, $ef; Belch text + +ORG $C7EE67 +db $0A, $F8, $F9, $C7 + +ORG $C7F9F8 +db $06, $e6, $03, $35, $fa, $c7, $00, $1f, $02, $44, $10, $20, $18, $01, $01, $70 +db $58, $87, $9f, $a7, $51, $10, $0f, $50, $84, $98, $91, $a4, $57, $a3, $50, $91 +db $50, $a3, $a4, $a2, $9f, $9e, $97, $50, $91, $96, $a4, $95, $a2, $a4, $91, $a3 +db $95, $5e, $5e, $5e, $59, $03, $0A, $E2, $AF, $EE, $71, $92, $ee, $1f, $02, $44 +db $10, $20, $18, $01, $01, $70, $58, $89, $9f, $a5, $57, $a6, $95, $50, $97, $9f +db $a4, $a4, $95, $9e, $50, $a5, $a3, $95, $94, $50, $a4, $9f, $50, $99, $a4, $5e +db $59, $13, $02; Saturn coffee + +ORG $CF66ED +db $00, $00; Milky well npcs +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $C9C6B8 +db $0A, $A4, $A0, $EE + +ORG $EEA0A4 +db $1d, $05, $ff, $d3, $1b, $03, $aF, $a0, $ee, $ff, $02, $1f, $1a, $03, $05, $03 +db $0a, $bd, $c6, $c9; Tenda Gate + +ORG $D57041 +db $2F; Tendakraut storage + +ORG $CFDFD1 +db $B8, $A0, $EE + +ORG $EEA0B8 +db $1d, $05, $ff, $d3, $1b, $03, $cd, $c6, $c9, $ff, $0a, $9e, $c5, $c7 + +ORG $C9DE1C +db $0A, $27, $DE, $C9 + +ORG $C9DEA0 +db $70, $79, $50, $93, $91, $9e, $57, $a4, $50, $91, $93, $a4, $a5, $91, $9c, $9c +db $a9, $50, $a4, $91, $9c, $9b, $5e, $03, $00, $70, $82, $9f, $93, $9b, $a3, $50 +db $93, $91, $9e, $57, $a4, $50, $a4, $91, $9c, $9b, $5c, $10, $09, $50, $a7, $95 +db $99, $a2, $94, $9f, $5e, $03, $18, $04, $10, $20, $04, $a7, $01, $0a, $4f, $94 +db $ee; Talking rock text + +ORG $C9B0C4 +db $00, $00, $00 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $D586E0 +db $39, $90, $C2;Skip the party add when beating master barf + +ORG $EF7415 +db $0A, $E0, $A0, $EE + +ORG $EEA0E0 +db $00, $08, $c8, $f8, $d6, $00, $14, $08, $26, $fa, $d6, $ff, $04, $e7, $03, $1F +db $17, $22, $05, $5E, $02, $01, $02 + +ORG $EEC2E0 +db $70, $83, $a5, $94, $94, $95, $9e, $9c, $a9, $5c, $50, $1c, $02, $02, $50, $91 +db $a0, $a0, $95, $91, $a2, $95, $94, $51, $03, $02, $70, $76, $a2, $9f, $9d, $50 +db $a4, $98, $95, $50, $a3, $9b, $a9, $5c, $50, $1c, $02, $03, $50, $91, $a0, $a0 +db $95, $91, $a2, $95, $94, $51, $02, $70, $83, $a5, $94, $94, $95, $9e, $9c, $a9 +db $5c, $50, $1c, $02, $0b, $50, $9d, $91, $a4, $95, $a2, $99, $91, $9c, $99, $aa +db $95, $94, $51, $02, $70, $1c, $05, $02, $50, $a2, $9f, $a3, $95, $50, $96, $a2 +db $9f, $9d, $50, $a4, $98, $95, $50, $a3, $a7, $91, $9d, $a0, $51, $02, $70, $1c +db $05, $03, $50, $94, $91, $a3, $98, $95, $94, $50, $96, $a2, $9f, $9d, $50, $a4 +db $98, $95, $50, $a4, $a2, $95, $95, $a3, $51, $02, $70, $83, $a5, $94, $94, $95 +db $9e, $9c, $a9, $5c, $50, $91, $50, $7d, $91, $93, $98, $50, $80, $99, $aa, $aa +db $91, $50, $94, $95, $9c, $99, $a6, $95, $a2, $a9, $50, $9d, $91, $9e, $50, $91 +db $a2, $a2, $99, $a6, $95, $94, $51, $02, $70, $83, $a5, $94, $94, $95, $9e, $9c +db $a9, $5c, $50, $91, $50, $83, $a4, $91, $a2, $50, $7d, $91, $a3, $a4, $95, $a2 +db $50, $a3, $a7, $9f, $9f, $a0, $95, $94, $50, $99, $9e, $51, $02, $70, $1c, $02 +db $02, $50, $a0, $a2, $91, $a9, $95, $94, $50, $96, $a2, $9f, $9d, $50, $a4, $98 +db $95, $50, $92, $9f, $a4, $a4, $9f, $9d, $50, $9f, $96, $50, $98, $95, $a2, $50 +db $98, $95, $91, $a2, $a4, $51, $1f, $02, $1c, $14, $00, $70, $1C, $0E, $0A, $F7 +db $C3, $EE, $50, $72, $91, $a2, $96, $50, $a3, $91, $9e, $9b, $50, $99, $9e, $a4 +db $9f, $50, $a4, $98, $95, $50, $a3, $a7, $91, $9d, $a0, $51, $10, $20, $02, $00 +db $70, $1c, $02, $03, $50, $96, $99, $a2, $95, $94, $50, $a4, $98, $95, $50, $85 +db $9c, $a4, $a2, $91, $50, $7d, $95, $97, $91, $50, $72, $91, $aa, $9f, $9f, $9b +db $91, $51, $1f, $02, $4a, $10, $10, $1f, $02, $1f, $10, $30, $02, $00, $08, $3b +db $74, $ef, $ff, $70, $1f, $02, $37, $1c, $02, $04, $50, $a4, $a2, $99, $95, $94 +db $50, $01, $50, $50, $1c, $12, $15, $51, $08, $82, $88, $ef, $ff, $02, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $02, $00, $70, $1c, $02, $0b, $50, $94, $99, $94, $50, $91, $50 +db $9d, $91, $93, $98, $9f, $50, $93, $9f, $9d, $92, $9f, $50, $9b, $99, $93, $9b +db $51, $14, $02, $00, $70, $84, $98, $95, $50, $a0, $99, $aa, $aa, $91, $50, $97 +db $a5, $a9, $50, $a4, $98, $a2, $95, $a7, $50, $a3, $93, $91, $9c, $94, $99, $9e +db $97, $50, $98, $9f, $a4, $50, $a0, $99, $aa, $aa, $91, $50, $91, $a4, $50, $1C +db $0D, $0A, $EA, $C4, $EE, $50, $72, $91, $a2, $96, $51, $1f, $02, $11, $10, $30 +db $1f, $02, $2f, $10, $20, $02, $00, $70, $83, $a4, $91, $a2, $50, $7d, $91, $a3 +db $a4, $95, $a2, $50, $a4, $a2, $99, $95, $94, $50, $1c, $12, $16, $51, $1f, $02 +db $37, $10, $10, $08, $b8, $88, $ef, $ff, $02, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00; Master Barf defeat text + +ORG $CF694D +db $09, $00 + +ORG $C4FE80 +db $02, $00, $cd, $04, $b8, $e0, $22, $05, $a0, $c0;Barf NPC + +ORG $CFE0C8 +db $00, $00, $02 + +ORG $CFE0CD +db $E7, $03, $02, $00, $A1, $EE + +ORG $C9E746 +db $7A, $FA, $D6 + +ORG $D6FA7A +db $1F, $15, $00, $00, $BA, $01, $01, $0A, $70, $85, $C6 + +ORG $EEA100 +db $70, $7f, $98, $5c, $10, $0a, $50, $98, $95, $a9, $5e, $10, $0f, $50, $79, $50 +db $93, $91, $9d, $95, $50, $92, $95, $93, $91, $a5, $a3, $95, $50, $99, $a4, $50 +db $9c, $9f, $9f, $9b, $95, $94, $50, $9c, $99, $9b, $95, $50, $a9, $9f, $a5, $50 +db $a7, $95, $a2, $95, $50, $99, $9e, $50, $91, $50, $a2, $9f, $a5, $97, $98, $50 +db $a3, $a0, $9f, $a4, $5e, $03, $00, $08, $8a, $85, $c8, $ff, $1b, $03, $5d, $a1 +db $ee, $ff, $05, $e7, $03, $04, $e8, $03, $1f, $1e, $22, $05, $01, $02 + +ORG $C9E850 +db $0A, $58, $E7, $C9 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $CFE0BF +db $5F, $A1, $EE + +ORG $CFE0F2 +db $A3, $A1, $EE + +ORG $CFE0E1 +db $E8, $A1, $EE + +ORG $EEA15F +db $70, $79, $57, $9d, $50, $a9, $9f, $a5, $a2, $50, $93, $9f, $a5, $a2, $91, $97 +db $95, $5e, $03, $00, $70, $79, $57, $9d, $50, $a4, $9f, $9f, $50, $a3, $93, $91 +db $a2, $95, $94, $50, $a4, $9f, $50, $96, $99, $97, $98, $a4, $5c, $10, $0a, $50 +db $a3, $9f, $50, $79, $57, $9c, $9c, $50, $a3, $a4, $91, $a9, $50, $98, $95, $a2 +db $95, $5e, $13, $02, $70, $79, $57, $9d, $50, $a9, $9f, $a5, $a2, $50, $a0, $9f +db $a7, $95, $a2, $5e, $03, $00, $70, $79, $57, $9d, $50, $a4, $9f, $9f, $50, $9d +db $a5, $93, $98, $50, $9f, $96, $50, $91, $50, $a7, $95, $91, $9b, $9c, $99, $9e +db $97, $5c, $10, $0a, $50, $a3, $9f, $50, $79, $57, $9c, $9c, $50, $a3, $a4, $91 +db $a9, $50, $98, $95, $a2, $95, $5e, $13, $02, $70, $79, $57, $9d, $50, $a9, $9f +db $a5, $a2, $50, $a7, $99, $a3, $94, $9f, $9d, $5e, $03, $00, $70, $79, $57, $94 +db $50, $9a, $a5, $a3, $a4, $50, $9d, $91, $9b, $95, $50, $91, $50, $96, $9f, $9f +db $9c, $50, $9f, $96, $50, $9d, $a9, $a3, $95, $9c, $96, $5c, $10, $0a, $50, $a3 +db $9f, $50, $79, $57, $9c, $9c, $50, $a3, $a4, $91, $a9, $50, $98, $95, $a2, $95 +db $5e, $13, $02; Flying men text + +ORG $CF8369 +db $03, $00, $23, $05, $d8, $48, $21, $05, $e0, $90, $24, $05, $f0, $58 + +ORG $C779A1 +db $0A, $33, $A2, $EE + +ORG $EEA233 +db $08, $f4, $15, $c9, $00, $1f, $02, $25, $10, $5a, $1f, $1e, $4e, $05, $02, $10 +db $e0, $18, $01, $01, $70, $58, $1c, $02, $01, $50, $93, $9f, $9e, $a1, $a5, $95 +db $a2, $95, $94, $50, $98, $99, $a3, $50, $99, $9e, $9e, $95, $a2, $50, $95, $a6 +db $99, $9c, $51, $59, $03, $18, $04, $08, $d9, $9b, $ee, $ff, $08, $a7, $79, $c7 +db $ff, $1f, $21, $34, $02;Magicant nightmare? + +ORG $C77B44 +db $87, $95, $50, $a3, $98, $9f, $a5, $9c, $94, $50, $97, $9f, $50, $a4, $9f, $50 +db $a4, $98, $95, $50, $73, $91, $a6, $95, $50, $9f, $96, $50, $a4, $98, $95, $50 +db $80, $91, $a3, $a4, $50, $91, $9e, $94, $50, $95, $9e, $94, $50, $a4, $98, $99 +db $a3, $5e, $03, $0a, $3e, $7c, $c7 + +ORG $C7E352 +db $18, $04, $02 + +;;;;;;;;;;;;;;;;;;;;; +ORG $EEA515 +db $18, $04, $18, $01, $31, $1f, $00, $ff, $05, $50, $50, $50, $50, $50, $50, $50 +db $50, $50, $50, $50, $50, $04, $e9, $03, $1c, $08, $02, $10, $a0, $03, $18, $04 +db $08, $6b, $dd, $c7, $00, $1f, $00, $00, $5e, $1f, $14, $05, $06, $ff, $ff, $ff +db $ff, $ff, $ff, $1f, $eb, $02, $06, $1f, $15, $02, $00, $0d, $03, $01, $10, $01 +db $1f, $f2, $02, $00, $0a, $00, $1f, $eb, $01, $06, $1f, $15, $01, $00, $0c, $03 +db $01, $10, $01, $1f, $f2, $01, $00, $0a, $00, $10, $78, $10, $78, $10, $78, $10 +db $78, $10, $78, $10, $3c, $1f, $15, $92, $00, $06, $03, $01, $10, $3c, $10, $64 +db $1f, $15, $6a, $00, $7a, $02, $01, $1f, $61, $1f, $41, $0b, $08, $6b, $dd, $c7 +db $00, $1f, $eb, $ff, $06, $1f, $21, $e1, $1f, $00, $00, $5f, $1f, $15, $8f, $00 +db $f8, $02, $01, $1f, $61, $1f, $15, $58, $01, $f9, $02, $01, $1f, $61, $1f, $15 +db $c1, $01, $fa, $02, $01, $1f, $61, $1f, $41, $0c, $1f, $50, $1F, $EB, $FF, $00 +db $0a, $c9, $a5, $ee, $1F, $21, $51, $0A, $81, $C9, $C9; Ending + + +ORG $C39F17 +db $42, $A0, $FE, $C4; Paula robot + +ORG $C39F22 +db $42, $B5, $FE, $c4; Jeff robot + +ORG $C39F2D +db $42, $CA, $FE, $c4; Poo robot + +ORG $C9C07F +db $70, $7f, $98, $5c, $10, $0a, $50, $79, $50, $91, $9c, $9d, $9f, $a3, $a4, $50 +db $96, $9f, $a2, $97, $9f, $a4, $50, $a4, $9f, $50, $9d, $95, $9e, $a4, $99, $9f +db $9e, $50, $a4, $98, $91, $a4, $50, $79, $50, $98, $91, $94, $50, $a4, $9f, $50 +db $a0, $a5, $a4, $50, $a9, $9f, $a5, $a2, $50, $92, $a2, $91, $99, $9e, $a3, $50 +db $99, $9e, $a4, $9f, $50, $a2, $9f, $92, $9f, $a4, $a3, $5e, $03, $00, $70, $80 +db $a2, $9f, $92, $91, $92, $9c, $a9, $5c, $50, $91, $a4, $50, $9c, $95, $91, $a3 +db $a4, $5e, $03, $00, $70, $78, $95, $a9, $5c, $10, $06, $50, $a7, $98, $91, $a4 +db $57, $a3, $50, $a4, $98, $99, $a3, $50, $92, $a5, $a4, $a4, $9f, $9e, $50, $94 +db $9f, $6f, $03, $04, $1d, $01, $1f, $02, $10, $1f, $01, $ff, $10, $20, $0a, $1d +db $c2, $c9; Phase distorter 3 present + +ORG $C63092 +db $0A, $80, $A2, $EE + +ORG $EEA280 +db $19, $02, $73, $91, $9c, $9c, $02, $19, $02, $87, $91, $a2, $a0, $02, $1c, $07 +db $03, $11, $09, $03, $e1, $15, $c9, $00, $a8, $30, $c6, $00, $a1, $a2, $ee, $00 +db $02, $18, $04, $04, $07, $03, $1f, $17, $00, $00, $b8, $01, $01, $04, $e3, $03 +db $05, $4c, $01, $1f, $eb, $ff, $06, $04, $f8, $02, $1f, $00, $10, $5b, $1f, $1e +db $1e, $05, $09, $10, $b4, $05, $74, $01, $1f, $21, $e5, $1f, $e5, $ff, $15, $73 +db $16, $3e, $10, $64, $1f, $17, $e5, $02, $b9, $01, $04, $10, $50, $08, $6b, $dd +db $c7, $00, $05, $f8, $02, $1f, $03, $1f, $ec, $ff, $01, $1f, $15, $6a, $00, $52 +db $01, $01, $08, $b8, $b4, $c9, $00, $19, $26, $01, $1f, $66, $01, $07, $3c, $bc +db $c9, $00, $1f, $66, $02, $29, $17, $59, $ef, $00, $05, $e3, $03, $1e, $01, $e5 +db $02, $02; Phase distorter 3 menu + +ORG $CFDE39 +db $12, $A3, $EE + +ORG $EEA312 +db $06, $1d, $01, $1d, $c2, $c9, $ff, $0a, $9e, $c5, $c7 + +ORG $CFDE38 +db $00 + +ORG $C7F166 +db $1D, $01 + +ORG $C7F634 +db $70, $87, $95, $9c, $93, $9f, $9d, $95, $50, $92, $91, $93, $9b, $51, $10, $15 +db $50, $78, $9f, $a7, $50, $94, $99, $94, $50, $99, $a4, $50, $96, $95, $95, $9c +db $50, $a4, $a2, $91, $a6, $95, $9c, $99, $9e, $97, $50, $a4, $98, $a2, $9f, $a5 +db $97, $98, $50, $a4, $99, $9d, $95, $6f, $03, $00, $70, $84, $9f, $50, $a3, $98 +db $a2, $95, $94, $a3, $5c, $10, $0a, $50, $a9, $9f, $a5, $50, $a3, $91, $a9, $6f +db $13, $02; Andonuts 4 + +ORG $CF250D +db $1D, $A3, $EE + +ORG $EEA31D +db $06, $e1, $03, $3a, $af, $c9, $ff, $18, $01, $01, $70, $58, $89, $9f, $a5, $57 +db $a2, $95, $50, $9f, $a6, $95, $a2, $93, $9f, $9d, $95, $50, $a7, $99, $a4, $98 +db $50, $a4, $98, $95, $50, $96, $95, $95, $9c, $99, $9e, $97, $50, $a4, $98, $91 +db $a4, $50, $a9, $9f, $a5, $50, $a3, $98, $9f, $a5, $9c, $94, $9e, $57, $a4, $50 +db $a0, $a2, $9f, $93, $95, $95, $94, $50, $a7, $99, $a4, $98, $9f, $a5, $a4, $50 +db $1c, $02, $02, $5e, $5e, $5e, $59, $13, $18, $04, $0a, $3a, $af, $c9, $02; Paula warning + + +ORG $C9C4D3 +db $0A, $7C, $A3, $EE + +ORG $EEA37C +db $18, $01, $01, $70, $73, $9f, $9e, $97, $a2, $91, $a4, $a5, $9c, $91, $a4, $99 +db $9f, $9e, $a3, $51, $03, $00, $70, $77, $99, $a9, $97, $91, $a3, $50, $98, $91 +db $a3, $50, $92, $95, $95, $9e, $50, $94, $95, $96, $95, $91, $a4, $95, $94, $5c +db $10, $0a, $50, $91, $9e, $94, $50, $a4, $98, $95, $50, $75, $91, $a2, $a4, $98 +db $50, $99, $a3, $50, $a3, $91, $96, $95, $5e, $03, $00, $70, $87, $9f, $a5, $9c +db $94, $50, $a9, $9f, $a5, $50, $9c, $99, $9b, $95, $50, $a4, $9f, $50, $a3, $9b +db $99, $a0, $50, $a4, $9f, $50, $a4, $98, $95, $50, $93, $a2, $95, $94, $99, $a4 +db $a3, $5c, $10, $0a, $50, $9f, $a2, $50, $95, $a8, $a0, $9c, $9f, $a2, $95, $50 +db $a4, $98, $95, $50, $95, $a0, $99, $9c, $9f, $97, $a5, $95, $6f, $00, $19, $02 +db $73, $a2, $95, $94, $99, $a4, $a3, $02, $19, $02, $75, $a0, $99, $9c, $9f, $97 +db $a5, $95, $02, $1c, $07, $02, $11, $09, $02, $37, $a4, $ee, $00, $d0, $a5, $ee +db $00, $12, $0a, $0a, $a4, $ee, $1f, $e4, $01, $00, $05, $18, $04, $1f, $e4, $02 +db $00, $05, $1f, $e4, $04, $00, $05, $1f, $ea, $01, $00, $1f, $f2, $01, $00, $5e +db $02, $1f, $ea, $02, $00, $1f, $f2, $02, $00, $5e, $02, $1f, $ea, $03, $00, $1f +db $f2, $03, $00, $5e, $02, $1f, $ea, $04, $00, $1f, $f2, $04, $00, $5e, $02, $1f +db $00, $00, $5e, $5e, $0a, $6e, $a5, $ee; Credits choice + +ORG $EEA5D0 +db $0A +dl FixEpilogueWinters +db $d2, $00 +BackfromEpilogueFix: +db $04, $d3, $00, $04, $d5, $00, $04, $d6, $00, $04 +db $d7, $00, $04, $d8, $00, $04, $d9, $00, $04, $da, $00, $04, $db, $00, $04, $dc +db $00, $04, $dd, $00, $04, $de, $00, $04, $df, $00, $04, $69, $00, $12, $70, $80 +db $9c, $95, $91, $a3, $95, $50, $9b, $95, $95, $a0, $50, $99, $9e, $50, $9d, $99 +db $9e, $94, $50, $a4, $98, $91, $a4, $50, $a3, $9f, $9d, $95, $50, $a3, $95, $a1 +db $a5, $95, $9e, $93, $95, $a3, $50, $9d, $91, $a9, $50, $9e, $9f, $a4, $50, $a7 +db $9f, $a2, $9b, $50, $9f, $a2, $50, $92, $95, $50, $91, $a6, $91, $99, $9c, $91 +db $92, $9c, $95, $5e, $03, $00, $70, $7c, $9f, $93, $91, $a4, $99, $9f, $9e, $a3 +db $50, $93, $9f, $9c, $9c, $95, $93, $a4, $95, $94, $50, $a7, $99, $9c, $9c, $50 +db $9e, $9f, $a4, $50, $92, $95, $50, $93, $9f, $a5, $9e, $a4, $95, $94, $5c, $10 +db $0a, $50, $91, $9e, $94, $50, $a9, $9f, $a5, $50, $a7, $99, $9c, $9c, $50, $9e +db $95, $95, $94, $50, $a4, $9f, $50, $a2, $95, $a3, $a4, $91, $a2, $a4, $50, $96 +db $a2, $9f, $9d, $50, $a9, $9f, $a5, $a2, $50, $a0, $a2, $95, $a6, $99, $9f, $a5 +db $a3, $50, $a3, $91, $a6, $95, $50, $a4, $9f, $50, $a2, $95, $a3, $a5, $9d, $95 +db $50, $9e, $9f, $a2, $9d, $91, $9c, $50, $a0, $9c, $91, $a9, $5e, $03, $00, $70 +db $84, $9f, $50, $a6, $99, $95, $a7, $50, $a4, $98, $95, $50, $93, $a2, $95, $94 +db $99, $a4, $a3, $5c, $10, $0a, $50, $a2, $95, $a4, $a5, $a2, $9e, $50, $a4, $9f +db $50, $1c, $02, $01, $57, $a3, $50, $98, $9f, $a5, $a3, $95, $50, $99, $9e, $50 +db $7f, $9e, $95, $a4, $a4, $5e, $03, $18, $04, $0a, $ef, $c4, $c9; Epilogue choice + +ORG $C9C582 +db $0a, $87, $c5, $c9 + +ORG $C48535 +LDA #$00FF;Lumine hall hardcoded length + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;Get rid of the NPCS outside monotoli building. I already fixed it once I can do it again. Also remove the hotspot? + + +;think about stuff like NPCs saying items... + +;;;;;;;;;;;;;;;;;;;;;;; + +ORG $EE9BD0 +db $07, $D6, $03, $1B, $03, $03, $BB, $EE, $00, $18, $01, $01, $01, $70, $58, $1C +db $02, $01, $50, $91, $92, $A3, $9F, $A2, $92, $95, $94, $50, $A4, $98, $95, $50 +db $A0, $9F, $A7, $95, $A2, $50, $9F, $96, $50, $A4, $98, $95, $50, $75, $91, $A2 +db $A4, $98, $51, $59, $04, $D6, $03, $1F, $02, $67, $10, $20, $13, $18, $00, $02 ;Earth's power text + +ORG $C55593 +db $70, $79, $96, $50, $a9, $9f, $a5, $50, $a3, $95, $95, $50, $a4, $98, $99, $a3 +db $5c, $50, $a4, $95, $9c, $9c, $50, $80, $99, $9e, $9b, $50, $83, $a7, $99, $a4 +db $93, $98, $5e + +;;;;;;;;;;;;;;;;;;;; only if start pos is not onett +;ORG $CF96C2 +;dw $0069 + +;ORG $CF9618 +;dw $0069 + +;ORG $CF9629 +;dw $0069 +;;;;;;;;;;;;;;; +ORG $D579F0 ; New Tenda Village coordinates +dw $0035 +dw $0020 + +ORG $F4A000 +db $78, $91, $a0, $a0, $a9, $5d, $78, $91, $a0, $a0, $a9, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $dd, $00, $f4, $01, $cb, $03, $FF; Happy-Happy Teleport + +db $74, $a5, $a3, $a4, $a9, $50, $74, $a5, $9e, $95, $a3, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $de, $00, $a0, $00, $e3, $04, $FF; Dusty Dunes + +db $7d, $91, $97, $99, $93, $91, $9e, $a4, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $df, $00, $f2, $02, $28, $02, $FF; Magicant Teleport + +ORG $F4C000 +ShopItemNamesDeluxe: +.10: +db $54, $61, $60, $00 +.100: +db $54, $61, $60, $60, $00 +.1000: +db $54, $61, $60, $60, $60, $00 + +.MoneyNames: +dw $0000 +dw .10 +dw .100 +dw .1000 + + + +ORG $00F8D0 +GetItemRemote: +SEP #$20 +STZ $0770 +STZ $B582 +STZ $B583 +STZ $B5E7 +LDA #$01 +STA $B585 +REP #$20 +PHX +SEP #$10 +LDX $B570 +BEQ SkipItemGet +JSR CalcCharSpace +CMP #$69 +BEQ SkipItemGet +SEP #$10 +REP #$20 +LDA $B571 +AND #$00FF +LDX $B570 +JSL $C18BC6 +STZ $B570 +LDA #$0074 +JSL $C0ABE0 +SkipItemGet: +REP #$30 +LDA $987F +LDY #$0008 +PLX +JML $C04D4C + +CalcCharSpace: +LDY #$00 +SEP #$20 +STZ $B571 +CheckNextChar: +LDA $986F,Y +JSR CheckCharInv +CPY $98A4 +BEQ CharacterInvalid +BRA CheckNextChar +CharacterInvalid: +JSL KeyItemBlockerAndCheckProg +BEQ SendItemToStorage +LDA #$69 +RTS +SendItemToStorage: +LDA $B570 +;KEY ITEM CHECK GOES HERE +JSL CheckIfKeyItem +JSL StoreItem +REP #$20 +STZ $3272 +LDA #$0074 +JSL $C0ABE0 +SEP #$20 +LDA #$69 +STZ $B570 +RTS +CheckCharInv: +STA $B571 +DEC +ASL +TAX +REP #$20 +LDA CharLastInvSlot,X +REP #$10 +TAX +SEP #$20 +LDA $0000,X +BNE CharInvFull +PLX +CharInvFull: +SEP #$10 +INY +RTS + +InitIntro: +REP #$20 +PHX +LDX #$0000 +SetScript: +LDA StartingScripts,X +PHX +JSL $C2165E +PLX +INX +INX +CPX #$003E +BNE SetScript +PHY +LDY #$0000 +UnsetNextScript: +TYX +LDA UnsetScripts,X +TXY +LDX #$0000 +PHY +JSL $C2165E +PLY +INY +INY +CPY #$000A +BEQ EndUnsetScripts +BRA UnsetNextScript +EndUnsetScripts: +PLY +PLX +SEP #$20 +LDA #$09 +STA $9839 +REP #$20 +JML $C1FEB2 + +SetTeleFlags: +LDA $06 +PHX +LDX #$0000 +CheckTeleFlag: +CMP TeleSectorID,X +BEQ UnlockTeleport +CPX #$0028 +BEQ EndTeleCheck +INX +INX +BRA CheckTeleFlag +EndTeleCheck: +PLX +STA $5E38 +JML LoadCurrentPhotoColor +UnlockTeleport: +PHA +LDA TeleFlags,X +TSB $9C22 +PLA +BRA EndTeleCheck + +IgnoreTeleportEnemies: +LDA $9F3F +AND #$00FF +BNE SkipCollision +JSL $C0D15C +JML $C0D626 +SkipCollision: +JML $C0D62B + +GetRemoteTeleport: +LDA $B572 +AND #$00FF +BEQ EndGetPSI +CMP #$0010 +BCS GetChara +PHX +ASL +TAX +LDA TeleportFlags,X +JSL $C2165E +LDA #$0067 +JSL $C0ABE0 +PLX +BRA EndGetPSI +GetChara: +JSR UnlockCharacter +EndGetPSI: +STZ $B572 +STZ $FF40 +LDA $006D +AND #$A000 +JML GetRemoteMoney + +UnlockCharacter: +PHX +SEC +SBC #$0010 +ASL +STA $B572 +%FUNCTION_PROLOGUE(18) +JSL $C0943C +PHX +LDX $B572 +LDA CharUnlockPointers,X +PLX +;STZ $B572 +STA $0E +LDA #$00D5 +STA $10 +LDA #$0001 +JSL $C1DD47 ;Display textbox +JSL $C186B1 ;Overworld text +JSL $C09451 ;Resume sprites +PLD +PLX +RTS + + +GetCharNameFromServ: +REP #$31 +CPX #$00FE +BNE SkipSpecialNameLoad +SEP #$10 +LDX $B572 +REP #$10 +SkipSpecialNameLoad: +PHD +PHA +JML $C14FDB + +GetPlayerName: +PHA +LDA $FF40 +BEQ GetNormalItem +PLA +STZ $FF40 +LDA #$00AD +BRA ForceAPItem +GetNormalItem: +PLA +ForceAPItem: +CMP #$00AD +BNE SetPlayerNameFlag +INC $B573 +INC $B579 +SetPlayerNameFlag: +JSL CheckifNameProgressive +LDA #$0000 +JML $C146DC + +LoadPlayerName: +TDC +ADC #$FFF2 +PHA +LDA $B573 +AND #$00FF +BEQ SkipPlayerName +LDX #$001F +SkipPlayerName: +PLA +JML $C14FDF + +DrawPlayerName: +PHA +LDA $B573 +AND #$00FF +BEQ DrawNormalName +PLA +LDA $B579 +AND #$00FF +BEQ SkipPriorityName +STZ $B579 +BRA DontSkipPrior +SkipPriorityName: +STZ $B573 +DontSkipPrior: +LDA #$FF50 +STA $0E +LDA #$007E +STA $10 +JML $C19399 + +DrawNormalName: +PLA +ADC $06 +STA $06 +JML $C19393 + +SetMelodyCount: +PHX +LDX #$0000 +CheckSoundStoneScript: +CMP SoundStoneScripts,X +BEQ IncrementMelody +INX +INX +CPX #$0010 +BEQ NormalEvent +BRA CheckSoundStoneScript +IncrementMelody: +INC $B575 +SEP #$20 +PHA +LDA $B575 +CMP $C4FD70 +BCC SkipSanctuaryTrigger +PHA +LDA #$04 +TSB $9C82 +PLA +SkipSanctuaryTrigger: +CMP $C4FD71 +BCC SkipMagicantTrigger +PHA +LDA #$08 +TSB $9C82 +PLA +SkipMagicantTrigger: +CMP $C4FD72 +BCC ReturnEvent +LDA #$10 +TSB $9C82 +ReturnEvent: +PLA +NormalEvent: +REP #$20 +PLX +REP #$31 +DEC +PHA +LSR +JML SetFlagProceed + +PocketStorage: +LDA $0065 +AND #$00FF +BIT #$0010 +BEQ SkipDropMenu +PHX +PHY +%FUNCTION_PROLOGUE(18) +JSL $C0943C +LDA #$9620 +STA $0E +LDA #$00EE +STA $10 +JSL $C186B1 +JSL $C09451 +JSL $C1DD59 ;Close textbox +PLD +PLY +PLX +SkipDropMenu: +LDA $006D +AND #$0040 +JML $C0B90A + +SkipArchiSpaceCheck: +PHA +LDA $B573 +AND #$00FF +BNE SkipSpaceCheck +PLA +JSL $C4572B +JML $C14D09 +SkipSpaceCheck: +PLA +LDA #$00FF +JML $C14D09 + +CheckArchiItemInv: +LDX $14 +CPX #$00AD +BEQ SkipInvAdd +JSL $C18BC6 +SkipInvAdd: +JML $C156AD + +GetServerItemName: +LDA $B573 +AND #$00FF +BEQ WriteNormalName +LDA #$FF80 +STA $06 +LDA #$007E +STA $08 +LDA #$0000 +JML $C1922E +WriteNormalName: +LDA #$5000 +STA $06 +JML $C19227 + +AddNewNPCSectors: +BNE EntryIsntNull +JML $C0255A +EntryIsntNull: +STA $06 +AND #$FF00 +BEQ CheckNPCSector +JML $C0226B +CheckNPCSector: +PHX +LDA $06 +DEC +ASL +TAX +LDA NewSectorPointers,X +PLX +STA $06 +LDA #$00C4 +STA $08 +JML $C0227C + +GetLumiText: +LDA $C48037,X +AND #$00FF +BEQ EndLumiText +JML $C48409 +EndLumiText: +JML $C48717 + +DelArchFromInv: +LDY $0E +TYA +SEP #$20 +CMP #$AD +BEQ SkipArchiWrite +JML GetProgressiveItems +SkipArchiWrite: +JML $C18B65 + +SetAnimSpeed: +PHX +LDA $0066 +LDX #$0000 +AND #$00FF +BIT #$0040 +BEQ NotRunning +LDA #$0003 +BRA SetRunSpeed +NotRunning: +LDA #$0008 +SetRunSpeed: +STA $0E +CPX #$000A +BEQ EndRun +INX #2 +BRA SetRunSpeed +EndRun: +PLX +JML $C07966 + +SaveAPData: +PHA +PHX +PHY +PHB +LDA $B4A1; Save file num +AND #$00FF +TAX +LDA #$7E00 +CalcSaveSpot: +CPX #$0000 +BEQ RunDataSave +CLC +ADC #$0010 +DEX +BRA CalcSaveSpot +RunDataSave: +TAY +LDA #$000F +LDX #$B570 +MVN $7E20 +;storage +LDA #$0063 +LDX #$B590 +LDY #$7E40 +MVN $7E20 +PLB +PLY +PLX +PLA +JSL $EF0A4D +RTL + +ExtraKeyItems: +LDA $D55000,X +BEQ CheckKeys +JML $C14F5A +CheckKeys: +JML DeleteExtraKeyItem +LDA $06 +AND #$00FF +LDX #$0000 +CheckNextItemStash: +LDY #$0000 +CheckNextItem: +SEP #$20 +CMP $99F1,X +REP #$20 +BEQ FoundItemCopy +BackToItems: +INY +INX +CPY #$000E +BNE CheckNextItem +CPX #$012B;Change this condition? +BEQ CheckStorageForKeys +PHA +TXA +INC $B58B +LDA $98A4 +AND #$00FF +DEC +CMP $B58B +BCS .CheckNextChar +PLA +JMP CheckStorageForKeys +.CheckNextChar: +LDA $B58B +AND #$00FF +TAX +LDA $986F,X +AND #$00FF +ASL +TAX +LDA InvPointers,X +TAX +PLA +BRA CheckNextItemStash +FoundItemCopy: +PHA +LDA $B580 +AND #$00FF +BNE RemoveItem +PLA +INC $B580 +BRA BackToItems +PLA +RemoveItem: +LDA #$0010 +BRA EndKeyCheck +CheckStorageForKeys: +LDX #$0000 +CheckStorageSlot: +SEP #$20 +CMP $B590,X +REP #$20 +BEQ FoundItemCopy2 +CPX #$0023 +BEQ EndStorageCheck +BackToStorage: +INX +BRA CheckStorageSlot +EndStorageCheck: +LDA #$0000 +EndKeyCheck: +PLY +PLX +STZ $B580 +JML $C14F5A +FoundItemCopy2: +PHA +LDA $B580 +AND #$00FF +BNE RemoveItem +PLA +INC $B580 +BRA BackToStorage + +TestArchiItemSpace: +LDA $0E +AND #$00FF +CMP #$00AD +BEQ .SkipSpaceCheck +LDA $0000,X +.SkipSpaceCheck +JML $C18B5B + +GetLumiTextMain: +LDA $C48037 +AND #$00FF +BEQ .EndLumiText +JML $C4845A +.EndLumiText: +JML $C48717 + +GetLumiTextSub: +LDA $C4803B,X +AND #$00FF +BEQ .EndLumiText +JML $C486FB +.EndLumiText: +JML $C48717 + +LoadAPData: +LDA $B4A1 +AND #$00FF +PHA +PHX +PHY +PHB +TAX +LDA #$7E00 +CheckFileNum: +CPX #$0000 +BEQ GotFileData +CLC +ADC #$0010 +DEX +BRA CheckFileNum +GotFileData: +TAX +LDY #$B570 +LDA #$000F +MVN $207E + +LDY #$B590 +LDX #$7E40 +LDA #$0063 +MVN $207E +PLB +PLY +PLX +PLA +JML $C1F071 +;Each 10 bytes should be saved per file + +SpecialNameDirect: +CMP #$0007 +BNE NotSeven +JML $C17E71 +NotSeven: +CMP #$0016 +BEQ GetSpecialName +CMP #$0017 +BEQ PullAPName +CMP #$00B7 +BEQ SilentAPName +JML CheckMoreSpecialCommands +GetSpecialName: +JSR PrintSpecialName +LDA #$0000 +JML $C17F0F +PullAPName: +INC $FF40 +JSR APCC;Move name data +LDA #$0000 +JML $C17E65 +SilentAPName: +INC $FF40 +JSR APC2 +LDA #$0000 +JML $C17F0F + + + +APCC: +rep #$31 +phd +pha +tdc +adc #$ffee +tcd +pla +; read ARGS_COUNT bytes of args into $97BA +ldy #$0001 +jsl R_Peek_Parameter_Bytes +LDA $97BA +AND #$00FF +XBA +JSL MoveItemNames +PLD +RTS + +APC2: +rep #$31 +phd +pha +tdc +adc #$ffee +tcd +pla +; read ARGS_COUNT bytes of args into $97BA +ldy #$0001 +jsr R_Read_Parameter_Bytes +LDA $97BA +AND #$00FF +XBA +JSL MoveItemNames +PLD +RTS + +PrintSpecialName: + rep #$31 + phd + pha + tdc + adc #$ffee + tcd + pla + ; read ARGS_COUNT bytes of args into $97BA + ldy #$0001 + jsr R_Read_Parameter_Bytes + LDA $97BA + AND #$00FF + ASL + PHX + TAX + LDA SpecialNameTable,X +PLX + sta $0e + lda.w #$00EE + sta $10 + ; load maximum length of the string into A + lda #$ffff + ; call "printStringAutoNewline" + jsl $C447FB + ; clean up stack frame and return + pld + rts + + R_Read_Parameter_Bytes: +rep #$31 +phd +tdc +adc #$ffee +tcd +; First things first: get the text pointer +lda $97b8 +sta $00 +asl ; 2 +adc $00 ; 3 +asl ; 6 +asl ; 12 +adc $00 ; 13 +asl ; 26 +adc $00 ; 27 +; We now have [0x97b8] * 27 in A. +sta $00 +; Load the text pointer from the table at 0x7E96AA into 0xE. +tax +lda $96aa,x +sta $0e +lda $96ac,x +sta $10 +; Load amount into X. Also store into 0x02 for later use +sty $02 +tyx +; The memcpy routine copies words. If we have an odd number of +; bytes, it will round down. We add 1 so that it effectively rounds up. +inx +lda #$97ba +; Copy it: X bytes from [0x0e] to (A). +jsl $c08ed2 +; Zero out upper bytes of cc_argv +ldy $02 +tya +lsr ; Get lower order bit in carry, and branch if 0 +lda #$0000 +bcc .aligned +; Align Y to next word +sep #$20 +sta $97ba,y +rep #$31 +bra .unaligned +.loop: +sta $97ba,y +iny +.unaligned: +iny +.aligned: +cpy #$0016 +bmi .loop +.end: +; Adjust the text pointer and store back into table. +ldx $00 +lda $0e +clc +adc $02 +sta $96aa,x +lda $10 +sta $96ac,x +pld +rts + + +ORG $C0FF00 +MagicantSoloAnimSpeedFix: +PHA +JSL SetMagicantAnimSpeeds +PLA +JMP $79EA + + + +ORG $C1FFF1 +StoreItem: +JSR $913D +RTL +GetItemName: +JSR $9216 +RTL + +org $C1FEC9 + LDA $98B6 + AND #$00FF + ASL + TAX + LDA Table_HpPpRollSpeedLo-2,x + STA $9627 + LDA #$0001 + STA $9629 + LDA Table_FFNIB-2,x + ; $C1FEE2 + STA $964B + ; Load text speed + LDA.l Table_FramesPerChar-2,x + STA $9625 + BRA $2B + ; $C1FEEE +Table_FramesPerChar: + ; Base game values + ;.word 0x100 + ;.word 0x200 + ;.word 0x300 + ; Better values (imo) + dw $0AA + dw $100 + dw $280 + ; $C1FEF4 + +WaitTextOneTick: + ; Load leftover portion of # of frames to wait + ; $C1FEF4 + LDA $962B + ; Add our text speed + CLC + ADC $9625 + TAY + ; Save fractional portion back to memory + AND #$00FF + STA $962B + ; $C1FF02 + ; Determine the integer number of frames to wait + TYA + XBA + AND #$00FF + BEQ FrameWaitDone + STA $00 +FrameWaitLoop: + JSL $C12DD5 + DEC $00 + ; $C1FF11 + BNE FrameWaitLoop +FrameWaitDone: + RTL + ; $C1FF14 + + ; space before $C1FF19 is free + +org $C10D4B + JSL WaitTextOneTick + BRA $0D + +org $C44055 + JSL WaitTextOneTick + BRA $0D + +org $C444E3 + JSL WaitTextOneTick + BRA $0D + + +org $C3FB1F +; The data was previously here, we're modifying the values +; and breaking them into separate lo/hi word tables... +; except the hi word is always 1, so no need to store it. +; we'll use the space to store the FFNIB values +Table_HpPpRollSpeedLo: + ; Base game values + ;.word 0x2000 + ;.word 0x1800 + ;.word 0x1000 + ; Better values (imo) + dw 4480 + dw 2480 + dw 1480 + +Table_FFNIB: + ; Base game values + ;.word 30 + ;.word 60 + ;.word 0 + ; Better values (imo) + dw 20 + dw 30 + dw 0 + + +ORG $C308E5 + db $42 + dl $C4FDE0 + db $00; Screen reload code + + +ORG $C4FDE0 +reload_row_gfx: +LDX $987B +LDA $9877 +JML $C012ED + +ORG $C33572 +db $42 +dl $C4FE60 +db $00 + +ORG $C4FE60 +spawn_saturn_pd: +LDA #$0180 +STA $9E2D +LDA #$1DBB +STA $9E2F +RTL + +db $18, $04, $0A, $D3, $BB, $C9 + +ORG $C335B5 +db $42 +dl $C4FE90 +db $00 + +ORG $C4FE90 +spawn_barf_char: +LDA #$13C1 +STA $9E2D +LDA #$1DA1 +STA $9E2F +RTL + +ORG $C4FEA0 +check_paula: +SEP #$20 +LDA $9C84 +BIT #$01 +REP #$20 +BEQ skip_paula +JML $C0A98B +skip_paula: +LDY #$9F22 +STY $94 +RTL + +check_jeff: +SEP #$20 +LDA $9C84 +BIT #$02 +REP #$20 +BEQ skip_jeff +JML $C0A98B +skip_jeff: +LDY #$9F2D +STY $94 +RTL + +check_poo: +SEP #$20 +LDA $9C09 +BIT #$80 +REP #$20 +BEQ skip_poo +JML $C0A98B +skip_poo: +LDY #$9F38 +STY $94 +RTL + +ORG $D5F5FB +db $03, $00; Starting level + +ORG $D5F600 +db $4A + +ORG $D5F830 +db $04, $e1, $03, $0a +dl PaulaUnlocktext + +db $04, $e2, $03, $0a +dl JeffUnlockText + +db $04, $10, $00, $0a +dl PooUnlockText + +db $0A +dl FlyingManUnlockText + +NessFlagText: +db $04, $17, $04 +db $0A +dl NessUnlockText + +db $0A +dl DynamicPhotoSetter + +ORG $C66AC1 +db $68; Tracy text + +ORG $D577EB +db $8E; Scaraba Pig Nose Shop + +ORG $C570A2 +db $0A, $FD, $A6, $EE + +ORG $EEA6FD +db $17, $b5, $03, $00, $04, $ea, $03, $0a, $a6, $70, $c5 + +ORG $C56F80 +db $0A, $08, $A7, $EE + +ORG $EEA708 +db $06, $ea, $03, $18, $a7, $ee, $ff, $15, $14, $1c, $05, $8d, $0a, $85, $6f, $c5 +db $70, $71, $98, $5c, $10, $0a, $50, $79, $50, $91, $9d, $50, $a3, $9f, $9c, $94 +db $50, $9f, $a5, $a4, $5e, $10, $0f, $50, $83, $9f, $50, $a3, $9f, $a2, $a2, $a9 +db $5e, $13, $02; Snake Bagsman + +;Present stuff +ORG $C132D5 +LDX $06 +PHX +LDX $08 +PHX +STA $0E +STZ $10 +JSR $0489 +PLA +STA $08 +PLA +INC +INC +STA $06 +JML FindMovData +GotMovData: +STZ $10 +JSR $045D +BRA $3A + +ORG $C7D8A5 +db $0A, $40, $A7, $EE + +ORG $EEA740 +db $09, $03, $ee, $d8, $c7, $00, $F4, $BA, $ee, $00, $FE, $BA, $ee, $00, $0a, $ad +db $d8, $c7, $70, $71, $50, $a7, $95, $9c, $9c, $50, $9f, $96, $50, $a0, $a3, $a9 +db $93, $98, $99, $93, $50, $95, $9e, $95, $a2, $97, $a9, $50, $a3, $a0, $a2, $a5 +db $9e, $97, $50, $a5, $a0, $50, $96, $a2, $9f, $9d, $50, $99, $9e, $a3, $99, $94 +db $95, $51, $03, $1b, $04, $09, $10, $11, $92, $ee, $ff, $41, $92, $ee, $ff, $73 +db $92, $ee, $ff, $b0, $92, $ee, $ff, $e1, $92, $ee, $ff, $19, $93, $ee, $ff, $56 +db $93, $ee, $ff, $89, $93, $ee, $ff, $bb, $93, $ee, $ff, $ed, $93, $ee, $ff, $1f +db $94, $ee, $ff, $50, $94, $ee, $ff, $8c, $94, $ee, $ff, $c4, $94, $ee, $ff, $02 +db $95, $ee, $ff, $55, $95, $ee, $ff, $55, $95, $ee, $ff, $02, $70, $71, $50, $a6 +db $9f, $99, $93, $95, $50, $a2, $91, $9e, $97, $50, $9f, $a5, $a4, $50, $96, $a2 +db $9f, $9d, $50, $a7, $99, $a4, $98, $99, $9e, $0A, $F5, $A7, $EE, $50, $a0, $a2 +db $95, $a3, $95, $9e, $a4, $51, $03, $00, $1b, $04, $09, $04, $30, $f8, $d5, $ff +db $37, $f8, $d5, $ff, $3e, $f8, $d5, $ff, $45, $f8, $d5, $ff, $0A +dl ExtraPresentCheck + +ORG $EEA810 +db $7f, $9e, $95, $a4, $a4, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $84 +db $a7, $9f, $a3, $9f, $9e, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $78 +db $91, $a0, $a0, $a9, $5d, $78, $91, $a0, $a0, $a9, $50, $86, $99, $9c, $9c, $91 +db $97, $95, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $84, $98, $a2, $95 +db $95, $94, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $83, $91, $a4, $a5 +db $a2, $9e, $50, $86, $91, $9c, $9c, $95, $a9, $50, $84, $95, $9c, $95, $a0, $9f +db $a2, $a4, $00, $74, $a5, $a3, $a4, $a9, $50, $74, $a5, $9e, $95, $a3, $50, $84 +db $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $76, $9f, $a5, $a2, $a3, $99, $94, $95 +db $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $87, $99, $9e, $a4, $95, $a2 +db $a3, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $83, $a5, $9d, $9d, $95 +db $a2, $a3, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $83, $93, $91, $a2 +db $91, $92, $91, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $74, $91, $9c +db $91, $91, $9d, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $74, $95, $95 +db $a0, $50, $74, $91, $a2, $9b, $9e, $95, $a3, $a3, $50, $84, $95, $9c, $95, $a0 +db $9f, $a2, $a4, $00, $84, $95, $9e, $94, $91, $50, $86, $99, $9c, $9c, $91, $97 +db $95, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00, $7c, $9f, $a3, $a4, $50 +db $85, $9e, $94, $95, $a2, $a7, $9f, $a2, $9c, $94, $50, $84, $95, $9c, $95, $a0 +db $9f, $a2, $a4, $00, $80, $a2, $9f, $97, $a2, $95, $a3, $a3, $99, $a6, $95, $50 +db $80, $9f, $9f, $50, $80, $83, $79, $00, $80, $91, $a5, $9c, $91, $00, $7a, $95 +db $96, $96, $00, $80, $9f, $9f, $00, $76, $9c, $a9, $99, $9e, $97, $50, $7d, $91 +db $9e, $00, $7D, $91, $97, $99, $93, $91, $9E, $A4, $50, $84, $95, $9C, $95, $A0 +db $9F, $A2, $A4, $00 + +ORG $EEA963 +db $03, $06, $d2, $03, $6c, $a9, $ee, $ff, $1f, $02, $71, $18, $04, $10, $80, $18 +db $01, $01, $08, $90, $a9, $ee, $ff, $1b, $03, $83, $a9, $ee, $ff, $04, $d2, $03 +db $02 + +ORG $EEA990 +db $70, $84, $98, $95, $a2, $95, $50, $99, $a3, $50, $91, $50, $1c, $05, $01, $50 +db $99, $9e, $50, $a4, $98, $95, $50, $a3, $a4, $91, $a4, $a5, $95, $57, $a3, $50 +db $95, $a9, $95, $5e, $03, $00, $1d, $00, $FF, $01, $1b, $03, $ef, $a9, $ee, $ff +db $70, $72, $a5, $a4, $19, $10, $01, $1b, $04, $50, $1c, $02, $00, $50, $99, $a3 +db $50, $93, $91, $a2, $a2, $a9, $99, $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5 +db $93, $98, $50, $a3, $a4, $a5, $96, $96, $5e, $1f, $81, $00, $01, $13, $02, $1b +db $04, $1f, $02, $74, $10, $30, $08, $58, $d9, $c7, $ff, $1f, $81, $ff, $ff, $02 + +ORG $EEAA00 +db $18, $01, $01, $08, $12, $aa, $ee, $ff, $1b, $03, $11, $aa, $ee, $ff, $04, $e4 +db $03, $02, $1f, $17, $2e, $00, $0a, $00, $01, $70, $72, $95, $96, $9f, $a2, $95 +db $50, $79, $50, $97, $9f, $5c, $10, $0a, $50, $79, $50, $a7, $91, $9e, $a4, $50 +db $a9, $9f, $a5, $50, $a4, $9f, $50, $98, $91, $a6, $95, $50, $a4, $98, $99, $a3 +db $50, $1c, $05, $01, $5e, $03, $1d, $0e, $ff, $01, $1b, $02, $60, $aa, $ee, $ff +db $08, $cf, $dc, $c7, $ff, $03, $1f, $1e, $2e, $00, $01, $1f, $81, $ff, $ff, $02 +db $00, $70, $72, $a5, $a4, $5c, $10, $0a, $50, $a9, $9f, $a5, $57, $a2, $95, $50 +db $93, $91, $a2, $a2, $a9, $99, $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5, $93 +db $98, $50, $a3, $a4, $a5, $96, $96, $5e, $03, $04, $2f, $01, $02; Buzz Buzz 2 + +ORG $C78C32 +db $0A, $8D, $AA, $EE + +ORG $EEAA8D +db $06, $76, $01, $9d, $aa, $ee, $ff, $05, $16, $02, $1f, $03, $0a, $ce, $88, $c8 +db $50, $18, $01, $01, $0a, $36, $8c, $c7 + +ORG $C888D1 +db $70, $87, $98, $9f, $91, $98, $5e, $10, $0f, $50, $84, $98, $91, $a4, $50, $a4 +db $a5, $9e, $9e, $95, $9c, $57, $a3, $50, $98, $91, $a5, $9e, $a4, $95, $94, $5e +db $03, $00, $70, $79, $57, $9d, $50, $9e, $9f, $a4, $50, $97, $9f, $99, $9e, $97 +db $50, $a4, $98, $91, $a4, $50, $a7, $91, $a9, $5e, $50, $10, $0f, $7d, $a9, $50 +db $9a, $9f, $92, $50, $91, $99, $9e, $57, $a4, $50, $a7, $9f, $a2, $a4, $98, $50 +db $a4, $98, $99, $a3, $51, $03, $00, $70, $89, $9f, $a5, $50, $97, $9f, $50, $9f +db $9e, $50, $a9, $9f, $a5, $a2, $50, $9f, $a7, $9e, $51, $03, $1F, $41, $06, $00; Bus 2 + +ORG $EEAAA5 +db $0D, $01, $0D, $01, $1b, $04, $09, $14, $fe, $aa, $ee, $00, $30, $ab, $ee, $00 +db $63, $ab, $ee, $00, $a3, $ab, $ee, $00, $d6, $ab, $ee, $00, $10, $ac, $ee, $00 +db $4f, $ac, $ee, $00, $84, $ac, $ee, $00, $b8, $ac, $ee, $00, $ec, $ac, $ee, $00 +db $20, $ad, $ee, $00, $53, $ad, $ee, $00, $8d, $ad, $ee, $00, $c7, $ad, $ee, $00 +db $07, $ae, $ee, $00, $40, $ae, $ee, $00, $62, $ae, $ee, $00, $84, $ae, $ee, $00 +db $a6, $ae, $ee, $00, $c5, $ae, $ee, $00, $02, $1f, $02, $67, $10, $30, $01, $70 +db $58, $1c, $02, $01, $50, $9c, $95, $91, $a2, $9e, $95, $94, $50, $98, $9f, $a7 +db $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2, $a4, $50, $a4, $9f, $50 +db $7f, $9e, $95, $a4, $a4, $51, $59, $04, $d1, $00, $02, $1f, $02, $67, $10, $30 +db $01, $70, $58, $1c, $02, $01, $50, $9c, $95, $91, $a2, $9e, $95, $94, $50, $98 +db $9f, $a7, $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2, $a4, $50, $a4 +db $9f, $50, $84, $a7, $9f, $a3, $9f, $9e, $51, $59, $04, $d2, $00, $02, $1f, $02 +db $67, $10, $30, $01, $70, $58, $1c, $02, $01, $50, $9c, $95, $91, $a2, $9e, $95 +db $94, $50, $98, $9f, $a7, $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2 +db $a4, $50, $a4, $9f, $50, $78, $91, $a0, $a0, $a9, $5d, $78, $91, $a0, $a0, $a9 +db $50, $86, $99, $9c, $9c, $91, $97, $95, $51, $59, $04, $dd, $00, $02, $1f, $02 +db $67, $10, $30, $01, $70, $58, $1c, $02, $01, $50, $9c, $95, $91, $a2, $9e, $95 +db $94, $50, $98, $9f, $a7, $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2 +db $a4, $50, $a4, $9f, $50, $84, $98, $a2, $95, $95, $94, $51, $59, $04, $d3, $00 +db $02, $1f, $02, $67, $10, $30, $01, $70, $58, $1c, $02, $01, $50, $9c, $95, $91 +db $a2, $9e, $95, $94, $50, $98, $9f, $a7, $50, $a4, $9f, $50, $a4, $95, $9c, $95 +db $a0, $9f, $a2, $a4, $50, $a4, $9f, $50, $83, $91, $a4, $a5, $a2, $9e, $50, $86 +db $91, $9c, $9c, $95, $a9, $51, $59, $04, $d5, $00, $02, $1f, $02, $67, $10, $30 +db $01, $70, $58, $1c, $02, $01, $50, $9c, $95, $91, $a2, $9e, $95, $94, $50, $98 +db $9f, $a7, $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2, $a4, $50, $a4 +db $9f, $50, $74, $a5, $a3, $a4, $a9, $50, $74, $a5, $9e, $95, $a3, $50, $74, $95 +db $a3, $95, $a2, $a4, $51, $59, $04, $de, $00, $02, $1f, $02, $67, $10, $30, $01 +db $70, $58, $1c, $02, $01, $50, $9c, $95, $91, $a2, $9e, $95, $94, $50, $98, $9f +db $a7, $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2, $a4, $50, $a4, $9f +db $50, $76, $9f, $a5, $a2, $a3, $99, $94, $95, $51, $59, $04, $d6, $00, $02, $1f +db $02, $67, $10, $30, $01, $70, $58, $1c, $02, $01, $50, $9c, $95, $91, $a2, $9e +db $95, $94, $50, $98, $9f, $a7, $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f +db $a2, $a4, $50, $a4, $9f, $50, $87, $99, $9e, $a4, $95, $a2, $a3, $51, $59, $04 +db $d4, $00, $02, $1f, $02, $67, $10, $30, $01, $70, $58, $1c, $02, $01, $50, $9c +db $95, $91, $a2, $9e, $95, $94, $50, $98, $9f, $a7, $50, $a4, $9f, $50, $a4, $95 +db $9c, $95, $a0, $9f, $a2, $a4, $50, $a4, $9f, $50, $83, $a5, $9d, $9d, $95, $a2 +db $a3, $51, $59, $04, $d7, $00, $02, $1f, $02, $67, $10, $30, $01, $70, $58, $1c +db $02, $01, $50, $9c, $95, $91, $a2, $9e, $95, $94, $50, $98, $9f, $a7, $50, $a4 +db $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2, $a4, $50, $a4, $9f, $50, $83, $93 +db $91, $a2, $91, $92, $91, $51, $59, $04, $d9, $00, $02, $1f, $02, $67, $10, $30 +db $01, $70, $58, $1c, $02, $01, $50, $9c, $95, $91, $a2, $9e, $95, $94, $50, $98 +db $9f, $a7, $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2, $a4, $50, $a4 +db $9f, $50, $74, $91, $9c, $91, $91, $9d, $51, $59, $04, $d8, $00, $02, $1f, $02 +db $67, $10, $30, $01, $70, $58, $1c, $02, $01, $50, $9c, $95, $91, $a2, $9e, $95 +db $94, $50, $98, $9f, $a7, $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2 +db $a4, $50, $a4, $9f, $50, $74, $95, $95, $a0, $50, $74, $91, $a2, $9b, $9e, $95 +db $a3, $a3, $51, $59, $04, $da, $00, $02, $1f, $02, $67, $10, $30, $01, $70, $58 +db $1c, $02, $01, $50, $9c, $95, $91, $a2, $9e, $95, $94, $50, $98, $9f, $a7, $50 +db $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2, $a4, $50, $a4, $9f, $50, $84 +db $95, $9e, $94, $91, $50, $86, $99, $9c, $9c, $91, $97, $95, $51, $59, $04, $db +db $00, $02, $1f, $02, $67, $10, $30, $01, $70, $58, $1c, $02, $01, $50, $9c, $95 +db $91, $a2, $9e, $95, $94, $50, $98, $9f, $a7, $50, $a4, $9f, $50, $a4, $95, $9c +db $95, $a0, $9f, $a2, $a4, $50, $a4, $9f, $50, $a4, $98, $95, $50, $7c, $9f, $a3 +db $a4, $50, $85, $9e, $94, $95, $a2, $a7, $9f, $a2, $9c, $94, $51, $59, $04, $dc +db $00, $02, $1f, $02, $67, $10, $30, $01, $70, $58, $1c, $02, $04, $50, $9c, $95 +db $91, $a2, $9e, $95, $94, $50, $98, $9f, $a7, $50, $a4, $9f, $50, $a5, $a3, $95 +db $06, $d1, $03, $36, $ae, $ee, $ff, $1c, $12, $15, $51, $59, $0A +dl SetNpcPooPSIFlag +db $02, $1c, $12, $16, $51, $59, $1f, $71, $04, $03, $02 +db $0A +dl NPCPaulaTex +NpcPaulaReturn: +db $10 +db $85, $01, $1f, $03, $70, $58, $1c, $02, $02, $50, $9a, $9f, $99, $9e, $95, $94 +db $50, $a9, $9f, $a5, $5e, $59, $04, $e1, $03, $1f, $11, $02, $02 + +db $0A +dl NPCJeffTex +NpcJeffReturn: +db $10, $85, $01, $1f, $03, $70, $58, $1c, $02, $03, $50, $9a, $9f, $99, $9e +db $95, $94, $50, $a9, $9f, $a5, $5e, $59, $04, $e2, $03, $1f, $11, $03, $02, $1f +db $00, $00, $7b, $10, $85, $00, $1f, $03, $70, $58, $1c, $02, $04, $50, $9a, $9f +db $99, $9e, $95, $94, $50, $a9, $9f, $a5, $5e, $59, $04, $10, $00, $1f, $11, $04 +db $02 + +db $0A +dl NPCPooTex +NpcPooReturn: +db $10, $85, $01, $1f, $03, $70, $58, $1c, $02, $0b, $50 +db $9a, $9f, $99, $9e, $95, $94, $50, $a9, $9f, $a5, $5e, $59, $1f, $11, $0b, $02 +db $1f, $02, $67, $10, $30, $01, $70, $58, $1c, $02, $01, $50, $9c, $95, $91, $a2 +db $9e, $95, $94, $50, $98, $9f, $a7, $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0 +db $9f, $a2, $a4, $50, $a4, $9f, $50, $7d, $91, $97, $99, $93, $91, $9e, $a4, $51 +db $59, $04, $DF, $00, $02; MASSIVE NPC PSI table + +ORG $C87E7C +db $08, $b6, $dc, $c7, $00, $0D, $01 + +ORG $C86305 +db $08, $b6, $dc, $c7, $00, $01, $01 + +ORG $C66309 +db $19, $10, $01, $1b, $04 + +ORG $C661D0 +db $a4, $98, $95, $50, $1c, $05, $01, $5e, $03, $00, $70, $80, $99, $a2, $9b, $9c +db $95, $5c, $10, $0f, $50, $a4, $98, $95, $50, $7d, $91, $a9, $9f, $a2, $50, $9f +db $96, $50, $7f, $9e, $95, $a4, $a4, $5c, $10, $15, $50, $a3, $98, $9f, $a5, $9c +db $94, $50, $98, $91, $a6, $95, $50, $99, $a4, $5e, $03, $00, $70, $79, $96, $50 +db $a9, $9f, $a5, $50, $9e, $95, $95, $94, $50, $99, $a4, $5c, $10, $0f, $50, $97 +db $9f, $50, $a4, $91, $9c, $9b, $50, $a4, $9f, $50, $98, $99, $9d, $5e, $03, $00 +db $0a, $09, $63, $c6, $ff + +ORG $C72D49 +db $1c, $05, $01, $5e, $0a, $53, $2d, $c7 + +ORG $C72D62 +db $08, $b6, $dc, $c7, $00, $01, $01 + +ORG $C80021 +db $49 + +ORG $C8001A +db $49 + +ORG $C80005 +db $01, $01, $01, $01, $01, $01 + +ORG $C80044 +db $1c, $05, $01, $0a, $4b, $00, $c8 + +ORG $C93E5D +db $1c, $05, $01, $0a, $6b, $3e, $c9 + +ORG $C93EE7 +db $01, $01, $01, $01, $01, $01 + +ORG $C93F2A +db $0A, $FA, $AE, $EE + +ORG $EEAEFA +db $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $13, $04, $9e, $02, $02 + +ORG $C80619 +db $1c, $05, $01, $0a, $20, $06, $c8 + +ORG $C94E76 +db $0A, $4D, $BE, $EE + +ORG $EEBE4D +db $50, $a4, $15, $d7, $04, $eb, $03, $0a, $7a, $4e, $c9 + +ORG $C7617C +db $08, $cf, $dc, $c7, $00, $04, $4c, $00 + +ORG $EF96D3 +db $01, $01, $01 + +ORG $D5F8E0 +db $70, $79, $50, $98, $91, $a6, $95, $50, $93, $9f, $9d, $95, $50, $a4, $9f, $50 +db $a4, $95, $91, $93, $98, $50, $a9, $9f, $a5, $50, $a4, $98, $99, $a3, $50, $a0 +db $9f, $a7, $95, $a2, $5e, $50, $71, $93, $93, $95, $a0, $a4, $50, $99, $a4, $50 +db $9e, $9f, $a7, $51, $03, $02, $ff, $ff, $70, $74, $95, $10, $05, $95, $10, $05 +db $95, $10, $05, $95, $10, $05, $95, $10, $05, $95, $9c, $99, $a6, $95, $a2, $a9 +db $50, $96, $9f, $a2, $50, $9f, $9e, $95, $19, $10, $01, $1b, $04, $50, $1c, $02 +db $00, $51, $03, $00, $70, $7f, $9e, $95, $50, $9f, $a2, $94, $95, $a2, $50, $9f +db $96, $50, $91, $50, $02 + +ORG $EEAF08 +db $08, $33, $af, $ee, $00, $01, $08, $30, $f8, $d5, $ff, $00, $1b, $03, $ff, $ff +db $ff, $ff, $0a, $1f, $96, $c7, $1d, $0e, $ff, $01, $1b, $03, $29, $af, $ee, $ff +db $02, $08, $b6, $dc, $c7, $ff, $03, $1f, $81, $ff, $ff, $02 + +ORG $EEAF34 +db $03, $1d, $03, $ff, $1b, $02, $4d, $af, $ee, $ff, $1d, $0e, $ff, $11, $08, $cf +db $dc, $c7, $ff, $03, $0a +dl CabinTextJump +db $c7, $00, $70, $89, $9f, $a5, $57, $a2 +db $95, $50, $93, $91, $a2, $a2, $a9, $99, $9e, $97, $50, $a4, $9f, $9f, $50, $9d +db $a5, $93, $98, $50, $a3, $a4, $a5, $96, $96, $5e, $03, $1f, $f1, $b5, $01, $0a +db $00, $04, $ec, $03, $02 + +ORG $CFA690 +db $ed, $03 + +ORG $CFA6A1 +db $ed, $03 + +ORG $CFA67F +db $EC, $03 + +ORG $CF8865 +db $4a, $6f + +ORG $CFA68E +db $0A + +ORG $C796B8 +db $02 + +ORG $CFB02B +db $02 + +ORG $EEAF79 +db $08, $78, $AF, $EE, $ff, $08, $af, $af, $ee, $ff, $1b, $03, $8d, $af, $ee, $ff +db $0a, $a4, $9b, $ee, $70, $89, $9f, $a5, $57, $a2, $95, $50, $93, $91, $a2, $a2 +db $a9, $99, $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $50, $a3, $a4 +db $a5, $96, $96, $5e, $13, $02, $1c, $05, $01, $51, $03, $1d, $03, $ff, $1b, $02 +db $c2, $af, $ee, $ff, $1f, $81, $01, $02, $02, $1d, $0e, $ff, $01, $08, $cf, $dc +db $c7, $ff, $03, $1f, $81, $ff, $ff, $02 + +ORG $CFB034 +db $d1, $af, $ee + +ORG $EEAFD1 +db $1b, $00, $0a, $cb, $da, $c7, $1b, $01, $08, $40, $a7, $ee, $ff +db $0A +dl fix_boogey_tent + +ORG $C7DAEB +db $0a, $d7, $af, $ee + +ORG $C7A300 +db $02 + +ORG $EEAFE2 +db $08, $f1, $af, $ee, $ff, $1b, $02, $3d, $b0, $ee, $ff, $04, $e6, $03, $02, $01 +db $70, $87, $98, $9f, $91, $98, $51, $10, $0f, $50, $84, $98, $95, $a2, $95, $57 +db $a3, $50, $91, $50, $1c, $05, $01, $50, $91, $a4, $50, $a4, $98, $95, $50, $92 +db $9f, $a4, $a4, $9f, $9d, $50, $9f, $96, $50, $a4, $98, $95, $50, $93, $a5, $a0 +db $51, $03, $1d, $03, $ff, $1b, $02, $38, $b0, $ee, $ff, $1d, $0e, $ff, $01, $08 +db $cf, $dc, $c7, $ff, $13, $02, $1f, $81, $ff, $ff, $02, $01, $70, $72, $a5, $a4 +db $5c, $10, $0a, $50, $19, $10, $01, $1b, $04, $1c, $02, $00, $50, $99, $a3, $50 +db $93, $91, $a2, $a2, $a9, $99, $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5, $93 +db $98, $50, $a3, $a4, $a5, $96, $96, $5e, $13, $02 + +ORG $C7EA9B +db $04, $ab, $00, $01, $15, $3d, $17, $75, $15, $23, $00, $50, $50, $1c, $05, $00 +db $5e, $03, $1f, $30, $1d, $0e, $00, $fc, $08, $cf, $dc, $c7, $ff, $03, $01, $0a +db $00, $ea, $c7 + +ORG $C7EABF +db $04, $aC, $00, $01, $15, $3d, $17, $75, $15, $23, $00, $50, $50, $1c, $05, $00 +db $5e, $03, $1f, $30, $1d, $0e, $00, $fc, $08, $cf, $dc, $c7, $ff, $03, $01, $0a +db $00, $ea, $c7 + +ORG $C7EAE3 +db $04, $ad, $00, $01, $15, $3d, $17, $75, $15, $23, $00, $50, $50, $1c, $05, $00 +db $5e, $03, $1f, $30, $1d, $0e, $00, $fc, $08, $cf, $dc, $c7, $ff, $03, $01, $0a +db $00, $ea, $c7 + +ORG $C7EA95 +db $BF + +ORG $C7EA8E +db $E3 + +ORG $C60D8A +db $50, $1c, $05, $01, $0a, $99, $0d, $c6 + +ORG $C60DA5 +db $1f, $1e, $1a, $03, $06, $1d, $0e, $ff, $bb + +ORG $C6F8FD +db $6c, $b0, $ee + +ORG $C6FA30 +db $02 + +ORG $EEB06C +db $08, $0c, $fa, $c6, $ff, $06, $58, $00, $6b, $b0, $ee, $ff, $0e, $02, $0d, $01 +db $1b, $04, $0e, $03, $0d, $01, $0a, $40, $a7, $ee + +ORG $C6F957 +db $86, $b0, $ee + +ORG $EEB086 +db $08, $0c, $fa, $c6, $ff, $06, $67, $00, $6b, $b0, $ee, $ff, $0e, $02, $0d, $01 +db $1b, $04, $0e, $03, $0d, $01, $0a, $40, $a7, $ee + +ORG $C6F984 +db $A0, $B0, $EE + +ORG $EEB0A0 +db $08, $0c, $fa, $c6, $ff, $06, $17, $00, $6b, $b0, $ee, $ff, $0e, $02, $0d, $01 +db $1b, $04, $0e, $03, $0d, $01, $0a, $40, $a7, $ee + +ORG $C4FE40 +db $02 + +ORG $C6F92A +db $BA, $B0, $EE + +ORG $EEB0BA +db $08, $0c, $fa, $c6, $ff, $06, $4e, $01, $6b, $b0, $ee, $ff, $0e, $02, $0d, $01 +db $1b, $04, $0e, $03, $0d, $01, $0a, $40, $a7, $ee + +ORG $C6AB8D +db $67, $AC + +ORG $C6AC79 +db $0A, $EC, $AB, $C6 + +ORG $EEB0D4 +db $08, $27, $b1, $ee, $ff, $08, $0b, $b1, $ee, $ff, $1b, $03, $e8, $b0, $ee, $ff +db $0a, $ef, $99, $ee, $01, $70, $89, $9f, $a5, $57, $a2, $95, $50, $93, $91, $a2 +db $a2, $a9, $99, $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $50, $a3 +db $a4, $a5, $96, $96, $5e, $13, $02, $1c, $05, $02, $51, $03, $1d, $03, $ff, $1b +db $02, $28, $b1, $ee, $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $13, $1f +db $81, $ff, $ff, $02, $1f, $81, $01, $01, $02 + +ORG $C570A6 +db $1d, $03, $ff, $1d, $0e, $00, $8d, $08, $cf, $dc, $c7, $ff, $13, $02 + +ORG $C6AEAC +db $01, $01, $01, $01 + +ORG $C6AEC3 +db $03, $1d, $0e, $ff, $01, $08, $b6, $dc, $c7, $ff, $0a, $dc, $ae, $c6 + +ORG $2FFA6C +db $1d, $03, $ff, $1b, $02, $94, $fa, $2f, $ff, $1d, $0e, $ff, $01, $08, $b6, $dc +db $c7, $ff, $03, $04, $dd, $03, $02, $00, $00, $00, $00, $00, $00, $00, $00, $00 +db $00, $00, $00, $00, $00, $00, $00, $00, $70 + +ORG $C625F5 +db $17, $fd, $a5, $50, $85, $9b, $a9, $a5, $9b, $a5, $99, $6f, $03, $00, $17, $73 +db $91, $a4, $15, $cb, $16, $fc, $a3, $17, $c7, $17, $07, $94, $99, $94, $15, $6c +db $6f, $10, $14, $17, $9c, $a5, $a4, $5c, $17, $3f, $17, $6d, $15, $88, $91, $a4 +db $17, $35, $93, $a4, $17, $c9, $5c, $15, $66, $15, $b1, $6f, $59, $03, $1d, $0e +db $ff, $a6 + +ORG $C60FE5 +db $01, $01, $01, $1d, $0e, $00, $8b + +ORG $C951E3 +db $0A, $2D, $B1, $EE + +ORG $EEB12D +db $08, $68, $b1, $ee, $ff, $1b, $02, $3c, $b1, $ee, $ff, $04, $65, $02, $02, $00 +db $70, $7b, $a9, $95, $95, $9b, $a9, $9f, $9b, $a9, $91, $03, $00, $70, $58, $89 +db $9f, $a5, $57, $a6, $95, $50, $97, $9f, $a4, $50, $a4, $9f, $9f, $50, $9d, $a5 +db $93, $98, $50, $9a, $a5, $9e, $9b, $51, $59, $13, $02, $18, $01, $01, $70, $7b +db $95, $95, $9b, $a9, $9f, $9f, $9b, $a9, $91, $9b, $a9, $95, $91, $9b, $03, $00 +db $70, $58, $7a, $a5, $a3, $a4, $50, $9b, $99, $94, $94, $99, $9e, $97, $51, $50 +db $79, $57, $9c, $9c, $50, $97, $99, $a6, $95, $50, $a9, $9f, $a5, $50, $a4, $98 +db $99, $a3, $1c, $05, $01, $5e, $59, $03, $1d, $03, $ff, $1b, $02, $bd, $b1, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $1f, $81, $01, $01, $03, $02 +db $1f, $81, $ff, $ff, $02 + +ORG $C99D3E +db $D6 + +ORG $C6D667 +db $0A, $C2, $B1, $EE + +ORG $C61014 +db $83, $9f, $50, $97, $9f, $9f, $94, $50, $9c, $a5, $93, $9b, $50, $a7, $99, $a4 +db $98, $50, $a4, $98, $91, $a4, $5e, $13, $0a, $e4, $10, $c6 + +ORG $C60FF3 +db $04, $2a, $02;Set the flag + +ORG $EEB1C2 +db $1d, $03, $ff, $1b, $02, $7d, $92, $c8, $ff, $1d, $0e, $ff, $01, $08, $b6, $dc +db $c7, $ff, $03, $00, $0a, $de, $92, $c8 + +ORG $EF66AC +db $0A, $DA, $B1, $EE + +ORG $EEB1DA +db $04, $76, $01, $04, $4e, $02, $04, $6f, $02, $0a, $b2, $66, $EF + +ORG $C7AAB8 +db $1d, $03, $ff, $1b, $02, $e2, $aa, $c7, $ff, $1d, $0e, $ff, $04, $08, $b6, $dc +db $c7, $ff, $03, $18, $04, $0a, $0f, $b7, $c7 + +ORG $C7B595 +db $1d, $0e, $ff, $01, $08, $b6, $dc, $c7, $ff, $03, $0a, $af, $b5, $c7 + +ORG $C7B576 +db $1d, $03, $ff, $01 + +ORG $EE9A8B +db $0A, $2E, $B2, $EE + +ORG $EEB22E +db $08, $66, $b2, $ee, $ff, $1b, $03, $3d, $b2, $ee, $ff, $0a, $90, $9a, $ee, $04 +db $ee, $03, $18, $01, $01, $70, $87, $98, $91, $a4, $6f, $51, $50, $89, $9f, $a5 +db $57, $a2, $95, $50, $93, $91, $a2, $a2, $a9, $99, $9e, $97, $50, $a4, $9f, $9f +db $50, $9d, $a5, $93, $98, $51, $13, $02, $1d, $03, $ff, $1b, $02, $81, $b2, $ee +db $ff, $18, $01, $01, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03, $1f, $81 +db $ff, $ff, $02, $1f, $81, $01, $01, $02 + +ORG $CFC80B +db $86, $B2, $EE + +ORG $EEB286 +db $06, $8b, $00, $88, $c5, $c7, $00, $06, $ee, $03, $2e, $b2, $ee, $00, $0a, $6b +db $2c, $c8 + +ORG $EEB298 +db $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $02 + +ORG $C6E9D0 +db $98, $b2, $ee + +ORG $C6E9A3 +db $00 + +ORG $C29298 +RTL + +ORG $C6EB30 +db $1d, $03, $ff, $1b, $02, $59, $eb, $c6, $00, $1d, $0e, $ff, $01, $08, $b6, $dc +db $c7, $ff, $0a, $54, $eb, $c6 + +ORG $C6EF1F +db $03, $0A, $AB, $B2, $EE + +ORG $EEB2AB +db $01, $08, $2c, $b2, $ee, $ff, $08, $c1, $b2, $ee, $ff, $1b, $03, $e3, $b2, $ee +db $ff, $0a, $7b, $ee, $c6, $00, $1c, $05, $01, $51, $03, $1d, $03, $ff, $1b, $02 +db $de, $b2, $ee, $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03, $1f, $81 +db $ff, $ff, $02, $1f, $81, $01, $01, $02, $01, $70, $89, $9f, $a5, $57, $a2, $95 +db $50, $93, $91, $a2, $a2, $a9, $99, $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5 +db $93, $98, $51, $03, $02 + +ORG $C8B19F +db $04, $0B, $00 + +ORG $C920B8 +db $0A, $00, $B3, $EE + +ORG $EEB300 +db $1f, $21, $51, $1f, $e5, $ff, $1f, $21, $24, $1f, $e5, $ff, $1f, $ec, $ff, $06 +db $08, $1f, $b3, $ee, $ff, $1b, $03, $f3, $b3, $ee, $ff, $0A +dl ActivateCakeEnemies +db $10 +db $20, $1f, $1a, $2d, $04, $03, $1f, $16, $2d, $04, $01, $1f, $e6, $2d, $04, $10 +db $1a, $1f, $1b, $2d, $04, $18, $01, $01, $70, $89, $9f, $a5, $57, $a2, $95, $50 +db $96, $99, $9e, $91, $9c, $9c, $a9, $50, $91, $a7, $91, $9b, $95, $5e, $03, $00 +db $70, $89, $9f, $a5, $50, $a7, $95, $a2, $95, $50, $9f, $a5, $a4, $50, $96, $9f +db $a2, $50, $a1, $a5, $99, $a4, $95, $50, $91, $a7, $98, $99, $9c, $95, $5e, $5e +db $5e, $10, $0f, $50, $84, $91, $9b, $95, $50, $a4, $98, $99, $a3, $50, $91, $a3 +db $50, $91, $9e, $50, $91, $a0, $9f, $9c, $9f, $97, $a9, $50, $96, $a2, $9f, $9d +db $50, $9d, $95, $5e, $03, $1d, $03, $ff, $1b, $02, $ad, $b3, $ee, $ff, $1d, $0e +db $ff, $01, $08, $b6, $dc, $c7, $ff, $03, $1f, $81, $ff, $ff, $02, $01, $70, $89 +db $9f, $a5, $57, $a2, $95, $50, $93, $91, $a2, $a2, $a9, $99, $9e, $97, $50, $a4 +db $9f, $9f, $50, $9d, $a5, $93, $98, $50, $a3, $a4, $a5, $96, $96, $51, $03, $00 +db $70, $79, $57, $9c, $9c, $50, $98, $9f, $9c, $94, $50, $9f, $9e, $a4, $9f, $50 +db $99, $a4, $50, $96, $9f, $a2, $50, $9e, $9f, $a7, $5e, $03, $04, $ef, $03, $1f +db $81, $01, $01, $02 + +ORG $C8B226 +db $01, $01, $01 + +ORG $C8B192 +db $EF, $03 + +ORG $C8B22F +db $1d, $03, $ff, $1b, $02, $ad, $b3, $ee, $ff, $05, $ef, $03, $04, $3d, $00, $0a +db $50, $b3, $ee + +ORG $C928FB +db $01, $01 + +ORG $C92992 +db $F4, $B3, $EE + +ORG $EEB3F4 +db $01, $1f, $81, $ff, $ff, $08, $08, $b4, $ee, $ff, $1b, $03, $87, $b4, $ee, $ff +db $04, $11, $01, $02, $01, $70, $84, $98, $95, $50, $9d, $91, $a3, $a4, $95, $a2 +db $50, $98, $91, $a3, $50, $95, $9e, $a4, $a2, $a5, $a3, $a4, $95, $94, $50, $9d +db $95, $50, $a4, $9f, $50, $94, $95, $9c, $99, $a6, $95, $a2, $50, $a4, $98, $99 +db $a3, $51, $03, $1d, $03, $ff, $1b, $02, $4f, $b4, $ee, $ff, $1d, $0e, $ff, $01 +db $08, $cf, $dc, $c7, $ff, $03, $1f, $81, $ff, $ff, $02, $01, $70, $89, $9f, $a5 +db $50, $98, $91, $a6, $95, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $51, $03 +db $00, $70, $84, $98, $95, $50, $9d, $91, $a3, $a4, $95, $a2, $50, $a7, $99, $9c +db $9c, $50, $98, $9f, $9c, $94, $50, $9f, $9e, $a4, $9f, $50, $99, $a4, $5e, $04 +db $F0, $03, $03, $02 + +ORG $C9C992 +db $f0, $03, $88, $b4, $ee + +ORG $EEB488 +db $70, $89, $9f, $a5, $50, $98, $91, $a6, $95, $50, $9c, $95, $96, $a4, $50, $a4 +db $98, $99, $a3, $5e, $1d, $03, $ff, $1b, $02, $b0, $b4, $ee, $ff, $05, $f0, $03 +db $04, $11, $01, $0a, $40, $b4, $ee, $ff, $01, $70, $89, $9f, $a5, $50, $98, $91 +db $a6, $95, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $5e, $13, $02 + +ORG $6101A7 +db $0A, $C6, $B4, $EE + +ORG $EEB4C6 +db $1f, $81, $ff, $ff, $01, $08, $c5, $b4, $ee, $ff, $08, $e0, $b4, $ee, $ff, $1b +db $03, $02, $b5, $ee, $ff, $0a, $b2, $01, $61, $00, $1c, $05, $01, $51, $03, $1d +db $03, $ff, $1b, $02, $fd, $b4, $ee, $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7 +db $ff, $03, $1f, $81, $ff, $ff, $02, $1f, $81, $01, $01, $02, $01, $70, $89, $9f +db $a5, $57, $a6, $95, $50, $97, $9f, $a4, $50, $a4, $9f, $9f, $50, $9d, $a5, $93 +db $98, $50, $a3, $a4, $a5, $96, $96, $51, $13, $02 + +ORG $C8720E +db $03 + +ORG $CF6733 +db $0A, $00 + +ORG $C4FEE0 +db $02, $00, $87, $04, $a9, $9e, $7d, $04, $20, $58 + +ORG $D5F9A0 +StarstormBits: +db $02, $04 + +CharFlags: +dw $03E1, $003E2, $0010, $0068, $0417 + +ORG $CFD67D +db $62, $00, $04, $0A, $00 + +ORG $CFD685 +db $67, $32, $C9 + +ORG $C5744D +db $0A, $20, $B5, $EE + +ORG $C9327F +db $0A + +ORG $EEB520 +db $08, $32, $b5, $ee, $ff, $1b, $03, $49, $b5, $ee, $ff, $04, $d9, $03, $0a, $84 +db $32, $c9, $1d, $03, $ff, $1b, $02, $4a, $b5, $ee, $ff, $1d, $0e, $ff, $01, $08 +db $cf, $dc, $c7, $ff, $03, $1f, $81, $ff, $ff, $02, $01, $70, $77, $95, $a4, $50 +db $a2, $99, $94, $50, $9f, $96, $50, $a3, $9f, $9d, $95, $a4, $98, $99, $9e, $97 +db $5c, $50, $96, $99, $a2, $a3, $a4, $5e, $13, $1f, $81, $01, $01, $02 + +ORG $CFD682 +db $d9, $03, $01 + +ORG $CF20E2 +db $00, $00, $00;Post-pyramid door script. In case I need to flag the rock later. + +ORG $CF672F +db $00, $00 + +ORG $C576C2 +db $08, $b6, $dc, $c7, $00, $1b, $05 + +ORG $C9E510 +db $08, $cf, $dc, $c7, $00, $1b, $05 + +ORG $C9E7A0 +dl Truffle1 + +ORG $EEB56E +db $17, $79, $51, $03, $00, $70, $84, $15, $78, $91, $50, $1c, $05, $63, $50, $91 +db $16, $0e, $17, $cc, $a4, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $8a, $b5, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03, $02 + +ORG $C9E7B9 +dl Truffle2 + +ORG $EEB59A +db $17, $79, $51, $03, $00, $70, $84, $15, $78, $91, $50, $1c, $05, $63, $50, $91 +db $16, $0e, $17, $cc, $a4, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $8a, $b5, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03, $02 + +ORG $C9E7D2 +dl Truffle3 + +ORG $EEB5C6 +db $17, $79, $51, $03, $00, $70, $84, $15, $78, $91, $50, $1c, $05, $63, $50, $91 +db $16, $0e, $17, $cc, $a4, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $8a, $b5, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03, $02 + +ORG $C9E7EB +dl Truffle4 + +ORG $EEB5F2 +db $17, $79, $51, $03, $00, $70, $84, $15, $78, $91, $50, $1c, $05, $63, $50, $91 +db $16, $0e, $17, $cc, $a4, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $8a, $b5, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03, $02 + +ORG $C9E804 +dl Truffle5 + +ORG $EEB61E +db $17, $79, $51, $03, $00, $70, $84, $15, $78, $91, $50, $1c, $05, $63, $50, $91 +db $16, $0e, $17, $cc, $a4, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $8a, $b5, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03, $02 + +ORG $C9E7AA +db $01, $01, $01, $01, $01 + +ORG $C9E838 +db $02 + +ORG $EEA147 +db $0A, $4A, $B6, $EE + +ORG $EEB64A +db $1f, $81, $ff, $ff, $08, $3a, $b6, $ee, $ff, $08, $62, $b6, $ee, $ff, $1b, $03 +db $3a, $b6, $ee, $ff, $0a, $52, $a1, $ee, $1c, $05, $01, $51, $03, $1d, $03, $ff +db $1b, $02, $7f, $b6, $ee, $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03 +db $1f, $81, $ff, $ff, $02, $01, $70, $89, $9f, $a5, $57, $a6, $95, $50, $97, $9f +db $a4, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $50, $a3, $a4, $a5, $96, $96 +db $51, $1f, $81, $01, $01, $13, $02 + +ORG $C9E750 +db $0a, $57, $e7, $c9 + +ORG $C9DAB2 +db $1b, $05, $1f, $02, $74, $10, $3c, $18, $01, $01, $70, $1c, $02, $01, $50, $9c +db $16, $74, $15, $32, $9c, $95, $91, $94, $95, $a2, $15, $09, $84, $16, $74, $91 +db $16, $ef, $99, $92, $15, $15, $92, $17, $37, $50, $6c, $7f, $17, $82, $17, $93 +db $15, $1b, $83, $98, $a9, $16, $09, $5e, $6e, $03, $00, $1d, $0e, $ff, $d3 + +ORG $EE95A6 +db $70, $0a, $71, $98, $ee + +ORG $EE98AD +db $0a, $a1, $b6, $ee + +ORG $EEB6A1 +db $18, $01, $01, $1f, $81, $ff, $ff, $08, $b7, $b6, $ee, $ff, $1b, $03, $b6, $b6 +db $ee, $ff, $04, $da, $03, $02, $70, $58, $78, $95, $a9, $51, $10, $0f, $50, $84 +db $98, $95, $a2, $95, $57, $a3, $50, $91, $50, $1c, $05, $01, $50, $99, $9e, $50 +db $a4, $98, $95, $50, $93, $a5, $a0, $51, $59, $03, $1d, $03, $ff, $1b, $02, $f3 +db $b6, $ee, $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03, $1f, $81, $ff +db $ff, $02, $01, $70, $58, $72, $a5, $a4, $5c, $10, $0a, $50, $a9, $9f, $a5, $50 +db $a7, $95, $a2, $95, $50, $93, $91, $a2, $a2, $a9, $99, $9e, $97, $50, $a4, $9f +db $9f, $50, $9d, $a5, $93, $98, $50, $a3, $a4, $a5, $96, $96, $5e, $59, $03, $1f +db $81, $01, $01, $02 + +ORG $EE987A +db $01, $01, $01, $1f, $02, $44, $10, $60, $18, $01, $01, $01, $70 + +ORG $EE98BD +db $01, $70 + +ORG $EE9876 +db $B5, $98, $EE + +ORG $C9DEDA +db $0A, $25, $B7, $EE + +ORG $EEB725 +db $18, $01, $01, $1f, $81, $ff, $ff, $08, $3b, $b7, $ee, $ff, $1b, $03, $ad, $b7 +db $ee, $ff, $04, $a7, $01, $02, $70, $58, $78, $95, $a9, $51, $10, $0f, $50, $84 +db $98, $95, $a2, $95, $50, $99, $a3, $50, $91, $50, $1c, $05, $01, $50, $a5, $9e +db $94, $95, $a2, $50, $a4, $98, $95, $50, $a2, $9f, $93, $9b, $51, $59, $03, $1d +db $03, $ff, $1b, $02, $7c, $b7, $ee, $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7 +db $ff, $03, $1f, $81, $ff, $ff, $02, $01, $70, $58, $72, $a5, $a4, $5c, $10, $0a +db $50, $a9, $9f, $a5, $50, $a7, $95, $a2, $95, $50, $93, $91, $a2, $a2, $a9, $99 +db $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $50, $a3, $a4, $a5, $96 +db $96, $5e, $59, $13, $1f, $81, $01, $01, $02 + +ORG $C77612 +db $1c, $05, $01 + +ORG $EEA26A +db $0a, $ae, $b7, $ee + +ORG $EEB7AE +db $01, $1f, $81, $ff, $ff, $08, $06, $bb, $ee, $ff, $1b, $03, $ff, $ff, $ff, $ff +db $18, $04, $04, $f2, $03, $0a, $74, $a2, $ee, $70, $72, $a9, $50, $93, $9c, $95 +db $91, $a2, $99, $9e, $97, $50, $98, $99, $a3, $50, $9d, $99, $9e, $94, $5c, $10 +db $0a, $50, $1c, $02, $01, $50, $a2, $95, $9d, $95, $9d, $92, $95, $a2, $95, $94 +db $50, $a7, $98, $95, $a2, $95, $50, $98, $95, $50, $9c, $95, $96, $a4, $50, $a4 +db $98, $95, $50, $1c, $05, $01, $51, $03, $1d, $03, $ff, $1b, $02, $1E, $b8, $ee +db $ff, $1d, $0e, $ff, $01, $08, $b6, $dc, $c7, $ff, $03, $1f, $81, $ff, $ff, $02 +db $01, $70, $58, $79, $a4, $57, $a3, $50, $98, $95, $a2, $95, $50, $99, $9e, $50 +db $7d, $91, $97, $99, $93, $91, $9e, $a4, $5c, $10, $0a, $50, $a7, $99, $a4, $98 +db $50, $84, $a2, $91, $93, $a9, $5e, $59, $03, $04, $f1, $03, $1f, $81, $ff, $ff +db $02 + +ORG $C772FF +db $0a, $51, $b8, $ee + +ORG $EEB851 +db $06, $f1, $03, $61, $b8, $ee, $ff, $70, $72, $a2, $15, $5d, $0a, $04, $73, $c7 +db $70, $72, $a2, $9f, $a4, $98, $95, $a2, $51, $03, $00, $70, $79, $50, $96, $9f +db $a5, $9e, $94, $50, $a9, $9f, $a5, $a2, $50, $1c, $05, $01, $5e, $03, $00, $1d +db $03, $ff, $1b, $02, $8d, $b8, $ee, $ff, $0a, $0F, $b8, $ee, $01, $70, $72, $a5 +db $a4, $50, $a9, $9f, $a5, $57, $a6, $95, $50, $97, $9f, $a4, $50, $a4, $9f, $9f +db $50, $9d, $a5, $93, $98, $50, $a3, $a4, $a5, $96, $96, $51, $13 + +ORG $EF5917 +db $02 + +ORG $C9BC48 +db $02 + +ORG $CFBAC3 +db $24, $C0, $EE + +ORG $EEB8AE +db $06, $86, $00, $6d, $fe, $c4, $ff, $02 + +ORG $C9B9DA +db $02 + +ORG $C7F348 +db $0A, $B6, $B8, $EE + +ORG $EEB8B6 +db $04, $a9, $00, $1f, $f1, $e5, $02, $1e, $01, $0a, $f4, $f3, $c7 + +ORG $EEB8C3 +db $1f, $81, $ff, $ff, $08, $d6, $b8, $ee, $ff, $1b, $03, $be, $b8, $ee, $ff, $04 +db $e5, $03, $02, $01, $70, $84, $98, $99, $a3, $50, $1c, $05, $01, $5e, $03, $1d +db $03, $ff, $1b, $02, $f7, $b8, $ee, $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7 +db $ff, $03, $1f, $81, $ff, $ff, $02, $01, $70, $7e, $9f, $a4, $50, $9e, $9f, $a7 +db $5e, $03, $00, $70, $89, $9f, $a5, $50, $91, $a2, $95, $50, $93, $91, $a2, $a2 +db $a9, $99, $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $5e, $13, $1f +db $81, $01, $01, $02 + +ORG $EEB927 +db $70, $71, $50, $9d, $a9, $a3, $a4, $95, $a2, $99, $9f, $a5, $a3, $50, $9d, $91 +db $93, $98, $99, $9e, $95, $50, $a0, $91, $a2, $a4, $5e, $03, $00, $70, $84, $98 +db $95, $50, $a7, $9f, $a2, $94, $a3, $5c, $10, $0a, $50, $6C, $83, $7b, $89, $50 +db $82, $85, $7e, $7e, $75, $82, $50, $7d, $7b, $5e, $50, $61, $6E, $50, $91, $a2 +db $95, $50, $95, $9d, $92, $9c, $91, $aa, $9f, $9e, $95, $94, $50, $9f, $9e, $50 +db $a4, $98, $95, $50, $a3, $99, $94, $95, $5e, $13, $02 + +ORG $C551D6 +db $0a, $27, $b9, $ee + +ORG $D56812 +db $85, $76, $7f, $50, $95, $9e, $97, $99, $9e, $95, $00 + +ORG $D5682F +db $01, $00 + +ORG $D5682E +db $04 + +ORG $D568C8 +db $00, $00 + +ORG $D56971 +db $7c, $95, $a4, $a4, $95, $a2, $50, $96, $9f, $a2, $50, $84, $9f, $9e, $a9, $00 + +ORG $EEB982 +db $70, $71, $50, $9c, $95, $a4, $a4, $95, $a2, $50, $91, $94, $94, $a2, $95, $a3 +db $a3, $95, $94, $50, $a4, $9f, $50, $84, $9f, $9e, $a9, $50, $96, $a2, $9f, $9d +db $50, $91, $50, $a3, $a4, $a5, $94, $95, $9e, $a4, $50, $91, $a4, $50, $83, $9e +db $9f, $a7, $50, $87, $9f, $9f, $94, $5e, $13, $02 + +ORG $C6FDC1 +db $74, $95, $91, $a2, $50, $84, $9f, $9e, $a9, $5c, $10, $0a, $50, $a7, $95, $50 +db $a3, $98, $9f, $a5, $9c, $94, $50, $97, $95, $a4, $50, $a4, $9f, $97, $95, $a4 +db $98, $95, $a2, $50, $91, $9e, $94, $50, $a0, $9c, $91, $a9, $50, $91, $9e, $50 +db $71, $a2, $93, $98, $99, $a0, $95, $9c, $91, $97, $9f, $50, $a3, $95, $95, $94 +db $50, $a3, $9f, $9d, $95, $a4, $99, $9d, $95, $5e, $03, $00, $70, $79, $50, $a4 +db $98, $99, $9e, $9b, $50, $7d, $91, $a8, $a7, $95, $9c, $9c, $50, $a3, $91, $99 +db $94, $50, $a3, $9f, $9d, $95, $a4, $98, $99, $9e, $97, $50, $91, $92, $9f, $a5 +db $a4, $50, $99, $a4, $50, $9c, $91, $a3, $a4, $50, $9e, $99, $97, $98, $a4, $5e +db $13, $02, $7d, $a7, $91, $99, $15, $b5, $a3, $95, $15, $b2, $16, $e6, $95, $a2 +db $17, $30 + +ORG $C5549F +db $0a, $82, $b9, $ee + +ORG $C55CD7 +db $70, $71, $50, $92, $a2, $91, $a3, $a3, $50, $a0, $9f, $9c, $99, $93, $95, $9d +db $91, $9e, $57, $a3, $50, $92, $91, $94, $97, $95, $50, $92, $95, $91, $a2, $99 +db $9e, $97, $50, $a4, $98, $95, $50, $a3, $a9, $9d, $92, $9f, $9c, $50, $9f, $96 +db $50, $a4, $98, $95, $50, $7f, $9e, $95, $a4, $a4, $50, $80, $9f, $9c, $99, $93 +db $95, $50, $74, $95, $a0, $91, $a2, $a4, $9d, $95, $9e, $a4, $5e, $13, $02 + +ORG $D56EC6 +db $80, $9f, $9c, $99, $93, $95, $50, $92, $91, $94, $97, $95 + +ORG $D56EE3 +db $01, $00 + +ORG $D56F0A +db $01, $00 + +ORG $D56EED +db $7d, $99, $9e, $99, $9e, $97, $50, $a0, $95, $a2, $9d, $99, $a4, $00 + +ORG $C55D37 +db $0a, $bc, $b9, $ee + +ORG $EEB9BC +db $70, $71, $50, $aa, $9f, $9e, $99, $9e, $97, $50, $a0, $95, $a2, $9d, $99, $a4 +db $50, $91, $9c, $9c, $9f, $a7, $99, $9e, $97, $50, $a4, $98, $95, $50, $93, $9f +db $9e, $a3, $a4, $a2, $a5, $93, $a4, $99, $9f, $9e, $50, $9f, $96, $50, $91, $50 +db $9d, $99, $9e, $95, $50, $99, $9e, $50, $a4, $98, $95, $50, $74, $a5, $a3, $a4 +db $a9, $50, $74, $a5, $9e, $95, $a3, $50, $74, $95, $a3, $95, $a2, $a4, $5e, $03 +db $00, $70, $79, $a4, $50, $92, $95, $91, $a2, $a3, $50, $91, $50, $76, $9f, $a5 +db $a2, $a3, $99, $94, $95, $50, $9c, $95, $97, $99, $a3, $9c, $91, $a4, $99, $9f +db $9e, $50, $a3, $a4, $91, $9d, $a0, $50, $9f, $96, $50, $94, $a5, $92, $99, $9f +db $a5, $a3, $50, $9c, $95, $97, $99, $a4, $99, $9d, $91, $93, $a9, $5e, $13, $02 + +ORG $D57220 +db $82, $95, $a0, $95, $9c, $50, $a3, $91, $9e, $94, $a7, $99, $93, $98 + +ORG $C5601B +db $82, $95, $a0, $95, $9c, $a3, $50, $a9, $9f, $a5, $a2, $50, $95, $9e, $95, $9d +db $99, $95, $a3 + +ORG $C5605E +db $82, $95, $a0, $95, $9c, $a3, $50, $a9, $9f, $a5, $a2, $50, $95, $9e, $95, $9d +db $99, $95, $a3 + +ORG $D57247 +db $82, $95, $a0, $95, $9c, $50, $a3, $a5, $a0, $95, $a2, $a7, $99, $93, $98, $00 + +ORG $D5F955 +db $08, $54, $95, $ee, $ff, $18, $04, $02 + +ORG $C862BE +db $50, $91, $50, $1c, $05, $01 + +ORG $00FFD7 +db $12 + +ORG $FFEEEE +db $A4 + +ORG $FFFFFF +db $A4 + +;db "how come inserting some random ass data into the game makes bsdiff respect my tokens" PUT THIS BACK WHEN PATCHING + +ORG $EEBA50 +db $70, $58, $78, $95, $a9, $51, $10, $0f, $50, $84, $98, $95, $a2, $95, $50, $99 +db $a3, $50, $91, $50, $1c, $05, $01, $50, $9f, $9e, $50, $a4, $98, $95, $50, $a3 +db $98, $95, $9c, $96, $51, $59, $03, $0a, $6e, $7e, $c8 + +ORG $C87E4C +db $0a, $50, $ba, $ee + +ORG $EEBA80 +db $a4, $16, $55, $50, $1c, $05, $01, $5e, $0a, $bc, $19, $c8 + +ORG $C819B8 +db $0a, $80, $ba, $ee + +ORG $EEBA8D +db $50, $91, $50, $1c, $05, $01, $50, $9f, $15, $7a, $0a, $94, $31, $c9 + +ORG $C9318F +db $0a, $8d, $ba, $ee + +ORG $CF2095 +db $93, $20, $cf + +ORG $CF61D5 +db $D1, $80;Music flag for the lilliput void + +ORG $CF2099 +dw $01D9 + + +ORG $D6FAA0 +MoveItemNames: +PHB +PHA +PHX +PHY +XBA +SEP #$10 +TAX +PHX +LDA #$0000 +CheckDataNum: +CPX #$00 +BEQ PullData +DEX +CLC +ADC #$0080 +BRA CheckDataNum +PullData: +REP #$10 +CLC +TAX +LDA #$007F +LDY #$FF80 +MVN $FF7E +SEP #$10 +PLX +LDA #$0000 +CheckNameIndex: +CPX #$00 +BEQ PullPlayerName +DEX +CLC +ADC #$0030 +BRA CheckNameIndex +PullPlayerName: +REP #$10 +CLC +ADC #$8000 +TAX +LDA #$002F +LDY #$FF50 +MVN $FF7E +PLY +PLX +PLA +PLB +RTL + +FindMovData: +LDA [$06] +STA $0E +JSL MoveItemNames +JML GotMovData +; A far copy of $C19216 + + + R_Peek_Parameter_Bytes: +rep #$31 +phd +tdc +adc #$ffee +tcd +; First things first: get the text pointer +lda $97b8 +sta $00 +asl ; 2 +adc $00 ; 3 +asl ; 6 +asl ; 12 +adc $00 ; 13 +asl ; 26 +adc $00 ; 27 +; We now have [0x97b8] * 27 in A. +sta $00 +; Load the text pointer from the table at 0x7E96AA into 0xE. +tax +lda $96aa,x +sta $0e +lda $96ac,x +sta $10 +; Load amount into X. Also store into 0x02 for later use +sty $02 +tyx +; The memcpy routine copies words. If we have an odd number of +; bytes, it will round down. We add 1 so that it effectively rounds up. +inx +lda #$97ba +; Copy it: X bytes from [0x0e] to (A). +jsl $c08ed2 +; Zero out upper bytes of cc_argv +ldy $02 +tya +lsr ; Get lower order bit in carry, and branch if 0 +lda #$0000 +bcc .aligned +; Align Y to next word +sep #$20 +sta $97ba,y +rep #$31 +bra .unaligned +.loop: +sta $97ba,y +iny +.unaligned: +iny +.aligned: +cpy #$0016 +bmi .loop +.end: +pld +rtl + +RepelEnemies: +REP #$31 +DEC +TAY +CMP #$000A +BEQ CheckRepels +CheckNormal: +JML ExitRepelCheck +CheckRepels: +PHA +LDA $9E3C +BEQ RepelsEmpty +PLA +JML ExitRepelCheck_ForceFlagOn +RepelsEmpty: +PLA +BRA CheckNormal + +ORG $C57675 +db $0a, $9b, $ba, $ee + +ORG $EEBA9B +db $50, $1c, $05, $01, $0a, $79, $76, $c5 + +ORG $C6DD98 +db $50, $70, $78, $95, $a2, $95, $57, $a3, $50, $9d, $a9, $50, $9c, $a5, $93, $9b +db $a9, $50, $1c, $05, $01, $5e, $10, $0f, $50, $79, $50, $98, $91, $a6, $95, $50 +db $9f, $9e, $9c, $a9, $50, $a5, $a3, $95, $94, $50, $99, $a4, $50, $9f, $9e, $93 +db $95, $50, $a3, $99, $9e, $93, $95, $50, $a4, $98, $95, $50, $9c, $91, $a3, $a4 +db $50, $a7, $91, $a3, $98, $99, $9e, $97, $5e, $03, $00, $0a, $2c, $de, $c6 + +ORG $C6E9A7 +db $1c, $05, $01, $0a, $b9, $e9, $c6 + +ORG $C8ABB4 +db $91, $50, $1c, $05, $01, $0a, $c8, $ab, $c8 + +ORG $C6C05F +db $1c, $05, $01, $0a, $66, $c0, $c6 + +ORG $C60E49 +db $70, $87, $98, $91, $a4, $50, $91, $a2, $95, $50, $a9, $9f, $a5, $50, $94, $9f +db $99, $9e, $97, $50, $99, $9e, $50, $9d, $a9, $50, $93, $91, $a6, $95, $6f, $03 +db $00, $70, $84, $91, $9b, $95, $50, $a4, $98, $99, $a3, $50, $1c, $05, $01, $50 +db $91, $9e, $94, $50, $9c, $95, $91, $a6, $95, $5e, $03, $0a, $dc, $0f, $c6 + +ORG $C9820F +db $a4, $98, $95, $50, $1c, $05, $01, $5e, $0a, $26, $82, $c9 + +ORG $EEAF08 +db $0a, $a3, $ba, $ee + +ORG $EEBAA3 +db $08, $4b, $ba, $ee, $ff, $08, $b8, $ba, $ee, $ff, $1b, $03, $4b, $ba, $ee, $ff +db $0a, $1a, $af, $ee, $ff, $1c, $05, $01, $51, $03, $1d, $03, $ff, $1b, $02, $d5 +db $ba, $ee, $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03, $1f, $81, $ff +db $ff, $02, $00, $70, $89, $9f, $a5, $50, $98, $91, $a6, $95, $50, $a4, $9f, $9f +db $50, $9d, $a5, $93, $98, $50, $9a, $a5, $9e, $9b, $5e, $13, $1f, $81, $01, $01 +db $02 + +ORG $EEBAF4 +db $01, $0a, $52, $a7, $ee + +ORG $EEBAFE +db $01, $0a, $cc, $a7, $ee + +ORG $EEAE84 +db $01, $08, $3e, $f8, $d5, $01, $01 + +ORG $C1F72F +;LDA #$00FF + +ORG $C1F74A +;LDA #$00FF + +ORG $C1F765 +;LDA #$00FF + +ORG $C1F780 +;LDA #$00FF + +;ORG $C1F72A +;LDA #$AF10;Flavor pointer + +ORG $C1FE8A +LDA #$1FB8 + +ORG $C1FE90 +LDA #$0450 + +ORG $C4FD70 +db $FF, $FF, $FF + +ORG $EEBB03 +db $18, $04, $02 + +ORG $EEBB06 +db $18, $01, $01, $0A, $C7, $B7, $EE + +ORG $C7DFE9 +db $0A, $0D, $BB, $EE + +;Magicant stat boosts +ORG $EEBB0D +db $1d, $19, $02, $1b, $03, $31, $bb, $ee, $ff, $1d, $19, $03, $1b, $03, $c5, $bb +db $ee, $ff, $1d, $19, $04, $1b, $03, $9d, $bc, $ee, $ff, $1d, $19, $05, $1b, $03 +db $a4, $bd, $ee, $ff, $18, $01, $01, $19, $10, $01, $1b, $04, $70, $1c, $02, $00 +db $08, $ea, $fb, $d6, $ff, $00, $70, $19, $10, $01, $1b, $04, $08, $67, $fc, $d6 +db $ff, $00, $70, $19, $10, $01, $1b, $04, $08, $e9, $fc, $d6, $ff, $00, $70, $19 +db $10, $01, $1b, $04, $08, $62, $fd, $d6, $ff, $00, $70, $19, $10, $01, $1b, $04 +db $08, $e1, $fd, $d6, $ff, $00, $70, $19, $10, $01, $1b, $04, $08, $5b, $fe, $d6 +db $ff, $00, $70, $19, $10, $01, $1b, $04, $08, $d6, $fe, $d6, $ff, $00, $70, $19 +db $10, $01, $1b, $04, $08, $4f, $ff, $d6, $ff, $18, $04, $1f, $41, $0e, $10, $1e +db $18, $01, $0e, $70, $1c, $02, $01, $50, $97, $91, $99, $9e, $95, $94, $50, $62 +db $60, $60, $5c, $60, $60, $60, $50, $95, $a8, $a0, $5e, $03, $1e, $09, $01, $40 +db $d0, $03, $00, $18, $04, $10, $13, $02, $18, $01, $01, $19, $10, $01, $1b, $04 +db $70, $1c, $02, $00, $08, $ea, $fb, $d6, $ff, $00, $70, $19, $10, $02, $1b, $04 +db $08, $67, $fc, $d6, $ff, $00, $70, $19, $10, $01, $1b, $04, $08, $e9, $fc, $d6 +db $ff, $00, $70, $19, $10, $02, $1b, $04, $08, $62, $fd, $d6, $ff, $00, $70, $19 +db $10, $01, $1b, $04, $08, $e1, $fd, $d6, $ff, $00, $70, $19, $10, $02, $1b, $04 +db $08, $5b, $fe, $d6, $ff, $00, $70, $19, $10, $01, $1b, $04, $08, $d6, $fe, $d6 +db $ff, $00, $70, $19, $10, $02, $1b, $04, $08, $4f, $ff, $d6, $ff, $18, $04, $1f +db $41, $0e, $10, $1e, $18, $01, $0e, $70, $1c, $02, $01, $50, $91, $9e, $94, $50 +db $19, $10, $02, $1b, $04, $1c, $02, $00, $50, $97, $91, $99, $9e, $95, $94, $50 +db $61, $60, $60, $5c, $60, $60, $60, $50, $95, $a8, $a0, $5e, $03, $1e, $09, $01 +db $a0, $86, $01, $00, $19, $10, $02, $1b, $04, $09, $04, $ff, $ff, $ff, $ff, $79 +db $bc, $ee, $22, $85, $bc, $ee, $33, $91, $bc, $ee, $44, $02, $1e, $09, $02, $a0 +db $86, $01, $00, $18, $04, $10, $13, $02, $1e, $09, $03, $a0, $86, $01, $00, $18 +db $04, $10, $13, $02, $1e, $09, $04, $a0, $86, $01, $00, $18, $04, $10, $13, $02 +db $18, $01, $01, $19, $10, $01, $1b, $04, $70, $1c, $02, $00, $08, $ea, $fb, $d6 +db $ff, $00, $70, $19, $10, $02, $1b, $04, $08, $67, $fc, $d6, $ff, $00, $70, $19 +db $10, $03, $1b, $04, $08, $e9, $fc, $d6, $ff, $00, $70, $19, $10, $01, $1b, $04 +db $08, $62, $fd, $d6, $ff, $00, $70, $19, $10, $02, $1b, $04, $08, $e1, $fd, $d6 +db $ff, $00, $70, $19, $10, $03, $1b, $04, $08, $5b, $fe, $d6, $ff, $00, $70, $19 +db $10, $01, $1b, $04, $08, $d6, $fe, $d6, $ff, $00, $70, $19, $10, $02, $1b, $04 +db $08, $4f, $ff, $d6, $ff, $18, $04, $1f, $41, $0e, $10, $1e, $18, $01, $0e, $70 +db $75, $a6, $95, $a2, $a9, $9f, $9e, $95, $50, $97, $91, $99, $9e, $95, $94, $50 +db $66, $66, $5c, $60, $60, $60, $50, $95, $a8, $a0, $5e, $03, $1e, $09, $01, $d0 +db $01, $01, $00, $19, $10, $02, $01, $01, $09, $04, $ff, $ff, $ff, $ff, $47, $bd +db $ee, $11, $53, $bd, $ee, $22, $5f, $bd, $ee, $33, $1e, $09, $02, $d0, $01, $01 +db $00, $0a, $6b, $bd, $ee, $ff, $1e, $09, $03, $d0, $01, $01, $00, $0a, $6b, $bd +db $ee, $ff, $1e, $09, $04, $d0, $01, $01, $00, $0a, $6b, $bd, $ee, $ff, $19, $10 +db $03, $09, $04, $ff, $ff, $ff, $ff, $80, $bd, $ee, $22, $8c, $bd, $ee, $33, $98 +db $bd, $ee, $44, $1e, $09, $02, $d0, $01, $01, $00, $18, $04, $10, $13, $02, $1e +db $09, $03, $d0, $01, $01, $00, $18, $04, $10, $13, $02, $1e, $09, $04, $d0, $01 +db $01, $00, $18, $04, $10, $13, $02, $18, $01, $01, $70, $1c, $02, $01, $08, $ea +db $fb, $d6, $ff, $00, $70, $19, $10, $02, $1b, $04, $08, $67, $fc, $d6, $ff, $00 +db $70, $19, $10, $03, $1b, $04, $08, $e9, $fc, $d6, $ff, $00, $70, $19, $10, $04 +db $1b, $04, $08, $62, $fd, $d6, $ff, $00, $70, $19, $10, $01, $1b, $04, $08, $e1 +db $fd, $d6, $ff, $00, $70, $19, $10, $02, $1b, $04, $08, $5b, $fe, $d6, $ff, $00 +db $70, $19, $10, $03, $1b, $04, $08, $d6, $fe, $d6, $ff, $00, $70, $19, $10, $04 +db $1b, $04, $08, $4f, $ff, $d6, $ff, $18, $04, $1f, $41, $0e, $10, $1e, $18, $01 +db $0e, $70, $75, $a6, $95, $a2, $a9, $9f, $9e, $95, $50, $97, $91, $99, $9e, $95 +db $94, $50, $65, $60, $5c, $60, $60, $60, $50, $95, $a8, $a0, $5e, $03, $1e, $09 +db $01, $50, $c3, $00, $00, $1e, $09, $02, $50, $c3, $00, $00, $1e, $09, $03, $50 +db $c3, $00, $00, $1e, $09, $04, $50, $c3, $00, $00, $00, $18, $04, $10, $13, $02 + +ORG $D6FBEA +db $50, $a7, $91, $a3, $50, $96, $99, $9c, $9c, $95, $94, $50, $a7, $99, $a4, $98 +db $50, $a4, $98, $95, $50, $80, $9f, $a7, $95, $a2, $50, $9f, $96, $50, $a4, $98 +db $95, $50, $77, $99, $91, $9e, $a4, $50, $83, $a4, $95, $a0, $51, $03, $00, $70 +db $1c, $02, $00, $57, $a3, $50, $83, $a0, $95, $95, $94, $50, $99, $9e, $93, $a2 +db $95, $91, $a3, $95, $94, $50, $92, $a9, $50, $65, $51, $1f, $02, $28, $1e, $0c +db $00, $05, $03, $00, $70, $1c, $02, $00, $57, $a3, $50, $86, $99, $a4, $91, $9c +db $99, $a4, $a9, $50, $99, $9e, $93, $a2, $95, $91, $a3, $95, $94, $50, $92, $a9 +db $50, $65, $51, $1f, $02, $28, $1e, $0d, $00, $05, $03, $02, $02, $1c, $02, $00 +db $50, $a7, $91, $a3, $50, $96, $99, $9c, $9c, $95, $94, $50, $a7, $99, $a4, $98 +db $50, $a4, $98, $95, $50, $80, $9f, $a7, $95, $a2, $50, $9f, $96, $50, $a4, $98 +db $95, $50, $7c, $99, $9c, $9c, $99, $a0, $a5, $a4, $50, $83, $a4, $95, $a0, $a3 +db $51, $03, $00, $70, $1c, $02, $00, $57, $a3, $50, $77, $a5, $a4, $a3, $50, $99 +db $9e, $93, $a2, $95, $91, $a3, $95, $94, $50, $92, $a9, $50, $65, $51, $1f, $02 +db $28, $1e, $0b, $00, $05, $03, $00, $70, $1c, $02, $00, $57, $a3, $50, $86, $99 +db $a4, $91, $9c, $99, $a4, $a9, $50, $99, $9e, $93, $a2, $95, $91, $a3, $95, $94 +db $50, $92, $a9, $50, $65, $51, $1f, $02, $28, $1e, $0d, $00, $05, $03, $02, $1c +db $02, $00, $50, $a7, $91, $a3, $50, $96, $99, $9c, $9c, $95, $94, $50, $a7, $99 +db $a4, $98, $50, $a4, $98, $95, $50, $80, $9f, $a7, $95, $a2, $50, $9f, $96, $50 +db $a4, $98, $95, $50, $7d, $99, $9c, $9b, $a9, $50, $87, $95, $9c, $9c, $51, $03 +db $00, $70, $1c, $02, $00, $57, $a3, $50, $83, $a0, $95, $95, $94, $50, $99, $9e +db $93, $a2, $95, $91, $a3, $95, $94, $50, $92, $a9, $50, $65, $51, $1f, $02, $28 +db $1e, $0c, $00, $05, $03, $00, $70, $1c, $02, $00, $57, $a3, $50, $79, $81, $50 +db $99, $9e, $93, $a2, $95, $91, $a3, $95, $94, $50, $92, $a9, $50, $65, $51, $1f +db $02, $28, $1e, $0a, $00, $05, $03, $02, $1c, $02, $00, $50, $a7, $91, $a3, $50 +db $96, $99, $9c, $9c, $95, $94, $50, $a7, $99, $a4, $98, $50, $a4, $98, $95, $50 +db $80, $9f, $a7, $95, $a2, $50, $9f, $96, $50, $a4, $98, $95, $50, $7d, $91, $97 +db $9e, $95, $a4, $50, $78, $99, $9c, $9c, $51, $03, $00, $70, $1c, $02, $00, $57 +db $a3, $50, $86, $99, $a4, $91, $9c, $99, $a4, $a9, $50, $99, $9e, $93, $a2, $95 +db $91, $a3, $95, $94, $50, $92, $a9, $50, $65, $51, $1f, $02, $28, $1e, $0d, $00 +db $05, $03, $00, $70, $1c, $02, $00, $57, $a3, $50, $7c, $a5, $93, $9b, $50, $99 +db $9e, $93, $a2, $95, $91, $a3, $95, $94, $50, $92, $a9, $50, $65, $51, $1f, $02 +db $28, $1e, $0e, $00, $05, $03, $02, $1c, $02, $00, $50, $a7, $91, $a3, $50, $96 +db $99, $9c, $9c, $95, $94, $50, $a7, $99, $a4, $98, $50, $a4, $98, $95, $50, $80 +db $9f, $a7, $95, $a2, $50, $9f, $96, $50, $a4, $98, $95, $50, $82, $91, $99, $9e +db $a9, $50, $73, $99, $a2, $93, $9c, $95, $51, $03, $00, $70, $1c, $02, $00, $57 +db $a3, $50, $77, $a5, $a4, $a3, $50, $99, $9e, $93, $a2, $95, $91, $a3, $95, $94 +db $50, $92, $a9, $50, $65, $51, $1f, $02, $28, $1e, $0b, $00, $05, $03, $00, $70 +db $1c, $02, $00, $57, $a3, $50, $79, $81, $50, $99, $9e, $93, $a2, $95, $91, $a3 +db $95, $94, $50, $92, $a9, $50, $65, $51, $1f, $02, $28, $1e, $0a, $00, $05, $03 +db $02, $1c, $02, $00, $50, $a7, $91, $a3, $50, $96, $99, $9c, $9c, $95, $94, $50 +db $a7, $99, $a4, $98, $50, $a4, $98, $95, $50, $80, $9f, $a7, $95, $a2, $50, $9f +db $96, $50, $a4, $98, $95, $50, $80, $99, $9e, $9b, $50, $73, $9c, $9f, $a5, $94 +db $51, $03, $00, $70, $1c, $02, $00, $57, $a3, $50, $83, $a0, $95, $95, $94, $50 +db $99, $9e, $93, $a2, $95, $91, $a3, $95, $94, $50, $92, $a9, $50, $65, $51, $1f +db $02, $28, $1e, $0c, $00, $05, $03, $00, $70, $1c, $02, $00, $57, $a3, $50, $77 +db $a5, $a4, $a3, $50, $99, $9e, $93, $a2, $95, $91, $a3, $95, $94, $50, $92, $a9 +db $50, $65, $51, $1f, $02, $28, $1e, $0b, $00, $05, $03, $02, $1c, $02, $00, $50 +db $a7, $91, $a3, $50, $96, $99, $9c, $9c, $95, $94, $50, $a7, $99, $a4, $98, $50 +db $a4, $98, $95, $50, $80, $9f, $a7, $95, $a2, $50, $9f, $96, $50, $a4, $98, $95 +db $50, $7c, $a5, $9d, $99, $9e, $95, $50, $78, $91, $9c, $9c, $51, $03, $00, $70 +db $1c, $02, $00, $57, $a3, $50, $7c, $a5, $93, $9b, $50, $99, $9e, $93, $a2, $95 +db $91, $a3, $95, $94, $50, $92, $a9, $50, $65, $51, $1f, $02, $28, $1e, $0e, $00 +db $05, $03, $00, $70, $1c, $02, $00, $57, $a3, $50, $79, $81, $50, $99, $9e, $93 +db $a2, $95, $91, $a3, $95, $94, $50, $92, $a9, $50, $65, $51, $1f, $02, $28, $1e +db $0a, $00, $05, $03, $02, $1c, $02, $00, $50, $a7, $91, $a3, $50, $96, $99, $9c +db $9c, $95, $94, $50, $a7, $99, $a4, $98, $50, $a4, $98, $95, $50, $80, $9f, $a7 +db $95, $a2, $50, $9f, $96, $50, $a4, $98, $95, $50, $76, $99, $a2, $95, $50, $83 +db $a0, $a2, $99, $9e, $97, $51, $03, $00, $70, $1c, $02, $00, $57, $a3, $50, $83 +db $a0, $95, $95, $94, $50, $99, $9e, $93, $a2, $95, $91, $a3, $95, $94, $50, $92 +db $a9, $50, $65, $51, $1f, $02, $28, $1e, $0c, $00, $05, $03, $00, $70, $1c, $02 +db $00, $57, $a3, $50, $7c, $a5, $93, $9b, $50, $99, $9e, $93, $a2, $95, $91, $a3 +db $95, $94, $50, $92, $a9, $50, $65, $51, $1f, $02, $28, $1e, $0e, $00, $05, $03 +db $02 + +ORG $EEBE58 +db $1f, $02, $74, $10, $3c, $18, $04, $1f, $02, $66, $10, $64, $18, $01, $01, $18 +db $01, $01, $70, $58, $84, $95, $9e, $94, $91, $50, $73, $98, $99, $95, $96, $50 +db $97, $9f, $a4, $50, $a4, $98, $95, $50, $0A, $6A, $C6, $EE, $59, $03, $0a, $ed +db $da, $c9 + +ORG $C9DAB4 +db $0A, $58, $BE, $EE + +ORG $EEA9AF +db $0A, $9A, $BE, $EE + +ORG $EEBE8A +db $50, $99, $9e, $50, $a4, $98, $95, $50, $a3, $a4, $91, $a4, $a5, $95, $57, $a3 +db $50, $95, $a9, $95, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $c0, $a9, $ee, $ff +db $0a, $b6, $a9, $ee + +ORG $EEBEAE +db $1d, $03, $ff, $1b, $02, $25, $eb, $c7, $ff, $0a, $00, $ea, $c7, $1d, $03, $ff +db $1b, $02, $25, $eb, $c7, $ff, $0a, $00, $ea, $c7 + +ORG $C6053B +db $91, $50, $1c, $05, $01, $50, $0a, $45, $05, $c6 + +ORG $C9E3E7 +db $0A, $C8, $BE, $EE + +ORG $EEBEC8 +db $15, $6c, $6f, $51, $03, $00, $70, $79, $57, $9c, $9c, $50, $97, $99, $a6, $95 +db $50, $a9, $9f, $a5, $50, $9d, $a9, $50, $1c, $05, $01, $51, $01, $0a, $ec, $e3 +db $c9 + +ORG $C7EA80 +db $0A, $2F, $C0, $EE +;fix +ORG $EEC02F +db $06, $ad, $00, $ff, $ff, $ff, $ff, $06, $ac, $00, $51, $C0, $ee, $ff, $06, $ab +db $00, $5E, $C0, $ee, $ff, $1d, $03, $ff, $1b, $02, $25, $eb, $c7, $ff, $0a, $89 +db $ea, $c7, $1d, $03, $ff, $1b, $02, $25, $eb, $c7, $ff, $0a, $89, $ea, $c7, $1d +db $03, $ff, $1b, $02, $25, $eb, $c7, $ff, $0a, $89, $ea, $c7 + +ORG $EEAFB4 +db $0A, $04, $BF, $EE + +ORG $EEAFBC +db $01 + +ORG $EEBF04 +db $1d, $03, $ff, $1b, $02, $bc, $af, $ee, $ff, $0a, $c2, $af, $ee + +ORG $EEBF11 +db $06, $2C, $01, $81, $bf, $ee, $ff, $18, $01, $01, $70, $58, $87, $98, $9f, $91 +db $98, $51, $10, $0f, $50, $84, $98, $95, $a2, $95, $57, $a3, $50, $91, $50, $aa +db $9f, $9d, $92, $99, $95, $50, $94, $9f, $99, $9e, $97, $50, $99, $a3, $9f, $9d +db $95, $a4, $a2, $99, $93, $50, $95, $a8, $95, $a2, $93, $99, $a3, $95, $a3, $50 +db $9f, $9e, $50, $a4, $98, $95, $50, $95, $9e, $a4, $a2, $91, $9e, $93, $95, $51 +db $03, $00, $70, $72, $95, $a4, $a4, $95, $a2, $50, $93, $9f, $9d, $95, $50, $92 +db $91, $93, $9b, $50, $9c, $91, $a4, $95, $a2, $5e, $5e, $5e, $59, $13, $18, $04 +db $02 + +ORG $CF0CF8 +db $11, $bf, $ee, $ff, $2C, $81 + +ORG $C887F5 +db $00, $00, $00 + +ORG $C88840 +db $00, $00, $00 + +ORG $EEB53B +db $0A, $9C, $BF, $EE + +ORG $EEB498 +db $0A, $82, $BF, $EE + +ORG $EEBF82 +db $98, $99, $a3, $50, $1c, $05, $01, $5e, $03, $0a, $9c, $b4, $ee + +ORG $EEB432 +db $0A, $8F, $BF, $EE + +ORG $EEBF8F +db $98, $99, $a3, $50, $1c, $05, $01, $51, $03, $0a, $37, $b4, $ee + +ORG $EEBF9C +db $01, $70, $79, $a4, $57, $a3, $50, $91, $50, $1c, $05, $01, $5e, $03, $1d, $0e +db $ff, $01, $0a, $3f, $b5, $ee + +ORG $EEB37E +db $0A, $B2, $BF, $EE + +ORG $EEBFB2 +db $1c, $05, $01, $50, $91, $a3, $50, $91, $0a, $82, $b3, $ee + +ORG $EEB082 +db $0A, $BE, $BF, $EE + +ORG $EEBFBE +db $01, $01, $01, $0a, $40, $a7, $ee + +ORG $EEB09C +db $0A, $C5, $BF, $EE + +ORG $EEBFC5 +db $01, $01, $01, $0a, $40, $a7, $ee + +ORG $EEB0B6 +db $0A, $CC, $BF, $EE + +ORG $EEBFCC +db $01, $01, $01, $0a, $40, $a7, $ee + +ORG $EEB0D0 +db $0A, $D3, $BF, $EE + +ORG $EEBFD3 +db $01, $01, $01, $0a, $40, $a7, $ee + +ORG $EEB26F +db $0A, $DA, $BF, $EE + +ORG $EEBFDA +db $18, $01, $01, $70, $58, $79, $a4, $57, $a3, $50, $91, $50, $1c, $05, $01, $5e +db $59, $03, $1d, $0e, $ff, $01, $0a, $76, $b2, $ee + +ORG $EFFB66 +GetStartingNames: +PHB +PHX +PHY +LDA $D7FCD0 +STA $9831 +LDA $D7FCD2 +STA $9833 +LDA #$0017 +LDX #$FCE0 +LDY #$9801 +MVN $D77E +PLY +PLX +PLB +JML GiveTeddyOnLoad + +ResetStatus: +STZ $9A3B +STZ $9A9A +STZ $9AF9 +JML $C4C7D4 + +ResetGame: +JSL $C087CE +ResetRoutine: +STZ $F640 +ResetTimer: +INC $F640 +LDA $F640 +CMP #$FFFF +BEQ EndReset +BRA ResetTimer +EndReset: +INC $F642 +LDA $F642 +CMP #$0005 +BEQ ReallyReset +BRA ResetRoutine +ReallyReset: +REP #$20 +LDA #$0000 +TCD +LDA #$01FF +TCS +LDA #$0000 +LDX #$0000 +LDY #$0000 +CLC +XCE +SEP #$35 +REP #$CA +JML $C08000 + +ClearStorageMenu: +JSL $EF0115 +LDA $8958 +AND #$00FF +CMP #$000D +BNE EndStorageCheck2 +PHY +JSL $C3E7E3 +JSL $C1DD53 +PLY +EndStorageCheck2: +RTL + +AutoText: +LDA $0069 +AND #$4000;Is Y held? +BEQ .HoldY +RTL +.HoldY: +LDA $006D +AND #$E0A0 +RTL + +LostScriptedFight: +STZ $5D98 +LDA #$0001 +PLD +RTL + +ClearNameOnBattle: +LDA #$0001 +STA $5D98 +STZ $B573 +RTL +;;;;;;;;;;;;;;;; +;Franklin badge stuff +ReflectSpecial: +LDX #$00FF +LDA $12 +PHA +PHX +JSR CheckFranklinBadge +CMP #$0000 +BEQ .Reflect +JSR ReflectAttack +.Reflect: +PLX +PLA +JML $C2954E + +ReflectFire: +LDA $0E +PHA +LDA $0F +PHA +JSR CheckFranklinBadge +CMP #$0000 +BEQ .Reflect +JSR ReflectAttack +.Reflect: +PLA +STA $0F +PLA +STA $0E +LDX $A972 +LDA $003A,X +JML $C2959D + +ReflectFreeze: +LDA $0E +PHA +LDA $0F +PHA +JSR CheckFranklinBadge +CMP #$0000 +BEQ .Reflect +JSR ReflectAttack +.Reflect: +PLA +STA $0F +PLA +STA $0E +LDX $A972 +LDA $0038,X +JML $C295FA + +ReflectFireBall: +LDA $0E +PHA +LDA $0F +PHA +JSR CheckFranklinBadge +CMP #$0000 +BEQ .Reflect +JSR ReflectAttack +.Reflect: +PLA +STA $0F +PLA +STA $0E +LDX $A972 +LDA $003A,X +AND #$00FF +JML $C29024 + +ReflectFlash: +LDA $0E +PHA +LDA $0F +PHA +JSR CheckFranklinBadge +CMP #$0000 +BEQ .Reflect +LDA $B58A +AND #$00FF +BNE ReflectPrayClear +JSR ReflectAttack +.Reflect: +ReflectFlash.Reflect: +PLA +STA $0F +PLA +STA $0E +LDX $A972 +SEP #$20 +JML $C298BB +ReflectPrayClear: +STZ $B58A +BRA ReflectFlash.Reflect + +ReflectStarstorm: +CMP #$0000 +BNE StarstormEnd +LDA $0E +PHA +LDA $0F +PHA +JSR CheckFranklinBadge +CMP #$0000 +BEQ .Reflect +JSR ReflectAttack +.Reflect: +PLA +STA $0F +PLA +STA $0E +JML $C29A95 +StarstormEnd: +JML $C29AA4 + +ReflectExplode: +PHX +LDA $0E +PHA +LDA $0F +PHA +JSR CheckFranklinBadge +CMP #$0000 +BEQ .Reflect +JSR ReflectAttack +SEP #$20 +LDA #$02 +STA $AA96 +REP #$20 +.Reflect: +PLA +STA $0F +PLA +STA $0E +LDA #$0000 +STA $04 +PLX +JML $C2A66B + +CheckFranklinBadge: +LDX $A972 +REP #$20 +LDA $000E,X +AND #$00FF +BNE NotPlayerChar +LDX #$0001 +STX $16 +LDX $A972 +LDA $0010,X +AND #$00FF +INC +LDX $16 +JSL $C45683 +RTS +NotPlayerChar: +LDA #$0000 +RTS + +ReflectAttack: +;LDA $AA96 +;AND #$00FF +;BNE SkipReflect +LDA #$7160 +STA $0E +LDA #$00EF +STA $10 +JSL $C1DC1C +LDA #$0001 +STA $AA96 +JSL DealReflect +RTS +SkipReflect: +STZ $AA96 +SkipSuperreflect: +RTS + +SkipExplosionDeathReflect: +LDA $AA90; Is death attack? +AND #$00FF +BEQ .ForceExplode +LDA $AA96 +AND #$00FF +CMP #$0002 +BEQ .SkipExplode; Is already reflected +.ForceExplode +LDA $1A +JML ExplodeReturn +.SkipExplode: +JML $C2A6A9 +;;;;;;;;;;;;;;;;; +CopyAPData: +JSL $EF0C15 +PHA +PHX +PHB +LDY #$0000 +LDX $16 +.CheckCurFile: +LDA #$7E00 +.CheckZero: +CPX #$0000 +BEQ .GotSaveDest +CLC +ADC #$0010 +DEX +BRA .CheckZero +.GotSaveDest +CPY #$0001 +BEQ .PerformCopy +PHA +LDA $B4A1 +AND #$00FF +TAX +INY +BRA .CheckCurFile +.PerformCopy: +TAX +PLA +TAY +LDA #$000F +MVN $2020 +PLB +PLX +PLA +RTL + +DeleteAPData: +JSL $EF0BFA +LDA $B4A1 +AND #$00FF +TAX +LDA #$7E00 +.CheckSave: +CPX #$0000 +BEQ .GotSave +CLC +ADC #$0010 +DEX +BRA .CheckSave +.GotSave: +PHX +PHY +PHB +TAY +LDX #$FF70 +LDA #$000F +MVN $FF20 +PLB +PLY +PLX +RTL + +PlayerJustDied: +SEP #$20 +LDA $B582; If the player just died in battle, dont send any more deaths +BNE SkipSendingDeath +;In this case, we died on the overworld +INC $B582;Player is currently dead +LDA $B583;Did the player just get killed by a deathlink death? +BNE SkipSendingDeath +INC $B584;Tell the serveer we died +SkipSendingDeath: +STZ $B583 +REP #$20 +JSL $C4C718 +RTL + +CheckDeathHealing: +PHX +PHY +LDX $A972 +LDA $000E,X +AND #$00FF +BNE NotHealPlayer;1 if enemy +LDA $B583;Deathlink from server- if mortal mode, this will always return 1 if the death was from a link +AND #$00FF +BEQ ResetDeathLinkHeal;Mortal no mercy mode will put this here; else, it will be a BRA +PLY +PLX +STY $16 +TYX +LDA $02 +JML $C272D0 +NotHealPlayer: +PLY +PLX +STY $16 +TYX +LDA $02 +JML $C272CD +ResetDeathLinkHeal: +SEP #$20 +STZ $B583;This means that the player healed, and the death is not solely from the deathlink anymore +REP #$20 +BRA NotHealPlayer + +OverrideDeathlinkText: +LDX $A972 +LDA $000E,X +AND #$00FF +BNE .NotPlayer +LDA $B583; +AND #$0FF +BEQ .NotPlayer;If the player is not currently in a deathlink, act normal. This will be a BRA if mercy mode is ON +LDA #$CD0C +STA $0E +LDA #$00EE +STA $10 +JML $C272E4 +.NotPlayer: +LDX $02 +LDY $16 +JML $C272D4 + +OverrideDeathlinkHeal: +LDX $A972 +LDA $000E,X +AND #$00FF +BNE NotPlayerForRevive +LDA $B583 +AND #$00FF +BEQ ReviveClearDeathlinkFlag;Change to BRA if mercy mode ON +LDA #$CD0C +STA $0E +LDA #$00EE +STA $10 +JSL $C1DC1C +JML $C2754B +NotPlayerForRevive: +JSL $C1DC1C +JML $C273B4 +ReviveClearDeathlinkFlag: +SEP #$20 +STZ $B583 +REP #$20 +BRA NotPlayerForRevive + +SendDeathInBattle: +SEP #$20 +INC $B582;Player is currently dead +LDA $B583;Did the player just get killed by a deathlink death? +BNE .SkipSendingDeath +INC $B584;Is the player sending a death +.SkipSendingDeath: +STZ $B583 +REP #$20 +JSL $C1DC1C +RTL + +ClearStoredAPItem: +LDA $06 +CMP #$EA7F +BNE SkipAPCheck +LDA $08 +AND #$00FF +CMP #$00C7 +BNE SkipAPCheck +STZ $B573 +STZ $B579 +SkipAPCheck: +LDX #$0000 +LDA #$0001 +JML $C18A23 + +PrayerReflectIgnore: +LDA #$0001 +STA $B58A +LDA $C4A2F9,X +JML $C2AD2E + +ORG $C2FFE0 +DealReflect: +JSR $7E8A +RTL + +ExplodeReturn: +JSR $6A44 +JML $C2A670 +;;;;;;;;;;;;;;;;;;;; +;old code + + + + + + +;;;;;;;;;;;;;;;; +ORG $C7DE7E +db $F4, $BF, $EE + +ORG $EEBFF4 +db $08, $11, $de, $c7, $00, $02, $7B, $C6, $EE, $02 + + +;If easy death: + +ORG $EEBFF9 +;db $1E + +ORG $C4C7CE +;JML ResetStatus + +ORG $C4C7D4 +;NOP +;NOP +;NOP + +ORG $C912F2 +;db $0A, $FE, $BF, $EE + +ORG $EEBFFE +db $1b, $04, $15, $38, $1f, $81, $ff, $ff, $1b, $04, $0a, $f7, $12, $c9 + + +org $D8D35A +dw new_collision + +org $D8D354 +dw new_collision + +org $D8FFF0 +new_collision: +db $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $82, $00, $00, $00, $00 + +ORG $C79609 +db $0A, $0D, $C0, $EE + +ORG $EEC00D +db $50, $99, $9d, $91, $1f, $81, $ff, $ff, $0a, $0D, $96, $C7 + +ORG $D5F970 +db $1F, $81, $FF, $FF, $0A, $E0, $F8, $D5 + +ORG $C79640 +db $0A, $19, $C0, $EE + +ORG $EEC019 +db $a4, $98, $99, $a3, $50, $0a, $44, $96, $c7 + +ORG $C8A2D1 +db $00, $00, $00; summers phonecall oss + +ORG $EEC022 +db $96, $c7, $06, $86, $00, $6d, $fe, $c4, $ff, $0a, $9e, $c5, $c7 + +ORG $C9C27A +db $02; Future past apple kid. Eventually change with seed-related text + +ORG $CFDE16 +db $00;Broken Phase distorter not appearing + +ORG $D56F7C +db $00 + +ORG $C7EA03 +db $49 + +ORG $D57775 +db $8C + +ORG $C95BA7 +db $0A, $70, $C0, $EE + +ORG $EEC070 +db $06, $77, $00, $1e, $c1, $ee, $ff, $70, $89, $95, $a0, $5e, $50, $10, $0f, $84 +db $98, $95, $50, $82, $a5, $9e, $91, $a7, $91, $a9, $50, $76, $99, $a6, $95, $50 +db $9f, $a7, $95, $50, $9d, $95, $50, $91, $50, $9c, $9f, $a4, $50, $9f, $96, $50 +db $9d, $9f, $9e, $95, $a9, $5e, $03, $00, $70, $84, $98, $95, $a9, $57, $9c, $9c +db $50, $a0, $a2, $9f, $92, $91, $92, $9c, $a9, $50, $92, $95, $50, $98, $95, $a2 +db $95, $50, $9c, $9f, $9e, $97, $95, $a2, $50, $a4, $98, $91, $9e, $50, $79, $57 +db $a6, $95, $50, $92, $95, $95, $9e, $50, $99, $9e, $50, $72, $7b, $5c, $10, $0a +db $50, $a5, $9e, $9c, $95, $a3, $a3, $50, $a9, $9f, $a5, $50, $a7, $91, $9e, $a4 +db $50, $a4, $9f, $50, $a0, $91, $a9, $50, $9f, $96, $96, $50, $a4, $98, $95, $99 +db $a2, $50, $94, $95, $92, $a4, $5e, $5e, $5e, $50, $78, $95, $98, $5c, $10, $0a +db $50, $98, $95, $98, $5c, $10, $0a, $50, $98, $95, $98, $5e, $13, $02, $70, $83 +db $98, $9f, $9f, $a4, $5e, $03, $00, $70, $79, $57, $9d, $50, $a3, $a4, $99, $9c +db $9c, $50, $99, $9e, $50, $72, $7b, $5c, $10, $0a, $50, $a4, $9f, $9f, $5e, $13 +db $02; Poochyfud text + +ORG $C9C262 +db $0a, $41, $c1, $ee + +ORG $EEC141 +db $70, $79, $50, $a2, $95, $91, $94, $50, $a3, $9f, $9d, $95, $a7, $98, $95, $a2 +db $95, $5c, $10, $0a, $50, $a4, $98, $91, $a4, $50, $a9, $9f, $a5, $50, $93, $91 +db $9e, $50, $08, $b2, $f0, $ee, $ff, $0a, $98, $c1, $ee, $95, $50, $a0, $9f, $a7 +db $95, $a2, $50, $9f, $96, $50, $a4, $98, $95, $50, $75, $91, $a2, $a4, $98, $50 +db $99, $a4, $a3, $95, $9c, $96, $50, $99, $9e, $a4, $9f, $50, $a9, $9f, $a5, $a2 +db $50, $98, $95, $91, $a2, $a4, $5c, $03, $00, $70, $92, $a9, $50, $a0, $a5, $a2 +db $99, $96, $a9, $99, $9e, $97, $50, $1c, $0a, $01, $00, $00, $00, $50, $9f, $96 +db $50, $a4, $98, $95, $50, $6C, $10, $06, $89, $9f, $a5, $a2, $50, $83, $91, $9e +db $93, $a4, $a5, $91, $a2, $a9, $6E, $10, $06, $50, $9c, $9f, $93, $91, $a4, $99 +db $9f, $9e, $a3, $5c, $03, $00, $08, $40, $c1, $ee, $ff, $08, $40, $c1, $ee, $ff +db $08, $40, $c1, $ee, $ff, $70, $a7, $98, $91, $a4, $95, $a6, $95, $a2, $50, $a4 +db $98, $91, $a4, $50, $9d, $95, $91, $9e, $a3, $5e, $13, $02, $70, $9f, $a2, $50 +db $a4, $98, $91, $a4, $50, $a9, $9f, $a5, $50, $93, $91, $9e, $50, $a3, $91, $a6 +db $95, $50, $a4, $98, $95, $50, $a7, $9f, $a2, $9c, $94, $50, $92, $a9, $50, $a0 +db $a5, $a2, $99, $96, $a9, $99, $9e, $97, $50, $62, $50, $9d, $9f, $a2, $95, $5c +db $03, $02, $70, $91, $9e, $94, $50, $a4, $98, $91, $a4, $50, $a9, $9f, $a5, $50 +db $9e, $95, $95, $94, $50, $a4, $9f, $50, $a0, $a5, $a2, $97, $95, $50, $a4, $98 +db $95, $50, $95, $a6, $99, $9c, $50, $96, $a2, $9f, $9d, $50, $a9, $9f, $a5, $a2 +db $50, $9d, $99, $9e, $94, $5c, $03, $01, $02, $70, $9f, $a2, $50, $a4, $98, $91 +db $a4, $50, $a9, $9f, $a5, $50, $93, $91, $9e, $50, $a3, $91, $a6, $95, $50, $a4 +db $98, $95, $50, $a7, $9f, $a2, $9c, $94, $50, $92, $a9, $50, $a0, $a5, $a2, $99 +db $96, $a9, $99, $9e, $97, $50, $61, $50, $9d, $9f, $a2, $95, $50, $91, $9e, $94 +db $50, $a0, $a5, $a2, $97, $99, $9e, $97, $50, $a9, $9f, $a5, $a2, $50, $9d, $99 +db $9e, $94, $57, $a3, $50, $95, $a6, $99, $9c, $5c, $03, $01, $02 + +ORG $C86E26 +db $10 + +ORG $EEB227 +db $0A, $BE, $C2, $EE + +ORG $EEC2BE +db $1f, $17, $c8, $03, $5e, $02, $06, $02 + +ORG $C9D5B8 +db $0A, $C6, $C2, $EE + +ORG $EEC2C6 +db $50, $16, $6f, $51, $08, $58, $24, $c9, $ff, $0a, $bc, $d5, $c9 + +ORG $CF213D +db $C7, $00 + +ORG $EEA0E6 +db $01 + +ORG $EEB7C7 +db $0A, $4A, $C5, $EE + +ORG $EEC54A +db $18, $01, $01, $70, $72, $a9, $50, $0a, $cb, $b7, $ee + +ORG $C8FF31 +db $0A, $55, $C5, $EE + +ORG $EEC555 +db $04, $e9, $03, $18, $00, $10, $3c, $0a, $35, $ff, $c8 + +ORG $C8FF86 +db $0A, $60, $C5, $EE + +ORG $EEC560 +db $9f, $a4, $98, $95, $a2, $50, $9d, $a5, $9c, $a4, $99, $a7, $9f, $a2, $9c, $94 +db $0a, $8b, $ff, $c8 + +ORG $C98A7F +db $0a, $74, $c5, $ee + +ORG $EEC574 +db $91, $50, $1c, $05, $01, $0a, $87, $8a, $c9 + +ORG $C89390 +db $0a, $7d, $c5, $ee + +ORG $EEC57d +db $50, $1c, $05, $01, $50, $91, $a3, $50, $91, $50, $a3, $9f, $a5, $a6, $95, $9e +db $99, $a2, $0a, $99, $93, $c8 + +ORG $CF9829 +db $00 + +ORG $C6DB04 +db $49 + +ORG $C7C0CD +dd EndScript; Fix rainy circle playing twice + +ORG $C9D95E +db $01, $01, $01 + +ORG $C7BFF5 +db $94, $BF, $C7 + +ORG $EF6CA2 +db $04, $cc, $00, $1f, $12, $0a, $1f, $12, $0b, $02; stop flying man from living + +ORG $C6AE51 +db $01, $01, $01, $01 + +ORG $CFA94C +db $93, $C5, $EE + +ORG $00FFE6 +db $F0, $FE + +ORG $00FEF0 +;Crash handler +SEP #$20 +STZ $B4A1 +JML RenderCrashScreen; Jump to anti-piracy screen + +ORG $EEAAF1 +db $F2, $C5, $EE + +ORG $EEC5F2 +db $0A +dl PooNPCTexReal +PooReturnReal: +db $10, $85, $01, $1f, $03, $70, $58, $1c, $02, $04, $50, $9a +db $9f, $99, $9e, $95, $94, $50, $a9, $9f, $a5, $5e, $59, $04, $10, $00, $1f, $11 +db $04, $03, $01, $0e, $00, $0e, $01, $08, $f1, $c5, $ee, $ff, $02 +;db $04, $0e, $01, $0e, $00, $0e, $01, $08, $f1, $c5, $ee, $ff, $02 + +ORG $C3E27C +db $0C + +ORG $C6B233 +db $1f, $c6, $ee + +ORG $EEC61F +db $12, $70, $7b, $95, $95, $50, $9b, $a9, $9f, $51, $03, $01, $70, $58, $89, $9f +db $a5, $50, $94, $9f, $9e, $57, $a4, $50, $98, $91, $a6, $95, $50, $91, $9e, $a9 +db $01, $50, $50, $16, $e6, $10, $05, $95, $10, $05, $95, $10, $05, $95, $a7, $15 +db $1b, $97, $a5, $9d, $51, $59, $10, $10, $12, $02 + +ORG $C932C9 +db $02 + +ORG $EEC659 +db $7d, $91, $97, $99, $93, $91, $9e, $a4, $50, $84, $95, $9c, $95, $a0, $9f, $a2 +db $a4 + +ORG $C60582 +db $01, $1d, $03, $ff + +ORG $C6E9A0 +db $01, $01, $01, $01 + +ORG $C97980 +db $4B + +ORG $EF58C8 +db $F5, $03 + +ORG $EF5913 +db $F5, $03 + +ORG $C81A97 +db $49 + +ORG $EEB08C +db $f4, $03 + +ORG $EEC66A +;;;TODO: Test the Shyness Book dialogue after getting an AP item? this +db $0A, $91, $BF, $C6, $84, $be +db $ee + +ORG $C6D3A2 +db $ba + +ORG $C7D35A +db $49 + +ORG $C3E064 +db $27, $00 + +ORG $EEC67B +db $1e, $00, $ff, $64, $1e, $04, $ff, $64, $02 + +ORG $D56FCC +db $2F;Store tiny ruby + +ORG $D5528A +db $84, $0e ;broken antenna price + +ORG $D5576A +db $08, $1d; Gaia beam price + +ORG $D5556F +db $02, $00; Sword of Kings + +ORG $CF11BA +db $47, $80 +;;;;;;;;;;;;;;;;;;;;; +;New storage +ORG $C17A9D +JML CheckGiftBox7 + +ORG $C1911B +JML CheckGiftBox8 + +ORG $C19AB9 +JML CheckGiftBox1 + +ORG $C191BE +JML CheckGiftBox4 + +ORG $C191C9 +JML CheckGiftBox6 + +ORG $C19151 +JML CheckGiftBox9 + +ORG $C191D3 +JML CheckGiftBox3 + +ORG $C191E5 +CMP #$0045 + +ORG $C19B1E +CMP #$0045 + +ORG $C190F9 +LDA #$0045 + +ORG $C19170 +LDA #$0045 + +ORG $C19B3B +JSL ClearStorageMenu + +ORG $C191EC +JML CheckGiftBox5 + +ORG $C15B29 +JML CheckGiftBox2 + +ORG $C11E25 +;JSL ClearStoragePage + +ORG $EEC684 +db $18, $01, $29, $19, $02, $79, $9e, $a6, $95, $9e, $a4, $9f, $a2, $a9, $02, $19 +db $02, $83, $a4, $9f, $a2, $91, $97, $95, $02, $1c, $07, $02, $11, $09, $02, $dc +db $96, $ee, $11, $b1, $c6, $ee, $22, $18, $00, $0a, $20, $96, $ee, $0e, $01, $19 +db $14, $1b, $02, $84, $c6, $ee, $ff, $18, $02, $1a, $07, $18, $03, $0d, $18, $00 +db $18, $03, $29, $1b, $02, $eb, $c6, $ee, $00, $1b, $04, $1b, $05, $19, $1a, $00 +db $1b, $04, $1d, $0b, $00, $1b, $02, $bd, $c6, $ee, $ff, $1b, $06, $1b, $0c, $19 +db $1c, $ff, $00, $0a, $b1, $c6, $ee, $18, $03, $0d, $18, $00, $18, $03, $29, $12 +db $0a, $87, $c6, $ee, $1c, $04, $1d, $19, $02, $1b, $03, $DB, $C8, $EE, $00, $1a +db $01, $84, $e5, $c5, $00, $8b, $e5, $c5, $00, $92, $e5, $c5, $00, $99, $e5, $c5 +db $00, $00, $0d, $00, $1b, $02, $30, $C7, $EE, $00, $19, $1b, $02, $1b, $02, $F8 +db $C6, $EE, $00, $18, $09, $02, $1b, $02, $F8, $C6, $EE, $00, $18, $03, $02, $18 +db $00, $18, $03, $29, $1b, $04, $02, $00 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Twoson police officer +ORG $CF67AF +db $0b, $00 + +ORG $C4FEEA +db $02, $00, $57, $01, $b0, $f8, $9b, $00, $45, $5c + +ORG $CF93D6 +db $69, $00, $01 + +ORG $CF93D9 +db $3b, $c7, $ee, $00, $DF, $EE, $EE + +ORG $EEC73B +db $70, $7f, $9e, $95, $a4, $a4, $6f, $10, $0f, $50, $83, $9f, $a2, $a2, $a9, $5c +db $50, $a4, $98, $95, $50, $a2, $9f, $91, $94, $50, $99, $a3, $50, $93, $9c, $9f +db $a3, $95, $94, $50, $a5, $9e, $a4, $99, $9c, $50, $96, $a5, $a2, $a4, $98, $95 +db $a2, $50, $9e, $9f, $a4, $99, $93, $95, $5e, $03, $00, $70, $73, $91, $a0, $a4 +db $91, $99, $9e, $50, $83, $a4, $a2, $9f, $9e, $97, $50, $9c, $9f, $a3, $a4, $50 +db $98, $99, $a3, $50, $92, $91, $94, $97, $95, $50, $91, $97, $91, $99, $9e, $5c +db $10, $08, $50, $a3, $9f, $50, $a4, $98, $99, $a3, $50, $91, $a2, $95, $91, $50 +db $99, $a3, $50, $a5, $9e, $94, $95, $a2, $50, $9c, $9f, $93, $9b, $94, $9f, $a7 +db $9e, $50, $a5, $9e, $a4, $99, $9c, $50, $99, $a4, $57, $a3, $50, $96, $9f, $a5 +db $9e, $94, $5e, $13, $02, $19, $19, $00, $00, $1b, $04, $0b, $CA, $1b, $02, $b6 +db $c6, $c7, $ff, $1d, $01, $ff, $ca, $1f, $02, $76, $18, $04, $18, $01, $01, $70 +db $78, $95, $a9, $51, $10, $0f, $50, $84, $98, $91, $a4, $57, $a3, $50, $a4, $98 +db $95, $50, $93, $91, $a0, $a4, $91, $99, $9e, $57, $a3, $50, $92, $91, $94, $97 +db $95, $51, $03, $00, $70, $84, $98, $95, $50, $a2, $9f, $91, $94, $50, $a4, $9f +db $50, $7f, $9e, $95, $a4, $a4, $50, $93, $91, $9e, $50, $9e, $9f, $a7, $50, $92 +db $95, $50, $9f, $a0, $95, $9e, $95, $94, $50, $91, $97, $91, $99, $9e, $5e, $10 +db $0f, $50, $84, $98, $91, $9e, $9b, $50, $a9, $9f, $a5, $50, $96, $9f, $a2, $50 +db $a9, $9f, $a5, $a2, $50, $93, $9f, $9f, $a0, $95, $a2, $91, $a4, $99, $9f, $9e +db $5e, $03, $18, $04, $04, $69, $00, $1f, $16, $9b, $00, $02, $10, $04, $1f, $1e +db $9b, $00, $00, $02 + +ORG $D56EDF +db $3B;Item type for the Police Badge + +ORG $CF6277 +db $00, $00; Remove police from Onett +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $C577A0 +db $0A, $6F, $C8, $EE + +ORG $EEC86F +db $04, $5e, $02, $1d, $01, $ff, $c0, $0a, $a4, $77, $c5 + +ORG $C6FB13 +db $7A, $C8, $EE + +ORG $EEC87A +db $08, $33, $fb, $c6, $ff, $1d, $01, $ff, $ac, $02 + +ORG $C8720F +db $84, $C8, $EE + +ORG $EEC884 +db $1d, $01, $ff, $b9, $0a, $20, $72, $c8 + +ORG $C57076 +db $01, $01, $01, $01 + +ORG $C9FD1A +db $0A, $8C, $C8, $EE + +ORG $EEC88C +db $a4, $51, $03, $00, $70, $79, $9e, $50, $99, $a4, $a3, $50, $9c, $91, $a3, $a4 +db $50, $9d, $9f, $9d, $95, $9e, $a4, $a3, $5c, $10, $0a, $50, $a4, $98, $95, $50 +db $95, $a2, $91, $a3, $95, $a2, $50, $a5, $a3, $95, $94, $50, $a4, $98, $95, $50 +db $75, $a2, $91, $a3, $95, $a2, $50, $75, $a2, $91, $a3, $95, $a2, $50, $75, $a2 +db $91, $a3, $95, $a2, $51, $59, $03, $1d, $01, $ff, $d2, $0a, $1e, $fd, $c9 + +ORG $C8255E +db $00, $00 + +ORG $C636E5 +db $0a, $00, $00, $F2; Disables Escargo phone call + +ORG $C8A01F +db $02 + +ORG $EEC8DB +db $19, $10, $01, $0d, $00, $1b, $05, $18, $02, $1b, $06, $1a, $05, $02, $00, $1b +db $06, $18, $09, $02, $1b, $05, $18, $03, $02, $18, $00, $18, $03, $29, $1b, $06 +db $1b, $02, $c2, $e4, $c5, $00, $1b, $04, $02, $02 +;;;;;;;;;;;;;;;;;;;;;;;; +ORG $C10119 +JSL AutoText +BRA $00 + +ORG $C1015C +JSL AutoText +BRA $00 + +ORG $C10224 +JSL AutoText +BRA $00 + +ORG $C10278 +JSL AutoText +BRA $00 + +ORG $C101D8 +JSL AutoText +BRA $00 +;;;;;;;;;;;;;;;;;;;;;;;;; +;Fix OSS Bug +ORG $C22FD1 +JML LostScriptedFight +NOP + +ORG $C22FEC +JML LostScriptedFight +NOP +;;;;;;;;;;;;;;;;;;; +ORG $C1F80D +;JSL PrintVersionNumber + +ORG $C57948 +db $49, $00; Dungeon man if submarine is used + +ORG $C5796B +db $D8, $03 + +ORG $C5794F +db $D8, $03 + +ORG $C57A26 +db $06, $9c, $03, $55, $79, $c5, $ff, $70, $78, $95, $a2, $95, $5c, $10, $0a, $50 +db $79, $50, $92, $95, $9c, $99, $95, $a6, $95, $50, $a9, $9f, $a5, $50, $98, $91 +db $a6, $95, $50, $9c, $95, $96, $a4, $50, $a4, $98, $99, $a3, $50, $1c, $05, $01 +db $50, $92, $95, $98, $99, $9e, $94, $5e, $03, $1d, $03, $ff, $1b, $02, $76, $7a +db $c5, $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03, $04, $9c, $03, $02 +db $00, $70, $89, $9f, $a5, $50, $a3, $98, $9f, $a5, $9c, $94, $50, $93, $9f, $9d +db $95, $50, $92, $91, $93, $9b, $50, $a7, $98, $95, $9e, $50, $a9, $9f, $a5, $50 +db $98, $91, $a6, $95, $50, $9d, $9f, $a2, $95, $50, $a2, $9f, $9f, $9d, $5e, $13 +db $02 + +ORG $C5373A +db $0a, $05, $c9, $ee + +ORG $EEC905 +db $a3, $50, $91, $08, $3a, $c9, $ee, $ff, $0a, $41, $37, $c5, $50, $9c, $99, $97 +db $98, $a4, $9e, $99, $9e, $97, $02, $50, $96, $99, $a2, $95, $02, $9e, $50, $99 +db $93, $95, $02, $50, $96, $9c, $91, $a3, $98, $02, $50, $a3, $a4, $91, $a2, $a3 +db $a4, $9f, $a2, $9d, $02, $50, $a0, $a3, $a9, $93, $98, $99, $93, $50, $95, $9e +db $95, $a2, $97, $a9, $02, $9e, $50, $95, $a8, $a0, $9c, $9f, $a3, $99, $a6, $95 +db $02 + +ORG $EF717B +db $0a, $56, $c9, $ee + +ORG $EEC956 +db $08, $82, $c9, $ee, $ff, $0a, $80, $71, $ef, $9c, $99, $97, $98, $a4, $9e, $99 +db $9e, $97, $02, $96, $99, $a2, $95, $02, $99, $93, $95, $02, $9c, $99, $97, $98 +db $a4, $02, $a3, $a4, $91, $a2, $a3, $a4, $9f, $a2, $9d, $02, $95, $9e, $95, $a2 +db $97, $a9, $02, $92, $9c, $91, $a3, $a4, $02 + +ORG $EF7163 +db $1c, $05, $01, $0a, $70, $71, $ef + +ORG $C8361C +db $70, $7f, $98, $98, $98, $5c, $10, $08, $50, $91, $98, $98, $98, $5c, $50, $9f +db $a5, $93, $98, $5e, $5e, $5e, $03, $00, $70, $79, $50, $a7, $91, $a3, $50, $a4 +db $a2, $a9, $99, $9e, $97, $50, $a4, $9f, $50, $9c, $9f, $9f, $9b, $50, $91, $a4 +db $50, $a4, $98, $91, $a4, $50, $a3, $a4, $91, $a4, $a5, $95, $50, $92, $95, $98 +db $99, $9e, $94, $50, $a4, $98, $95, $50, $93, $9f, $a5, $9e, $a4, $95, $a2, $5c +db $10, $08, $50, $a7, $98, $95, $9e, $50, $79, $50, $a3, $a0, $a2, $91, $99, $9e +db $95, $94, $50, $9d, $a9, $50, $91, $9e, $9b, $9c, $95, $5e, $5e, $5e, $03, $00 +db $70, $89, $95, $a3, $5e, $5e, $5e, $50, $79, $57, $9d, $50, $96, $99, $9e, $95 +db $5e, $10, $08, $50, $7a, $a5, $a3, $a4, $50, $98, $91, $a6, $95, $50, $a4, $9f +db $50, $a7, $91, $9c, $9b, $50, $99, $a4, $50, $9f, $96, $96, $5e, $03, $00, $70 +db $71, $9e, $a9, $a7, $91, $a9, $a3, $5c, $10, $08, $50, $a9, $9f, $a5, $50, $a3 +db $98, $9f, $a5, $9c, $94, $50, $a2, $95, $91, $9c, $9c, $a9, $50, $93, $98, $95 +db $93, $9b, $10, $0e, $50, $92, $95, $98, $99, $9e, $94, $10, $0e, $50, $a4, $98 +db $95, $50, $93, $9f, $a5, $9e, $a4, $95, $a2, $10, $0e, $50, $91, $a4, $50, $a4 +db $98, $95, $50, $93, $91, $96, $95, $5e, $03, $00, $0a, $d8, $39, $c8; Everdred fourside text + +ORG $CFAE24 +db $00, $8F, $C9, $EE + +ORG $EEC98F +db $70, $7e, $9f, $a4, $50, $a4, $9f, $9f, $50, $9c, $9f, $9e, $97, $50, $91, $97 +db $9f, $5c, $03, $00, $70, $79, $50, $98, $95, $91, $a2, $94, $50, $a3, $9f, $9d +db $95, $50, $aa, $9f, $9d, $92, $99, $95, $a3, $50, $a4, $91, $9c, $9b, $99, $9e +db $97, $50, $91, $92, $9f, $a5, $a4, $50, $98, $9f, $a7, $50, $a4, $98, $95, $a9 +db $50, $9c, $9f, $93, $9b, $95, $94, $50, $a3, $9f, $9d, $95, $01, $50, $50, $6C +db $1c, $05, $01, $6E, $50, $99, $9e, $50, $a4, $98, $95, $50, $93, $95, $9d, $95 +db $a4, $95, $a2, $a9, $5e, $03, $00, $70, $78, $9f, $a7, $50, $91, $a7, $96, $a5 +db $9c, $51, $13, $02 + +ORG $CFA5D5 +db $7A, $00, $02 + +ORG $CFA272 +db $7a, $00, $01 + +ORG $CFA283 +db $7a, $00, $01 + +ORG $D5F63B +db $6E + +ORG $EECA03 +db $04, $c3, $01, $04, $c4, $01, $04, $c5, $01, $04, $c6, $01, $04, $c7, $01, $04 +db $c8, $01, $04, $c9, $01, $04, $ca, $01, $04, $cc, $01, $04, $cd, $01, $04, $ce +db $01, $0a, $0b, $b1, $c9 + +ORG $EECA28 +db $70, $7b, $9f, $9b, $a5, $99, $9b, $9f, $9b, $91, $9b, $95, $9b, $95, $51, $03 +db $00, $70, $58, $77, $95, $a4, $50, $a9, $9f, $a5, $a2, $50, $7d, $9f, $9e, $9b +db $95, $a9, $50, $74, $95, $9c, $a5, $a8, $95, $50, $92, $a5, $9e, $94, $9c, $95 +db $a3, $51, $59, $03, $00, $70, $7b, $9f, $9b, $a5, $9b, $99, $50, $9b, $95, $95 +db $9b, $9f, $9b, $91, $99, $50, $9b, $9f, $9b, $9f, $9b, $9f, $50, $54, $65, $60 +db $60, $51, $03, $00, $70, $58, $71, $9e, $a9, $a4, $98, $99, $9e, $97, $50, $91 +db $50, $9d, $9f, $9e, $9b, $95, $a9, $50, $93, $9f, $a5, $9c, $94, $50, $a7, $91 +db $9e, $a4, $5c, $10, $06, $50, $9a, $a5, $a3, $a4, $50, $54, $65, $60, $60, $51 +db $59, $03, $00, $70, $7b, $9f, $9b, $a5, $9b, $91, $91, $99, $50, $9b, $9f, $9b +db $91, $50, $54, $65, $60, $60, $6f, $03, $00, $70, $58, $87, $91, $9e, $a4, $50 +db $91, $50, $7d, $9f, $9e, $9b, $95, $a9, $50, $74, $95, $9c, $a5, $a8, $95, $50 +db $92, $a5, $9e, $94, $9c, $95, $50, $96, $9f, $a2, $50, $54, $65, $60, $60, $6f +db $59, $03, $00, $1c, $04, $18, $0a, $19, $02, $89, $95, $a3, $02, $19, $02, $7e +db $9f, $02, $1c, $07, $02, $11, $09, $02, $28, $cb, $ee, $11, $08, $cb, $ee, $22 +db $12, $70, $7b, $9f, $9b, $9f, $9b, $91, $9b, $5e, $03, $00, $70, $58, $89, $9f +db $a5, $57, $9c, $9c, $50, $92, $95, $50, $92, $91, $93, $9b, $5e, $59, $13, $02 +db $1d, $09, $f4, $01, $1b, $02, $53, $cb, $ee, $ff, $12, $70, $7b, $99, $9b, $99 +db $99, $a9, $91, $99, $9b, $9f, $51, $03, $00, $70, $58, $89, $9f, $a5, $57, $a2 +db $95, $50, $92, $a2, $9f, $9b, $95, $51, $59, $13, $02, $0e, $00, $0d, $01, $1d +db $00, $ff, $fe, $1b, $02, $bf, $cb, $ee, $ff, $1d, $00, $ff, $fe, $1b, $02, $bf +db $cb, $ee, $ff, $1d, $00, $ff, $fe, $1b, $02, $bf, $cb, $ee, $ff, $1d, $00, $ff +db $fe, $1b, $02, $bf, $cb, $ee, $ff, $1d, $00, $ff, $fe, $1b, $02, $bf, $cb, $ee +db $ff, $1d, $00, $ff, $fe, $1b, $02, $bf, $cb, $ee, $ff, $1d, $00, $ff, $fe, $1b +db $02, $bf, $cb, $ee, $ff, $1d, $00, $ff, $fe, $1b, $02, $bf, $cb, $ee, $ff, $1d +db $00, $ff, $fe, $1b, $02, $bf, $cb, $ee, $ff, $1d, $00, $ff, $fe, $1b, $02, $bf +db $cb, $ee, $ff, $0a, $35, $cc, $ee, $12, $70, $58, $87, $98, $9f, $91, $98, $51 +db $10, $0f, $50, $89, $9f, $a5, $50, $92, $95, $a4, $a4, $95, $a2, $50, $9d, $91 +db $9b, $95, $50, $a3, $a5, $a2, $95, $50, $a9, $9f, $a5, $50, $93, $91, $9e, $50 +db $98, $9f, $9c, $94, $50, $61, $60, $50, $a4, $98, $99, $9e, $97, $a3, $5c, $10 +db $06, $50, $92, $a5, $94, $94, $a9, $51, $59, $13, $08, $0c, $cc, $ee, $ff, $1d +db $08, $f4, $01, $02, $1d, $01, $ff, $fe, $1d, $01, $ff, $fe, $1d, $01, $ff, $fe +db $1d, $01, $ff, $fe, $1d, $01, $ff, $fe, $1d, $01, $ff, $fe, $1d, $01, $ff, $fe +db $1d, $01, $ff, $fe, $1d, $01, $ff, $fe, $1d, $01, $ff, $fe, $02, $08, $0c, $cc +db $ee, $ff, $1f, $02, $78, $18, $0a, $12, $70, $7b, $a5, $9b, $99, $9b, $9f, $9b +db $91, $50, $9b, $99, $99, $a9, $9b, $5e, $03, $00, $70, $58, $7d, $a5, $93, $98 +db $50, $9f, $92, $9c, $99, $97, $95, $94, $5e, $59, $03, $1d, $0e, $ff, $e0, $1d +db $0e, $ff, $5d, $1d, $0e, $ff, $5f, $1d, $0e, $ff, $5f, $1d, $0e, $ff, $7f, $1d +db $0e, $ff, $5a, $1d, $0e, $ff, $5a, $1d, $0e, $ff, $5a, $1d, $0e, $ff, $6c, $1d +db $0e, $ff, $8c, $1f, $02, $74, $10, $10, $1f, $02, $74, $10, $10, $1f, $02, $74 +db $10, $10, $1f, $02, $74, $10, $10, $1f, $02, $74, $10, $10, $1f, $02, $74, $10 +db $10, $1f, $02, $74, $10, $10, $1f, $02, $74, $10, $10, $1f, $02, $74, $10, $10 +db $1f, $02, $74, $10, $10, $02; Monkey caves Monkey Bundle + +ORG $C807F5 +db $1c, $05, $01, $0a, $fc, $07, $c8 + +ORG $C57A14 +db $02 + +ORG $C98276 +db $0A, $BE, $CC, $EE + +ORG $EECCBE +db $18, $04, $04, $7a, $00, $05, $f6, $03, $02 + +ORG $C98025 +db $F6, $03 + +ORG $C9827D +db $F6, $03; Carpainter stuff + +ORG $C97633 +db $02 + +ORG $C86DFC +;db $7A, $00, $C7, $CC, $EE + +ORG $EECCC7 +db $70, $58, $83, $9f, $a5, $9e, $94, $a3, $50, $9c, $99, $9b, $95, $50, $a3, $9f +db $9d, $95, $9f, $9e, $95, $57, $a3, $50, $9f, $a5, $a4, $a3, $99, $94, $95, $5e +db $03, $00, $70, $72, $95, $a4, $a4, $95, $a2, $50, $93, $9f, $9d, $95, $50, $92 +db $91, $93, $9b, $50, $9c, $91, $a4, $95, $a2, $5e, $59, $13, $02;Fix re-entering moonside. Do I need this? Doesn't it set the checkpoint when clearing moonside? + +ORG $C58ED1 +db $0A +dl DynamicPhotoSetter + +ORG $EECD04 +db $18, $04, $1f, $e1, $00, $5c, $01, $02 + +ORG $EECD0C +db $01, $70, $72, $a5, $a4, $50, $a3, $9f, $9d, $95, $a4, $98, $99, $9e, $97, $50 +db $a0, $a2, $95, $a6, $95, $9e, $a4, $95, $94, $50, $99, $a4, $50, $96, $a2, $9f +db $9d, $50, $a7, $9f, $a2, $9b, $99, $9e, $97, $51, $03, $02, $00; Deathlink heal tex +;;;;;;;;;;;;;;;; +ORG $D50700 +db $0f, $0f, $10, $10, $20, $3f, $40, $40, $ff, $ff, $80, $86, $80, $8f, $80, $8f +db $0f, $0f, $10, $1f, $20, $20, $40, $7f, $ff, $ff, $80, $ff, $80, $ff, $b0, $ff +db $ff, $ff, $03, $03, $07, $ff, $0b, $0f, $fb, $ff, $1b, $1f, $1b, $1f, $1b, $1f +db $ff, $ff, $03, $ff, $05, $05, $0d, $f9, $f5, $f1, $15, $f1, $15, $f1, $d5, $31 +db $80, $86, $81, $b1, $83, $fb, $87, $f9, $8f, $b1, $8f, $80, $87, $81, $ff, $ff +db $f9, $fe, $f9, $ff, $fb, $ff, $ff, $ff, $bf, $ff, $8f, $ff, $87, $ff, $ff, $ff +db $9b, $9f, $db, $df, $fb, $ff, $fb, $df, $da, $de, $1c, $1c, $d8, $d8, $f0, $f0 +db $f5, $91, $f5, $d1, $f5, $f1, $d5, $f1, $d6, $f2, $14, $f4, $d8, $f8, $f0, $f0;ProgBox + +ORG $D517c0 +db $0f, $0f, $1f, $1f, $3f, $3f, $7f, $7f, $ff, $ff, $80, $80, $80, $80, $c0, $c0 +db $0f, $0f, $10, $10, $20, $20, $40, $40, $ff, $ff, $80, $ff, $80, $ff, $80, $bf +db $ff, $ff, $03, $ff, $07, $ff, $0b, $ff, $fb, $ff, $1b, $1f, $1b, $1f, $3b, $3f +db $ff, $ff, $ff, $03, $fd, $05, $fd, $09, $f5, $f1, $15, $f1, $15, $f1, $15, $d1 +db $bf, $ff, $81, $b1, $83, $fb, $87, $f9, $8f, $b1, $8f, $80, $87, $81, $ff, $ff +db $c0, $80, $f9, $cf, $fb, $ff, $ff, $ff, $bf, $ff, $8f, $ff, $87, $ff, $ff, $ff +db $db, $ff, $1b, $df, $fb, $ff, $fb, $df, $da, $de, $1c, $1c, $d8, $d8, $f0, $f0 +db $35, $11, $f5, $11, $f5, $f1, $d5, $f1, $d6, $f2, $14, $f4, $d8, $f8, $f0, $f0;ProgBox open sprite + +ORG $D53240 +db $0f, $0f, $10, $10, $20, $3f, $40, $40, $ff, $ff, $80, $86, $80, $8f, $80, $8f +db $0f, $0f, $10, $1f, $20, $20, $40, $7f, $ff, $ff, $80, $ff, $80, $ff, $b0, $ff +db $ff, $ff, $03, $03, $07, $ff, $0b, $0f, $fb, $ff, $1b, $1f, $1b, $1f, $1b, $1f +db $ff, $ff, $03, $ff, $05, $05, $0d, $f9, $f5, $f1, $15, $f1, $15, $f1, $d5, $31 +db $80, $86, $80, $b0, $81, $f8, $87, $f8, $8f, $b0, $8f, $80, $86, $80, $ff, $ff +db $f9, $fe, $f9, $fe, $f8, $ff, $fe, $ff, $bf, $ff, $8f, $ff, $86, $ff, $ff, $ff +db $1b, $1f, $db, $1f, $fb, $1f, $fb, $1f, $da, $1e, $1c, $1c, $18, $18, $f0, $f0 +db $f5, $11, $35, $d1, $15, $f1, $15, $f1, $16, $f2, $14, $f4, $18, $f8, $f0, $f0;APBox + +ORG $D540C0 +db $ff, $ff, $c0, $ff, $e0, $ff, $d0, $ff, $df, $ff, $d8, $f8, $d8, $f8, $dc, $fc +db $ff, $ff, $ff, $c0, $bf, $a0, $bf, $90, $af, $8f, $a8, $8f, $a8, $8f, $a8, $8b +db $f0, $f0, $f8, $f8, $fc, $fc, $fe, $fe, $ff, $ff, $01, $01, $01, $01, $03, $03 +db $f0, $f0, $08, $08, $04, $04, $02, $02, $ff, $ff, $01, $ff, $01, $ff, $01, $fd +db $db, $ff, $d8, $fb, $df, $f8, $df, $f8, $5b, $78, $38, $38, $18, $18, $0f, $0f +db $ac, $88, $af, $88, $a8, $8f, $a8, $8f, $68, $4f, $28, $2f, $18, $1f, $0f, $0f +db $fd, $ff, $01, $0d, $81, $1f, $e1, $1f, $f1, $0d, $f1, $01, $61, $01, $ff, $ff +db $03, $01, $9f, $73, $1f, $ff, $7f, $ff, $fd, $ff, $f1, $ff, $61, $ff, $ff, $ff;ApBox open sprite + +ORG $EF43E3 +db $0A + +ORG $EF44AB +db $0A + +ORG $EF43E9 +db $c0, $17 + +ORG $EF44B1 +db $c1, $40 + +ORG $EECD38 +db $06, $e2, $00, $ec, $d9, $c7, $00, $06, $cd, $00, $99, $ce, $ee, $ff, $06, $ce +db $00, $99, $ce, $ee, $ff, $06, $cf, $00, $99, $ce, $ee, $ff, $06, $d0, $00, $99 +db $ce, $ee, $ff, $06, $e7, $00, $99, $ce, $ee, $ff, $06, $e8, $00, $99, $ce, $ee +db $ff, $06, $e9, $00, $99, $ce, $ee, $ff, $06, $eA, $00, $99, $ce, $ee, $ff, $06 +db $EB, $00, $99, $ce, $ee, $ff, $06, $eC, $00, $99, $ce, $ee, $ff, $06, $ED, $00 +db $99, $ce, $ee, $ff, $06, $eE, $00, $99, $ce, $ee, $ff, $06, $eF, $00, $99, $ce +db $ee, $ff, $06, $F0, $00, $99, $ce, $ee, $ff, $06, $F1, $00, $99, $ce, $ee, $ff +db $06, $F2, $00, $99, $ce, $ee, $ff, $06, $F3, $00, $99, $ce, $ee, $ff, $06, $F4 +db $00, $99, $ce, $ee, $ff, $0a, $14, $d9, $c7;New present table + +;macro needs to go here? +db $04, $cd, $00, $08, $7f, $d8, $c7, $00, $05, $cd, $00, $02 +db $04, $ce, $00, $08, $7f, $d8, $c7, $00, $05, $ce, $00, $02 +db $04, $CF, $00, $08, $7f, $d8, $c7, $00, $05, $CF, $00, $02 +db $04, $D0, $00, $08, $7f, $d8, $c7, $00, $05, $D0, $00, $02 +db $04, $E7, $00, $08, $7f, $d8, $c7, $00, $05, $E7, $00, $02 +db $04, $E8, $00, $08, $7f, $d8, $c7, $00, $05, $E8, $00, $02 +db $04, $E9, $00, $08, $7f, $d8, $c7, $00, $05, $E9, $00, $02 +db $04, $EA, $00, $08, $7f, $d8, $c7, $00, $05, $EA, $00, $02 +db $04, $EB, $00, $08, $7f, $d8, $c7, $00, $05, $EB, $00, $02 +db $04, $EC, $00, $08, $7f, $d8, $c7, $00, $05, $EC, $00, $02 +db $04, $ED, $00, $08, $7f, $d8, $c7, $00, $05, $ED, $00, $02 +db $04, $EE, $00, $08, $7f, $d8, $c7, $00, $05, $EE, $00, $02 +db $04, $EF, $00, $08, $7f, $d8, $c7, $00, $05, $EF, $00, $02 +db $04, $F0, $00, $08, $7f, $d8, $c7, $00, $05, $F0, $00, $02 +db $04, $F1, $00, $08, $7f, $d8, $c7, $00, $05, $F1, $00, $02 +db $04, $F2, $00, $08, $7f, $d8, $c7, $00, $05, $F2, $00, $02 +db $04, $F3, $00, $08, $7f, $d8, $c7, $00, $05, $F3, $00, $02 +db $04, $F4, $00, $08, $7f, $d8, $c7, $00, $05, $F4, $00, $02;Present checks + +db $70, $1c, $02, $00, $50, $9f, $a0, $95, $9e, $95, $94, $50, $a4, $98, $95, $50 +db $92, $9f, $a8, $5e, $02;Ap box normal + +db $06, $e2, $00, $fc, $d9, $c7, $00, $06, $ce, $00, $29, $CF, $EE, $ff, $06, $cf +db $00, $47, $CF, $EE, $ff, $06, $d0, $00, $57, $CF, $EE, $ff, $06, $e7, $00, $8A +db $CF, $EE, $ff, $06, $e8, $00, $9A, $CF, $EE, $ff, $06, $e9, $00, $BD, $CF, $EE +db $ff, $06, $ea, $00, $CB, $CF, $EE, $ff, $06, $eb, $00, $F2, $CF, $EE, $ff, $06 +db $ec, $00, $08, $D0, $EE, $ff, $06, $ed, $00, $1D, $D0, $EE, $ff, $06, $ee, $00 +db $32, $D0, $EE, $ff, $06, $EF, $00, $4D, $D0, $EE, $ff, $06, $f0, $00, $5e, $d0 +db $ee, $ff, $06, $f1, $00, $76, $D0, $EE, $ff, $06, $f2, $00, $9E, $D0, $EE, $ff +db $06, $f3, $00, $AE, $D0, $EE, $ff, $0a, $d5, $d0, $EE + +db $01, $10, $14, $70, $79, $a3, $50, $a4, $98, $99, $a3, $50, $95, $a6, $95, $9e +db $50, $a2, $91, $9e, $94, $9f, $9d, $99, $aa, $95, $94, $6f, $03, $02;is this even randomized + +db $01, $10, $14, $70, $7f, $9f, $98, $50, $9c, $91, $50, $9c, $91, $51, $03, $02;ooh la la + +db $01, $10, $14, $70, $7e, $9f, $a7, $50, $a4, $98, $95, $a2, $95, $57, $a3, $50 +db $a3, $9f, $9d, $95, $a4, $98, $99, $9e, $97, $50, $a9, $9f, $a5, $50, $94, $9f +db $9e, $57, $a4, $50, $a3, $95, $95, $50, $95, $a6, $95, $a2, $a9, $94, $91, $a9 +db $51, $03, $02 + +db $01, $10, $14, $70, $87, $78, $71, $71, $71, $71, $71, $84, $6f, $51, $03, $02;what + +db $01, $10, $14, $70, $87, $95, $9c, $9c, $5c, $10, $05, $50, $a3, $9c, $91, $a0 +db $50, $9d, $95, $50, $a7, $99, $a4, $98, $50, $91, $50, $a4, $a2, $9f, $a5, $a4 +db $51, $03, $02;trout + +db $01, $10, $14, $70, $7a, $91, $93, $9b, $a0, $9f, $a4, $51, $03, $02;jackpot + +db $01, $10, $14, $70, $72, $a5, $a4, $50, $99, $a4, $50, $a7, $91, $a3, $50, $95 +db $9d, $a0, $a4, $a9, $51, $03, $01, $70, $7a, $a5, $a3, $a4, $50, $9b, $99, $94 +db $94, $99, $9e, $97, $51, $03, $02 + +db $01, $10, $14, $70, $78, $9f, $a4, $50, $94, $99, $97, $97, $99, $a4, $a9, $50 +db $94, $9f, $97, $51, $03, $02 + +db $01, $10, $14, $70, $77, $a2, $95, $91, $a4, $50, $97, $91, $94, $aa, $9f, $9f +db $9b, $a3, $51, $03, $02 + +db $01, $10, $14, $70, $87, $98, $9f, $91, $98, $5c, $10, $03, $50, $9e, $95, $9c +db $9c, $a9, $51, $03, $02 + +db $01, $10, $14, $70, $87, $98, $91, $a4, $50, $94, $9f, $50, $a7, $95, $50, $98 +db $91, $a6, $95, $50, $98, $95, $a2, $95, $6f, $03, $02 + +db $01, $10, $14, $70, $78, $85, $78, $78, $78, $78, $78, $78, $78, $6f, $51, $03 +db $02 + +db $01, $10, $14, $70, $7e, $9f, $a7, $50, $a7, $95, $57, $a2, $95, $50, $93, $9f +db $9f, $9b, $99, $9e, $97, $51, $03, $02 + +db $01, $10, $14, $70, $79, $50, $9e, $95, $a6, $95, $a2, $50, $a3, $a5, $a3, $a0 +db $95, $93, $a4, $95, $94, $50, $99, $a4, $50, $93, $9f, $a5, $9c, $94, $50, $98 +db $91, $a0, $a0, $95, $9e, $51, $03, $02 + +db $01, $10, $14, $70, $7f, $98, $98, $98, $98, $50, $a9, $95, $a3, $51, $03, $02; oh yes + +db $01, $10, $14, $70, $79, $57, $a6, $95, $50, $a3, $95, $95, $9e, $50, $a4, $98 +db $99, $a3, $50, $92, $95, $96, $9f, $a2, $95, $5e, $03, $02; seen this before + +db $06, $e5, $00, $b6, $da, $c7, $ff, $0a, $fd, $d9, $c7 + +db $06, $F4, $00, $E0, $D0, $EE, $FF, $0a, $31, $d9, $c7; trap + +db $01, $10, $14, $70, $89, $9f, $a5, $50, $91, $a2, $95, $50, $91, $50, $96, $9f, $9f +db $9c, $51, $03, $02; trap text + +ORG $C7D90D +db $0A, $38, $CD, $EE + +ORG $C7D92A +db $0A, $AE, $CE, $EE + +ORG $C7D9E4 +db $0A, $CA, $D0, $EE + +ORG $C8972A +db $0A, $F5, $D0, $EE + +ORG $C897C1 +db $0A, $48, $D1, $EE + +ORG $C7FA20 +db $0A, $5E, $D1, $EE + +ORG $EED0F5 +db $06, $8b, $00, $04, $d1, $ee, $ff, $70, $58, $79, $50, $0a, $2e, $97, $c8, $70 +db $58, $79, $50, $98, $95, $91, $a2, $94, $50, $a4, $98, $91, $a4, $50, $91, $50 +db $a3, $93, $91, $a2, $a9, $50, $9d, $9f, $9e, $a3, $a4, $95, $a2, $50, $94, $9f +db $95, $a3, $9e, $57, $a4, $50, $9c, $99, $a6, $95, $50, $9f, $9e, $50, $a4, $98 +db $95, $50, $a4, $9f, $a0, $50, $96, $9c, $9f, $9f, $a2, $5e, $03, $00, $70, $0a +db $c8, $97, $c8 + + +db $5c, $50, $10, $10, $9c, $99, $9b, $95, $50, $91, $50, $1c, $05, $11, $5e, $03 +db $00, $70, $0a, $c8, $97, $c8 +;;;;;;;;;;;;;;; +db $91, $96, $A4, $95, $A2, $A4, $91, $A3, $A4, $95, $0A, $29, $FA, $C7 + +ORG $C79CB7 +db $D3, $00 + +ORG $C79D59 +db $0A, $EF, $DC, $EE + +ORG $EED16C +db $08, $df, $69, $c5, $00, $01, $70, $79, $a4, $50, $94, $95, $91, $9c, $a3, $50 +db $91, $92, $9f, $a5, $a4, $50, $68, $60, $50, $a0, $9f, $99, $9e, $a4, $a3, $50 +db $9f, $96, $50, $94, $91, $9d, $91, $97, $95, $50, $a4, $9f, $50, $95, $91, $93 +db $98, $50, $95, $9e, $95, $9d, $a9, $5e, $02 + +db $08, $df, $69, $c5, $00, $01, $70, $79, $a4, $50, $94, $95, $91, $9c, $a3, $50 +db $91, $92, $9f, $a5, $a4, $50, $61, $68, $60, $50, $a0, $9f, $99, $9e, $a4, $a3 +db $50, $9f, $96, $50, $94, $91, $9d, $91, $97, $95, $50, $a4, $9f, $50, $95, $91 +db $93, $98, $50, $95, $9e, $95, $9d, $a9, $5e, $02 + +db $70, $71, $50, $98, $91, $a2, $a3, $98, $50, $92, $9c, $91, $a3, $a4, $50, $9f +db $96, $50, $95, $9e, $95, $a2, $97, $a9, $50, $95, $9e, $97, $a5, $9c, $96, $a3 +db $50, $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $5c, $50, $99, $9e, $96, $9c +db $99, $93, $a4, $99, $9e, $97, $50, $91, $92, $9f, $a5, $a4, $02, $08, $df, $d1 +db $ee, $ff, $50, $69, $60, $50, $a0, $9f, $99, $9e, $a4, $a3, $50, $9f, $96, $50 +db $94, $91, $9d, $91, $97, $95, $5e, $01, $70, $79, $a4, $50, $9d, $91, $a9, $50 +db $99, $9e, $96, $9c, $99, $93, $a4, $50, $91, $92, $9f, $a5, $a4, $50, $98, $91 +db $9c, $96, $50, $91, $a3, $50, $9d, $a5, $93, $98, $50, $a4, $9f, $50, $9f, $a4 +db $98, $95, $a2, $50, $95, $9e, $95, $9d, $99, $95, $a3, $5e, $02, $08, $df, $d1 +db $ee, $ff, $50, $61, $68, $60, $50, $a0, $9f, $99, $9e, $a4, $a3, $50, $9f, $96 +db $50, $94, $91, $9d, $91, $97, $95, $5e, $01, $70, $79, $a4, $50, $9d, $91, $a9 +db $50, $99, $9e, $96, $9c, $99, $93, $a4, $50, $91, $92, $9f, $a5, $a4, $50, $98 +db $91, $9c, $96, $50, $91, $a3, $50, $9d, $a5, $93, $98, $50, $a4, $9f, $50, $9f +db $a4, $98, $95, $a2, $50, $95, $9e, $95, $9d, $99, $95, $a3, $5e, $02, $08, $df +db $d1, $ee, $ff, $50, $62, $67, $60, $50, $a0, $9f, $99, $9e, $a4, $a3, $50, $9f +db $96, $50, $94, $91, $9d, $91, $97, $95, $5e, $01, $70, $79, $a4, $50, $9d, $91 +db $a9, $50, $99, $9e, $96, $9c, $99, $93, $a4, $50, $91, $92, $9f, $a5, $a4, $50 +db $98, $91, $9c, $96, $50, $91, $a3, $50, $9d, $a5, $93, $98, $50, $a4, $9f, $50 +db $9f, $a4, $98, $95, $a2, $50, $95, $9e, $95, $9d, $99, $95, $a3, $5e, $02, $08 +db $df, $d1, $ee, $ff, $50, $63, $66, $60, $50, $a0, $9f, $99, $9e, $a4, $a3, $50 +db $9f, $96, $50, $94, $91, $9d, $91, $97, $95, $5e, $01, $70, $79, $a4, $50, $9d +db $91, $a9, $50, $99, $9e, $96, $9c, $99, $93, $a4, $50, $91, $92, $9f, $a5, $a4 +db $50, $98, $91, $9c, $96, $50, $91, $a3, $50, $9d, $a5, $93, $98, $50, $a4, $9f +db $50, $9f, $a4, $98, $95, $a2, $50, $95, $9e, $95, $9d, $99, $95, $a3, $5e, $02;PSI blast help text + +db $70, $71, $50, $a3, $a0, $91, $a2, $9b, $50, $9f, $96, $50, $95, $9e, $95, $a2, $97 +db $a9, $50, $99, $a3, $50, $a3, $98, $9f, $a4, $50, $91, $a4, $50, $9f, $9e, $95 +db $50, $95, $9e, $95, $9d, $a9, $5c, $50, $99, $9e, $96, $9c, $99, $93, $a4, $99 +db $9e, $97, $50, $91, $92, $9f, $a5, $a4, $50, $61, $62, $60, $50, $a0, $9f, $99 +db $9e, $a4, $a3, $50, $9f, $96, $50, $94, $91, $9d, $91, $97, $95, $5e, $01, $70 +db $84, $98, $95, $50, $96, $91, $a3, $a4, $95, $a2, $50, $a9, $9f, $a5, $50, $91 +db $a2, $95, $5c, $50, $a4, $98, $95, $50, $9d, $9f, $a2, $95, $50, $9c, $99, $9b +db $95, $9c, $a9, $50, $99, $a4, $50, $99, $a3, $50, $96, $9f, $a2, $50, $a4, $98 +db $95, $50, $a3, $a0, $91, $a2, $9b, $50, $a4, $9f, $50, $98, $99, $a4, $5e, $02 +db $70, $7f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $50, $99, $a3, $50, $a3, $a4 +db $a2, $a5, $93, $9b, $50, $92, $a9, $50, $02, $a3, $a0, $91, $a2, $9b, $a3, $50 +db $9f, $96, $50, $95, $9e, $95, $a2, $97, $a9, $50, $96, $9f, $a2, $50, $91, $92 +db $9f, $a5, $a4, $50, $61, $62, $60, $50, $a0, $9f, $99, $9e, $a4, $a3, $50, $9f +db $96, $50, $94, $91, $9d, $91, $97, $95, $50, $95, $91, $93, $98, $5e, $01, $70 +db $84, $98, $95, $50, $a3, $a0, $91, $a2, $9b, $a3, $50, $91, $a2, $95, $50, $9d +db $9f, $a2, $95, $50, $9c, $99, $9b, $95, $9c, $a9, $50, $a4, $9f, $50, $98, $99 +db $a4, $50, $a4, $98, $95, $50, $96, $91, $a3, $a4, $95, $a2, $50, $a9, $9f, $a5 +db $50, $91, $a2, $95, $50, $a4, $98, $91, $9e, $50, $a4, $98, $95, $50, $a4, $91 +db $a2, $97, $95, $a4, $5e, $02, $08, $f0, $d3, $ee, $ff, $63, $50, $08, $09, $d4 +db $ee, $ff, $02, $08, $f0, $d3, $ee, $ff, $65, $50, $08, $09, $d4, $ee, $ff, $02 +db $08, $f0, $d3, $ee, $ff, $61, $65, $50, $08, $09, $d4, $ee, $ff, $02;PSI Missile help text +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +db $70, $74, $91, $9d, $91, $97, $95, $a3, $50, $91, $9c, $9c, $50, $95, $9e, $95 +db $9d, $99, $95, $a3, $50, $a7, $98, $95, $9e, $50, $a5, $a3, $95, $94, $50, $99 +db $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $02, $01, $50, $6c, $1c, $05, $93 +db $6e, $03, $00, $08, $ae, $d4, $ee, $ff, $03, $00, $08, $ab, $6d, $c5, $00, $13 +db $02;psycho bomb + +db $70, $77, $a2, $95, $91, $a4, $9c, $a9, $50, $94, $91, $9d, $91, $97, $95, $a3 +db $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95, $a3, $50, $a7, $98, $95 +db $9e, $50, $a5, $a3, $95, $94, $50, $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95 +db $5e, $02, $01, $50, $6c, $1c, $05, $94, $6e, $03, $00, $08, $ef, $d4, $ee, $ff +db $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;Mad psycho bomb + +db $01, $50, $6c, $1c, $05, $93, $6e, $03, $00, $70, $87, $98, $95, $9e, $50, $a5 +db $a3, $95, $94, $50, $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5c, $50, $99 +db $a4, $50, $93, $91, $9e, $50, $9d, $91, $9b, $95, $50, $91, $9c, $9c, $50, $95 +db $9e, $95, $9d, $99, $95, $a3, $50, $93, $a2, $a9, $50, $a5, $9e, $93, $9f, $9e +db $a4, $a2, $9f, $9c, $9c, $91, $92, $9c, $a9, $5c, $03, $00, $70, $9f, $a2, $50 +db $9f, $93, $93, $91, $a3, $99, $9f, $9e, $91, $9c, $9c, $a9, $50, $96, $95, $95 +db $9c, $50, $a3, $a4, $a2, $91, $9e, $97, $95, $5e, $03, $00, $08, $ab, $6d, $c5 +db $00, $13, $02;Flash bomb + +db $01, $50, $6c, $1c, $05, $94, $6e, $03, $00, $70, $87, $98, $95, $9e, $50, $a5 +db $a3, $95, $94, $50, $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5c, $50, $99 +db $a4, $50, $93, $91, $9e, $50, $9d, $91, $9b, $95, $50, $91, $9c, $9c, $50, $95 +db $9e, $95, $9d, $99, $95, $a3, $50, $93, $a2, $a9, $50, $a5, $9e, $93, $9f, $9e +db $a4, $a2, $9f, $9c, $9c, $91, $92, $9c, $a9, $5c, $03, $00, $70, $91, $9e, $94 +db $50, $a7, $99, $9c, $9c, $50, $9f, $96, $a4, $95, $9e, $50, $94, $95, $a3, $a4 +db $a2, $9f, $a9, $50, $91, $9e, $50, $95, $9e, $95, $9d, $a9, $50, $99, $9e, $50 +db $91, $50, $a3, $99, $9e, $97, $9c, $95, $50, $a3, $a4, $a2, $99, $9b, $95, $5e +db $03, $08, $ab, $6d, $c5, $00, $13, $02;Flash bomb 2 + +db $74, $95, $91, $9c, $a3, $50, $96, $99, $a2, $95, $50, $94, $91, $9d, $91, $97 +db $95, $50, $a4, $9f, $50, $91, $50, $a2, $9f, $a7, $50, $9f, $96, $50, $95, $9e +db $95, $9d, $99, $95, $a3, $02, $01, $50, $6c, $1c, $05, $93, $6e, $03, $00, $70 +db $08, $33, $d6, $ee, $ff, $50, $a7, $98, $95, $9e, $50, $a5, $a3, $95, $94, $50 +db $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $ab, $6d, $c5 +db $00, $13, $02;Fire bomb + +db $74, $95, $91, $9c, $a3, $50, $98, $95, $91, $a6, $a9, $5d, $94, $a5, $a4, $a9 +db $50, $96, $99, $a2, $95, $50, $94, $91, $9d, $91, $97, $95, $50, $a4, $9f, $50 +db $91, $50, $a2, $9f, $a7, $50, $9f, $96, $50, $95, $9e, $95, $9d, $99, $95, $a3 +db $50, $a7, $98, $95, $9e, $50, $a5, $a3, $95, $94, $50, $99, $9e, $50, $92, $91 +db $a4, $a4, $9c, $95, $5e, $02, $01, $50, $6c, $1c, $05, $94, $6e, $03, $00, $70 +db $08, $86, $d6, $ee, $ff, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;Fire bomb 2 + +db $74, $95, $91, $9c, $a3, $50, $99, $93, $95, $50, $94, $91, $9d, $91, $97, $95 +db $50, $a4, $9f, $50, $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $50, $a7, $98 +db $95, $9e, $50, $a5, $a3, $95, $94, $50, $99, $9e, $50, $92, $91, $a4, $a4, $9c +db $95, $5e, $02, $7f, $93, $93, $91, $a3, $99, $9f, $9e, $91, $9c, $9c, $a9, $5c +db $50, $99, $a4, $50, $9d, $91, $a9, $50, $96, $a2, $95, $95, $aa, $95, $50, $a4 +db $98, $95, $50, $95, $9e, $95, $9d, $a9, $50, $a3, $9f, $9c, $99, $94, $5e, $02 +db $01, $50, $6c, $1c, $05, $93, $6e, $03, $00, $70, $08, $e4, $d6, $ee, $ff, $03 +db $00, $70, $08, $17, $d7, $ee, $ff, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;Ice bomb + +db $74, $95, $91, $9c, $a3, $50, $98, $95, $91, $a6, $a9, $50, $99, $93, $95, $50 +db $94, $91, $9d, $91, $97, $95, $50, $a4, $9f, $50, $9f, $9e, $95, $50, $95, $9e +db $95, $9d, $a9, $50, $a7, $98, $95, $9e, $50, $a5, $a3, $95, $94, $50, $99, $9e +db $50, $92, $91, $a4, $a4, $9c, $95, $5e, $02, $01, $50, $6c, $1c, $05, $94, $6e +db $03, $00, $70, $08, $64, $d7, $ee, $ff, $03, $00, $70, $08, $17, $d7, $ee, $ff +db $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;Ice bomb 2 + +db $87, $98, $95, $9e, $50, $a5, $a3, $95, $94, $50, $99, $9e, $50, $92, $91, $a4 +db $a4, $9c, $95, $5c, $50, $a4, $98, $95, $50, $95, $9e, $95, $9d, $a9, $50, $99 +db $a3, $50, $a3, $a4, $a2, $a5, $93, $9b, $50, $a7, $99, $a4, $98, $50, $91, $50 +db $9c, $99, $97, $98, $a4, $99, $9e, $97, $50, $92, $9f, $9c, $a4, $5e, $02, $79 +db $a4, $50, $9d, $91, $a9, $50, $9d, $99, $a3, $a3, $50, $99, $96, $50, $a4, $98 +db $95, $a2, $95, $50, $91, $a2, $95, $50, $96, $95, $a7, $50, $95, $9e, $95, $9d +db $99, $95, $a3, $5e, $02, $01, $50, $6c, $1c, $05, $93, $6e, $03, $00, $70, $08 +db $bd, $d7, $ee, $ff, $03, $00, $01, $70, $08, $fc, $d7, $ee, $ff, $03, $00, $08 +db $ab, $6d, $c5, $00, $13, $02;Thunder bomb + +db $87, $98, $95, $9e, $50, $a5, $a3, $95, $94, $50, $99, $9e, $50, $92, $91, $a4 +db $a4, $9c, $95, $5c, $50, $a4, $98, $95, $50, $95, $9e, $95, $9d, $a9, $50, $99 +db $a3, $50, $a3, $a4, $a2, $a5, $93, $9b, $50, $a7, $99, $a4, $98, $50, $91, $50 +db $9c, $99, $97, $98, $a4, $99, $9e, $97, $50, $92, $9f, $9c, $a4, $50, $a4, $98 +db $a2, $95, $95, $50, $a4, $99, $9d, $95, $a3, $5e, $02, $01, $50, $6c, $1c, $05 +db $94, $6e, $03, $00, $70, $08, $43, $d8, $ee, $ff, $03, $00, $70, $08, $fc, $d7 +db $ee, $ff, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02; Thunder bomb 2 + +db $01, $50, $6c, $1c, $05, $93, $6e, $03, $00, $70, $71, $50, $a0, $9f, $a7, $95 +db $a2, $96, $a5, $9c, $50, $a7, $95, $91, $a0, $9f, $9e, $50, $a4, $98, $91, $a4 +db $50, $94, $95, $91, $9c, $a3, $50, $98, $95, $91, $a6, $a9, $50, $98, $95, $91 +db $a6, $a9, $50, $94, $91, $9d, $91, $97, $95, $50, $a4, $9f, $50, $91, $9c, $9c +db $50, $95, $9e, $95, $9d, $99, $95, $a3, $50, $a7, $98, $95, $9e, $50, $a5, $a3 +db $95, $94, $50, $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08 +db $ab, $6d, $c5, $00, $13, $02;Star bomb 1 + +db $01, $50, $6c, $1c, $05, $94, $6e, $03, $00, $70, $84, $98, $95, $50, $a3, $a4 +db $a2, $9f, $9e, $97, $95, $a3, $a4, $50, $a7, $95, $91, $a0, $9f, $9e, $50, $91 +db $a2, $9f, $a5, $9e, $94, $5e, $03, $00, $70, $74, $95, $91, $9c, $a3, $50, $95 +db $a8, $a4, $a2, $95, $9d, $95, $50, $94, $91, $9d, $91, $97, $95, $50, $a4, $9f +db $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95, $a3, $50, $a7, $98, $95 +db $9e, $50, $a5, $a3, $95, $94, $50, $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95 +db $5e, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;star bomb 2 + +db $74, $91, $9d, $91, $97, $95, $a3, $50, $9f, $9e, $95, $50, $95, $9e, $95, $9d +db $a9, $50, $a7, $98, $95, $9e, $50, $a5, $a3, $95, $94, $50, $99, $9e, $50, $92 +db $91, $a4, $a4, $9c, $95, $5e, $02, $01, $50, $6c, $1c, $05, $94, $6e, $03, $00 +db $70, $08, $7e, $d9, $ee, $ff, $03, $00, $70, $79, $a4, $50, $9d, $91, $a9, $50 +db $92, $95, $50, $91, $50, $94, $a5, $94, $5e, $03, $00, $08, $ab, $6d, $c5, $00 +db $13, $02;Missile bomb 1 + +db $77, $a2, $95, $91, $a4, $9c, $a9, $50, $94, $91, $9d, $91, $97, $95, $a3, $50 +db $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $50, $a7, $98, $95, $9e, $50, $a5 +db $a3, $95, $94, $50, $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $02, $01 +db $50, $6c, $1c, $05, $94, $6e, $03, $00, $70, $08, $d0, $d9, $ee, $ff, $03, $00 +db $70, $79, $a4, $50, $99, $a3, $50, $9d, $9f, $a2, $95, $50, $95, $96, $96, $95 +db $93, $a4, $99, $a6, $95, $50, $91, $97, $91, $99, $9e, $a3, $a4, $50, $95, $9e +db $95, $9d, $99, $95, $a3, $50, $a3, $9c, $9f, $a7, $95, $a2, $50, $a4, $98, $91 +db $9e, $50, $a9, $9f, $a5, $5e, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;Missile bomb 2 + +db $01, $50, $6c, $1c, $05, $85, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $08, $ae +db $d4, $ee, $ff, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Psychic bazooka 1 + +db $01, $50, $6c, $1c, $05, $86, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $08, $ef +db $d4, $ee, $ff, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Psychic bazooka 2 + +db $01, $50, $6c, $1c, $05, $85, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $79 +db $a4, $50, $93, $91, $9e, $50, $9d, $91, $9b, $95, $50, $a4, $98, $95, $50, $95 +db $9e, $95, $9d, $a9, $50, $93, $a2, $a9, $5c, $50, $9f, $a2, $50, $9f, $93, $93 +db $91, $a3, $99, $9f, $9e, $91, $9c, $9c, $a9, $50, $96, $95, $95, $9c, $50, $a3 +db $a4, $a2, $91, $9e, $97, $95, $5e, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Flash bazooka 1 + +db $01, $50, $6c, $1c, $05, $86, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $75 +db $9d, $99, $a4, $a3, $50, $91, $50, $98, $95, $91, $a6, $a9, $5d, $94, $a5, $a4 +db $a9, $50, $96, $9c, $91, $a3, $98, $50, $a4, $98, $91, $a4, $50, $98, $91, $a3 +db $50, $91, $50, $98, $99, $97, $98, $50, $93, $98, $91, $9e, $93, $95, $50, $9f +db $96, $50, $9b, $9e, $9f, $93, $9b, $99, $9e, $97, $50, $9f, $a5, $a4, $50, $95 +db $9e, $95, $9d, $99, $95, $a3, $5e, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Flash bazooka 2 + +db $01, $50, $6c, $1c, $05, $85, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $08 +db $33, $d6, $ee, $ff, $50, $a7, $98, $95, $9e, $50, $a5, $a3, $95, $94, $50, $99 +db $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $08, $9b, $6d, $c5, $ff, $13 +db $02;Fire bazooka 1 + +db $01, $50, $6c, $1c, $05, $86, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $08 +db $86, $d6, $ee, $ff, $03, $00, $08, $9b, $6d, $c5, $ff, $13, $02;Fire bazooka 2 + +db $01, $50, $6c, $1c, $05, $85, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $08 +db $e4, $d6, $ee, $ff, $03, $00, $08, $9b, $6d, $c5, $ff, $13, $02;Freeze bazooka 1 + +db $01, $50, $6c, $1c, $05, $86, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $08 +db $64, $d7, $ee, $ff, $03, $00, $08, $9b, $6d, $c5, $ff, $13, $02;Freeze bazooka 2 + +db $01, $50, $6c, $1c, $05, $85, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $08 +db $bd, $d7, $ee, $ff, $03, $00, $70, $08, $fc, $d7, $ee, $ff, $03, $00, $08, $9b +db $6d, $c5, $ff, $13, $02;Thunder bazooka 1 + +db $01, $50, $6c, $1c, $05, $86, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $08 +db $43, $d8, $ee, $ff, $03, $00, $70, $08, $fc, $d7, $ee, $ff, $03, $00, $08, $9b +db $6d, $c5, $ff, $13, $02;Thunder bazooka 2 + +db $01, $50, $6c, $1c, $05, $85, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $08 +db $7e, $d9, $ee, $ff, $03, $00, $70, $79, $a4, $50, $9d, $91, $a9, $50, $9e, $9f +db $a4, $50, $91, $9c, $a7, $91, $a9, $a3, $50, $a7, $9f, $a2, $9b, $5e, $03, $00 +db $08, $9b, $6d, $c5, $ff, $13, $02;Missile bazooka 1 + +db $01, $50, $6c, $1c, $05, $86, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $08 +db $d0, $d9, $ee, $ff, $03, $00, $70, $7d, $9f, $a2, $95, $50, $9d, $99, $a3, $a3 +db $99, $9c, $95, $a3, $50, $91, $a2, $95, $50, $9c, $99, $9b, $95, $9c, $a9, $50 +db $a4, $9f, $50, $98, $99, $a4, $50, $99, $96, $50, $a9, $9f, $a5, $50, $91, $a2 +db $95, $50, $96, $91, $a3, $a4, $95, $a2, $50, $a4, $98, $91, $9e, $50, $a4, $98 +db $95, $50, $95, $9e, $95, $9d, $a9, $5e, $03, $00, $08, $9b, $6d, $c5, $ff, $13 +db $02;Missile bazooka 2 + +db $78, $95, $91, $a6, $99, $9c, $a9, $50, $94, $91, $9d, $91, $97, $95, $a3, $50 +db $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95, $a3, $50, $a7, $98, $95, $9e +db $50, $a5, $a3, $95, $94, $50, $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e +db $02, $01, $50, $6c, $1c, $05, $86, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70 +db $08, $a1, $dc, $ee, $ff, $03, $00, $08, $9b, $6d, $c5, $ff, $13, $02;Starstorm bazooka 2 + +db $15, $03, $03, $18, $04, $05, $0B, $00, $0A, $5E, $9D, $C7;Not bazooka, fix enemies disappearing on rnwy5 + +db $01, $50, $6c, $1c, $05, $0d, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f, $9b +db $95, $9e, $50, $a2, $91, $94, $99, $9f, $5e, $00, $03, $08, $6f, $6b, $c5, $00 +db $13, $02;Broken radio + +db $01, $50, $6c, $1c, $05, $0d, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f, $9b +db $95, $9e, $50, $93, $91, $9d, $95, $a2, $91, $5e, $03, $00, $08, $6f, $6b, $c5 +db $00, $13, $02;Broken camera + +db $01, $50, $6c, $1c, $05, $0d, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f, $9b +db $95, $9e, $50, $a4, $9f, $91, $a3, $a4, $95, $a2, $5e, $03, $00, $08, $6f, $6b +db $c5, $00, $13, $02;Broken toaster + +db $01, $50, $6c, $1c, $05, $0d, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f, $9b +db $95, $9e, $50, $93, $9f, $9f, $9c, $99, $9e, $97, $50, $a5, $9e, $99, $a4, $50 +db $96, $a2, $9f, $9d, $50, $91, $50, $9d, $99, $9e, $99, $50, $96, $a2, $99, $94 +db $97, $95, $5e, $03, $00, $08, $6f, $6b, $c5, $00, $13, $02;Broken minifridge + +db $01, $50, $6c, $1c, $05, $0d, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f, $9b +db $95, $9e, $50, $a3, $a0, $a2, $99, $9e, $97, $5e, $03, $00, $08, $6f, $6b, $c5 +db $00, $13, $02;Broken spring + +db $01, $50, $6c, $1c, $05, $0d, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f, $9b +db $95, $9e, $50, $98, $91, $9e, $94, $98, $95, $9c, $94, $50, $a2, $91, $94, $91 +db $a2, $5e, $03, $00, $08, $6f, $6b, $c5, $00, $13, $02;Broken radar + +db $01, $50, $6c, $1c, $05, $0d, $6e, $03, $00, $70, $71, $50, $a0, $91, $a2, $a4 +db $50, $96, $a2, $9f, $9d, $50, $91, $50, $92, $a2, $9f, $9b, $95, $9e, $50, $a6 +db $91, $93, $a5, $a5, $9d, $50, $93, $9c, $95, $91, $9e, $95, $a2, $5e, $03, $00 +db $08, $6f, $6b, $c5, $00, $13, $02;Broken vacuum + +db $01, $50, $6c, $1c, $05, $90, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $08, $ae +db $d4, $ee, $ff, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;Special BR + +db $01, $50, $6c, $1c, $05, $91, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $72 +db $9c, $91, $a3, $a4, $a3, $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95 +db $a3, $50, $a7, $99, $a4, $98, $50, $a0, $a3, $a9, $93, $98, $99, $93, $50, $95 +db $9e, $95, $a2, $97, $a9, $5e, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;Special BBR + +db $01, $50, $6C, $1c, $05, $92, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $85, $9e, $9c, $95 +db $91, $a3, $98, $95, $a3, $50, $91, $50, $a7, $91, $a6, $95, $50, $9f, $96, $50 +db $a0, $a3, $a9, $93, $98, $99, $93, $50, $95, $9e, $95, $a2, $97, $a9, $50, $a4 +db $98, $91, $a4, $50, $97, $a2, $95, $91, $a4, $9c, $a9, $50, $94, $91, $9d, $91 +db $97, $95, $a3, $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95, $a3, $5e +db $03, $00, $08, $ab, $6d, $c5, $ff, $13, $02;Special MBR + +db $01, $50, $6c, $1c, $05, $90, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $7d +db $91, $9b, $95, $a3, $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95, $a3 +db $50, $93, $a2, $a9, $50, $a5, $9e, $93, $9f, $9e, $a4, $a2, $9f, $9c, $9c, $91 +db $92, $9c, $a9, $5c, $50, $9f, $a2, $50, $9f, $93, $93, $91, $a3, $99, $9f, $9e +db $91, $9c, $9c, $a9, $50, $96, $95, $95, $9c, $50, $a3, $a4, $a2, $91, $9e, $97 +db $95, $5e, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;Flash BR + +db $01, $50, $6c, $1c, $05, $91, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $75 +db $9d, $99, $a4, $95, $a3, $50, $91, $50, $92, $a2, $99, $97, $98, $a4, $50, $96 +db $9c, $91, $a3, $98, $50, $a4, $98, $91, $a4, $50, $93, $91, $9e, $50, $9d, $91 +db $9b, $95, $50, $95, $9e, $95, $9d, $99, $95, $a3, $50, $93, $a2, $a9, $50, $a5 +db $9e, $93, $9f, $9e, $a4, $a2, $9f, $9c, $9c, $91, $92, $9c, $a9, $5c, $03, $00 +db $70, $9f, $a2, $50, $9f, $93, $93, $91, $a3, $99, $9f, $9e, $91, $9c, $9c, $a9 +db $50, $92, $95, $50, $94, $95, $a3, $a4, $a2, $9f, $a9, $95, $94, $5e, $03, $00 +db $08, $ab, $6d, $c5, $ff, $13, $02;Flash BBR + +db $01, $50, $6c, $1c, $05, $92, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $75 +db $9d, $99, $a4, $a3, $50, $91, $50, $97, $9c, $9f, $a2, $99, $9f, $a5, $a3, $50 +db $9c, $99, $97, $98, $a4, $50, $a4, $98, $91, $a4, $50, $98, $91, $a3, $50, $91 +db $50, $98, $99, $97, $98, $50, $a0, $a2, $9f, $92, $91, $92, $99, $9c, $99, $a4 +db $a9, $50, $9f, $96, $50, $94, $95, $a3, $a4, $a2, $9f, $a9, $99, $9e, $97, $50 +db $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95, $a3, $5e, $03, $00, $08, $ab +db $6d, $c5, $ff, $13, $02;Flash MBR + +db $01, $50, $6c, $1c, $05, $90, $6e, $03, $00, $08, $b7, $6d, $c5, $03, $70, $08 +db $33, $d6, $ee, $ff, $5e, $03, $00, $08, $ab, $6d, $c5, $ff, $13, $02;Fire BR + +db $01, $50, $6c, $1c, $05, $91, $6e, $03, $00, $08, $b7, $6d, $c5, $ff, $70, $82 +db $9f, $91, $a3, $a4, $a3, $50, $91, $50, $a2, $9f, $a7, $50, $9f, $96, $50, $95 +db $9e, $95, $9d, $99, $95, $a3, $5e, $03, $00, $08, $ab, $6d, $c5, $ff, $13, $02;Fire BBR + +db $01, $50, $6c, $1c, $05, $92, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $82 +db $95, $91, $9c, $9c, $a9, $50, $a2, $9f, $91, $a3, $a4, $a3, $50, $91, $50, $a2 +db $9f, $a7, $50, $9f, $96, $50, $95, $9e, $95, $9d, $99, $95, $a3, $5e, $03, $00 +db $08, $ab, $6d, $c5, $ff, $13, $02;Fire MBR + +db $01, $50, $6c, $1c, $05, $90, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $08 +db $e4, $d6, $ee, $ff, $03, $00, $08, $ab, $6d, $c5, $ff, $13, $02;Freeze BR + +db $01, $50, $6c, $1c, $05, $91, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $83 +db $a0, $9c, $91, $a3, $98, $95, $a3, $50, $99, $93, $95, $5d, $93, $9f, $9c, $94 +db $50, $9e, $99, $a4, $a2, $9f, $97, $95, $9e, $50, $9f, $9e, $50, $91, $9e, $50 +db $95, $9e, $95, $9d, $a9, $5e, $03, $00, $70, $7f, $93, $93, $91, $a3, $99, $9f +db $9e, $91, $9c, $9c, $a9, $5c, $50, $99, $a4, $50, $9d, $91, $a9, $50, $96, $a2 +db $95, $95, $aa, $95, $50, $a4, $98, $95, $9d, $50, $a3, $9f, $9c, $99, $94, $5e +db $03, $00, $08, $ab, $6d, $c5, $ff, $13, $02;Freeze BBR + +db $01, $50, $6c, $1c, $05, $92, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $83 +db $a0, $9c, $91, $a3, $98, $95, $a3, $50, $91, $50, $9c, $9f, $a4, $50, $9f, $96 +db $50, $99, $93, $95, $5d, $93, $9f, $9c, $94, $50, $9e, $99, $a4, $a2, $9f, $97 +db $95, $9e, $50, $9f, $9e, $50, $91, $9e, $50, $95, $9e, $95, $9d, $a9, $5e, $03 +db $00, $70, $7f, $93, $93, $91, $a3, $99, $9f, $9e, $91, $9c, $9c, $a9, $5c, $50 +db $99, $a4, $50, $9d, $91, $a9, $50, $96, $a2, $95, $95, $aa, $95, $50, $a4, $98 +db $95, $9d, $50, $a3, $9f, $9c, $99, $94, $5e, $03, $00, $08, $ab, $6d, $c5, $ff +db $13, $02;Freeze MBR + +db $01, $50, $6c, $1c, $05, $90, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $08 +db $bd, $d7, $ee, $ff, $03, $00, $01, $70, $08, $fc, $d7, $ee, $ff, $03, $00, $08 +db $ab, $6d, $c5, $00, $13, $02;Thunder BR + +db $01, $50, $6c, $1c, $05, $91, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $83 +db $98, $9f, $9f, $a4, $a3, $50, $a4, $a7, $9f, $50, $a3, $a0, $91, $a2, $9b, $a3 +db $50, $9f, $a5, $a4, $50, $a4, $9f, $a7, $91, $a2, $94, $a3, $50, $a4, $98, $95 +db $50, $95, $9e, $95, $9d, $a9, $5e, $03, $00, $70, $84, $98, $95, $a9, $50, $9d +db $91, $a9, $50, $9d, $99, $a3, $a3, $50, $99, $96, $50, $a4, $98, $95, $a2, $95 +db $50, $91, $a2, $95, $50, $96, $95, $a7, $50, $95, $9e, $95, $9d, $99, $95, $a3 +db $5e, $03, $00, $08, $ab, $6d, $c5, $ff, $13, $02;Thunder BBR + +db $01, $50, $6c, $1c, $05, $92, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $83 +db $98, $9f, $9f, $a4, $a3, $50, $96, $9f, $a5, $a2, $50, $a3, $a0, $91, $a2, $9b +db $a3, $50, $9f, $a5, $a4, $50, $a4, $9f, $a7, $91, $a2, $94, $a3, $50, $a4, $98 +db $95, $50, $95, $9e, $95, $9d, $a9, $5e, $03, $00, $70, $84, $98, $95, $a9, $50 +db $9d, $91, $a9, $50, $9d, $99, $a3, $a3, $50, $99, $96, $50, $a4, $98, $95, $a2 +db $95, $50, $91, $a2, $95, $50, $96, $95, $a7, $50, $95, $9e, $95, $9d, $99, $95 +db $a3, $5e, $03, $00, $08, $ab, $6d, $c5, $ff, $13, $02;Thunder MBR + +db $01, $50, $6c, $1c, $05, $90, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $08, $ae +db $d4, $ee, $ff, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;Starstorm BR + +db $01, $50, $6c, $1c, $05, $91, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $82 +db $91, $99, $9e, $a3, $50, $a3, $a4, $91, $a2, $a3, $50, $94, $9f, $a7, $9e, $50 +db $9f, $9e, $50, $95, $9e, $95, $9d, $99, $95, $a3, $5e, $03, $00, $08, $ab, $6d +db $c5, $ff, $13, $02;Starstorm BBR + +db $01, $50, $6c, $1c, $05, $92, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $72 +db $9f, $9d, $92, $91, $a2, $94, $a3, $50, $95, $9e, $95, $9d, $99, $95, $a3, $50 +db $a7, $99, $a4, $98, $50, $91, $50, $a4, $9f, $a2, $a2, $95, $9e, $a4, $50, $9f +db $96, $50, $a3, $a4, $91, $a2, $a3, $5e, $03, $00, $70, $80, $9f, $a3, $a3, $99 +db $92, $9c, $a9, $50, $a4, $98, $95, $50, $a3, $a4, $a2, $9f, $9e, $97, $95, $a3 +db $a4, $50, $a7, $95, $91, $a0, $9f, $9e, $50, $91, $a2, $9f, $a5, $9e, $94, $5e +db $03, $00, $08, $ab, $6d, $c5, $ff, $13, $02;Starstorm MBR + +db $01, $50, $6c, $1c, $05, $90, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $08, $c5 +db $6d, $c5, $ff, $0a, $b5, $4e, $c5;Bomb BR + +db $01, $50, $6c, $1c, $05, $91, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $0a, $00 +db $4f, $c5;Bomb BBR + +db $01, $50, $6c, $1c, $05, $92, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $75 +db $9e, $97, $a5, $9c, $96, $a3, $50, $91, $9e, $50, $95, $9e, $95, $9d, $a9, $50 +db $99, $9e, $50, $91, $50, $9d, $91, $a3, $a3, $99, $a6, $95, $50, $95, $a8, $a0 +db $9c, $9f, $a3, $99, $9f, $9e, $5e, $03, $00, $70, $84, $98, $95, $50, $92, $9c +db $91, $a3, $a4, $50, $99, $a3, $50, $a0, $9f, $a7, $95, $a2, $96, $a5, $9c, $50 +db $95, $9e, $9f, $a5, $97, $98, $50, $a4, $9f, $50, $91, $96, $96, $95, $93, $a4 +db $50, $9e, $95, $91, $a2, $92, $a9, $50, $95, $9e, $95, $9d, $99, $95, $a3, $5e +db $03, $00, $08, $ab, $6d, $c5, $ff, $13, $02;Bomb MBR + +db $70, $79, $9e, $93, $a2, $95, $91, $a3, $95, $50, $9f, $9e, $95, $50, $a0, $95 +db $a2, $a3, $9f, $9e, $57, $a3, $50, $74, $95, $96, $95, $9e, $a3, $95, $50, $96 +db $9f, $a2, $50, $a4, $98, $95, $50, $94, $a5, $a2, $91, $a4, $99, $9f, $9e, $50 +db $9f, $96, $50, $a4, $98, $95, $50, $93, $a5, $a2, $a2, $95, $9e, $a4, $50, $92 +db $91, $a4, $a4, $9c, $95, $5e, $00, $08, $0d, $6b, $c5, $ff, $02;def up a + +db $70, $79, $9e, $93, $a2, $95, $91, $a3, $95, $50, $95, $a6, $95, $a2, $a9, $9f +db $9e, $95, $57, $a3, $50, $74, $95, $96, $95, $9e, $a3, $95, $50, $96, $9f, $a2 +db $50, $a4, $98, $95, $50, $94, $a5, $a2, $91, $a4, $99, $9f, $9e, $50, $9f, $96 +db $50, $a4, $98, $95, $50, $93, $a5, $a2, $a2, $95, $9e, $a4, $50, $92, $91, $a4 +db $a4, $9c, $95, $5e, $00, $08, $0d, $6b, $c5, $ff, $02;def up o + +db $70, $74, $a2, $91, $99, $9e, $a3, $50, $78, $80, $50, $96, $a2, $9f, $9d, $50 +db $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $5e, $00, $70, $84, $98, $95, $50 +db $9d, $9f, $a2, $95, $50, $78, $80, $50, $91, $9e, $50, $95, $9e, $95, $9d, $a9 +db $50, $98, $91, $a3, $5c, $50, $a4, $98, $95, $50, $9d, $9f, $a2, $95, $50, $a9 +db $9f, $a5, $50, $97, $95, $a4, $5e, $02;Drain a + +db $70, $74, $a2, $91, $99, $9e, $a3, $50, $a3, $9f, $9d, $95, $50, $78, $80, $50 +db $96, $a2, $9f, $9d, $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95, $a3 +db $5e, $00, $70, $84, $98, $95, $50, $9d, $9f, $a2, $95, $50, $78, $80, $50, $a4 +db $98, $95, $50, $95, $9e, $95, $9d, $99, $95, $a3, $50, $98, $91, $a6, $95, $5c +db $50, $a4, $98, $95, $50, $9d, $9f, $a2, $95, $50, $a9, $9f, $a5, $50, $97, $95 +db $a4, $5e, $02;Drain o + +db $70, $7d, $91, $9b, $95, $a3, $50, $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9 +db $50, $a5, $9e, $91, $92, $9c, $95, $50, $a4, $9f, $50, $93, $9f, $9e, $93, $95 +db $9e, $a4, $a2, $91, $a4, $95, $50, $96, $9f, $a2, $50, $91, $50, $a3, $98, $9f +db $a2, $a4, $50, $a4, $99, $9d, $95, $5e, $02;disable a + +db $70, $7d, $91, $9b, $95, $a3, $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99 +db $95, $a3, $50, $a5, $9e, $91, $92, $9c, $95, $50, $a4, $9f, $50, $93, $9f, $9e +db $93, $95, $9e, $a4, $a2, $91, $a4, $95, $50, $96, $9f, $a2, $50, $91, $50, $a3 +db $98, $9f, $a2, $a4, $50, $a4, $99, $9d, $95, $5e, $02;disable o + +db $70, $83, $9f, $9c, $99, $94, $99, $96, $99, $95, $a3, $50, $9f, $9e, $95, $50 +db $95, $9e, $95, $9d, $a9, $5e, $02;Stop a + +db $70, $83, $9f, $9c, $99, $94, $99, $96, $99, $95, $a3, $50, $91, $9c, $9c, $50 +db $95, $9e, $95, $9d, $99, $95, $a3, $5e, $02;stop o + +db $70, $82, $95, $9d, $9f, $a6, $95, $a3, $50, $91, $50, $a3, $98, $99, $95, $9c +db $94, $50, $96, $a2, $9f, $9d, $50, $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9 +db $5e, $00, $70, $79, $a4, $50, $9d, $91, $a9, $50, $9f, $93, $93, $91, $a3, $99 +db $9f, $9e, $91, $9c, $9c, $a9, $50, $96, $91, $99, $9c, $5e, $02;Neutralize a + +db $70, $82, $95, $9d, $9f, $a6, $95, $a3, $50, $a3, $98, $99, $95, $9c, $94, $a3 +db $50, $96, $a2, $9f, $9d, $50, $95, $a6, $95, $a2, $a9, $9f, $9e, $95, $50, $99 +db $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $00, $70, $82, $95, $a3, $95, $a4 +db $a3, $50, $91, $92, $99, $9c, $99, $a4, $a9, $50, $93, $98, $91, $9e, $97, $95 +db $a3, $50, $9f, $96, $50, $95, $a6, $95, $a2, $a9, $9f, $9e, $95, $50, $99, $9e +db $50, $92, $91, $a4, $a4, $9c, $95, $5e, $02;Neutralize o +;;;;;;;;;;;;;;;;;;;; +db $01, $50, $6c, $1c, $05, $a1, $6e, $03, $00, $70, $80, $a5, $a4, $a3, $50, $9f +db $9e, $95, $50, $95, $9e, $95, $9d, $a9, $50, $a4, $9f, $50, $a3, $9c, $95, $95 +db $a0, $50, $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $ab +db $6d, $c5, $ff, $13, $02;sleep spray + + +db $01, $50, $6c, $1c, $05, $a1, $6e, $03, $00, $70, $80, $91, $a2, $91, $9c, $a9 +db $aa, $95, $a3, $50, $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $50, $99, $9e +db $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $ab, $6d, $c5, $00, $13 +db $02;para spray + +db $01, $50, $6c, $1c, $05, $a1, $6e, $03, $00, $70, $79, $9e, $93, $a2, $95, $91 +db $a3, $95, $50, $9f, $9e, $95, $50, $9f, $96, $50, $a4, $98, $95, $50, $96, $a2 +db $99, $95, $9e, $94, $a3, $50, $7f, $96, $96, $95, $9e, $a3, $95, $50, $94, $a5 +db $a2, $99, $9e, $97, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $0d +db $6b, $c5, $00, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;off up spray + +db $01, $50, $6c, $1c, $05, $a1, $6e, $03, $00, $70, $74, $95, $93, $a2, $95, $91 +db $a3, $95, $50, $9f, $9e, $95, $50, $9f, $96, $50, $a4, $98, $95, $50, $95, $9e +db $95, $9d, $99, $95, $a3, $50, $74, $95, $96, $95, $9e, $a3, $95, $50, $94, $a5 +db $a2, $99, $9e, $97, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $0d +db $6b, $c5, $00, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;Def down spray + +db $01, $50, $6c, $1c, $05, $a1, $6e, $03, $00, $70, $7d, $91, $9b, $95, $a3, $50 +db $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $50, $96, $95, $95, $9c, $50, $a3 +db $a4, $a2, $91, $9e, $97, $95, $50, $94, $a5, $a2, $99, $9e, $97, $50, $92, $91 +db $a4, $a4, $9c, $95, $5e, $03, $00, $08, $ab, $6d, $c5, $00, $13, $02;brainshock spray + +db $01, $50, $6c, $1c, $05, $a1, $6e, $03, $00, $70, $82, $95, $9d, $9f, $a6, $95 +db $a3, $50, $91, $50, $a3, $98, $99, $95, $9c, $94, $50, $96, $a2, $9f, $9d, $50 +db $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $50, $94, $a5, $a2, $99, $9e, $97 +db $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $ab, $6d, $c5, $00, $13 +db $02;Shield off spray + +db $01, $50, $6c, $1c, $05, $a1, $6e, $03, $00, $70, $83, $9f, $9c, $99, $94, $99 +db $96, $99, $95, $a3, $50, $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $50, $99 +db $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $ab, $6d, $c5, $00 +db $13, $02;Stop spray + +db $01, $50, $6c, $1c, $05, $a1, $6e, $03, $00, $70, $74, $a2, $91, $99, $9e, $a3 +db $50, $78, $80, $50, $96, $a2, $9f, $9d, $50, $9f, $9e, $95, $50, $95, $9e, $95 +db $9d, $a9, $50, $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08 +db $ab, $6d, $c5, $00, $13, $02;HP-Drain spray + +db $01, $50, $6c, $1c, $05, $a1, $6e, $03, $00, $70, $7d, $91, $9b, $95, $a3, $50 +db $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $50, $a5, $9e, $91, $92, $9c, $95 +db $50, $a4, $9f, $50, $93, $9f, $9e, $93, $95, $9e, $a4, $a2, $91, $a4, $95, $50 +db $99, $9e, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $ab, $6d, $c5 +db $00, $13, $02;Disable spray + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $80 +db $a5, $a4, $a3, $50, $91, $9e, $50, $95, $9e, $95, $9d, $a9, $50, $a4, $9f, $50 +db $a3, $9c, $95, $95, $a0, $5e, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Hypno gadget a + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $80 +db $a5, $a4, $a3, $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $a9, $50, $a4, $9f +db $50, $a3, $9c, $95, $95, $a0, $5e, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Hypno gadget o + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $80 +db $91, $a2, $91, $9c, $a9, $aa, $95, $a3, $50, $91, $9e, $50, $95, $9e, $95, $9d +db $a9, $5e, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Para a + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $80 +db $91, $a2, $91, $9c, $a9, $aa, $95, $a3, $50, $91, $9c, $9c, $50, $95, $9e, $95 +db $9d, $99, $95, $a3, $5e, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Para o + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $79, $9e, $93, $a2, $95, $91 +db $a3, $95, $50, $9f, $9e, $95, $50, $9f, $96, $50, $a4, $98, $95, $50, $96, $a2 +db $99, $95, $9e, $94, $a3, $50, $7f, $96, $96, $95, $9e, $a3, $95, $50, $94, $a5 +db $a2, $99, $9e, $97, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $0d +db $6b, $c5, $00, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Offense up a + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $79, $9e, $93, $a2, $95, $91 +db $a3, $95, $a3, $50, $a4, $98, $95, $50, $7f, $96, $96, $95, $9e, $a3, $95, $50 +db $9f, $96, $50, $91, $9c, $9c, $50, $a4, $98, $95, $50, $96, $a2, $99, $95, $9e +db $94, $a3, $5e, $03, $00, $08, $0d, $6b, $c5, $00, $03, $00, $08, $9b, $6d, $c5 +db $00, $13, $02;Offense up o + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $74, $95, $93, $a2, $95, $91 +db $a3, $95, $50, $9f, $9e, $95, $50, $9f, $96, $50, $a4, $98, $95, $50, $95, $9e +db $95, $9d, $99, $95, $a3, $50, $74, $95, $96, $95, $9e, $a3, $95, $50, $94, $a5 +db $a2, $99, $9e, $97, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $0d +db $6b, $c5, $00, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Def down a + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $74, $95, $93, $a2, $95, $91 +db $a3, $95, $a3, $50, $a4, $98, $95, $50, $74, $95, $96, $95, $9e, $a3, $95, $50 +db $9f, $96, $50, $91, $9c, $9c, $50, $a4, $98, $95, $50, $95, $9e, $95, $9d, $99 +db $95, $a3, $5e, $03, $00, $08, $0d, $6b, $c5, $00, $03, $00, $08, $9b, $6d, $c5 +db $00, $13, $02;Def down o + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $79, $9e, $93, $a2, $95, $91 +db $a3, $95, $50, $9f, $9e, $95, $50, $9f, $96, $50, $a4, $98, $95, $50, $96, $a2 +db $99, $95, $9e, $94, $a3, $50, $74, $95, $96, $95, $9e, $a3, $95, $50, $94, $a5 +db $a2, $99, $9e, $97, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08, $0d +db $6b, $c5, $00, $03, $00, $08, $9b, $6d, $c5, $00, $13, $02;Def up a + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $7d +db $91, $9b, $95, $a3, $50, $9f, $9e, $95, $50, $95, $9e, $95, $9d, $a9, $50, $96 +db $95, $95, $9c, $50, $a3, $a4, $a2, $91, $9e, $97, $95, $5e, $03, $00, $08, $9b +db $6d, $c5, $00, $13, $02;Brainshock a + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $7d +db $91, $9b, $95, $a3, $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95, $a3 +db $50, $96, $95, $95, $9c, $50, $a3, $a4, $a2, $91, $9e, $97, $95, $5e, $03, $00 +db $08, $9b, $6d, $c5, $00, $13, $02;Brainshock o + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $72 +db $9c, $91, $a3, $a4, $a3, $50, $91, $50, $a3, $a4, $99, $93, $9b, $a9, $50, $a3 +db $a5, $92, $a3, $a4, $91, $9e, $93, $95, $50, $a4, $98, $91, $a4, $50, $a3, $a4 +db $9f, $a0, $a3, $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95, $a3, $50 +db $96, $a2, $9f, $9d, $50, $9d, $9f, $a6, $99, $9e, $97, $5e, $03, $00, $08, $9b +db $6d, $c5, $00, $13, $02;Slime o + +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $08, $b7, $6d, $c5, $00, $70, $74 +db $99, $a3, $a2, $a5, $a0, $a4, $a3, $50, $a4, $98, $95, $50, $80, $83, $79, $50 +db $9f, $96, $50, $91, $9c, $9c, $50, $95, $9e, $95, $9d, $99, $95, $a3, $50, $94 +db $a5, $a2, $99, $9e, $97, $50, $92, $91, $a4, $a4, $9c, $95, $5e, $03, $00, $08 +db $9b, $6d, $c5, $00, $13, $02;Disable o +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +db $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f, $9b +db $95, $9e, $50, $a0, $9f, $93, $9b, $95, $a4, $a7, $91, $a4, $93, $98, $5e, $03 +db $00, $08, $6f, $6b, $c5, $00, $13, $02, $01, $50, $6c, $1c, $05, $01, $6e, $03 +db $00, $70, $71, $50, $92, $a2, $9f, $9b, $95, $9e, $50, $a3, $93, $a2, $95, $95 +db $9e, $50, $96, $a2, $9f, $9d, $50, $91, $50, $98, $91, $9e, $94, $98, $95, $9c +db $94, $50, $94, $95, $a6, $99, $93, $95, $5e, $03, $00, $08, $6f, $6b, $c5, $00 +db $13, $02, $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $71, $50, $92, $a2 +db $9f, $9b, $95, $9e, $50, $a2, $91, $aa, $9f, $a2, $5e, $03, $00, $08, $6f, $6b +db $c5, $00, $13, $02, $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $71, $50 +db $92, $a2, $9f, $9b, $95, $9e, $50, $94, $95, $a3, $9b, $50, $96, $91, $9e, $5e +db $03, $00, $08, $6f, $6b, $c5, $00, $13, $02, $01, $50, $6c, $1c, $05, $01, $6e +db $03, $00, $70, $71, $50, $92, $a2, $9f, $9b, $95, $9e, $50, $96, $91, $a5, $93 +db $95, $a4, $50, $98, $95, $91, $94, $5e, $03, $00, $08, $6f, $6b, $c5, $00, $13 +db $02, $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $71, $50, $a0, $99, $95 +db $93, $95, $50, $92, $a2, $9f, $9b, $95, $9e, $50, $9f, $96, $96, $50, $9f, $96 +db $50, $91, $50, $a4, $a5, $92, $91, $5e, $03, $00, $08, $6f, $6b, $c5, $00, $13 +db $02, $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f +db $9b, $95, $9e, $50, $a3, $a0, $a2, $99, $9e, $9b, $9c, $95, $a2, $5e, $03, $00 +db $08, $6f, $6b, $c5, $00, $13, $02, $01, $50, $6c, $1c, $05, $01, $6e, $03, $00 +db $70, $83, $9f, $9d, $95, $50, $a0, $91, $a2, $a4, $50, $92, $95, $9c, $9f, $9e +db $97, $99, $9e, $97, $50, $a4, $9f, $50, $91, $50, $a4, $a2, $9f, $9d, $92, $9f +db $9e, $95, $5e, $03, $00, $08, $6f, $6b, $c5, $00, $13, $02, $01, $50, $6c, $1c +db $05, $01, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f, $9b, $95, $9e, $50, $9d +db $99, $93, $a2, $9f, $a7, $91, $a6, $95, $50, $9f, $a6, $95, $9e, $5e, $03, $00 +db $08, $6f, $6b, $c5, $00, $13, $02, $01, $50, $6c, $1c, $05, $01, $6e, $03, $00 +db $70, $80, $91, $a2, $a4, $50, $9f, $96, $50, $91, $50, $92, $a2, $9f, $9b, $95 +db $9e, $50, $94, $95, $95, $a0, $50, $96, $a2, $a9, $95, $a2, $5e, $03, $00, $08 +db $6f, $6b, $c5, $00, $13, $02, $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70 +db $71, $50, $9e, $9f, $aa, $aa, $9c, $95, $50, $96, $a2, $9f, $9d, $50, $91, $50 +db $a7, $91, $a4, $95, $a2, $99, $9e, $97, $50, $93, $91, $9e, $5e, $03, $00, $08 +db $6f, $6b, $c5, $00, $13, $02, $01, $50, $6c, $1c, $05, $01, $6e, $03, $00, $70 +db $71, $50, $92, $a2, $9f, $9b, $95, $9e, $50, $97, $91, $a2, $94, $95, $9e, $50 +db $98, $9f, $a3, $95, $5e, $03, $00, $08, $6f, $6b, $c5, $00, $13, $02, $01, $50 +db $6c, $1c, $05, $01, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f, $9b, $95, $9e +db $50, $94, $95, $a6, $99, $93, $95, $50, $9f, $96, $50, $a3, $9f, $9d, $95, $50 +db $a3, $9f, $a2, $a4, $5e, $03, $00, $70, $79, $a4, $a3, $50, $96, $a5, $9e, $93 +db $a4, $99, $9f, $9e, $50, $99, $a3, $50, $99, $9e, $94, $99, $a3, $93, $95, $a2 +db $9e, $99, $92, $9c, $95, $5e, $03, $00, $08, $6f, $6b, $c5, $00, $13, $02, $01 +db $50, $6c, $1c, $05, $01, $6e, $03, $00, $70, $71, $50, $92, $a2, $9f, $9b, $95 +db $9e, $50, $93, $9c, $9f, $a4, $98, $95, $a3, $50, $a3, $a4, $95, $91, $9d, $95 +db $a2, $5e, $03, $00, $08, $6f, $6b, $c5, $00, $13, $02, $01, $50, $6c, $1c, $05 +db $01, $6e, $03, $00, $70, $80, $99, $95, $93, $95, $a3, $50, $9f, $96, $50, $91 +db $50, $92, $a2, $9f, $9b, $95, $9e, $50, $9d, $9f, $a4, $98, $95, $a2, $92, $9f +db $91, $a2, $94, $5e, $03, $00, $08, $6f, $6b, $c5, $00, $13, $02;Descriptions for broken items + +db $97, $95, $9e, $95, $a2, $9f, $a3, $99, $a4, $a9, $5e, $13, $18, $04, $0a, $7a +db $90, $c7 + +db $18, $01, $01, $0A, $2D, $B1, $EE + +db $a9, $9f, $a5, $a2, $50, $9c, $9f, $97, $99, $93, $91, $9c, $50, $72, $7b, $50 +db $9d, $9f, $94, $95, $0a, $b8, $1f, $c8 + +db $50, $a3, $9f, $9d, $95, $a4, $98, $99, $9e, $97, $0a, $c4, $8a, $c9 + +db $00, $0A, $a3, $C8, $C6 + +db $5E, $0A, $66, $C0, $C6 + +db $1f, $31, $0a, $81, $c0, $c6 + +db $00, $0A, $F1, $10, $C6 + +;;;;;;;;;;;;;;;;;;;; + +ORG $D57295 +db $80, $A2, $9F, $97, $A2, $95, $A3, $A3, $99, $A6, $95, $50, $92, $91, $A4, $00 + +ORG $D572BC +db $80, $a2, $9f, $97, $a2, $95, $a3, $a3, $99, $a6, $95, $50, $a0, $91, $9e, $00 + +ORG $D572E3 +db $80, $A2, $9F, $97, $A2, $95, $A3, $A3, $99, $A6, $95, $50, $97, $A5, $9E, $00 + +ORG $D5730A +db $80, $a2, $9f, $97, $a2, $95, $a3, $5e, $50, $92, $a2, $91, $93, $95, $9c +db $95, $a4, $00 + +ORG $D57331 +db $80, $A2, $9F, $97, $A2, $95, $A3, $A3, $99, $A6, $95, $50, $9F, $A4, $98, $95 +db $A2, $00 + +ORG $C5E3BF +db $FE; Lucky sandwiches no longer randomize themselves + +ORG $D5728B +dw $01F3 ;Lucky Sandwich new action + +ORG $C89358 +db $0A, $61, $EE, $EE + +ORG $C951E3 +db $0A, $73, $EE, $EE + +ORG $C72BE7 +db $1c, $05, $01, $0a, $fe, $2b, $c7 + +ORG $C8008D +db $1c, $05, $01, $50 + +ORG $C81FA3 +db $0A, $7A, $EE, $EE + +ORG $C81FF1 +db $1c, $05, $01, $a3, $5e, $07, $00, $00 + +ORG $C93F08 +db $1c, $05, $01, $6e, $0a, $15, $3f, $c9 + +ORG $C98ABC +db $0a, $92, $ee, $ee + +ORG $C6AEB4 +db $91, $50, $1c, $05, $01, $0a, $c2, $ae, $c6 + +ORG $C6C891 +db $A0, $EE, $EE + +ORG $C6C063 +db $a5, $ee, $EE + +ORG $C6C06F +db $aa, $ee, $ee + +ORG $C60FE1 +db $B0, $EE, $EE + +ORG $C61123 +db $1c, $05, $01, $0a, $2f, $11, $c6 + +ORG $C9E84E +db $0a, $5a, $e7, $c9 + +ORG $CF097A +db $00, $00;Threed tunnel door flag + +ORG $C7C41F +db $CD, $C3; Lumine hole double flag + +ORG $EEA9B6 +db $1d, $0e, $ff, $01, $0a, $ef, $a9, $ee + +ORG $C9E2F1 +db $0A, $B5, $EE, $EE + +ORG $EEEEB5 +db $04, $C4, $00, $04, $DC, $00, $02 + +ORG $C87205 +db $9e, $c5, $c7 ;sphinx post-pyramid + +ORG $CF8E44 +db $01 + +ORG $CF8E42 +db $69, $00 + +ORG $D014C0 +db $80 +;Color Math on swirls +ORG $C2E989 +;LDX #$007F + +ORG $C2E995 +;LDX #$003F + +ORG $C5770D +db $A3, $9F, $A5, $A4, $98 + +ORG $C57665 +db $a3, $9f, $a5, $a4 + +;;;;;;;;;;;;;;;;; +;New battle entry for Heavily Armed Pokey +ORG $CBD8D2 +db $DC, $00;Battle Background + +ORG $D0D5A5 +db $d8, $00;Pokey battle + +ORG $D5E533 +db $01 +;;;;;;;;;;;; +;new entry for Diamond Dog +ORG $D0DF70 +db $01, $53, $00, $ff + +ORG $CBDFFE +db $37, $01 + +ORG $D5E688 +db $49 +;;;;;;;;;;;;;;;;;;;;;;;;; +;entry for giygas phase 2 fix +ORG $C2C505 +LDA #$0005;Set the group number + +ORG $D0D562 +db $00 + +ORG $D0C63C +db $00 + +ORG $CBD8AE +db $e0, $00, $df, $00 +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $C91EAD +db $0a, $fc, $1e, $c9 + +ORG $C3CF10 +db $04 +;sky runner event stuff + +ORG $C91E56 +db $0A, $60, $F2, $EE + +ORG $C3CEFE +db $D8 + +ORG $C91F11 +db $1F, $00, $00, $6E +db $10, $F0, $10, $40, $0A, $FE, $F1, $EE + +ORG $CF95F6 +db $EC, $02, $02 + +ORG $CF95F1 +db $0D + +ORG $CF6C31 +db $03; Remove sky runner npc from Onett + +ORG $C6BBF9 +db $0A, $24, $F2, $EE + +;;;;;;;;; +ORG $EFA455 +db $0A, $3A, $F1, $EE +;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Frank +ORG $C65F1F +db $08, $bc, $ee, $ee + +ORG $C65F10 +db $08, $bc, $ee, $ee + +ORG $C66481 +db $08, $bc, $ee, $ee + +ORG $C660C4 +db $08, $bc, $ee, $ee + +ORG $C66110 +db $08, $bc, $ee, $ee + +ORG $C66197 +db $08, $bc, $ee, $ee + +ORG $C661AB +db $08, $bc, $ee, $ee + +ORG $C746E1 +db $08, $bc, $ee, $ee + +ORG $C74BC0 +db $08, $bc, $ee, $ee + +ORG $C74E1C +db $08, $bc, $ee, $ee +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;FSTM2 +ORG $C66145 +db $08, $bc, $ee, $ee, $ff, $0a, $56, $61, $c6 + +ORG $C6648A +db $08, $bc, $ee, $ee, $ff, $0a, $9b, $64, $c6 + +ORG $C664FB +db $08, $bc, $ee, $ee, $ff, $0a, $0c, $65, $c6 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Captain Strong +ORG $C5FC28 +db $50, $50, $08, $bc, $ee, $ee, $ff + +ORG $C5FC58 +db $08, $bc, $ee, $ee, $ff, $0a, $65, $fc, $c5 + +ORG $C5FCF6 +db $08, $bc, $ee, $ee, $ff, $0f + +ORG $C65F87 +db $08, $bc, $ee, $ee, $ff, $0f + +ORG $C66084 +db $08, $bc, $ee, $ee, $ff, $0f +;;;;;;;;;;;;;;;; +;Everdred +ORG $C95C6F +db $08, $bc, $ee, $ee, $ff, $0f + +ORG $C8065C +db $0a, $e9, $ee, $ee +;;;;;;;;;;;;;;;;;;; +;Carpainter +ORG $C993DA +db $08, $bc, $ee, $ee, $ff, $0a, $e3, $93, $c9 + +ORG $C9945D +db $08, $bc, $ee, $ee, $ff, $0a, $66, $94, $c9 + +ORG $C99310 +db $08, $bc, $ee, $ee, $ff, $0a, $19, $93, $c9 + +ORG $C99363 +db $08, $bc, $ee, $ee, $ff, $0a, $6c, $93, $c9 + +ORG $C990D9 +db $08, $bc, $ee, $ee, $ff, $0f, $0f + +ORG $C98EF5 +db $08, $bc, $ee, $ee, $ff, $0a, $fe, $8e, $c9 + +ORG $C99142 +db $08, $bc, $ee, $ee, $ff, $0a, $4b, $91, $c9 + +ORG $C99027 +db $08, $bc, $ee, $ee, $ff, $0a, $30, $90, $c9 + +ORG $C983BA +db $08, $bc, $ee, $ee, $ff, $0a, $c3, $83, $c9 + +ORG $C9840B +db $08, $bc, $ee, $ee, $ff, $0a, $14, $84, $c9 + +ORG $C9835A +db $08, $bc, $ee, $ee, $ff, $0a, $63, $83, $c9 + +ORG $C684CF +db $08, $bc, $ee, $ee, $ff, $0f, $0f + +ORG $C9056E +db $08, $bc, $ee, $ee, $ff, $0a, $77, $05, $c9 + +ORG $C794EB +db $08, $bc, $ee, $ee, $ff, $0a, $f4, $94, $c7 +;;;;;;;;;;;;; +;Belch +ORG $C8EF20 +db $08, $bc, $ee, $ee, $ff + +ORG $C8EF37 +db $08, $bc, $ee, $ee, $ff + +ORG $EF6296 +db $08, $bc, $ee, $ee, $ff, $0a, $9f, $62, $ef + +ORG $EF62B2 +db $08, $bc, $ee, $ee, $ff, $0a, $bb, $62, $ef + +ORG $EF690F +db $08, $bc, $ee, $ee, $ff, $0a, $18, $69, $ef + +ORG $EF6972 +db $08, $bc, $ee, $ee, $ff, $0a, $7b, $69, $ef + + + +;Mani Mani +ORG $C978AC +db $08, $bc, $ee, $ee, $ff, $50, $99, $a3, $50, $0a, $bb, $78, $c9 + +ORG $C9782C +db $08, $bc, $ee, $ee, $ff, $50, $99, $a3, $50, $0a, $3b, $78, $c9 + +ORG $C97997 +db $08, $bc, $ee, $ee, $ff, $0a, $a3, $79, $c9, $c9 + + +;;;;;;;;;;;;;;; +;Kraken +ORG $C86060 +db $08, $bc, $ee, $ee, $ff + +ORG $C86138 +db $08, $bc, $ee, $ee, $ff + +ORG $C8B42F +db $08, $bc, $ee, $ee + +ORG $C8B8B3 +db $08, $bc, $ee, $ee, $ff + +ORG $C8B6FB +db $08, $bc, $ee, $ee, $ff + +ORG $C8B590 +db $08, $bc, $ee, $ee, $ff, $0f + +ORG $C9AB2A +db $08, $bc, $ee, $ee, $ff + +ORG $C92D4C +db $08, $bc, $ee, $ee, $ff +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Master Belch +ORG $C9E64C +db $08, $bc, $ee, $ee, $ff + +ORG $C9E68F +db $08, $bc, $ee, $ee, $ff + +ORG $C9E6C1 +db $0a, $d4, $ee, $ee, $FF + +;;;;;;;;;;;;; +;Starman DX +ORG $C92C28 +db $08, $bc, $ee, $ee, $ff, $0a, $31, $2c, $c9 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Pokey +ORG $C57E39 +db $0a, $c2, $ee, $ee + +ORG $C57E57 +db $0a, $cb, $ee, $ee +;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $C8FC59 +db $0A, $9C, $F0, $EE + +ORG $C57F4A +db $0A, $A7, $F0, $EE + + +ORG $C76186 +db $0A +dl tracy_backpack_tex + +ORG $C64690 +dl tracy_backpack_twice_tex + +ORG $C6AE42 +db $0A +dl winters_drugstore_space + +ORG $C6AEA3 +db $0A +dl winters_drugstore_space2 + + +;;;;;;;;;;;;;;; +;hint stuff + +ORG $CF8C25 +dl onett_hint_man ;Onett hint guy text pointer + +ORG $CF9C04 +dl twoson_hint_man + +ORG $CFAB6C +dl threed_hint_man + +ORG $CFC9F8 +dl fourside_hint_man + +ORG $CFD0AD +dl summers_hint_man + +ORG $CFD61F +dl scaraba_hint_man + +ORG $C726D8 +db $02 + +ORG $C701A0 +db $49 + +ORG $C701C6 +db $08 +dd display_hint_price +db $0F + +ORG $C7032E +db $70, $87, $9f, $a2, $94, $50, $9f, $9e, $50, $a4, $98, $95, $50, $a3, $a4, $a2 +db $95, $95, $a4, $50, $99, $a3, $50, $a4, $98, $91, $a4, $50 + +db $06, $05, $04 +dd display_onett_hint + +db $06, $06, $04 +dd display_twoson_hint + +db $06, $07, $04 +dd display_threed_hint + +db $06, $08, $04 +dd display_fourside_hint + +db $06, $09, $04 +dd display_summers_hint + +db $06, $0A, $04 +dd display_scaraba_hint +db $02 + +display_onett_hint: +db $08 +dd hint_error_message;replace with generated pointer +db $03 +db $08 +dd push_onett_hint; replace with a $02 if not pushable +db $06, $F9, $03 +dd .onett_hint_twice +db $08 +dd count_hints +.onett_hint_twice: +db $04, $F9, $03 +db $01 +db $06, $04, $04 +dd $C72348 ;Direct here if we're out of hints +dd $C726CC08 +db $FF +db $03, $01 +db $08 +dd post_hint_text +db $05, $05, $04 +db $02 + +display_twoson_hint: +db $08 +dd hint_error_message;replace with generated pointer +db $03 +db $08 +dd push_twoson_hint; replace with a $02 if not pushable +db $06, $FA, $03 +dd .twoson_hint_twice +db $08 +dd count_hints +.twoson_hint_twice: +db $04, $FA, $03 +db $01 +db $06, $04, $04 +dd $C72348 ;Direct here if we're out of hints +dd $C726CC08 +db $FF +db $03, $01 +db $08 +dd post_hint_text +db $05, $06, $04 +db $02 + +display_threed_hint: +db $08 +dd hint_error_message;replace with generated pointer +db $03 +db $08 +dd push_threed_hint; replace with a $02 if not pushable +db $06, $FB, $03 +dd .threed_hint_twice +db $08 +dd count_hints +.threed_hint_twice: +db $04, $FB, $03 +db $01 +db $06, $04, $04 +dd $C72348 ;Direct here if we're out of hints +dd $C726CC08 +db $FF +db $03, $01 +db $08 +dd post_hint_text +db $05, $07, $04 +db $02 + +display_fourside_hint: +db $08 +dd hint_error_message;replace with generated pointer +db $03 +db $08 +dd push_fourside_hint; replace with a $02 if not pushable +db $06, $FC, $03 +dd .fourside_hint_twice +db $08 +dd count_hints +.fourside_hint_twice: +db $04, $FC, $03 +db $01 +db $06, $04, $04 +dd $C72348 ;Direct here if we're out of hints +dd $C726CC08 +db $FF +db $03, $01 +db $08 +dd post_hint_text +db $05, $08, $04 +db $02 + +display_summers_hint: +db $08 +dd hint_error_message;replace with generated pointer +db $03 +db $08 +dd push_summers_hint; replace with a $02 if not pushable +db $06, $FD, $03 +dd .summers_hint_twice +db $08 +dd count_hints +.summers_hint_twice: +db $04, $FD, $03 +db $01 +db $06, $04, $04 +dd $C72348 ;Direct here if we're out of hints +dd $C726CC08 +db $FF +db $03, $01 +db $08 +dd post_hint_text +db $05, $09, $04 +db $02 + +display_scaraba_hint: +db $08 +dd hint_error_message;replace with generated pointer +db $03 +db $08 +dd push_scaraba_hint; replace with a $02 if not pushable +db $06, $FE, $03 +dd .scaraba_hint_twice +db $08 +dd count_hints +.scaraba_hint_twice: +db $04, $FE, $03 +db $01 +db $06, $04, $04 +dd $C72348 ;Direct here if we're out of hints +dd $C726CC08 +db $FF +db $03, $01 +db $08 +dd post_hint_text +db $05, $0A, $04 +db $02 + +ORG $FCFFA0 +db $75, $91, $a2, $a4, $98, $72, $9f, $a5, $9e, $94, $50, $71, $a2, $93, $98, $99 +db $a0, $95, $9c, $91, $97, $9f, $50, $a6, $95, $a2, $a3, $99, $9f, $9e, $50, $02 + +ORG $E1F4CA +db $f9, $03; Onett hint shop flag + +ORG $E1F4F3 +db $fa, $03; Twoson hint shop flag + +ORG $E1F521 +db $fb, $03; Threed hint shop flag + +ORG $E1F545 +db $fc, $03; Fourside hint shop flag + +ORG $E1F57E +db $fd, $03; Summers hint shop flag + +ORG $E1F55F +db $fe, $03; Scaraba hint shop flag + +;Giant Step +ORG $D6FC38 +db $08 +dd boost_speed_dynamic + +ORG $D6FC60 +db $08 +dd boost_vitality_dynamic +;Lilliput Steps +ORG $D6FCBB +db $08 +dd boost_guts_dynamic + +ORG $D6FCE3 +db $08 +dd boost_vitality_dynamic +;Milky Well +ORG $D6FD3A +db $08 +dd boost_speed_dynamic + +ORG $D6FD5C +db $08 +dd boost_iq_dynamic +;Magnet Hill +ORG $D6FDB7 +db $08 +dd boost_vitality_dynamic + +ORG $D6FDDB +db $08 +dd boost_luck_dynamic +;Rainy Circle +ORG $D6FE33 +db $08 +dd boost_guts_dynamic + +ORG $D6FE55 +db $08 +dd boost_iq_dynamic +;Pink Cloud + +ORG $D6FEAC +db $08 +dd boost_speed_dynamic + +ORG $D6FED0 +db $08 +dd boost_guts_dynamic +;Lumine Hall +ORG $D6FF27 +db $08 +dd boost_luck_dynamic + +ORG $D6FF49 +db $08 +dd boost_iq_dynamic +;Fire Spring +ORG $D6FFA1 +db $08 +dd boost_speed_dynamic + +ORG $D6FFC5 +db $08 +dd boost_luck_dynamic + +ORG $C99A9D +db $a1, $9a, $c9 + +ORG $C769A8 +db $0A, $3C, $F7, $EE + +ORG $C10E16 +LDA #$0098 + +ORG $EF79F3 +db $4C, $F7, $EE + +ORG $D7FD30 +ExpPointers: +dw $FFFF +dw $FD40 +dw $FD44 +dw $FD48 +dw $FD4C + +ORG $D7FD40 +dd $00000011 +dd $00000000 +dd $00000000 +dd $000016EF + +PlayerCount: ;Write this value during generation +dw $0001 +dw $0000 + +BannedItemList: +db $01, $68, $69, $7D, $8B, $9E, $A2, $A6, $A7, $AA, $AB, $AC, $AD, $AE +db $AF, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $B8, $B9, $BB, $C0, $C1, $C4 +db $C5, $CA, $CB, $CC, $CD, $CE, $D0, $D2, $D3, $E3, $E4, $E5, $E6, $E7 +db $FD, $B0, $A3, $C5, $A4 + +StorageTitlePointers: +dw $FF90, $FF70 + +StorageTitleLength: +dw $000C, $0010 + +StorageNumberStart: +dw $9CA9, $9CAE + +ORG $C9B132 +db $11, $04; Tony phone call flag + +ORG $C37A90 +db $90;Dept. Store starts farther right. Used for Escargo Express + +ORG $C37AB1 +db $30 + +ORG $FCFF90 +db $77, $99, $96, $A4, $50, $79, $9E, $92, $9F, $A8 + +ORG $D5630B +db $84, $99, $9e, $a9, $50, $9b, $95, $a9, $00; Tiny key + +ORG $D5632E +dd TinyKeyDesc + +ORG $D56B45 +db $84, $95, $9E, $94, $91, $50, $9C, $91, $A6, $91, $A0, $91, $9E, $A4, $A3, $00 + +ORG $D56B68 +dd LavapantsDesc + +ORG $C6FED6 +db $0A +dl LavaPantsHandleItem + +ORG $D56B61 +db $0F + +ORG $C7BF60 +db $08 +dl RememberedTex +db $FF + +db $0A +dl $C7BF71 + +ORG $C7C02B +db $08 +dl RememberedTex +db $FF + +db $0A +dl $C7C03C + +ORG $C7C0FD +db $08 +dl RememberedTex +db $FF + +db $0A +dl $C7C10E + +ORG $C7C1CE +db $08 +dl RememberedTex +db $FF + +db $0A +dl $C7C1DF + +ORG $C7C299 +db $08 +dl RememberedTex +db $FF + +db $0A +dl $C7C2AA + +ORG $C7C360 +db $08 +dl RememberedTex +db $FF + +db $0A +dl $C7C371 + +ORG $C7C44F +db $08 +dl RememberedTex +db $FF + +db $0A +dl $C7C460 + +ORG $C7C511 +db $08 +dl RememberedTex +db $FF + +db $0A +dl $C7C522 + +ORG $FCFF70 +db $79, $9D, $A0, $9F, $A2, $A4, $91, $9E, $A4, $50, $77, $9F, $9F, $94, $A3 + +ORG $EE9645 +dd SetupStorageTakeMenu + +ORG $EE96D6 +db $0A +dl InitStorageMen + +ORG $EE969F +dl InitStorageMen + +ORG $EE968C +db $0A +dl CheckItemOnStore + +ORG $C66698 +db $08 +dd SancFirst + +ORG $C6BEA7 +db $0A +dl RainyCircleIntro + +ORG $C83D4C +db $08 +dd SancFifth + +ORG $C9D2E2 +db $08 +dd SancSixth + +ORG $C9E2A3 +db $08 +dd SancSeventh + +ORG $EF5813 +db $0A +dl FireSpringIntro + +ORG $EF67C2 +db $08 +dd SancThird + +ORG $EF97CA +db $08 +dd SancSecond + +ORG $EE96B7 +db $0A +dl CheckAbsoluteStorage + +ORG $D7FDA0 +MusicTrackList: +db $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $0c, $0d, $0e, $0f +db $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $1a, $1b, $1c, $1d, $1e, $1f +db $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2a, $2b, $2c, $2d, $2e, $2f +db $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3a, $3b, $3c, $3d, $3e, $3f +db $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4a, $4b, $4c, $4d, $4e, $4f +db $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $5a, $5b, $5c, $5d, $5e, $5f +db $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6a, $6b, $6c, $6d, $6e, $6f +db $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7a, $7b, $7c, $7d, $7e, $7f +db $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8a, $8b, $8c, $8d, $8e, $8f +db $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9a, $9b, $9c, $9d, $9e, $9f +db $a0, $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $aa, $ab, $ac, $ad, $ae, $af +db $b0, $b1, $b2, $b3, $b4, $b5, $b6, $b7, $b8, $b9, $ba, $bb, $bc, $bd, $be, $bf + +BanListNoProgs: +db $01, $68, $69, $7D, $8B, $9E, $A2, $A6, $A7, $AA, $AB, $AC, $AD, $AE +db $AF, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $B8, $B9, $BB, $C0, $C1, $C4 +db $C5, $CA, $CB, $CC, $CD, $CE, $D0, $D2, $D3, $FD, $B0, $A3, $C5, $A4 + +ORG $D56F2E +db $00 + +ORG $D56B93 +db $87, $91, $a2, $a0, $50, $a0, $91, $94, $00; Change the Receiver phone to Sold Out + + +ORG $F41000 +ShopItemNames: +.OnettTeleport: +db $7F, $9E, $95, $A4, $A4, $50, $84, $95, $9C, $95, $A0, $9F, $A2, $A4, $00 +.TwosonTeleport: +db $84, $A7, $9F, $A3, $9F, $9E, $50, $84, $95, $9C, $95, $A0, $9F, $A2, $A4, $00 +.HappyTeleport: +db $78, $78, $86, $50, $84, $95, $9C, $95, $A0, $9F, $A2, $A4, $00 +.ThreedTeleport: +db $84, $98, $A2, $95, $95, $94, $50, $84, $95, $9C, $95, $A0, $9F, $A2, $A4, $00 +.SaturnTeleport: +db $83, $91, $a4, $a5, $a2, $9e, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00 +.DesertTeleport: +db $74, $A5, $9E, $95, $A3, $50, $84, $95, $9C, $95, $A0, $9F, $A2, $A4, $00 +.FoursideTeleport: +db $76, $9F, $A5, $A2, $A3, $99, $94, $95, $50, $84, $95, $9C, $95, $A0, $9F, $A2 +db $A4, $00 +.WintersTeleport: +db $87, $99, $9E, $A4, $95, $A2, $A3, $50, $84, $95, $9C, $95, $A0, $9F, $A2, $A4 +db $00 +.SummersTeleport: +db $83, $A5, $9D, $9D, $95, $A2, $A3, $50, $84, $95, $9C, $95, $A0, $9F, $A2, $A4 +db $00 +.ScarabaTeleport: +db $83, $93, $91, $A2, $91, $92, $91, $50, $84, $95, $9C, $95, $A0, $9F, $A2, $A4 +db $00 +.DalaamTeleport: +db $74, $91, $9C, $91, $91, $9D, $50, $84, $95, $9C, $95, $A0, $9F, $A2, $A4, $00 +.DarkTeleport: +db $74, $91, $a2, $9b, $9e, $95, $a3, $a3, $50, $84, $95, $9c, $95, $a0, $9f, $a2 +db $a4, $00 +.TendaTeleport: +db $84, $95, $9e, $94, $91, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00 +.UnderworldTeleport: +db $7c, $5e, $50, $85, $87, $50, $84, $95, $9c, $95, $a0, $9f, $a2, $a4, $00 +.MgntTeleport: +db $7d, $91, $97, $99, $93, $91, $9e, $a4, $50, $84, $95, $9c, $95, $a0, $9f, $a2 +db $a4, $00 +.PooPSI: +db $80, $9F, $9F, $50, $80, $83, $79, $00 +.Paula: +db $80, $91, $A5, $9C, $91, $00 +.Jeff: +db $7A, $95, $96, $96, $00 +.Poo: +db $80, $9F, $9F, $00 +.FlnMn: +db $76, $9C, $A9, $99, $9E, $97, $50, $7D, $91, $9E, $00 +.Ness: +db $7E, $95, $A3, $A3, $00 +.SoldOut: +db $83, $7F, $7C, $74, $50, $7F, $85, $84, $00 +.TeleportNames: +dw $0000 +dw .OnettTeleport +dw .TwosonTeleport +dw .HappyTeleport +dw .ThreedTeleport +dw .SaturnTeleport +dw .DesertTeleport +dw .FoursideTeleport +dw .WintersTeleport +dw .SummersTeleport +dw .ScarabaTeleport +dw .DalaamTeleport +dw .DarkTeleport +dw .TendaTeleport +dw .UnderworldTeleport +dw .MgntTeleport +dw .PooPSI +.CharNames: +dw $0000 +dw .Paula +dw .Jeff +dw .Poo +dw .FlnMn +dw .Ness + +.PlayerText: +db $18, $01, $0B, $1c, $02, $01, $02 + +ShopFlagBits: +db $01 +db $02 +db $04 +db $08 +db $10 +db $20 +db $40 +db $80 + +ORG $CFB891 +db $00 + +ORG $CFB8F5 +db $47 + +ORG $D7FEA0 +ExtraWindowData: +dw $0005, $0009, $001A, $0004 + +HasStartingPhoto: +db $00 + +HasPooStartPhoto: +db $00 + +PhotoFlags: +dw $02BA +dw $02BB + +MoneyAmounts: +dw $0000 +dw $000A +dw $0064 +dw $03E8 + +ORG $C3E2A8 +;contemplate switching to 1 +dw $000C, $0010, $0013, $0004 + +ORG $CFB115 +DD OpenLockers_TopRightLocker + +ORG $CFB126 +DD OpenLockers_TopLeftLocker + +ORG $CFB137 +DD OpenLockers_BottomRightLocker + +ORG $CFB159 +DD OpenLockers_BottomLeftLocker + +ORG $CFB148 +DD OpenLockers_MiddleLocker + +ORG $CFA990 +dd fixed_skyrunner_redirect + +ORG $C5D793 +db $F6 + +ORG $C64FA5 +db $FF + +ORG $EEAAA5 +db $0A +dl NpcNessGiveOverride + +ORG $C79693 +db $02 +;Paula text og script + +ORG $C92A38 +dd $C92A3C + +ORG $C76FDA +db $0A +dl $C76FEE + +ORG $C885AC +db $02 + +ORG $D56BAF +db $04 + +ORG $C55715 +db $0A +dl WarpPadDescription + +ORG $C6FFBC +db $0A +dl WarpPadUsage + +ORG $C8FD5B +db $0A +dl PokeyCharCount + +ORG $CFE045 +dw $041B + +ORG $CFE056 +dw $041A + +ORG $CFE067 +dw $0419 + +ORG $CFE078 +dw $0418 + +ORG $C8FFF0 +db $0A +dl DisplayRobots + +ORG $C811B3 +db $0A +dl OrangeKidCrowdfund + +ORG $C66680 +db $84, $66 + +ORG $C6BE82 +db $86, $BE + +ORG $C6BE8F +db $93, $BE + +ORG $C76119 +db $0A +dl TracyNessText + +ORG $CFE367 +dd MagicantTentacleERText + +ORG $C87963 +db $0A +dl DuckSignTex + +ORG $C87997 +db $0A +dl GoatSignTex + +ORG $C87A1F +db $0A +dl SlimeSignTex + +ORG $C8798A +db $02 + +ORG $C879BA +db $02 + +ORG $C87A45 +db $02 + +ORG $C92E9E +db $0A +dl PooBoatText +NotSoloPoo: + +ORG $C39F0C +db $42 +dl CheckNessRobot + +ORG $F30080 +db $0A, $C3, $B8, $EE + +ORG $C7BF32 +db $0A +dl GiantStepNessText + +ORG $C7BF5C +db $0A +dl GiantStepNessName + +ORG $C7BFFC +db $0A +dl LilliputNessText + +ORG $C7C027 +db $0A +dl LilliputNessName + +ORG $C7C18F +db $0A +dl MilkyNessText + +ORG $C7C1CA +db $0A +dl MilkyNessName + +ORG $C7C0D4 +db $0A +dl RainyNessText + +ORG $C7C0F9 +db $0A +dl RainyNessName + +ORG $C7C26C +db $0A +dl MagnetNessText + +ORG $C7C295 +db $0A +dl MagnetNessName + +ORG $C7C32B +db $0A +dl CloudNessText + +ORG $C7C35C +db $0A +dl CloudNessName + +ORG $C7C426 +db $0A +dl LumineNessText + +ORG $C7C44B +db $0A +dl LumineNessName + +ORG $C7C4DD +db $0A +dl FireNessText + +ORG $C7C50D +db $0A +dl FireNessName + +ORG $EF97B2 +dd $EF97B6 + +ORG $EF67AA +dd $EF67AE + +ORG $C83D34 +dd $C83D38 + +ORG $C9D2CA +dd $C9D2CE + +ORG $C9E28B +dd $C9E28F + +ORG $EF57FB +dd $EF57FF + +ORG $C8854C +db $0A +dl $C88561 + +ORG $EE9BDD +db $0A +dl EarthPowerLeader + +ORG $EEAB04 +db $0A +dd OnettTeleNPCName +OnettTeleNPCBack: + +ORG $EEAB36 +db $0A +dd TwosonTeleNPCName +TwosonTeleNPCBack: + +ORG $EEAB69 +db $0A +dd HappyTeleNPCName +HappyTeleNPCBack: + +ORG $EEABA9 +db $0A +dd ThreedTeleNPCName +ThreedTeleNPCBack: + +ORG $EEABDC +db $0A +dd SaturnTeleNPCName +SaturnTeleNPCBack: + +ORG $EEAC16 +db $0A +dd DunesTeleNPCName +DunesTeleNPCBack: + +ORG $EEAC55 +db $0A +dd FoursTeleNPCName +FoursTeleNPCBack: + +ORG $EEAC8A +db $0A +dd WintersTeleNPCName +WintersTeleNPCBack: + +ORG $EEACBE +db $0A +dd SummersTeleNPCName +SummersTeleNPCBack: + +ORG $EEACF2 +db $0A +dd ScarabaTeleNPCName +ScarabaTeleNPCBack: + +ORG $EEAD26 +db $0A +dd DalaamTeleNPCName +DalaamTeleNPCBack: + +ORG $EEAD59 +db $0A +dd DarkTeleNPCName +DarkTeleNPCBack: + +ORG $EEAD93 +db $0A +dd TendaTeleNPCName +TendaTeleNPCBack: + +ORG $EEADCD +db $0A +dd UnderTeleNPCName +UnderTeleNPCBack: + +ORG $EEAECB +db $0A +dd MagicTeleNPCName +MagicTeleNPCBack: + +ORG $C630A8 +db $08 +dd ClearAndCallDad + +ORG $C91D47 +db $02 + +ORG $61000B +db $0A +dl rock_text + +ORG $6100D7 +db $0A +dl man_text + +ORG $C76074 +db $0A +dl NessTonyHint + +ORG $C5EF84 +db $0A +dl JeffTonyHint + +ORG $EED7ED +db $0A +dl FixLightningTypo + +ORG $EED873 +db $0A +dl FixLightningTypo2 + +ORG $C62E6D +db $0A +dl HandleEnergyLinkFromATM + +ORG $C62D30 +db $0A +dl InitializeEnergyLink + +ORG $C68829 ;Disable PRV photo +db $02 + +ORG $C68876 ;Disable threed photo +db $02 + +ORG $C6886C ;Disable SV photo +db $02 + +ORG $C68927 ;Disable Deep Dark photo +db $02 + +ORG $C68847 ;Disable Winters photo +db $02 + +ORG $C87ADC ;Disable Brickroad photo +db $02 + +ORG $C688B9 ;Disable Dept store photo +db $02 + +ORG $C6889B ;Disable Museum photo +db $02 + +ORG $C60CC9 ;sesaphoto +db $02 + +ORG $C60C86 ;sesaphoto +db $02 + +ORG $C68887 ;Disable gold mine photo +db $02 + +ORG $C688FF ;Disable Summers photo +db $02 + +ORG $C688CD ;Disable Dalaam photo +db $02 + +ORG $2FF614 +db $0A +dl StonehengePhotoText + +ORG $C62FD6 +db $08 +dd ShowDepositEnergy + +ORG $CFDF49 +dd UnderworldATM + +ORG $CFDBA2 +dd DarknessATM + +ORG $EF188B +dd $EF2A4F + +ORG $D57B05 +db $C7 + +ORG $C6332A +db $0A +dl ShowDadEnergy + +ORG $C63229 +db $0A +dl PingDadEnergy + +ORG $CF1203 +dd SetSaturnLadderFlag + +;ORG $D01664 +;db $1F, $04 Flag for the Saturn Valley Ladder + +;ORG $CF19C7 +;dd JackieMoonsideSetup Only in dungeon er + +;ORG $CFC8C6 +;dd EverDeadText ; Only in dungeon ER + +;ORG $CF1657 +;dd CafeEverdredText ; Only in dungeon ER + +ORG $CFC50E +dd JackieItemCheck + +ORG $CF0648 +dd UnlockOnettTeleport + +ORG $CF09E3 +dd $C9B10B + +ORG $CF1922 +dd $C9B10B + +ORG $CF00C6 +dd $C9B10B + +ORG $CF00BB +dd $C9B10B + +ORG $CF2396 +dd $C9B10B + +ORG $CFBC06 +dd MinerDialogue + +ORG $C6122B +db $0A +dl MinerText2 + +ORG $C93267 +db $0A +dl $C9327F + +;ORG $D0D4E5 +;dd PokeyBattleExpanded + +;ORG $EFFF10 +;PokeyBattleExpanded: + +ORG $CF6BF1 +db $6D, $CF + +ORG $D5AD53 +dw $0209 +dw $0209; Skate Punk + +ORG $D5DD69 ; Loaded Dice +dw $0209 +dw $0209 +dw $0209 +dw $0209 + +ORG $D5A5F7 ; Loaded Dice +dw $0209 +dw $0209 +dw $0209 +dw $0209 + +ORG $D5AEC9 ; Starman Super +dw $0209 + +ORG $D03CA4 ; Remove bugged plate +db $00 + +ORG $CF0457 +dd OnettHotelSetTeleport + +ORG $EECA28 +db $0A +dl MonkeyCaveShop + +ORG $C50051 +dd MonkeyShopGreeting + +ORG $C50519 +dd MonkeyShopBuyLine + +ORG $C50E1F +dd MonkeyShopNotEnoughMoney + +ORG $C506B1 +dd MonkeyShopSelectItem + +ORG $C50849 +dd MonkeyShopPickCarrier + +ORG $C50381 +dd MonkeyShopNoBuy + +ORG $C50C87 +dd MonkeyShopCancelBuy + +ORG $C501E9 +dd MonkeyShopExitThanks + +ORG $C515B9 +dd MonkeyShopThank + +ORG $C519CB +dd MonkeyShopCantCarry + +ORG $C51751 +dd MonkeyShopBuyAnother + +ORG $C50FB7 +dd MonkeyShopCantCarrySingle + +ORG $D5782C +db $E0 ; Repel Sandwich +db $5D +db $5A +db $7F +db $5F +db $6C ; Protein Drink +db $8C ; Ruler + +ORG $C74C11 +dd PostFrankGuardText + +ORG $D7B200 +db $00 + +;Tenda lower floor +ORG $D7B708 +db $80 + +ORG $D7B748 +db $80 + +; Tenda Inn +ORG $D7C4F0 +db $80 + +ORG $C772F8 ; Magicant Mom +db $CA + +ORG $C1D6B5 +LDA #$03D6 + +ORG $C7FB56 +db $0A +dl AddNessToEpilogue + +ORG $C9C356 +db $00, $00, $00 + +ORG $C9C359 +db $00, $00, $00, $00 + +ORG $CFB374 +db $00 + +ORG $CF666B +db $0C, $00 + +ORG $C4FF00 +db $02, $00, $77, $02, $60, $c8, $AC, $02, $60, $dd ; Winters brickroad and phone + +ORG $C5E572 +db $00, $00 ; Fix vanilla storage bug + +ORG $C9AF4B +db $C7, $00 + +ORG $D56AE9 +db $3B + +ORG $C9FD46 +db $0A +dl NewBikeText + +ORG $C6BFA3 +db $5E, $0A +dl $EEBE84 + +ORG $C8630A +db $90, $90 + +ORG $EEC613 +db $90, $90 + +ORG $D6FB66 +StartingInvetory: +dw $99F3 + +StartingInvAmounts: +dw $000B + +ORG $EF79DE +db $0A +dl FixYouWonAlignment + +ORG $C7AC44 +db $0A +dl FixPhotoManLoad + +ORG $C33BF8 +db $09 + +ORG $C33BB8 +db $00 + +ORG $C7AC9B +db $0A +dl PhotomanLeave + +ORG $C3765F +db $03 +dd PhotoManActionScript + +ORG $C701F6 +db $0A +dl DenyHintsSaidNo + +ORG $C72664 +db $0A +dl DenyHintsNoMoney + +ORG $CFA96E +dd fixed_skyrunner_redirect + +ORG $C7C4D6 +dd EndScript + +ORG $C7C188 +dd EndScript + +ORG $C7C324 +dd EndScript + +ORG $CFC517 +dw $010D + +ORG $CF7E97 +db $B0, $90 + +ORG $C4FF0A +db $06, $00, $4f, $05, $40, $60, $50, $05, $60, $78, $53, $05, $68, $28, $51, $05 +db $68, $a0, $52, $05, $78, $60, $81, $03, $32, $74 + +ORG $CF66D9 +dw $000D + +ORG $CFC51A +dw $0284 + +ORG $C37698 +db $03 +dd DisableCollAndAnim + +ORG $DA82A7 +db $44 + +ORG $DAB4E7 +db $44 + +ORG $DAB067 +db $44 + +ORG $C14936 +JSL LeaveMoneyInMemory + +ORG $C17F21 +JML CheckExtraAddCommands + +ORG $C005EF +LDA #$9900 +nop + +ORG $C005F5 +LDA #$00F8 +nop + +ORG $CFA93B +dd RideSkycicle + +ORG $CFA933 +db $D3 + +ORG $CF8919 +db $30, $68 + +ORG $CFA932 +db $02 + +ORG $C7CB74 +db $C7, $00 + +ORG $D7A90C +db $EC + +ORG $D68463 +;db $FF + +ORG $C8A8E3 +dd CheckForRubyPoo + +ORG $C80C40 +db $E1, $03 + +ORG $C91EA8; TEST THIS!!!! SKY RUNNER FIX +db $d2 + +ORG $C99CCD +db $0A +dl DisableOSSOnLumine + +ORG $C0D668 ;Fix vanilla ambush detection +LDA $9889 + +ORG $EEC777 +db $73, $98, $99, $95, $96, $50, $0A +dl TwosonCopBossText + +ORG $EEBDA4 +db $0A +dl SetupNessForMagicantBoost + + +;New data table go here + + +;;;;;;;;;;;;;boss names +ORG $EEEEBC +db $76, $a2, $91, $9e, $9b, $02; Frank + +db $08, $bc, $ee, $ee, $ff, $0a, $3d, $7e, $c5; Pokey name text +db $08, $bc, $ee, $ee, $ff, $0a, $5B, $7e, $c5; Pokey name text +db $50, $50, $08, $bc, $ee, $ee, $ff, $0a, $c7, $e6, $c9; Belch Name next + +db $05, $27, $00, $05, $C2, $01, $0A, $D0, $C7, $EE + +db $08, $bc, $ee, $ee, $ff, $50, $9f, $96, $50, $0a, $64, $06, $c8 + +db $76, $A2, $91, $9E, $9B, $A9, $A3, $A4, $95, $99, $9E, $50, $7D, $91, $A2, $9B +db $50, $79, $79, $02;Frankystein Mark II + +db $76, $a2, $91, $9e, $9b, $a9, $a3, $a4, $95, $99, $9e, $02;Frankystein + +db $84, $99, $A4, $91, $9E, $99, $93, $50, $71, $9E, $A4, $02; Titanic Ant + +db $73, $91, $a0, $a4, $91, $99, $9e, $50, $83, $a4, $a2, $9f, $9e, $97, $02;Captain Strong + +db $75, $a6, $95, $a2, $94, $a2, $95, $94, $02;Everdred + +db $7d, $a2, $5e, $50, $73, $91, $a2, $a0, $91, $99, $9e, $a4, $95, $a2, $02;Carpainter + +db $7d, $9f, $9e, $94, $9f, $50, $7d, $9f, $9c, $95, $02;Mondo Mole + +db $72, $9f, $9f, $97, $95, $a9, $50, $84, $95, $9e, $a4, $02;Boogey Tent + +db $7d, $99, $9e, $99, $50, $72, $91, $a2, $96, $02; Mini Barf + +db $7d, $91, $a3, $a4, $95, $a2, $50, $72, $95, $9c, $93, $98, $02;Belch + +db $84, $a2, $99, $9c, $9c, $99, $9f, $9e, $91, $97, $95, $50, $83, $a0, $a2, $9f +db $a5, $a4, $02;Trillionage sprout + +db $77, $a5, $91, $a2, $94, $99, $91, $9e, $50, $74, $99, $97, $97, $95, $a2, $02;uardian digger + +db $74, $95, $a0, $a4, $5e, $50, $83, $a4, $9f, $a2, $95, $50, $83, $a0, $9f, $9f +db $9b, $02;Dept store + +db $a4, $98, $95, $50, $7d, $91, $9e, $99, $50, $7d, $91, $9e, $99, $50, $83, $a4 +db $91, $a4, $a5, $95, $02;MMS + +db $7d, $91, $9e, $99, $50, $7d, $91, $9e, $99, $02;Mani Mani + +db $73, $9c, $a5, $9d, $a3, $a9, $50, $82, $9f, $92, $9f, $a4, $02;Clumsy Robot + +db $83, $98, $a2, $9f, $9f, $9f, $9d, $02;Shroom + +db $80, $9c, $91, $97, $a5, $95, $50, $82, $91, $a4, $50, $9f, $96, $50, $74, $9f +db $9f, $9d, $02;Rat + +db $84, $98, $a5, $9e, $94, $95, $a2, $50, $91, $9e, $94, $50, $83, $a4, $9f, $a2 +db $9d, $02;Thunderstorm + +db $7b, $a2, $91, $9b, $95, $9e, $02;Kraken + +db $77, $a5, $91, $a2, $94, $99, $91, $9e, $50, $77, $95, $9e, $95, $a2, $91, $9c +db $02;General + +db $7d, $91, $a3, $a4, $95, $a2, $50, $72, $91, $a2, $96, $02;Barf + +db $83, $a4, $91, $a2, $9d, $91, $9e, $50, $74, $88, $02;DX + +db $74, $95, $9C, $A5, $A8, $95, $02;Deluxe + +db $75, $9C, $95, $93, $A4, $A2, $9F, $50, $83, $A0, $95, $93, $A4, $95, $A2, $02;Specter + +db $73, $91, $a2, $92, $9f, $9e, $50, $74, $9f, $97, $02;Carbon Dog + +db $78, $95, $91, $a6, $99, $9c, $a9, $50, $71, $a2, $9d, $95, $94, $50, $80, $9f +db $9b, $95, $a9, $02;Heavily Pokey + +db $1c, $02, $01, $57, $a3, $50, $7e, $99, $97, $98, $a4, $9d, $91, $a2, $95, $02;Nightmare + +db $83, $a4, $91, $a2, $9d, $91, $9e, $50, $7a, $a5, $9e, $99, $9f, $a2, $02;Junior + +db $74, $99, $91, $9d, $9f, $9e, $94, $50, $74, $9f, $97, $02;Diamond Dog + +db $77, $99, $A9, $97, $91, $A3, $02; giygas + +db $00, $70, $08, $bc, $ee, $ee, $ff, $0a, $5d, $fc, $c8 + +db $50, $08, $bc, $ee, $ee, $ff, $5e, $0a, $4e, $7f, $c5 +;;;;;;;;;;;;;;;;;;;;;;;; +;Absorb the power of the earth +db $91, $92, $a3, $9f, $a2, $92, $50, $a4, $98, $95, $50, $a0, $9f, $a7, $95, $a2 +db $50, $9f, $96, $50, $a4, $98, $95, $50, $75, $91, $a2, $a4, $98, $50, $99, $a4 +db $a3, $95, $9c, $96, $50, $99, $9e, $a4, $9f, $50, $a9, $9f, $a5, $a2, $50, $98 +db $95, $91, $a2, $a4, $5c, $02 + +;Purge giygas's evil +db $a0, $a5, $a2, $97, $95, $50, $77, $99, $a9, $97, $91, $a3, $57, $a3, $50, $95 +db $a6, $99, $9c, $50, $96, $a2, $9f, $9d, $50, $a4, $98, $95, $50, $a7, $9f, $a2 +db $9c, $94, $50, $9f, $9e, $93, $95, $50, $91, $9e, $94, $50, $96, $9f, $a2, $50 +db $91, $9c, $9c, $5c, $02 + +db $18, $04 +;patch moves stuff here + + +ORG $EEF136 +db $0A, $42, $1E, $C9 + +display_melodies: +db $93, $9b, $6a, $18, $05, $4e, $00, $07, $b6, $00, $1B, $03 +dd .has_giant_step +db $08 +dd .display_dot +db $0A +dl .check_lilliput +.has_giant_step: +db $08 +dd .display_melody +.check_lilliput: +db $07, $B7, $00, $1B, $03 +dd .has_lilliput_steps +db $08 +dd .display_dot +db $0A +dl .check_milky +.has_lilliput_steps: +db $08 +dd .display_melody +.check_milky +db $07, $B9, $00, $1B, $03 +dd .has_milky_well +db $08 +dd .display_dot +db $0A +dl .check_rainy_circle +.has_milky_well: +db $08 +dd .display_melody +.check_rainy_circle: +db $07, $b8, $00, $1B, $03 +dd .has_rainy_circle +db $08 +dd .display_dot +db $0A +dl .check_magnet_hill +.has_rainy_circle: +db $08 +dd .display_melody +.check_magnet_hill: +db $07, $BA, $00, $1B, $03 +dd .has_magnet_hill +db $08 +dd .display_dot +db $0A +dl .check_pink_cloud +.has_magnet_hill: +db $08 +dd .display_melody +.check_pink_cloud: +db $07, $BB, $00, $1b, $03 +dd .has_pink_cloud +db $08 +dd .display_dot +db $0A +dl .check_lumine_hall +.has_pink_cloud: +db $08 +dd .display_melody +.check_lumine_hall: +db $07, $BC, $00, $1B, $03 +dd .has_lumine_hall +db $08 +dd .display_dot +db $0A +dl .check_fire_spring +.has_lumine_hall: +db $08 +dd .display_melody +.check_fire_spring: +db $07, $BD, $00, $1B, $03 +dd .has_fire_spring +db $08 +dd .display_dot +db $0A +dl .done_melodies +.has_fire_spring: +db $08 +dd .display_melody +.done_melodies: +db $02 + +.display_dot: +db $70, $02 + +.display_melody: +db $AC, $02 +;;;;;;;;;;;;;;;;;;;; +;sky runner stuff +db $1F, $E5, $FF +db $04, $EC, $02 +db $05, $8F, $02 +db $1F, $21, $DA +db $10, $30 +db $1F, $1E, $BB, $00, $00, $10, $02 +db $1F, $EC, $FF, $00 +db $19, $26, $FF +db $05, $EC, $02;Unset the flag +db $04, $30, $00; remove the old sky runner +db $05, $0B, $00 +db $02 + +db $07, $30, $00, $1b, $02, $00, $bc, $c6, $ff, $06, $76, $02, $77, $b2, $c6, $00 +db $70, $7b, $99, $5d, $9b, $95, $99, $5d, $9b, $a9, $95, $5d, $9b, $a9, $95, $5d +db $9b, $99, $99, $99, $5e, $03, $00, $70, $58, $89, $95, $a0, $5c, $10, $0f, $50 +db $79, $50, $96, $9f, $a5, $9e, $94, $50, $0a, $22, $bc, $c6 + +db $1f, $eb, $ff, $06, $04, $0B, $00, $0A, $5A, $1E, $C9 +;;;;;;;;;;;;;; +;hint guy +onett_hint_man: +db $04, $05, $04 +db $06, $f9, $03 +dd $FFC726DA +dd $C701440A + +twoson_hint_man: +db $04, $06, $04 +db $06, $fA, $03 +dd $FFC726DA +dd $C7014F0A + +threed_hint_man: +db $04, $07, $04 +db $06, $fB, $03 +dd $FFC726DA +dd $C7015A0A + +fourside_hint_man: +db $04, $08, $04 +db $06, $fc, $03 +dd $FFC726DA +dd $C701650A + +summers_hint_man: +db $04, $09, $04 +db $06, $fD, $03 +dd $FFC726DA +dd $C701760A + +scaraba_hint_man: +db $04, $0A, $04 +db $06, $fe, $03 +dd $FFC726DA +dd $C701870A + +display_hint_price: + +db $06, $03, $04 +dd bought_five_hints + +db $06, $02, $04 +dd bought_four_hints + +db $06, $01, $04 +dd bought_three_hints + +db $06, $00, $04 +dd bought_two_hints + +db $06, $FF, $03 +dd bought_one_hint + +db $61, $60, $60 +db $0E, $64 +db $0D, $01, $02 + +bought_one_hint: +db $62, $60, $60 +db $0E, $C8 +db $0D, $01, $02 + +bought_two_hints: +db $64, $60, $60 +db $08 +dd get_2bytenum_part1 +db $1D, $08, $90, $01 +db $1B, $00, $1D, $09, $90, $01 +db $08 +dd get_2bytenum_part2 +db $02 + +bought_three_hints: +db $68, $60, $60 +db $08 +dd get_2bytenum_part1 +db $1D, $08, $20, $03 +db $1B, $00, $1D, $09, $20, $03 +db $08 +dd get_2bytenum_part2 +db $02 + +bought_four_hints: +db $61, $66, $60, $60 +db $08 +dd get_2bytenum_part1 +db $1D, $08, $40, $06 +db $1B, $00, $1D, $09, $40, $06 +db $08 +dd get_2bytenum_part2 +db $02 + +bought_five_hints: +db $63, $62, $60, $60 +db $08 +dd get_2bytenum_part1 +db $1D, $08, $80, $0C +db $1B, $00, $1D, $09, $80, $0C +db $08 +dd get_2bytenum_part2 +db $02 + +get_2bytenum_part1: +db $19, $27, $06, $1b, $04, $1d, $09, $00, $00, $02 + +get_2bytenum_part2: +db $1d, $08, $00, $00, $1b, $01, $1b, $04, $02 + +hint_error_message: +db $a3, $9f, $9d, $95, $a4, $98, $99, $9e, $97, $50, $a7, $95, $9e, $a4, $50, $a4 +db $95, $a2, $a2, $99, $92, $9c, $a9, $50, $a7, $a2, $9f, $9e, $97, $50, $98, $95 +db $a2, $95, $5e, $02 + +count_hints: +db $06, $04, $04 +dd .end_hints +db $06, 03, $04;if we have 5 +dd .set_sixth_hint +db $06, $02, $04;if we have 4 +dd .set_fifth_hint +db $06, $01, $04;if we have 3 +dd .set_fourth_hint +db $06, $00, $04 +dd .set_third_hint; if we have 2 +db $06, $FF, $03 +dd .set_second_hint +db $04, $FF, $03, $02 + + +.set_second_hint: +db $04, $00, $04 +db $02 +.set_third_hint: +db $04, $01, $04 +db $02 +.set_fourth_hint: +db $04, $02, $04 +db $02 +.set_fifth_hint: +db $04, $03, $04 +db $02 +.set_sixth_hint: +db $04, $04, $04 +.end_hints: +db $02 + +push_onett_hint: +db $06, $0B, $04 +dd .skip_hint +db $08 +dd server_hint_text +db $1B, $02 +dd .skip_hint +db $04, $0B, $04 +.skip_hint: +db $02 + +push_twoson_hint: +db $06, $0C, $04 +dd .skip_hint +db $08 +dd server_hint_text +db $1B, $02 +dd .skip_hint +db $04, $0C, $04 +.skip_hint: +db $02 + +push_threed_hint: +db $06, $0D, $04 +dd .skip_hint +db $08 +dd server_hint_text +db $1B, $02 +dd .skip_hint +db $04, $0D, $04 +.skip_hint: +db $02 + +push_fourside_hint: +db $06, $0E, $04 +dd .skip_hint +db $08 +dd server_hint_text +db $1B, $02 +dd .skip_hint +db $04, $0E, $04 +.skip_hint: +db $02 + +push_summers_hint: +db $06, $0F, $04 +dd .skip_hint +db $08 +dd server_hint_text +db $1B, $02 +dd .skip_hint +db $04, $0F, $04 +.skip_hint: +db $02 + +push_scaraba_hint: +db $06, $10, $04 +dd .skip_hint +db $08 +dd server_hint_text +db $1B, $02 +dd .skip_hint +db $04, $10, $04 +.skip_hint: +db $02 + + +server_hint_text: +db $01, $70, $76, $9f, $a2, $50, $91, $9e, $50, $95, $a8, $a4, $a2, $91, $50, $54 +db $65, $60, $60, $5c, $10, $03, $50, $79, $57, $9c, $9c, $50, $a4, $95, $9c, $9c +db $50, $a4, $98, $95, $50, $a3, $95, $a2, $a6, $95, $a2, $50, $91, $92, $9f, $a5 +db $a4, $50, $a4, $98, $99, $a3, $50, $98, $99, $9e, $a4, $5e, $03, $01, $70, $87 +db $98, $91, $a4, $50, $94, $9f, $50, $a9, $9f, $a5, $50, $a3, $91, $a9, $6f, $01 +db $08, $4d, $dd, $c7, $ff, $11, $12 + +db $09, $02 +dd pushhint_saidyes +dd pushhint_no + +pushhint_no: +db $1D, $19, $01 +db $02 + +pushhint_saidyes: +db $19, $27, $06, $1b, $04, $1d, $09, $00, $00, $1d, $08, $F4, $01, $1b, $00, $1d +db $09, $F4, $01, $1d, $08, $00, $00, $1b, $01, $1b, $04 +db $1D, $14, $00, $00, $00, $00 +db $1B, $03 +dd pushhint_nomoney +db $1D, $09, $00, $00 +db $18, $0A +db $1F, $02, $78 +db $1D, $19, $FA +db $02 +pushhint_nomoney: +db $12, $70, $89, $9f, $a5, $50, $94, $9f, $9e, $57, $a4, $50, $98, $91, $a6, $95 +db $50, $95, $9e, $9f, $a5, $97, $98, $50, $9d, $9f, $9e, $95, $a9, $50, $96, $9f +db $a2, $50, $a4, $98, $91, $a4, $50, $a0, $91, $93, $9b, $91, $97, $95, $5e, $03 +db $0A +dd pushhint_no + +post_hint_text: +db $70, $79, $96, $50, $a9, $9f, $a5, $50, $a7, $91, $9e, $a4, $50, $91, $9e, $9f, $a4 +db $98, $95, $a2, $50, $98, $99, $9e, $a4, $5c, $10, $02, $50, $96, $99, $9e, $94 +db $50, $9d, $95, $50, $91, $a4, $50, $9f, $9e, $95, $50, $9f, $96, $50, $9d, $a9 +db $50, $9f, $a4, $98, $95, $a2, $50, $a3, $98, $9f, $a0, $a3, $5e, $13, $02 + +tracy_backpack_tex: +db $70, $89, $9f, $a5, $50, $93, $91, $9e, $50, $91, $9c, $a3, $9f, $50, $9c, $95 +db $91, $a6, $95, $50, $91, $9e, $a9, $a4, $98, $99, $9e, $97, $50, $a9, $9f, $a5 +db $50, $94, $9f, $9e, $57, $a4, $50, $9e, $95, $95, $94, $50, $99, $9e, $50, $a9 +db $9f, $a5, $a2, $50, $92, $91, $93, $9b, $a0, $91, $93, $9b, $5e, $03, $01, $70 +db $89, $9f, $a5, $50, $93, $91, $9e, $50, $9f, $a0, $95, $9e, $50, $99, $a4, $50 +db $a7, $99, $a4, $98, $50, $a4, $98, $95, $50, $82, $50, $92, $a5, $a4, $a4, $9f +db $9e, $51, $13, $02 + +tracy_backpack_twice_tex: +db $70, $74, $99, $94, $50, $a9, $9f, $a5, $50, $96, $9f, $a2, $97, $95, $a4, $50 +db $91, $9c, $a2, $95, $91, $94, $a9, $5c, $50, $92, $99, $97, $50, $92, $a2, $9f +db $6f, $03, $01, $70, $89, $9f, $a5, $50, $93, $91, $9e, $50, $a3, $a4, $9f, $a2 +db $95, $50, $99, $a4, $95, $9d, $a3, $50, $a7, $99, $a4, $98, $50, $a4, $98, $95 +db $50, $82, $50, $92, $a5, $a4, $a4, $9f, $9e, $51, $13, $02 + +winters_drugstore_space: +db $08 +dd drugstore_spacecheck +db $1B, $02 +dd $FFC6AEE1 +dd $C6AE4B0A + +winters_drugstore_space2: +db $08 +dd drugstore_spacecheck +db $1B, $02 +dd $FFC6AEE1 +dd $C6AEAC0A + +drugstore_spacecheck: +db $1D, $03, $FF, $1B, $02 +dd .no_space +db $1D, $19, $FE +db $02 +.no_space: +db $1D, $19, $01 +db $02 + +fix_boogey_tent: +db $1B, $02 +dd .no_space +db $04, $57, $00 +db $02 +.no_space: +db $04, $9D, $02 +db $02 +;Newtext + +boost_speed_dynamic: +db $1B, $04 +db $1F, $C0, $04 +dd boost_ness_speed +dd boost_paula_speed +dd boost_jeff_speed +dd boost_poo_speed +db $1b, $04, $02 + + +boost_vitality_dynamic: +db $1B, $04 +db $1F, $C0, $04 +dd boost_ness_vitality +dd boost_paula_vitality +dd boost_jeff_vitality +dd boost_poo_vitality +db $1b, $04, $02 + +boost_guts_dynamic: +db $1B, $04 +db $1F, $C0, $04 +dd boost_ness_guts +dd boost_paula_guts +dd boost_jeff_guts +dd boost_poo_guts +db $1b, $04, $02 + +boost_iq_dynamic: +db $1B, $04 +db $1F, $C0, $04 +dd boost_ness_iq +dd boost_paula_iq +dd boost_jeff_iq +dd boost_poo_iq +db $1b, $04, $02 + +boost_luck_dynamic: +db $1B, $04 +db $1F, $C0, $04 +dd boost_ness_luck +dd boost_paula_luck +dd boost_jeff_luck +dd boost_poo_luck +db $1b, $04, $02 + +boost_ness_speed: +db $1E, $0C, $01, $05, $03, $02 + +boost_paula_speed: +db $1E, $0C, $02, $05, $03, $02 + +boost_jeff_speed: +db $1E, $0C, $03, $05, $03, $02 + +boost_poo_speed: +db $1E, $0C, $04, $05, $03, $02 +;;;;;;;;;; +boost_ness_vitality: +db $1E, $0D, $01, $05, $03, $02 + +boost_paula_vitality: +db $1E, $0D, $02, $05, $03, $02 + +boost_jeff_vitality: +db $1E, $0D, $03, $05, $03, $02 + +boost_poo_vitality: +db $1E, $0D, $04, $05, $03, $02 +;;;;;;;;;;;;;; +boost_ness_guts: +db $1E, $0B, $01, $05, $03, $02 + +boost_paula_guts: +db $1E, $0B, $02, $05, $03, $02 + +boost_jeff_guts: +db $1E, $0B, $03, $05, $03, $02 + +boost_poo_guts: +db $1E, $0B, $04, $05, $03, $02 +;;;;;;;; +boost_ness_iq: +db $1E, $0A, $01, $05, $03, $02 + +boost_paula_iq: +db $1E, $0A, $02, $05, $03, $02 + +boost_jeff_iq: +db $1E, $0A, $03, $05, $03, $02 + +boost_poo_iq: +db $1E, $0A, $04, $05, $03, $02 +;;;;;;;;;;;; +boost_ness_luck: +db $1E, $0E, $01, $05, $03, $02 + +boost_paula_luck: +db $1E, $0E, $02, $05, $03, $02 + +boost_jeff_luck: +db $1E, $0E, $03, $05, $03, $02 + +boost_poo_luck: +db $1E, $0E, $04, $05, $03, $02 + +db $06, $69, $00 +dd $00C74207 +db $0A +dl LeaderHandinBadge +db $01 +db $0A, $AD, $69, $C7 + +;new text go here +db $19, $10, $01 +db $1B, $04 +db $0E, $00 +db $08 +db $7F, $DC, $C7, $00 +db $1b, $02 +dd $00C7E6D7 +db $7E, $9F, $92, $9F, $94, $A9, $02 + +PrintPlayerNum: +db $1B, $06 +db $1C, $0A, $00, $00, $00, $00, $5E, $50, $02 + +PlayerNameText: +db $06, $13, $04 +dd .PrintPlayerName +db $1B, $06 +db $80, $9C, $91, $A9, $95, $A2, $1C, $0A, $00, $00, $00, $00, $50, $50, $B8, $02 +.PrintPlayerName: +db $1C, $05, $AD, $50, $50, $B8, $02 + +LilliputDoor: +db $06, $15, $04 +dd .LilliputUnlocked +db $18, $01, $01 +db $70, $7f, $9e, $50, $93, $9c, $9f, $a3, $95, $a2, $50, $99, $9e, $a3, $a0, $95 +db $93, $a4, $99, $9f, $9e, $5c, $10, $05, $50, $99, $a4, $50, $91, $93, $a4, $a5 +db $91, $9c, $9c, $a9, $50, $91, $a0, $a0, $95, $91, $a2, $a3, $50, $a4, $9f, $50 +db $92, $95, $50, $a0, $91, $99, $9e, $a4, $95, $94, $50, $9f, $9e, $5e, $5e, $5e +db $03, $01, $70, $7c, $9f, $9f, $9b, $99, $9e, $97, $50, $93, $9c, $9f, $a3, $95 +db $a2, $5c, $10, $04, $50, $a4, $98, $95, $a2, $95, $50, $91, $a0, $a0, $95, $91 +db $a2, $a3, $50, $a4, $9f, $50, $92, $95, $50, $91, $50, $a4, $99, $9e, $a9, $50 +db $9b, $95, $a9, $98, $9f, $9c, $95, $51 +db $1D, $05, $FF, $7D +db $1B, $03 +dd .UnlockDoor +db $13 +db $18, $04 +db $02 +.UnlockDoor: +db $03, $01, $70 +db $19, $10, $01 +db $1B, $04 +db $1C, $02, $00 +db $50 +db $a5, $9e, $9c, $9f, $93, $9b, $95, $94, $50, $a4, $98, $95, $50, $94, $9f, $9f +db $a2, $50, $a5, $a3, $99, $9e, $97, $50, $a4, $98, $95, $50, $1c, $05, $7d, $51, $1f +db $02, $76, $03, $01, $70, $84, $98, $95, $50, $94, $9f, $9f, $a2, $50, $9f, $a0 +db $95, $9e, $95, $94, $51 +db $03 +db $1D, $01, $FF, $7D +db $04, $15, $04 +db $18, $04 +.LilliputUnlocked: +db $0A, $0B, $B1, $C9 + +TinyKeyDesc: +db $01, $50, $6c, $1c, $05, $7d, $6e, $03, $00, $70, $71, $50, $9b, $95, $a9, $50 +db $a3, $9f, $50, $a3, $9d, $91, $9c, $9c, $5c, $50, $a9, $9f, $a5, $50, $93, $91 +db $9e, $50, $92, $91, $a2, $95, $9c, $a9, $50, $a3, $95, $95, $50, $99, $a4, $5e +db $03, $01, $70, $79, $a4, $57, $a3, $50, $93, $9f, $a6, $95, $a2, $95, $94, $50 +db $99, $9e, $50, $92, $9c, $a5, $95, $50, $a0, $91, $99, $9e, $a4, $5e, $5e, $5e +db $13, $02 + +LavapantsDesc: +db $01, $50, $6c, $1c, $05, $B3, $6e, $03, $00, $70, $7c, $91, $a6, $91, $5d, $a0 +db $a2, $9f, $9f, $96, $50, $a0, $91, $9e, $a4, $a3, $50, $a0, $91, $99, $9e, $a3 +db $a4, $91, $9b, $99, $9e, $97, $9c, $a9, $50, $96, $9f, $a2, $97, $95, $94, $50 +db $92, $a9, $50, $91, $50, $84, $95, $9e, $94, $91, $5e, $03, $01, $70, $84, $98 +db $95, $a9, $50, $95, $a6, $95, $9e, $50, $a7, $9f, $a2, $9b, $50, $a5, $9e, $94 +db $95, $a2, $a7, $91, $a4, $95, $a2, $51, $03, $01, $70, $58, $74, $9f, $95, $a3 +db $50, $9e, $9f, $a4, $50, $a0, $a2, $9f, $a4, $95, $93, $a4, $50, $91, $97, $91 +db $99, $9e, $a3, $a4, $50, $98, $95, $91, $a4, $50, $9f, $a2, $50, $96, $99, $a2 +db $95, $5e, $13, $02 + +FireSpringDoor: +db $06, $16, $04 +dd .FireSpringUnlocked +db $18, $01, $01 +db $70, $87, $98, $9f, $91, $98, $51, $03, $01, $70, $79, $a4, $57, $a3, $50, $a3 +db $9f, $50, $98, $9f, $a4, $5c, $10, $05, $50, $a9, $9f, $a5, $50, $93, $9f, $a5 +db $9c, $94, $50, $9d, $95, $9c, $a4, $51 +db $1D, $05, $FF, $B3, $03 +db $1B, $03 +dd .UnlockDoor + +db $01, $70, $72, $95, $a4, $a4, $95 +db $a2, $50, $93, $9f, $9d, $95, $50, $92, $91, $93, $9b, $50, $a7, $99, $a4, $98 +db $50, $a3, $9f, $9d, $95, $50, $9c, $91, $a6, $91, $5d, $a0, $a2, $9f, $9f, $96 +db $50, $a0, $91, $9e, $a4, $a3, $5e, $5e, $5e +;Todo; Somewhere in this, place the jump to UnlockDoor after "It's so hot you could melt" +db $13 +db $18, $04 +db $02 +.UnlockDoor: +db $08 +dd LeaderPantsText +db $1D, $01, $FF, $B3 ;Todo. Add check for presence of item....? Find a way to stop this if we already used tenda pants +db $18, $04 +.FireSpringUnlocked +db $0A, $0B, $B1, $C9 + +LavaPantsUseTxt: +db $01, $70 +db $1C, $0D +db $1B, $04 +.DoorPantsTex: +db $50 +db $a5, $a3, $95, $94, $50, $a4, $98, $95, $50, $1c, $05, $b3, $51 +db $1F, $02, $73 +db $14 +db $01, $70, $7E, $9F, $A7, $5C, $50 +db $08 +dd $00C7E602 +db $50 +db $93, $91, $9e, $50, $95, $91, $a3, $99, $9c, $a9, $50, $a7, $99, $a4, $98, $a3 +db $a4, $91, $9e, $94, $50, $a4, $98, $95, $50, $9c, $91, $a6, $91, $50, $99, $9e +db $50, $76, $99, $a2, $95, $50, $83, $a0, $a2, $99, $9e, $97, $5e +db $14 +db $18, $04 +db $04, $16, $04 +db $02 + +RememberedTex: +db $50, $A2, $95, $9D, $95, $9D, $92, $95, $A2, $95, $94, $50 +db $A4, $98, $95, $50, $02 + +SetupStorageTakeMenu: +db $18, $01, $29 +db $19, $02 +db $83, $a4, $9f, $a2, $91, $97, $95, $02 +db $19, $02 +db $7b, $95, $a9, $50, $79, $a4, $95, $9d, $a3, $02 +db $1C, $07, $02 +db $11 +db $09, $02 +dd .Storage +dd .KeyStorage +db $0A +dl $EEC6AB +.Storage: +;db $18, $00 +db $18, $03, $29 +db $0A +dl $EE9699 +.KeyStorage: +db $1C, $1D, $01 +db $0A +dl .Storage + +InitStorageMen: +db $18, $03, $0D +db $18, $00 +db $1C, $1E, $01 +db $0A +dl SetupStorageTakeMenu + +CheckItemOnStore: +db $1B, $00 +db $19, $19, $00, $00 +db $1B, $05 +db $1C, $1F, $01 +db $1B, $01 +db $1d, $12, $00, $00 +db $1C, $1E, $01 +db $0A +dl $EE9690 + +ORG $EEFAA0 +SancFirst: +db $96, $99, $A2, $A3, $A4, $02 + +SancSecond: +db $A3, $95, $93, $9F, $9E, $94, $02 + +SancThird: +db $A4, $98, $99, $A2, $94, $02 + +SancFourth: +db $96, $9F, $A5, $A2, $A4, $98, $02 + +SancFifth: +db $96, $99, $96, $A4, $98, $02 + +SancSixth: +db $A3, $99, $A8, $A4, $98, $02 + +SancSeventh: +db $A3, $95, $A6, $95, $9E, $A4, $98, $02 + +SancEighth: +db $95, $99, $97, $98, $A4, $98, $02 + +RainyCircleIntro: +db $08 +dd SancFourth +db $0A +dl $C6BEAC + +FireSpringIntro: +db $08 +dd SancEighth +db $0A +dl $EF5817 + +CheckAbsoluteStorage: +db $1B, $06 +db $18, $03, $01 +db $1B, $02 +dd $00EE9699 +db $0A +dl $EE96BD + +OpenLockers: +.TopRightLocker: +db $1B, $00 +db $08 +dd .CheckIfUseKeytoLocker +db $1B, $02 +dd $C6FB5D +db $06, $58, $00 +dd $C7D9FD +db $08 +dd .LockerItemAwaitsText +db $1C, $05, $01 +db $50 +db $99, $9E, $A3, $99, $94, $95, $51, $03, $01 +db $08 +dd .CheckForLockerItemSpace +db $1B, $02 +dd $C685BB +db $1D, $0E, $FF, $11 +db $08 +dd .LockerGetItemText +db $03 +db $04, $58, $00 +db $02 + +.TopLeftLocker: +db $1B, $00 +db $08 +dd .CheckIfUseKeytoLocker +db $1B, $02 +dd $C6FB5D +db $06, $F4, $03 +dd $C7D9FD +db $08 +dd .LockerItemAwaitsText +db $1C, $05, $01 +db $50 +db $99, $9E, $A3, $99, $94, $95, $51, $03, $01 +db $08 +dd .CheckForLockerItemSpace +db $1B, $02 +dd $C685BB +db $1D, $0E, $FF, $11 +db $08 +dd .LockerGetItemText +db $03 +db $04, $F4, $03 +db $02 + +.BottomRightLocker: +db $1B, $00 +db $08 +dd .CheckIfUseKeytoLocker +db $1B, $02 +dd $C6FB5D +db $06, $17, $00 +dd $C7D9FD +db $08 +dd .LockerItemAwaitsText +db $1C, $05, $01 +db $50 +db $99, $9E, $A3, $99, $94, $95, $51, $03, $01 +db $08 +dd .CheckForLockerItemSpace +db $1B, $02 +dd $C685BB +db $1D, $0E, $FF, $11 +db $08 +dd .LockerGetItemText +db $03 +db $04, $17, $00 +db $02 + +.BottomLeftLocker: +db $1B, $00 +db $08 +dd .CheckIfUseKeytoLocker +db $1B, $02 +dd $C6FB5D +db $06, $4E, $01 +dd $C7D9FD +db $08 +dd .LockerItemAwaitsText +db $1C, $05, $01 +db $50 +db $99, $9E, $A3, $99, $94, $95, $51, $03, $01 +db $08 +dd .CheckForLockerItemSpace +db $1B, $02 +dd $C685BB +db $1D, $0E, $FF, $11 +db $08 +dd .LockerGetItemText +db $03 +db $04, $4E, $01 +db $02 + +.CheckIfUseKeytoLocker: +db $08 +dd .CheckItemUsage +db $0B, $CD +db $0A +dd CheckForLockerKey +db $02 + +.CheckItemUsage: +db $19, $19, $00, $00 +db $1B, $04 +db $02 + +.OpenLockerText: +db $70, $19, $10, $01 +db $1C, $02, $00 +db $50, $9f, $a0, $95, $9e, $95, $94, $50, $a4, $98, $95, $50, $9c, $9f, $93, $9b +db $95, $a2, $50, $a5, $a3, $99, $9e, $97, $50, $99, $a4, $a3, $50, $9b, $95, $a9 +db $51 +db $1f, $02, $75, $03, $02 + +.CheckForLockerItemSpace: +db $1D, $03, $FF +db $02 + +.LockerGetItemText: +db $08 +dd $C7DCCF +db $02 + +.MiddleLocker: +db $70, $84, $98, $95, $50, $9c, $9f, $93, $9b, $50, $99, $a3, $50, $92, $a5, $a3 +db $a4, $95, $94, $5e, $13, $02 + +.LockerItemAwaitsText: +db $01 +db $70 +db $78, $95, $a9, $51, $10, $10, $50, $84, $98, $95, $a2, $95, $50, $99, $a3, $50 +db $91, $50, $02 + +fixed_skyrunner_redirect: +db $18, $04 +db $1D, $05, $FF, $9E +db $1B, $02 +dd broken_skyrunner_text +db $1D, $01, $FF, $9E +db $0A +dl fixed_skyrunner_text + +SpecialTexMagicant: +db $7D, $91, $97, $99, $93, $91, $9E, $A4, $50, $84, $95, $9C, $95, $A0, $9F, $A2 +db $A4, $00 + +SpecialTexNess: +db $7E, $95, $A3, $A3, $00 + +SpecialTexPhotoGuy: +db $A0, $98, $9F, $A4, $9F, $97, $A2, $91, $A0, $98, $00 + +NpcNessGiveOverride: +db $0D, $01 +db $1B, $04 +db $1B, $00 +db $0B, $15 +db $1B, $03 +dd .GiveNess +db $1B, $01 +db $0B, $16 +db $1B, $03 +dd PhotoHandler +db $1B, $01 +db $0A +dl $EEAAAB +.GiveNess: +db $1C, $04 +db $1F, $00, $00 +db $7b, $10, $85, $01, $1f, $03, $70, $58 +db $1c, $02, $01 +db $50, $9a, $9f, $99, $9e, $95, $94, $50, $a9, $9f, $a5, $5e, $59 +db $04, $17, $04 +db $1f, $11, $01, $02, $01 +db $02 + +NessUnlockText: +db $70, $78, $95, $a9, $51, $03, $01, $70, $79, $57, $9d, $50, $1c, $02, $01, $51 +db $03, $01, $70, $79, $a4, $57, $a3, $50, $97, $a2, $95, $91, $a4, $50, $a4, $9f +db $50, $96, $99, $9e, $91, $9c, $9c, $a9, $50, $9d, $95, $95, $a4, $50, $a9, $9f +db $a5, $50, $97, $a5, $a9, $a3, $51, $13 +db $18, $04, $1f, $00, $00, $0b, $10, $78, $50, $08, $10, $F8, $D5, $00, $1f, $03 +db $18, $01, $01, $70, $1c, $02, $01, $50, $9a, $9f, $16, $b9, $94, $15, $a8, $03 +db $18, $04, $1f, $11, $01, $02 +db $02 + +SetNpcPooPSIFlag: +db $04, $D1, $03 +db $1f, $71, $04, $02, $02 + +DisplayDollars10: +db $54, $61, $60, $00 + +DisplayDollars100: +db $54, $61, $60, $60, $00 + +DisplayDollars1000: +db $54, $61, $60, $60, $60, $00 + + +;FOR TESTING!!!! +;ORG $CF09EE +;dl $EEf790 + +;ORG $CF09F2 +;db $15, $84 + +;ORG $CF23D2 +;db $16, $84 + +;ORG $CF23CE +;dd FireSpringDoor +;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $C1C84A +JSR $C80E + +ORG $C1C7FD +CLC + ADC #psi_letters + STA $0E + lda #$00FD + sta $10 +STZ $12 +STZ $14 +BRA $10 +JSL sort_psi_menu +JMP $163C + +ORG $F00000 +sort_psi_menu: +REP #$31 +PHD +TDC +ADC #$FFF8 +TCD +LDA $8958 +CMP #$FFFF +BNE .nojump +JMP .Return +.nojump: +ASL +TAX +LDA $88E4,X +LDY #$0052 +JSL $C08FF7 +TAY +LDA $867B,Y +STA $00 +JSL $C10C49 +DEC +BNE $06 +LDA #$FFFF +JMP .Return +BMI $F8 +STA $02 +LDA $00 +LDY #$002D +JSL $C08FF7 +CLC +ADC #$89D4 +STA $04 +LDX $04 +TXA +.selsort_outer: +LDY $02 +STY $06 +CLC +ADC #$002D +TAY +LDA $000A,X +CMP $000A,Y +BNE $06 +LDA $0008,X +CMP $0008,Y +BCC $01 +TYX +TYA +DEC $06 +BNE $E5 +CPX $04 +BEQ .selsort_outer_no_swap +LDY $04 +SEP #$20 +LDA #$27 +STA $00 +.swap_loop: +LDA $0006,X +XBA +LDA $0006,Y +STA $0006,X +XBA +STA $0006,Y +INX +INY +DEC $00 +BNE .swap_loop +REP #$20 +.selsort_outer_no_swap: +LDA $04 +CLC +ADC #$002D +STA $04 +TAX +DEC $02 +BNE .selsort_outer +LDA #$0000 +.Return: +PLD +RTL + +GetProgressiveItems: +JSR SwapItemForProg +STA $0000,X +JML $C18B65 + +GetProgressiveGoingtoStorage: +AND #$00FF +SEP #$20 +JSR SwapItemForProg +STA $0000,X +JML $C19164 + +CheckifNameProgressive: +SEP #$20 +CMP #$E3 +BCC .NormalItem +CMP #$E8 +BCS .NormalItem +JSR SwapNameForProg +.NormalItem: +REP #$20 +JML GetItemName + +SwapItemForProg: +CMP #$E3 +BCC .NormalItem +CMP #$E8 +BCS .NormalItem +SEC +SBC #$E3 +PHX +TAX +LDA $B5E0,X ;Progressive item count +CMP ProgCaps,X +BCS .CappedItem +INC $B5E0,X +BRA .GetItem +.CappedItem: +LDA $B5E0,X +.GetItem: +SEP #$10 +CPX #$00 +BEQ .GetProgBat +CPX #$01 +BEQ .GetProgPan +CPX #$02 +BEQ .GetProgGun +CPX #$03 +BEQ .GetProgBrace +CPX #$04 +BEQ .GetProgOther +.GotProgItem: +REP #$10 +PLX +.NormalItem: +RTS +.GetProgBat: +TAX +LDA ProgBats,X +JMP .GotProgItem +.GetProgPan: +TAX +LDA ProgPans,X +JMP .GotProgItem +.GetProgGun: +TAX +LDA ProgGuns,X +JMP .GotProgItem +.GetProgBrace +TAX +LDA ProgBracelets,X +JMP .GotProgItem +.GetProgOther +TAX +LDA ProgOther,X +JMP .GotProgItem + +SwapNameForProg: +SEC +SBC #$E3 +PHX +TAX +LDA $B5E0,X ;Progressive item count +SEP #$10 +CPX #$00 +BEQ .GetProgBat +CPX #$01 +BEQ .GetProgPan +CPX #$02 +BEQ .GetProgGun +CPX #$03 +BEQ .GetProgBrace +CPX #$04 +BEQ .GetProgOther +.GotProgItem: +REP #$10 +PLX +RTS +.GetProgBat: +TAX +LDA ProgBats,X +JMP .GotProgItem +.GetProgPan: +TAX +LDA ProgPans,X +JMP .GotProgItem +.GetProgGun: +TAX +LDA ProgGuns,X +JMP .GotProgItem +.GetProgBrace +TAX +LDA ProgBracelets,X +JMP .GotProgItem +.GetProgOther +TAX +LDA ProgOther,X +JMP .GotProgItem + +NewLuckySandwich: +REP #$31 +LDA #$0010 +JSL .RandBankC2 +CMP #$0007 +BCC .60HPRS +LDA #$0009 +JSL .RandBankC2 +CMP #$0004 +BCC .240HPRS +LDA #$0005 +JSL .RandBankC2 +CMP #$0003 +BCC .FullHPRS +LDA #$0002 +JSL .RandBankC2 +CMP #$0000 +BEQ .5PP +LDA #$0003 +JSL .RandBankC2 +BCS .20PP +BRA .FullHeal +.60HPRS: +LDA #$003C +JSL .MultBankC2 +TAX +LDA $A972 +JSL .RestHP +BRA .Return +.240HPRS: +LDA #$00F0 +JSL .MultBankC2 +TAX +LDA $A972 +JSL .RestHP +BRA .Return +.FullHPRS +LDX #$0F27 +LDA $A972 +JSL .RestHP +BRA .Return +.5PP: +LDA #$0005 +JSL .MultBankC2 +TAX +LDA $A972 +JSL .RestPP +BRA .Return +.20PP: +LDA #$0014 +JSL .MultBankC2 +TAX +LDA $A972 +JSL .RestPP +BRA .Return +.FullHeal: +LDX #$0F27 +LDA $A972 +JSL .RestHP +LDX $A972 +LDA $001B,X +TAX +LDA $A972 +JSL .RestPP +.Return: +RTL + +.RandBankC2: +PHY +LDY #$6A2C +JSL goto_bank_c2 +PLY +RTL + +.MultBankC2: +PHY +LDY #$6AFC +JSL goto_bank_c2 +PLY +RTL + +.RestHP: +PHY +LDY #$7293 +JSL goto_bank_c2 +PLY +RTL + +.RestPP: +PHY +LDY #$7317 +JSL goto_bank_c2 +PLY +RTL + +GetNewSwirlColorNormal: +LDA #$0004 +STA $14 +LDA #$0004 +STA $04 +LDY #$0000 +STY $12 +JML $C2E8F9 + +GetNewSwirlColorGood: +LDA #$001C +STA $14 +LDA #$0005 +STA $04 +LDY #$000C +STY $12 +LDA #$0006 +JML $C2E92F + +GetNewSwirlColorBad: +LDA #$0000 +STA $14 +LDA #$001F +STA $04 +LDY #$001F +STY $12 +JML $C2E944 + +PokeySwirl: +LDA $4A8C +CMP #$000E +BEQ .BossSwirl +CMP #$01C0 +BCC .NormalSwirl +.BossSwirl: +JML $C2E953 +.NormalSwirl: +JML $C2E964 +;;;;;;;;;;;; +GetSeedPlayer: +PHY +PHB +LDA #$0010 +LDX #$FD00 +LDY #$9801 +MVN $D77E +PLB +PLY +LDX #$9801 +STX $15 +JML $C0F67F + +DrawWorldVersion: +LDA #$0024 +JSL $C1DD47 +LDA #$FFA0 +STA $0E +LDA #$00FC +STA $10 +;FCFFE0 stores the world version +JSL $C186B1 + +LDA #$0013 +JSL $C1DD47;draw the file select box +JML $C1ED6D + +Set24BitStartingEXP: +PHX +LDA $24 +AND #$00FF +ASL +TAX +LDA ExpPointers,X +STA $06 +LDA #$00D7 +STA $08 +LDA [$06] +BEQ .ZeroCheck +.HasExp: +TAX +INC $06 +INC $06 +LDA [$06] +STA $08 +STX $06 +PLX +JML $C1FD61 +.ZeroCheck: +PHA +INC $06 +INC $06 +LDA [$06] +BEQ .NoEXP +PLA +DEC $06 +DEC $06 +BRA .HasExp +.NoEXP: +PLA +PLX +DEC $06 +DEC $06 +JML $C1FD72 + +CheckMoreSpecialCommands: +CMP #$0018 +BEQ .PrintPlayerMenu +CMP #$0019 +BEQ .CheckIfIsBanned +CMP #$001A +BEQ .SendGiftPacket +CMP #$001B +BEQ .PrintGiftInbox +CMP #$001C +BEQ .CountGifts +CMP #$001D +BEQ .SwaptoKeyStorage +CMP #$001E +BEQ .ClearKeyStorage +CMP #$001F +BEQ .StoreKeyItem +CMP #$0020 +BEQ .SetShopFlag +CMP #$0021 +BEQ .ClearAPName +JML CheckMoreMoreCommands +.CheckIfIsBanned: +JMP .CompareBannedItemList +.SendGiftPacket: +JMP .LongSendGiftPacket +.PrintGiftInbox: +JMP SwapToGiftInventory +.CountGifts: +JMP CountGifts +.SwaptoKeyStorage: +JMP SwapKeyStorage +.StoreKeyItem: +JMP StoreKeyItem +.ClearKeyStorage: +JMP ClearKeyStorage +.SetShopFlag: +JMP SetShopFlag +.ClearAPName: +JMP ClearAPNameFlag + +.PrintPlayerMenu: +JSL $C3E4D4 +LDA #$0035 +JSL $C1DD47 ;open_window + +LDA #$0002 +LDY #$0EB3 +JSL goto_bank_c1 + +LDA #$0082 +LDY #$0EB3 +JSL goto_bank_c1 +LDA #$0001 +STA $97D0 +.ResetText: +STZ $B5E9 +LDA $B622 +AND #$FFFB +STA $B622 +LDA $97D0 +STA $B5E7 +LDA #$00EE +STA $10 +LDA.w #PrintPlayerNum +STA $0E +JSL $C186B1 + +.PressNothing: +LDA #$0000 +.CheckServerLoop: +STA $B58E +LDA $B58E +CMP #$0032 +BEQ .ExitServerLoop + +LDA $B622 +AND #$00FF +AND #$0004 +BNE .ExitServerLoop +LDA $B58E +INC +PHA +JSL $C08756 +PLA +BRA .CheckServerLoop +.ExitServerLoop: +LDA #$00EE +STA $10 +LDA.w #PlayerNameText +STA $0E +JSL $C3E4D4 +JSL $C186B1 +JSL $C3E4CA +.LoopWin: +JSL $C12DD5 + +LDA $0066 +AND #$0008 +BNE .PressedUp +LDA $0066 +AND #$0004 +BNE .PressedDown +LDA $0066 +AND #$0001 +BNE .PressedRight + +LDA $0066 +AND #$0002 +BNE .PressedLeft +JMP .SpecialInput +.PressedUp: +LDA #$0035 +JSL $C1DD47 +LDA $97D0 +CMP PlayerCount +BCS .MaxPlayers +INC +.MaxPlayers: +DEC +CMP PlayerCount +BCS .OverCap +INC +STA $97D0 +.OverCap: +JMP .ResetText +.PressedDown: +LDA #$0035 +JSL $C1DD47 +LDA $97D0 +CMP #$0001 +BEQ .MaxPlayers +DEC +BRA .MaxPlayers +.PressedRight: +LDA #$0035 +JSL $C1DD47 +LDA $97D0 +CMP PlayerCount +BCS .MaxPlayers +CLC +ADC #$000A +JMP .MaxPlayers +.PressedLeft: +LDA #$0035 +JSL $C1DD47 +LDA $97D0 +CMP #$000B +BCC .MaxPlayers +SEC +SBC #$000A +BRA .MaxPlayers +.SpecialInput: +LDA $006D +AND #$00A0 +BNE .Confirm +LDA $006D +AND #$A000 +BNE .Decline +JMP .LoopWin +.Confirm: +LDA #$0001 +STA $97CC +JSL $C1DD59 + +LDA $97D0 +STA $B5E9 +LDA #$0000 +JML $C17F0F + +.Decline: +JSL $C1DD59 +STZ $97CC +LDA #$0000 +JML $C17F0F + +.CompareBannedItemList: +REP #$31 +PHD +TDC +ADC #$FFEE +TCD +STZ $B573 +LDY #$03DB +JSL goto_bank_c1 +LDA $06 +SEP #$20 +LDX #$0000 +.check_banlist: +CMP BannedItemList,X +BEQ .BannedItem +INX +CPX #$002F +BCC .check_banlist +REP #$20 +LDA #$0001 +BRA .exit +.BannedItem: +REP #$20 +LDA #$0000 +.exit: +STA $0E +STZ $10 +LDY #$045C +JSL goto_bank_c1 +LDA #$0000 +PLD +JML $C17F0F + + +.LongSendGiftPacket: +LDA $31D0 +AND #$00FF +CMP #$0009 +BCC .GiftBufferNotFull +LDA $B622 +ORA #$0008 +STA $B622 + +;Set flag here +.GiftBufferNotFull: +INC $31D0 +LDX #$0000 +.CheckBuffer: +LDA $31D1,X +BEQ .InsertGiftToBuffer +INX #3 +BRA .CheckBuffer + +.InsertGiftToBuffer: +SEP #$20 +LDA $97D0 +STA $31D1,X +REP #$20 +LDA $B5E9 +STA $31D2,X +LDA #$0000 +JML $C17F0F + +TransferGiftToInv: +PHA +PHX +SEP #$20 +LDA $3270;Set this byte if we opened the Receiving menu +BNE .NoGift +LDA $3200 +BEQ .NoGift +LDX #$0000 +.CheckGiftSlots: +LDA $3201,X +BEQ .EmptySlot +INX +CPX #$0047 +BEQ .NoGift +BRA .CheckGiftSlots +.EmptySlot: +LDA $3200 +STA $3201,X +STZ $3200 +.NoGift: +REP #$20 +PLX +PLA +JML $809470 + +SwapToGiftInventory: +LDA $3272 +BEQ .SetSwapInv +STZ $3272 +BRA .ClearSwapInv +.SetSwapInv: +LDA #$0001 +STA $3272 +.ClearSwapInv: +LDA #$0000 +JML $C17F0F + +CountGifts: +STZ $97D0 +STZ $97CC +SEP #$20 +LDA $3201 +BEQ .Exit +LDA #$01 +STA $97D0 +LDX #$0000 +.CheckGiftCount: +LDA $3201,X +BEQ .Exit +INC $97CC +INX +BRA .CheckGiftCount + +.Exit: +REP #$20 +LDA #$0000 +JML $C17F0F + + +GetDynamicWindowTitle: +LDA $3272 +BEQ .GetStorage +DEC +ASL +TAX +LDA StorageTitlePointers,X +STA $0E +LDA #$00FC +STA $10 +LDA StorageNumberStart,X +STA $18 +LDA StorageTitleLength,X +AND #$00FF +TAX +LDA #$9C9F +JML $C19A6D +.GetStorage: +LDA #$00C4 +STA $10 +JML $C19A67 + +CheckGiftBox1:; +LDA $3272 +BEQ .Storage +CMP #$0002 +BEQ .KeyStorage +LDA $3201,X +BRA .GiftBox +.Storage: +LDA $B590,X +.GiftBox: +AND #$00FF +JML $C19ABF +.KeyStorage: +LDA $3280,X +BRA .GiftBox + + +CheckGiftBox2: +LDA $3272 +BEQ .Storage +CMP #$02 +BEQ .KeyStorage +LDA $3201,X +BRA .GiftBox +.Storage: +LDA $B590,X +.GiftBox: +STA $06 +JML $C15B2E +.KeyStorage: +LDA $3280,X +BRA .GiftBox + +CheckGiftBox3: +LDA $3272 +BEQ .Storage +CMP #$02 +BEQ .KeyStorage +LDA $3202,X +BRA .GiftBox +.Storage: +LDA $B591,X +.GiftBox: +STA $00 +JML $C191D8 +.KeyStorage: +LDA $3281,X +BRA .GiftBox + +CheckGiftBox4: +LDA $3272 +BEQ .Storage +CMP #$02 +BEQ .KeyStorage +LDA $3201,X +BRA .Giftbox +.Storage: +LDA $B590,X +.Giftbox +STA $01 +JML $C191C3 +.KeyStorage: +LDA $3280,X +BRA .Giftbox + + +CheckGiftBox5: +LDA $3272 +BEQ .Storage +CMP #$02 +BEQ .KeyStorage +STZ $3201,X +BRA .Giftbox +.Storage: +STZ $B590,X +.Giftbox: +REP #$20 +JML $C191F1 +.KeyStorage: +STZ $3280,X +BRA .Giftbox + +CheckGiftBox6: +PHA +LDA $3272 +BEQ .Storage +CMP #$02 +BEQ .KeyStorage +PLA +STA $3201,X +BRA .GiftBox +.Storage: +PLA +STA $B590,X +.GiftBox: +REP #$20 +JML $C191CE +.KeyStorage: +PLA +STA $3280,X +BRA .GiftBox + +CheckIfKeyItem: +PHX +LDX #$00 +.Check: +CMP BanListNoProgs,X +BEQ .IsKeyItem +INX +CPX #$2A +BEQ .NormalItem +BRA .Check +.IsKeyItem: +PHA +LDA #$02 +STA $3272 +PLA +.NormalItem: +PLX +RTL + +CheckGiftBox7: +LDA $3272 +BEQ .Storage +CMP #$02 +BEQ .KeyStorage +LDA $3201,X +BRA .GiftBox +.Storage: +LDA $B590,X +.GiftBox: +STA $06 +JML $C17AA2 +.KeyStorage: +LDA $3280,X +BRA .GiftBox + +CheckGiftBox8: +LDA $3272 +BEQ .Storage +CMP #$0002 +BEQ .KeyStorage +LDA $3201,X +BRA .GiftBox +.Storage: +LDA $B590,X +.GiftBox: +AND #$00FF +JML $C19121 +.KeyStorage: +LDA $3280,X +BRA .GiftBox + +CheckGiftBox9: +PHA +LDA $3272 +BEQ .Storage +CMP #$0002 +BEQ .KeyStorage +PLA +CLC +ADC #$3201 +BRA .GiftBox +.Storage: +PLA +CLC +ADC #$B590 +.GiftBox: +TAX +JML $C19156 +.KeyStorage: +PLA +CLC +ADC #$3280 +BRA .GiftBox + +SwapKeyStorage: +LDA $3272 +BNE .ClearStorage +LDA #$0002 +STA $3272 +.Cleared: +LDA #$0000 +JML $C17F0F +.ClearStorage +STZ $3272 +BRA .Cleared + +ClearKeyStorage: +STZ $3272 +LDA #$0000 +JML $C17F0F + +StoreKeyItem: +LDA $97D0 +SEP #$20 +LDX #$0000 +.CheckBans: +CMP BannedItemList,X +BEQ .IsKeyItem +INX +CPX #$002F +BEQ .Done +BRA .CheckBans +.IsKeyItem: +LDA #$02 +STA $3272 +BRA .Done +.Done: +REP #$20 +LDA #$0000 +JML $C17F0F + +KeyItemBlocker: +PHX +LDA $B570 +LDX #$00 +.Check: +CMP BannedItemList,X +BEQ .IsKeyItem +INX +CPX #$2F +BEQ .Done +BRA .Check +.Done: +PLX +LDA $B5D4 +RTL +.IsKeyItem: +PLX +LDA $32C4 +RTL + +SetShopFlag: +STZ $B573 +LDA $0734 ; If I change this to $0734 will it fix my flag bug? +LDX #$0000 +.CheckShopID: +CMP #$0007 +BCC .GotShopID +SEC +SBC #$0007 +INX +BRA .CheckShopID +.GotShopID: +PHX +LDX #$0000 +.CheckBit: +CMP #$0000 +BEQ .GotBit +DEC +INX +BRA .CheckBit +.GotBit: +SEP #$20 +LDA ShopFlagBits,X +PLX +ORA $B721,X +STA $B721,X +REP #$20 +LDA #$0000 +JML $C17F0F + +ClearAPNameFlag: +STZ $B573 +LDA #$0000 +JML $C17F0F + +APShopHandler: +LDA $1E +STA $0770 +TAX +LDA #$0000 +.CheckShop: +CPX #$0000 +BEQ .GotShopNum +CLC +ADC #$002A +DEX +BRA .CheckShop +.GotShopNum: +PHA +LDX $04 +LDA #$0000 +.CheckSlot: +CPX #$0000 +BEQ .AddSlotVal +DEX +CLC +ADC #$0006 +BRA .CheckSlot +.AddSlotVal: +STA $3274 +PLA +CLC +ADC $3274 +;At this point we should know what item we're looking at +TAX +LDA $F40000,X +AND #$00FF +TAY +STY $1A +BNE .ValidShopItem +JML $C19E93 +.ValidShopItem: +PHA +LDA $F40003,X +AND #$00FF +STA $3274 +CMP #$0004 +BEQ .GrabOffWorldItemName +CMP #$0005 +BEQ .GrabOffWorldItemName +CMP #$0006 +BEQ .GrabOffWorldItemName +LDA $F40004,X +STA $0734 +LDA $F40000,X +.APItemReturn: +AND #$00FF +STA $0732 +LDA $F40001,X +STA $0730 +PLA +JSL CheckItemBoughtFlag +CMP #$0000 +BEQ .ItemNotBought +JSR HandleBoughtItem +.ItemNotBought: +JML $C19E06 +.GrabOffWorldItemName: +PHB +PHX +PHY +LDA $F40004,X +STA $0734 +;AND #$00FF +TAX +LDA #$1190 +..CompareID: +CPX #$0000 +BEQ ..GotName +DEX +CLC +ADC #$0030 +BRA ..CompareID +..GotName: +TAX +LDA #$007F +LDY #$FF80 +MVN $F47E +PLY +PLX +PLB +LDA $F40003,X +AND #$00FF +CMP #$0005 +BEQ .Remote +LDA #$00AD +JMP .APItemReturn +.Remote: +LDA $F40000,X +AND #$00FF +JMP .APItemReturn + + +GetAPShopName: +PHA +LDA $3274 +LDX $04 +STA $0740,X +TXA +ASL +TAX +LDA $0734 +STA $0748,X +LDA $0730 +STA $0756,X +LDA $3274 +BEQ .NormalItemName +CMP #$0001 +BEQ .GetTeleportName +CMP #$0002 +BEQ .GetCharacterName +CMP #$0003 +BEQ .GetSoldOutName +CMP #$0004 +BEQ .GetArchipelagoName +CMP #$0005 +BEQ .GetArchipelagoName +CMP #$0006 +BEQ .GetPhotoName +CMP #$0007 +BEQ .GetMoneyName + +.NormalItemName: +PLA +ADC $06 +STA $06 +STA $0E +JML $C19E29 +.GetTeleportName: +PLA +LDA $0732 +ASL +TAX +LDA ShopItemNames_TeleportNames,X +STA $06 +STA $0E +LDA #$00F4 +STA $08 +JML $C19E29 +.GetCharacterName: +PLA +LDA $0732 +ASL +TAX +LDA ShopItemNames_CharNames,X +STA $06 +STA $0E +LDA #$00F4 +STA $08 +JML $C19E29 +.GetArchipelagoName: +PLA +LDA #$FF80 +STA $06 +STA $0E +LDA #$007E +STA $08 +JML $C19E29 +.GetSoldOutName: +PLA +LDA #ShopItemNames_SoldOut +STA $06 +STA $0E +LDA #$00F4 +STA $08 +JML $C19E29 +.GetPhotoName: +PLA +LDA #PhotoShopText +STA $06 +STA $0E +LDA #$00F3 +STA $08 +JML $C19E29 +.GetMoneyName: +PLA +LDA $0732 +ASL +TAX +LDA ShopItemNamesDeluxe_MoneyNames,X +STA $06 +STA $0E +LDA #$00F4 +STA $08 +JML $C19E29 + + +CheckItemBoughtFlag: +PHX +LDA $04 +SEP #$20 +TAX +LDA ShopFlagBits,X +REP #$20 +PHA +LDA $1E +TAX +PLA +AND $B720,X +PLX +RTL + +HandleBoughtItem: +LDA $3274 +BEQ .LocalItemChecker +CMP #$0005 +BEQ .LocalItemChecker +;This is a teleport/char/nonlocal item. Can never buy this again. +.BannedItem: +REP #$20 +LDA #$0003 +STA $3274 +RTS +.LocalItemChecker: +LDA $0732 +LDX #$0000 +SEP #$20 +.CheckItem: +CMP BannedItemList,X +BEQ .BannedItem +INX +CPX #$002F +BEQ .NotBanned +BRA .CheckItem +.NotBanned: +REP #$20 +STZ $3274 +RTS + +GetAPShopPrice: +LDA $3274 +CMP #$0003 +BEQ .SoldOut +CMP #$0000 +BEQ .NormalItem +CMP #$0005 +BEQ .NormalItem +.DisplaySpecialPrice: +LDA $0730 +STA $06 +STA $0E +.DisplayPrice: +JSL $C4507A +.SoldOut: +JML $C19E93 + +.NormalItem: +LDA $0732 +JSR CheckBanlist +BEQ .DisplaySpecialPrice +BRA .DisplayPrice + +CheckBanlist: +SEP #$20 +LDX #$0000 +.Check: +CMP BannedItemList,X +BEQ .Ban +CPX #$002F +BEQ .Done +INX +BRA .Check +.Done: +REP #$20 +LDA #$0001 +RTS +.Ban: +REP #$20 +LDA #$0000 +RTS + +DisplayAPPlayer: +LDA $0724 +BEQ .DontCloseNameWin +LDA $06 +STA $0720 +LDA $08 +STA $0722 +LDA #$000B +STA $8958 +PHX +PHY +JSL $C1DD59 ;Switch to textbox first... +PLY +PLX +STZ $0724 +LDA #$000C +STA $8958 +LDA $0720 +STA $06 +LDA $0722 +STA $08 +.DontCloseNameWin: +LDA $0000,Y +STA $06 +LDA $8958 +CMP #$000C +BNE .End +BRA .DontEnd +.End: +JMP .End2 +.DontEnd: +PHX +LDA $20 +AND #$00FF +TAX +.GotSlot: +LDA $0740,X +AND #$00FF +STA $3274 +PHX + TXA + ASL + TAX + LDA $0756,X + STA $0730 + LDA $0748,X + STA $0734 +PLX +LDA $3274 +AND #$00FF +CMP #$0003 +BEQ .SoldOutVar +STZ $0736 +CMP #$0004 +BCC .DontDisplayPlayerName +CMP #$0006 +BCS .DontDisplayPlayerName +LDA #$0001 +STA $B573 +STA $0724 +LDA $06 +STA $0720 +LDA $08 +STA $0722 +LDA #ShopItemNames_PlayerText +STA $0E +LDA #$00F4 +STA $10 +PHY +JSR MoveShopPlayerName +JSL $C3E4D4 ; Instant print on +JSL $C186B1 ;Overworld text +JSL $C3E4CA +PLY +STZ $B573 +LDA $0720 +STA $06 +LDA $0722 +STA $08 +;LDA #$000B +;JSL $C1DD47 +.DontDisplayPlayerName: +PLX +JML $C11ACB +.SoldOutVar: +LDA #$0001 +STA $0736 +JMP .DontDisplayPlayerName +.End2: +JML $C11ACB + +MoveShopPlayerName: +PHB +PHX +PHY +PHA +TXA +ASL +TAX +LDA $0748,X +TAX +PHX +LDA #$66D0 +.CheckNameSlot: +CPX #$0000 +BEQ .MoveName +DEX +CLC +ADC #$0011 +BRA .CheckNameSlot + +.MoveName: +TAX +LDA #$0010 +LDY #$FF50 +MVN $F47E +PLX +LDA #$1100 +.CheckSlotName: +CPX #$0000 +BEQ .MoveItem +DEX +CLC +ADC #$007F +BRA .CheckSlotName +.MoveItem: +TAX +LDA #$002F +LDY #$FF80 +MVN $F57E +PLA +PLY +PLX +PLB +RTS + +TransferOutOfMenu: +STZ $B573 +JSL $C3E4CA +;Todo; we need to transfer the item Type and item Price out of here. Also the item Flag. Store these in globals. +LDA $3274 +STA $97CC +STZ $0724 +lda $0730 +STA $97D0 +STZ $97D2 +LDA $0734 +STA $97D4 +LDA #$000B +STA $8958 +PHX +PHY +JSL $C1DD59 +PLY +PLX +LDA #$0001 +STA $8958 +LDX $1A +JML $C19EE3 + +CheckIfBuyable: +LDA $1A +BEQ .done +LDA $0736 +BEQ .done +LDA $1A +JSL $EF016F +LDA #$00FF +TSB $5E79 +LDA #$0005 +JSL $C0ABE0 +JML $C19EC7 +.done: +STZ $0736 +JSL $C1DD59 +LDA #$9C8A +JML $C19ED9 + +OverrideShopWindowFX: +PHA +LDA $3274 +BEQ .NormalItem +CMP #$0005 +BEQ .NormalItem +PLA +LDA #$0001 +JML $C19B6A +.NormalItem: +PLA +JSL $C3EE14 +JML $C19B6A + +PreserveWindowPalette: +PHA +TDC +PHA +LDA #$1DDE +TCD +LDA $1A +BEQ .CancelMenu +PLA +TCD +LDA $0736 +BNE .SoldOut +.Done: +PLA +JSL $C08ED2 +JML $C19DA4 +.SoldOut: +PLA +JML $C19DA4 +.CancelMenu: +PLA +TCD +BRA .Done + +GetRandomizedTrack: +%FUNCTION_PROLOGUE(18) +TAX +LDA MusicTrackList,X +AND #$00FF +JML $C4FBC7 + +SetMagicantAnimSpeeds: +LDA $99DC +CMP #$0003 +BEQ .Paralysis +LDA $0066 +AND #$0040 +BEQ .Walking +LDA #$0005 +BRA .SetSpeed +.Walking: +LDA #$0008 +.SetSpeed: +STA $0F42 +RTL +.Paralysis: +LDA #$0038 +BRA .SetSpeed + +LoadExpandedWindowTable: +TYA +CMP #$0035 +BCS .ExpandedWindow +LDA #$E250 +STA $06 +.Done: +JML $C105CE +.ExpandedWindow: +SEC +SBC #$0035 +TAY +LDA #ExtraWindowData +STA $06 +LDA #$00D7 +STA $08 +JML $C105D3 + +CheckMoreMoreCommands: +CMP #$0022 +BEQ CheckIfCanWarp +CMP #$0023 +BEQ IncTotalPhotos +CMP #$0024 +BEQ SendRequestForEnergy +CMP #$0025 +BEQ AuthenticateEnergy +CMP #$0026 +BEQ GotServerEnergyNum +CMP #$0027 +BEQ CheckifELOn +JML CheckMoreMoreMoreCommands + +CheckIfCanWarp: +PHX +LDX $987B +LDA $9877 +JSL $C00AA1 +PLX +AND #$0080 +BEQ .CantWarp +LDA #$0001 +.CantWarp: +STA $97CC +LDA #$0000 +JML $C17F0F + +IncTotalPhotos: +INC $00D7 +LDA #$0000 +JML $C17F0F + +SendRequestForEnergy: +STZ $0792 +STZ $0794 +STZ $079A +LDA #$0001 +STA $0790 +LDA #$0000 +JML $C17F0F + +AuthenticateEnergy: +JMP AuthenticateEnergyLong + +GotServerEnergyNum: +JMP GotServerEnergyLong + +CheckifELOn: +JMP CheckifELLong + +CheckNessRobot: +SEP #$20 +LDA $B622 +BIT #$40 +REP #$20 +BEQ skip_ness +JML $C0A98B +skip_ness: +LDY #$9F17 +STY $94 +RTL + +DeleteExtraKeyItem: +PHX +PHY +STZ $B58B +LDY #$0001 +.CheckNextCharacter: +LDX #$0000 +JSR .GetCharacterInventory +PHY +LDA $06 +LDY #$0000 +.CheckNextSlot: +SEP #$20 +CMP $9992,X +REP #$20 +BEQ .LogKeyItem +.IgnoreOriginalItem: +INX +INY +CPY #$000E +BNE .CheckNextSlot +LDA $B58E +CMP $98A4 +BEQ .Done +PLY +INY +BRA .CheckNextCharacter + +.LogKeyItem: +PHA +LDA $B58B +BNE .TossDuplicateItem +PLA +INC $B58B +JMP .IgnoreOriginalItem +.Done: +LDA $06 +LDX #$0000 +.CheckStorage: +SEP #$20 +CMP $3280,X +REP #$20 +BEQ .TossDuplicateItemNoPull +INX +CPX #$0045 +BNE .CheckStorage + +.REALLYdone: +PLY +JMP CheckNormalStorage +.ReallyReallyDoneTheItems: +JML EndKeyCheck +.TossDuplicateItem: +PLA +PLY +JML RemoveItem + +.TossDuplicateItemNoPull: +PLY +JML RemoveItem + +.GetCharacterInventory: +PHY +LDA $986E,Y ; get the character +AND #$00FF +TAY +TXA +..Check: +CPY #$0000 +BEQ ..Done +CLC +ADC #$005F +DEY +BRA ..Check +..Done: +PLY +TAX +STY $B58E +RTS + +ReadDynamicPhotoMapPositionY: +PHX +LDA $00D4 +AND #$00FF +ASL +ASL +TAX +LDA $00DF,X +PLX +JML $C4F2ED + +ReadDynamicPhotoMapPositionX: +PHX +LDA $00D4 +AND #$00FF +ASL +ASL +TAX +LDA $00DD,X +PLX +JML $C4F2F6 + +ReadDynamicPhotoCharPosY: +PHX +LDA $00D4 +AND #$00FF +ASL +ASL +TAX +PHY +LDY #$6A2C +LDA #$0040 +PHX +JSL goto_bank_c2 +PLX +PLY +STA $00D5 +LDA $00DF,X +SEC +SBC #$0020 +CLC +ADC $00D5 +PLX +JML $C4F405 + +ReadDynamicPhotoCharPosX: +PHX +LDA $00D4 +AND #$00FF +ASL +ASL +TAX +PHY +LDY #$6A2C +LDA #$0040 +PHX +JSL goto_bank_c2 +PLX +PLY +STA $00D5 +LDA $00DD,X +SEC +SBC #$0020 +CLC +ADC $00D5 +PLX +JML $C4F3EC + +SpawnDynamicPhotomanX: +PHX +PHY +LDA $00D7 +ASL +ASL +TAX +LDA $9877 +STA $00DD,X +LDA $00D9 +LDY #$6A2C +LDA #$0010 +JSL goto_bank_c2 +CLC +ADC $9877 +PLY +PLX +STA $00DB +JML SavePhotoColor + +SpawnDynamicPhotomanY: +PHX +LDA $00D7 +ASL +ASL +TAX +LDA $987B +STA $00DF,X +PHA +LDA $B623 +AND #$00FF +AND #$0008 +BEQ .NormalOffset +PLA +CLC +ADC #$0200 +BRA .Offscreen +.NormalOffset: +PLA +CLC +ADC #$0050 +.Offscreen: +PLX +JML $C46D98 + +IncrementCurPhotoCount: +LDX #$0001 +STX $1C +INC $00D4 +JML $C4F42E + +CheckTotalEnergy: +LDA $08 +STA $0C +LDA $B623 +AND #$00FF +AND #$0010 +BEQ .CheckBank +LDA $0792 +STA $06 +LDA $0794 +STA $08 +JML $C15F48 +.CheckBank: +JML $C15F3E + +DisplayEnergy: +TAY +LDA $0000,Y +PHA +LDA $B623 +AND #$00FF +AND #$0010 +BEQ .DontDisp +PLA +LDA $0792 +STA $06 +LDA $0794 +STA $08 +JML $C192E9 +.DontDisp: +PLA +JML $C192E2 + +AuthenticateEnergyLong: +PHX +LDA $97D0 +STA $0796 +LDA $97D2 +STA $0798 +LDX #$00B4 +.CountFrames: +LDA $079A +AND #$00FF +BNE .WithdrawSuccess +PHX +JSL $C08756 +PLX +DEX +CPX #$0000 +BNE .CountFrames +PLX +LDA #$0000 +STA $97D0 +STA $0796 +STA $0797 +STA $97D2 +.Done: +LDA #$0000 +JML $C17F0F +.WithdrawSuccess: +PLX +STA $97CC +LDA #$0000 +BRA .Done + +GotServerEnergyLong: +LDA $0790 +STA $97CC +LDA #$0000 +JML $C17F0F + +CheckEndPhotos: +PHX +LDA HasStartingPhoto +AND #$00FF +BEQ .NoStartPhoto +LDA $00D7 +AND #$00FF +ASL +ASL +TAX +LDA $C1FE9E +STA $00DD,X +LDA $C1FE9B +STA $00DF,X +LDA $00D7 +ASL +TAX +LDA PhotoFlags,X +LDX #$0001 +JSL $C2165E +LDA $C0B672 +AND #$00FF +STA $98CB +INC $00D7 +.NoStartPhoto: +LDA HasPooStartPhoto +AND #$00FF +BEQ .NoPooPhoto +LDA $00D7 +AND #$00FF +ASL +ASL +TAX +LDA $C1FE9E +STA $00DD,X +LDA $C1FE9B +STA $00DF,X +LDA $00D7 +ASL +TAX +LDA PhotoFlags,X +LDX #$0001 +JSL $C2165E +LDA $00D7 +CMP #$0001 +BEQ .SpawnPoo2 +LDA #$0004 +STA $98CB +.SpawnPoo2: +LDA #$0004 +STA $98D4 +INC $00D7 + +.NoPooPhoto: +PLX +JML $C1FEB6 + +CheckifELLong: +LDA $C4FD78 +AND #$00FF +STA $97CC +LDA #$0000 +JML $C17F0F + +SetFlagOnEquipConfirmSolo: +db $1C, $20, $01 +db $0A +dl $C5E1E0 + +SetFlagOnEquipConfirm: +db $1C, $20, $01 +db $0A +dl $C50990 + +ForcePurchaseCheck: +db $1D, $19, $01 +db $0A +dd CancelBuyRemoveName + +ForceSetSoloCheck: +db $1C, $20, $01 +db $0A +dl $C5E1E0 + +LoadEnemyToVram: +LDA $0780 +BEQ .LoadNormal +LDA $9D11 +AND #$00FF +BRA .LoadCustom +.LoadNormal: +LDA [$0A] +.LoadCustom: +LDY #$005E +PHX +LDX $AAB4 +SEP #$20 +STA $0782,X +REP #$20 +PLX +JML $C2EF42 + +AllowDynamicCallEnemyLoad: +CMP #$00FF +BEQ .cantcall +JML $C2BDA3 +.cantcall: +LDA $26 +PHX +LDX #$0000 +SEP #$20 +.Check: +CMP $0782,X +BEQ .Loaded +CPX #$0003 +BEQ .DontOverride +INX +BRA .Check +.DontOverride: +REP #$20 +PLX +JML $C2BDC6 +.Loaded: +REP #$20 +PLX +JML $C2BDEC + +AllowEnemyToSpawn: +LDA $0780 +BEQ .DontOverride +LDA $9D11 +AND #$00FF +BRA .Done +.DontOverride: +LDA [$0A] +.Done: +STA $AABE,X +JML $C2EFA7 + +ForceLoadSingle: +LDA [$1A],y +AND #$00FF +PHA +LDA $0780 +BNE .ForceMode +.Load: +PLA +JML $C2EFCB + +.ForceMode: +LDA $B5ED +BNE .Done +INC $B5ED +BRA .Load +.Done: +PLA +JML $C2EFD4 + +InitializeLoadingEnemies: +STZ $0780 +STZ $0782 +STZ $0784 +STZ $AAB4 +STZ $AAB2 +JML $C2EEF5 + +SetupVramForSpriteLoad: +PHA +LDA $0780 +BEQ .NormalLoad +LDA $AAB4 +CMP #$04 +BCS .NormalLoad +PLA +JSL $C085B7 +SEP #$20 +LDA #$0F +STA $00000D +RTL +.NormalLoad: +PLA +JML $C08616 + +CloseVersionWindow: +LDA #$0024 +JSL $C3E521 +JML $C3E4D4 + +FixGiygasReflectBroken: +PHA +LDA $AA96 +BEQ .NotReflection +LDA #$A26A +STA $A972 +.NotReflection: +JML $C23D05 + +CheckNormalStorage: +PHY +LDA $06 +LDX #$0000 +.CheckStorage: +SEP #$20 +CMP $B590,X +REP #$20 +BEQ .TossDuplicateItemNoPull +INX +CPX #$0045 +BNE .CheckStorage +PLY +LDA #$0000 +JML DeleteExtraKeyItem_ReallyReallyDoneTheItems +.TossDuplicateItemNoPull: +PLY +JML RemoveItem + +GetStartingData: +PHB +LDA StartingInvetory +TAY +LDX #$5000 +LDA StartingInvAmounts +MVN $F77E +PLB +LDA #$0000 +LDX #$0000 +CheckTeleport: +LDA StartingTeleports,X +AND #$00FF +BEQ EndStartTeleports +CMP #$0010 +BNE NormalTeleport +JMP GetStarstorm +NormalTeleport: +PHX +ASL +TAX +LDA TeleportFlags,X +JSL $C2165E +PLX +INX +BRA CheckTeleport +EndStartTeleports: +STZ $FF41 +LDA #$0000 +LDX #$0000 +CheckChars: +LDA StartingChars,X +AND #$00FF +BEQ EndStartData +PHX +PHA +CMP #$0001 +BNE .NotNess +LDA #$0006 +.NotNess: +DEC +DEC +ASL +TAX +LDA CharFlags,X +LDX #$0001 +JSL $C2165E +PLA +JSL $C228F8 +PLX +INX +BRA CheckChars +EndStartData: +JML CheckEndPhotos +GetStarstorm: +PHX +LDA $FF41 +AND #$00FF +CMP #$0002 +BNE .StarstormYeah +DEC $FF41 +.StarstormYeah: +TAX +LDA StarstormBits,X +AND #$00FF +TSB $9839 +PLX +INX +INC $FF41 +JMP CheckTeleport + +KeyItemBlockerAndCheckProg: +LDA $B570 +CMP #$E3 +BCC .NormalItem +CMP #$E8 +BCS .NormalItem +LDA $B5D4 +RTL +.NormalItem: +JML KeyItemBlocker + +CheckMoreMoreMoreCommands: +CMP #$0028 +BEQ StorePartyDirections +CMP #$0029 +BEQ LoadPartyDirections +JML $C17DDC + +StorePartyDirections: +PHB +PHX +PHY +LDX #$2B26 +LDY #$B43E +LDA #$000A +MVN $7E7E +PLY +PLX +PLB +LDA #$0000 +JML $C17F0F + +LoadPartyDirections: +PHY +PHX +.Ness: +JMP LoadPartyMemberDirectionsFixed + LDX $B43E + JSL $C46363 +.Paula: + LDA #$0002 + LDX $B440 + JSL $C46363 +.Jeff: + LDA #$0003 + LDX $B442 + JSL $C46363 +.Poo: + LDA #$0004 + LDX $B444 + JSL $C46363 +.Temp1: +LDA $B446 +STA $2B2E +LDA $B448 +STA $2B30 + LDA $98A4 + ASL + TAX + LDA $9897,X + BEQ .Temp2 + ASL + TAX + LDA $2AF6,x + STZ $2AF6,X + TAX + PHX + LDA $98A4 + TAX + LDA $988B,X + AND #$00FF + PLX + JSL $C46363 ; not working +.Temp2: + LDA $98A4 + INC + ASL + TAX + LDA $9897,X + BEQ .Done + ASL + TAX + LDA $2AF6,x + STZ $2AF6,X + TAX + PHX + LDA $98A4 + INC + TAX + LDA $988B,X + AND #$00FF + PLX + JSL $C46363 ;not working +.Done: +PLY +PLX +LDA #$0000 +JML $C17F0F + +GiveTeddyOnLoad: +PHX +PHY +LDA #$0000 +LDX #$0000 +LDY #$0000 +SEP #$20 +LDA $98A3 +BNE .End +LDA $C0B672 +TAX +REP #$20 +LDA #$99F1 +.CheckChar: +CPX #$0001 +BEQ .GotChar +CLC +ADC #$005F +DEX +BRA .CheckChar +.GotChar: +TAX +SEP #$20 +.CheckSlot: +LDA $0000,X +BEQ .End +CMP #$02 +BEQ .GiveTeddy +CMP #$03 +BEQ .GiveSuper +.KeepGoing: +CPY #$000D +BEQ .End +INY +INX +BRA .CheckSlot +.End: +REP #$20 +PLY +PLX +JML $C1FEBA +.GiveTeddy: +INC $B44A +PHA +PHX +PHY +REP #$20 +LDA #$0010 +JSL $C228F8 +SEP #$20 +PLY +PLX +PLA +BRA .KeepGoing +.GiveSuper: +REP #$20 +LDA $B44A +BNE .ReplaceBear +.AddSuper: +LDA #$0011 +JSL $C228F8 +BRA .End +.ReplaceBear: +LDA #$0010 +INC $98A3 +JSL $C229BB +DEC $98A3 +BRA .AddSuper + +FixGiygasReflect: +PHA +LDA $AA96 +BEQ .NotReflection +LDA #$A26A +STA $A972 +.NotReflection: +PLA +JML $C23D05 + +HandleUnusableWarpPad: +PHX +LDA $1D +TAX +LDA $1F +AND #$00FF +JSL $C3E977 +PLX +CMP #$00B5 +BNE .NormalItem +LDA #$0000 +BRA .UseItem +.NormalItem: +LDA $06 +.UseItem: +DEC +LDY #$005F +JML $C13666 + +LoadCurrentPhotoColor: +PHX +LDX #$0000 +.Check: +CMP PhotocolorTable,X +BEQ .GotPhotoColor +CPX #$0156 +BEQ .NotInTable +INX +INX +BRA .Check +.GotPhotoColor: +PHA +LDA GoodPhotoColors,X +.ForceLoad0: +AND #$00FF +SEP #$20 +STA $B44C +REP #$20 +PLA +PLX +JML $C06987 +.NotInTable: +PHA +LDA #$0010 +BRA .ForceLoad0 + +SavePhotoColor: +PHA +PHX +LDA $00D7 +TAX +SEP #$20 +LDA $B44C +STA $0160,X +REP #$20 +PLX +PLA +JML $C46D85 + +LoadPhotoColor: +PHX +LDA $00D4 +AND #$00FF +TAX +LDA $0160,X +AND #$00FF +TAX +LDA #$0000 +.Check: +CPX #$0000 +BEQ .Done +CLC +ADC #$00C0 +DEX +BRA .Check +.Done: +PLX +JML $C0089E + +RenderCrashScreen: +STZ $002B +.CheckForFrame: + LDA $002B + BEQ .CheckForFrame + STZ $002B + STZ $4100 + JSL $C08726 + REP #$31 + LDA #$1EE0 + TCD + LDA #$00F8 + STA $10 + LDA #$9000 + STA $0E + LDA #$0000 + LDX #$01B0 + LDY #$6100 + JSL $C08616 + LDA #$0000 + LDX #$7C00 + LDY #$6000 + JSL $C08E1C + LDA #$06FF + LDX #$9700 + LDY #$7DFE + MVN $F87E + + + LDA #$0460 + LDX #$9200 + LDY #$7F16 + MVN $F87E +JSL $C2038B +LDA #$0004 +STA $001A + LDA #$000F + LDX #$0002 + JSL $C0886C +.Loop: +JSL $C08756 +LDA $006A +AND #$0010 +BNE .Reset +BRA .Loop +.Reset: +JML ReallyReset + +LeaveMoneyInMemory: +LDA $B5EF +BNE .KeepInMem +JML $C22214 +.KeepInMem: +STZ $B5EF +LDA $06 +STA $97D0 +JML $C22214 + + +CheckExtraAddCommands: +CMP #$0001 +BNE .NotOne +JML $C18012 +.NotOne: +CMP #$0025 +BEQ .SaveMoney +JML $C17F29 +.SaveMoney: +INC $B5EF +JML $C1803C + + +GetRemoteMoney: +LDA $B5F1 +BEQ .Done +PHA +LDA #$0074 +JSL $C0ABE0 +PLA +ASL +TAX +LDA MoneyAmounts,X +STA $0E +LDA #$0000 +STA $10 +JSL $C22214 +STZ $B5F1 +.Done: +LDA $006D +AND #$A000 +JML $C0B8F4 + +ClearStatusVars: +LDA #$766E +STA $0E +STZ $B587 +STZ $B588 +JML $C2A044 + +LoadPartyMemberDirectionsFixed: + phy + phx + LDA #$000B + LDY #$2B26 + LDX #$B43E + MVN $7E7E + ldy #$0000 + bra .loopcond +.loop: + phy + ; Update entity sprite frame (the thing that the "set direction" function at C46363 does after storing to the table of directions) + jsl $C0A780 + ply + iny + iny +.loopcond: + ; Have we gotten through all 6 possible party members? + cpy #$000C + bcs .loopend + ; If not, have we gotten through all valid party members? (according to the entity index list) + lda $9897,y + and #$00FF + bne .loop +.loopend: + ply + plx + lda #$0000 + jml $C17F0F + + + +;new code go here + + +;;;;;;;;;;;;;;;;;;;;;;;;;; +;ANYTHING BETWEEN THIS BREAK AND THE NEXT NEEDS TO GET COMMENTED OUT! +ORG $C19DE5 +;JML APShopHandler;This JML is only in AP patch + +ORG $C19E23 +;JML GetAPShopName + +ORG $C19E8F +;JML GetAPShopPrice + +ORG $C11AC6 +;JML DisplayAPPlayer + +ORG $C19EDD +;JML TransferOutOfMenu + +org $C19ED3 +;JML CheckIfBuyable +;NOP +;NOP + +ORG $C19B66 +;JML OverrideShopWindowFX + +ORG $C5E0A9 +;db $08 +;dd CheckShopsanityPrice + +ORG $C19DA0 +;JML PreserveWindowPalette + +ORG $C5E0B6 +;db $08 +;dd BoughtShopsanityItemScript + +ORG $C5E0CE +;db $0A +;dl ShopsanityPurchaseHandler + +ORG $C5E0C8 +;dl ShopsanityPurchaseHandler + +ORG $C5DF1E +;db $0A +;dl OverrideSpaceCheckOnSpecialItem + +ORG $C5E029 +;db $0A +;dl OverrideSpaceCheckOnSpecialItem_nosell + +ORG $C5E1AE +;dd ForcePurchaseCheck + +;ALWAYS HAVE THESE +ORG $C50A6A +db $0A +dl BackupShopEquipText + +ORG $C50B4C +db $0A +dl BackupShopSellText + +ORG $C50C2E +db $0A +dl BackupShopCantEquip +; + +ORG $C5E04C +;db $0A +;dl OverrideSpaceCheckOnSpecialItem_oneslot + +ORG $C5E1A5 +;dd SetFlagOnEquipConfirmSolo + +ORG $C5E119 +;dd SetFlagOnEquipConfirm + +ORG $C5E0F2 +;dd ForceSetSoloCheck + + + + +ORG $F403F0 +;Item ID, 2-byte price, Item Type, 2-bytelocation ID/flag number +;db $05, $00, $00, $02, $00, $00; Non-remote local item. Franklin Badge. +;db $5A, $00, $00, $01, $01, $00; Non-remote local Teleport. +;db $96, $00, $00, $05, $02, $00; A remote regular item +;db $01, $ff, $ff, $02, $03, $00; Non-remote local Character +;db $ad, $ff, $ff, $04, $04, $00; Item that the player already bought and got the flag for +;db $ad, $ff, $ff, $04, $05, $00; Item for another player +;db $01, $ff, $ff, $05, $06, $00; A remote Key Item + +ORG $F400D2 +;db $11 +;Type 0- Normal local item +;Type 1- Teleport/PSI +;type 2- Character +;type 3- item that's already been bought- SOLD OUT +;type 4; Item for another player +;type 5- Remote local item +;type 6- Photograph + +;ORG $F41280 +;db $73, $9F, $9F, $9C, $50, $79, $A4, $95, $9D, $00 + +;ORG $F411F0 +;db $82, $a5, $a3, $a4, $50, $80, $a2, $9f, $9d, $9f, $a4, $95, $a2, $00 + +;ORG $F412B0 +;db $76, $A2, $91, $9E, $9B, $9C, $99, $9E, $50, $72, $91, $94, $97, $95, $00 + +;ORG $F45022 +;db $80, $9C, $91, $A9, $95, $A2, $50, $61, $00 + +;ORG $F45055 +;db $80, $9C, $91, $A9, $95, $A2, $50, $62, $00 +;Player names should be 16 bytes, followed by a zero +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $F49000 +CheckShopsanityPrice: +db $01, $01 +db $1B, $06 +db $1B, $02 +dd .NormalItem +.SpecialPrice: +db $0B, $05 +db $1B, $03 +dd .RemoteItem +.CheckRemotePrice: +db $08 +dd $C5E254 +db $1B, $03 +dd .CantAffordSpecial +db $1B, $01 +db $1B, $04 +db $1B, $00 +db $1d, $19, $01 +db $02 + +.NormalItem: +;Write a code here that checks if the item is in the banlist +db $1B, $01 +db $1B, $04 +db $1C, $19, $01 +db $1B, $03 +dd .RegularPrice +db $1B, $06 +db $0A +dl .SpecialPrice +.RegularPrice: +db $1B, $01 +db $0A +dl $C5E24B +.CantAffordSpecial: +db $02 +.RemoteItem: +db $1B, $01 +db $1B, $04 +db $1C, $19, $01 +db $1B, $02 +dd .SpecialPriceRemote +db $0A +dl .RegularPrice +.SpecialPriceRemote: +db $1B, $06 +db $0A +dl .CheckRemotePrice + + +BoughtShopsanityItemScript: +db $1B, $00 +db $1B, $06 +db $1B, $02 +dd .NormalItem +db $0b, $06 +db $1B, $03 +dd .Photo +db $70 +db $0A +dl .CheckSaturnText +.NonSaturnTetx: +db $83, $9f, $5c, $10, $02, $50, $a9, $9f, $a5, $50, $a7, $91, $9e, $a4, $50 +.BackSaturnText: +db $1B, $06 +db $0B, $07 +db $1B, $03 +dd .Money + +db $1B, $06 +db $09, $05 +dd .Teleport +dd .Character +dd .Error +dd .OffWorld +dd .RemoteLocal +db $02 +.NormalItem: +db $1B, $01 +db $0A +dl $C50660 + +.Teleport: + db $1B, $01 + db $1B, $04 + db $0B, $10 + db $1B, $03 + dd ..PooPsi + db $1B, $01 + db $06 + db $F8, $00 + dd .TeleportActiveSaturn + db $06 + db $F9, $00 + dd .TeleportActiveSaturn + db $06 + db $FA, $00 + dd .TeleportActiveSaturn + db $a4, $98, $95, $50, $91, $92, $99, $9c, $99, $a4, $a9, $50, $a4, $9f, $50, $a4 + db $95, $9c, $95, $a0, $9f, $a2, $a4, $50, $a4, $9f, $50 + ..ContinueTeleport: + db $08 + dd ..TeleportShopNameTable + db $6F + db $02 + + ..PooPsi: + db $06 + db $F8, $00 + dd .PooPsiSaturn + db $06 + db $F9, $00 + dd .PooPsiSaturn + db $06 + db $FA, $00 + dd .PooPsiSaturn + db $a4, $9f, $50, $9c, $95, $91, $a2, $9e, $50, $91, $50, $9e, $95, $a7, $50, $80 + db $83, $79, $50, $91, $92, $99, $9c, $99, $a4, $a9, $6f, $02 + + ..TeleportShopNameTable: + db $1B, $04 + db $09, $0F + dd .ShopOnett + dd .ShopTwoson + dd .ShopHHV + dd .ShopThreed + dd .ShopSaturn + dd .ShopDes + dd .ShopFours + dd .ShopWinter + dd .ShopSummer + dd .ShopScar + dd .ShopDalam + dd .ShopDark + dd .ShopTen + dd .ShopUnder + dd .ShopMagic + db $02 + +.Character: + db $1B, $01 + db $1B, $04 + db $06 + db $F8, $00 + dd .CharacterSaturn + db $06 + db $F9, $00 + dd .CharacterSaturn + db $06 + db $FA, $00 + dd .CharacterSaturn + db $a4, $9f, $50, $98, $99, $a2, $95, $50, $9d, $a9, $50, $91, $a0, $a0, $a2, $95 + db $9e, $a4, $99, $93, $95, $5c, $50 + ..ContinueCharacter + db $08 + dd ..CharShopNameTable + db $6F + db $02 + + ..CharShopNameTable: + db $09, $05 + dd .Paula + dd .Jeff + dd .Poo + dd .FlnMn + dd .Ness + db $02 + +.Error: +db $07, $a5, $98, $50, $9f, $98, $51, $50, $79, $96, $50, $a9, $9f, $a5, $57, $a2 +db $95, $50, $a3, $95, $95, $99, $9e, $97, $50, $a4, $98, $99, $a3, $50, $a4, $95 +db $a8, $a4, $5c, $03, $00, $70, $50, $99, $a4, $50, $9d, $95, $91, $9e, $a3, $50 +db $a3, $9f, $9d, $95, $92, $9f, $94, $a9, $50, $a3, $93, $a2, $95, $a7, $95, $94 +db $50, $a5, $a0, $50, $a4, $98, $99, $a3, $50, $a3, $93, $a2, $99, $a0, $a4, $51 +db $50, $80, $9c, $95, $91, $a3, $95, $50, $a2, $95, $a0, $9f, $a2, $a4, $50, $a4 +db $98, $99, $a3, $50, $91, $a3, $50, $91, $50, $92, $a5, $97, $51, $51, $02 + +.OffWorld: +db $1B, $01 + db $06 + db $F8, $00 + dd .OffworldSaturn + db $06 + db $F9, $00 + dd .OffworldSaturn + db $06 + db $FA, $00 + dd .OffworldSaturn +db $A4, $98, $95, $50 +db $1C, $05, $00, $50 +db $96, $9F, $A2, $50 +db $1C, $02, $00 +db $6F, $02 + +.RemoteLocal: +db $1B, $01 + db $06 + db $F8, $00 + dd .RemoteSaturn + db $06 + db $F9, $00 + dd .RemoteSaturn + db $06 + db $FA, $00 + dd .RemoteSaturn +db $A4, $98, $95, $50 +db $1C, $05, $AD, $50 +db $96, $9F, $A2, $50 +db $1C, $02, $00 +db $6F, $02 + +.Photo: +db $02 + +.Money: +db $1B, $01 +db $1B, $04 +db $09, $03 +dd ..10 +dd ..100 +dd ..1000 +db $02 + +..10: +db $54, $61, $60, $6F, $02 +..100: +db $54, $61, $60, $60, $6F, $02 +..1000: +db $54, $61, $60, $60, $60, $6F, $02 + + +.TeleportActiveSaturn: +db $97, $9F, $50, $A4, $9F, $50 +db $0A +dl .Teleport_ContinueTeleport + +.PooPsiSaturn: +db $9E, $95, $A7, $50, $80, $83, $79, $6F, $02 + +.CharacterSaturn: +db $92, $A5, $A9, $50 +db $0A +dl .Character_ContinueCharacter + +.OffworldSaturn: +db $1C, $05, $00, $50 +db $96, $9F, $A2, $50 +db $1C, $02, $00 +db $6F, $02 + +.RemoteSaturn: +db $1C, $05, $AD, $50 +db $96, $9F, $A2, $50 +db $1C, $02, $00 +db $6F, $02 + +.ShopOnett: +db $7F, $9E, $95, $A4, $A4, $02 +.ShopTwoson: +db $84, $A7, $9F, $A3, $9F, $9E, $02 +.ShopHHV: +db $78, $91, $a0, $a0, $a9, $5d, $78, $91, $a0, $a0, $a9, $50, $86, $99, $9c, $9c +db $91, $97, $95, $02 +.ShopThreed: +db $84, $98, $A2, $95, $95, $94, $02 +.ShopSaturn: +db $83, $91, $A4, $A5, $A2, $9E, $50, $86, $91, $9C, $9C, $95, $A9, $02 +db $91, $97, $95, $02 +.ShopDes: +db $a4, $98, $95, $50, $74, $a5, $a3, $a4, $a9, $50, $74, $a5, $9e, $95, $a3, $50 +db $74, $95, $a3, $95, $a2, $a4, $02 +.ShopFours: +db $76, $9F, $A5, $A2, $A3, $99, $94, $95, $02 +.ShopWinter: +db $87, $99, $9E, $A4, $95, $A2, $A3, $02 +.ShopSummer: +db $83, $A5, $9D, $9D, $95, $A2, $A3, $02 +.ShopScar: +db $83, $93, $91, $A2, $91, $92, $91, $02 +.ShopDalam: +db $74, $91, $9C, $91, $91, $9D, $02 +.ShopDark: +db $a4, $98, $95, $50, $74, $95, $95, $a0, $50, $74, $91, $a2, $9b, $9e, $95, $a3 +db $a3, $02 +.ShopTen: +db $a4, $98, $95, $50, $84, $95, $9e, $94, $91, $50, $86, $99, $9c, $9c, $91, $97 +db $95, $02 +.ShopUnder: +db $a4, $98, $95, $50, $7c, $9f, $a3, $a4, $50, $85, $9e, $94, $95, $a2, $a7, $9f +db $a2, $9c, $94, $02 +.ShopMagic: +db $7D, $91, $97, $99, $93, $91, $9E, $A4, $02 + +.Paula: +db $1C, $02, $02, $02 +.Jeff: +db $1C, $02, $03, $02 +.Poo: +db $1C, $02, $04, $02 +.FlnMn: +db $76, $9C, $A9, $99, $9E, $97, $50, $7D, $91, $9E, $02 +.Ness: +db $1C, $02, $01, $02 + +.CheckSaturnText: +db $06 +db $F8, $00 +dd .SaturnText +db $06 +db $F9, $00 +dd .SaturnText +db $06 +db $FA, $00 +dd .SaturnText +db $0A +dl .NonSaturnTetx +.SaturnText: +db $1F, $31 +db $89, $9F, $A5, $50, $A7, $91, $9E +db $A4, $50 +db $0A +dl .BackSaturnText + +ShopsanityPurchaseHandler: +;Set the flag here, probably? +db $1B, $06 +db $0B, $06 +db $1B, $03 +dd .Photo +db $1B, $06 +db $1B, $02 +dd .NormalItem +db $01 +db $1F, $30 +db $06 +db $93, $02 +dd .SpecialMoonsideFlagHandler +db $19, $02 +db $89, $95, $A3, $02 +db $19, $02 +db $7E, $9F, $02 +db $1C, $07, $02, $11 +db $12 +db $09, $02 +dd .Purchase +dd .Cancel +.Cancel: +db $0A +dl $C5E1AD +.Purchase: +db $1B, $06 +db $0B, $05 +db $1B, $03 +dd .PurchaseRemoteItem +db $1B, $06 +.ConfirmRemotePurchase: +db $1D, $09 +dw $0000 +db $18, $0A +db $08 +dd $C5D835 +db $1B, $06 +db $08 +dd .BoughtSpecialItemGiveToPlayer +;Set flag here!!!! +db $0A +dl $C50198 +db $02 +.NormalItem: +db $1B, $01 +db $1C, $19, $01 +db $1B, $03 +dd .NotSpecial +db $19, $20 +db $0B, $01 +db $1B, $03 +dd .GiveLeader +db $1B, $01 +db $08 +dd $C507F8 +db $08 +dd $C5E52E +db $1B, $02 +dd $C5E1AD + +db $1B, $04 +db $1D, $03, $00 +db $1B, $02 +dd $C5E1B7 +db $1C, $20, $01 +.LeaderGiven: +db $09, $04 +dd .GiveNess +dd .GivePaula +dd .GiveJeff +dd .GivePoo +.GiveNess: +db $1B, $01 +db $1D, $0E, $01, $00 +db $0A +dl .FinishGive +.GivePaula: +db $1B, $01 +db $1D, $0E, $02, $00 +db $0A +dl .FinishGive +.GiveJeff: +db $1B, $01 +db $1D, $0E, $03, $00 +db $0A +dl .FinishGive +.GivePoo: +db $1B, $01 +db $1D, $0E, $04, $00 +db $0A +dl .FinishGive +.FinishGive: +db $04, $91, $02 +db $1B, $06 +db $1D, $09 +dw $0000 +db $18, $0A +db $08 +dd $C5D835 +db $08 +dd $C51568 +db $02 +.NotSpecial: +db $19, $20 +db $0B, $01 +db $1B, $03 +dd .HandleSoloNonSpecialBuy + +db $1B, $01 +db $08 +dd $C507F8 +db $08 +dd $C5E0D3 +db $1B, $02 +dd .skipflag +db $1C, $20, $01 +.skipflag: +db $02 +.GiveLeader: +db $1C, $20, $01 +db $19, $10, $01 +db $0A +dl .LeaderGiven +.HandleSoloNonSpecialBuy: +db $1D, $03, $FF +db $1B, $02 +dd $C5DF89 +;db $1C, $20, $01 +db $0A +dl $C5E0DE +.BoughtSpecialItemGiveToPlayer: +db $1C, $20, $01 +db $04, $91, $02 +db $09, $07 +dd ..Teleport +dd ..Character +dd ..Error +dd ..OffWorld +dd ..RemoteLocal +dd ..Error +dd ..Money + + + +..Error: +..OffWorld: +..RemoteLocal: +db $02 + +..Teleport: +db $1B, $01 +db $1B, $04 +db $09, $10 +dd OnettTeleTex+$1 +dd TwosonTeleTex+$1 +dd HappyTeleTex+$1 +dd ThreedTeleTex+$1 +dd SaturnTeleTex+$1 +dd DunesTeleTex+$1 +dd FoursTeleTex+$1 +dd WintersTeleTex+$1 +dd SummersTeleTex+$1 +dd ScarabaTeleTex+$1 +dd DalaamTeleTex+$1 +dd DarkTeleTex+$1 +dd TendaTeleTex+$1 +dd UnderworldTeleTex+$1 +dd MagicantTeleTex+$1 +dd PooPsiTex+$1 +db $02 + +..Money: +db $10, $10 +db $1B, $01 +db $1B, $04 +db $09, $03 +dd ...10 +dd ...100 +dd ...1000 +db $02 +...10: +db $1D, $25, $0A, $00 +db $08 +dd DisplayAndGetMoney +db $02 + +...100: +db $1D, $25, $64, $00 +db $08 +dd DisplayAndGetMoney +db $02 + +...1000: +db $1D, $25, $E8, $03 +db $08 +dd DisplayAndGetMoney +db $02 + +..Character: +db $1B, $01 +db $1B, $04 +db $09, $05 +dd .Paula +dd .Jeff +dd .Poo +dd .FlnMn +dd .Ness +db $02 +.Paula: +db $08 +dd $D5F830 +db $18, $01, $01 +db $02 +.Jeff: +db $08 +dd $D5F837 +db $18, $01, $01 +db $02 +.Poo: +db $08 +dd $D5F83E +db $18, $01, $01 +db $02 +.FlnMn: +db $08 +dd $D5F845 +db $18, $01, $01 +db $02 +.Ness: +db $08 +dd $D5F849 +db $18, $01, $01 +db $02 + +.PurchaseRemoteItem: +db $1B, $01 +db $1c, $19, $01 +db $1B, $02 +dd .RemoteSpecialPurchase + +db $1B, $01 +db $1D, $0A, $00 +db $1B, $04 +db $0A +dl .ConfirmRemotePurchase +.RemoteSpecialPurchase: +db $1B, $06 +db $0A +dl .ConfirmRemotePurchase +.Photo: +db $1C, $28, $01 +db $1B, $06 +db $04, $91, $02 +db $1C, $20, $01 +db $08 +dd DynamicPhotoSetter +db $1C, $29, $01 +db $18, $01, $01 +db $02 + +.SpecialMoonsideFlagHandler: +db $19, $02 +db $89, $95, $A3, $02 +db $19, $02 +db $7E, $9F, $02 +db $1C, $07, $02, $11 +db $12 +db $09, $02 +dd .Cancel +dd .Purchase +db $0A +dl .Purchase + + +OverrideSpaceCheckOnSpecialItem: +db $1B, $06 +db $1B, $02 +dd .CheckSpace +db $0A +dl $C5DF27 +.CheckSpace: +db $1d, $03, $ff +db $1b, $02 +dd $C5Df89 +db $0A +dl $C5DF27 + +CancelBuyRemoveName: +db $1C, $21, $01 +db $0A +dl $C50C36 + +OverrideSpaceCheckOnSpecialItem_nosell: +db $1B, $06 +db $1B, $02 +dd .CheckSpace +db $0A +dl $C5E05C +.CheckSpace: +db $1d, $03, $ff +db $1b, $02 +dd $C50F66 +db $0A +dl $C5DF27 + +BackupShopEquipText: +db $0A +dl $C5B910 + +BackupShopSellText: +db $0A +dl $C52189 + +BackupShopCantEquip: +db $0A +dl $C5B94D + +OverrideSpaceCheckOnSpecialItem_oneslot: +db $1B, $06 +db $1B, $02 +dd .CheckSpace +db $0A +dl $C5E05C +.CheckSpace: +db $1d, $03, $ff +db $1b, $02 +dd $C5E0A3 +db $0A +dl $C5E05C + + +;ORG $f40930 +;db $01, $00, $01, $01, $00, $00, $01, $00, $01 + + + +;set flags +;give the item + + + +;First we should probably check if it's a special item? +;1E is the shop ID +;04 is thre slot number + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;BATTLE ACTION STUFF WEE-WOO WEE-WOO + +macro LoadAddress06(address) + LDA #$AFB0 + STA $06 + lda #$00FF + sta $08 +endmacro + +macro LoadAddress0A(address) + LDA #$AFB0 + STA $0A + lda #$00FF + sta $0C +endmacro + +macro LoadAddress18(address) + LDA #$AFB0 + STA $18 + lda #$00FF + sta $1A +endmacro + +ORG $FFAFB0 + +ORG $C11FF1 +LDA $FFAFB0,X + +ORG $C1B6E4 +LDA $FFAFB0,X + +ORG $C1B80E +LDA $FFAFB0,X + +ORG $C1C9E7 +LDA $FFAFB0,X + +ORG $C1CD55 +LDA $FFAFB0,X + +ORG $C1CDCF +LDA $FFAFB0,X + +ORG $C244D4 +LDA $FFAFB0,X + +ORG $C256EE +LDA $FFAFB0,X + +ORG $C257E4 +LDA $FFAFB0,X + +ORG $C25A12 +LDA $FFAFB0,X + +ORG $C25A8A +LDA $FFAFB0,X + +ORG $C25B4E +LDA $FFAFB0,X + +ORG $C25B9D +LDA $FFAFB0,X + +ORG $C2699F +LDA $FFAFB0,X + +ORG $C29447 +LDA $FFAFB0,X + +ORG $C1ADC8 +%LoadAddress06(BattleActions) + +ORG $C1AFFD +%LoadAddress0A(BattleActions) + +ORG $C1B04F +%LoadAddress0A(BattleActions) + +ORG $C1B0CB +%LoadAddress0A(BattleActions) + +ORG $C1B138 +%LoadAddress0A(BattleActions) + +ORG $C1B1A7 +%LoadAddress0A(BattleActions) + +ORG $C1B259 +%LoadAddress0A(BattleActions) + +ORG $C1B371 +%LoadAddress18(BattleActions) + +ORG $C1B466 +%LoadAddress0A(BattleActions) + +ORG $C1B89C +%LoadAddress0A(BattleActions) + +ORG $C1B8E7 +%LoadAddress06(BattleActions) + +ORG $C1B9AD +%LoadAddress0A(BattleActions) + +ORG $C1C913 +%LoadAddress0A(BattleActions) + +ORG $C1CC9B +%LoadAddress06(BattleActions) + +ORG $C1DF64 +%LoadAddress06(BattleActions) + +ORG $C1DFB8 +%LoadAddress06(BattleActions) + +ORG $C2451F +%LoadAddress06(BattleActions) + +ORG $C2582E +%LoadAddress06(BattleActions) + +ORG $C25C32 +%LoadAddress0A(BattleActions) + +ORG $C25CEB +%LoadAddress0A(BattleActions) + +ORG $C2794D +%LoadAddress0A(BattleActions) + +ORG $FFBEA4 +;START OF NEW BATTLE ACTIONS +db $00, $01, $05, $00, $30, $9c, $ef, $00, $6D, $8b, $c2, $00;cold spores + +db $00, $01, $05, $00 +dd regular_eyes +dd $00C28CF1;Glared with Regular Eyes + +db $00, $01, $05, $00 +dd creepy_eyes +dd $00C29FFE;Glared with Creepy eyes + +db $00, $04, $05, $00 +dd gentle_light +dd $00C29987;Emit gentle light + +db $00, $04, $05, $00 +dd harsh_light +dd $00C299AE;Emit harsh light + +db $00, $04, $05, $00 +dd radiant_light +dd $00C29A35;Emit radiant light + +db $00, $01, $05, $00 +dd fireball_gamma +dd flaming_fireball_gamma + +db $00, $01, $05, $00 +dd fireball_beta +dd flaming_fireball_beta + +db $00, $01, $05, $00 +dd fireball_alpha +dd flaming_fireball_alpha + +db $00, $04, $05, $00 +dd breathe_fire_alpha +dd $00C295AB; + +db $00, $04, $05, $00 +dd breathe_fire_beta +dd $00C295B4; + +db $00, $04, $05, $00 +dd breathe_fire_omega +dd $00C295C6; + +db $00, $04, $05, $00 +dd spray_fire_alpha +dd $00C295AB; + +db $00, $04, $05, $00 +dd spray_fire_beta +dd $00C295B4; + +db $00, $04, $05, $00 +dd spray_fire_gamma +dd $00C295BD; + +db $00, $01, $02, $00 +dd dirty_fangs +dd dirty_fang_asm; + +db $00, $01, $05, $00 +dd dirty_stinger +dd $00C28B6D; + +db $00, $04, $05, $00 +dd fizzling_crack_zap +dd $00C29871; + +db $00, $04, $05, $00 +dd thunder_boom_bang +dd $00C29889; + +db $00, $04, $05, $00 +dd shocking_blast_burst +dd $00C29895; + +db $00, $04, $05, $00 +dd static_shock +dd $00C29871; + +db $00, $04, $05, $00 +dd charged_shock +dd $00C29889; + +db $00, $04, $05, $00 +dd high_voltage_shock +dd $00C29895; + +db $00, $04, $05, $00 +dd espresso_beta +dd $00C295B4; + +db $00, $04, $05, $00 +dd espresso_gamma +dd $00C295BD; + +db $00, $04, $05, $00 +dd espresso_omega +dd $00C295C6; + +db $00, $04, $05, $00 +dd extinguish_alpha +dd $00C295AB; + +db $00, $04, $05, $00 +dd extinguish_beta +dd $00C295B4; + +db $00, $04, $05, $00 +dd extinguish_omega +dd $00C295C6; + +db $00, $01, $02, $00 +dd solid_byte +dd $00C2A5EC; + +db $00, $01, $02, $00 +dd paralyzing_byte +dd paralyz_byte_asm; + +db $00, $01, $05, $00 +dd dirty_flute +dd $00C28B6D; + +db $00, $01, $05, $00 +dd dirty_kiss +dd $00C28B6D; + +db $00, $03, $03, $01;fire zeta +dd $00EF8543 +dd fire_zeta + +db $00, $03, $03, $03;fire epsilon +dd $00EF8543 +dd fire_epsilon + +db $00, $01, $03, $01;Freeze zeta +dd $00EF8543 +dd freeze_zeta + +db $00, $01, $03, $01;Freeze epsilon +dd $00EF8543 +dd freeze_epsilon + +db $00, $01, $03, $02;Freeze delta +dd $00EF8543 +dd freeze_delta + +db $00, $01, $03, $02;Freeze lambda +dd $00EF8543 +dd freeze_lambda + +db $00, $04, $03, $03;Special zeta +dd $00EF8543 +dd special_zeta + +db $00, $04, $03, $05;Special epsilon +dd $00EF8543 +dd special_epsilon + +db $00, $01, $03, $04;Paralysis Delta +dd $00EF8543 +dd paralyz_delta + +db $00, $04, $03, $01;Thunder zeta +dd $00EF8543 +dd thunder_zeta + +db $00, $04, $03, $01;Thunder epsilon +dd $00EF8543 +dd thunder_epsilon + +db $00, $04, $03, $01;Thunder lambda +dd $00EF8543 +dd thunder_delta + +db $00, $04, $03, $01;Thunder delta +dd $00EF8543 +dd thunder_lambda + +db $00, $04, $03, $01;starstorm zeta +dd $00EF8543 +dd starstorm_zeta + +db $00, $04, $03, $03;starstorm epsilon +dd $00EF8543 +dd starstorm_epsilon + +db $00, $04, $03, $06;starstorm delta +dd $00EF8543 +dd starstorm_delta + +db $00, $04, $03, $0C;starstorm lambda +dd $00EF8543 +dd starstorm_lambda + +db $00, $04, $03, $00 +dd warm_breath +dd fire_zeta + +db $00, $04, $03, $00 +dd sizzle_breath +dd fire_epsilon + +db $00, $01, $05, $00 +dd fireball_zeta +dd flaming_fireball_zeta + +db $00, $01, $05, $00 +dd fireball_epsilon +dd flaming_fireball_epsilon + +db $00, $04, $05, $00 +dd spray_fire_zeta +dd fire_zeta + +db $00, $04, $05, $00 +dd spray_fire_epsilon +dd fire_epsilon + +db $00, $04, $05, $00 +dd lukewarm_espresso +dd fire_zeta; + +db $00, $04, $05, $00 +dd piping_espresso +dd fire_epsilon; + +db $00, $04, $05, $00 +dd tingling_jolt +dd thunder_zeta; + +db $00, $04, $05, $00 +dd minor_zap +dd thunder_epsilon + +db $00, $04, $05, $00 +dd dull_shock +dd thunder_delta; + +db $00, $04, $05, $00 +dd lv_shock +dd thunder_lambda; + +db $00, $04, $05, $00 +dd fizzled_zap +dd thunder_zeta; + +db $00, $04, $05, $00 +dd crackling_whoosh_bam +dd thunder_epsilon + +db $00, $04, $05, $00 +dd sparking_swish_bang +dd thunder_delta; + +db $00, $04, $05, $00 +dd jolting_shock_zap +dd thunder_lambda; + +db $00, $04, $05, $00 +dd extinguish_zeta +dd fire_zeta; + +db $00, $04, $05, $00 +dd extinguish_epsilon +dd fire_epsilon; + +db $00, $04, $05, $00 +dd $00ef8f17 +dd $00C29871;Giygas phase 2 thunder 1 + +db $00, $04, $05, $00 +dd $00ef8f17 +dd thunder_lambda + +db $00, $04, $05, $00 +dd $00EF8F17 +dd thunder_delta + +db $00, $04, $05, $00 +dd $00EF8F17 +dd thunder_epsilon + +db $00, $04, $05, $00 +dd $00EF8F17 +dd thunder_zeta +;;;;;;;;;;;;;;;;;;;;;;;; +db $00, $04, $05, $00 +dd $00EF8EE2 +dd $00C29871 + +db $00, $04, $05, $00 +dd $00EF8EE2 +dd thunder_lambda + +db $00, $04, $05, $00 +dd $00EF8EE2 +dd thunder_delta + +db $00, $04, $05, $00 +dd $00EF8EE2 +dd thunder_epsilon + +db $00, $04, $05, $00 +dd $00EF8EE2 +dd thunder_zeta +;;;;;;;;;;;;;;;;;;;; +db $00, $04, $05, $00 +dd $00EF8F4A +dd $00C29871 + +db $00, $04, $05, $00 +dd $00EF8F4A +dd thunder_lambda + +db $00, $04, $05, $00 +dd $00EF8F4A +dd thunder_delta + +db $00, $04, $05, $00 +dd $00EF8F4A +dd thunder_epsilon + +db $00, $04, $05, $00 +dd $00EF8F4A +dd thunder_zeta +;;;;;;;;;;;;;;; +;freeze giygas +db $00, $04, $05, $00 +dd $00EF8F17 +dd freeze_zeta + +db $00, $04, $05, $00 +dd $00EF8F17 +dd freeze_epsilon + +db $00, $04, $05, $00 +dd $00EF8F17 +dd freeze_delta + +db $00, $04, $05, $00 +dd $00EF8F17 +dd freeze_lambda +;;;;;;;;;;;;;;;;;;;; +db $00, $04, $05, $00 +dd $00EF8EE2 +dd freeze_zeta + +db $00, $04, $05, $00 +dd $00EF8EE2 +dd freeze_epsilon + +db $00, $04, $05, $00 +dd $00EF8EE2 +dd freeze_delta + +db $00, $04, $05, $00 +dd $00EF8EE2 +dd freeze_lambda +;;;;;;;;;;;;;;;;; +db $00, $04, $05, $00 +dd $00EF8F4A +dd freeze_zeta + +db $00, $04, $05, $00 +dd $00EF8F4A +dd freeze_epsilon + +db $00, $04, $05, $00 +dd $00EF8F4A +dd freeze_delta + +db $00, $04, $05, $00 +dd $00EF8F4A +dd freeze_lambda +;;;;;;;;;; +db $00, $04, $05, $00 +dd $00EF8F17 +dd $00C29987 + +db $00, $04, $05, $00 +dd $00EF8F17 +dd $00C299AE +;;;;;;;;;;; +db $00, $04, $05, $00 +dd $00EF8EE2 +dd $00C29987 + +db $00, $04, $05, $00 +dd $00EF8EE2 +dd $00C299AE +;;;;;;;;;;;;;;;; +db $00, $04, $05, $00 +dd $00EF8F4A +dd $00C29987 + +db $00, $04, $05, $00 +dd $00EF8F4A +dd $00C299AE +;;;;;;;;;;;; +db $00, $01, $03, $05 +dd $00EF8543;Blast alpha +dd blast_alpha + +db $00, $01, $03, $0F +dd $00EF8543;Blast beta +dd blast_beta + +db $00, $01, $03, $14 +dd $00EF8543;Blast gamma +dd blast_gamma + +db $00, $01, $03, $1E +dd $00EF8543;Blast omega +dd blast_omega +;;;;;;;;;;;;;;;;;; +db $00, $01, $03, $05 +dd $00EF8543;Missile alpha +dd missile_alpha + +db $00, $01, $03, $0F +dd $00EF8543;Missile beta +dd missile_beta + +db $00, $01, $03, $1E +dd $00EF8543;Missile gamma +dd missile_gamma + +db $00, $01, $03, $64 +dd $00EF8543;Missile omega +dd missile_omega +;;;;;;;;;;;;;;;;; +;01ac +db $00, $04, $04, $00 +dd $00c97eb7 +dd $00c29556 + +;01AD +db $00, $04, $04, $00 +dd $00c97eb7 +dd $00c29568 + +;flash bomb +db $00, $04, $04, $00 +dd $00c97eb7 +dd $00c29987 + +db $00, $04, $04, $00 +dd $00c97eb7 +dd $00c299ef + +;fire bomb +db $00, $03, $04, $00 +dd $00c97eb7 +dd $00c295ab + +db $00, $03, $04, $00 +dd $00c97eb7 +dd $00c295bd +;freeze bomb +db $00, $01, $04, $00 +dd $00c97eb7 +dd $00c29647 + +db $00, $01, $04, $00 +dd $00c97eb7 +dd $00c29659 +;thunder bomb +db $00, $04, $04, $00 +dd $00c97eb7 +dd $00c29871 + +db $00, $04, $04, $00 +dd $00c97eb7 +dd $00c29889 +;Starstorm bomb +db $00, $04, $04, $00 +dd $00c97eb7 +dd starstorm_delta + +db $00, $04, $04, $00 +dd $00c97eb7 +dd $00c29aa6 +;Missile bomb +db $00, $01, $04, $00 +dd $00c97eb7 +dd $00c2a5d1 + +db $00, $01, $04, $00 +dd $00c97eb7 +dd $00c2a5da +;;;;;;;;;;;; +;Special missile +db $00, $04, $04, $00 +dd $00c97ddc +dd $00c29556 + +db $00, $04, $04, $00 +dd $00c97df5 +dd $00c2955f + +db $00, $04, $04, $00 +dd $00c97e24 +dd $00c29571 +;Flash missile +db $00, $04, $04, $00 +dd $00c97ddc +dd $00c29987 + +db $00, $04, $04, $00 +dd $00c97df5 +dd $00c299ae + +db $00, $04, $04, $00 +dd $00c97e24 +dd $00c29a35 +;Fire missile +db $00, $03, $04, $00 +dd $00c97ddc +dd $00c295ab + +db $00, $03, $04, $00 +dd $00c97df5 +dd $00c295b4 + +db $00, $03, $04, $00 +dd $00c97e24 +dd $00c295c6 +;freeze missile +db $00, $01, $04, $00 +dd $00c97ddc +dd $00c29647 + +db $00, $01, $04, $00 +dd $00c97df5 +dd $00c29650 + +db $00, $01, $04, $00 +dd $00c97e24 +dd $00c29662 +;thunder missile +db $00, $04, $04, $00 +dd $00c97ddc +dd $00c29871 + +db $00, $04, $04, $00 +dd $00c97df5 +dd $00c2987d + +db $00, $04, $04, $00 +dd $00c97e24 +dd $00c29895 +;Star missile +db $00, $04, $04, $00 +dd $00c97ddc +dd starstorm_delta + +db $00, $04, $04, $00 +dd $00c97df5 +dd starstorm_lambda + +db $00, $04, $04, $00 +dd $00c97e24 +dd $00c29aaf +;Bomb missile +db $00, $01, $04, $00 +dd $00c97ddc +dd $00c2a818 + +db $00, $01, $04, $00 +dd $00c97df5 +dd blast_beta + +db $00, $01, $04, $00 +dd $00c97e24 +dd blast_omega +;;;;;;;;;;;;;;;;;;;;;; +;bazookas +db $00, $04, $04, $00 +dd $00c97e9e +dd $00c29556 + +db $00, $04, $04, $00 +dd $00c97e9e +dd $00c29568 + +;flash bomb +db $00, $04, $04, $00 +dd $00cc97e9e +dd $00c29987 + +db $00, $04, $04, $00 +dd $00c97e9e +dd $00c299ef + +;fire bomb +db $00, $03, $04, $00 +dd $00c97e9e +dd $00c295ab + +db $00, $03, $04, $00 +dd $00c97e9e +dd $00c295bd +;freeze bomb +db $00, $01, $04, $00 +dd $00c97e9e +dd $00c29647 + +db $00, $01, $04, $00 +dd $00c97e9e +dd $00c29659 +;thunder bomb +db $00, $04, $04, $00 +dd $00c97e9e +dd $00c29871 + +db $00, $04, $04, $00 +dd $00c97e9e +dd $00c29889 +;Starstorm bomb +db $00, $04, $04, $00 +dd $00c97e9e +dd starstorm_delta + +db $00, $04, $04, $00 +dd $00c97e9e +dd $00c29aa6 +;Missile bomb +db $00, $01, $04, $00 +dd $00c97e9e +dd $00c2a5d1 + +db $00, $01, $04, $00 +dd $00c97e9e +dd $00c2a5da +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;New assist PSI +;Defense Up Alpha +db $01, 01, $03, $07 +dd $00EF8543 +dd $00c2aac6 +;Defense Up Omega +db $01, $04, $03, $15 +dd $00EF8543 +dd $00c2ab0d +;Drain Alpha +db $00, $01, $03, $08 +dd $00EF8543 +dd $00c2a46b +;Drain Omega +db $00, $04, $03, $18 +dd $00EF8543 +dd $00c2a507 +;Disable Alpha +db $00, $01, $03, $06 +dd $00EF8543 +dd $00c2a3d1 +;Disable Omega +db $00, $04, $03, $12 +dd $00EF8543 +dd $00c2a3d1 +;Stop Alpha +db $00, $01, $03, $05 +dd $00EF8543 +dd $00c28cf1 +;Stop Omega +db $00, $04, $03, $0F +dd $00EF8543 +dd $00c28cf1 + +;Neutralize Alpha +db $00, $01, $03, $0A +dd $00EF8543 +dd $00c2a422 +;Neutralize Omega +db $00, $04, $03, $1E +dd $00EF8543 +dd $00c290c6 +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Action 01E7 +db $00, $01, $04, $00 +dd hypnosis_alpha_item_anim +dd $00c29f06 + +db $00, $04, $04, $00 +dd hypnosis_omega_item_anim +dd $00c29f57 +;;;;;;;;;;;;;;;;;;;;;;; +db $00, $01, $04, $00 +dd paralysis_alpha_item_anim +dd $00c29ffe + +db $00, $04, $04, $00 +dd paralysis_omega_item_anim +dd $00c2a04f +;;;;;;;;;;;;;;;;;;;;;;; +;TODO: MAKE NEW ITEM ANIM CODES FOR THE EXTENDED ASSISTS +;Offense Up +db $01, $01, $04, $00 +dd $00ef8e27 +dd $00c29e38 + +db $01, $04, $04, $00 +dd $00ef8e27 +dd $00c29e7f +;;;;;;;;;;;;;;;;;;;;;;; +db $00, $01, $04, $00 +dd defdown_alpha_item_anim +dd $00cc29e86 + +db $00, $04, $04, $00 +dd defdown_omega_item_anim +dd $00cc29eff +;;;;;;;;;;;;;;;;;;;;; +db $00, $01, $04, $00 +dd brainshock_alpha_item_anim +dd $00c2a056 + +db $00, $04, $04, $00 +dd brainshock_omega_item_anim +dd $00c2a0a7 +;;;;;;;;;;;;;;;;;;;; +;new jeffer items go here? +db $00, $04, $04, $00 +dd $00ef8e3c +dd $00c2a3d1 + +db $00, $04, $04, $00 +dd $00c97d75 +dd $00c28cf1 +;;;;;;;;;; +;01F3 +db $01, $01, $04, $00 +dd $00c97b6b +dd NewLuckySandwich +;;;;;;;;;;;;;;; +;Unique text for these? +db $00, $04, $05, $00 +dd $00ef9e05 +dd $00C29987 + +db $00, $04, $05, $00 +dd $00ef9e05 +dd $00C299AE + +db $00, $04, $05, $00 +dd $00ef9e05 +dd $00C299EF +;;;;;;;;;; +db $00, $01, $03, $01 +dd $00EF8543;Blast Zeta +dd blast_zeta + +db $00, $01, $03, $03 +dd $00EF8543;Blast Epsilon +dd blast_epsilon +;;;;;;;;;;;;;;;;;;;;;;;; +db $00, $01, $03, $01 +dd $00EF8543;Missile Zeta +dd missile_zeta + +db $00, $01, $03, $03 +dd $00EF8543;Missile Epsilon +dd missile_epsilon +;;;;;;;;;;;;;;;;;;;;;;;;;;; +db $00, $01, $01, $00 +dd throwbomb_zeta +dd blast_zeta + +db $00, $01, $01, $00 +dd throwbomb_epsilon +dd blast_epsilon + +db $00, $01, $01, $00 +dd throwbomb_alpha +dd blast_alpha + +db $00, $01, $01, $00 +dd throwbomb_beta +dd blast_beta + +db $00, $01, $01, $00 +dd throwbomb_gamma +dd blast_gamma + +db $00, $01, $01, $00 +dd throwbomb_omega +dd blast_omega +;;;;;;;;;;;;;;;;;;;;;;;;; +db $00, $01, $01, $00 +dd shootrocket_zeta +dd missile_zeta + +db $00, $01, $01, $00 +dd shootrocket_epsilon +dd missile_epsilon + +db $00, $01, $01, $00 +dd shootrocket_alpha +dd missile_alpha + +db $00, $01, $01, $00 +dd shootrocket_beta +dd missile_beta + +db $00, $01, $01, $00 +dd shootrocket_gamma +dd missile_gamma + +db $00, $01, $01, $00 +dd shootrocket_omega +dd missile_omega +;;;;;;;;;;;;;;;;;;;;;;;;;; +db $00, $01, $05, $00 +dd paralyz_pollen_lambda +dd $C28CF1 + +db $00, $04, $05, $00 +dd paralyz_pollen_omega +dd $C28A92 +;;;;;;;;;;;;;;;; +db $00, $00, $05, $00 +dd $EF9A47 +dd code_test_load_enemyvram + + +;New battle text +ORG $FE0000 +regular_eyes: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $97, $9c, $91, $a2, $95, $94, $50, $a7 +db $99, $a4, $98, $50, $99, $a4, $a3, $50, $a2, $95, $97, $a5, $9c, $91, $a2, $50 +db $95, $a9, $95, $a3, $51, $03, $10, $01, $02;Glared with regular eyes! + +creepy_eyes: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $97, $9c, $91, $a2, $95, $94, $50, $a7 +db $99, $a4, $98, $50, $99, $a4, $a3, $50, $93, $a2, $95, $95, $a0, $a9, $50, $95 +db $a9, $95, $a3, $51, $03, $10, $01, $02;glared with its creepy eyes! + +gentle_light: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $95, $9d, $99, $a4, $a4, $95, $94, $50 +db $91, $50, $97, $95, $9e, $a4, $9c, $95, $50, $9c, $99, $97, $98, $a4, $51, $03 +db $02 + +harsh_light: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $95, $9d, $99, $a4, $a4, $95, $94, $50 +db $91, $50, $98, $91, $a2, $a3, $98, $50, $9c, $99, $97, $98, $a4, $51, $03, $02 + +radiant_light: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $95, $9d, $99, $a4, $a4, $95, $94, $50 +db $91, $50, $a2, $91, $94, $99, $91, $9e, $a4, $50, $9c, $99, $97, $98, $a4, $51 +db $03, $02 + +fireball_gamma: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a0, $95, $a7, $95, $94, $50, $9f +db $a5, $a4, $50, $91, $50, $98, $9f, $a4, $50, $96, $99, $a2, $95, $92, $91, $9c +db $9c, $51, $1f, $02, $4b, $03, $10, $01, $02 + +fireball_beta: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a0, $95, $a7, $95, $94, $50, $9f +db $a5, $a4, $50, $91, $50, $a3, $9d, $9f, $9c, $94, $95, $a2, $99, $9e, $97, $50 +db $96, $99, $a2, $95, $92, $91, $9c, $9c, $51, $1f, $02, $4b, $03, $10, $01, $02 + +fireball_alpha: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a0, $95, $a7, $95, $94, $50, $9f +db $a5, $a4, $50, $91, $50, $9c, $99, $a4, $a4, $9c, $95, $50, $92, $99, $a4, $50 +db $9f, $96, $50, $96, $99, $a2, $95, $51, $1f, $02, $4b, $03, $10, $01, $02 + +breathe_fire_alpha: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $92, $a2, $95, $91, $a4, $98, $95, $94 +db $50, $91, $50, $98, $9f, $a4, $50, $92, $a2, $95, $91, $a4, $98, $51, $1f, $02 +db $4b, $03, $10, $01, $02 + +breathe_fire_beta: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $92, $a2, $95, $91, $a4, $98, $95, $94 +db $50, $91, $50, $92, $a5, $a2, $a3, $a4, $50, $9f, $96, $50, $98, $95, $91, $a4 +db $51, $1f, $02, $4b, $03, $10, $01, $02 + +breathe_fire_omega: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $92, $a2, $95, $91, $a4, $98, $95, $94 +db $50, $a7, $98, $99, $a4, $95, $5d, $98, $9f, $a4, $50, $96, $99, $a2, $95, $51 +db $1f, $02, $4b, $03, $10, $01, $02 + +spray_fire_alpha: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $9f, $a5, $a4 +db $50, $91, $50, $9c, $99, $9e, $95, $50, $9f, $96, $50, $96, $99, $a2, $95, $51 +db $1f, $02, $4b, $03, $10, $01, $02 + +spray_fire_beta: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $9f, $a5, $a4 +db $50, $91, $50, $92, $99, $a4, $50, $9f, $96, $50, $96, $99, $a2, $95, $51, $1f +db $02, $4b, $03, $10, $01, $02 + +spray_fire_gamma: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $9f, $a5, $a4 +db $50, $91, $50, $a3, $a4, $a2, $95, $91, $9d, $50, $9f, $96, $50, $96, $99, $a2 +db $95, $51, $1f, $02, $4b, $03, $10, $01, $02 + +dirty_fangs: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a4, $9f, $9f, $9b, $50, $91, $50, $92 +db $99, $a4, $95, $50, $a5, $a3, $99, $9e, $97, $50, $99, $a4, $a3, $50, $94, $99 +db $a2, $a4, $a9, $50, $96, $91, $9e, $97, $a3, $51, $03, $02 + +dirty_stinger: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a4, $a5, $9e, $97, $50, $a7, $99 +db $a4, $98, $50, $99, $a4, $a3, $50, $94, $99, $a2, $a4, $a9, $50, $a3, $a4, $99 +db $9e, $97, $95, $a2, $51, $03, $10, $01, $02 + +fizzling_crack_zap: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $76 +db $99, $aa, $aa, $9c, $99, $9e, $97, $50, $73, $a2, $91, $93, $9b, $50, $8a, $91 +db $a0, $50, $91, $a4, $a4, $91, $93, $9b, $51, $03, $02 + +thunder_boom_bang: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $84 +db $98, $a5, $9e, $94, $95, $a2, $99, $9e, $97, $50, $72, $9f, $9f, $9d, $50, $72 +db $91, $9e, $97, $50, $91, $a4, $a4, $91, $93, $9b, $51, $03, $02 + +shocking_blast_burst: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $83 +db $98, $9f, $93, $9b, $99, $9e, $97, $50, $72, $9c, $91, $a3, $a4, $50, $72, $a5 +db $a2, $a3, $a4, $50, $91, $a4, $a4, $91, $93, $9b, $51, $03, $02 + +static_shock: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50 +db $a3, $a4, $91, $a4, $99, $93, $50, $a3, $98, $9f, $93, $9b, $50, $91, $a4, $a4 +db $91, $93, $9b, $51, $03, $02 + +charged_shock: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50 +db $93, $98, $91, $a2, $97, $95, $94, $50, $a3, $98, $9f, $93, $9b, $50, $91, $a4 +db $a4, $91, $93, $9b, $51, $03, $02 + +high_voltage_shock: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50 +db $98, $99, $97, $98, $5d, $a6, $9f, $9c, $a4, $91, $97, $95, $50, $a3, $98, $9f +db $93, $9b, $50, $91, $a4, $a4, $91, $93, $9b, $51, $03, $02 + +espresso_beta: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a0, $99, $9c, $9c, $95, $94, $50 +db $a3, $9f, $9d, $95, $50, $92, $9c, $99, $a3, $a4, $95, $a2, $99, $9e, $97, $50 +db $98, $9f, $a4, $50, $95, $a3, $a0, $a2, $95, $a3, $a3, $9f, $51, $03, $02 + +espresso_gamma: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a0, $99, $9c, $9c, $95, $94, $50 +db $a3, $9f, $9d, $95, $50, $92, $9f, $99, $9c, $99, $9e, $97, $50, $98, $9f, $a4 +db $50, $95, $a3, $a0, $a2, $95, $a3, $a3, $9f, $51, $03, $02 + +espresso_omega: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a0, $99, $9c, $9c, $95, $94, $50 +db $91, $50, $a7, $98, $9f, $9c, $95, $50, $9a, $a5, $97, $50, $9f, $96, $50, $9e +db $a5, $93, $9c, $95, $91, $a2, $50, $99, $9e, $96, $95, $a2, $9e, $9f, $50, $95 +db $a3, $a0, $a2, $95, $a3, $a3, $9f, $51, $03, $02 + +extinguish_alpha: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $94, $99, $a3, $a0, $95, $9e, $a3, $95 +db $94, $50, $91, $9e, $50, $95, $a8, $a4, $99, $9e, $97, $a5, $99, $a3, $98, $99 +db $9e, $97, $50, $92, $a5, $a2, $a3, $a4, $51, $1f, $02, $58, $03, $10, $01, $02 + +extinguish_beta: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $94, $99, $a3, $a0, $95, $9e, $a3, $95 +db $94, $50, $91, $9e, $50, $95, $a8, $a4, $99, $9e, $97, $a5, $99, $a3, $98, $99 +db $9e, $97, $50, $96, $9c, $91, $a2, $95, $51, $1f, $02, $58, $03, $10, $01, $02 + +extinguish_omega: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $94, $99, $a3, $a0, $95, $9e, $a3, $95 +db $94, $50, $91, $9e, $50, $95, $a8, $a4, $99, $9e, $97, $a5, $99, $a3, $98, $99 +db $9e, $97, $50, $95, $a8, $a0, $9c, $9f, $a3, $99, $9f, $9e, $51, $1f, $02, $58 +db $03, $10, $01, $02 + +solid_byte: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $92, $99, $a4, $50, $a9, $9f, $a5, $50 +db $a3, $9f, $96, $a4, $51, $03, $02 + +paralyzing_byte: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $92, $99, $a4, $50, $a9, $9f, $a5, $50 +db $a7, $99, $a4, $98, $50, $91, $50, $93, $a2, $a5, $9e, $93, $98, $99, $9e, $97 +db $50, $93, $98, $9f, $9d, $a0, $51, $03, $02 + +dirty_flute: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a0, $9c, $91, $a9, $95, $94, $50, $91 +db $50, $96, $9c, $a5, $a4, $95, $50, $a7, $99, $a4, $98, $50, $99, $a4, $a3, $50 +db $94, $99, $a3, $97, $a5, $a3, $a4, $99, $9e, $97, $50, $92, $a2, $95, $91, $a4 +db $98, $51, $03, $02 + +dirty_kiss: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $97, $91, $a6, $95, $50, $a4, $98, $95 +db $50, $a3, $9d, $9f, $9f, $93, $98, $50, $9f, $96, $50, $a3, $99, $93, $9b, $9e +db $95, $a3, $a3, $51, $03, $10, $01, $02 + +warm_breath: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $92, $a2, $95, $91, $a4, $98, $95, $94 +db $50, $a7, $91, $a2, $9d, $9c, $a9, $50, $9f, $9e, $50, $a9, $9f, $a5, $51, $1F +db $02, $4b, $03, $10, $01, $02 + +sizzle_breath: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $92, $a2, $95, $91, $a4, $98, $95, $94 +db $50, $91, $50, $a3, $99, $aa, $aa, $9c, $99, $9e, $97, $50, $98, $9f, $a4, $50 +db $92, $a2, $95, $91, $a4, $98, $51, $1F, $02, $4b, $03, $10, $01, $02 + +fireball_zeta: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a0, $95, $a7, $95, $94, $50, $9f +db $a5, $a4, $50, $98, $9f, $a4, $50, $95, $9d, $92, $95, $a2, $a3, $51, $1f, $02 +db $4b, $03, $10, $01, $02 + +fireball_epsilon: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a0, $95, $a7, $95, $94, $50, $9f +db $a5, $a4, $50, $91, $50, $96, $9c, $99, $93, $9b, $95, $a2, $99, $9e, $97, $50 +db $96, $99, $a2, $95, $92, $91, $9c, $9c, $51, $1f, $02, $4b, $03, $10, $01, $02 + +spray_fire_zeta: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $9f, $a5, $a4 +db $50, $91, $50, $a3, $a0, $9c, $91, $a3, $98, $50, $9f, $96, $50, $96, $99, $a2 +db $95, $51, $1f, $02, $4b, $03, $10, $01, $02 + +spray_fire_epsilon: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $9f, $a5, $a4 +db $50, $91, $50, $92, $a5, $a2, $a3, $a4, $50, $9f, $96, $50, $96, $99, $a2, $95 +db $51, $1f, $02, $4b, $03, $10, $01, $02 + +lukewarm_espresso: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a0, $99, $9c, $9c, $95, $94, $50 +db $a3, $9f, $9d, $95, $50, $9c, $a5, $9b, $95, $a7, $91, $a2, $9d, $50, $95, $a3 +db $a0, $a2, $95, $a3, $a3, $9f, $51, $03, $02 + +piping_espresso: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a3, $a0, $99, $9c, $9c, $95, $94, $50 +db $a3, $9f, $9d, $95, $50, $a0, $99, $a0, $99, $9e, $97, $50, $98, $9f, $a4, $50 +db $95, $a3, $a0, $a2, $95, $a3, $a3, $9f, $51, $03, $02 + +tingling_jolt: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $a4 +db $99, $9e, $97, $9c, $99, $9e, $97, $50, $9a, $9f, $9c, $a4, $50, $91, $a4, $a4 +db $91, $93, $9b, $51, $03, $02 + +minor_zap: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $9d +db $99, $9e, $9f, $a2, $50, $aa, $91, $a0, $50, $91, $a4, $a4, $91, $93, $9b, $51 +db $03, $02 + +dull_shock: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $94 +db $a5, $9c, $9c, $50, $a3, $98, $9f, $93, $9b, $50, $91, $a4, $a4, $91, $93, $9b +db $51, $03, $02 + +lv_shock: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $69 +db $5d, $a6, $9f, $9c, $a4, $50, $a3, $98, $9f, $93, $9b, $50, $91, $a4, $a4, $91 +db $93, $9b, $51, $03, $02 + +fizzled_zap: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $76 +db $99, $aa, $aa, $9c, $99, $9e, $97, $50, $87, $98, $99, $96, $96, $50, $8a, $91 +db $a0, $50, $91, $a4, $a4, $91, $93, $9b, $51, $03, $02 + +crackling_whoosh_bam: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $73 +db $a2, $91, $93, $9b, $9c, $99, $9e, $97, $50, $87, $98, $9f, $9f, $a3, $98, $50 +db $72, $91, $9d, $50, $91, $a4, $a4, $91, $93, $9b, $51, $03, $02 + +sparking_swish_bang: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $83 +db $a0, $91, $a2, $9b, $99, $9e, $97, $50, $83, $a7, $99, $a3, $98, $50, $72, $91 +db $9e, $97, $50, $91, $a4, $a4, $91, $93, $9b, $51, $03, $02 + +jolting_shock_zap: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $a5, $a3, $95, $94, $50, $91, $50, $7a +db $9f, $9c, $a4, $99, $9e, $97, $50, $83, $98, $9f, $93, $9b, $50, $8a, $91, $a0 +db $50, $91, $a4, $a4, $91, $93, $9b, $51, $03, $02 + +extinguish_zeta: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $94, $99, $a3, $a0, $95, $9e, $a3, $95 +db $94, $50, $91, $9e, $50, $95, $a8, $a4, $99, $9e, $97, $a5, $99, $a3, $98, $99 +db $9e, $97, $50, $a0, $a5, $96, $96, $51, $1f, $02, $58, $03, $10, $01, $02 + +extinguish_epsilon: +db $01, $1f, $02, $19, $70, $1c, $0d, $50, $94, $99, $a3, $a0, $95, $9e, $a3, $95 +db $94, $50, $91, $9e, $50, $95, $a8, $a4, $99, $9e, $97, $a5, $99, $a3, $98, $99 +db $9e, $97, $50, $a3, $a0, $9c, $91, $a3, $98, $51, $1f, $02, $58, $03, $10, $01 +db $02 + +throwbomb_zeta: +db $01, $1F, $02, $19 +db $70, $1c, $0d, $50, $a4, $a2, $99, $95, $94, $50, $a4, $9f, $50, $a4, $98, $a2 +db $9f, $a7, $50, $91, $50, $92, $9f, $9d, $92, $5c, $10, $05, $50, $92, $a5, $a4 +db $50, $a4, $a2, $99, $a0, $a0, $95, $94, $50, $9f, $a6, $95, $a2, $50, $a9, $9f +db $a5, $51 +db $1F, $02, $11 +db $03, $02 + +throwbomb_epsilon: +db $01, $1F, $02, $19 +db $70, $1c, $0d, $50, $a4, $98, $a2, $95, $a7, $50, $91, $50, $a4, $9f, $a9 +db $50, $92, $9f, $9d, $92, $51 +db $1F, $02, $11, $03 +db $02 + +throwbomb_alpha: +db $01, $1F, $02, $19 +db $70, $1c, $0d, $50, $a4, $98, $a2, $95, $a7, $50, $91, $50, $92, $9f, $9d +db $92, $51 +db $1F, $02, $11, $03 +db $02 + +throwbomb_beta: +db $01, $1F, $02, $19 +db $01, $70, $1c, $0d, $50, $a4, $98, $a2, $95, $a7, $50, $91, $50, $92, $99, $97 +db $50, $92, $9f, $9d, $92, $51 +db $1F, $02, $11, $03 +db $02 + +throwbomb_gamma: +db $01, $1F, $02, $19 +db $70, $1c, $0d, $50, $a4, $98, $a2, $95, $a7, $50, $91, $50, $a3, $a5, $a0 +db $95, $a2, $50, $92, $9f, $9d, $92, $51 +db $1F, $02, $11, $03 +db $02 + +throwbomb_omega: +db $01, $1F, $02, $19 +db $70, $1c, $0d, $50, $a4, $98, $a2, $95, $a7, $50, $91, $50, $98, $91, $9e, $94 +db $98, $95, $9c, $94, $50, $9e, $a5, $93, $9c, $95, $91, $a2, $50, $92, $9f, $9d +db $92, $51 +db $1F, $02, $11, $03 +db $02 + +shootrocket_zeta: +db $01, $1F, $02, $19 +db $01, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $91, $50, $94, $a5, $94, $50 +db $92, $9f, $a4, $a4, $9c, $95, $50, $a2, $9f, $93, $9b, $95, $a4, $51 +db $1F, $02, $46, $03 +db $02 + +shootrocket_epsilon: +db $01, $1F, $02, $19 +db $01, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $91, $50, $a2, $9f, $9d, $91 +db $9e, $50, $93, $91, $9e, $94, $9c, $95, $51 +db $1F, $02, $46, $03 +db $02 + +shootrocket_alpha: +db $01, $1F, $02, $19 +db $01, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $91, $50, $92, $9f, $a4, $a4 +db $9c, $95, $50, $a2, $9f, $93, $9b, $95, $a4, $51 +db $1F, $02, $46 +db $03 +db $02 + +shootrocket_beta: +db $01, $1F, $02, $19 +db $01, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $91, $50, $94, $9f, $a5, $92 +db $9c, $95, $50, $92, $9f, $a4, $a4, $9c, $95, $50, $a2, $9f, $93, $9b, $95, $a4 +db $51 +db $1F, $02, $46, $03 +db $02 + +shootrocket_gamma: +db $01, $1F, $02, $19 +db $01, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $91, $50, $92, $99, $97, $50 +db $92, $9f, $a4, $a4, $9c, $95, $50, $a2, $9f, $93, $9b, $95, $a4, $51 +db $1F, $02, $46, $03 +db $02 + +shootrocket_omega: +db $01, $1F, $02, $19 +db $01, $70, $1c, $0d, $50, $a3, $98, $9f, $a4, $50, $91, $50, $a2, $95, $91, $9c +db $50, $97, $a5, $9e, $51 +db $1F, $02, $46, $03 +db $02 + +paralyz_pollen_lambda: +db $01, $1F, $02, $19 +db $01, $70, $1C, $0D, $50 +db $97, $9f, $a4, $50, $91, $50, $9c, $99, $a4, $a4, $9c, $95, $50, $a0, $9f, $9c +db $9c, $95, $9e, $50, $9f, $9e, $50, $a9, $9f, $a5, $51 +db $1F, $02, $52 +db $03 +db $02 + +paralyz_pollen_omega: +db $01, $1F, $02, $19 +db $01, $70, $1C, $0D, $50 +db $97, $9f, $a4, $50, $91, $50, $92, $a5, $9e, $93, $98, $50, $9f, $96, $50, $a0 +db $9f, $9c, $9c, $95, $9e, $50, $95, $a6, $95, $a2, $a9, $a7, $98, $95, $a2, $95 +db $51 +db $1F, $02, $52 +db $03 +db $02 + +vram_test_message: +db $01, $70 +db $77, $9F, $50, $97, $9F, $50, $97, $91, $94, $97, $95, $A4, $50, $94, $A9, $9E +db $91, $9D, $99, $93, $50, $A6, $A2, $91, $9D, $51, $03, $02 + +;New battle code +ORG $FD0000 +flaming_fireball_gamma: +REP #$31 +PHD +TDC +ADC #$FFF0 +TCD +LDA #$00FA +JML $C29016 + +flaming_fireball_beta: +REP #$31 +PHD +TDC +ADC #$FFF0 +TCD +LDA #$0096 +JML $C29016 + +flaming_fireball_alpha: +REP #$31 +PHD +TDC +ADC #$FFF0 +TCD +LDA #$005A +JML $C29016 + +check_status_types: +LDA $B587 +AND #$00FF +PHA +TAX +LDA StatusChecks,X +AND #$00FF +TAY +PLA +ASL +TAX +LDA StatusText,X +STA $B588 +LDX #$0000 +SEP #$20 +STZ $B587 +REP #$20 +JML $C28FCE + +check_diamond_types: +LDA $B587 +AND #$00FF +PHA +TAX +LDA DiamondChecks,X +AND #$00FF +TAY +PLA +ASL +TAX +LDA DiamondText,X +STA $B588 +LDX #$0000 +SEP #$20 +STZ $B587 +REP #$20 +JML $C28FCE + +check_status_text: +LDA $B588 +STZ $B588 +STA $0E +JML $C28FDE + +dirty_fang_asm: +LDA #$0001 +STA $B587 +STA $B588 +JML $C28F97 + +paralyz_byte_asm: +LDA #$0001 +STA $B587 +STA $B588 +JML $C2916E + +fire_zeta: +REP #$31 +LDA #$0014 +JML $C295B0 + +fire_epsilon: +REP #$31 +LDA #$0028 +JML $C295B0 + +freeze_zeta: +REP #$31 +LDA #$0010 +JML $C2964C + +freeze_epsilon: +REP #$31 +LDA #$0020 +JML $C2964C + +freeze_delta: +REP #$31 +LDA #$003C +JML $C2964C + +freeze_lambda: +REP #$31 +LDA #$0064 +JML $C2964C + +special_zeta: +REP #$31 +LDA #$000F +JML $C2955B + +special_epsilon: +REP #$31 +LDA #$001E +JML $C2955B + +paralyz_delta: +LDA #$0003 +STA $B587 +STA $B588 +JML $C29FFE + +para_stun: +LDA $B587 +AND #$00FF +BEQ .paralyze +LDY #$0004 +LDX #$0002 +BRA .stun +.paralyze: +LDY #$0003 +LDX #$0000 +.stun: +JML $C2A024 + +para_text: +LDA $B587 +AND #$00FF +BEQ .paralyze +LDA #$6BEF +BRA .stun +.paralyze: +LDA #$6AE0 +.stun: +STA $0E +STZ $B587 +STZ $B588 +JML $C2A034 + +thunder_zeta: +REP #$31 +LDX #$0001 +LDA #$0010 +JML $C29879 + +thunder_epsilon: +REP #$31 +LDX #$0002 +LDA #$0010 +JML $C29879 + +thunder_delta: +REP #$31 +LDX #$0003 +LDA #$0010 +JML $C29879 + +thunder_lambda: +REP #$31 +LDX #$0004 +LDA #$0010 +JML $C29879 + +starstorm_zeta: +REP #$31 +LDA #$0016 +JML $C29AAB + +starstorm_epsilon: +REP #$31 +LDA #$002D +JML $C29AAB + +starstorm_delta: +REP #$31 +LDA #$005A +JML $C29AAB + +starstorm_lambda: +REP #$31 +LDA #$00B4 +JML $C29AAB + +flaming_fireball_zeta: +REP #$31 +PHD +TDC +ADC #$FFF0 +TCD +LDA #$0014 +JML $C29016 + +flaming_fireball_epsilon: +REP #$31 +PHD +TDC +ADC #$FFF0 +TCD +LDA #$002D +JML $C29016 + +blast_alpha: +REP #$31 +LDA #$005A +JSR blast_common +RTL + +blast_beta: +REP #$31 +LDA #$00B4 +JSR blast_common +RTL + +blast_gamma: +REP #$31 +LDA #$010E +JSR blast_common +RTL + +blast_omega: +REP #$31 +LDA #$0168 +JSR blast_common +RTL + +missile_alpha: +REP #$31 +LDA #$0001 +JSR missile_common +RTL + +missile_beta: +REP #$31 +LDA #$0003 +JSR missile_common +RTL + +missile_gamma: +REP #$31 +LDA #$0005 +JSR missile_common +RTL + +missile_omega: +REP #$31 +LDA #$0014 +JSR missile_common +RTL + + + +blast_common: +REP #$31 +PHD +PHA +TDC +ADC #$FFEA +TCD +PLA +TAX +STX $1A +LDY #$941C +JSL goto_bank_c2 +CMP #$0000 +BNE .Return +LDY #$A657 +LDA $1A +JSL goto_bank_c2 + +.Return: +STZ $AA96 +PLD +RTS + +goto_bank_c2: +STA $00BC +STY $00BE +PEA $00B7 +SEP #$20 +LDA #$C2 +PHA +REP #$20 +PHY +LDA $00BC +LDY $00BE +RTL + +goto_bank_c1: +STA $00BC +STY $00BE +PEA $0034 +SEP #$20 +LDA #$C1 +PHA +REP #$20 +PHY +LDA $00BC +LDY $00BE +RTL + +missile_common: +REP #$31 +PHD +PHA +TDC +ADC #$FFEA +TCD +PLA +TAX +STX $1A +LDY #$941C +JSL goto_bank_c2 +CMP #$0000 +BNE .Return +LDY #$A579 +LDA $1A +JSL goto_bank_c2 +.Return: +STZ $AA96 +PLD +RTS + +;Y has the jump address + + + +psi_letters: +dw $008B ;alpha +dw $008C ;beta +dw $008D ;gamma +dw $008E ;sigma +dw $008F ;omega + +dw $00B2 ;Zeta +dw $00B3 ;Epsilon +dw $00B4 ;Delta +dw $00B5 ;Lambda + +blast_zeta: +REP #$31 +LDA #$0016 +JSR blast_common +RTL + +blast_epsilon: +REP #$31 +LDA #$002D +JSR blast_common +RTL + +missile_zeta: +REP #$31 +LDA #$0001 +STA $B5EB +JSR missile_common +STZ $B5EB +RTL + +missile_epsilon: +REP #$31 +LDA #$0003 +STA $B5EB +JSR missile_common +STZ $B5EB +RTL + +early_missile_damage: +PHA +LDA $B5EB +BEQ late_missile_damage +LDY #$0019 +late_missile_damage: +PLA +JML $C08FF7 + +code_test_load_enemyvram: +REP #$31 +LDA $AAB4 +CMP #$0004 +BCS .skip_vram_load ; 4 is the max enemies the game can handle. If we already loaded 4, ignore +LDA $9D11 +AND #$00FF +SEP #$20 +CMP $0782 +BEQ .skip_vram_load +CMP $0783 +BEQ .skip_vram_load +CMP $0784 +BEQ .skip_vram_load +CMP $0785 +BEQ .skip_vram_load ;If the enemy is already loaded, don't load it into a new slot +REP #$20 +JSR refresh_all_enemy_sprites ;Enemy sprites get cleared by things like PSI; they will corrupt if not refreshed +LDA #$0090 +LDY #$005E +INC $0780 +JSL goto_vramload +.skip_vram_load: +REP #$31 +JSL $C2C145 ;Do the enemy call +STZ $0780 +STZ $B5ED +RTL + +goto_vramload: +REP #$31 +PHD +TDC +ADC #$FFE2 +TCD +JML $C2EEF5 + +refresh_all_enemy_sprites: +LDA $AAB2 +STA $B5F5 +LDA $AAB4 +STA $B5F3 +STZ $AAB4 +STZ $AAB2 +LDA #$0000 +PHA +.LoadNext: +TAX +LDA $0782,X +AND #$00FF +JSR get_enemy_sprite +LDY #$EAE9 +JSL goto_bank_c2 +PLA +INC +CMP $B5F3 +BEQ .Done +PHA +BRA .LoadNext + +.Done: +LDA $B5F5 +STA $AAB2 +LDA $B5F3 +STA $AAB4 +RTS + +get_enemy_sprite: +TAX +LDA #$0000 +.CheckNext: +CPX #$0000 +BEQ .done +DEX +CLC +ADC #$005E +BRA .CheckNext +.done: +TAX +LDA $D595A5,X +RTS + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ORG $C28FC8 +JML check_status_types + +ORG $C28FD9 +JML check_status_text + +ORG $C291B6 +JML check_diamond_types + +ORG $C2A01E +JML para_stun + +ORG $C2A02F +JML para_text + +ORG $D5F9B0 +StatusChecks: +db $05, $07 + +DiamondChecks: +db $02, $03 + +StatusText: +dw $6B18, $6B2F + +DiamondText: +dw $6AC7, $6AE0 + +InvPointers: +dw $0000, $005F, $005F, $00BE, $011D + +ProgBats: +db $13, $14, $15, $D4, $16, $17, $D6, $1B, $18, $19, $1A + +ProgPans: +db $1C, $1D, $1E, $1F, $F8, $20, $22, $21 + +ProgGuns: +db $24, $25, $26, $27, $28, $29, $2A, $D7, $2B, $2C, $2D, $2E, $2F, $30 +;REPLACE BROKEN ONES IF NOT PREFIXED + +ProgBracelets: +db $40, $41, $42, $43, $44, $45, $46, $47, $48 + +ProgOther: +db $4A, $4C, $4B, $4D, $51, $52, $DD, $F9, $DE, $53, $54, $55, $56 + +ProgCaps: +db $0A, $07, $0D, $08, $0C + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Repointed PSI table +macro PSIAddress06(address) + LDA #$0000 + STA $06 + lda #$00F5 + sta $08 +endmacro + +macro PSIAddress0A(address) + LDA #$0000 + STA $0A + lda #$00F5 + sta $0C +endmacro + +ORG $C1C4AA + LDA #$013B + STA $06 + lda #$00F5 + sta $08;Change for PSI shuffle- this is Poo's toplevel offensive psi + +ORG $C1C548 + LDA #$014A + STA $06 + lda #$00F5 + sta $08;Change for PSI shuffle- this is Poo's toplevel offensive psi + +ORG $C1B694 +%PSIAddress06(NewPSI) + +ORG $C1B7CF +%PSIAddress06(NewPSI) + +ORG $C1B8F9 +%PSIAddress0A(NewPSI) + +ORG $C1BB34 +%PSIAddress0A(NewPSI) + +ORG $C1B8BB +LDA AllocPsiTable,X + +ORG $C1B9CC +LDA AllocPsiTable,X + +ORG $C1C243 +%PSIAddress06(NewPSI) + +ORG $C1C2AD +%PSIAddress06(NewPSI) + +ORG $C1C6E4 +%PSIAddress06(NewPSI) + +ORG $C1C8D6 +%PSIAddress06(NewPSI) + +ORG $C1C9D6 +LDA AllocPsiTable,X + +ORG $C1CADF +LDA AllocPsiTable,X + +ORG $C1CA12 +%PSIAddress06(NewPSI) + +ORG $C1CCB6 +LDA AllocPsiTable,X + +ORG $C1CD49 +LDA AllocPsiTable,X + +ORG $C1CD8F +%PSIAddress06(NewPSI) + +ORG $C1CE3B +LDA AllocPsiTable,X + +ORG $C1D7D6 +%PSIAddress06(NewPSI) + +ORG $C1D839 +%PSIAddress06(NewPSI) + +ORG $C1D89B +%PSIAddress06(NewPSI) + +ORG $C45EFE +LDA AllocPsiTable,X + +ORG $C45F1B +LDA AllocPsiTable,X + +ORG $C45F38 +LDA AllocPsiTable,X + +ORG $F5031B +db $02, $06, $00;fire z +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +db $02, $07, $00;Fire ep +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +;;;;;;;;;;;;;;;;;;;;;;;;; +db $03, $06, $00;freeze z +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +db $03, $07, $00;freeze e +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +db $03, $08, $00;freeze d +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +db $03, $09, $00;freeze l +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +;;;;;;;;;;;;;;;;;;;;;;;; +db $01, $06, $00;special z +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +db $01, $07, $00;special e +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +;;;;;;;;;;;;;;;;;;;;;;;; +db $0f, $09, $00;paralyze l +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +;;;;;;;;;;;;;;;;;;;;;;;; +db $04, $06, $00;thunder z +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +db $04, $07, $00;thunder e +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +db $04, $08, $00;thunder d +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +db $04, $09, $00;thunder l +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +;;;;;;;;;;;;;;;;;;;;;;;;;; +db $06, $06, $00;starstorm z +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +db $06, $07, $00;starstorm e +db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 + +db $06, $08, $01;starstorm d +db $02, $6F, $01, $00, $00, $00, $09, $00, $6C, $D1, $EE, $00 + +db $06, $09, $01;starstorm l +db $02, $70, $01, $00, $00, $00, $0B, $00, $A5, $D1, $EE, $00 + +db $13, $01, $01;blast a +db $02, $A4, $01, $00, $00, $00, $09, $00, $1C, $D2, $EE, $FF + +db $13, $02, $01;blast b +db $02, $A5, $01, $00, $00, $00, $0B, $00, $6C, $D2, $EE, $FF + +db $13, $03, $01;blast g +db $02, $A6, $01, $00, $00, $00, $0D, $00, $BD, $D2, $EE, $FF + +db $13, $05, $01;blast o +db $02, $A7, $01, $00, $00, $00, $0F, $00, $0E, $D3, $EE, $FF +;;;;;;;;;;;;;;;;;;;;;;;;;;; +db $14, $01, $01;missile a +db $02, $A8, $01, $00, $00, $00, $09, $00, $5F, $D3, $EE, $FF + +db $14, $02, $01;missile b +db $02, $A9, $01, $00, $00, $00, $0B, $00, $86, $D4, $EE, $FF + +db $14, $03, $01;missile g +db $02, $AA, $01, $00, $00, $00, $0D, $00, $93, $D4, $EE, $FF + +db $14, $05, $01;missile o +db $02, $AB, $01, $00, $00, $00, $0F, $00, $A0, $D4, $EE, $FF +;;;;;;;;;;;;;;;;;;;;;;;;;;; +db $15, $01, $04;defense up a +db $02, $DD, $01, $00, $00, $00, $09, $00, $E6, $E3, $EE, $FF + +db $15, $05, $04;defense up o +db $02, $DE, $01, $00, $00, $00, $09, $00, $33, $E4, $EE, $FF +;;;;;;;;;;;;;;;;;;;;;;;;;; +db $16, $01, $04;drain a +db $02, $DF, $01, $00, $00, $00, $09, $00, $7E, $E4, $EE, $FF + +db $16, $05, $04;drain o +db $02, $E0, $01, $00, $00, $00, $09, $00, $C6, $E4, $EE, $FF +;;;;;;;;;;;;;;;;;;;;;;;; +db $17, $01, $04;disable a +db $02, $E1, $01, $00, $00, $00, $09, $00, $19, $E5, $EE, $FF + +db $17, $05, $04;disable o +db $02, $E2, $01, $00, $00, $00, $09, $00, $52, $E5, $EE, $FF +;;;;;;;;;;;;;;;;;;;;;; +db $18, $01, $04;stop a +db $02, $E3, $01, $00, $00, $00, $09, $00, $8D, $E5, $EE, $FF + +db $18, $05, $04;stop o +db $02, $E4, $01, $00, $00, $00, $09, $00, $A4, $E5, $EE, $FF +;;;;;;;;;;;;;;;;;;;;;;; +db $19, $01, $04;neutralize a +db $02, $E5, $01, $00, $00, $00, $09, $00, $BD, $E5, $EE, $FF + +db $19, $05, $04;neutralize o +db $02, $E6, $01, $00, $00, $00, $09, $00, $FA, $E5, $EE, $FF +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +db $13, $06, $01;blast z +db $02, $A4, $01, $00, $00, $00, $09, $00, $1C, $D2, $EE, $FF + +db $13, $07, $01;blast e +db $02, $A5, $01, $00, $00, $00, $0B, $00, $6C, $D2, $EE, $FF +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +db $14, $06, $01;missile z +db $02, $A8, $01, $00, $00, $00, $09, $00, $5F, $D3, $EE, $FF + +db $14, $07, $01;missile e +db $02, $A8, $01, $00, $00, $00, $09, $00, $5F, $D3, $EE, $FF + + +;;;;;;;;;;;;;;; +;PSI ANIMATIONS +ORG $F50000 +;Table of all PSI attacks +AllocPsiTable: + +ORG $EF8580 +db $0A, $00, $00, $FB + +ORG $FB0000 +db $1F, $C0, $5B; number of anims + +ORG $FB00CB +dd $00EF88E9; Teleport 1. change to a $02 +dd $00EF88E9;Teleport 2. change to a $02 + +dd $00EF874A ;Fire zeta +dd $00EF874A ; Fire epsilon + +dd $00EF87AC ;Freeze zeta +dd $00EF87AC ;Freeze epsilon +dd $00EF87AC ;Freeze Delta +dd $00EF87AC ;Freeze Lambda + +dd $00EF864C ;Special zeta +dd $00EF864C ;Special epsilon + +dd $00EF899C ;Paralysis delta + +dd $00EF8813 ;thunder zeta +dd $00EF8813 ;thunder epsilon +dd $00EF8813 ;thunder Delta +dd $00EF8813 ;thunder Lambda + +dd $00EF8882;Starstorm zeta +dd $00EF8882;starstorm epsilon +dd $00EF8882 ;starstorm lambda +dd $00EF8882 ;starstorm delta + +dd blast_alpha_anim;Blast alpha +dd blast_beta_anim;Blast beta +dd blast_gamma_anim;Blast gamma +dd blast_omega_anim;Blast gamma + +dd missile_alpha_anim +dd missile_beta_anim +dd missile_gamma_anim +dd missile_omega_anim + +dd $00EF88E9;Defense up alpha +dd $00EF88E9;Def up omega + +dd drain_alpha_anim;Drain alpha +dd drain_omega_anim;Drain omega + +dd disable_anim;Disable alpha +dd disable_anim;Disable omega + +dd $00EF88E9;Stop alpha +dd $00EF88E9;Stop omega + +dd neutralize_anim;Neutralize alpha +dd $00EF88E9;Neutralize omega + +dd blast_alpha_anim;Blast alpha +dd blast_alpha_anim;Blast beta + +dd missile_alpha_anim;Missile Zeta +dd missile_alpha_anim;Missile Epsilon + +db $02 + +PSINameTable: + +;Extended PSI names +ORG $FB06A9 +db $80, $83, $79, $50, $87, $91, $a6, $95, $50;PSI Wave + +ORG $FB06C2 +db $80, $83, $79, $50, $72, $9C, $91, $A3, $A4, $50;PSI Blast + +ORG $FB06DB +db $80, $83, $79, $50, $7D, $99, $A3, $A3, $99, $9C, $95, $50;PSI Missile + +ORG $FB06F4 +db $74, $95, $96, $95, $9E, $A3, $95, $50, $A5, $A0, $50;Defense up + +ORG $FB070D +db $74, $A2, $91, $99, $9E, $50;Drain + +ORG $FB0726 +db $74, $99, $A3, $91, $92, $9C, $95, $50;Disable + +ORG $FB073F +db $83, $A4, $9F, $A0, $50;Stop + +ORG $FB0758 +db $7E, $95, $A5, $A4, $A2, $91, $9C, $99, $AA, $95, $50;Neutralize + +ORG $FB0771 + +;These are the *script commands* that play the new PSI animations. +blast_alpha_anim: +db $1f, $02, $34, $1c, $13, $00, $37, $10, $17, $1f, $02, $5b, $10, $10, $1f, $02 +db $33, $10, $14, $1c, $13, $25, $00, $10, $01, $10, $01, $02 + +blast_beta_anim: +db $1f, $02, $34, $1c, $13, $00, $38, $10, $17, $1f, $02, $5b, $10, $10, $1f, $02 +db $33, $10, $14, $1c, $13, $25, $00, $10, $0f, $10, $10, $02 + +blast_gamma_anim: +db $1f, $02, $34, $1c, $13, $00, $39, $10, $17, $1f, $02, $5b, $10, $10, $1f, $02 +db $33, $10, $14, $1c, $13, $25, $00, $10, $0f, $10, $10, $02 + +blast_omega_anim: +db $1f, $02, $34, $1c, $13, $00, $3A, $10, $17, $1f, $02, $5b, $10, $10, $1f, $02 +db $33, $10, $14, $1c, $13, $25, $00, $10, $0f, $10, $10, $02 + +missile_alpha_anim: +db $1f, $02, $46, $1c, $13, $00, $3B, $10, $04, $1f, $02, $01, $1c, $13, $2b, $00 +db $10, $0f, $02 + +missile_beta_anim: +db $1f, $02, $46, $10, $05, $1f, $02, $46, $10, $05, $1f, $02, $46, $1c, $13, $00 +db $3c, $10, $04, $1f, $02, $01, $1c, $13, $2b, $00, $10, $0f, $02 + +missile_gamma_anim: +db $1f, $02, $46, $10, $02, $1f, $02, $46, $10, $02, $1f, $02, $46, $10, $02, $1f +db $02, $46, $10, $02, $1f, $02, $46, $10, $02, $1c, $13, $00, $3d, $10, $04, $1f +db $02, $01, $1c, $13, $2b, $00, $02 + +missile_omega_anim: +db $1f, $02, $46, $10, $02, $1f, $02, $46, $10, $02, $1f, $02, $46, $10, $02, $1f +db $02, $46, $10, $02, $1f, $02, $46, $10, $02, $1f, $02, $46, $10, $02, $1f, $02 +db $46, $10, $02, $1f, $02, $46, $10, $02, $1f, $02, $46, $10, $02, $1f, $02, $46 +db $10, $02, $1f, $02, $46, $10, $02, $1f, $02, $46, $10, $02, $1f, $02, $46, $10 +db $02, $1f, $02, $46, $10, $02, $1f, $02, $46, $10, $02, $1c, $13, $00, $3e, $10 +db $04, $1f, $02, $01, $1c, $13, $2b, $00, $02 + +drain_alpha_anim: +db $1f, $02, $3b, $1c, $13, $00, $04, $10, $3c, $03, $02 + +drain_omega_anim: +db $1f, $02, $3b, $1c, $13, $00, $1e, $10, $3c, $03, $02 + +disable_anim: +db $1f, $02, $36, $10, $1e, $1c, $13, $00, $01, $10, $3c, $03, $02 + +neutralize_anim: +db $1f, $02, $63, $1c, $13, $00, $1b, $10, $3c, $03, $02 + +hypnosis_alpha_item_anim: +db $01, $70, $1c, $0d, $19, $1f, $1b, $04, $16, $ac, $16, $47, $00, $50, $50, $1c +db $05, $00, $51, $03, $0a, $5c, $89, $ef + +hypnosis_omega_item_anim: +db $01, $70, $1c, $0d, $19, $1f, $1b, $04, $16, $ac, $16, $47, $00, $50, $50, $1c +db $05, $00, $51, $03, $0a, $6c, $89, $ef + +paralysis_alpha_item_anim: +db $01, $70, $1c, $0d, $19, $1f, $1b, $04, $16, $ac, $16, $47, $00, $50, $50, $1c +db $05, $00, $51, $03, $0a, $9c, $89, $ef + +paralysis_omega_item_anim: +db $01, $70, $1c, $0d, $19, $1f, $1b, $04, $16, $ac, $16, $47, $00, $50, $50, $1c +db $05, $00, $51, $03, $0a, $ac, $89, $ef + +defdown_alpha_item_anim: +db $01, $70, $1c, $0d, $19, $1f, $1b, $04, $16, $ac, $16, $47, $00, $50, $50, $1c +db $05, $00, $51, $03, $0a, $3c, $89, $ef + +defdown_omega_item_anim: +db $01, $70, $1c, $0d, $19, $1f, $1b, $04, $16, $ac, $16, $47, $00, $50, $50, $1c +db $05, $00, $51, $03, $0a, $4c, $89, $ef + +brainshock_alpha_item_anim: +db $01, $70, $1c, $0d, $19, $1f, $1b, $04, $16, $ac, $16, $47, $00, $50, $50, $1c +db $05, $00, $51, $03, $0a, $bc, $89, $ef + +brainshock_omega_item_anim: +db $01, $70, $1c, $0d, $19, $1f, $1b, $04, $16, $ac, $16, $47, $00, $50, $50, $1c +db $05, $00, $51, $03, $0a, $ce, $89, $ef + + +ORG $C1C423 +LDA #$0500 +STA $06 +LDA #$00FB +STA $08 + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;psi symbol extensions +macro GreekLetter06(address) + LDA.w #psi_letters + STA $06 + lda #$00FD + sta $08 +endmacro + +ORG $C1C4F8 +%GreekLetter06(address) + +ORG $C1C569 +%GreekLetter06(address) + +ORG $C1C695 +%GreekLetter06(address) + +ORG $C1C78D +%GreekLetter06(address) + +ORG $C1C7FE +;%GreekLetter06(address) + +ORG $c1ca53 +%GreekLetter06(address) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;font stuff +ORG $C3F054 +dd FontDataTable + +ORG $C3F058 +dd FontGFXTable + +ORG $C3F060 +dd SaturnFontTable + +ORG $C3F064 +dd SaturnFontGFX + +ORG $FA0000 +FontDataTable: + +ORG $FA0060 +FontExtensionData: +;Font Widths +db $05; _ +db $04 ;< +db $06 ;Ζ +db $03 ;ε +db $04 ;δ +db $05 ;λ +db $06 ;& +db $06 ;# +db $05 ;arrows +db $06 ;n +db $05 ;ä +db $05 ;é + +ORG $FA0100 +SaturnFontTable: + +ORG $FA0160 +SaturnExtensionData: +db $0A; _ +db $08;< +db $0B +db $0B +db $0B +db $0B +db $0D +db $0B +db $0B +db $09 +db $08 +db $0B + +ORG $FC0000 +FontGFXTable: + +ORG $FC0C00 +incbin main_font_extended.bin + + +ORG $FC1000 +SaturnFontGFX: + +ORG $FC1C00 +incbin saturn_font_extended.bin +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;PSI Animations +ORG $C3F98D +JMP $FE00 + +ORG $C3FE00 + CMP #$FFFF + BEQ $18 + CMP #$0023 + BCC $0B + CMP #$0036 + BCS $03 + JMP $F99B + SBC #$0014 + STA $02 + LDA $02 + JSL $C2E116 + JMP $FAC7 + +ORG $C2E34F + LDA #$0000 + STA $06 + LDA #$00F6 + STA $08 + +ORG $C2E461 + LDA #$0400 + STA $06 + LDA #$00F6 + STA $08 + +ORG $C2E2F4 + LDA #$0600 + STA $06 + LDA #$00F6 + STA $08 + +ORG $C2E154 +dl new_psi_anims + +ORG $C2E1BB +dl new_psi_anims + +ORG $C2E50A +dl new_psi_anims + +ORG $F60000 +new_psi_anims: + +ORG $F60198 +;Headers for new PSI. Blast alpha. +db $25, $AC, $04, $03, $01, $03, $0e, $00, $19, $32, $9c, $0a +;Blast beta +db $25, $AC, $04, $03, $01, $03, $0e, $00, $19, $32, $9c, $0a +;Blast Gamma +db $25, $AC, $04, $03, $01, $03, $10, $00, $19, $32, $9c, $0a +;Blast Omega +db $25, $AC, $04, $03, $01, $03, $10, $00, $19, $32, $9c, $0a + +;Missile +db $27, $DB, $02, $03, $01, $03, $06, $00, $05, $19, $d4, $4b +db $27, $DB, $02, $03, $01, $03, $0B, $00, $05, $19, $d4, $4b +db $27, $DB, $02, $03, $01, $03, $0A, $00, $05, $19, $d4, $4b +db $27, $DB, $02, $03, $01, $03, $0E, $00, $05, $19, $d4, $4b + +ORG $F60400 +animation_pointer_table: + +ORG $F60488 +dd $00F70000;Blast A +dd $00F701F7; Blast b +dd $00F70413; Blast g +dd $00F70679; Blast o +dd $00F70953; Missile a +dd $00F70A4F; Missile B +dd $00F70B85; Missile g +dd $00F70CCE; Missile o + + +ORG $F60600 +animation_palette_table: + +ORG $F60710 +db $00, $00, $9c, $0a, $75, $19, $bf, $63;Blast palette +db $00, $00, $9c, $0a, $75, $19, $bf, $63;Blast palette +db $00, $00, $9c, $0a, $75, $19, $bf, $63;Blast Gamma +db $00, $00, $9c, $0a, $75, $19, $bf, $63;Blast Omega + +db $00, $00, $d4, $4b, $e5, $09, $ff, $7f;Missile alpha +db $00, $00, $d4, $4b, $e5, $09, $ff, $7f +db $00, $00, $d4, $4b, $e5, $09, $ff, $7f +db $00, $00, $d4, $4b, $e5, $09, $ff, $7f; Missile omega + +ORG $F70000 +incbin psi_animations.bin ;this is specifically new animations i drew + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;expanded SRAM +sramchunk0_pointer = $97F5 +sram_chunk0_size = $0493 + +sramchunk1_pointer = $B570 +sramchunk1_size = $0010; ap related stuff + +sram_chunk2_pointer = $B590 +sramchunk2_size = $0080 ;Expanded storage space + +sram_chunk3_pointer = $B620 +sramchunk3_size = $01C0; Expanded flags + +sramchunk4_pointer = $31D0 +sramchunk4_size = $0100 + +sramchunk5_pointer = $000D4 +sramchunk5_size = $00AC + +!save_size = #$AA0 +!save_bytes = #$A80 + +check_corruption = $7E9F79 +memcopy = $C08EED +mult16 = $C09032 +erase_save = $EF05A9 +copy_save = $EF06A2 +validate_checksum = $EF07C0 +save_game = $EF088F +save_checksum_1 = $EF0734 +save_checksum_2 = $EF077B + +save_chunk_sizes = $EF0A52 +save_chunk_pointers = $EF0A5C + +;delete save +ORG $EF05B3 +LDY !save_size + +ORG $EF05DD +LDX !save_size + +ORG $EF063D +LDY !save_size + +ORG $EF069B +CPX #$0003 + +;copy save +ORG $EF06B8 +LDY !save_size + +ORG $EF06E2 +LDY !save_size + +ORG $EF072B +LDA !save_size +;;;;;;;;; +ORG $EF073E +LDY !save_size + +ORG $EF0773 +CMP !save_bytes +;;;;;;;;;;;;;;;;;;; +ORG $EF0785 +LDY !save_size + +ORG $EF079F +CalcChecksum: +LDY #$0000 +STY $02 + .Loop: + LDA [$06],y + EOR $02 + STA $02 + INY + INY + CPY !save_bytes + BCC .Loop +PLD +RTS +;;;;;;;;;;;;;;; +ORG $EF07DB +LDY !save_size + +ORG $EF082F +CheckCorruptedSave: +STA $10 +JSR validate_checksum +CMP #$0000 +BEQ .Return +.SaveCorrupted: +LDA $10 +JSR erase_save +LDX $10 +SEP #$20 +LDA $EF05A6,X +ORA.w check_corruption +STA.w check_corruption +REP #$20 +.Return: +PLD +RTS + +ORG $EF0899 +SaveGame: +STA $20 +.RetrySave: +LDX $00A7 +LDY $00A9 +STX $99C9 +STY $99CB +LDY !save_size +JSL mult16 +STA $16 +CLC +ADC #$6020 +STA $0E +LDA #$0030 +STA $10 +LDA #$007E +STA $14 +LDX #$0000 +.ChunkCheck: +LDA.l save_chunk_pointer_table,X +BEQ .EndofChunk +STA $12 +LDA.l save_chunk_size_table,x +JSL memcopy +LDA.l save_chunk_size_table,x +ADC $0E +STA $0E +INX +INX +BRA .ChunkCheck +.EndofChunk: +LDA $20 +JSR save_checksum_1 +STA $1A +LDA $20 +JSR save_checksum_1 +CMP $1A +BEQ .Valid +JMP .RetrySave +.Valid: +LDX $16 +STA $30601C,X + +LDA $20 +JSR save_checksum_2 +STA $1A +LDA $20 +JSR save_checksum_2 +CMP $1A +BEQ .Valid2 +JMP .RetrySave +.Valid2: +LDX $16 +STA $30601E,X +PLD +RTS + +ORG $EF0A4D +JSR save_game +RTL +NOP + +;;;;;;;;;;;;;;;;;;;;; +ORG $EF0A72 +LoadGame: +LDY !save_size +JSL mult16 +CLC +ADC #$6020 +STA $12 +LDA #$0030 +STA $14 +LDA #$007E +STA $10 +LDX #$0000 +.ChunkCheck: +LDA.l save_chunk_pointer_table,X +BEQ .ChunkEnd +STA $0E +LDA.l save_chunk_size_table,X +JSL memcopy +LDA.l save_chunk_size_table,X +ADC $12 +STA $12 +INX +INX +BRA .ChunkCheck +.ChunkEnd: +LDA $99C9 +STA $00A7 +LDA $99CB +STA $00A9 +PLD +RTL + +ORG $EF0BA6 +LDA !save_bytes + +ORG $EF0BB8 +CMP !save_bytes + +ORG $EF0BFA +JSR erase_save +RTL + +ORG $EF0C15 +JSR copy_save +RTL +;;;;;;;;;;;;;;; +;expand event flags + +new_flag_table = $7EB620 +new_flag_pointer_0x80 = $7EB5A0 +flag_size = $01C0 +total_flag_bytes = $0240 + + +ORG $C21628 +GetEventFlag: +JML RepelEnemies +ExitRepelCheck: +AND #$0007 +TAX +LDA $C4562F,X +PHA +TYA +LSR +LSR +LSR +TAX +PLA +CPX.w #total_flag_bytes +BMI .outofrange +JMP .GetFlagReturnZero +.outofrange: +CPX #$0080 +BPL .Inrange +AND $9C08,X +BRA .loadflag +.Inrange: +AND.w new_flag_pointer_0x80,x +.loadflag: +AND #$00FF +BEQ .GetFlagReturnZero +.ForceFlagOn: +LDA #$0001 +RTL +.GetFlagReturnZero: +LDA #$0000 +RTL +NOP + +SetFlag: +JML SetMelodyCount +SetFlagProceed: +LSR +LSR +CMP.w #total_flag_bytes +BMI .outofrange +PLA +JMP $1659 +.outofrange: +CMP #$0080 +CLC +BPL .addflags +ADC #$9C08 +BRA .label +.addflags: +ADC.w #new_flag_pointer_0x80 +.label +TAY +PLA +PHX +AND #$0007 +TAX +LDA $C4562F,x +AND #$00FF +PLX +BEQ .WriteFlag +ORA $0000,Y +BRA .Store +.WriteFlag +EOR #$FFFF +AND $0000,Y +.Store: +STA $0000,y +AND #$00FF +RTL +NOP +NOP +NOP +NOP +NOP +NOP +NOP +NOP +NOP +NOP +NOP +NOP +NOP +RTL + +ORG $F20000 +;Escargo express intro text +ExpressText: +db $70, $84, $98, $91, $9e, $9b, $50, $a9, $9f, $a5, $50, $96, $9f, $a2, $50, $93 +db $91, $9c, $9c, $99, $9e, $97, $50, $75, $a3, $93, $91, $a2, $97, $9f, $50, $75 +db $a8, $a0, $a2, $95, $a3, $a3, $51, $03, $00, $70, $85, $9e, $96, $9f, $a2, $a4 +db $a5, $9e, $91, $a4, $95, $9c, $a9, $5c, $10, $04, $50, $9f, $a5, $a2, $50, $99 +db $a4, $95, $9d, $50, $a3, $a4, $9f, $a2, $91, $97, $95, $50, $a3, $95, $a2, $a6 +db $99, $93, $95, $a3, $50, $98, $91, $a6, $95, $50, $92, $95, $95, $9e, $50, $a3 +db $a5, $a3, $a0, $95, $9e, $94, $95, $94, $5e, $03, $00, $70, $79, $96, $50, $a9 +db $9f, $a5, $50, $9e, $95, $95, $94, $50, $a4, $9f, $50, $a3, $a4, $9f, $a2, $95 +db $50, $91, $9e, $50, $99, $a4, $95, $9d, $5c, $50, $a0, $9c, $95, $91, $a3, $95 +db $50, $98, $91, $9e, $97, $50, $a5, $a0, $50, $91, $9e, $94, $50, $a0, $a2, $95 +db $a3, $a3, $50, $a4, $98, $95, $50, $82, $50, $92, $a5, $a4, $a4, $9f, $9e, $5e +db $03, $00 + +escg_mainmen: +db $70, $79, $96, $50, $a9, $9f, $a5, $50, $91, $a2, $95, $50, $93, $91, $9c, $9c +db $99, $9e, $97, $50, $91, $92, $9f, $a5, $a4, $50, $9f, $a5, $a2, $50, $9f, $96 +db $96, $5d, $a7, $9f, $a2, $9c, $94, $50, $99, $a4, $95, $9d, $50, $94, $95, $9c +db $99, $a6, $95, $a2, $a9, $50, $a3, $95, $a2, $a6, $99, $93, $95, $5c, $03, $00 +db $70, $a3, $a0, $95, $93, $99, $96, $a9, $50, $a9, $9f, $a5, $a2, $50, $a2, $95 +db $a1, $a5, $95, $a3, $a4, $50, $9e, $9f, $a7, $5e, $03, $00 +db $0A +dl Gift_menu_Gift_menu_init +db $19, $02 +db $77, $99, $96, $a4, $99, $9e, $97, $02 +db $19, $02 +db $83, $95, $a2, $a6, $95, $a2, $50, $a3, $a4, $9f, $a2, $91, $97, $95, $02 +db $1C, $07, $02, $11 +db $09, $02 +dd Gift_menu +dd Server_Storage +db $12 +db $0A +dl $C75929 +Gift_menu: + db $12 + db $08 + dd escg_inquire + .Gift_menu_init: + db $01 + db $19, $02 + db $83, $95, $9E, $94, $50, $97, $99, $96, $A4, $02 + db $19, $02 + db $82, $95, $93, $95, $99, $a6, $95, $50, $97, $99, $96, $a4, $02 + db $1C, $07, $02, $11 + db $09, $02 + dd .SendGiftText + dd .GetGiftText + db $12 + db $01 + db $0A + dl $C75929 + .SendGiftText: + db $06, $14, $04 + dd .GiftOutboxFull + + ;Todo; write a way here to check whether or not our Gift Buffer is full + db $0E, $01 + db $0D, $01 + db $1B, $05 + db $12 + db $70, $87, $98, $9f, $50, $a7, $9f, $a5, $9c, $94, $50, $a9, $9f, $a5, $50, $9c + db $99, $9b, $95, $50, $a4, $9f, $50, $a3, $95, $9e, $94, $50, $91, $50, $97, $99 + db $96, $a4, $50, $a4, $9f, $6f + db $1C, $18, $00 + db $18, $03, $01, $01 + db $1B, $06 + db $1b, $02 + dd Gift_menu + ;;;;;;;;;;;;; + .open_gift_selector: + db $70, $7f, $9b, $91, $a9, $5e, $10, $10, $50, $87, $98, $91, $a4, $50, $a7, $9f + db $a5, $9c, $94, $50, $a9, $9f, $a5, $50, $9c, $99, $9b, $95, $50, $a4, $9f, $50 + db $a3, $95, $9e, $94, $6f, $03 + .gift_item_picker: + db $08, $56, $e4, $c5, $ff + db $1B, $02 + dd .SendGiftText ; The player pressed b + db $1B, $05 + db $19, $19, $00, $00 ;Return the item name we selected + db $1B, $00 ;Store all current memory values + db $1C, $19, $01 + db $70 + db $10, $0A + db $1B, $02 + dd .banned_item + .gift_okay: + db $1B, $01 ; Get the memory we used earlier + + db $89, $9f, $a5, $57, $94, $50, $9c, $99, $9b, $95, $50, $a4, $9f, $50, $a3, $95 + db $9e, $94, $50, $a4, $98, $95, $50, $1c, $05, $00, $6f + db $01 + db $19, $02 + db $89, $95, $A3, $02 + db $19, $02 + db $7E, $9F, $02 + db $1C, $07, $02 + db $11 + db $12 + db $09, $02 + dd .send_gift_to_gift_buffer + dd .declined_to_send_gift + db $0A + dl .declined_to_send_gift + .send_gift_to_gift_buffer: + db $18, $04 + db $1C, $28, $01 + db $1F, $00, $01, $59 + db $1f, $15, $87, $00, $99, $02, $01 + db $10, $05 + db $1F, $13, $FF, $03 + db $10, $20 + db $1F, $03 + db $1C, $29, $01 + db $18, $01, $01 + db $1b, $06 + db $1F, $02, $76 + db $10, $15 + db $1D, $0F, $00, $00 + db $1B, $05 + db $1C, $1A, $01 + db $70 + db $89, $9f, $a5, $a2, $50, $97, $99, $96, $a4, $50, $a0, $91, $93, $9b, $91, $97 + db $95, $50, $98, $91, $a3, $50, $92, $95, $95, $9e, $50, $93, $9f, $9e, $96, $99 + db $a2, $9d, $95, $94, $5e, $10, $10, $50, $79, $a4, $50, $a7, $99, $9c, $9c, $50 + db $92, $95, $50, $a3, $95, $9e, $a4, $50, $a3, $98, $9f, $a2, $a4, $9c, $a9, $5e + db $03, $01, $70, $71, $9e, $50, $71, $a2, $93, $98, $99, $a0, $95, $9c, $91, $97 + db $9f, $50, $a3, $95, $a2, $a6, $95, $a2, $50, $93, $9f, $9e, $9e, $95, $93, $a4 + db $99, $9f, $9e, $50, $99, $a3, $50, $a2, $95, $a1, $a5, $99, $a2, $95, $94, $50 + db $a4, $9f, $50, $a3, $95, $9e, $94, $50, $97, $99, $96, $a4, $a3, $5e, $03, $01 + db $70, $79, $96, $50, $a9, $9f, $a5, $a2, $50, $97, $99, $96, $a4, $50, $99, $a3 + db $50, $a5, $9e, $91, $92, $9c, $95, $50, $a4, $9f, $50, $92, $95, $50, $91, $93 + db $93, $95, $a0, $a4, $95, $94, $5c, $50, $a9, $9f, $a5, $50, $a7, $99, $9c, $9c + db $50, $92, $95, $50, $91, $92, $9c, $95, $50, $a4, $9f, $50, $a2, $95, $a4, $a2 + db $99, $95, $a6, $95, $50, $99, $a4, $50, $98, $95, $a2, $95, $5e, $03 + db $01, $70 + db $87, $9f, $a5, $9c, $94, $50, $a9, $9f, $a5, $50, $9c, $99, $9b, $95, $50, $a4 + db $9f, $50, $a3, $95, $9e, $94, $50, $91, $9e, $9f, $a4, $98, $95, $a2, $50, $97 + db $99, $96, $a4, $6f + db $01 + db $19, $02 + db $89, $95, $A3, $02 + db $19, $02 + db $7E, $9F, $02 + db $1C, $07, $02 + db $11 + db $12 + db $09, $02 + dd .SendGiftText + dd escg_mainmen + db $0A + dl escg_mainmen + + db $02 + .declined_to_send_gift: + db $70, $10, $0, $84, $98, $95, $9e, $5c, $10, $05, $50, $a7, $9f, $a5, $9c, $94 + db $50, $a9, $9f, $a5, $50, $9c, $99, $9b, $95, $50, $a4, $9f, $50, $a3, $95, $9e + db $94, $50, $a3, $9f, $9d, $95, $a4, $98, $99, $9e, $97, $50, $95, $9c, $a3, $95 + db $6f + db $01 + db $19, $02 + db $89, $95, $A3, $02 + db $19, $02 + db $7E, $9F, $02 + db $19, $02 + db $72, $A9, $95, $02 + db $1C, $07, $03 + db $11 + db $12 + db $09, $03 + dd .open_gift_selector + dd .parse_gift_okay + dd $C7DE3D + .parse_gift_okay: + db $70 + db $0A + dl .gift_okay + + .banned_item: + db $79, $57, $9d, $50, $a3, $9f, $a2, $a2, $a9, $5c, $10, $06, $50, $92, $a5, $a4 + db $50, $a4, $98, $99, $a3, $50, $99, $a4, $95, $9d, $50, $93, $91, $9e, $9e, $9f + db $a4, $50, $a0, $9f, $a3, $a3, $99, $92, $9c, $a9, $50, $92, $95, $50, $97, $99 + db $a6, $95, $9e, $50, $91, $a7, $91, $a9, $5e, $03, $00, $70, $80, $9c, $95, $91 + db $a3, $95, $50, $93, $98, $9f, $9f, $a3, $95, $50, $a3, $9f, $9d, $95, $a4, $98 + db $99, $9e, $97, $50, $95, $9c, $a3, $95, $5e, $03 + db $0A + dl .gift_item_picker + .GetGiftText: + db $1C, $21, $12 + db $12 + db $1C, $1C, $01 + db $1B, $06 + db $1B, $02 + dd .NoGiftsToReceive + db $01 + db $1B, $00 + db $0B, $01 + db $1b, $03 + dd .SingularGiftText + db $1B, $01 + db $1B, $04 + db $70 + db $84, $98, $95, $a2, $95, $50, $91, $a2, $95, $50, $93, $a5, $a2, $a2, $95, $9e + db $a4, $9c, $a9, $50, $1c, $0a, $00, $00, $00, $00, $50, $97, $99, $96, $a4, $a3 + db $50, $99, $9e, $50, $a9, $9f, $a5, $a2, $50, $99, $9e, $92, $9f, $a8, $5e, $03 + db $01, $70, $87, $98, $91, $a4, $50, $a7, $9f, $a5, $9c, $94, $50, $a9, $9f, $a5 + db $50, $9c, $99, $9b, $95, $6f + .GiftUnionizer: + db $03 + db $1C, $1B, $01 + db $1A, $07 + db $1B, $05 + db $18, $03, $0D + db $18, $00 + db $18, $03, $01 + db $1B, $06 + db $1B, $02 + dd .return_from_get + db $1B, $04 + + db $19, $1A, $00 + db $1B, $05 + .GetGiftChar: + db $0E, $00 + db $1B, $04 + db $70, $87, $9f, $a5, $9c, $94, $50, $a9, $9f, $a5, $50, $9c, $99, $9b, $95, $50 + db $a4, $98, $95, $50, $1c, $05, $00, $6f + db $01 + db $19, $02 + db $7B, $95, $95, $A0, $02 + db $19, $02 + db $84, $9F, $A3, $A3, $02 + db $19, 02 + db $72, $91, $93, $9B, $02 + db $1C, $07, $03 + db $11 + db $09, $03 + dd .AcceptGift + dd .TossGift + dd .return_from_get + db $0A + dl .return_from_get + + db $02 + + .GiftOutboxFull: + db $12 + db $01 + db $70, $79, $57, $9d, $50, $a3, $9f, $a2, $a2, $a9, $5c, $10, $04, $50, $92, $a5 + db $a4, $50, $a9, $9f, $a5, $a2, $50, $97, $99, $96, $a4, $50, $a1, $a5, $95, $a5 + db $95, $50, $99, $a3, $50, $96, $a5, $9c, $9c, $5e, $03, $01, $70, $80, $9c, $95 + db $91, $a3, $95, $50, $93, $9f, $9e, $9e, $95, $93, $a4, $50, $a4, $9f, $50, $91 + db $9e, $50, $71, $a2, $93, $98, $99, $a0, $95, $9c, $91, $97, $9f, $50, $a3, $95 + db $a2, $a6, $95, $a2, $50, $a3, $9f, $50, $a9, $9f, $a5, $a2, $50, $97, $99, $96 + db $a4, $a3, $50, $93, $91, $9e, $50, $92, $95, $50, $a0, $a2, $9f, $93, $95, $a3 + db $a3, $95, $94, $5e, $03 + db $01 + db $0A + dl Gift_menu + + .NoGiftsToReceive: + db $70, $79, $57, $9d, $50, $a3, $9f, $a2, $a2, $a9, $5c, $10, $05, $50, $92, $a5 + db $a4, $50, $a9, $9f, $a5, $50, $94, $9f, $50, $9e, $9f, $a4, $50, $93, $a5, $a2 + db $a2, $95, $9e, $a4, $9c, $a9, $50, $98, $91, $a6, $95, $50, $91, $9e, $a9, $50 + db $97, $99, $96, $a4, $a3, $50, $99, $9e, $50, $a9, $9f, $a5, $a2, $50, $99, $9e + db $92, $9f, $a8, $5e, $03 + db $01 + db $0A + dl Gift_menu + + .SingularGiftText: + db $1B, $01 + db $70 + db $84, $98, $95, $a2, $95, $50, $99, $a3, $50, $93, $a5, $a2, $a2, $95, $9e, $a4 + db $9c, $a9, $50, $9f, $9e, $95, $50, $97, $99, $96, $a4, $50, $99, $9e, $50, $a9 + db $9f, $a5, $a2, $50, $99, $9e, $92, $9f, $a8, $5e + db $0A + dl .GiftUnionizer + + .TossGift: + db $12 + db $1F, $02, $76 + db $10, $10 + db $70, $79, $a4, $57, $9c, $9c, $50, $92, $95, $50, $97, $9f, $9f, $94, $50, $91 + db $a3, $50, $97, $9f, $9e, $95, $5e + db $1B, $06 + db $19, $1C, $FF, $00 + db $03, $01 + db $0A + dl .return_from_get + + .AcceptGift: + db $12 + db $1D, $03, $FF + db $1B, $02 + dd .InventoryFull + db $70, $87, $98, $9f, $50, $a3, $98, $9f, $a5, $9c, $94, $50, $a4, $91, $9b, $95 + db $50, $a4, $98, $99, $a3, $6f, $03 + db $08 + dd $FFC5E52E + db $1B, $02 + dd .ClearGetGiftChar + db $1B, $04 + db $1D, $03, $00 + db $1B, $02 + dd .SelectedCharFull + db $18, $04 + db $1C, $28, $01 + db $1F, $00, $01, $59 + db $1f, $15, $87, $00, $99, $02, $01 + db $10, $05 + db $1F, $13, $FF, $03 + db $10, $20 + db $1F, $03 + db $01, $01, $01 + db $1C, $29, $01 + db $18, $01, $01 + db $1F, $02, $74 + + db $1B, $04 + db $0D, $01 + + db $1D, $13, $00, $00 + db $70, $84, $91, $9b, $95, $50, $97, $9f, $9f, $94, $50, $93, $91, $a2, $95, $50 + db $9f, $96, $50, $99, $a4, $5e, $03 + db $01 + db $0A + dl .return_from_get + + .return_from_get: + db $12 + db $1C, $1B, $01 + db $0A + dl Gift_menu + + .InventoryFull: + db $70, $79, $57, $9d, $50, $a3, $9f, $a2, $a2, $a9, $5c, $10, $05, $50, $92, $a5 + db $a4, $50, $a9, $9f, $a5, $50, $93, $91, $9e, $9e, $9f, $a4, $50, $93, $91, $a2 + db $a2, $a9, $50, $91, $9e, $a9, $50, $9d, $9f, $a2, $95, $50, $99, $a4, $95, $9d + db $a3, $5e, $03, $01 + db $0A + dl .return_from_get + + .SelectedCharFull: + db $70, $79, $57, $9d, $50, $a3, $9f, $a2, $a2, $a9, $5c, $10, $04, $50, $92, $a5 + db $a4, $50, $a4, $98, $95, $a9, $50, $93, $91, $9e, $9e, $9f, $a4, $50, $93, $91 + db $a2, $a2, $a9, $50, $91, $9e, $a9, $a4, $98, $99, $9e, $97, $50, $95, $9c, $a3 + db $95, $5e, $03 + db $01 + db $1B, $06 + db $0A + dl .GetGiftChar + + .ClearGetGiftChar: + db $1B, $06 + db $0A + dl .GetGiftChar + + +Server_Storage: +db $02 + +escg_inquire: +db $70, $87, $98, $91, $a4, $50, $a7, $9f, $a5, $9c, $94, $50, $a9, $9f, $a5, $50 +db $9c, $99, $9b, $95, $50, $a4, $9f, $50, $94, $9f, $6f, $02 +;;;;;;;;;;;;;;;;;;;;;; +ORG $F30000 +CabinTextFixNew: +db $95, $50, $a9, $9f +db $a5, $50, $a4, $9f, $50, $98, $91, $a6, $95, $50, $99, $a4, $5e, $03, $00, $1f +db $02, $74, $10, $20, $1b, $04, $70, $58, $1c, $02, $00, $50, $97, $9f +CabinTextJump: +db $04, $56 +db $00, $04, $2D, $00 +CabinPostItemRescue: +db $04, $EC, $03, $04, $ED, $03, $18, $04, $0a, $a4, $96, $c7 + +StarMasterText: +db $06, $e5, $03 +dd .GotCheck +db $70, $71, $a4, $50, $9c, $91, $a3, $a4, $5c +db $10, $0a, $50, $a9, $9f, $a5, $57, $a6, $95, $50, $91, $a2, $a2, $99, $a6, $95 +db $94, $5e, $10, $0f, $50, $79, $50, $9e, $9f, $a7, $50, $9f, $96, $96, $95, $a2 +db $50, $a9, $9f, $a5, $50, $9d, $a9, $50, $a5, $9c, $a4, $99, $9d, $91, $a4, $95 +db $50, $9b, $9e, $9f, $a7, $9c, $95, $94, $97, $95, $5e, $03, $04, $e5, $03, $0a +db $c7, $b8, $ee +.GotCheck: +db $70, $74, $9f, $50, $a9, $9f, $a5, $50, $9b, $9e, $9f, $a7, $50 +db $98, $9f, $a7, $50, $a4, $9f, $50, $97, $95, $a4, $50, $9f, $a5, $a4, $50, $9f +db $96, $50, $98, $95, $a2, $95, $6f, $13, $02 + +TeddyJoin: +db $70, $89, $9f, $a5, $50, $93, $91, $9e, $50, $93, $91, $9c, $9c, $50, $9d, $95 +db $50, $84, $95, $94, $94, $a9, $5e, $03, $00, $70, $84, $95, $94, $94, $a9, $50 +db $72, $95, $91, $a2, $5e, $03, $00, $70, $79, $a4, $50, $99, $a3, $50, $9d, $a9 +db $50, $94, $95, $a3, $a4, $99, $9e, $a9, $50, $a4, $9f, $50, $a3, $91, $a6, $95 +db $50, $a4, $98, $95, $50, $a7, $9f, $a2, $9c, $94, $5c, $10, $20, $50, $91, $9e +db $94, $50, $79, $50, $a7, $99, $9c, $9c, $50, $91, $9c, $9c, $9f, $a7, $50, $a9 +db $9f, $a5, $50, $a4, $9f, $50, $92, $95, $50, $9d, $a9, $50, $95, $a3, $93, $9f +db $a2, $a4, $51, $03, $1d, $03, $ff, $1b, $03, $6A, $86, $c8, $00, $00, $70, $87 +db $95, $9c, $9c, $5c, $50, $79, $50, $a7, $9f, $a5, $9c, $94, $5c, $10, $15, $50 +db $95, $a8, $93, $95, $a0, $a4, $50, $a9, $9f, $a5, $57, $a2, $95, $50, $93, $91 +db $a2, $a2, $a9, $99, $9e, $97, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $50 +db $a3, $a4, $a5, $96, $96, $5e, $07, $68, $00, $13, $02, $a9, $5c, $15, $25, $9e, $51, $03, $18 +db $04, $10, $01, $1f, $11, $03, $1f, $eb, $99, $9e, $97, $50, $a4, $9f, $9f, $50 +db $9d, $a5, $93, $98, $50, $a3, $a4, $a5, $96, $96, $5e, $13, $02, $00, $50, $50 +db $58, $84, $98, $95, $50, $1c, $05, $02, $50, $9a, $9f, $99, $9e, $a3, $50, $a9 +db $9f, $a5, $5e, $59, $1f, $02, $10, $10, $30, $1d, $00, $ff, $02, $13, $1f, $41 +db $13, $02; TeddyBear join + +PresentNessCheck: +db $0B, $05 +db $1B, $03 +dd NessFlagText +db $02 + +WarpPadDescription: +db $71, $50, $98, $91, $9e, $94, $98, $95, $9c, $94, $50, $a4, $95, $9c, $95, $a0 +db $9f, $a2, $a4, $95, $a2, $50, $92, $a5, $99, $9c, $a4, $50, $92, $a9, $50, $a4 +db $98, $95, $50, $97, $95, $9e, $99, $a5, $a3, $5c, $50, $1c, $02, $03, $5e, $03 +db $00, $70, $89, $9f, $a5, $50, $93, $91, $9e, $50, $a5, $a3, $95, $50, $99, $a4 +db $50, $a4, $9f, $50, $a4, $95, $9c, $95, $a0, $9f, $a2, $a4, $50, $a4, $9f, $50 +db $9b, $9e, $9f, $a7, $9e, $50, $9c, $9f, $93, $91, $a4, $99, $9f, $9e, $a3, $5e +db $13, $02 + +WarpPadUsage: +db $1C, $22, $01 +db $1B, $06 +db $1B, $03 +dd .CantWarp +db $06, $F2, $02 +dd $C7C865 +db $70 +db $83, $75, $7c, $75, $73, $84, $50, $87, $71, $82, $80, $50, $7d, $7f, $74, $75 +db $01 +db $19, $02 +db $71, $02 +db $19, $02 +db $72, $02 +db $1C, $07, $02 +db $11 +db $12 +db $09, $02 +dd .WarpAccept +dd .WarpAccept +db $02 +.WarpAccept: +db $70, $79, $7e, $80, $85, $84, $50, $89, $7f, $85, $82, $50, $74, $75, $83, $84 +db $79, $7e, $71, $84, $79, $7f, $7e, $10, $06 +db $1B, $04 +db $1A, $0B +db $1F, $20, $00, $00, $02 + +.CantWarp: +db $70, $84, $98, $95, $50, $a3, $99, $97, $9e, $91, $9c, $50, $99, $a3, $50, $9a +db $91, $9d, $9d, $95, $94, $5c, $10, $05, $50, $a3, $9f, $50, $a4, $98, $95, $50 +db $1c, $05, $b5, $50, $93, $91, $9e, $9e, $9f, $a4, $50, $92, $95, $50, $a5, $a3 +db $95, $94, $50, $98, $95, $a2, $95, $5e, $13, $02 + + +PokeyCharCount: +db $08 +dd .CountChars +db $0A +dl $C8FD5F + +.CountChars: +db $19, $20 +db $09, $04 +dd .One +dd .Two +dd .Three +dd .Four +.One: +db $02 +.Two: +db $A4, $A7, $9F, $50, $02 +.Three: +db $A4, $98, $A2, $95, $95, $50, $02 +.Four: +db $96, $9F, $A5, $A2, $50, $02 + +DisplayRobots: +db $18, $04 +db $07, $17, $04 +db $1B, $02 +dd .NoNess +db $04, $18, $04 +.NoNess: +db $07, $E1, $03 +db $1B, $02 +dd .NoPaula +db $04, $19, $04 + +.NoPaula: +db $07, $E2, $03 +db $1B, $02 +dd .NoJeff +db $04, $1A, $04 +.NoJeff: +db $07, $10, $00 +db $1B, $02 +dd .NoPoo +db $04, $1B, $04 +.NoPoo: +db $02 + +OrangeKidCrowdfund: +db $01, $70 +db $84, $98, $91, $a4, $57, $a3, $50, $a7, $98, $a9, $50, $79, $50, $94, $95, $93 +db $99, $94, $95, $94, $50, $a4, $9f, $50, $9f, $a0, $95, $9e, $50, $91, $50, $93 +db $a2, $9f, $a7, $94, $96, $a5, $9e, $94, $99, $9e, $97, $50, $93, $91, $9d, $a0 +db $91, $99, $97, $9e, $50, $96, $9f, $a2, $50, $9d, $a9, $50, $99, $9e, $a6, $95 +db $9e, $a4, $99, $9f, $9e, $a3, $5e, $03, $00, $70, $79, $96, $50, $a9, $9f, $a5 +db $50, $a3, $a0, $95, $9e, $94, $50, $54, $62, $60, $60, $50, $a2, $99, $97, $98 +db $a4, $50, $9e, $9f, $a7, $5c, $10, $05, $a9, $9f, $a5, $57, $9c, $9c, $50, $9a +db $9f, $99, $9e, $50, $a4, $98, $95, $50, $7f, $a2, $91, $9e, $97, $95, $50, $7a +db $a5, $99, $93, $95, $50, $a4, $99, $95, $a2, $03, $00, $70, $91, $9e, $94, $50 +db $97, $95, $a4, $50, $95, $a8, $93, $9c, $a5, $a3, $99, $a6, $95, $50, $95, $91 +db $a2, $9c, $a9, $50, $91, $93, $93, $95, $a3, $a3, $50, $a4, $9f, $50, $9d, $a9 +db $50, $9c, $91, $a4, $95, $a3, $a4, $50, $99, $9e, $a6, $95, $9e, $a4, $99, $9f +db $9e, $5c, $50, $a4, $98, $95, $50, $1c, $05, $01, $5e, $03, $00, $70, $87, $98 +db $91, $a4, $50, $94, $9f, $50, $a9, $9f, $a5, $50, $a3, $91, $a9, $6f +db $0A +dl $C812AE + +NPCPaulaTex: +db $1C, $04 +db $1f, $00, $00, $7b +db $0A +dl NpcPaulaReturn +NPCJeffTex: +db $1C, $04 +db $1f, $00, $00, $7b +db $0A +dl NpcJeffReturn +NPCPooTex: +db $1C, $04 +db $1f, $00, $00, $7b +db $0A +dl NpcPooReturn +PooNPCTexReal: +db $1C, $04 +db $1f, $00, $00, $7b +db $0A +dl PooReturnReal + +TracyNessText: +db $06, $17, $04 +dd $C76120 +db $70, $87, $98, $a9, $50, $91, $a2, $95, $50, $a9, $9f, $a5, $50, $99, $9e, $50 +db $9d, $a9, $50, $a2, $9f, $9f, $9d, $6f, $03, $00, $70, $7d, $91, $a9, $92, $95 +db $50, $99, $96, $50, $79, $50, $9b, $9e, $95, $a7, $50, $1c, $02, $01, $50, $a7 +db $91, $a3, $50, $9f, $9b, $91, $a9, $5c, $10, $05, $50, $79, $57, $94, $50, $97 +db $99, $a6, $95, $50, $a9, $9f, $a5, $50, $9d, $a9, $50, $1c, $05, $01, $5e, $03 +db $00, $70, $7f, $98, $5c, $50, $a7, $95, $9c, $9c, $5e, $03, $00, $70, $79, $96 +db $50, $a9, $9f, $a5, $50, $a7, $91, $9e, $9e, $91, $50, $93, $a2, $91, $9d, $50 +db $a3, $9f, $9d, $95, $a4, $98, $99, $9e, $97, $50, $99, $9e, $50, $a9, $9f, $a5 +db $a2, $50, $a0, $9f, $93, $9b, $95, $a4, $a3, $5c, $10, $04, $50, $9a, $a5, $a3 +db $a4, $50, $a5, $a3, $95, $50, $a4, $98, $95, $50, $82, $50, $92, $a5, $a4, $a4 +db $9f, $9e, $5e, $13, $02 + +MagicantTentacleText: +db $06, $17, $04 +dd $C77D9F +db $70, $58, $71, $50, $a6, $9f, $99, $93, $95, $50, $93, $a2, $95, $95, $a0, $a3 +db $50, $99, $9e, $a4, $9f, $50 +db $0A +dl MagicantTentaGetNessName +db $02, $00 +MagicantNameReturn: +db $57, $a3, $50, $9d +db $99, $9e, $94, $5e, $5e, $5e, $03, $00, $70, $79, $a4, $50, $a3, $91, $a9, $a3 +db $5c, $10, $08, $50, $6c, $1c, $02, $01, $50, $9d, $a5, $a3, $a4, $50, $92, $95 +db $50, $a0, $a2, $95, $a3, $95, $9e, $a4, $50, $a4, $9f, $50, $a0, $a2, $9f, $93 +db $95, $95, $94, $50, $92, $95, $a9, $9f, $9e, $94, $50, $a4, $98, $99, $a3, $50 +db $a0, $9f, $99, $9e, $a4, $5e, $5e, $5e, $6e, $59, $13, $02 + +DuckSignTex: +db $08 +dd $C87994 +db $6E, $01 +db $08 +dd $C87994 +db $03 +db $0A +dl $C8798B + +GoatSignTex: +db $08 +dd $C87994 +db $6E, $01 +db $08 +dd $C87994 +db $03 +db $0A +dl $C879BB + +SlimeSignTex: +db $08 +dd $C87994 +db $6E, $01 +db $08 +dd $C87994 +db $03 +db $0A +dl $C87A46 + +JeffBoatText: +db $19, $20 +db $0B, $01 +db $1B, $03 +dd JeffBoatSolo +db $70, $83, $9f, $5e +db $0A +dl NotSoloJeff +JeffBoatSolo: +db $70 +db $83, $9f, $5c, $50, $a9, $9f, $a5, $57, $a2, $95, $50, $a0, $a2, $95, $a4, $a4 +db $a9, $50, $a3, $9d, $91, $a2, $a4, $5c, $50, $95, $98, $6f, $03, $00, $70, $84 +db $98, $99, $a3, $50, $92, $9f, $91, $a4, $57, $a3, $50, $91, $50, $9c, $99, $a4 +db $a4, $9c, $95, $50, $a2, $99, $93, $9b, $95, $a4, $a9, $5c, $50, $9d, $91, $a9 +db $92, $95, $50, $a9, $9f, $a5, $50, $93, $9f, $a5, $9c, $94, $50, $97, $99, $a6 +db $95, $50, $99, $a4, $50, $91, $9e, $50, $a5, $a0, $97, $a2, $91, $94, $95, $51 +db $03, $00 +db $0A +dl $C92F88 + +PooBoatText: +db $19, $20 +db $0B, $01 +db $1B, $03 +dd PooBoatSolo +db $70, $83, $17, $8b +db $0A +dl NotSoloPoo +PooBoatSolo: +db $70, $78, $95, $a9, $5c, $50, $a7, $98, $91, $a4, $57, $a3, $50, $a7, $99, $a4 +db $98, $50, $a4, $98, $95, $50, $a3, $95, $a2, $99, $9f, $a5, $a3, $50, $96, $91 +db $93, $95, $6f, $03, $00, $70, $89, $9f, $a5, $50, $97, $9f, $a4, $a4, $91, $50 +db $9c, $99, $97, $98, $a4, $95, $9e, $50, $a5, $a0, $50, $91, $50, $9c, $99, $a4 +db $a4, $9c, $95, $51, $03, $00, $70, $71, $50, $9c, $9f, $9f, $9b, $50, $9c, $99 +db $9b, $95, $50, $a4, $98, $91, $a4, $50, $93, $9f, $a5, $9c, $94, $50, $a3, $93 +db $91, $a2, $95, $50, $91, $50, $a3, $95, $91, $50, $9d, $9f, $9e, $a3, $a4, $95 +db $a2, $51 +db $03, $00 +db $0A +dl $C92F88 + +PaulaBoatText: +db $19, $20 +db $0B, 01 +db $1B, $03 +dd PaulaBoatSolo +db $70, $83, $9f, $5e +db $0A +dl NotSoloPaula +PaulaBoatSolo: +db $70, $87, $98, $91, $a4, $57, $a3, $50, $a4, $98, $91, $a4, $50, $93, $a2, $91 +db $93, $9b, $9c, $99, $9e, $97, $50, $95, $9e, $95, $a2, $97, $a9, $50, $91, $a4 +db $50, $a9, $9f, $a5, $a2, $50, $96, $99, $9e, $97, $95, $a2, $a4, $99, $a0, $a3 +db $6f, $03, $00, $70, $89, $9f, $a5, $50, $a3, $95, $95, $9d, $50, $91, $9c, $9d +db $9f, $a3, $a4, $50, $a2, $95, $91, $94, $a9, $50, $96, $9f, $a2, $50, $91, $9e +db $a9, $a4, $98, $99, $9e, $97, $51, $03, $00, $70, $7d, $91, $a9, $92, $95, $50 +db $a4, $98, $95, $50, $9d, $9f, $9e, $a3, $a4, $95, $a2, $a3, $50, $a3, $98, $9f +db $a5, $9c, $94, $50, $92, $95, $50, $a2, $95, $91, $94, $a9, $50, $96, $9f, $a2 +db $50, $89, $7f, $85, $51 +db $03, $00 +db $0A +dl $C92F88 + +NessBarfAppear: +db $70, $1c, $02, $01, $50, $a4, $95, $9c, $95, $a0, $9f, $a2, $a4, $95, $94, $50 +db $99, $9e, $51, $03, $02 + +NessBarfAttack: +db $70 +db $1c, $02, $01, $50, $a4, $a2, $99, $95, $94, $50, $80, $83, $79, $50, $82, $9f +db $93, $9b, $99, $9e, $51 +db $03, $00 +db $70, $1F, $02, $37 +db $1C, $02, $01 +db $50, $A4, $A2, $99, $95, $94, $50 +db $1C, $12, $01, $51 +db $08 +dd $EF864C +db $02 + +GiantStepNessText: +db $08 +dd NessSancDiscover +db $0A +dl $C7BF36 + +LilliputNessText: +db $08 +dd NessSancDiscover +db $0A +dl $C7C000 + +MilkyNessText: +db $08 +dd NessSancDiscover +db $0A +dl $C7C193 + +RainyNessText: +db $08 +dd NessSancDiscover +db $0A +dl $C7C0D8 + +MagnetNessText: +db $1C, $21, $01 +db $08 +dd NessSancDiscover +db $0A +dl $C7C270 + +CloudNessText: +db $08 +dd NessSancDiscover +db $0A +dl $C7C32F + +LumineNessText: +db $08 +dd NessSancDiscover +db $0A +dl $C7C42A + +FireNessText: +db $08 +dd NessSancDiscover +db $0A +dl $C7C4E1 + +NessSancDiscover: +db $70 +db $06, $17, $04 +dd .NessPresent +db $83, $9F, $9D, $95, $A7, $98, $95, $A2, $95, $5C, $50, $10, $0A +.NessPresent: +db $1c, $02, $01 +db $02 + +GiantStepNessName: +db $08 +dd PrintLeader +db $0A +dl $C7BF60 + +LilliputNessName: +db $08 +dd PrintLeader +db $0A +dl $C7C02B + +MilkyNessName: +db $08 +dd PrintLeader +db $0A +dl $C7C1CE + +RainyNessName: +db $08 +dd PrintLeader +db $0A +dl $C7C0FD + +MagnetNessName: +db $08 +dd PrintLeader +db $0A +dl $C7C299 + +CloudNessName: +db $08 +dd PrintLeader +db $0A +dl $C7C360 + +LumineNessName: +db $08 +dd PrintLeader +db $0A +dl $C7C44F + +FireNessName: +db $08 +dd PrintLeader +db $0A +dl $C7C511 + +EarthPowerLeader: +db $08 +dd PrintLeader +db $0A +dl $EE9BE2 + +OnettLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl OnettLeaderDone + +TwosonLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl TwosonLeaderDone + +HappyLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl HappyLeaderDone + +ThreedLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl ThreedLeaderDone + +SaturnLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl SaturnLeaderDone + +DunesLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl DunesLeaderDone + +FoursLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl FoursLeaderDone + +WintersLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl WintersLeaderDone + +SummersLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl SummersLeaderDone + +ScarabaLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl ScarabaLeaderDone + +DalaamLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl DalaamLeaderDone + +DarkLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl DarkLeaderDone + +TendaLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl TendaLeaderDone + +UnderLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl UnderLeaderDone + +MagicLeaderName: +db $08 +dd PrintLeader2 +db $0A +dl MagicLeaderDone + +OnettTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl OnettTeleNPCBack + +TwosonTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl TwosonTeleNPCBack + +HappyTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl HappyTeleNPCBack + +ThreedTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl ThreedTeleNPCBack + +SaturnTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl SaturnTeleNPCBack + +DunesTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl DunesTeleNPCBack + +FoursTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl FoursTeleNPCBack + +WintersTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl WintersTeleNPCBack + +SummersTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl SummersTeleNPCBack + +ScarabaTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl ScarabaTeleNPCBack + +DalaamTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl DalaamTeleNPCBack + +DarkTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl DarkTeleNPCBack + +TendaTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl TendaTeleNPCBack + +UnderTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl UnderTeleNPCBack + +MagicTeleNPCName: +db $08 +dd PrintLeader2 +db $0A +dl MagicTeleNPCBack + +PrintLeader: +db $70 +db $19, $10, $01 +db $1B, $04 +db $1C, $02, $00 +db $02 + +PrintLeader2: +db $70 +db $58 +db $19, $10, $01 +db $1B, $04 +db $1C, $02, $00 +db $02 + +DebugPalettePicker: +db $18, $04, $1f, $e1, $00, $5c, $01, $02 + +ClearAndCallDad: +db $12 +db $0A +dl $C63229 + +fixed_skyrunner_text: +db $04, $D4, $00 +db $10, $20, $1f, $02, $76, $10, $03, $18, $01, $01, $19, $10, $01, $1b, $04, $70 +db $1c, $02, $00, $50, $93, $a2, $91, $9d, $9d, $95, $94, $50, $a4, $98, $95, $50 +db $95, $9e, $97, $99, $9e, $95, $50, $99, $9e, $a4, $9f, $50, $a0, $9c, $91, $93 +db $95, $51, $03 +db $18, $04 +db $08 +dd $C91D30 +db $0A +dl $C91E42 + +broken_skyrunner_text: +db $18, $01, $01 +db $70, $84, $98, $95, $50, $9d, $91, $93, $98, $99, $9e, $95, $50, $91, $a0, $a0 +db $95, $91, $a2, $a3, $50, $a4, $9f, $50, $92, $95, $50, $92, $a2, $9f, $9b, $95 +db $9e, $5e, $03, $00, $70, $80, $95, $a2, $98, $91, $a0, $a3, $50, $91, $50, $a2 +db $95, $a0, $9c, $91, $93, $95, $9d, $95, $9e, $a4, $50, $95, $9e, $97, $99, $9e +db $95, $50, $93, $9f, $a5, $9c, $94, $50, $92, $95, $50, $96, $9f, $a5, $9e, $94 +db $5e, $10, $10, $5e, $10, $10, $5e, $10, $10, $6f, $1f, $02, $72, $13, $02 +db $02 + +rock_text: +db $79, $57, $9d, $50, $9e, $9f, $a4, $50, $91, $50, $a2, $9f, $93, $9b, $5e +db $10, $10, $50, $79, $57, $9d, $50, $91, $93, $a4, $a5, $91, $9c, $9c, $a9, $50 +db $9a, $a5, $a3, $a4, $50, $91, $50, $a2, $9f, $93, $9b, $5d, $a3, $98, $91, $a0 +db $95, $94, $50, $9d, $91, $9e, $5e +db $0A +dl $61002C + +man_text: +db $58, $7f, $9e, $50, $93, $9c, $9f, $a3, $95, $a2, $50, $99, $9e, $a3, $a0, $95 +db $93, $a4, $99, $9f, $9e, $5c, $10, $0a, $50, $99, $a4, $50, $91, $93, $a4, $a5 +db $91, $9c, $9c, $a9, $50, $91, $a0, $a0, $95, $91, $a2, $a3, $50, $a4, $9f, $50 +db $92, $95, $50, $91, $50, $9d, $91, $9e, $5d, $a3, $98, $91, $a0, $95, $94, $50 +db $a2, $9f, $93, $9b, $5e, $59 +db $0A +dl $6100F8 + +NessTonyHint: +db $5E, $5E, $5E, $03 +db $08 +dd TonyLetterHintText +db $02 + +JeffTonyHint: +db $a2, $95, $5e, $03 +db $08 +dd TonyLetterHintText +db $02 + +TonyLetterHintText: +db $00, $70, $78, $9f, $a7, $95, $a6, $95, $a2, $5c, $50, $79, $50, $10, $06, $93 +db $9f, $a5, $9c, $94, $10, $06, $50, $a0, $a2, $9f, $92, $91, $92, $9c, $a9, $50 +db $9c, $95, $a4, $50, $a9, $9f, $a5, $50, $99, $9e, $5c, $03, $00, $70, $99, $96 +db $50, $a9, $9f, $a5, $50, $98, $91, $94, $50, $a3, $9f, $9d, $95, $a4, $98, $99 +db $9e, $97, $50, $99, $9d, $a0, $9f, $a2, $a4, $91, $9e, $a4, $50, $a4, $9f, $50 +db $94, $a2, $9f, $a0, $50, $9f, $96, $96, $5c, $50, $9c, $99, $9b, $95, $50, $91 +db $50, $1c, $05, $a7, $5e, $5e, $5e, $1f, $02, $72, $13, $02 + +DynamicPhotoSetter: +db $18, $04 +db $06 +db $BA, $02 +dd .CheckPhoto2 +db $0A +dl .SetPhoto1 + +.CheckPhoto2: +db $06 +db $BB, $02 +dd .CheckPhoto3 +db $0A +dl .SetPhoto2 + +.CheckPhoto3: +db $06 +db $BC, $02 +dd .CheckPhoto4 +db $0A +dl .SetPhoto3 + +.CheckPhoto4: +db $06 +db $BD, $02 +dd .CheckPhoto5 +db $0A +dl .SetPhoto4 + +.CheckPhoto5: +db $06 +db $BE, $02 +dd .CheckPhoto6 +db $0A +dl .SetPhoto5 + +.CheckPhoto6: +db $06 +db $BF, $02 +dd .CheckPhoto7 +db $0A +dl .SetPhoto6 + +.CheckPhoto7: +db $06 +db $C0, $02 +dd .CheckPhoto8 +db $0A +dl .SetPhoto7 + +.CheckPhoto8: +db $06 +db $C1, $02 +dd .CheckPhoto9 +db $0A +dl .SetPhoto8 + +.CheckPhoto9: +db $06 +db $C2, $02 +dd .CheckPhoto10 +db $0A +dl .SetPhoto9 + +.CheckPhoto10: +db $06 +db $C3, $02 +dd .CheckPhoto11 +db $0A +dl .SetPhoto10 + +.CheckPhoto11: +db $06 +db $C4, $02 +dd .CheckPhoto12 +db $0A +dl .SetPhoto11 + +.CheckPhoto12: +db $06 +db $C5, $02 +dd .CheckPhoto13 +db $0A +dl .SetPhoto12 + +.CheckPhoto13: +db $06 +db $C6, $02 +dd .CheckPhoto14 +db $0A +dl .SetPhoto13 + +.CheckPhoto14: +db $06 +db $C7, $02 +dd .CheckPhoto15 +db $0A +dl .SetPhoto14 + +.CheckPhoto15: +db $06 +db $C8, $02 +dd .CheckPhoto16 +db $0A +dl .SetPhoto15 + +.CheckPhoto16: +db $06 +db $C9, $02 +dd .CheckPhoto17 +db $0A +dl .SetPhoto16 + +.CheckPhoto17: +db $06 +db $CA, $02 +dd .CheckPhoto18 +db $0A +dl .SetPhoto17 + +.CheckPhoto18: +db $06 +db $CB, $02 +dd .CheckPhoto19 +db $0A +dl .SetPhoto18 + +.CheckPhoto19: +db $06 +db $CC, $02 +dd .CheckPhoto20 +db $0A +dl .SetPhoto19 + +.CheckPhoto20: +db $06 +db $CD, $02 +dd .CheckPhoto21 +db $0A +dl .SetPhoto20 + +.CheckPhoto21: +db $06 +db $CE, $02 +dd .CheckPhoto22 +db $0A +dl .SetPhoto21 + +.CheckPhoto22: +db $06 +db $CF, $02 +dd .CheckPhoto23 +db $0A +dl .SetPhoto22 + +.CheckPhoto23; +db $06 +db $D0, $02 +dd .CheckPhoto24 +db $0A +dl .SetPhoto23 + +.CheckPhoto24: +db $06 +db $D1, $02 +dd .CheckPhoto25 +db $0A +dl .SetPhoto24 + +.CheckPhoto25: +db $06 +db $D2, $02 +dd .CheckPhoto26 +db $0A +dl .SetPhoto25 + +.CheckPhoto26: +db $06 +db $D3, $02 +dd .CheckPhoto27 +db $0A +dl .SetPhoto26 + +.CheckPhoto27: +db $06 +db $D4, $02 +dd .CheckPhoto28 +db $0A +dl .SetPhoto27 + +.CheckPhoto28: +db $06 +db $D5, $02 +dd .CheckPhoto29 +db $0A +dl .SetPhoto28 + +.CheckPhoto29: +db $06 +db $D6, $02 +dd .CheckPhoto30 +db $0A +dl .SetPhoto29 + +.CheckPhoto30: +db $06 +db $D7, $02 +dd .CheckPhoto31 +db $0A +dl .SetPhoto30 + +.CheckPhoto31: +db $06 +db $D8, $02 +dd .CheckPhoto32 +db $0A +dl .SetPhoto31 + +.CheckPhoto32: +db $06 +db $D9, $02 +dd .DoneScript +db $0A +dl .SetPhoto32 +.DoneScript: +;script here + +db $02 +.SetPhoto1: +db $1F, $D2, $01, $1C, $23 +db $04, $BA, $02 +db $02 +.SetPhoto2: +db $1F, $D2, $02, $1C, $23 +db $04, $BB, $02 +db $02 +.SetPhoto3: +db $1F, $D2, $03, $1C, $23 +db $04, $BC, $02 +db $02 +.SetPhoto4: +db $1F, $D2, $04, $1C, $23 +db $04, $BD, $02 +db $02 +.SetPhoto5: +db $1F, $D2, $05, $1C, $23 +db $04, $BE, $02 +db $02 +.SetPhoto6: +db $1F, $D2, $06, $1C, $23 +db $04, $BF, $02 +db $02 +.SetPhoto7: +db $1F, $D2, $07, $1C, $23 +db $04, $C0, $02 +db $02 +.SetPhoto8: +db $1F, $D2, $08, $1C, $23 +db $04, $C1, $02 +db $02 +.SetPhoto9: +db $1F, $D2, $09, $1C, $23 +db $04, $C2, $02 +db $02 +.SetPhoto10: +db $1F, $D2, $0A, $1C, $23 +db $04, $C3, $02 +db $02 +.SetPhoto11: +db $1F, $D2, $0B, $1C, $23 +db $04, $C4, $02 +db $02 +.SetPhoto12: +db $1F, $D2, $0C, $1C, $23 +db $04, $C5, $02 +db $02 +.SetPhoto13: +db $1F, $D2, $0D, $1C, $23 +db $04, $C6, $02 +db $02 +.SetPhoto14: +db $1F, $D2, $0E, $1C, $23 +db $04, $C7, $02 +db $02 +.SetPhoto15: +db $1F, $D2, $0F, $1C, $23 +db $04, $C8, $02 +db $02 +.SetPhoto16: +db $1F, $D2, $10, $1C, $23 +db $04, $C9, $02 +db $02 +.SetPhoto17: +db $1F, $D2, $11, $1C, $23 +db $04, $CA, $02 +db $02 +.SetPhoto18: +db $1F, $D2, $12, $1C, $23 +db $04, $CB, $02 +db $02 +.SetPhoto19: +db $1F, $D2, $13, $1C, $23 +db $04, $CC, $02 +db $02 +.SetPhoto20: +db $1F, $D2, $14, $1C, $23 +db $04, $CD, $02 +db $02 +.SetPhoto21: +db $1F, $D2, $15, $1C, $23 +db $04, $CE, $02 +db $02 +.SetPhoto22: +db $1F, $D2, $16, $1C, $23 +db $04, $CF, $02 +db $02 +.SetPhoto23: +db $1F, $D2, $17, $1C, $23 +db $04, $D0, $02 +db $02 +.SetPhoto24: +db $1F, $D2, $18, $1C, $23 +db $04, $D1, $02 +db $02 +.SetPhoto25: +db $1F, $D2, $19, $1C, $23 +db $04, $D2, $02 +db $02 +.SetPhoto26: +db $1F, $D2, $1A, $1C, $23 +db $04, $D3, $02 +db $02 +.SetPhoto27: +db $1F, $D2, $1B, $1C, $23 +db $04, $D4, $02 +db $02 +.SetPhoto28: +db $1F, $D2, $1C, $1C, $23 +db $04, $D5, $02 +db $02 +.SetPhoto29: +db $1F, $D2, $1D, $1C, $23 +db $04, $D6, $02 +db $02 +.SetPhoto30: +db $1F, $D2, $1E, $1C, $23 +db $04, $D7, $02 +db $02 +.SetPhoto31: +db $1F, $D2, $1F, $1C, $23 +db $04, $D8, $02 +db $02 +.SetPhoto32: +db $1F, $D2, $20, $1C, $23 +db $04, $D9, $02 +db $02 + +PhotoHandler: +db $08 +dd DynamicPhotoSetter +db $18, $01, $01 +db $70 +db $87, $98, $91, $a4, $50, $91, $50, $9e, $99, $93, $95, $50, $9d, $95, $9d, $9f +db $a2, $a9, $51, $02 +db $02 + +PhotoPresentText: +db $04 +db $1C, $04 +db $08 +dd DynamicPhotoSetter +db $05 +db $1C, $04 +db $02 + +FixLightningTypo: +db $9C, $99, $97, $98, $A4, $9E, $99, $9E, $97 +db $0A +dl $EED7F5 + +FixLightningTypo2: +db $9C, $99, $97, $98, $A4, $9E, $99, $9E, $97 +db $0A +dl $EED87B + +HandleEnergyLinkFromATM: +db $05, $1D, $04 +db $1D, $17, $01, $00, $00, $00 +db $1B, $02 +dd $C62E79 +;Check for the energy flag here +db $1C, $26, $01 +db $1B, $06 +db $1B, $03 +dd $C62F49 + +db $04, $1D, $04 +db $1D, $17, $01, $00, $00, $00 +db $05, $1D, $04 +db $1B, $03 +dd $C62F49 +;Energy has been successfully donwloaded +db $70 +db $84, $98, $95, $50, $a3, $95, $a2, $a6, $95, $a2, $50, $99, $a3, $50, $93, $a5 +db $a2, $a2, $95, $9e, $a4, $9c, $a9, $50, $a3, $a4, $9f, $a2, $99, $9e, $97, $50 +db $06, $1E, $04 +dd .OverCap +;Cap is 9999999 +.DisplayMoney: +db $54 +db $1B, $06 +;Argumentary has the amount +db $04, $1D, $04 +db $1C, $01, $07, $5e, $03 +db $05, $1D, $04 +db $01 +db $04, $1D, $04 +db $08 +dd $C62F9E +db $05, $1D, $04 +db $1B, $02 +dd $C62D8A +db $0D, $00 +db $04, $1D, $04 +db $1D, $17, $00, $00, $00, $00 +db $05, $1D, $04 +db $1B, $03 +dd $C62EEF +db $1B, $05 +db $70 +db $71, $a5, $a4, $98, $95, $9e, $a4, $99, $93, $91, $a4, $99, $9e, $97, $50, $a2 +db $95, $a1, $a5, $95, $a3, $a4, $5c, $50, $a0, $9c, $95, $91, $a3, $95, $50, $a7 +db $91, $99, $a4, $5e, $5e, $5e +db $1C, $25, $01 +db $1B, $06 +db $1B, $02 +dd .FailedToAuthenticate +db $09, $02 +dd .AuthenticateSuccessful +dd .AuthenticateSuccessOverTotal +db $02 + +.OverCap: +db $05, $1E, $04 +db $9D, $9F, $A2, $95, $50, $A4, $98, $91, $9E, $50 +db $0A +dl .DisplayMoney +.FailedToAuthenticate: +db $70, $76, $91, $99, $9c, $95, $94, $50, $a4, $9f, $50, $91, $a5, $a4, $98, $95 +db $9e, $a4, $99, $93, $91, $a4, $95, $50, $a4, $9f, $50, $a3, $95, $a2, $a6, $95 +db $a2, $5e, $03, $00, $70, $80, $9c, $95, $91, $a3, $95, $50, $a4, $a2, $a9, $50 +db $91, $97, $91, $99, $9e, $5e, $03, $02 +.AuthenticateSuccessful: +db $1B, $06 +db $0A +dl $C62EA6 +db $02 + +.AuthenticateSuccessOverTotal: +db $70, $71, $9d, $9f, $a5, $9e, $a4, $50, $a2, $95, $a1, $a5, $95, $a3, $a4, $95 +db $94, $50, $95, $a8, $93, $95, $95, $94, $a3, $50, $a4, $98, $95, $50, $91, $9d +db $9f, $a5, $9e, $a4, $50, $99, $9e, $50, $a4, $98, $95, $50, $a3, $95, $a2, $a6 +db $95, $a2, $5e, $03, $00, $70, $87, $99, $a4, $98, $94, $a2, $91, $a7, $99, $9e +db $97, $50, $54, $1c, $0a, $00, $00, $00, $00, $50, $99, $9e, $a3, $a4, $95, $91, $94 +db $5e, $03, $01 +db $0A +dl $C62EA6 + +InitializeEnergyLink: +db $0e, $00, $0d, $01 +db $1C, $24, $01 +db $0A +dl $C62D34 + +CheckForLockerKey: +db $1B, $02 +dd .LockerFail +db $08 +dl OpenLockers_OpenLockerText +db $19, $20 +db $02 +.LockerFail: +db $0B, $FE +db $02 + +PhotoBarfTextArrive: +db $02 + +PhotoBarfTextTake: +db $08 +dd DynamicPhotoSetter +db $02 + +StonehengePhotoText: +db $70, $83, $9f, $a2, $a2, $a9, $5c, $50, $79, $50, $94, $9f, $9e, $57, $a4, $50 +db $98, $91, $a6, $95, $50, $9d, $a9, $50, $93, $91, $9d, $95, $a2, $91, $50, $a7 +db $99, $a4, $98, $50, $9d, $95, $5e, $13, $02 + +ShowDepositEnergy: +db $05, $1D, $04 +db $1D, $17, $01, $00, $00, $00 ; Check if we have at least one dollar +db $1B, $02 +dd $C63004 +db $04, $1D, $04 +db $0A +dl $C63004 + +ShowDadEnergy: +db $00, $70, $54 +db $05, $1D, $04 +db $1D, $17, $01, $00, $00, $00 ; Check if we have at least one dollar +db $1B, $02 +dd .BankMoney +db $04, $1D, $04 +.BankMoney: +db $1C, $01, $07 +db $05, $1D, $04 +db $0A +dl $C63330 + +PingDadEnergy: +db $1C, $24, $01 +db $06, $04, $03 +dd $C75929 +db $0A +dl $C63230 + +;The server is currently storing [Energy] + +RuralEnergyText: +db $70, $89, $9f, $a5, $50, $a7, $91, $9e, $9e, $91, $50, $93, $98, $95, $93, $9b +db $50, $98, $9f, $a7, $50, $9d, $a5, $93, $98, $50, $9d, $9f, $9e, $95, $a9, $50 +db $99, $a3, $50, $9f, $9e, $50, $a4, $98, $95, $50, $a3, $95, $a2, $a6, $95, $a2 +db $6f, $03, $00, $70, $74, $9f, $50, $79, $50, $9c, $9f, $9f, $9b, $50, $9c, $99 +db $9b, $95, $50, $79, $50, $9b, $9e, $9f, $a7, $50, $a7, $98, $91, $a4, $50, $91 +db $50, $a3, $95, $a2, $a6, $95, $a2, $50, $99, $a3, $6f, $13, $02 + +DarknessATM: +db $1C, $27, $01 +db $1B, $06 +db $1B, $02 +dd $C9EC74 +db $1D, $17, $01, $00, $00, $00 +db $1B, $03 +dd RuralEnergyText +db $0A +dl $C9EC74 + +UnderworldATM: +db $1C, $27, $01 +db $1B, $06 +db $1B, $02 +dd $EF6049 +db $1D, $17, $01, $00, $00, $00 +db $1B, $03 +dd RuralEnergyText +db $0A +dl $EF6049 + +PhotoShopText: +db $80, $98, $9f, $a4, $9f, $5d, $9f, $a0, $00 + +SetSaturnLadderFlag: +db $04 +db $1F, $04 +db $02 + +JackieMoonsideSetup: +db $1F, $63 +dd JackieMoonsideGive +db $0A +dl $C9A08B + +JackieMoonsideGive: +db $05, $4F, $02 +db $1F, $1A, $80, $03, $03 +db $1F, $16, $80, $03, $03 +db $10, $30 +db $1F, $1B, $80, $03 +db $18, $01, $01 +.JackieGiveItem: +db $70, $71, $50, $a3, $a4, $a2, $91, $9e, $97, $95, $50, $9d, $91, $9e, $50, $9a +db $a5, $a3, $a4, $50, $93, $91, $9d, $95, $50, $92, $91, $a2, $97, $99, $9e, $97 +db $50, $99, $9e, $50, $98, $95, $a2, $95, $5c, $10, $0b, $50, $9c, $9f, $9f, $9b +db $99, $9e, $97, $50, $96, $9f, $a2, $50, $a9, $9f, $a5, $5e, $5e, $5e, $03, $00 +db $70, $79, $a3, $50, $98, $95, $50, $91, $50, $96, $a2, $99, $95, $9e, $94, $50 +db $9f, $96, $50, $a9, $9f, $a5, $a2, $a3, $6f, $10, $16, $50, $78, $95, $50, $94 +db $95, $9d, $91, $9e, $94, $95, $94, $50, $79, $50, $97, $99, $a6, $95, $50, $a9 +db $9f, $a5, $50, $a4, $98, $99, $a3, $50, $1c, $05, $01, $50, $91, $9e, $94, $50 +db $9c, $95, $96, $a4, $5e, $03 +db $1D, $03, $FF +db $1B, $02 +dd .FullInv +db $05, $20, $04 +db $1D, $0E, $FF, $04, $08 +dd $C7DCB6 +db $04, $DF, $03 +db $03 +db $18, $04, $02 +.FullInv: +db $00, $70 +db $83, $99, $9e, $93, $95, $50, $a9, $9f, $a5, $a2, $50, $a0, $9f, $93, $9b, $95 +db $a4, $a3, $50, $91, $a2, $95, $50, $a3, $9f, $50, $96, $a5, $9c, $9c, $5c, $10 +db $0a, $50, $79, $57, $9c, $9c, $50, $98, $9f, $9c, $94, $50, $9f, $9e, $50, $a4 +db $9f, $50, $99, $a4, $50, $96, $9f, $a2, $50, $9e, $9f, $a7, $5e +db $04, $20, $04 +db $03 +db $18, $04 +db $02 + +JackieItemCheck: +db $06 +db $20, $04 +dd JackieMoonsideGive_JackieGiveItem +db $0A +dl $c6f175 + +UnlockOnettTeleport: +db $04, $D1, $00 +db $02 + +MagicantTentacleERText: +db $07 +db $17, $04 +db $1B, $02 +dd .Ness +db $1F, $63 +dd $C9B112 +.Ness: +db $0A +dl MagicantTentacleText + +MinerDialogue: +db $06 +db $AE, $00 ;If the mine is open... +dd $C60349;Proceed as normal +;If the mine is closed +db $06 +db $5A, $00 ;and we got the check +dd $C60365 ;Run the permit script +db $06 +db $48, $00 ;If the check is primed... +dd $C6050B ;Give it to the player +db $0A +dl $C60365 ;Else run the permit script + +MinerText2: +db $06, $5A, $00 +dd .Already +db $91, $9C, $9D, $9F, $A3, $A4 +db $0A +dl $C61231 +.Already: +db $98, $91, $94 +db $0A +dl $C61231 + +CafeEverdredText: +db $06, $91, $00 +dd .Done +db $18, $01, $01 +db $70, $58, $71, $a2, $95, $50, $a9, $9f, $a5, $50, $a2, $95, $91, $9c, $9c, $a9 +db $50, $97, $9f, $99, $9e, $97, $50, $a4, $9f, $50, $9a, $a5, $a3, $a4, $50, $9c +db $95, $91, $a6, $95, $50, $98, $99, $9d, $50, $9c, $a9, $99, $9e, $97, $50, $9f +db $9e, $50, $a4, $98, $95, $50, $a3, $a4, $a2, $95, $95, $a4, $5E, $5E, $5E, $6f, $59, $03 +db $18, $04, $02 +.Done: +db $1F, $63 +dd $C9B112 +db $02 + +LeaderHandinBadge: +db $70, $58 +db $19, $10, $01 +db $1B, $04 +db $1C, $02, $00 +db $0A +dl $EEF748 + +EverDeadText: +db $70, $87, $98, $a9, $50, $91, $a2, $95, $50, $a9, $9f, $a5, $50, $99, $9e, $a4 +db $95, $a2, $a2, $a5, $a0, $a4, $99, $9e, $97, $50, $9d, $a9, $50, $a3, $a4, $a2 +db $95, $95, $a4, $50, $a9, $9f, $97, $91, $6f, $03, $01, $70, $85, $97, $98, $5c +db $50, $99, $a4, $57, $a3, $50, $9e, $9f, $a4, $50, $95, $a6, $95, $9e, $50, $a2 +db $95, $9c, $91, $a8, $99, $9e, $97, $50, $9e, $9f, $a7, $5e, $13 +db $0A +dl $C839EB + +StorageStoreCheck: +db $1B, $05 +db $19, $19, $00, $00 +db $1C, $19, $01 +db $1B, $03 +dd .CheckRegular +db $1C, $1D, $01 +.CheckRegular: +db $1B, $06 +db $1D, $0C, $00, $00 +db $1B, $03 +dd .ClearAndFull +db $0A +dl BackFromCheck +.ClearAndFull: +db $1C, $1E, $01 +db $0A +dd $EE9650 + +ActivateCakeEnemies: +db $05, $0B, $00 +db $04, $3d, $00, $02 + +FixEpilogueWinters: +db $04, $d1, $00 +db $04, $d2, $00 +db $04, $d4, $00 +db $0A +dl BackfromEpilogueFix + +OnettHotelSetTeleport: +db $04 +db $D1, $00 +db $0A +dl $C9B11E + +MonkeyCaveShop: +db $04, $ED, $00 +db $08 +dd $C5DFB1 +db $05, $ED, $00 +db $02 + +MonkeyShopGreeting: ; todo: write this +db $70, $85, $9b, $99, $9b, $99, $50, $85, $9b, $a5, $51, $03, $00, $70, $58, $87 +db $95, $9c, $93, $9f, $9d, $95, $50, $a4, $9f, $50, $7d, $9f, $9e, $9b, $95, $a9 +db $50, $7d, $91, $a2, $a4, $5e, $59, $03, $02 +db $02 + +MonkeyShopBuyLine: +db $70, $7b, $a5, $50, $7b, $99, $9b, $a5, $51, $03, $00, $70, $58, $87, $98, $91 +db $a4, $50, $a7, $9f, $a5, $9c, $94, $50, $a9, $9f, $a5, $50, $9c, $99, $9b, $95 +db $6f, $03, $02 + +MonkeyShopNotEnoughMoney: +db $70, $85, $9b, $99, $50, $a5, $9b, $a5, $50, $a5, $9b, $a5, $9c, $95, $9c, $95 +db $51, $03, $00, $70, $58, $89, $9f, $a5, $50, $91, $a2, $95, $50, $a4, $9f, $9f +db $50, $a0, $9f, $9f, $a2, $50, $96, $9f, $a2, $50, $a4, $98, $99, $a3, $50, $99 +db $a4, $95, $9d, $51, $59, $03, $02 + +MonkeyShopSelectItem: +db $70, $7b, $99, $99, $9b, $a5, $9b, $91, $50, $1c, $05, $00, $6f, $03, $00, $70 +db $58, $89, $9f, $a5, $50, $a7, $91, $9e, $a4, $50, $a4, $98, $95, $50, $1c, $05 +db $00, $6f, $59, $03, $02 + +MonkeyShopPickCarrier: +db $70, $7b, $a9, $a5, $9b, $a9, $9b, $99, $9b, $95, $9b, $99, $a5, $6f, $03, $00 +db $70, $58, $87, $98, $9f, $57, $a3, $50, $a4, $91, $9b, $99, $9e, $97, $50, $99 +db $a4, $6f, $59, $03, $02 + +MonkeyShopCancelBuy: +db $70, $85, $9b, $99, $91, $a9, $50, $a5, $9b, $99, $5e, $03, $00, $70, $58, $7f +db $98, $5c, $10, $05, $50, $9f, $9b, $91, $a9, $5e, $59, $03, $02 + +MonkeyShopThank: +db $70, $85, $9b, $a5, $9b, $a5, $9b, $a5, $51, $03, $00, $70, $58, $84, $98, $91 +db $9e, $9b, $a3, $51, $59, $03, $02 + +MonkeyShopNoBuy: +db $70, $7b, $a9, $99, $99, $99, $95, $9b, $95, $9b, $95, $9b, $95, $6f, $03, $00 +db $70, $58, $89, $9f, $a5, $50, $94, $9f, $9e, $57, $a4, $50, $a7, $91, $9e, $a4 +db $50, $a4, $9f, $50, $92, $a5, $a9, $50, $96, $a2, $9f, $9d, $50, $91, $50, $9d +db $9f, $9e, $9b, $95, $a9, $6f, $59, $03, $02 + +MonkeyShopCantCarrySingle: +db $70, $7b, $95, $95, $9b, $99, $9b, $99, $95, $95, $51, $03, $00, $70, $58, $89 +db $9f, $a5, $50, $91, $a2, $95, $50, $93, $91, $a2, $a2, $a9, $99, $9e, $97, $50 +db $a7, $91, $a9, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $51, $59, $03, $02 + +MonkeyShopExitThanks: +db $70, $85, $9b, $99, $9b, $99, $9b, $99, $51, $03, $00, $70, $58, $73, $9f, $9d +db $95, $50, $91, $97, $91, $99, $9e, $51, $59, $03, $02 + +MonkeyShopBuyAnother: +db $70, $85, $9b, $a9, $a5, $99, $9b, $a5, $a5, $a5, $a9, $95, $50, $7b, $a9, $95 +db $a5, $95, $9b, $a5, $9b, $9f, $5e, $03, $00, $70, $58, $87, $9f, $a5, $9c, $94 +db $50, $a9, $9f, $a5, $50, $9c, $99, $9b, $95, $50, $91, $9e, $a9, $a4, $98, $99 +db $9e, $97, $50, $95, $9c, $a3, $95, $6f, $59, $03, $00, $02 + +MonkeyShopCantCarry: +db $70, $1c, $02, $00, $50, $9b, $99, $9b, $99, $95, $95, $51, $03, $00, $70, $58, $1c +db $02, $00, $50, $99, $a3, $50, $93, $91, $a2, $a2, $a9, $99, $9e, $97, $50, $a7 +db $91, $a9, $50, $a4, $9f, $9f, $50, $9d, $a5, $93, $98, $51, $59, $03, $00, $70 +db $7b, $a9, $95, $9b, $99, $9b, $99, $9f, $9b, $95, $6f, $03, $00, $70, $58, $87 +db $99, $9c, $9c, $50, $a3, $9f, $9d, $95, $9f, $9e, $95, $50, $95, $9c, $a3, $95 +db $50, $a4, $91, $9b, $95, $50, $99, $a4, $6f, $59, $03, $00, $02 + +PostFrankGuardText: +db $70, $7a, $a5, $a3, $a4, $50, $57, $93, $91, $a5, $a3, $95, $50, $a9, $9f, $a5 +db $50, $92, $95, $91, $a4, $50, $a5, $a0, $50, $9f, $a5, $a2, $50, $92, $9f, $a3 +db $a3, $5c, $10, $05, $50, $94, $9f, $95, $a3, $9e, $57, $a4, $50, $9d, $95, $91 +db $9e, $50, $79, $57, $9c, $9c, $50, $9d, $9f, $a6, $95, $50, $96, $9f, $a2, $50 +db $a0, $a5, $9e, $9b, $a3, $50, $9c, $99, $9b, $95, $50, $a9, $9f, $a5, $51, $03 +db $0A +dl $C74C58 + +MagicantTentaGetNessName: +db $19, $10, $01, $1B, $04, $1C, $02, $00 +db $0A +dl MagicantNameReturn + +AddNessToEpilogue: +db $1F, $11, $01 +db $18, $01, $01, $70 +db $0A +dl $C7FB5A + +NewBikeText: +db $1C, $22 +db $1B, $06 +db $1B, $03 +dd $C7C6F1 +db $19, $10, $01 +db $0B, $01 +db $1B, $02 +dd .OtherCharBike +db $70, $1C, $0D, $50 +db $0A +dl $C9FD4A +.OtherCharBike: +db $70, $1C, $0D, $50 +db $a4, $a2, $99, $95, $94, $50, $a4, $9f, $50, $a2, $99, $94, $95, $50, $91, $50 +db $92, $99, $93, $a9, $93, $9c, $95, $5c, $03, $01, $70, $92, $a5, $a4, $50 +db $1C, $14, $01 +db $08 +dd $C7E602 +db $50 +db $94 +db $99, $94, $9e, $57, $a4, $50, $9b, $9e, $9f, $a7, $50, $98, $9f, $a7, $5e, $13 +db $02 + +Truffle1: +db $17, $79, $51, $03, $00, $70, $84, $15, $78, $91, $50, $1c, $05, $63, $50, $91 +db $16, $0e, $17, $cc, $a4, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $8a, $b5, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03 +db $19, $20 +db $02 + +Truffle2: +db $17, $79, $51, $03, $00, $70, $84, $15, $78, $91, $50, $1c, $05, $63, $50, $91 +db $16, $0e, $17, $cc, $a4, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $8a, $b5, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03 +db $19, $20 +db $02 + +Truffle3: +db $17, $79, $51, $03, $00, $70, $84, $15, $78, $91, $50, $1c, $05, $63, $50, $91 +db $16, $0e, $17, $cc, $a4, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $8a, $b5, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03 +db $19, $20 +db $02 + +Truffle4: +db $17, $79, $51, $03, $00, $70, $84, $15, $78, $91, $50, $1c, $05, $63, $50, $91 +db $16, $0e, $17, $cc, $a4, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $8a, $b5, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03 +db $19, $20 +db $02 + +Truffle5: +db $17, $79, $51, $03, $00, $70, $84, $15, $78, $91, $50, $1c, $05, $63, $50, $91 +db $16, $0e, $17, $cc, $a4, $5e, $03, $00, $1d, $03, $ff, $1b, $02, $8a, $b5, $ee +db $ff, $1d, $0e, $ff, $01, $08, $cf, $dc, $c7, $ff, $03 +db $19, $20 +db $02 + +FixYouWonAlignment: +db $15, $1D +db $18, $05, $06, $01 +db $1C, $08, $02 +db $0A +dl $EF79E3 + +FixPhotoManLoad: +db $1f, $f2, $8f, $00, $c4, $01, $0a +dl $C7AC4D + +PhotomanLeave: +db $1F, $F2, $8F, $00, $83, $02 +db $0A +dl $C7ACA4 + +PhotoManActionScript: +db $25, $0C, $A0 +db $03 +dd $C33B53 + +UnsetDenyHints: +db $06, $05, $04 +dd .DenyOnett +db $06, $06, $04 +dd .DenyTwoson +db $06, $07, $04 +dd .DenyThreed +db $06, $08, $04 +dd .DenyFourside +db $06, $09, $04 +dd .DenySummers +db $06, $0A, $04 +dd .DenyScaraba +db $02 +.DenyOnett: +db $05, $05, $04 +db $02 +.DenyTwoson: +db $05, $06, $04 +db $02 +.DenyThreed: +db $05, $07, $04 +db $02 +.DenyFourside: +db $05, $08, $04 +db $02 +.DenySummers: +db $05, $09, $04 +db $02 +.DenyScaraba: +db $05, $0A, $04 +db $02 + +DenyHintsNoMoney: +db $08 +dd UnsetDenyHints +db $15, $d0, $a9, $15, $20 +db $0A +dl $C72669 + +DenyHintsSaidNo: +db $08 +dd UnsetDenyHints +db $17, $f3, $15, $10 +db $0A +dl $C701FA + +LeaderPantsText: +db $01, $70 +db $19, $10, $01 +db $1B, $04 +db $1C, $02, $00 +db $0A +dl LavaPantsUseTxt_DoorPantsTex + +EndScript: +db $02 + +DisableCollAndAnim: +db $42 +dl $C0A82F +db $03 +dl $C3A09F + +RideSkycicle: +db $70, $58, $87, $95, $9c, $9c, $5c, $10, $0a, $90, $99, $a4, $57, $a3, $90, $9e +db $9f, $a4, $90, $a4, $98, $95, $50, $83, $9b, $a9, $50, $82, $a5, $9e, $9e, $95 +db $a2, $5e, $03, $01, $70, $82, $99, $94, $95, $50, $99, $a4, $50, $91, $9e, $a9 +db $a7, $91, $a9, $a3, $6f, $59, $01 +db $19, $02 +db $89, $95, $A3, $02 +db $19, $02 +db $7E, $9F, $02 +db $1C, $07, $02 +db $11 +db $09, $02 +dd .Ride +dd .DontRide +db $0A +dl .DontRide +.Ride: +db $12 +db $70, $58 +db $08 +dd $C7E6D7 +db $50 +db $a2, $9f, $94, $95, $50, $a4, $98, $95, $50, $83, $9b, $a9, $93, $99, $93, $9c +db $95, $5e, $59, $1f, $02, $73, $10, $30 +db $18, $04 +db $1F, $21, $DA +db $02 +.DontRide: +db $12 +db $70, $58, $89, $95, $91, $98, $5c, $10, $0a, $50, $79, $50, $a7, $9f, $a5, $9c +db $94, $9e, $57, $a4, $5C, $50, $95, $99, $a4, $98, $95, $a2, $5e, $59, $13, $02 + +CheckForRubyPoo: +db $1D, $05, $FF, $D0 ; Check for tiny ruby +db $1B, $03 +dd $C8A997 +db $0A +dl $C8A8E7 + +LavaPantsHandleItem: +db $1B, $00 +db $08 +dd LavaPantsUseTxt +db $1B, $01 +db $1B, $0F, $00, $00 +db $02 + +DisableOSSOnLumine: +db $1f, $eb, $ff, $06 +db $1F, $41, $06 +db $0A +dl $C99CD1 + +TwosonCopBossText: +db $08 +dd $EEEEBC +db $0A +dl $EEC785 + +SetupNessForMagicantBoost: +db $18, $01, $01 +db $19, $10, $01 +db $70 +db $0A +dl $EEBDA8 + +;ORG $C7617D +;dd DisplayAndGetMoney + +;ORG $C62B87 +;db $0a, $28, $ca, $ee ; Test, delete later + +;New New Text + +ORG $F3FFE0 +db $04, $1C, $04 +db $08 +dd DynamicPhotoSetter +db $05, $1C, $04 +db $1D, $19, $01, $02 + +ExtraPresentCheck: +db $1B, $00 +db $0B, $06 +db $1B, 03 +dd PhotoPresentText +db $1B, $01 +db $0A +dl PresentNessCheck +;dl + +ORG $F3FEE0 +save_chunk_size_table: +dw sram_chunk0_size +dw sramchunk1_size +dw sramchunk2_size +dw sramchunk3_size +dw sramchunk4_size +dw sramchunk5_size +save_chunk_pointer_table: +dw sramchunk0_pointer +dw sramchunk1_pointer +dw sram_chunk2_pointer +dw sram_chunk3_pointer +dw sramchunk4_pointer +dw sramchunk5_pointer +dw $0000 + +ORG $F80000 +PhotocolorTable: +dw $5A39 ; Blank +dw $5A49 ; Giant Step as well???? +dw $5A4D ; Giant Step +dw $5A59 ; Onett +dw $5A85 ; Twoson +dw $5A8D ; Happy-Happy Free +dw $5A91 ; Happy-Happy +dw $5A99 ; Peaceful Rest Valley +dw $5AB1 ; Threed +dw $5AC1 ; Rain Circle as well????? +dw $5AC5 ; Rainy Circle +dw $5AAD ; Threed Daytime +dw $5AD1 ; Winters +dw $5AED ; Saturn Valley +dw $5AF5 ; Grapefruit Falls +dw $5B09 ; Dusty Dunes +dw $5B19 ; Magnet Hill as well????? +dw $5B1D ; Magnet Hill +dw $5B29 ; Fourside (Make sure start-of-seed fourside isnt different) +dw $5B4D ; Summers +dw $5B5D ; Scaraba Bazaar +dw $5B6D ; Scaraba Desert +dw $5B79 ; Dalaam +dw $5B89 ; Deep Darkness +dw $5B91 ;Tenda Village +dw $5B99 ; Lost Underworld +dw $5BA1 ; Memory house +dw $5BAD ; Magicant +dw $5BB1 ; Deep Magicant +dw $5BB5 ; Sea of Eden +dw $5BC1 ; Cave of the Present +dw $5BCD ; Cave of the Past +dw $5BD1 ; Giygas's Lair +dw $5C09 ; Lilliput Steps +dw $5C0D ; Lilliput steps as well???? +dw $5C2D ; Milky Well as well???? +dw $5C31 ; Milky Well +dw $5C35 ; Milky Well outdoors +dw $5C51 ; Pink Cloud as well???? +dw $5C55 ; Pink Cloud +dw $5C65 ; Lumine Hall +dw $5C69 ; Lumine Hall as well???? +dw $5D71 ; Threed Underground +dw $5C8D ; Sea +dw $5C9D ; Three-Two Tunnel +dw $5CB1 ; Threed-Desert tunnel +dw $5CC5 ; Desert Tunnel +dw $5CD5 ; Fourside Tunnel +dw $5CDD ; PRV Connector Cave +dw $5CE5 ; Saturn Cave +dw $5CED ; Giant Step Cave +dw $5CF5 ; Lilliput Steps cave +dw $5CFD ; Rainy Circle Cave +dw $5D05 ; Milky Well Caves +dw $5D0D ; Sewers +dw $5D15 ; Pink Cloud Cave +dw $5D1D ; Lumine Hall Cave +dw $5D31 ; Fire Spring Cave +dw $5D39 ; Lier's Cave +dw $5D49 ; Bricroad's maze +dw $5D51 ; Stonehenge Entrance +dw $5D59 ; Stonehenge Balcony +dw $5D61 ; Stonehenge Flashing room +dw $5D79 ; Belch's Factory +dw $5D81 ; Monkey Caves +dw $5D95 ; Gold Mine +dw $5D99 ; Moonside +dw $5DA9 ; Pyramid +dw $5DB1 ; Dungeon Man +dw $5DB5 ; Arcade +dw $5DBD ; Onett Drugstore +dw $5DD1 ; Ness's House +dw $5DF1 ; Burger shop +dw $5DF9 ; Onett Hint House +dw $5E01 ; Onett Bakery +dw $5E09 ; Pokey's House +dw $5E1D ; Onett Hotel +dw $5E29 ; Police Station +dw $5E31 ; Town Hall +dw $5E39 ; Onett Green House +dw $5E41 ; Onett Blue House +dw $5E49 ; Onett seafoam house +dw $5E51 ; Left of Hint House +dw $5E61 ; Onett Pink House +dw $5E71 ; Library +dw $5E79 ; Lier's House +dw $5E81 ; Onett hospital +dw $5E91 ; Treehouse +dw $5E99 ; Traveler shack +dw $5EA1 ; Apple Kid +dw $5EA9 ; Orange Kid +dw $5EB1 ; Bike Shop +dw $5EB9 ; Twoson Dept Store +dw $5EC1 ; Everdred's House +dw $5EC9 ; Bus Station +dw $5ED1 ; Twoson Orange Roof +dw $5ED9 ; Twoson Hint House +dw $5EE9 ; Chaos Theater +dw $5EF5 ; Twoson Hotel +dw $5EFD ; Twoson Pizza +dw $5F05 ; Twoson North Left House +dw $5F0D ; Twoson North Right House +dw $5F15 ; Twoson Cat House +dw $5F1D ; Twoson Hospital +dw $5F29 ; Paula's House +dw $5F31 ; HH House +dw $5F35 ; HH House +dw $5F3D ; Happy HQ +dw $5F41 ; Happy HQ +dw $5F49 ; Happy Drugstore +dw $5F4D ; Happy Drugstore +dw $5F61 ; Happy Hospital +dw $5F65 ; Happy Hospital +dw $5F6D ; Happy Sturn House +dw $5F55 ; Happy Hotel +dw $5F59 ; Happy Hotel +dw $5F7D ; Saturn Hotel +dw $5F85 ; Saturn Hospital +dw $5F8D ; Saturn Shop +dw $5F95 ; Cabin +dw $5F9D ; Threed Drugstore +dw $5FA1 ; Threed Drugstore Scary +dw $5FA9 ; Threed Hint Shop +dw $5FAD ; Threed Hint Scary +dw $5FB5 ; Threed Bakery +dw $5FB9 ; Threed Bakery Scary +dw $5FC9 ; Threed Hotel Scary +dw $5FD5 ; Threed Pizza Scary +dw $5FED ; Threed Red House Scary +dw $600D ; Tent +dw $6011 ; Tent Scary +dw $6019 ; Threed Hospital +dw $601D ; Threed Hospital Scary +dw $6025 ; Snow Wood +dw $6031 ; Winters drugstore +dw $603D ; Andonuts Lab +dw $6051 ; Winters tents +dw $6059 ; Miner shack +dw $6061 ; DD Drugstore +dw $6069 ; Fourside Dept Store +dw $607D ; Monotoli Building +dw $608D ; Monotoli Gold Room +dw $609D ; Monotoli upstairs +dw $60A5 ; Monotoli Elevator +dw $60D5 ; Monotoli Offices? +dw $60C1 ; Monotoli penthouse +dw $60E1 ; Topolla Theater +dw $60F1 ; Fourside Bakery +dw $60F5 ; Fourside Hotel +dw $6101 ; Fourside Hotel +dw $6109 ; Fourside Cafe +dw $6115 ; Fourside Museum +dw $611D ; Fourside Hospital +dw $6125 ; Stoic Club +dw $612D ; Summers Shop +dw $6141 ; Summers Restaurant +dw $6139 ; Summers Hotel +dw $6149 ; Summers Museum +dw $6151 ; Summers Hospital +dw $6159 ; Toto Shop +dw $617D ; Scaraba Shop +dw $6189 ; Scaraba Hotel +dw $6191 ; Scaraba House +dw $6199 ; Scaraba Hospital +dw $6161 ; Toto House +dw $6169 ; Dalaam Palace +dw $6175 ; Dalaam House +dw $61A9 ; Magicant Shop +dw $61B1 ; Magicant House +dw $61BD ; Flying Man House +dw $61C1 ; Moonside Hotel +dw $61C9 ; Sky +;todo here; Hotel wakeups +;Saturn house when bad carpainter +;run down onett house +;tala rama +;threed pizza shops +;fire spring sanc +;Mouse House + +GoodPhotoColors: +dw $0000 ; Blank +dw $0000 ; Giant Step as well???? +dw $0000 ; Giant Step +dw $0000 ; Onett +dw $0000 ; Twoson +dw $0007 ; Happy-Happy Free +dw $0007 ; Happy-Happy +dw $0003 ; Peaceful Rest Valley +dw $0006 ; Threed +dw $0004 ; Rain Circle as well????? +dw $0004 ; Rainy Circle +dw $0006 ; Threed Daytime +dw $0004 ; Winters +dw $0008 ; Saturn Valley +dw $0007 ; Grapefruit Falls +dw $0009 ; Dusty Dunes +dw $0009 ; Magnet Hill as well????? +dw $0009 ; Magnet Hill +dw $0009 ; Fourside (Make sure start-of-seed fourside isnt different) +dw $000F ; Summers +dw $0011 ; Scaraba Bazaar +dw $0011 ; Scaraba Desert +dw $000E ; Dalaam +dw $0012 ; Deep Darkness +dw $0013 ; Tenda Village +dw $0012 ; Lost Underworld +dw $0010 ; Memory house +dw $0007 ; Magicant +dw $0010 ; Deep Magicant +dw $0010 ; Sea of Eden +dw $0012 ; Cave of the Present +dw $000F ; Cave of the Past +dw $0005 ; Giygas's Lair +dw $0002 ; Lilliput Steps +dw $0002 ; Lilliput steps as well???? +dw $0008 ; Milky Well as well???? +dw $0008 ; Milky Well +dw $0008 ; Milky Well outdoors +dw $0002 ; Pink Cloud as well???? +dw $0002 ; Pink Cloud +dw $0005 ; Lumine Hall +dw $0005 ; Lumine Hall as well???? +dw $000B ; Threed Underground +dw $0010 ; Sea +dw $0000 ; Three-Two Tunnel +dw $0000 ; Threed-Desert tunnel +dw $0000 ; Desert Tunnel +dw $0000 ; Fourside Tunnel +dw $0005 ; PRV Connector Cave +dw $0005 ; Saturn Cave +dw $0010 ; Giant Step Cave +dw $0010 ; Lilliput Steps cave +dw $0010 ; Rainy Circle Cave +dw $0010 ; Milky Well Caves +dw $0011 ; Sewers +dw $0005 ; Pink Cloud Cave +dw $0013 ; Lumine Hall Cave +dw $0013 ; Fire Spring Cave +dw $0010 ; Lier's Cave +dw $0005 ; Bricroad's maze +dw $000A ; Stonehenge Entrance +dw $0004 ; Stonehenge Balcony +dw $0010 ; Stonehenge Flashing room +dw $0002 ; Belch's Factory +dw $0010 ; Monkey Caves +dw $0010 ; Gold Mine +dw $0007 ; Moonside +dw $0013 ; Pyramid +dw $0013 ; Dungeon Man +dw $0008 ; Arcade +dw $000C ; Onett Drugstore +dw $0010 ; Ness's House +dw $000C ; Burger shop +dw $0010 ; Onett Hint House +dw $000C ; Onett Bakery +dw $0010 ; Pokey's House +dw $0010 ; Onett Hotel +dw $0009 ; Police Station +dw $0010 ; Town Hall +dw $0010 ; Onett Green House +dw $0010 ; Onett Blue House +dw $0010 ; Onett seafoam house +dw $0010 ; Left of Hint House +dw $0010 ; Onett Pink House +dw $0009 ; Library +dw $0010 ; Lier's House +dw $0010 ; Onett hospital +dw $000A ; Treehouse +dw $0010 ; Traveler shack +dw $0009 ; Apple Kid +dw $0010 ; Orange Kid +dw $000C ; Bike Shop +dw $000C ; Twoson Dept Store +dw $0010 ; Everdred's House +dw $0012 ; Bus Station +dw $0010 ; Twoson Orange Roof +dw $0010 ; Twoson Hint House +dw $000B ; Chaos Theater +dw $0010 ; Twoson Hotel +dw $0010 ; Twoson Pizza +dw $0010 ; Twoson North Left House +dw $0010 ; Twoson North Right House +dw $0010 ; Twoson Cat House +dw $0010 ; Twoson Hospital +dw $0010 ; Paula's House +dw $0010 ; HH House +dw $0010 ; HH House +dw $0008 ; Happy HQ +dw $0008 ; Happy HQ +dw $000C ; Happy Drugstore +dw $000C ; Happy Drugstore +dw $0010 ; Happy Hospital +dw $0010 ; Happy Hospital +dw $0010 ; Happy Sturn House +dw $0010 ; Happy Hotel +dw $0010 ; Happy Hotel +dw $0010 ; Saturn Hotel +dw $0010 ; Saturn Hospital +dw $0010 ; Saturn Shop +dw $0010 ; Cabin +dw $000C ; Threed Drugstore +dw $000C ; Threed Drugstore Scary +dw $0010 ; Threed Hint Shop +dw $0010 ; Threed Hint Scary +dw $000C; Threed Bakery +dw $000C ; Threed Bakery Scary +dw $0010 ; Threed Hotel Scary +dw $000C ; Threed Pizza Scary +dw $0010 ; Threed Red House Scary +dw $0010 ; Tent +dw $0010 ; Tent Scary +dw $0010 ; Threed Hospital +dw $0010 ; Threed Hospital Scary +dw $0010 ; Snow Wood +dw $000C ; Winters drugstore +dw $000B ; Andonuts Lab +dw $0010 ; Winters tents +dw $0010 ; Miner shack +dw $0010 ; DD Drugstore +dw $000C ; Fourside Dept Store +dw $0010 ; Monotoli Building +dw $0010 ; Monotoli Gold Room +dw $0010 ; Monotoli upstairs +dw $0010 ; Monotoli Elevator +dw $0010 ; Monotoli Offices? +dw $0010 ; Monotoli penthouse +dw $0010 ; Topolla Theater +dw $000C ; Fourside Bakery +dw $000C ; Fourside Hotel +dw $000C ; Fourside Hotel +dw $000B ; Fourside Cafe +dw $000B ; Fourside Museum +dw $0010 ; Fourside Hospital +dw $0010 ; Stoic Club +dw $0010 ; Summers Shop +dw $0010 ; Summers Restaurant +dw $000B ; Summers Hotel +dw $0010 ; Summers Museum +dw $0010 ; Summers Hospital +dw $0010 ; Toto Shop +dw $0010 ; Scaraba Shop +dw $0010 ; Scaraba Hotel +dw $0010 ; Scaraba House +dw $0010 ; Scaraba Hospital +dw $0010 ; Toto House +dw $000D ; Dalaam Palace +dw $0010 ; Dalaam House +dw $0000 ; Magicant Shop +dw $0000 ; Magicant House +dw $0000 ; Flying Man House +dw $0010 ; Moonside Hotel +dw $0013 ; Sky + +ORG $F89000 +incbin CrashFont.bin + +ORG $F89200 +incbin crashscreen.bin + +ORG $F3F000 +DisplayAndGetMoney: +db $01 +db $1F, $02, $74 +db $18, $0A +db $18, $03, $01 +db $10, $3C +db $19, $10, $01 +db $1B, $04 +db $70, $58, $1C, $02, $00, $50, $97, $9F, $A4, $50, $54, $1B, $06 +db $1C, $0A, $00, $00, $00, $00 +db $5E, $59 +db $02 + +DisplayAndGetMoneyPSI: +db $18, $0A +db $18, $01, $01 +db $19, $10, $01 +db $1B, $04 +db $70, $58, $1C, $02, $00, $50, $97, $9F, $A4, $50, $54, $1B, $06 +db $1C, $0A, $00, $00, $00, $00 +db $5E, $59 +db $1F, $02, $74 +db $10, $3C +db $02 + +DisplayAndGetMoneyPause: +db $18, $0A +db $18, $03, $01 +db $19, $10, $01 +db $1B, $04 +db $70, $58, $1C, $02, $00, $50, $97, $9F, $A4, $50, $54, $1B, $06 +db $1C, $0A, $00, $00, $00, $00 +db $5E, $59 +db $1F, $02, $74 +db $10, $3C +db $03 +db $1D, $19, $01 +db $02 + +;ORG $EEB0DA +;dd DisplayAndGetMoneyPause + +;ORG $EEAA08 +;dd DisplayAndGetMoneyPSI + + + +;todo, PSI rockin? + + + + + + +;ORG $C93B60 +;db $B1, $63, $03;Font test, delete later. Also update the saturn font + + +;ORG $D59CD3 +;db $42;spell type test + +;ORG $D59CC9 +;dw $016D + + + +;;;;;;;;;;;NAME STUFF PLS DELETE +;ORG $C1F984 +;LDA #$0006;character limit in the name screen + +;ORG $C193BA +;LDA #$0006;Character limit on are you sure screen + +;ORG $C19924 +;LDX #$0006; Character menu header, goods/status + + +;B580 reserved for new names? +;;;;;;;;;;;;;;;;;; + + + +;ORG $C07482 +;JSL FixTentBug + +;ORG $FFFBE0 +;FixTentBug: +;CMP #$0400 +;BCS .Bail +;CPX #$0500 +;BCS .Bail +;STY $10 +;STA $0E +;RTL +;.Bail: +;SEP #$20 +;PLA +;PLX +;LDA #$FF +;PLD +;RTL \ No newline at end of file diff --git a/worlds/earthbound/src/new psi animations/PSI Blast Alpha.gif b/worlds/earthbound/src/new psi animations/PSI Blast Alpha.gif new file mode 100644 index 0000000000000000000000000000000000000000..f969150a8071f4c1a8b74452457dfea36929f768 GIT binary patch literal 8856 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 Q$NRQpss#RDOW>z}0%AvJ{r~^~ literal 0 HcmV?d00001 diff --git a/worlds/earthbound/src/new psi animations/PSI Blast Beta.gif b/worlds/earthbound/src/new psi animations/PSI Blast Beta.gif new file mode 100644 index 0000000000000000000000000000000000000000..018038694635b545a0aed50c109b1d5415b66ee0 GIT binary patch literal 9697 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 bP4uSi44ml8@GGBSWrhq*u<7$a@3Hz{OtYhv literal 0 HcmV?d00001 diff --git a/worlds/earthbound/src/new psi animations/PSI Blast Omega.gif b/worlds/earthbound/src/new psi animations/PSI Blast Omega.gif new file mode 100644 index 0000000000000000000000000000000000000000..27b1f32cb486ea1f6d24d00abbe8d896a517cbe9 GIT binary patch literal 10280 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 NHm$GnGrG;U{{~M(L3;oI literal 0 HcmV?d00001 diff --git a/worlds/earthbound/src/new psi animations/PSI Missile Alpha.gif b/worlds/earthbound/src/new psi animations/PSI Missile Alpha.gif new file mode 100644 index 0000000000000000000000000000000000000000..69c5ecc9ebbd933ef42c031f204e4953cc57e0d8 GIT binary patch literal 4344 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 P6_wF@Rb~9C2D0Nnv;+42 literal 0 HcmV?d00001 diff --git a/worlds/earthbound/src/new psi animations/PSI Missile Gamma.gif b/worlds/earthbound/src/new psi animations/PSI Missile Gamma.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e846415c602c4d14690229cfbf739e3472ddc4d GIT binary patch literal 8509 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 CX0W{g literal 0 HcmV?d00001 diff --git a/worlds/earthbound/src/new psi animations/PSI Missile Omega.gif b/worlds/earthbound/src/new psi animations/PSI Missile Omega.gif new file mode 100644 index 0000000000000000000000000000000000000000..66114dfe09efd6a4b9d35024e87c640b4e52deeb GIT binary patch literal 13793 zcmeHu2T)YY*6sij1jK}Z2na}y$|%u*pkxIVL6D4R$U#t|WF#kv4mqa*hMaQ_L(Vx# zm>C#y8p6Dd|E*i6-o58Pb>2IF)jjW>rix8hcdzxWwYooccdsoiDj5D4zvK0qx{gF+!t1O$pZHy1zwG$No71OkG<0oDVc zfW8nM6oNxQaDaJ$KLD7(XuutS{QwBSLI5=&3;+$F1iAt^0L6f8Kr|o=cka3KW}prf z1Qd!pcO+mRpcbeh5KsgT@GD?0fC6ZQ;t)_A;77pIfCB(rKzG2=fVF@t0e=86fzg0F z08D_vfQ0~RKo|fT7zw}vZ~%${*??%=d5F$?1I<7kC^#TufFl9>0JT63@pF=$`}JqM z&l`V+@Z8NmqjKK&r=!ok{?m8oLw~yCJP1E6JeTwn^m$Bv;y4%lQ#3FgfG7dZ18f3R zG2zHwK39Gt`Bdq-0N-5#JYZ@w9bLFU1Uz|uPIF+HfJkyccqDW(`H2l4B-gn#+Vhi| zyszAmi@3b2%uq^^i<2wK9)`UuGM?@%fsMj-n*8YHOLNAH3%Pbc=!7nQ}x!OS->t?tSa^k}|*SNw~r()G!5YxGQaRoTXDy$9Ltm(}H4 zi|t|D+C9}3J1c!D@(C|%D)-Q1!bK*tJvCJa8*@$mw-sxvk9JlEVcNa5HOB{=i(Ltd zb+xC*hdb!m-nu$~7>GFLTrW@=&bg7Wfivga$pu&EJg!J_%zIL*7|wsCfn?5m(b=rd zdoy}*EcmcQ8ZP*9q-QSp@szGE_}^{i;9U&3KVrBTD7>7x81!&|bun0+i1SCtGb*DW z-(=XbeuOFrB7cM_NpUWPE2|jYT8elF$y$okut6?G>3DH2fBz6^vnA)*Dpkta^&cRgH7ez@uSsS-n~w;r3&%CGp+m+9*b6o#z~h zR;0$iFu7xX`9AEmzb8Hag&9M=;K_ETs^>~aA)Ktrh!ZVeaJ$sC!Bvma0VSW<}SHQAH^xta30U|v0+A7L-H-=zhs;$L+2ez#N}6-6syl1L9n*qd8iL${K00f3LCSKvm;wBB zf68{_^kB}L|LpKbl*QT6Y6koayH>VwcD&ifk2_)69ksxn9UuU?Rrb8OOvwCIF|a(r=`_tw?+qJK`@Abx<)LoC z-8@{osy}g$@O+SfsLUNN7Sz~$@buM-;yyC-V{?I0%=Y1-&$r*{2P-_~oDX@;R}mgT z-D<$1tWityA@cQCUuLK@QHNfbv4C%Sm=qMb7-MGMksj#Sp|%vKyxd_BWHR8Jq2(~a zX_(-7mX-GUE1LsHqT}PrOdr2UHDtsah^SF$lnsoRxVKA|*B*1lH8V^UfwsJ4AujN#e-l0ot9oPGEuld+&Ez7$>Wv#lPgWf|U zr;X6xl(*wsWdK*_Q0EkXcY5|oLHE7Ihda%q>QjZiLIm{YWjq!!_Xk8rAMhzD*4-#k zd{g%JfubrrqU7cKjNu0_wG(cXzR-_)EBL}7IHFX+WTmWF$xQXoM(Ja(kkF8=e4Nm* zAB;ZYAqP2n+b|2W}s|CnjviC`GL$Yfa6ba8n^my^ig!`lj8g%ekINbkprhK;i{;o;cLS0L2=M==fd8p~>3;?VEQSbT zE-Za}isfJpc~AN|EzHIV%BrZRlBEiL6gr;zjk>ig9V(IpO^H+<5m|~gw((7iH^UgQ zM;WOfEhoIXhFXb}C(X|A{=|%8OL)=&U4?px(uSvgRqr&6_cE`fPLEO{<%m!4!x|=v zx=pM^h-YCJGV|l*jI+}jM6-NK+||Nh9DJRS)QTXrYG%VceQC zts=bH}y>_TFUHaVDRQPbSO@+VOdW0z|c6X3o+R1G2x`z{d>_V7X!N7JWo#61Sl~d8^W9^*M zNrNW(f(hQPT`NtOLCQl7kK@w^ZT8ov*XMgXb9eFrRJ#v`g~j5LLw@q7Hp`*<&bter zivsTr#)}0CH_CXM3!)O=pIIY+DSKQo;wl|4xMl(mvU!~&naggc)^leULEptMUh8qc z(kRbpDfl}SKyDz@L_4wRC5%X-ux)Q*z;1erlP6#CmT6|D-SUx9NWK=;-pnSt<;$iN zkW85&)54{`<@XMeOjXw2!soE%uS1?f(DR8gLkJWq;(=&iM)4qA0yzX>XNF4+OO zRo;SWzFU}rQGqU#sxP%Nyp-bp7 zF%{%xKP*#DB&yN%N2IX3g?s8bm=;|K!mRCf)EX>@nV_1#e)cs&pypBr`Fayu9UXTo zQJcJV%Y(N2A4?f_z6kU@og}x)5(pL>=sjG{;qQ>R->Bxo#{A+V=jN8WILgDJ82;45LRbRJ(fVa)=i%wL9_G_=$2!Kjtv6cAKWwS- z)mvP12sGV5c2&c#2;Dxp%_*~#Kg1dNxFN4IDsyC(FGH8?%<$&%=}AN`^|W~|J)L(^ zZl}6>^(@%)Mu6^Qjx-f@c8ixQt%8+XfozrmDRe6`ZK4xf zL3W4~hJ*ID$Jni4SMpRwV%c^H+U*b@#NXWWKX^RxANDTu=Wve!oSDgF%^yaEMoD*u z%BdD-K%SZ9*lJdxpHIwSVR^ZQ7kLYMlS#~r0<4B|;f0~{JTmA)zr3n3bxOFWmpLha z&5_C^rlO(8@4dzI1BNbm{v!TbPWkdaEWh~r4TNbuB|pNTk-{LrvT6SD8h;rvS+&`B zCROr+XVO~x+#HHp3x~&1T7rF*Df&01Mgt<4!24XC2%T`mIRMm_e&7R z<)ys@PrVvY;y2rEzaZ^&zhCvZnrA@0H^*vJA%X7daQU)=O$#5)tY8eMQMX<)ekJKN zcXH_^{eJ65?#cbBjh8&Oc4osngOObScZu`#>(fbYF47bNRz5b@uM008G8(7y{>h` zG;A}O0C#<-z~!Y7CLD+Pyg7XNcDZ67+S$o>Qm9wxO|xU~edVQ$)0z;pf3WcJ%6r^n z|9R;Rdu8P8^y8zwnBM&_(L1wCRFvX--EeWjp;^3(-$e<|dbt&?=Rgm_#eW0_yA@rZ z+nqb8FK_t8!wioJpI9)rG2*$W$x|jmSz+oMke088Zu4(H7*f%y5Vv@JXqZ?2Bu5ha z+wU@egnKLl*nW?D6jGUCG*|xKN&SDallqTfA1<=~nt`4cixQGk|MwPIyUW~plK2+4 zAPw`|M@o$|rH-2X;evm{@3w#uSk zWt696KuCVKxJ%V#8a}3>f9dm>ju4r}ggMUOl5L?ie^u$Ygkx&S)T4~5{u$dS-tuXB zyq7kU9to!(r~R6KDX$D5;IW!zElRbT^D%hLv-AYqQPIk;>3oM~vtyUyC^>I%zS;zRSL6X16f`r*$3q#r6{AR@KV%_3aeyS+U8$x|Wk2yE@Ea zdz-%Y!^v^t1aQM6$(G~w`KZ;0N3Aj1&f9VP4<4hYUzsE+ z!V)GxnfckVK`sP5A*juj0#e>9ZXb6#@mN)!5S9kJc^2sq_D9tdJ_>Pfyd%Hcc}Juu zAfK0gNQdO~ZDV1oB`^Pw5?RKBrh?|Xq`X4SaumIVlCWL5E5iSNC-ukJ=bU`l{<}9H zfPJVt+NI3zG5*a!e>2b@*n9n7zW@A+fueqsfi$kfUnz>=1!%}P#Oe}+hrfkI?3nNA z*f(~8+Do?{e*Dz(fX4bG_wBBa9j6OliaH1stE?+74I^@T_%o_P`j#tmK6L>M^eKfN zO#h&rf^hSG*z=7kI>}Z|Gh{FOvFL+-c_9<)5&p~JnV+;4)dj~JgZ%d=d4ju(+N=gI z;qH$(B&_w<7#x^=ly<%BR5rxgM7BTo<&JatxV>2I!Kk%Zp52lSG2c;xCx4LbKn$2K zYvl!hfc*kL(&R9`DZZ9x)#g@UHd-Wu{cwdhi$ZJ)n(?x-HGP($OukaG`*`c#jaj=j z&}=gn<$SPvf(cH+4DPn7;wpF5B@^})$M}Q4tml$le%O#laO3gPvg7!py+ZZ}6_b%s zG&P44k`HiYpU^H(j`yy=1{G1)v781w*Id`Zzt}F4zNV;G&aFg%M!Ahv((z5c;KqTAm>0#aGnWjo~5w?n@p zQrUz$I>d_w*Vq2RB08@1AiQQl7ludMpFn+SVr^RV+k0!eb+#@%T4J9& zmYOVxH=IuG;K<1Y)hF7IZFdfGtEg#kM%c5U(=u&k{1NFHSCHUa9p``ef9{Hji% zNOt>Tkf4B9isxeo!wEXHDtaLyY}qI)=GI=tYNEe=HfIX0FBfN;m1s0Fiy2x8(ap0`&(2O5Aw_2E zxl^L!eb(iSrE1-yQR&TRey{Q~OJ&fRFjOTEtdH3*=h>hXEG4&Z8LLzRzZTG%n{&~r z3$43A>!?)G$n~Bl&zAN+M`g!8HmCH$TW_Z7GCdRHr;9b-7T({YNvG>E6m<1<13i;@ zk|f$)IkmkKLz@9;i7%_Aq^hwSO>_oTmXg=?jX&1EY8C5ixEc14FNU+|eL_e7*Dqc?xk+ z%eLA2me&5b6*0wLPd?Yo>sd=ML-@4BAUWl7lY5QGf`8E^zKFzQCr-s!7+NGCO_k4K z=zba>d^u;3p>mXzA{y7@8=IAX5Q{^B?zaT6yt*RkU)ye28~k$^a9@kTMJHgrIY`KA&(eChK@vPzw{i>QfAyLbm3+6$lj^bqsl0=8= z+sa8!SNEglU*1|CRr8VfCX?uW3ICUcud_~>gMRcBBq{Q2mEY9@Icq)dc#_Gj-U;Si zH`EQFITL0Hl%l%GVjyAV!{VpJAfgw_yL^}$pxhb73KC2nO7&4NA77HyHoln_`i`&S z6;wlAWC{AVk@H%NzPeOK4Bd2AI>bQ^n(_U8p&?_UBV;He%pyIDBiiST(;z08loXl# z5nI8Q6dnylrUtm%BU8X^6UfBGg^IqU2*Jvm*{SN;S75OYo$To;tz1`gKC5`avfu;J zb|`rCNaym?K#V#Eq*Wao=hKlbYLeB59oKU1?sQ0j=Z<7gmlB!5G)o%rP0-~P*Dhdu zV0`2*6@t2O@E7q*jojK|sV*n^xqHDg& z+bw0GYh3MuxHZ-;TJO$*YW_B!`_N~Tw~C86nKZ$*0#Pg_J&NeAPo3PeUs#9bC&xd9 z=qvK(`O&d=TPsNEU%KaR6mtnYp#?j=_tNZ173Z`gwbQ{1dxFzaMYlW0Wv@&mBZa5l zz9|)+_eRr-yb2alsqhL@v=Q-v%9kGb$4T$ozf4gzz#=m<^026!G7J`--^O>mRy=Ah zcD!D`l6Q=$KENFR(aaLYe@!j<)m1c@@~?mF@uwyA;eICdInLt|Tp%K0q^!2vF6btp z(SCg5u$w!Y}F}N#FBYjiUE29wK9+P--aq#kaZNQFbYfcE)KRZL*bM;UgEX=Dvug zh2ar@j(H>7bA`J#l#0>jHGC@7Tg_Mfa`@X=9oP6euf(j~trj9wh(>_> zd7`_it&RoiMCQq(dpUOkX#04ZPBMBP-FZ|za1XpbJ*XtjyEmk)YPL80&LDShM8kG{ zZ&b&dcYo|dl-d5ckYPsd{)B1S`u?P48}Gr?r%|(mX}gu&gPAV}>j$&0#C(Typ48@t z^FHi(hYJBhn8U>oX}+T$4B@KgM@!!g@{X2cZ81kHiQatJ)zm2S^R?Ua`mdj5`6sWa zU!}=*6A+P*UlE63_trh?i0fx+9I#t%z3|)CE@!i6z@d*N-oEW^7cBi@f;=IcaH88~ zQJ)0Y>zx^i;+LG2b-ZfL>~v)qq)6tx>1-(VzFyl_WtL`V7GCh+HXmAWuj%Fp4Ww#3 zWRek1r_m0e-8Mi5v4Epon=#^J_L;~xsX-L>coO5+h^j5);r?kM6UU=KXb)$WF%_xDQ8Cf zlFrE{=^yXAni|aI#~xaahh2V(_e^~;P0Up|Rnx5&8n8jmRx6$D+EyE*H_vuEOO)w$2S-NEb|+8S+IH97 zHl7{C{ZZ4MZsC=jot}pWYdgK-#0tC zS)mMAnjcU|I%i^x3_fVZN_jw5+s8_9jQ!~+Qo9T*RfsZ&mA6*7V&+GGl_8Fg!7nMZ zEW^^^Q&wVy?_-nGgi!{E`}JjLOPP&qihEl%i0u{8lb>PVtB_I=6f|8=Y6Z zk3z%iiMZGDo2g9J3fkEOU~7d4LG)TtpA`3c@sNtiddV0Bwq81AgI+J2^Ww&o|A;if zRIH}MFqLbiXiU{+D;@Vn_3nttM$O^!|2Efo)c>a2e}0t^^V@UqpI;>){%bNmJ3Tp~ zW^e`V9?Uuul9DjE5lJ;Cy3anc({Wvp^-=O5R4Zq6r=enD^u#x!Ve)3&mcHV{>|mhl z!b97v=fY`2eMb^(u9_kt1c|yMA*MB&^7M&HS+XSF1=%<+)=CoBZ-c(ye~9A?aBBJ~ za&fRazZ3ko-y~!$N1K)+mt!njIagvojTo)O*)3s xuOe-N*pBizW`Agh%o>F literal 0 HcmV?d00001 diff --git a/worlds/earthbound/src/new psi animations/PSI Missile beta.gif b/worlds/earthbound/src/new psi animations/PSI Missile beta.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b0931231870233ea1e0a92803c71a772a04502d GIT binary patch literal 8216 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 aQAcvZhXo_KXJ>y;D(ydH)jDwevG_aO%EP+= literal 0 HcmV?d00001 diff --git a/worlds/earthbound/test/__init__.py b/worlds/earthbound/test/__init__.py new file mode 100644 index 0000000000..12f2a83e28 --- /dev/null +++ b/worlds/earthbound/test/__init__.py @@ -0,0 +1,6 @@ +from test.bases import WorldTestBase + + +class EarthBoundTestBase(WorldTestBase): + game = "EarthBound" + player = 1 diff --git a/worlds/earthbound/test/test_access.py b/worlds/earthbound/test/test_access.py new file mode 100644 index 0000000000..c2c98ea0be --- /dev/null +++ b/worlds/earthbound/test/test_access.py @@ -0,0 +1,66 @@ +from . import EarthBoundTestBase + + +class TestPSIShuffle(EarthBoundTestBase): + options = { + "PSIShuffle": 1 + } + + +class TestExtendedPSIShuffle(EarthBoundTestBase): + options = { + "PSIShuffle": 2 + } + + +class TestBossShuffle(EarthBoundTestBase): + options = { + "BossShuffle": 1 + } + + +class TestBossShuffleWithDD(EarthBoundTestBase): + options = { + "BossShuffle": 1, + "DecoupleDiamondDog": 1 + } + + +class TestBossShuffleGiygas(EarthBoundTestBase): + options = { + "BossShuffle": 1, + "ShuffleGiygas": 1 + } + + +class TestBossShuffleFull(EarthBoundTestBase): + options = { + "BossShuffle": 1, + "ShuffleGiygas": 1, + "DecoupleDiamondDog": 1 + } + + +class TestShopChecks(EarthBoundTestBase): + options = { + "ShopRandomizer": 2, + } + + +class TestDungeons(EarthBoundTestBase): + options = { + "DungeonShuffle": True, + } + + +class TestEnemizer(EarthBoundTestBase): + options = { + "EnemizerStats": True, + "EnemizerAttacks": True, + "EnemizerAttributes": True, + } + +class TestMapPalettes(EarthBoundTestBase): + options = { + "RandomMapColors": 3, + } \ No newline at end of file