From 1e366ff66f700ca90f95989cb35375a552ff7686 Mon Sep 17 00:00:00 2001 From: strotlog <49286967+strotlog@users.noreply.github.com> Date: Tue, 26 Jul 2022 00:43:39 -0700 Subject: [PATCH] SM: smoother co-op, basepatch internal improvements (#793) * SM: remote touch instantly, pull ips refactor and symbols * SM: remove hard-coded ROM address writes * SM: Full length player table, incl. receive-only player ids + apply PR feedback (correct graphic offset, readable data file paths) --- .gitignore | 3 + worlds/sm/Rom.py | 49 +- worlds/sm/__init__.py | 221 ++++-- .../multiworld-basepatch.ips | Bin 0 -> 17952 bytes .../data/SMBasepatch_prebuilt/multiworld.sym | 689 ++++++++++++++++++ .../sm-basepatch-symbols.json | 141 ++++ .../SMBasepatch_prebuilt/variapatches.ips} | Bin 45423 -> 27590 bytes worlds/sm/data/sourceinfo.txt | 3 + worlds/sm/variaRandomizer/rom/rompatcher.py | 2 - 9 files changed, 1027 insertions(+), 81 deletions(-) create mode 100644 worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips create mode 100644 worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym create mode 100644 worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json rename worlds/sm/{variaRandomizer/patches/common/ips/basepatch.ips => data/SMBasepatch_prebuilt/variapatches.ips} (54%) create mode 100644 worlds/sm/data/sourceinfo.txt diff --git a/.gitignore b/.gitignore index 37337234..58122d64 100644 --- a/.gitignore +++ b/.gitignore @@ -116,6 +116,9 @@ target/ profile_default/ ipython_config.py +# vim editor +*.swp + # SageMath parsed files *.sage.py diff --git a/worlds/sm/Rom.py b/worlds/sm/Rom.py index a01fcbe3..e2957fe0 100644 --- a/worlds/sm/Rom.py +++ b/worlds/sm/Rom.py @@ -1,11 +1,12 @@ import hashlib import os +import json import Utils from Patch import read_rom, APDeltaPatch SMJUHASH = '21f3e98df4780ee1c667b84e57d88675' -ROM_PLAYER_LIMIT = 65535 +ROM_PLAYER_LIMIT = 65535 # max archipelago player ID. note, SM ROM itself will only store 201 names+ids max class SMDeltaPatch(APDeltaPatch): @@ -17,7 +18,6 @@ class SMDeltaPatch(APDeltaPatch): def get_source_data(cls) -> bytes: return get_base_rom_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: @@ -40,3 +40,48 @@ def get_base_rom_path(file_name: str = "") -> str: if not os.path.exists(file_name): file_name = Utils.user_path(file_name) return file_name + +def get_sm_symbols(sym_json_path) -> dict: + with open(sym_json_path, "r") as stream: + symbols = json.load(stream) + symboltable = {} + for name, sixdigitaddr in symbols.items(): + (bank, addr_within_bank) = sixdigitaddr.split(":") + bank = int(bank, 16) + addr_within_bank = int(addr_within_bank, 16) + # categorize addresses using snes lorom mapping: + # (reference: https://en.wikibooks.org/wiki/Super_NES_Programming/SNES_memory_map) + if (bank >= 0x70 and bank <= 0x7d): + offset_within_rom_file = None + # SRAM is not continuous, but callers may want it in continuous terms + # SRAM @ data bank $70-$7D, addr_within_bank $0000-$7FFF + # + # symbol aka snes offestwithincontinuousSRAM + # --------------- -------------------------- + # $70:0000-7FFF -> 0x0000- 7FFF + # $71:0000-7FFF -> 0x8000- FFFF + # $72:0000-7FFF -> 0x10000-17FFF + # etc... + offset_within_continuous_sram = (bank - 0x70) * 0x8000 + addr_within_bank + offset_within_wram = None + elif bank == 0x7e or bank == 0x7f or (bank == 0x00 and addr_within_bank <= 0x1fff): + offset_within_rom_file = None + offset_within_continuous_sram = None + offset_within_wram = addr_within_bank + if bank == 0x7f: + offset_within_wram += 0x10000 + elif bank >= 0x80: + offset_within_rom_file = ((bank - 0x80) * 0x8000) + (addr_within_bank % 0x8000) + offset_within_continuous_sram = None + offset_within_wram = None + else: + offset_within_rom_file = None + offset_within_continuous_sram = None + offset_within_wram = None + symboltable[name] = {"bank": bank, + "addr_within_bank": addr_within_bank, + "offset_within_rom_file": offset_within_rom_file, + "offset_within_continuous_sram": offset_within_continuous_sram, + "offset_within_wram": offset_within_wram + } + return symboltable diff --git a/worlds/sm/__init__.py b/worlds/sm/__init__.py index 59c3c463..1de31626 100644 --- a/worlds/sm/__init__.py +++ b/worlds/sm/__init__.py @@ -16,7 +16,7 @@ from .Items import lookup_name_to_id as items_lookup_name_to_id from .Regions import create_regions from .Rules import set_rules, add_entrance_rule from .Options import sm_options -from .Rom import get_base_rom_path, ROM_PLAYER_LIMIT, SMDeltaPatch +from .Rom import get_base_rom_path, ROM_PLAYER_LIMIT, SMDeltaPatch, get_sm_symbols import Utils from BaseClasses import Region, Entrance, Location, MultiWorld, Item, ItemClassification, RegionType, CollectionState, Tutorial @@ -201,10 +201,7 @@ class SMWorld(World): create_locations(self, self.player) create_regions(self, self.world, self.player) - def getWord(self, w): - return (w & 0x00FF, (w & 0xFF00) >> 8) - - def getWordArray(self, w): + def getWordArray(self, w): # little-endian convert a 16-bit number to an array of numbers <= 255 each return [w & 0x00FF, (w & 0xFF00) >> 8] # used for remote location Credits Spoiler of local items @@ -269,109 +266,175 @@ class SMWorld(World): itemName = "___" + itemName + "___" for char in itemName: - (w0, w1) = self.getWord(charMap.get(char, 0x3C4E)) + [w0, w1] = self.getWordArray(charMap.get(char, 0x3C4E)) data.append(w0) data.append(w1) return data def APPatchRom(self, romPatcher): - multiWorldLocations = {} - multiWorldItems = {} + # first apply the sm multiworld code patch named 'basepatch' (also has empty tables that we'll overwrite), + # + apply some patches from varia that we want to be always-on. + # basepatch and variapatches are both generated from https://github.com/lordlou/SMBasepatch + romPatcher.applyIPSPatch(os.path.join(os.path.dirname(__file__), + "data", "SMBasepatch_prebuilt", "multiworld-basepatch.ips")) + romPatcher.applyIPSPatch(os.path.join(os.path.dirname(__file__), + "data", "SMBasepatch_prebuilt", "variapatches.ips")) + symbols = get_sm_symbols(os.path.join(os.path.dirname(__file__), + "data", "SMBasepatch_prebuilt", "sm-basepatch-symbols.json")) + multiWorldLocations = [] + multiWorldItems = [] idx = 0 self.playerIDMap = {} - playerIDCount = 0 # 0 is for "Archipelago" server + playerIDCount = 0 # 0 is for "Archipelago" server; highest possible = 200 (201 entries) + vanillaItemTypesCount = 21 for itemLoc in self.world.get_locations(): - romPlayerID = itemLoc.item.player if itemLoc.item.player <= ROM_PLAYER_LIMIT else 0 if itemLoc.player == self.player and locationsDict[itemLoc.name].Id != None: + # this SM world can find this item: write full item data to tables and assign player data for writing + romPlayerID = itemLoc.item.player if itemLoc.item.player <= ROM_PLAYER_LIMIT else 0 if itemLoc.item.type in ItemManager.Items: itemId = ItemManager.Items[itemLoc.item.type].Id else: itemId = ItemManager.Items['ArchipelagoItem'].Id + idx - multiWorldItems[0x029EA3 + idx*64] = self.convertToROMItemName(itemLoc.item.name) + multiWorldItems.append({"sym": symbols["message_item_names"], + "offset": (vanillaItemTypesCount + idx)*64, + "values": self.convertToROMItemName(itemLoc.item.name)}) idx += 1 if (romPlayerID > 0 and romPlayerID not in self.playerIDMap.keys()): playerIDCount += 1 self.playerIDMap[romPlayerID] = playerIDCount - (w0, w1) = self.getWord(0 if itemLoc.item.player == self.player else 1) - (w2, w3) = self.getWord(itemId) - (w4, w5) = self.getWord(romPlayerID) - (w6, w7) = self.getWord(0 if itemLoc.item.advancement else 1) - multiWorldLocations[0x1C6000 + locationsDict[itemLoc.name].Id*8] = [w0, w1, w2, w3, w4, w5, w6, w7] + [w0, w1] = self.getWordArray(0 if itemLoc.item.player == self.player else 1) + [w2, w3] = self.getWordArray(itemId) + [w4, w5] = self.getWordArray(romPlayerID) + [w6, w7] = self.getWordArray(0 if itemLoc.item.advancement else 1) + multiWorldLocations.append({"sym": symbols["rando_item_table"], + "offset": locationsDict[itemLoc.name].Id*8, + "values": [w0, w1, w2, w3, w4, w5, w6, w7]}) - if itemLoc.item.player == self.player: + elif itemLoc.item.player == self.player: + # this SM world owns the item: so in case the sending player might not have anything placed in this + # world to receive from it, assign them space in playerIDMap so that the ROM can display their name + # (SM item name not needed, as SM item type id will be in the message they send to this world live) + romPlayerID = itemLoc.player if itemLoc.player <= ROM_PLAYER_LIMIT else 0 if (romPlayerID > 0 and romPlayerID not in self.playerIDMap.keys()): playerIDCount += 1 self.playerIDMap[romPlayerID] = playerIDCount - itemSprites = ["off_world_prog_item.bin", "off_world_item.bin"] + itemSprites = [{"fileName": "off_world_prog_item.bin", + "paletteSymbolName": "prog_item_eight_palette_indices", + "dataSymbolName": "offworld_graphics_data_progression_item"}, + + {"fileName": "off_world_item.bin", + "paletteSymbolName": "nonprog_item_eight_palette_indices", + "dataSymbolName": "offworld_graphics_data_item"}] idx = 0 - offworldSprites = {} - for fileName in itemSprites: - with open(Utils.local_path("lib", "worlds", "sm", "data", "custom_sprite", fileName) if Utils.is_frozen() else Utils.local_path("worlds", "sm", "data", "custom_sprite", fileName), 'rb') as stream: + offworldSprites = [] + for itemSprite in itemSprites: + with open(os.path.join(os.path.dirname(__file__), "data", "custom_sprite", itemSprite["fileName"]), 'rb') as stream: buffer = bytearray(stream.read()) - offworldSprites[0x027882 + 10*(21 + idx) + 2] = buffer[0:8] - offworldSprites[0x049100 + idx*256] = buffer[8:264] + offworldSprites.append({"sym": symbols[itemSprite["paletteSymbolName"]], + "offset": 0, + "values": buffer[0:8]}) + offworldSprites.append({"sym": symbols[itemSprite["dataSymbolName"]], + "offset": 0, + "values": buffer[8:264]}) idx += 1 - - openTourianGreyDoors = {0x07C823 + 5: [0x0C], 0x07C831 + 5: [0x0C]} - deathLink = {0x277f04: [self.world.death_link[self.player].value]} - remoteItem = {0x277f06: self.getWordArray(0b001 + (0b010 if self.remote_items else 0b000))} + deathLink = [{"sym": symbols["config_deathlink"], + "offset": 0, + "values": [self.world.death_link[self.player].value]}] + remoteItem = [{"sym": symbols["config_remote_items"], + "offset": 0, + "values": self.getWordArray(0b001 + (0b010 if self.remote_items else 0b000))}] + ownPlayerId = [{"sym": symbols["config_player_id"], + "offset": 0, + "values": self.getWordArray(self.player)}] - playerNames = {} - playerNameIDMap = {} - playerNames[0x1C5000] = "Archipelago".upper().center(16).encode() - playerNameIDMap[0x1C5800] = self.getWordArray(0) + playerNames = [] + playerNameIDMap = [] + playerNames.append({"sym": symbols["rando_player_table"], + "offset": 0, + "values": "Archipelago".upper().center(16).encode()}) + playerNameIDMap.append({"sym": symbols["rando_player_id_table"], + "offset": 0, + "values": self.getWordArray(0)}) for key,value in self.playerIDMap.items(): - playerNames[0x1C5000 + value * 16] = self.world.player_name[key][:16].upper().center(16).encode() - playerNameIDMap[0x1C5800 + value * 2] = self.getWordArray(key) + playerNames.append({"sym": symbols["rando_player_table"], + "offset": value * 16, + "values": self.world.player_name[key][:16].upper().center(16).encode()}) + playerNameIDMap.append({"sym": symbols["rando_player_id_table"], + "offset": value * 2, + "values": self.getWordArray(key)}) patchDict = { 'MultiWorldLocations': multiWorldLocations, 'MultiWorldItems': multiWorldItems, 'offworldSprites': offworldSprites, - 'openTourianGreyDoors': openTourianGreyDoors, 'deathLink': deathLink, 'remoteItem': remoteItem, + 'ownPlayerId': ownPlayerId, 'PlayerName': playerNames, 'PlayerNameIDMap': playerNameIDMap} + + # convert an array of symbolic byte_edit dicts like {"sym": symobj, "offset": 0, "values": [1, 0]} + # to a single rom patch dict like {0x438c: [1, 0], 0xa4a5: [0, 0, 0]} which varia will understand and apply + def resolve_symbols_to_file_offset_based_dict(byte_edits_arr) -> dict: + this_patch_as_dict = {} + for byte_edit in byte_edits_arr: + offset_within_rom_file = byte_edit["sym"]["offset_within_rom_file"] + byte_edit["offset"] + this_patch_as_dict[offset_within_rom_file] = byte_edit["values"] + return this_patch_as_dict + + for patchname, byte_edits_arr in patchDict.items(): + patchDict[patchname] = resolve_symbols_to_file_offset_based_dict(byte_edits_arr) + romPatcher.applyIPSPatchDict(patchDict) + openTourianGreyDoors = {0x07C823 + 5: [0x0C], 0x07C831 + 5: [0x0C]} + romPatcher.applyIPSPatchDict({'openTourianGreyDoors': openTourianGreyDoors}) + + # set rom name # 21 bytes from Main import __version__ - self.romName = bytearray(f'SM{__version__.replace(".", "")[0:3]}_{self.player}_{self.world.seed:11}\0', 'utf8')[:21] + self.romName = bytearray(f'SM{__version__.replace(".", "")[0:3]}_{self.player}_{self.world.seed:11}', 'utf8')[:21] self.romName.extend([0] * (21 - len(self.romName))) # clients should read from 0x7FC0, the location of the rom title in the SNES header. # duplicative ROM name at 0x1C4F00 is still written here for now, since people with archipelago pre-0.3.0 client installed will still be depending on this location for connecting to SM romPatcher.applyIPSPatch('ROMName', { 'ROMName': {0x1C4F00 : self.romName, 0x007FC0 : self.romName} }) - startItemROMAddressBase = 0x2FD8B9 + startItemROMAddressBase = symbols["start_item_data_major"]["offset_within_rom_file"] - # current, base value or bitmask, max, base value or bitmask - startItemROMDict = {'ETank': [0x8, 0x64, 0xA, 0x64], - 'Missile': [0xC, 0x5, 0xE, 0x5], - 'Super': [0x10, 0x5, 0x12, 0x5], - 'PowerBomb': [0x14, 0x5, 0x16, 0x5], - 'Reserve': [0x1A, 0x64, 0x18, 0x64], - 'Morph': [0x2, 0x4, 0x0, 0x4], - 'Bomb': [0x3, 0x10, 0x1, 0x10], - 'SpringBall': [0x2, 0x2, 0x0, 0x2], - 'HiJump': [0x3, 0x1, 0x1, 0x1], - 'Varia': [0x2, 0x1, 0x0, 0x1], - 'Gravity': [0x2, 0x20, 0x0, 0x20], - 'SpeedBooster': [0x3, 0x20, 0x1, 0x20], - 'SpaceJump': [0x3, 0x2, 0x1, 0x2], - 'ScrewAttack': [0x2, 0x8, 0x0, 0x8], - 'Charge': [0x7, 0x10, 0x5, 0x10], - 'Ice': [0x6, 0x2, 0x4, 0x2], - 'Wave': [0x6, 0x1, 0x4, 0x1], - 'Spazer': [0x6, 0x4, 0x4, 0x4], - 'Plasma': [0x6, 0x8, 0x4, 0x8], - 'Grapple': [0x3, 0x40, 0x1, 0x40], - 'XRayScope': [0x3, 0x80, 0x1, 0x80] + # array for each item: + # offset within ROM table "start_item_data_major" of this item"s info (starting status) + # item bitmask or amount per pickup (BVOB = base value or bitmask), + # offset within ROM table "start_item_data_major" of this item"s info (starting maximum/starting collected items) + # current BVOB max + # ------- ---- --- + startItemROMDict = {"ETank": [ 0x8, 0x64, 0xA], + "Missile": [ 0xC, 0x5, 0xE], + "Super": [0x10, 0x5, 0x12], + "PowerBomb": [0x14, 0x5, 0x16], + "Reserve": [0x1A, 0x64, 0x18], + "Morph": [ 0x2, 0x4, 0x0], + "Bomb": [ 0x3, 0x10, 0x1], + "SpringBall": [ 0x2, 0x2, 0x0], + "HiJump": [ 0x3, 0x1, 0x1], + "Varia": [ 0x2, 0x1, 0x0], + "Gravity": [ 0x2, 0x20, 0x0], + "SpeedBooster": [ 0x3, 0x20, 0x1], + "SpaceJump": [ 0x3, 0x2, 0x1], + "ScrewAttack": [ 0x2, 0x8, 0x0], + "Charge": [ 0x7, 0x10, 0x5], + "Ice": [ 0x6, 0x2, 0x4], + "Wave": [ 0x6, 0x1, 0x4], + "Spazer": [ 0x6, 0x4, 0x4], + "Plasma": [ 0x6, 0x8, 0x4], + "Grapple": [ 0x3, 0x40, 0x1], + "XRayScope": [ 0x3, 0x80, 0x1] + + # BVOB = base value or bitmask } mergedData = {} hasETank = False @@ -379,48 +442,52 @@ class SMWorld(World): hasPlasma = False for startItem in self.startItems: item = startItem.Type - if item == 'ETank': hasETank = True - if item == 'Spazer': hasSpazer = True - if item == 'Plasma': hasPlasma = True - if (item in ['ETank', 'Missile', 'Super', 'PowerBomb', 'Reserve']): - (currentValue, currentBase, maxValue, maxBase) = startItemROMDict[item] + if item == "ETank": hasETank = True + if item == "Spazer": hasSpazer = True + if item == "Plasma": hasPlasma = True + if (item in ["ETank", "Missile", "Super", "PowerBomb", "Reserve"]): + (currentValue, amountPerItem, maxValue) = startItemROMDict[item] if (startItemROMAddressBase + currentValue) in mergedData: - mergedData[startItemROMAddressBase + currentValue] += currentBase - mergedData[startItemROMAddressBase + maxValue] += maxBase + mergedData[startItemROMAddressBase + currentValue] += amountPerItem + mergedData[startItemROMAddressBase + maxValue] += amountPerItem else: - mergedData[startItemROMAddressBase + currentValue] = currentBase - mergedData[startItemROMAddressBase + maxValue] = maxBase + mergedData[startItemROMAddressBase + currentValue] = amountPerItem + mergedData[startItemROMAddressBase + maxValue] = amountPerItem else: - (collected, currentBitmask, equipped, maxBitmask) = startItemROMDict[item] + (collected, bitmask, equipped) = startItemROMDict[item] if (startItemROMAddressBase + collected) in mergedData: - mergedData[startItemROMAddressBase + collected] |= currentBitmask - mergedData[startItemROMAddressBase + equipped] |= maxBitmask + mergedData[startItemROMAddressBase + collected] |= bitmask + mergedData[startItemROMAddressBase + equipped] |= bitmask else: - mergedData[startItemROMAddressBase + collected] = currentBitmask - mergedData[startItemROMAddressBase + equipped] = maxBitmask + mergedData[startItemROMAddressBase + collected] = bitmask + mergedData[startItemROMAddressBase + equipped] = bitmask if hasETank: + # we are overwriting the starting energy, so add up the E from 99 (normal starting energy) rather than from 0 mergedData[startItemROMAddressBase + 0x8] += 99 mergedData[startItemROMAddressBase + 0xA] += 99 if hasSpazer and hasPlasma: + # de-equip spazer. + # otherwise, firing the unintended spazer+plasma combo would cause massive game glitches and crashes mergedData[startItemROMAddressBase + 0x4] &= ~0x4 for key, value in mergedData.items(): if (key - startItemROMAddressBase > 7): - (w0, w1) = self.getWord(value) + [w0, w1] = self.getWordArray(value) mergedData[key] = [w0, w1] else: mergedData[key] = [value] - - startItemPatch = { 'startItemPatch': mergedData } - romPatcher.applyIPSPatch('startItemPatch', startItemPatch) + startItemPatch = { "startItemPatch": mergedData } + romPatcher.applyIPSPatch("startItemPatch", startItemPatch) + + # commit all the changes we've made here to the ROM romPatcher.commitIPS() itemLocs = [ItemLocation(ItemManager.Items[itemLoc.item.type if itemLoc.item.type in ItemManager.Items else 'ArchipelagoItem'], locationsDict[itemLoc.name], True) for itemLoc in self.world.get_locations() if itemLoc.player == self.player] - romPatcher.writeItemsLocs(itemLocs) + romPatcher.writeItemsLocs(itemLocs) itemLocs = [ItemLocation(ItemManager.Items[itemLoc.item.type], locationsDict[itemLoc.name] if itemLoc.name in locationsDict and itemLoc.player == self.player else self.DummyLocation(self.world.get_player_name(itemLoc.player) + " " + itemLoc.name), True) for itemLoc in self.world.get_locations() if itemLoc.item.player == self.player] progItemLocs = [ItemLocation(ItemManager.Items[itemLoc.item.type], locationsDict[itemLoc.name] if itemLoc.name in locationsDict and itemLoc.player == self.player else self.DummyLocation(self.world.get_player_name(itemLoc.player) + " " + itemLoc.name), True) for itemLoc in self.world.get_locations() if itemLoc.item.player == self.player and itemLoc.item.advancement == True] diff --git a/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips b/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips new file mode 100644 index 0000000000000000000000000000000000000000..d7fd17613e8f2af2b5cc6ed5db11efbe9d227f07 GIT binary patch literal 17952 zcmeHNdrVu`8UOqMi~|YPl9ooKyS=5vl`2X|TFxqKBbN2O)6_8S7ECwYn8XZ zHX1n>hGQT~AW=J&{sRJ0VOYkbuG=NFBZNO<6GWIaDTq|!`ay7b+7N<$)5QDEHRf5< zZknbkJNN3|bH4AM-}m^P2NwE{9s0>DC4iSI2B)t;4yRlvj&R2hnSOlqNNL%t$2qP* zouLI4fUp;|yiE{6SOV=^W0fL&rh!yG$1P4ysYY5)LChiO)Z6B$D zoK*kDrhfK>+z>e-UyPK=A4cE;^{QMK6P-^Zmm+_T^hEAQu19u6Z$+MoPDP5Mu2kUO zkXV~{Bk9VWl#Bag-SwvLCj%x0XRTNajCHx{qou#yq&*-l;$_0LZ(MYd%unfn&wZVX8v@gXdXTLMrUt+jo8udc7F}fDO(q6 z0G?C}wV)Q%>Z;cumHX&&gUYO~ih_pw;mZH%C_V5Hi~HKR<%IC3*SZfV*WG|uB4G)|$N`E|(n zh~)Tr<6YyN;@xCSZYMe3gy>o0y=4nt>`xoLn_}1sPa{l*OE8rj?=wyyUzEFmVkdyo z^d<(9glljLd+YD5;$K7zwLl}Ft1*cA zuSai{|82z5{3(j=o^Q60-2W2J9<>n1`f&Zy-SFN0&tbL_dYx9{_agRRS%2~9=g{ZW z8V)zxNFG1Ucn*EWSMcgOT%SR5{5&GV81+5OSwar!>EqjQ`fSDjG%^;(2d0jH)e+Qpc$446_iw|`8K%&GMDd)!tZkFy6S>ofefR_oi}>EiKr;M)GXF3#K$-le zJDLB)*zcDAXjxky7D(XL-U5IH3f(6gn}kApFz9wm2VpqW+18IAq>HMo%wTZr{8!@e z!oWbCpus8&1a&k6^unEC*hGzx(0u>fNSl>SP$>1E@>O|lzuRr(Kh4(O(@f&(u8!Dm-UVV z`fM{-R;A&}Sln=RD|LOo2s2u5WNlZxU7{HsCZl-wD5ZaE^ z@Jsc=rNuP9uUttl5?$5JB@#2hSJ3SBKwDnYdTV}j@_aMfE&M$2@le3)nRJRAt+qIsOL zCg5yMkc*E2pXY7Cpak0CJFbTV^*GQ_AzKhPTGCaOXQT7@aTDydS(?=JrQK_z>fQDD zqQj_h$g|aJ5oe(@9#^4Qk7|R(dZw?s-&Oj7W6%W}$B^qu;03`^-dEmVK3G14Zaj}e zXrJc^2tBXwKpq@}&4Y0EuHD|*Nwe*A6)7B)55{e%&<1aptILPV2W5-7r0e|=`|f&t zS@`pn0-B@2+)(G)LcgSyJ(#DXzgLa#zOK~RP%X~D!M6Szy4cV#Y3q9qVjhTv@?T%R zMoXxXUfYQMg^3hL-vkNcBAeeI@c3biyLj0ef?y|zbL z{JmO9Y)_OHX|S}2FGWKjiJ@&&+reKHL}BOZfSsW4pqUAP{9F0=E;K7MnbGxex}DYw zX}FkR?K+-r&weip_}>X)g`C}K&C%h;)PWu{u+rxR@7vz9-fr)NcbD%K->-bFz7b!h z|7E|$|B=7nANGGga4K>p@)zlr1m0)8$Gw90kKV7mdLQxq!uO%i?R(%W@W1Up>lgjE z{W}9c3N*+Ka@lAPW@M+!AQ9_IofIV)>z*`ng;lQTp(Rh&94w!!gyriboJ@3AT3mg- z;1-)&((xFPFt0Gx=umT2(PS-avQhI7MWaOx_fxmk0}x81JLO8cy$j*Ba4@9h^FI;d zf`GygKN0wIe`ql090l05;&N>#=NN3~IquluLvLa&-#(6`A6MkU4f6gC@_`NViyP#Z zHpoRAWD=M674ARq;!8#32L<~IsedLjKG=F-`+=PY>^x+D57^&B_IrT+9$>!*{(pWC z&@-Q1|4R(ym>~<}Q7y;xXtXN)CqevrH1c`W=7;6O)+O7YlmWI5*g9bAfb9cz4zP28 dodfI~VCMik2mbr#z~0kX#*$ci0Iwc>?VpVOFhKwS literal 0 HcmV?d00001 diff --git a/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym b/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym new file mode 100644 index 00000000..751f470f --- /dev/null +++ b/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym @@ -0,0 +1,689 @@ +; wla symbolic information file +; generated by asar + +[labels] +B8:8026 :neg_1_1 +85:B9B4 :neg_1_2 +85:B9E6 :neg_1_3 +B8:C81F :neg_1_4 +B8:C831 :neg_1_5 +B8:C843 :neg_1_6 +B8:800C :pos_1_0 +B8:81DE :pos_1_1 +84:FA6B :pos_1_2 +84:FA75 :pos_1_3 +B8:C862 :pos_1_4 +B8:C86F :pos_1_5 +B8:C87C :pos_1_6 +85:FF00 CLIPCHECK +85:9900 CLIPLEN +85:990F CLIPLEN_end +85:990C CLIPLEN_no_multi +85:FF1D CLIPSET +B8:80EF COLLECTTANK +85:FF45 MISCFX +84:8BF2 NORMAL +85:FF4E SETFX +85:FF30 SOUNDFX +84:F9E0 SOUNDFX_84 +85:FF3C SPECIALFX +84:F896 ammo_loop_table +84:F874 archipelago_chozo_item_plm +84:F878 archipelago_hidden_item_plm +84:F870 archipelago_visible_item_plm +84:F892 c_item +CE:FF04 config_deathlink +CE:FF00 config_flags +CE:FF00 config_multiworld +CE:FF08 config_player_id +CE:FF06 config_remote_items +CE:FF02 config_sprite +84:F894 h_item +84:F8AD i_chozo_item +84:F8B4 i_hidden_item +84:FA5A i_hidden_item_setup +B8:885C i_item_setup_shared +B8:8878 i_item_setup_shared_all_items +B8:8883 i_item_setup_shared_alwaysloaded +84:FA79 i_live_pickup +B8:817F i_live_pickup_multiworld +B8:81C4 i_live_pickup_multiworld_end +B8:819B i_live_pickup_multiworld_local_item_or_offworld +B8:81B0 i_live_pickup_multiworld_own_item +B8:81BC i_live_pickup_multiworld_own_item1 +84:FA1E i_load_custom_graphics +84:FA39 i_load_custom_graphics_all_items +84:FA49 i_load_custom_graphics_alwaysloaded +84:FA61 i_load_rando_item +84:FA78 i_load_rando_item_end +84:F9F1 i_start_draw_loop +84:FA0A i_start_draw_loop_all_items +84:F9EC i_start_draw_loop_hidden +84:FA1C i_start_draw_loop_non_ammo_item +84:F9E5 i_start_draw_loop_visible_or_chozo +84:F8A6 i_visible_item +84:FA53 i_visible_item_setup +85:BA8A message_PlaceholderBig +85:BA0A message_char_table +85:BABC message_hook_tilemap_calc +85:BADC message_hook_tilemap_calc_msgbox_mwrecv +85:BACE message_hook_tilemap_calc_msgbox_mwsend +85:824C message_hook_tilemap_calc_normal +85:BAC9 message_hook_tilemap_calc_vanilla +85:9963 message_item_names +85:B8A3 message_item_received +85:B9A3 message_item_received_end +85:B7A3 message_item_sent +85:B8A3 message_item_sent_end +85:BA95 message_multiworld_init_new_messagebox_if_needed +85:BAB1 message_multiworld_init_new_messagebox_if_needed_msgbox_mwrecv +85:BAB1 message_multiworld_init_new_messagebox_if_needed_msgbox_mwsend +85:BAA9 message_multiworld_init_new_messagebox_if_needed_vanilla +85:B9A3 message_write_placeholders +85:B9A5 message_write_placeholders_adjust +85:BA04 message_write_placeholders_end +85:B9CA message_write_placeholders_loop +85:B9DC message_write_placeholders_notfound +85:B9DF message_write_placeholders_value_ok +B8:8092 mw_display_item_sent +B8:80FF mw_handle_queue +B8:8178 mw_handle_queue_end +B8:8101 mw_handle_queue_loop +B8:8151 mw_handle_queue_new_remote_item +B8:816D mw_handle_queue_next +B8:8163 mw_handle_queue_perform_receive +B8:81C8 mw_hook_main_game +B8:8011 mw_init +B8:8044 mw_init_end +B8:8000 mw_init_memory +B8:8083 mw_load_sram +B8:80B0 mw_receive_item +B8:80E8 mw_receive_item_end +B8:8070 mw_save_sram +B8:8049 mw_write_message +84:F888 nonprog_item_eight_palette_indices +89:9200 offworld_graphics_data_item +89:9100 offworld_graphics_data_progression_item +84:F972 p_chozo_item +84:F9A0 p_chozo_item_end +84:F98D p_chozo_item_loop +84:F999 p_chozo_item_trigger +84:F8FB p_etank_hloop +84:F8BB p_etank_loop +84:F9A6 p_hidden_item +84:F9D8 p_hidden_item_end +84:F9BD p_hidden_item_loop +84:F9A8 p_hidden_item_loop2 +84:F9D1 p_hidden_item_trigger +84:F90F p_missile_hloop +84:F8CB p_missile_loop +84:F937 p_pb_hloop +84:F8EB p_pb_loop +84:F923 p_super_hloop +84:F8DB p_super_loop +84:F94B p_visible_item +84:F96E p_visible_item_end +84:F95B p_visible_item_loop +84:F967 p_visible_item_trigger +B8:81DF patch_load_multiworld +84:FA7E perform_item_pickup +84:F886 plm_graphics_entry_offworld_item +84:F87C plm_graphics_entry_offworld_progression_item +84:FA90 plm_sequence_generic_item_0_bitmask +84:F87E prog_item_eight_palette_indices +B8:E000 rando_item_table +B8:DC90 rando_player_id_table +B8:DE22 rando_player_id_table_end +B8:D000 rando_player_table +B8:CF00 rando_seed_data +B8:8800 sm_item_graphics +B8:882E sm_item_plm_pickup_sequence_pointers +B8:C81C start_item +B8:C800 start_item_data_major +B8:C808 start_item_data_minor +B8:C818 start_item_data_reserve +B8:C856 update_graphic +84:F890 v_item + +[source files] +0000 e25029c5 main.asm +0001 06780555 ../common/nofanfare.asm +0002 e76d1f83 ../common/multiworld.asm +0003 613d24e1 ../common/itemextras.asm +0004 d6616c0c ../common/items.asm +0005 440b54fe ../common/startitem.asm + +[rom checksum] +09b134c5 + +[addr-to-line mapping] +ff:ffff 0000:00000001 +85:ff00 0001:0000010b +85:ff03 0001:0000010c +85:ff06 0001:0000010d +85:ff08 0001:0000010e +85:ff0b 0001:0000010f +85:ff0f 0001:00000110 +85:ff12 0001:00000111 +85:ff16 0001:00000112 +85:ff19 0001:00000113 +85:ff1c 0001:00000114 +85:ff1d 0001:00000117 +85:ff20 0001:00000118 +85:ff24 0001:00000119 +85:ff28 0001:0000011a +85:ff2b 0001:0000011c +85:ff2f 0001:0000011d +85:ff30 0001:00000120 +85:ff34 0001:00000121 +85:ff37 0001:00000122 +85:ff3b 0001:00000123 +85:ff3c 0001:00000126 +85:ff40 0001:00000127 +85:ff44 0001:00000128 +85:ff45 0001:0000012b +85:ff49 0001:0000012c +85:ff4d 0001:0000012d +85:ff4e 0001:00000131 +85:ff51 0001:00000132 +85:ff54 0001:00000134 +85:ff57 0001:00000135 +85:ff58 0001:00000136 +85:8490 0001:0000013a +85:9900 0001:0000013e +85:9901 0001:0000013f +85:9905 0001:00000140 +85:9907 0001:00000141 +85:990a 0001:00000142 +85:990c 0001:00000144 +85:990f 0001:00000146 +85:9910 0001:00000147 +82:e126 0001:0000014a +82:e12a 0001:0000014b +85:8089 0001:0000014e +84:8bf2 0001:00000152 +84:8bf6 0001:00000153 +84:8bf7 0001:00000153 +b8:8000 0002:00000019 +b8:8002 0002:0000001a +b8:8006 0002:0000001b +b8:8008 0002:0000001c +b8:800c 0002:00000020 +b8:800e 0002:00000021 +b8:8010 0002:00000022 +b8:8011 0002:00000025 +b8:8012 0002:00000025 +b8:8013 0002:00000025 +b8:8014 0002:00000025 +b8:8015 0000:00000013 +b8:8017 0002:00000029 +b8:801b 0002:0000002a +b8:801e 0002:0000002b +b8:8020 0002:0000002d +b8:8023 0002:0000002e +b8:8026 0002:00000031 +b8:802a 0002:00000032 +b8:802e 0002:00000033 +b8:8032 0002:00000034 +b8:8036 0002:00000035 +b8:8037 0002:00000035 +b8:8038 0002:00000036 +b8:803b 0002:00000037 +b8:803d 0002:00000039 +b8:8040 0002:0000003a +b8:8044 0002:0000003d +b8:8045 0002:0000003d +b8:8046 0002:0000003d +b8:8047 0002:0000003d +b8:8048 0002:0000003e +b8:8049 0002:00000043 +b8:804a 0002:00000043 +b8:804b 0002:00000044 +b8:804c 0002:00000044 +b8:804d 0002:00000045 +b8:8051 0002:00000046 +b8:8054 0002:00000046 +b8:8055 0002:00000047 +b8:8056 0002:00000048 +b8:805a 0002:00000049 +b8:805b 0002:0000004a +b8:805f 0002:0000004b +b8:8060 0002:0000004c +b8:8064 0002:0000004e +b8:8068 0002:0000004f +b8:8069 0002:00000050 +b8:806d 0002:00000051 +b8:806e 0002:00000051 +b8:806f 0002:00000052 +b8:8070 0002:00000055 +b8:8071 0002:00000055 +b8:8072 0000:00000013 +b8:8074 0002:00000057 +b8:8078 0002:00000058 +b8:807c 0002:00000059 +b8:807d 0002:00000059 +b8:807e 0002:0000005b +b8:807f 0002:0000005c +b8:8082 0002:0000005d +b8:8083 0002:00000060 +b8:8084 0002:00000060 +b8:8085 0000:00000013 +b8:8087 0002:00000062 +b8:808b 0002:00000063 +b8:808f 0002:00000064 +b8:8090 0002:00000064 +b8:8091 0002:00000065 +b8:8092 0002:0000006a +b8:8094 0002:0000006b +b8:8096 0002:0000006e +b8:8099 0002:0000006f +b8:809b 0002:00000070 +b8:809e 0002:00000071 +b8:80a0 0002:00000072 +b8:80a3 0002:00000073 +b8:80a7 0002:00000074 +b8:80a9 0002:00000075 +b8:80ab 0002:00000076 +b8:80ad 0002:00000077 +b8:80af 0002:00000078 +b8:80b0 0002:0000007c +b8:80b1 0002:0000007c +b8:80b2 0002:0000007d +b8:80b5 0002:0000007e +b8:80b7 0002:0000007f +b8:80ba 0002:00000080 +b8:80bc 0002:00000081 +b8:80bd 0002:00000082 +b8:80be 0002:00000084 +b8:80c1 0002:00000085 +b8:80c3 0002:00000086 +b8:80c6 0002:00000087 +b8:80c7 0002:00000088 +b8:80ca 0002:00000089 +b8:80cb 0002:00000089 +b8:80cc 0002:0000008a +b8:80d0 0002:0000008b +b8:80d1 0002:0000008c +b8:80d4 0002:0000008d +b8:80d8 0002:0000008e +b8:80da 0002:00000090 +b8:80dd 0002:00000091 +b8:80df 0002:00000092 +b8:80e2 0002:00000093 +b8:80e4 0002:00000095 +b8:80e8 0002:00000097 +b8:80ea 0002:00000098 +b8:80ec 0002:00000099 +b8:80ed 0002:00000099 +b8:80ee 0002:0000009a +b8:80ef 0002:000000a5 +b8:80f0 0002:000000a6 +b8:80f4 0002:000000a7 +b8:80f5 0002:000000a8 +b8:80f9 0002:000000a9 +b8:80fa 0002:000000ab +b8:80fe 0002:000000ac +b8:80ff 0002:000000de +b8:8100 0002:000000de +b8:8101 0002:000000e1 +b8:8105 0002:000000e2 +b8:8109 0002:000000e3 +b8:810b 0002:000000e5 +b8:810d 0002:000000e5 +b8:810e 0002:000000e8 +b8:8112 0002:000000e9 +b8:8114 0002:000000ea +b8:8118 0002:000000eb +b8:811a 0002:000000ec +b8:811e 0002:000000ed +b8:8121 0002:000000ee +b8:8123 0002:000000ef +b8:8125 0002:000000f0 +b8:8129 0002:000000f1 +b8:812b 0002:000000f2 +b8:812d 0002:000000f3 +b8:8130 0002:000000f4 +b8:8133 0002:000000f5 +b8:8135 0002:000000f6 +b8:813d 0002:000000fa +b8:813e 0002:000000fb +b8:813f 0002:000000fc +b8:8143 0002:000000ff +b8:8147 0002:00000100 +b8:814b 0002:00000101 +b8:814d 0002:00000103 +b8:814e 0002:00000104 +b8:814f 0002:00000105 +b8:8151 0002:0000010a +b8:8152 0002:0000010b +b8:8156 0002:0000010e +b8:815a 0002:0000010f +b8:815e 0002:00000110 +b8:8162 0002:00000111 +b8:8163 0002:00000115 +b8:8165 0002:00000116 +b8:8168 0002:00000117 +b8:816a 0002:00000118 +b8:816d 0002:0000011b +b8:8171 0002:0000011c +b8:8172 0002:0000011d +b8:8176 0002:0000011f +b8:8178 0002:00000122 +b8:817a 0002:00000123 +b8:817c 0002:00000124 +b8:817d 0002:00000124 +b8:817e 0002:00000125 +b8:817f 0002:00000129 +b8:8180 0002:00000129 +b8:8181 0002:00000129 +b8:8182 0002:0000012a +b8:8186 0002:0000012b +b8:8189 0002:0000012b +b8:818a 0002:0000012d +b8:818e 0002:0000012e +b8:818f 0002:0000012f +b8:8193 0002:00000130 +b8:8196 0002:00000131 +b8:8198 0002:00000133 +b8:819b 0002:00000136 +b8:819f 0002:00000137 +b8:81a3 0002:00000138 +b8:81a5 0002:0000013a +b8:81a9 0002:0000013b +b8:81aa 0002:0000013d +b8:81ae 0002:0000013e +b8:81b0 0002:00000141 +b8:81b4 0002:00000142 +b8:81b7 0002:00000143 +b8:81b9 0002:00000144 +b8:81bc 0002:00000147 +b8:81bd 0002:00000148 +b8:81be 0002:00000149 +b8:81c2 0002:0000014a +b8:81c4 0002:0000014d +b8:81c5 0002:0000014d +b8:81c6 0002:0000014d +b8:81c7 0002:0000014e +b8:81c8 0002:00000152 +b8:81cc 0002:00000153 +b8:81d0 0002:00000154 +b8:81d2 0002:00000155 +b8:81d6 0002:00000156 +b8:81d9 0002:00000157 +b8:81db 0002:00000158 +b8:81de 0002:0000015a +b8:81df 0002:0000015d +b8:81e3 0002:0000015e +b8:81e4 0002:0000015f +b8:81e7 0002:00000160 +b8:81eb 0002:00000162 +b8:81ec 0002:00000163 +b8:81ed 0002:00000164 +b8:81ee 0002:00000165 +b8:81ef 0002:00000166 +8b:914a 0002:0000016b +81:80f7 0002:0000016e +81:8027 0002:00000171 +82:8bb3 0002:00000174 +85:b9a3 0002:0000020e +85:b9a4 0002:0000020e +85:b9a5 0002:00000211 +85:b9a7 0002:00000212 +85:b9ad 0002:00000212 +85:b9ae 0002:00000213 +85:b9b1 0002:00000214 +85:b9b2 0002:00000215 +85:b9b3 0002:00000215 +85:b9b4 0002:00000219 +85:b9b7 0002:0000021a +85:b9bb 0002:0000021b +85:b9bd 0002:0000021b +85:b9bf 0002:0000021c +85:b9c2 0002:0000021d +85:b9c4 0002:0000021f +85:b9c5 0002:00000220 +85:b9c7 0002:00000224 +85:b9ca 0002:00000226 +85:b9cd 0002:00000227 +85:b9cf 0002:00000228 +85:b9d1 0002:00000229 +85:b9d5 0002:0000022a +85:b9d7 0002:0000022b +85:b9d9 0002:0000022c +85:b9da 0002:0000022d +85:b9dc 0002:0000022f +85:b9df 0002:00000231 +85:b9e2 0002:00000231 +85:b9e3 0002:00000232 +85:b9e6 0002:00000234 +85:b9ea 0002:00000235 +85:b9ed 0002:00000236 +85:b9ee 0002:00000237 +85:b9ef 0002:00000237 +85:b9f0 0002:00000238 +85:b9f4 0002:00000239 +85:b9f5 0002:0000023a +85:b9f9 0002:0000023b +85:b9fb 0002:0000023c +85:b9fc 0002:0000023d +85:b9fd 0002:0000023e +85:ba00 0002:0000023f +85:ba02 0002:00000240 +85:ba04 0002:00000243 +85:ba05 0002:00000243 +85:ba06 0002:00000244 +85:ba09 0002:00000245 +85:ba8a 0002:00000253 +85:ba8c 0002:00000254 +85:ba8f 0002:00000255 +85:ba92 0002:00000256 +85:ba95 0002:0000025e +85:ba96 0002:0000025f +85:ba98 0002:00000260 +85:ba9b 0002:00000261 +85:ba9d 0002:00000262 +85:ba9f 0002:00000263 +85:baa2 0002:00000264 +85:baa4 0002:00000265 +85:baa7 0002:00000266 +85:baa9 0002:00000269 +85:baaa 0002:0000026a +85:baab 0002:0000026b +85:baac 0002:0000026c +85:baae 0002:0000026d +85:baaf 0002:0000026e +85:bab0 0002:0000026f +85:bab1 0002:00000274 +85:bab4 0002:00000275 +85:bab5 0002:00000276 +85:bab8 0002:00000277 +85:bab9 0002:00000278 +85:baba 0002:00000279 +85:babb 0002:0000027a +85:babc 0002:00000285 +85:babd 0002:00000286 +85:babf 0002:00000287 +85:bac2 0002:00000288 +85:bac4 0002:00000289 +85:bac7 0002:0000028a +85:bac9 0002:0000028d +85:baca 0002:0000028e +85:bacb 0002:0000028f +85:bacd 0002:00000290 +85:bace 0002:00000292 +85:bacf 0002:00000293 +85:bad1 0002:00000294 +85:bad4 0002:00000295 +85:bad6 0002:00000296 +85:bad9 0002:00000297 +85:badb 0002:00000298 +85:badc 0002:0000029a +85:badd 0002:0000029b +85:badf 0002:0000029c +85:bae2 0002:0000029d +85:bae4 0002:0000029e +85:bae7 0002:0000029f +85:bae9 0002:000002a0 +85:8246 0002:000002a5 +85:8249 0002:000002a6 +85:824b 0002:000002a7 +85:82f9 0002:000002ab +b8:885c 0003:00000045 +b8:885d 0003:00000045 +b8:885e 0003:00000046 +b8:885f 0003:00000047 +b8:8863 0003:00000048 +b8:8866 0003:00000049 +b8:8867 0003:0000004a +b8:886b 0003:0000004b +b8:886e 0003:0000004c +b8:8870 0003:0000004e +b8:8873 0003:0000004f +b8:8874 0003:0000004f +b8:8878 0003:00000051 +b8:8879 0003:00000052 +b8:887a 0003:00000053 +b8:887e 0003:00000054 +b8:8880 0003:00000056 +b8:8881 0003:00000056 +b8:8882 0003:00000057 +b8:8883 0003:0000005a +b8:8884 0003:0000005a +b8:8885 0003:0000005b +b8:8886 0003:0000005c +b8:888a 0003:0000005d +84:f8a6 0004:00000051 +84:f8a9 0004:00000052 +84:f8ac 0004:00000053 +84:f8ad 0004:00000056 +84:f8b0 0004:00000057 +84:f8b3 0004:00000058 +84:f8b4 0004:0000005b +84:f8b7 0004:0000005c +84:f8ba 0004:0000005d +84:f9e0 0004:000000d4 +84:f9e4 0004:000000d5 +84:f9e5 0004:000000d8 +84:f9e8 0004:000000d9 +84:f9ea 0004:000000da +84:f9ec 0004:000000dd +84:f9ef 0004:000000de +84:f9f1 0004:000000e5 +84:f9f2 0004:000000e6 +84:f9f5 0004:000000e7 +84:f9f8 0004:000000e7 +84:f9f9 0004:000000e8 +84:f9fd 0004:000000e9 +84:fa00 0004:000000ea +84:fa02 0004:000000ec +84:fa05 0004:000000ed +84:fa06 0004:000000ee +84:fa0a 0004:000000f1 +84:fa0d 0004:000000f2 +84:fa0f 0004:000000f4 +84:fa11 0004:000000f5 +84:fa12 0004:000000f6 +84:fa14 0004:000000f7 +84:fa15 0004:000000f8 +84:fa19 0004:000000f9 +84:fa1a 0004:000000fa +84:fa1b 0004:000000fb +84:fa1c 0004:000000fe +84:fa1d 0004:000000ff +84:fa1e 0004:00000103 +84:fa1f 0004:00000103 +84:fa20 0004:00000103 +84:fa21 0004:00000104 +84:fa24 0004:00000105 +84:fa27 0004:00000106 +84:fa28 0004:00000107 +84:fa2c 0004:00000108 +84:fa2f 0004:00000109 +84:fa31 0004:0000010b +84:fa34 0004:0000010c +84:fa35 0004:0000010c +84:fa39 0004:0000010e +84:fa3a 0004:00000110 +84:fa3b 0004:00000111 +84:fa3c 0004:00000112 +84:fa40 0004:00000113 +84:fa42 0004:00000114 +84:fa43 0004:00000115 +84:fa44 0004:00000116 +84:fa47 0004:00000117 +84:fa48 0004:00000118 +84:fa49 0004:0000011b +84:fa4a 0004:0000011c +84:fa4c 0004:0000011d +84:fa4d 0004:0000011e +84:fa51 0004:0000011f +84:fa52 0004:00000120 +84:fa53 0004:00000123 +84:fa57 0004:00000124 +84:fa5a 0004:00000127 +84:fa5e 0004:00000128 +84:fa61 0004:0000012c +84:fa64 0004:0000012c +84:fa66 0004:0000012d +84:fa69 0004:0000012e +84:fa6b 0004:0000012f +84:fa6e 0004:0000012f +84:fa70 0004:00000130 +84:fa73 0004:00000131 +84:fa75 0004:00000132 +84:fa78 0004:00000135 +84:fa79 0004:00000139 +84:fa7d 0004:0000013a +84:fa7e 0004:0000013f +84:fa7f 0004:00000140 +84:fa80 0004:00000141 +84:fa81 0004:00000141 +84:fa82 0004:00000145 +84:fa86 0004:00000146 +84:fa87 0004:00000147 +84:fa88 0004:00000148 +84:fa89 0004:00000148 +84:fa8a 0004:00000149 +84:fa8d 0004:0000014a +84:fa8e 0004:0000014b +84:fa8f 0004:0000014c +81:b303 0005:00000003 +81:b307 0005:00000004 +81:b308 0005:00000005 +b8:c81c 0005:00000016 +b8:c81f 0005:00000018 +b8:c823 0005:00000019 +b8:c827 0005:0000001a +b8:c828 0005:0000001b +b8:c829 0005:0000001c +b8:c82c 0005:0000001d +b8:c82e 0005:0000001e +b8:c831 0005:00000020 +b8:c835 0005:00000021 +b8:c839 0005:00000022 +b8:c83a 0005:00000023 +b8:c83b 0005:00000024 +b8:c83e 0005:00000025 +b8:c840 0005:00000026 +b8:c843 0005:00000028 +b8:c847 0005:00000029 +b8:c84b 0005:0000002a +b8:c84c 0005:0000002b +b8:c84d 0005:0000002c +b8:c850 0005:0000002d +b8:c852 0005:0000002e +b8:c855 0005:00000031 +b8:c856 0005:00000034 +b8:c859 0005:00000035 +b8:c85b 0005:00000036 +b8:c85e 0005:00000037 +b8:c862 0005:00000039 +b8:c866 0005:0000003a +b8:c869 0005:0000003b +b8:c86b 0005:0000003c +b8:c86f 0005:0000003e +b8:c873 0005:0000003f +b8:c876 0005:00000040 +b8:c878 0005:00000041 +b8:c87c 0005:00000043 +b8:c880 0005:00000044 diff --git a/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json b/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json new file mode 100644 index 00000000..63198cde --- /dev/null +++ b/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json @@ -0,0 +1,141 @@ +{ + "CLIPCHECK": "85:FF00", + "CLIPLEN": "85:9900", + "CLIPLEN_end": "85:990F", + "CLIPLEN_no_multi": "85:990C", + "CLIPSET": "85:FF1D", + "COLLECTTANK": "B8:80EF", + "MISCFX": "85:FF45", + "NORMAL": "84:8BF2", + "SETFX": "85:FF4E", + "SOUNDFX": "85:FF30", + "SOUNDFX_84": "84:F9E0", + "SPECIALFX": "85:FF3C", + "ammo_loop_table": "84:F896", + "archipelago_chozo_item_plm": "84:F874", + "archipelago_hidden_item_plm": "84:F878", + "archipelago_visible_item_plm": "84:F870", + "c_item": "84:F892", + "config_deathlink": "CE:FF04", + "config_flags": "CE:FF00", + "config_multiworld": "CE:FF00", + "config_player_id": "CE:FF08", + "config_remote_items": "CE:FF06", + "config_sprite": "CE:FF02", + "h_item": "84:F894", + "i_chozo_item": "84:F8AD", + "i_hidden_item": "84:F8B4", + "i_hidden_item_setup": "84:FA5A", + "i_item_setup_shared": "B8:885C", + "i_item_setup_shared_all_items": "B8:8878", + "i_item_setup_shared_alwaysloaded": "B8:8883", + "i_live_pickup": "84:FA79", + "i_live_pickup_multiworld": "B8:817F", + "i_live_pickup_multiworld_end": "B8:81C4", + "i_live_pickup_multiworld_local_item_or_offworld": "B8:819B", + "i_live_pickup_multiworld_own_item": "B8:81B0", + "i_live_pickup_multiworld_own_item1": "B8:81BC", + "i_load_custom_graphics": "84:FA1E", + "i_load_custom_graphics_all_items": "84:FA39", + "i_load_custom_graphics_alwaysloaded": "84:FA49", + "i_load_rando_item": "84:FA61", + "i_load_rando_item_end": "84:FA78", + "i_start_draw_loop": "84:F9F1", + "i_start_draw_loop_all_items": "84:FA0A", + "i_start_draw_loop_hidden": "84:F9EC", + "i_start_draw_loop_non_ammo_item": "84:FA1C", + "i_start_draw_loop_visible_or_chozo": "84:F9E5", + "i_visible_item": "84:F8A6", + "i_visible_item_setup": "84:FA53", + "message_PlaceholderBig": "85:BA8A", + "message_char_table": "85:BA0A", + "message_hook_tilemap_calc": "85:BABC", + "message_hook_tilemap_calc_msgbox_mwrecv": "85:BADC", + "message_hook_tilemap_calc_msgbox_mwsend": "85:BACE", + "message_hook_tilemap_calc_normal": "85:824C", + "message_hook_tilemap_calc_vanilla": "85:BAC9", + "message_item_names": "85:9963", + "message_item_received": "85:B8A3", + "message_item_received_end": "85:B9A3", + "message_item_sent": "85:B7A3", + "message_item_sent_end": "85:B8A3", + "message_multiworld_init_new_messagebox_if_needed": "85:BA95", + "message_multiworld_init_new_messagebox_if_needed_msgbox_mwrecv": "85:BAB1", + "message_multiworld_init_new_messagebox_if_needed_msgbox_mwsend": "85:BAB1", + "message_multiworld_init_new_messagebox_if_needed_vanilla": "85:BAA9", + "message_write_placeholders": "85:B9A3", + "message_write_placeholders_adjust": "85:B9A5", + "message_write_placeholders_end": "85:BA04", + "message_write_placeholders_loop": "85:B9CA", + "message_write_placeholders_notfound": "85:B9DC", + "message_write_placeholders_value_ok": "85:B9DF", + "mw_display_item_sent": "B8:8092", + "mw_handle_queue": "B8:80FF", + "mw_handle_queue_end": "B8:8178", + "mw_handle_queue_loop": "B8:8101", + "mw_handle_queue_new_remote_item": "B8:8151", + "mw_handle_queue_next": "B8:816D", + "mw_handle_queue_perform_receive": "B8:8163", + "mw_hook_main_game": "B8:81C8", + "mw_init": "B8:8011", + "mw_init_end": "B8:8044", + "mw_init_memory": "B8:8000", + "mw_load_sram": "B8:8083", + "mw_receive_item": "B8:80B0", + "mw_receive_item_end": "B8:80E8", + "mw_save_sram": "B8:8070", + "mw_write_message": "B8:8049", + "nonprog_item_eight_palette_indices": "84:F888", + "offworld_graphics_data_item": "89:9200", + "offworld_graphics_data_progression_item": "89:9100", + "p_chozo_item": "84:F972", + "p_chozo_item_end": "84:F9A0", + "p_chozo_item_loop": "84:F98D", + "p_chozo_item_trigger": "84:F999", + "p_etank_hloop": "84:F8FB", + "p_etank_loop": "84:F8BB", + "p_hidden_item": "84:F9A6", + "p_hidden_item_end": "84:F9D8", + "p_hidden_item_loop": "84:F9BD", + "p_hidden_item_loop2": "84:F9A8", + "p_hidden_item_trigger": "84:F9D1", + "p_missile_hloop": "84:F90F", + "p_missile_loop": "84:F8CB", + "p_pb_hloop": "84:F937", + "p_pb_loop": "84:F8EB", + "p_super_hloop": "84:F923", + "p_super_loop": "84:F8DB", + "p_visible_item": "84:F94B", + "p_visible_item_end": "84:F96E", + "p_visible_item_loop": "84:F95B", + "p_visible_item_trigger": "84:F967", + "patch_load_multiworld": "B8:81DF", + "perform_item_pickup": "84:FA7E", + "plm_graphics_entry_offworld_item": "84:F886", + "plm_graphics_entry_offworld_progression_item": "84:F87C", + "plm_sequence_generic_item_0_bitmask": "84:FA90", + "prog_item_eight_palette_indices": "84:F87E", + "rando_item_table": "B8:E000", + "rando_player_id_table": "B8:DC90", + "rando_player_id_table_end": "B8:DE22", + "rando_player_table": "B8:D000", + "rando_seed_data": "B8:CF00", + "sm_item_graphics": "B8:8800", + "sm_item_plm_pickup_sequence_pointers": "B8:882E", + "start_item": "B8:C81C", + "start_item_data_major": "B8:C800", + "start_item_data_minor": "B8:C808", + "start_item_data_reserve": "B8:C818", + "update_graphic": "B8:C856", + "v_item": "84:F890", + "ITEM_RAM": "7E:09A2", + "SRAM_MW_ITEMS_RECV": "70:2000", + "SRAM_MW_ITEMS_RECV_RPTR": "70:2600", + "SRAM_MW_ITEMS_RECV_WPTR": "70:2602", + "SRAM_MW_ITEMS_RECV_SPTR": "70:2604", + "SRAM_MW_ITEMS_SENT_RPTR": "70:2680", + "SRAM_MW_ITEMS_SENT_WPTR": "70:2682", + "SRAM_MW_ITEMS_SENT": "70:2700", + "SRAM_MW_INITIALIZED": "70:26fe", + "CollectedItems": "7E:D86E" +} \ No newline at end of file diff --git a/worlds/sm/variaRandomizer/patches/common/ips/basepatch.ips b/worlds/sm/data/SMBasepatch_prebuilt/variapatches.ips similarity index 54% rename from worlds/sm/variaRandomizer/patches/common/ips/basepatch.ips rename to worlds/sm/data/SMBasepatch_prebuilt/variapatches.ips index b0b34963e8363eeef803c38a86c2410729039342..c1285e1653a11592b890289558b6f8a711681537 100644 GIT binary patch delta 433 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 diff --git a/worlds/sm/data/sourceinfo.txt b/worlds/sm/data/sourceinfo.txt new file mode 100644 index 00000000..8facb6b2 --- /dev/null +++ b/worlds/sm/data/sourceinfo.txt @@ -0,0 +1,3 @@ +SMBasepatch_prebuilt: +- comes exactly from build/vanilla/ directory of https://github.com/lordlou/SMBasepatch +- keep it in sync with the basepatch repo; do not modify the contents in this repo alone! diff --git a/worlds/sm/variaRandomizer/rom/rompatcher.py b/worlds/sm/variaRandomizer/rom/rompatcher.py index 22b83ceb..9dae1cea 100644 --- a/worlds/sm/variaRandomizer/rom/rompatcher.py +++ b/worlds/sm/variaRandomizer/rom/rompatcher.py @@ -24,8 +24,6 @@ class RomPatcher: 'Removes_Gravity_Suit_heat_protection', # door ASM to skip G4 cutscene when all 4 bosses are dead 'g4_skip.ips', - # basepatch is generated from https://github.com/lordlou/SMBasepatch - 'basepatch.ips' ], # VARIA tweaks 'VariaTweaks' : ['WS_Etank', 'LN_Chozo_SpaceJump_Check_Disable', 'ln_chozo_platform.ips', 'bomb_torizo.ips'],