diff --git a/worlds/sm/Client.py b/worlds/sm/Client.py index 190ce29e..16aea935 100644 --- a/worlds/sm/Client.py +++ b/worlds/sm/Client.py @@ -4,7 +4,7 @@ import time from NetUtils import ClientStatus, color from worlds.AutoSNIClient import SNIClient -from .Rom import ROM_PLAYER_LIMIT as SM_ROM_PLAYER_LIMIT +from .Rom import SM_ROM_MAX_PLAYERID snes_logger = logging.getLogger("SNES") @@ -143,7 +143,7 @@ class SMSNIClient(SNIClient): else: location_id = 0x00 #backward compat - player_id = item.player if item.player <= SM_ROM_PLAYER_LIMIT else 0 + player_id = item.player if item.player <= SM_ROM_MAX_PLAYERID else 0 snes_buffered_write(ctx, SM_RECV_QUEUE_START + item_out_ptr * 4, bytes( [player_id & 0xFF, (player_id >> 8) & 0xFF, item_id & 0xFF, location_id & 0xFF])) item_out_ptr += 1 diff --git a/worlds/sm/Rom.py b/worlds/sm/Rom.py index e5f5bc7a..67c0780d 100644 --- a/worlds/sm/Rom.py +++ b/worlds/sm/Rom.py @@ -7,8 +7,8 @@ from Utils import read_snes_rom from worlds.Files import APDeltaPatch SMJUHASH = '21f3e98df4780ee1c667b84e57d88675' -ROM_PLAYER_LIMIT = 65535 # max archipelago player ID. note, SM ROM itself will only store 201 names+ids max - +SM_ROM_MAX_PLAYERID = 65535 +SM_ROM_PLAYERDATA_COUNT = 202 class SMDeltaPatch(APDeltaPatch): hash = SMJUHASH diff --git a/worlds/sm/__init__.py b/worlds/sm/__init__.py index 76f39b75..1cb59325 100644 --- a/worlds/sm/__init__.py +++ b/worlds/sm/__init__.py @@ -5,7 +5,7 @@ import copy import os import threading import base64 -from typing import Set, TextIO +from typing import Any, Dict, Iterable, List, Set, TextIO, TypedDict from worlds.sm.variaRandomizer.graph.graph_utils import GraphUtils @@ -15,7 +15,7 @@ from .Regions import create_regions from .Rules import set_rules, add_entrance_rule from .Options import sm_options from .Client import SMSNIClient -from .Rom import get_base_rom_path, ROM_PLAYER_LIMIT, SMDeltaPatch, get_sm_symbols +from .Rom import get_base_rom_path, SM_ROM_MAX_PLAYERID, SM_ROM_PLAYERDATA_COUNT, SMDeltaPatch, get_sm_symbols import Utils from BaseClasses import Region, Entrance, Location, MultiWorld, Item, ItemClassification, RegionType, CollectionState, Tutorial @@ -67,6 +67,13 @@ class SMWeb(WebWorld): ["Farrak Kilhn"] )] + +class ByteEdit(TypedDict): + sym: Dict[str, Any] + offset: int + values: Iterable[int] + + locations_start_id = 82000 items_start_id = 83000 @@ -201,7 +208,8 @@ class SMWorld(World): create_locations(self, self.player) create_regions(self, self.multiworld, self.player) - def getWordArray(self, w): # little-endian convert a 16-bit number to an array of numbers <= 255 each + def getWordArray(self, w: int) -> List[int]: + """ 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 @@ -281,48 +289,87 @@ class SMWorld(World): "data", "SMBasepatch_prebuilt", "variapatches.ips")) def APPostPatchRom(self, romPatcher): - symbols = get_sm_symbols(os.path.join(os.path.dirname(__file__), + symbols = get_sm_symbols(os.path.join(os.path.dirname(__file__), "data", "SMBasepatch_prebuilt", "sm-basepatch-symbols.json")) - multiWorldLocations = [] - multiWorldItems = [] + + # gather all player ids and names relevant to this rom, then write player name and player id data tables + playerIdSet: Set[int] = {0} # 0 is for "Archipelago" server + for itemLoc in self.multiworld.get_locations(): + assert itemLoc.item, f"World of player '{self.multiworld.player_name[itemLoc.player]}' has a loc.item " + \ + f"that is {itemLoc.item} during generate_output" + # add each playerid who has a location containing an item to send to us *or* to an item_link we're part of + if itemLoc.item.player == self.player or \ + (itemLoc.item.player in self.multiworld.groups and + self.player in self.multiworld.groups[itemLoc.item.player]['players']): + playerIdSet |= {itemLoc.player} + # add each playerid, including item link ids, that we'll be sending items to + if itemLoc.player == self.player: + playerIdSet |= {itemLoc.item.player} + if len(playerIdSet) > SM_ROM_PLAYERDATA_COUNT: + # max 202 entries, but it's possible for item links to add enough replacement items for us, that are placed + # in worlds that otherwise have no relation to us, that the 2*location count limit is exceeded + logger.warning("SM is interacting with too many players to fit in ROM. " + f"Removing the highest {len(playerIdSet) - SM_ROM_PLAYERDATA_COUNT} ids to fit") + playerIdSet = set(sorted(playerIdSet)[:SM_ROM_PLAYERDATA_COUNT]) + otherPlayerIndex: Dict[int, int] = {} # ap player id -> rom-local player index + playerNameData: List[ByteEdit] = [] + playerIdData: List[ByteEdit] = [] + # sort all player data by player id so that the game can look up a player's data reasonably quickly when + # the client sends an ap playerid to the game + for i, playerid in enumerate(sorted(playerIdSet)): + playername = self.multiworld.player_name[playerid] if playerid != 0 else "Archipelago" + playerIdForRom = playerid + if playerid > SM_ROM_MAX_PLAYERID: + # note, playerIdForRom = 0 is not unique so the game cannot look it up. + # instead it will display the player received-from as "Archipelago" + playerIdForRom = 0 + if playerid == self.player: + raise Exception(f"SM rom cannot fit enough bits to represent self player id {playerid}") + else: + logger.warning(f"SM rom cannot fit enough bits to represent player id {playerid}, setting to 0 in rom") + otherPlayerIndex[playerid] = i + playerNameData.append({"sym": symbols["rando_player_name_table"], + "offset": i * 16, + "values": playername[:16].upper().center(16).encode()}) + playerIdData.append({"sym": symbols["rando_player_id_table"], + "offset": i * 2, + "values": self.getWordArray(playerIdForRom)}) + + multiWorldLocations: List[ByteEdit] = [] + multiWorldItems: List[ByteEdit] = [] idx = 0 - self.playerIDMap = {} - playerIDCount = 0 # 0 is for "Archipelago" server; highest possible = 200 (201 entries) vanillaItemTypesCount = 21 for itemLoc in self.multiworld.get_locations(): 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 + # item to place in this SM world: write full item data to tables if isinstance(itemLoc.item, SMItem) and itemLoc.item.type in ItemManager.Items: itemId = ItemManager.Items[itemLoc.item.type].Id else: - itemId = ItemManager.Items['ArchipelagoItem'].Id + idx + itemId = ItemManager.Items["ArchipelagoItem"].Id + idx 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 + if itemLoc.item.player == self.player: + itemDestinationType = 0 # dest type 0 means 'regular old SM item' per itemtable.asm + elif itemLoc.item.player in self.multiworld.groups and \ + self.player in self.multiworld.groups[itemLoc.item.player]['players']: + # dest type 2 means 'SM item link item that sends to the current player and others' + # per itemtable.asm (groups are synonymous with item_links, currently) + itemDestinationType = 2 + else: + itemDestinationType = 1 # dest type 1 means 'item for entirely someone else' per itemtable.asm - [w0, w1] = self.getWordArray(0 if itemLoc.item.player == self.player else 1) + [w0, w1] = self.getWordArray(itemDestinationType) [w2, w3] = self.getWordArray(itemId) - [w4, w5] = self.getWordArray(romPlayerID) + [w4, w5] = self.getWordArray(otherPlayerIndex[itemLoc.item.player] if itemLoc.item.player in + otherPlayerIndex else 0) [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]}) - 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 = [{"fileName": "off_world_prog_item.bin", "paletteSymbolName": "prog_item_eight_palette_indices", "dataSymbolName": "offworld_graphics_data_progression_item"}, @@ -331,7 +378,7 @@ class SMWorld(World): "paletteSymbolName": "nonprog_item_eight_palette_indices", "dataSymbolName": "offworld_graphics_data_item"}] idx = 0 - offworldSprites = [] + offworldSprites: List[ByteEdit] = [] 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()) @@ -343,31 +390,21 @@ class SMWorld(World): "values": buffer[8:264]}) idx += 1 - deathLink = [{"sym": symbols["config_deathlink"], - "offset": 0, - "values": [self.multiworld.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.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.append({"sym": symbols["rando_player_table"], - "offset": value * 16, - "values": self.multiworld.player_name[key][:16].upper().center(16).encode()}) - playerNameIDMap.append({"sym": symbols["rando_player_id_table"], - "offset": value * 2, - "values": self.getWordArray(key)}) + deathLink: List[ByteEdit] = [{ + "sym": symbols["config_deathlink"], + "offset": 0, + "values": [self.multiworld.death_link[self.player].value] + }] + remoteItem: List[ByteEdit] = [{ + "sym": symbols["config_remote_items"], + "offset": 0, + "values": self.getWordArray(0b001 + (0b010 if self.remote_items else 0b000)) + }] + ownPlayerId: List[ByteEdit] = [{ + "sym": symbols["config_player_id"], + "offset": 0, + "values": self.getWordArray(self.player) + }] patchDict = { 'MultiWorldLocations': multiWorldLocations, 'MultiWorldItems': multiWorldItems, @@ -375,15 +412,15 @@ class SMWorld(World): 'deathLink': deathLink, 'remoteItem': remoteItem, 'ownPlayerId': ownPlayerId, - 'PlayerName': playerNames, - 'PlayerNameIDMap': playerNameIDMap} + 'playerNameData': playerNameData, + 'playerIdData': playerIdData} # 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 = {} + def resolve_symbols_to_file_offset_based_dict(byte_edits_arr: List[ByteEdit]) -> Dict[int, Iterable[int]]: + this_patch_as_dict: Dict[int, Iterable[int]] = {} for byte_edit in byte_edits_arr: - offset_within_rom_file = byte_edit["sym"]["offset_within_rom_file"] + byte_edit["offset"] + offset_within_rom_file: int = 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 @@ -499,7 +536,7 @@ class SMWorld(World): itemLocs = [ItemLocation(ItemManager.Items[itemLoc.item.type], locationsDict[itemLoc.name] if itemLoc.name in locationsDict and itemLoc.player == self.player else self.DummyLocation(self.multiworld.get_player_name(itemLoc.player) + " " + itemLoc.name), True) for itemLoc in self.multiworld.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.multiworld.get_player_name(itemLoc.player) + " " + itemLoc.name), True) for itemLoc in self.multiworld.get_locations() if itemLoc.item.player == self.player and itemLoc.item.advancement == True] - # progItemLocs = [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 and itemLoc.item.player == self.player and itemLoc.item.advancement == True] + # progItemLocs = [ItemLocation(ItemManager.Items[itemLoc.item.type if itemLoc.item.type in ItemManager.Items else 'ArchipelagoItem'], locationsDict[itemLoc.name], True) for itemLoc in self.multiworld.get_locations() if itemLoc.player == self.player and itemLoc.item.player == self.player and itemLoc.item.advancement == True] # romPatcher.writeSplitLocs(self.variaRando.args.majorsSplit, itemLocs, progItemLocs) romPatcher.writeSpoiler(itemLocs, progItemLocs) diff --git a/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips b/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips index f8fba9b0..b44fa726 100644 Binary files a/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips and b/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips differ diff --git a/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym b/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym index e507501c..c49a990f 100644 --- a/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym +++ b/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym @@ -3,13 +3,15 @@ [labels] B8:83C1 :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:85C6 :neg_1_2 +B8:85E5 :neg_1_3 +85:BAB4 :neg_1_4 +85:BACF :neg_1_5 +B8:C81F :neg_1_6 +B8:C831 :neg_1_7 +B8:C843 :neg_1_8 B8:830C :pos_1_0 -B8:85D7 :pos_1_1 +B8:8693 :pos_1_1 84:FA6B :pos_1_2 84:FA75 :pos_1_3 B8:C862 :pos_1_4 @@ -20,7 +22,7 @@ B8:C87C :pos_1_6 85:990F CLIPLEN_end 85:990C CLIPLEN_no_multi 85:FF1D CLIPSET -B8:84E8 COLLECTTANK +B8:8503 COLLECTTANK 85:FF45 MISCFX 84:8BF2 NORMAL 85:FF4E SETFX @@ -28,6 +30,11 @@ B8:84E8 COLLECTTANK 84:F9E0 SOUNDFX_84 85:FF3C SPECIALFX 84:F896 ammo_loop_table +B8:85BA ap_playerid_to_rom_other_player_index +B8:85DD ap_playerid_to_rom_other_player_index_checklastrow +B8:85F8 ap_playerid_to_rom_other_player_index_correctindex +B8:85C0 ap_playerid_to_rom_other_player_index_do_search_stage_1 +B8:85F5 ap_playerid_to_rom_other_player_index_notfound 84:F874 archipelago_chozo_item_plm 84:F878 archipelago_hidden_item_plm 84:F870 archipelago_visible_item_plm @@ -51,11 +58,13 @@ 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:8578 i_live_pickup_multiworld -B8:85BD i_live_pickup_multiworld_end -B8:8594 i_live_pickup_multiworld_local_item_or_offworld -B8:85A9 i_live_pickup_multiworld_own_item -B8:85B5 i_live_pickup_multiworld_own_item1 +B8:85FD i_live_pickup_multiworld +B8:8679 i_live_pickup_multiworld_end +B8:8659 i_live_pickup_multiworld_item_link_item +B8:8649 i_live_pickup_multiworld_otherplayers_item +B8:8635 i_live_pickup_multiworld_own_item +B8:8641 i_live_pickup_multiworld_own_item1 +B8:8620 i_live_pickup_multiworld_send_network 84:FA1E i_load_custom_graphics 84:FA39 i_load_custom_graphics_all_items 84:FA49 i_load_custom_graphics_alwaysloaded @@ -68,36 +77,41 @@ B8:85B5 i_live_pickup_multiworld_own_item1 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:BB73 message_PlaceholderBig +85:BAF3 message_char_table +85:BBAA message_hook_tilemap_calc +85:BBDD message_hook_tilemap_calc_msgbox_mw_item_link +85:BBCF message_hook_tilemap_calc_msgbox_mwrecv +85:BBC1 message_hook_tilemap_calc_msgbox_mwsend 85:824C message_hook_tilemap_calc_normal -85:BAC9 message_hook_tilemap_calc_vanilla +85:BBBC message_hook_tilemap_calc_vanilla +85:B9A3 message_item_link_distributed +85:BAA3 message_item_link_distributed_end 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 +85:BB7E message_multiworld_init_new_messagebox_if_needed +85:BB9F message_multiworld_init_new_messagebox_if_needed_msgbox_mw_item_link +85:BB9F message_multiworld_init_new_messagebox_if_needed_msgbox_mwrecv +85:BB9F message_multiworld_init_new_messagebox_if_needed_msgbox_mwsend +85:BB97 message_multiworld_init_new_messagebox_if_needed_vanilla +85:BAA3 message_write_placeholders +85:BAA5 message_write_placeholders_adjust +85:BAED message_write_placeholders_end +B8:84BB mw_cleanup_item_link_messagebox B8:848B mw_display_item_sent -B8:84F8 mw_handle_queue -B8:8571 mw_handle_queue_end -B8:84FA mw_handle_queue_loop -B8:854A mw_handle_queue_new_remote_item -B8:8566 mw_handle_queue_next -B8:855C mw_handle_queue_perform_receive -B8:85C1 mw_hook_main_game +B8:8513 mw_handle_queue +B8:8562 mw_handle_queue_collect_item_if_present +B8:85B3 mw_handle_queue_end +B8:859B mw_handle_queue_found +B8:8522 mw_handle_queue_lookup_player +B8:8515 mw_handle_queue_loop +B8:857C mw_handle_queue_new_remote_item +B8:85A7 mw_handle_queue_next +B8:858E mw_handle_queue_perform_receive +B8:867D mw_hook_main_game B8:8311 mw_init B8:8366 mw_init_continuereset B8:83EA mw_init_end @@ -107,8 +121,9 @@ B8:8351 mw_init_smstringdata B8:8474 mw_load_sram B8:8482 mw_load_sram_done B8:8485 mw_load_sram_setnewgame -B8:84A9 mw_receive_item -B8:84E1 mw_receive_item_end +B8:84A9 mw_prep_item_link_messagebox +B8:84C4 mw_receive_item +B8:84FC mw_receive_item_end B8:8469 mw_save_sram B8:8442 mw_write_message 84:F888 nonprog_item_eight_palette_indices @@ -135,16 +150,16 @@ B8:8442 mw_write_message 84:F96E p_visible_item_end 84:F95B p_visible_item_loop 84:F967 p_visible_item_trigger -B8:85D8 patch_load_multiworld +B8:8694 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:DCA0 rando_player_id_table +B8:DE34 rando_player_id_table_end +B8:D000 rando_player_name_table B8:CF00 rando_seed_data B8:8800 sm_item_graphics B8:882E sm_item_plm_pickup_sequence_pointers @@ -158,15 +173,15 @@ B8:83EF write_repeated_memory B8:83F4 write_repeated_memory_loop [source files] -0000 f30c3fdc main.asm +0000 8d746646 main.asm 0001 06780555 ../common/nofanfare.asm -0002 4f9a780e ../common/multiworld.asm -0003 f7e9db95 ../common/itemextras.asm -0004 d6616c0c ../common/items.asm -0005 dbfcb38d ../common/startitem.asm +0002 ae952bc9 ../common/multiworld.asm +0003 613d24e1 ../common/itemextras.asm +0004 cc2c77e4 ../common/items.asm +0005 440b54fe ../common/startitem.asm [rom checksum] -b526d5c7 +f0ac0521 [addr-to-line mapping] ff:ffff 0000:00000001 @@ -343,296 +358,391 @@ b8:8435 0002:0000010f b8:8439 0002:00000110 b8:843d 0002:00000111 b8:8441 0002:00000112 -b8:8442 0002:00000118 -b8:8443 0002:00000118 -b8:8444 0002:00000119 -b8:8445 0002:00000119 -b8:8446 0002:0000011a -b8:844a 0002:0000011b -b8:844d 0002:0000011b -b8:844e 0002:0000011c -b8:844f 0002:0000011d -b8:8453 0002:0000011e -b8:8454 0002:0000011f -b8:8458 0002:00000120 -b8:8459 0002:00000121 -b8:845d 0002:00000123 -b8:8461 0002:00000124 -b8:8462 0002:00000125 -b8:8466 0002:00000126 -b8:8467 0002:00000126 -b8:8468 0002:00000127 -b8:8469 0002:0000012c -b8:846a 0002:0000012c +b8:8442 0002:0000011b +b8:8443 0002:0000011b +b8:8444 0002:0000011c +b8:8445 0002:0000011c +b8:8446 0002:0000011d +b8:844a 0002:0000011e +b8:844d 0002:0000011e +b8:844e 0002:0000011f +b8:844f 0002:00000120 +b8:8453 0002:00000121 +b8:8454 0002:00000122 +b8:8458 0002:00000123 +b8:8459 0002:00000124 +b8:845d 0002:00000126 +b8:8461 0002:00000127 +b8:8462 0002:00000128 +b8:8466 0002:00000129 +b8:8467 0002:00000129 +b8:8468 0002:0000012a +b8:8469 0002:0000012f +b8:846a 0002:0000012f b8:846b 0000:00000013 -b8:846d 0002:0000012f -b8:846e 0002:0000012f -b8:846f 0002:00000131 -b8:8470 0002:00000132 -b8:8473 0002:00000133 -b8:8474 0002:00000138 -b8:8475 0002:00000138 +b8:846d 0002:00000132 +b8:846e 0002:00000132 +b8:846f 0002:00000134 +b8:8470 0002:00000135 +b8:8473 0002:00000136 +b8:8474 0002:0000013b +b8:8475 0002:0000013b b8:8476 0000:00000013 -b8:8478 0002:0000013a -b8:847c 0002:0000013b -b8:8480 0002:0000013c -b8:8482 0002:0000013e -b8:8483 0002:0000013e -b8:8484 0002:0000013f -b8:8485 0002:00000147 -b8:8489 0002:00000148 -b8:848b 0002:0000014e -b8:848d 0002:0000014f -b8:848f 0002:00000152 -b8:8492 0002:00000153 -b8:8494 0002:00000154 -b8:8497 0002:00000155 -b8:8499 0002:00000156 -b8:849c 0002:00000157 -b8:84a0 0002:00000158 -b8:84a2 0002:00000159 -b8:84a4 0002:0000015a -b8:84a6 0002:0000015b -b8:84a8 0002:0000015c -b8:84a9 0002:00000160 -b8:84aa 0002:00000160 -b8:84ab 0002:00000161 -b8:84ae 0002:00000162 -b8:84b0 0002:00000163 -b8:84b3 0002:00000164 -b8:84b5 0002:00000165 -b8:84b6 0002:00000166 -b8:84b7 0002:00000168 -b8:84ba 0002:00000169 -b8:84bc 0002:0000016a -b8:84bf 0002:0000016b -b8:84c0 0002:0000016c -b8:84c3 0002:0000016d -b8:84c4 0002:0000016d -b8:84c5 0002:0000016e -b8:84c9 0002:0000016f -b8:84ca 0002:00000170 -b8:84cd 0002:00000171 -b8:84d1 0002:00000172 -b8:84d3 0002:00000174 -b8:84d6 0002:00000175 -b8:84d8 0002:00000176 -b8:84db 0002:00000177 -b8:84dd 0002:00000179 -b8:84e1 0002:0000017b -b8:84e3 0002:0000017c -b8:84e5 0002:0000017d -b8:84e6 0002:0000017d -b8:84e7 0002:0000017e -b8:84e8 0002:00000189 -b8:84e9 0002:0000018a -b8:84ed 0002:0000018b -b8:84ee 0002:0000018c -b8:84f2 0002:0000018d -b8:84f3 0002:0000018f -b8:84f7 0002:00000190 -b8:84f8 0002:000001c2 -b8:84f9 0002:000001c2 -b8:84fa 0002:000001c5 -b8:84fe 0002:000001c6 -b8:8502 0002:000001c7 -b8:8504 0002:000001c9 -b8:8506 0002:000001c9 -b8:8507 0002:000001cc -b8:850b 0002:000001cd -b8:850d 0002:000001ce -b8:8511 0002:000001cf -b8:8513 0002:000001d0 -b8:8517 0002:000001d1 -b8:851a 0002:000001d2 -b8:851c 0002:000001d3 -b8:851e 0002:000001d4 -b8:8522 0002:000001d5 -b8:8524 0002:000001d6 -b8:8526 0002:000001d7 -b8:8529 0002:000001d8 -b8:852c 0002:000001d9 -b8:852e 0002:000001da -b8:8536 0002:000001de -b8:8537 0002:000001df -b8:8538 0002:000001e0 -b8:853c 0002:000001e3 -b8:8540 0002:000001e4 -b8:8544 0002:000001e5 -b8:8546 0002:000001e7 -b8:8547 0002:000001e8 -b8:8548 0002:000001e9 -b8:854a 0002:000001ee -b8:854b 0002:000001ef -b8:854f 0002:000001f2 -b8:8553 0002:000001f3 -b8:8557 0002:000001f4 -b8:855b 0002:000001f5 -b8:855c 0002:000001f9 -b8:855e 0002:000001fa -b8:8561 0002:000001fb -b8:8563 0002:000001fc -b8:8566 0002:000001ff -b8:856a 0002:00000200 -b8:856b 0002:00000201 -b8:856f 0002:00000203 -b8:8571 0002:00000206 -b8:8573 0002:00000207 -b8:8575 0002:00000208 -b8:8576 0002:00000208 -b8:8577 0002:00000209 -b8:8578 0002:0000020d -b8:8579 0002:0000020d -b8:857a 0002:0000020d -b8:857b 0002:0000020e -b8:857f 0002:0000020f -b8:8582 0002:0000020f -b8:8583 0002:00000211 -b8:8587 0002:00000212 -b8:8588 0002:00000213 -b8:858c 0002:00000214 -b8:858f 0002:00000215 -b8:8591 0002:00000217 -b8:8594 0002:0000021a -b8:8598 0002:0000021b -b8:859c 0002:0000021c -b8:859e 0002:0000021e -b8:85a2 0002:0000021f -b8:85a3 0002:00000221 -b8:85a7 0002:00000222 -b8:85a9 0002:00000225 -b8:85ad 0002:00000226 -b8:85b0 0002:00000227 -b8:85b2 0002:00000228 -b8:85b5 0002:0000022b -b8:85b6 0002:0000022c -b8:85b7 0002:0000022d -b8:85bb 0002:0000022e -b8:85bd 0002:00000231 -b8:85be 0002:00000231 -b8:85bf 0002:00000231 -b8:85c0 0002:00000232 -b8:85c1 0002:00000236 -b8:85c5 0002:00000237 -b8:85c9 0002:00000238 -b8:85cb 0002:00000239 -b8:85cf 0002:0000023a -b8:85d2 0002:0000023b -b8:85d4 0002:0000023c -b8:85d7 0002:0000023e -b8:85d8 0002:00000241 -b8:85dc 0002:00000243 -b8:85dd 0002:00000244 -b8:85de 0002:00000245 -b8:85df 0002:00000246 -b8:85e0 0002:00000247 -8b:914a 0002:0000024c -81:80f7 0002:0000024f -81:8027 0002:00000252 -82:8bb3 0002:00000255 -85:b9a3 0002:000002ef -85:b9a4 0002:000002ef -85:b9a5 0002:000002f2 -85:b9a7 0002:000002f3 -85:b9ad 0002:000002f3 -85:b9ae 0002:000002f4 -85:b9b1 0002:000002f5 -85:b9b2 0002:000002f6 -85:b9b3 0002:000002f6 -85:b9b4 0002:000002fa -85:b9b7 0002:000002fb -85:b9bb 0002:000002fc -85:b9bd 0002:000002fc -85:b9bf 0002:000002fd -85:b9c2 0002:000002fe -85:b9c4 0002:00000300 -85:b9c5 0002:00000301 -85:b9c7 0002:00000305 -85:b9ca 0002:00000307 -85:b9cd 0002:00000308 -85:b9cf 0002:00000309 -85:b9d1 0002:0000030a -85:b9d5 0002:0000030b -85:b9d7 0002:0000030c -85:b9d9 0002:0000030d -85:b9da 0002:0000030e -85:b9dc 0002:00000310 -85:b9df 0002:00000312 -85:b9e2 0002:00000312 -85:b9e3 0002:00000313 -85:b9e6 0002:00000315 -85:b9ea 0002:00000316 -85:b9ed 0002:00000317 -85:b9ee 0002:00000318 -85:b9ef 0002:00000318 -85:b9f0 0002:00000319 -85:b9f4 0002:0000031a -85:b9f5 0002:0000031b -85:b9f9 0002:0000031c -85:b9fb 0002:0000031d -85:b9fc 0002:0000031e -85:b9fd 0002:0000031f -85:ba00 0002:00000320 -85:ba02 0002:00000321 -85:ba04 0002:00000324 -85:ba05 0002:00000324 -85:ba06 0002:00000325 -85:ba09 0002:00000326 -85:ba8a 0002:00000334 -85:ba8c 0002:00000335 -85:ba8f 0002:00000336 -85:ba92 0002:00000337 -85:ba95 0002:0000033f -85:ba96 0002:00000340 -85:ba98 0002:00000341 -85:ba9b 0002:00000342 -85:ba9d 0002:00000343 -85:ba9f 0002:00000344 -85:baa2 0002:00000345 -85:baa4 0002:00000346 -85:baa7 0002:00000347 -85:baa9 0002:0000034a -85:baaa 0002:0000034b -85:baab 0002:0000034c -85:baac 0002:0000034d -85:baae 0002:0000034e -85:baaf 0002:0000034f -85:bab0 0002:00000350 -85:bab1 0002:00000355 -85:bab4 0002:00000356 -85:bab5 0002:00000357 -85:bab8 0002:00000358 -85:bab9 0002:00000359 -85:baba 0002:0000035a -85:babb 0002:0000035b -85:babc 0002:00000366 -85:babd 0002:00000367 -85:babf 0002:00000368 -85:bac2 0002:00000369 -85:bac4 0002:0000036a -85:bac7 0002:0000036b -85:bac9 0002:0000036e -85:baca 0002:0000036f -85:bacb 0002:00000370 -85:bacd 0002:00000371 -85:bace 0002:00000373 -85:bacf 0002:00000374 -85:bad1 0002:00000375 -85:bad4 0002:00000376 -85:bad6 0002:00000377 -85:bad9 0002:00000378 -85:badb 0002:00000379 -85:badc 0002:0000037b -85:badd 0002:0000037c -85:badf 0002:0000037d -85:bae2 0002:0000037e -85:bae4 0002:0000037f -85:bae7 0002:00000380 -85:bae9 0002:00000381 -85:8246 0002:00000386 -85:8249 0002:00000387 -85:824b 0002:00000388 -85:82f9 0002:0000038c +b8:8478 0002:0000013d +b8:847c 0002:0000013e +b8:8480 0002:0000013f +b8:8482 0002:00000141 +b8:8483 0002:00000141 +b8:8484 0002:00000142 +b8:8485 0002:0000014a +b8:8489 0002:0000014b +b8:848b 0002:00000151 +b8:848d 0002:00000152 +b8:848f 0002:00000155 +b8:8492 0002:00000156 +b8:8494 0002:00000157 +b8:8497 0002:00000158 +b8:8499 0002:00000159 +b8:849c 0002:0000015a +b8:84a0 0002:0000015b +b8:84a2 0002:0000015c +b8:84a4 0002:0000015d +b8:84a6 0002:0000015e +b8:84a8 0002:0000015f +b8:84a9 0002:00000164 +b8:84ab 0002:00000165 +b8:84ad 0002:00000166 +b8:84b0 0002:00000167 +b8:84b2 0002:00000168 +b8:84b5 0002:00000169 +b8:84b7 0002:0000016a +b8:84ba 0002:0000016b +b8:84bb 0002:0000016e +b8:84bd 0002:0000016f +b8:84bf 0002:00000170 +b8:84c1 0002:00000171 +b8:84c3 0002:00000172 +b8:84c4 0002:00000176 +b8:84c5 0002:00000176 +b8:84c6 0002:00000177 +b8:84c9 0002:00000178 +b8:84cb 0002:00000179 +b8:84ce 0002:0000017a +b8:84d0 0002:0000017b +b8:84d1 0002:0000017c +b8:84d2 0002:0000017e +b8:84d5 0002:0000017f +b8:84d7 0002:00000180 +b8:84da 0002:00000181 +b8:84db 0002:00000182 +b8:84de 0002:00000183 +b8:84df 0002:00000183 +b8:84e0 0002:00000184 +b8:84e4 0002:00000185 +b8:84e5 0002:00000186 +b8:84e8 0002:00000187 +b8:84ec 0002:00000188 +b8:84ee 0002:0000018a +b8:84f1 0002:0000018b +b8:84f3 0002:0000018c +b8:84f6 0002:0000018d +b8:84f8 0002:0000018f +b8:84fc 0002:00000191 +b8:84fe 0002:00000192 +b8:8500 0002:00000193 +b8:8501 0002:00000193 +b8:8502 0002:00000194 +b8:8503 0002:0000019f +b8:8504 0002:000001a0 +b8:8508 0002:000001a1 +b8:8509 0002:000001a2 +b8:850d 0002:000001a3 +b8:850e 0002:000001a5 +b8:8512 0002:000001a6 +b8:8513 0002:000001db +b8:8514 0002:000001db +b8:8515 0002:000001de +b8:8519 0002:000001df +b8:851d 0002:000001e0 +b8:851f 0002:000001e1 +b8:8522 0002:000001e4 +b8:8524 0002:000001e4 +b8:8525 0002:000001e7 +b8:8529 0002:000001e8 +b8:852b 0002:000001e9 +b8:852f 0002:000001ea +b8:8533 0002:000001eb +b8:8535 0002:000001ef +b8:8537 0002:000001f0 +b8:8538 0002:000001f1 +b8:853b 0002:000001f2 +b8:853e 0002:000001f3 +b8:8540 0002:000001fc +b8:8544 0002:000001fd +b8:8547 0002:000001fe +b8:8549 0002:00000200 +b8:854b 0002:00000201 +b8:854c 0002:00000202 +b8:854f 0002:00000203 +b8:8551 0002:00000204 +b8:8552 0002:00000205 +b8:8555 0002:00000206 +b8:8556 0002:00000207 +b8:855a 0002:00000208 +b8:855b 0002:00000209 +b8:855e 0002:0000020a +b8:8560 0002:0000020d +b8:8562 0002:00000210 +b8:8564 0002:00000211 +b8:8565 0002:00000212 +b8:8568 0002:00000213 +b8:8569 0002:00000214 +b8:856a 0002:00000215 +b8:856e 0002:00000218 +b8:8572 0002:00000219 +b8:8576 0002:0000021a +b8:8578 0002:0000021c +b8:8579 0002:0000021d +b8:857a 0002:0000021e +b8:857c 0002:00000223 +b8:857d 0002:00000224 +b8:8581 0002:00000227 +b8:8585 0002:00000228 +b8:8589 0002:00000229 +b8:858d 0002:0000022a +b8:858e 0002:0000022e +b8:8592 0002:0000022f +b8:8596 0002:00000230 +b8:8598 0002:00000231 +b8:859b 0002:00000233 +b8:859d 0002:00000234 +b8:859f 0002:00000235 +b8:85a2 0002:00000236 +b8:85a4 0002:00000237 +b8:85a7 0002:0000023a +b8:85ab 0002:0000023b +b8:85ac 0002:0000023c +b8:85b0 0002:0000023e +b8:85b3 0002:00000241 +b8:85b5 0002:00000242 +b8:85b7 0002:00000243 +b8:85b8 0002:00000243 +b8:85b9 0002:00000244 +b8:85ba 0002:0000024c +b8:85bd 0002:0000024d +b8:85bf 0002:0000024e +b8:85c0 0002:00000255 +b8:85c2 0002:00000256 +b8:85c3 0002:0000025a +b8:85c6 0002:0000025d +b8:85ca 0002:0000025e +b8:85cc 0002:0000025f +b8:85ce 0002:00000260 +b8:85d0 0002:00000261 +b8:85d2 0002:00000263 +b8:85d3 0002:00000264 +b8:85d4 0002:00000265 +b8:85d7 0002:00000266 +b8:85d8 0002:00000267 +b8:85db 0002:00000268 +b8:85dd 0002:0000026b +b8:85df 0002:0000026c +b8:85e0 0002:0000026d +b8:85e1 0002:0000026e +b8:85e4 0002:0000026f +b8:85e5 0002:00000271 +b8:85e9 0002:00000272 +b8:85eb 0002:00000273 +b8:85ed 0002:00000274 +b8:85ef 0002:00000275 +b8:85f0 0002:00000276 +b8:85f1 0002:00000277 +b8:85f3 0002:00000278 +b8:85f5 0002:0000027b +b8:85f6 0002:0000027c +b8:85f7 0002:0000027d +b8:85f8 0002:0000027f +b8:85f9 0002:00000280 +b8:85fa 0002:00000281 +b8:85fb 0002:00000282 +b8:85fc 0002:00000283 +b8:85fd 0002:00000287 +b8:85fe 0002:00000287 +b8:85ff 0002:00000287 +b8:8600 0002:00000288 +b8:8604 0002:00000289 +b8:8607 0002:00000289 +b8:8608 0002:0000028b +b8:860c 0002:0000028c +b8:860d 0002:0000028d +b8:8611 0002:0000028e +b8:8613 0002:00000290 +b8:8617 0002:00000291 +b8:8618 0002:00000292 +b8:8619 0002:00000293 +b8:861a 0002:00000294 +b8:861e 0002:00000295 +b8:861f 0002:00000296 +b8:8620 0002:00000299 +b8:8624 0002:0000029a +b8:8628 0002:0000029c +b8:862c 0002:0000029d +b8:862e 0002:0000029e +b8:8631 0002:0000029f +b8:8633 0002:000002a1 +b8:8635 0002:000002a4 +b8:8639 0002:000002a5 +b8:863c 0002:000002a6 +b8:863e 0002:000002a7 +b8:8641 0002:000002aa +b8:8642 0002:000002ab +b8:8643 0002:000002ac +b8:8647 0002:000002ad +b8:8649 0002:000002b1 +b8:864d 0002:000002b2 +b8:864e 0002:000002b3 +b8:8652 0002:000002b4 +b8:8653 0002:000002b6 +b8:8657 0002:000002b7 +b8:8659 0002:000002bc +b8:865d 0002:000002bd +b8:865e 0002:000002be +b8:8662 0002:000002bf +b8:8663 0002:000002c0 +b8:8666 0002:000002c1 +b8:8668 0002:000002c3 +b8:866c 0002:000002c5 +b8:866d 0002:000002c6 +b8:866e 0002:000002c7 +b8:866f 0002:000002c8 +b8:8673 0002:000002c9 +b8:8677 0002:000002ca +b8:8679 0002:000002cd +b8:867a 0002:000002cd +b8:867b 0002:000002cd +b8:867c 0002:000002ce +b8:867d 0002:000002d2 +b8:8681 0002:000002d3 +b8:8685 0002:000002d4 +b8:8687 0002:000002d5 +b8:868b 0002:000002d6 +b8:868e 0002:000002d7 +b8:8690 0002:000002d8 +b8:8693 0002:000002da +b8:8694 0002:000002dd +b8:8698 0002:000002df +b8:8699 0002:000002e0 +b8:869a 0002:000002e1 +b8:869b 0002:000002e2 +b8:869c 0002:000002e3 +8b:914a 0002:000002e8 +81:80f7 0002:000002eb +81:8027 0002:000002ee +82:8bb3 0002:000002f1 +85:baa3 0002:00000392 +85:baa4 0002:00000392 +85:baa5 0002:00000395 +85:baa7 0002:00000396 +85:baad 0002:00000396 +85:baae 0002:00000397 +85:bab1 0002:00000398 +85:bab2 0002:00000399 +85:bab3 0002:00000399 +85:bab4 0002:0000039d +85:bab7 0002:0000039e +85:babb 0002:0000039f +85:babd 0002:0000039f +85:babf 0002:000003a0 +85:bac2 0002:000003a1 +85:bac4 0002:000003a3 +85:bac5 0002:000003a4 +85:bac7 0002:000003a5 +85:bacb 0002:000003a5 +85:bacc 0002:000003a6 +85:bacf 0002:000003a8 +85:bad3 0002:000003a9 +85:bad6 0002:000003aa +85:bad7 0002:000003ab +85:bad8 0002:000003ab +85:bad9 0002:000003ac +85:badd 0002:000003ad +85:bade 0002:000003ae +85:bae2 0002:000003af +85:bae4 0002:000003b0 +85:bae5 0002:000003b1 +85:bae6 0002:000003b2 +85:bae9 0002:000003b3 +85:baeb 0002:000003b4 +85:baed 0002:000003b7 +85:baee 0002:000003b7 +85:baef 0002:000003b8 +85:baf2 0002:000003b9 +85:bb73 0002:000003c7 +85:bb75 0002:000003c8 +85:bb78 0002:000003c9 +85:bb7b 0002:000003ca +85:bb7e 0002:000003d2 +85:bb7f 0002:000003d3 +85:bb81 0002:000003d4 +85:bb84 0002:000003d5 +85:bb86 0002:000003d6 +85:bb88 0002:000003d7 +85:bb8b 0002:000003d8 +85:bb8d 0002:000003d9 +85:bb90 0002:000003da +85:bb92 0002:000003db +85:bb95 0002:000003dc +85:bb97 0002:000003df +85:bb98 0002:000003e0 +85:bb99 0002:000003e1 +85:bb9a 0002:000003e2 +85:bb9c 0002:000003e3 +85:bb9d 0002:000003e4 +85:bb9e 0002:000003e5 +85:bb9f 0002:000003ec +85:bba2 0002:000003ed +85:bba3 0002:000003ee +85:bba6 0002:000003ef +85:bba7 0002:000003f0 +85:bba8 0002:000003f1 +85:bba9 0002:000003f2 +85:bbaa 0002:000003fd +85:bbab 0002:000003fe +85:bbad 0002:000003ff +85:bbb0 0002:00000400 +85:bbb2 0002:00000401 +85:bbb5 0002:00000402 +85:bbb7 0002:00000403 +85:bbba 0002:00000404 +85:bbbc 0002:00000407 +85:bbbd 0002:00000408 +85:bbbe 0002:00000409 +85:bbc0 0002:0000040a +85:bbc1 0002:0000040c +85:bbc2 0002:0000040d +85:bbc4 0002:0000040e +85:bbc7 0002:0000040f +85:bbc9 0002:00000410 +85:bbcc 0002:00000411 +85:bbce 0002:00000412 +85:bbcf 0002:00000414 +85:bbd0 0002:00000415 +85:bbd2 0002:00000416 +85:bbd5 0002:00000417 +85:bbd7 0002:00000418 +85:bbda 0002:00000419 +85:bbdc 0002:0000041a +85:bbdd 0002:0000041c +85:bbde 0002:0000041d +85:bbe0 0002:0000041e +85:bbe3 0002:0000041f +85:bbe5 0002:00000420 +85:bbe8 0002:00000421 +85:bbea 0002:00000422 +85:8246 0002:00000427 +85:8249 0002:00000428 +85:824b 0002:00000429 +85:82f9 0002:0000042d b8:885c 0003:00000045 b8:885d 0003:00000045 b8:885e 0003:00000046 @@ -680,78 +790,78 @@ b8:888a 0003:0000005d 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 +84:fa02 0004:000000ee +84:fa05 0004:000000ef +84:fa06 0004:000000f0 +84:fa0a 0004:000000f3 +84:fa0d 0004:000000f4 +84:fa0f 0004:000000f6 +84:fa11 0004:000000f7 +84:fa12 0004:000000f8 +84:fa14 0004:000000f9 +84:fa15 0004:000000fa +84:fa19 0004:000000fb +84:fa1a 0004:000000fc +84:fa1b 0004:000000fd +84:fa1c 0004:00000100 +84:fa1d 0004:00000101 +84:fa1e 0004:00000105 +84:fa1f 0004:00000105 +84:fa20 0004:00000105 +84:fa21 0004:00000106 +84:fa24 0004:00000107 +84:fa27 0004:00000108 +84:fa28 0004:00000109 +84:fa2c 0004:0000010a +84:fa2f 0004:0000010b +84:fa31 0004:0000010d +84:fa34 0004:0000010e +84:fa35 0004:0000010e +84:fa39 0004:00000110 +84:fa3a 0004:00000112 +84:fa3b 0004:00000113 +84:fa3c 0004:00000114 +84:fa40 0004:00000115 +84:fa42 0004:00000116 +84:fa43 0004:00000117 +84:fa44 0004:00000118 +84:fa47 0004:00000119 +84:fa48 0004:0000011a +84:fa49 0004:0000011d +84:fa4a 0004:0000011e +84:fa4c 0004:0000011f +84:fa4d 0004:00000120 +84:fa51 0004:00000121 +84:fa52 0004:00000122 +84:fa53 0004:00000125 +84:fa57 0004:00000126 +84:fa5a 0004:00000129 +84:fa5e 0004:0000012a +84:fa61 0004:0000012e +84:fa64 0004:0000012e +84:fa66 0004:0000012f +84:fa69 0004:00000130 +84:fa6b 0004:00000131 +84:fa6e 0004:00000131 +84:fa70 0004:00000132 +84:fa73 0004:00000133 +84:fa75 0004:00000134 +84:fa78 0004:00000137 +84:fa79 0004:0000013b +84:fa7d 0004:0000013c +84:fa7e 0004:00000141 +84:fa7f 0004:00000142 +84:fa80 0004:00000143 +84:fa81 0004:00000143 +84:fa82 0004:00000147 +84:fa86 0004:00000148 +84:fa87 0004:00000149 +84:fa88 0004:0000014a +84:fa89 0004:0000014a +84:fa8a 0004:0000014b +84:fa8d 0004:0000014c +84:fa8e 0004:0000014d +84:fa8f 0004:0000014e 81:b303 0005:00000003 81:b307 0005:00000004 81:b308 0005:00000005 diff --git a/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json b/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json index 949b60f5..ae911707 100644 --- a/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json +++ b/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json @@ -4,7 +4,7 @@ "CLIPLEN_end": "85:990F", "CLIPLEN_no_multi": "85:990C", "CLIPSET": "85:FF1D", - "COLLECTTANK": "B8:84E8", + "COLLECTTANK": "B8:8503", "MISCFX": "85:FF45", "NORMAL": "84:8BF2", "SETFX": "85:FF4E", @@ -12,6 +12,11 @@ "SOUNDFX_84": "84:F9E0", "SPECIALFX": "85:FF3C", "ammo_loop_table": "84:F896", + "ap_playerid_to_rom_other_player_index": "B8:85BA", + "ap_playerid_to_rom_other_player_index_checklastrow": "B8:85DD", + "ap_playerid_to_rom_other_player_index_correctindex": "B8:85F8", + "ap_playerid_to_rom_other_player_index_do_search_stage_1": "B8:85C0", + "ap_playerid_to_rom_other_player_index_notfound": "B8:85F5", "archipelago_chozo_item_plm": "84:F874", "archipelago_hidden_item_plm": "84:F878", "archipelago_visible_item_plm": "84:F870", @@ -35,11 +40,13 @@ "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:8578", - "i_live_pickup_multiworld_end": "B8:85BD", - "i_live_pickup_multiworld_local_item_or_offworld": "B8:8594", - "i_live_pickup_multiworld_own_item": "B8:85A9", - "i_live_pickup_multiworld_own_item1": "B8:85B5", + "i_live_pickup_multiworld": "B8:85FD", + "i_live_pickup_multiworld_end": "B8:8679", + "i_live_pickup_multiworld_item_link_item": "B8:8659", + "i_live_pickup_multiworld_otherplayers_item": "B8:8649", + "i_live_pickup_multiworld_own_item": "B8:8635", + "i_live_pickup_multiworld_own_item1": "B8:8641", + "i_live_pickup_multiworld_send_network": "B8:8620", "i_load_custom_graphics": "84:FA1E", "i_load_custom_graphics_all_items": "84:FA39", "i_load_custom_graphics_alwaysloaded": "84:FA49", @@ -52,36 +59,41 @@ "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_PlaceholderBig": "85:BB73", + "message_char_table": "85:BAF3", + "message_hook_tilemap_calc": "85:BBAA", + "message_hook_tilemap_calc_msgbox_mw_item_link": "85:BBDD", + "message_hook_tilemap_calc_msgbox_mwrecv": "85:BBCF", + "message_hook_tilemap_calc_msgbox_mwsend": "85:BBC1", "message_hook_tilemap_calc_normal": "85:824C", - "message_hook_tilemap_calc_vanilla": "85:BAC9", + "message_hook_tilemap_calc_vanilla": "85:BBBC", + "message_item_link_distributed": "85:B9A3", + "message_item_link_distributed_end": "85:BAA3", "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", + "message_multiworld_init_new_messagebox_if_needed": "85:BB7E", + "message_multiworld_init_new_messagebox_if_needed_msgbox_mw_item_link": "85:BB9F", + "message_multiworld_init_new_messagebox_if_needed_msgbox_mwrecv": "85:BB9F", + "message_multiworld_init_new_messagebox_if_needed_msgbox_mwsend": "85:BB9F", + "message_multiworld_init_new_messagebox_if_needed_vanilla": "85:BB97", + "message_write_placeholders": "85:BAA3", + "message_write_placeholders_adjust": "85:BAA5", + "message_write_placeholders_end": "85:BAED", + "mw_cleanup_item_link_messagebox": "B8:84BB", "mw_display_item_sent": "B8:848B", - "mw_handle_queue": "B8:84F8", - "mw_handle_queue_end": "B8:8571", - "mw_handle_queue_loop": "B8:84FA", - "mw_handle_queue_new_remote_item": "B8:854A", - "mw_handle_queue_next": "B8:8566", - "mw_handle_queue_perform_receive": "B8:855C", - "mw_hook_main_game": "B8:85C1", + "mw_handle_queue": "B8:8513", + "mw_handle_queue_collect_item_if_present": "B8:8562", + "mw_handle_queue_end": "B8:85B3", + "mw_handle_queue_found": "B8:859B", + "mw_handle_queue_lookup_player": "B8:8522", + "mw_handle_queue_loop": "B8:8515", + "mw_handle_queue_new_remote_item": "B8:857C", + "mw_handle_queue_next": "B8:85A7", + "mw_handle_queue_perform_receive": "B8:858E", + "mw_hook_main_game": "B8:867D", "mw_init": "B8:8311", "mw_init_continuereset": "B8:8366", "mw_init_end": "B8:83EA", @@ -91,8 +103,9 @@ "mw_load_sram": "B8:8474", "mw_load_sram_done": "B8:8482", "mw_load_sram_setnewgame": "B8:8485", - "mw_receive_item": "B8:84A9", - "mw_receive_item_end": "B8:84E1", + "mw_prep_item_link_messagebox": "B8:84A9", + "mw_receive_item": "B8:84C4", + "mw_receive_item_end": "B8:84FC", "mw_save_sram": "B8:8469", "mw_write_message": "B8:8442", "nonprog_item_eight_palette_indices": "84:F888", @@ -119,16 +132,16 @@ "p_visible_item_end": "84:F96E", "p_visible_item_loop": "84:F95B", "p_visible_item_trigger": "84:F967", - "patch_load_multiworld": "B8:85D8", + "patch_load_multiworld": "B8:8694", "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_player_id_table": "B8:DCA0", + "rando_player_id_table_end": "B8:DE34", + "rando_player_name_table": "B8:D000", "rando_seed_data": "B8:CF00", "sm_item_graphics": "B8:8800", "sm_item_plm_pickup_sequence_pointers": "B8:882E",