From d0db728850412cb43421dd273f16dbe7901a7a1e Mon Sep 17 00:00:00 2001 From: lordlou <87331798+lordlou@users.noreply.github.com> Date: Thu, 29 Jun 2023 08:51:09 -0400 Subject: [PATCH] SM: 0.4.1 Fixes and Additional Objective Options (#1859) * first working (most of the time) progression generation for SM using VariaRandomizer's rules, items, locations and accessPoint (as regions) * first working single-world randomized SM rom patches * - SM now displays message when getting an item outside for someone else (fills ROM item table) This is dependant on modifications done to sm_randomizer_rom project * First working MultiWorld SM * some missing things: - player name inject in ROM and get in client - end game get from ROM in client - send self item to server - add player names table in ROM * replaced CollectionState inheritance from SMBoolManager with a composition of an array of it (required to generation more than one SM world, which is still fails but is better) * - reenabled balancing * post rebase fixes * updated SmClient.py * + added VariaRandomizer LICENSE * + added sm_randomizer_rom project (which builds sm.ips) * Moved VariaRandomizer and sm_randomizer_rom projects inside worlds/sm and done some cleaning * properly revert change made to CollectionState and more cleaning * Fixed multiworld support patch not working with VariaRandomizer's * missing file commit * Fixed syntax error in unused code to satisfy Linter * Revert "Fixed multiworld support patch not working with VariaRandomizer's" This reverts commit fb3ca18528bb331995e3d3051648c8f84d04c08b. * many fixes and improovement - fixed seeded generation - fixed broken logic when more than one SM world - added missing rules for inter-area transitions - added basic patch presence for logic - added DoorManager init call to reflect present patches for logic - moved CollectionState addition out of BaseClasses into SM world - added condition to apply progitempool presorting only if SM world is present - set Bosses item id to None to prevent them going into multidata - now use get_game_players * first working (most of the time) progression generation for SM using VariaRandomizer's rules, items, locations and accessPoint (as regions) * first working single-world randomized SM rom patches * - SM now displays message when getting an item outside for someone else (fills ROM item table) This is dependant on modifications done to sm_randomizer_rom project * First working MultiWorld SM * some missing things: - player name inject in ROM and get in client - end game get from ROM in client - send self item to server - add player names table in ROM * replaced CollectionState inheritance from SMBoolManager with a composition of an array of it (required to generation more than one SM world, which is still fails but is better) * - reenabled balancing * post rebase fixes * updated SmClient.py * + added VariaRandomizer LICENSE * + added sm_randomizer_rom project (which builds sm.ips) * Moved VariaRandomizer and sm_randomizer_rom projects inside worlds/sm and done some cleaning * properly revert change made to CollectionState and more cleaning * Fixed multiworld support patch not working with VariaRandomizer's * missing file commit * Fixed syntax error in unused code to satisfy Linter * Revert "Fixed multiworld support patch not working with VariaRandomizer's" This reverts commit fb3ca18528bb331995e3d3051648c8f84d04c08b. * many fixes and improovement - fixed seeded generation - fixed broken logic when more than one SM world - added missing rules for inter-area transitions - added basic patch presence for logic - added DoorManager init call to reflect present patches for logic - moved CollectionState addition out of BaseClasses into SM world - added condition to apply progitempool presorting only if SM world is present - set Bosses item id to None to prevent them going into multidata - now use get_game_players * Fixed multiworld support patch not working with VariaRandomizer's Added stage_fill_hook to set morph first in progitempool Added back VariaRandomizer's standard patches * + added missing files from variaRandomizer project * + added missing variaRandomizer files (custom sprites) + started integrating VariaRandomizer options (WIP) * Some fixes for player and server name display - fixed player name of 16 characters reading too far in SM client - fixed 12 bytes SM player name limit (now 16) - fixed server name not being displayed in SM when using server cheat ( now displays RECEIVED FROM ARCHIPELAGO) - request: temporarly changed default seed names displayed in SM main menu to OWTCH * Fixed Goal completion not triggering in smClient * integrated VariaRandomizer's options into AP (WIP) - startAP is working - door rando is working - skillset is working * - fixed itemsounds.ips crash by always including nofanfare.ips into multiworld.ips (itemsounds is now always applied and "itemsounds" preset must always be "off") * skillset are now instanced per player instead of being a singleton class * RomPatches are now instanced per player instead of being a singleton class * DoorManager is now instanced per player instead of being a singleton class * - fixed the last bugs that prevented generation of >1 SM world * fixed crash when no skillset preset is specified in randoPreset (default to "casual") * maxDifficulty support and itemsounds removal - added support for maxDifficulty - removed itemsounds patch as its always applied from multiworld patch for now * Fixed bad merge * Post merge adaptation * fixed player name length fix that got lost with the merge * fixed generation with other game type than SM * added default randoPreset json for SM in playerSettings.yaml * fixed broken SM client following merge * beautified json skillset presets * Fixed ArchipelagoSmClient not building * Fixed conflict between mutliworld patch and beam_doors_plms patch - doorsColorsRando now working * SM generation now outputs APBP - Fixed paths for patches and presets when frozen * added missing file and fixed multithreading issue * temporarily set data_version = 0 * more work - added support for AP starting items - fixed client crash with gamemode being None - patch.py "compatible_version" is now 3 * commited missing asm files fixed start item reserve breaking game (was using bad write offset when patching) * Nothing item are now handled game-side. the game will now skip displaying a message box for received Nothing item (but the client will still receive it). fixed crash in SMClient when loosing connection to SNI * fixed No Energy Item missing its ID fixed Plando * merge post fixes * fixed start item Grapple, XRay and Reserve HUD, as well as graphic beams (except ice palette color) * fixed freeze in blue brinstar caused by Varia's custom PLM not being filled with proper Multiworld PLM address (altLocsAddresses) * fixed start item x-ray HUD display * Fixed start items being sent by the server (is all handled in ROM) Start items are now not removed from itempool anymore Nothing Item is now local_items so no player will ever pickup Nothing. Doing so reduces contribution of this world to the Multiworld the more Nothing there is though. Fixed crash (and possibly passing but broken) at generation where the static list of IPSPatches used by all SM worlds was being modified * fixed settings that could be applied to any SM players * fixed auth to server only using player name (now does as ALTTP to authenticate) * - fixed End Credits broken text * added non SM item name display * added all supported SM options in playerSettings.yaml * fixed locations needing a list of parent regions (now generate a region for each location with one-way exits to each (previously) parent region did some cleaning (mainly reverts on unnecessary core classes * minor setting fixes and tweaks - merged Area and lightArea settings - made missileQty, superQty and powerBombQty use value from 10 to 90 and divide value by float(10) when generating - fixed inverted layoutPatch setting * added option start_inventory_removes_from_pool fixed option names formatting fixed lint errors small code and repo cleanup * Hopefully fixed ROR2 that could not send any items * - fixed missing required change to ROR2 * fixed 0 hp when respawning without having ever saved (start items were not updating the save checksum) * fixed typo with doors_colors_rando * fixed checksum * added custom sprites for off-world items (progression or not) the original AP sprite was made with PierRoulette's SM Item Sprite Utility by ijwu * - added missing change following upstream merge - changed patch filename extension from apbp to apm3 so patch can be used with the new client * added morph placement options: early means local and sphere 1 * fixed failing unit tests * - fixed broken custom_preset options * - big cleanup to remove unnecessary or unsupported features * - more cleanup * - moved sm_randomizer_rom and all always applied patches into an external project that outputs basepatch.ips - small cleanup * - added comment to refer to project for generating basepatch.ips (https://github.com/lordlou/SMBasepatch) * fixed g4_skip patch that can be not applied if hud is enabled * - fixed off world sprite that can have broken graphics (restricted to use only first 2 palette) * - updated basepatch to reflect g4_skip removal - moved more asm files to SMBasepatch project * - tourian grey doors at baby metroid are now always flashing (allowing to go back if needed) * fixed wrong path if using built as exe * - cleaned exposed maxDifficulty options - removed always enabled Knows * Merged LttPClient and SMClient into SNIClient * added varia_custom Preset Option that fetch a preset (read from a new varia_custom_preset Option) from varia's web service * small doc precision * - added death_link support - fixed broken Goal Completion - post merge fix * - removed now useless presets * - fixed bad internal mapping with maxDiff - increases maxDiff if only Bosses is preventing beating the game * - added support for lowercase custom preset sections (knows, settings and controller) - fixed controller settings not applying to ROM * - fixed death loop when dying with Door rando, bomb or speed booster as starting items - varia's backup save should now be usable (automatically enabled when doing door rando) * -added docstring for generated yaml * fixed bad merge * fixed broken infinity max difficulty * commented debug prints * adjusted credits to mark progression speed and difficulty as Non Available * added support for more than 255 players (will print Archipelago for higher player number) * fixed missing cleanup * added support for 65535 different player names in ROM * fixed generations failing when only bosses are unreachable * - replaced setting maxDiff to infinity with a bool only affecting boss logics if only bosses are left to finish * fixed failling generations when using 'fun' settings Accessibility checks are forced to 'items' if restricted locations are used by VARIA following usage of 'fun' settings * fixed debug logger * removed unsupported "suits_restriction" option * fixed generations failing when only bosses are unreachable (using a less intrusive approach for AP) * - fixed deathlink emptying reserves - added death_link_survive option that lets player survive when receiving a deathlink if the have non-empty reserves * - merged death_link and death_link_survive options * fixed death_link * added a fallback default starting location instead of failing generation if an invalid one was chosen * added Nothing and NoEnergy as hint blacklist added missing NoEnergy as local items and removed it from progression * fixed broken Item links * fixed failing generation that could happen with Disabled Tourian fixed shared Location list that could be modified for each world * added missing force disable of EscapeRando if an escape solution cant be found * fixed broken animal surprise patches * prevent receiving items when in the first room of Ceres (message box in mode7 is broken) * fixed generating with "activate chozo robots" Objective * added soft reset that saves to initial starting location reverted code change applied to fix softlocks from comeback checks reverted forcing all beam local when using door rando * replaced "save and reset" with "save and fast reload" (using same Start+Select+L+R) * added documentation about Save and Reload removed forgotten docstring about forcing beams as local items when using door rando * fixed frequent failing generation on WebHost (KeyError: 'Kraid') * added "objectiveRandom", "nbObjective", objectiveList and adapted Objective selection options to better reflect VARIA's. fixed "collect 100% items" not being excluded when objectiveRandom is used added Exception when VARIA initial layout fails * fixed broken non-AP items fixed determinism caused by the use of a set * fixed generation failing on Webhost with string as a OptionSet (replaced default with a list of string) cleaned doc and naming of Objective related Options --- worlds/sm/Options.py | 58 +- worlds/sm/__init__.py | 112 +- .../multiworld-basepatch.ips | Bin 18658 -> 19117 bytes .../data/SMBasepatch_prebuilt/multiworld.sym | 1710 +++++++++-------- .../sm-basepatch-symbols.json | 87 +- worlds/sm/docs/en_Super Metroid.md | 6 + .../sm/variaRandomizer/logic/smboolmanager.py | 6 +- .../patches/common/ips/draygonimals.ips | Bin 190 -> 180 bytes .../patches/common/ips/metalimals.ips | Bin 130 -> 125 bytes .../patches/common/ips/phantoonimals.ips | Bin 138 -> 128 bytes .../patches/common/ips/ridleyimals.ips | Bin 173 -> 163 bytes worlds/sm/variaRandomizer/rando/RandoExec.py | 3 +- worlds/sm/variaRandomizer/randomizer.py | 15 +- worlds/sm/variaRandomizer/rom/rompatcher.py | 2 +- worlds/sm/variaRandomizer/utils/utils.py | 5 +- 15 files changed, 1118 insertions(+), 886 deletions(-) diff --git a/worlds/sm/Options.py b/worlds/sm/Options.py index c67d4ea7..22317952 100644 --- a/worlds/sm/Options.py +++ b/worlds/sm/Options.py @@ -1,5 +1,5 @@ import typing -from Options import Choice, Range, OptionDict, OptionList, Option, Toggle, DefaultOnToggle +from Options import Choice, Range, OptionDict, OptionList, OptionSet, Option, Toggle, DefaultOnToggle from .variaRandomizer.utils.objectives import _goals class StartItemsRemovesFromPool(Toggle): @@ -136,7 +136,7 @@ class AreaLayout(Toggle): class DoorsColorsRando(Toggle): """Randomize the color of Red/Green/Yellow doors. Add four new type of doors which require Ice/Wave/Spazer/Plasma - beams to open them. When enabled, will force those beams as local items.""" + beams to open them.""" display_name = "Doors Colors Rando" class AllowGreyDoors(Toggle): @@ -215,7 +215,11 @@ class Hud(Toggle): display_name = "Hud" class Animals(Toggle): - """Replace saving the animals in the escape sequence by a random surprise.""" + """ + Replace saving the animals in the escape sequence by a random surprise. + Note: This setting is not available when Escape Randomization is enabled, as it is replaced by Animals Challenges + (see Escape Randomization help for more information). + """ display_name = "Animals" class NoMusic(Toggle): @@ -286,17 +290,52 @@ class Tourian(Choice): option_Disabled = 2 default = 0 -class Objective(OptionList): +class CustomObjective(Toggle): """ - Choose which objectives are required to sink the Golden Four statue and to open access to Tourian. - You can choose from 0 to 5 objectives. + Use randomized custom objectives. You can choose which objectives are available for the randomizer to choose from. If enabled, the randomizer + will choose "Custom objective count" objectives from "Custom objective list". Otherwise, only objective is used. Default is disabled. + """ + display_name = "Custom objectives" + +class CustomObjectiveCount(Range): + """ + By default you need to complete 4 objectives from the list to access Tourian. You can choose between 1 and 5. This setting is ignored if + ""Custom objectives"" is set to false. + """ + display_name = "Custom objective count" + range_start = 1 + range_end = 5 + default = 4 + +class CustomObjectiveList(OptionSet): + """ + If ""Custom objectives"" is enabled, "Custom Objective count" will be used to pick an amount of objective from the list. + This setting is ignored if ""Custom objectives"" is set to false. Note: If you leave the list empty no objective is required to access Tourian, ie. it's open. Note: See the Tourian parameter to enable fast Tourian or trigger the escape when all objectives are completed. Note: Current percentage of collected items is displayed in the inventory pause menu. - Note: Collect 100% items is excluded by default when randomizing the objectives list as it requires you to complete all the objectives. + Note: Collect 100% items is excluded by default as it requires you to complete all the objectives. Note: In AP, Items% and areas objectives are counted toward location checks, not items collected or received, except for "collect all upgrades" + + Format as a comma-separated list of objective names: ["kill three G4", "collect 75% items"] or ["random"] to specify the whole list except + "collect 100% items" and "nothing". The default is ["random"]. A full list of supported objectives can be found at: + https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/sm/variaRandomizer/utils/objectives.py + """ + display_name = "Custom objective list" + default = ["random"] + valid_keys = frozenset([name for name in _goals.keys()] + ["random"]) + #valid_keys_casefold = True - Format as a comma-separated list of objective names: ["kill three G4", "collect 75% items"]. +class Objective(OptionSet): + """ + If ""Custom objectives"" is disabled, choose which objectives are required to sink the Golden Four statue and to open access to Tourian. + You can choose from 0 to 5 objectives. Up to the first 5 objectives from the list will be selected. + Note: If you leave the list empty no objective is required to access Tourian, ie. it's open. + Note: See the Tourian parameter to enable fast Tourian or trigger the escape when all objectives are completed. + Note: Current percentage of collected items is displayed in the inventory pause menu. + Note: In AP, Items% and areas objectives are counted toward location checks, not items collected or received, except for "collect all upgrades" + + Format as a comma-separated list of objective names: ["kill three G4", "collect 75% items"]. The default is ["kill all G4"]. A full list of supported objectives can be found at: https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/sm/variaRandomizer/utils/objectives.py """ @@ -386,6 +425,9 @@ sm_options: typing.Dict[str, type(Option)] = { "custom_preset": CustomPreset, "varia_custom_preset": VariaCustomPreset, "tourian": Tourian, + "custom_objective": CustomObjective, + "custom_objective_list": CustomObjectiveList, + "custom_objective_count": CustomObjectiveCount, "objective": Objective, "relaxed_round_robin_cf": RelaxedRoundRobinCF, } diff --git a/worlds/sm/__init__.py b/worlds/sm/__init__.py index 05190211..60e557aa 100644 --- a/worlds/sm/__init__.py +++ b/worlds/sm/__init__.py @@ -40,7 +40,7 @@ class SMCollectionState(metaclass=AutoLogicRegister): # for unit tests where MultiWorld is instantiated before worlds if hasattr(parent, "state"): self.smbm = {player: SMBoolManager(player, parent.state.smbm[player].maxDiff, - parent.state.smbm[player].onlyBossLeft, parent.state.smbm[player].lastAP) for player in + parent.state.smbm[player].onlyBossLeft) for player in parent.get_game_players("Super Metroid")} for player, group in parent.groups.items(): if (group["game"] == "Super Metroid"): @@ -99,13 +99,15 @@ class SMWorld(World): required_client_version = (0, 2, 6) itemManager: ItemManager + spheres = None Logic.factory('vanilla') def __init__(self, world: MultiWorld, player: int): self.rom_name_available_event = threading.Event() self.locations = {} - self.need_comeback_check = True + if SMWorld.spheres != None: + SMWorld.spheres = None super().__init__(world, player) @classmethod @@ -118,7 +120,7 @@ class SMWorld(World): Logic.factory('vanilla') self.variaRando = VariaRandomizer(self.multiworld, get_base_rom_path(), self.player) - self.multiworld.state.smbm[self.player] = SMBoolManager(self.player, self.variaRando.maxDifficulty, lastAP = self.variaRando.args.startLocation) + self.multiworld.state.smbm[self.player] = SMBoolManager(self.player, self.variaRando.maxDifficulty) # keeps Nothing items local so no player will ever pickup Nothing # doing so reduces contribution of this world to the Multiworld the more Nothing there is though @@ -177,12 +179,7 @@ class SMWorld(World): item.Type, None if itemClass == 'Boss' else self.item_name_to_id[item.Name], player=self.player) - - beamItems = ['Spazer', 'Ice', 'Wave' ,'Plasma'] - if self.multiworld.doors_colors_rando[self.player].value != 0: - if item.Type in beamItems: - self.multiworld.local_items[self.player].value.add(item.Name) - + if itemClass == 'Boss': self.locked_items[item.Name] = smitem elif item.Category == 'Nothing': @@ -217,7 +214,6 @@ class SMWorld(World): self.multiworld.completion_condition[self.player] = lambda state: state.has('Mother Brain', self.player) - ammoItems = ['Missile', 'Super', 'PowerBomb'] for key, value in locationsDict.items(): location = self.multiworld.get_location(key, self.player) set_available_rule(location, self.player, value.Available) @@ -225,11 +221,6 @@ class SMWorld(World): add_accessFrom_rule(location, self.player, value.AccessFrom) if value.PostAvailable is not None: add_postAvailable_rule(location, self.player, value.PostAvailable) - - if self.multiworld.doors_colors_rando[self.player].value != 0: - add_item_rule(location, lambda item: item.game != self.game or item.type not in ammoItems or - (item.type in ammoItems and \ - (not item.advancement or (item.advancement and item.player == self.player)))) for accessPoint in Logic.accessPoints: if not accessPoint.Escape: @@ -304,11 +295,6 @@ class SMWorld(World): def collect(self, state: CollectionState, item: Item) -> bool: state.smbm[self.player].addItem(item.type) - if item.location != None and item.location.game == self.game: - for entrance in self.multiworld.get_region(item.location.parent_region.name, item.location.player).entrances: - if (entrance.parent_region.can_reach(state)): - state.smbm[item.location.player].lastAP = entrance.parent_region.name - break return super(SMWorld, self).collect(state, item) def remove(self, state: CollectionState, item: Item) -> bool: @@ -359,42 +345,57 @@ class SMWorld(World): loc.address = loc.item.code = None def post_fill(self): + # Having a sorted itemLocs from collection order is required for escapeTrigger when Tourian is Disabled. + # We cant use stage_post_fill for this as its called after worlds' post_fill. + # get_spheres could be cached in multiworld? + # Another possible solution would be to have a globally accessible list of items in the order in which the get placed in push_item + # and use the inversed starting from the first progression item. + if (SMWorld.spheres == None): + SMWorld.spheres = [itemLoc for sphere in self.multiworld.get_spheres() for itemLoc in sorted(sphere, key=lambda location: location.name)] + self.itemLocs = [ - ItemLocation(ItemManager.Items[itemLoc.item.type + ItemLocation(copy.copy(ItemManager.Items[itemLoc.item.type if isinstance(itemLoc.item, SMItem) and itemLoc.item.type in ItemManager.Items else - 'ArchipelagoItem'], - locationsDict[itemLoc.name], itemLoc.item.player, True) + 'ArchipelagoItem']), + copy.copy(locationsDict[itemLoc.name]), itemLoc.item.player, True) for itemLoc in self.multiworld.get_locations(self.player) ] - self.progItemLocs = [ - ItemLocation(ItemManager.Items[itemLoc.item.type - if isinstance(itemLoc.item, SMItem) and itemLoc.item.type in ItemManager.Items else - 'ArchipelagoItem'], - locationsDict[itemLoc.name], itemLoc.item.player, True) - for itemLoc in self.multiworld.get_locations(self.player) if itemLoc.item.advancement - ] - for itemLoc in self.itemLocs: - if itemLoc.Item.Class == "Boss": - itemLoc.Item.Class = "Minor" - for itemLoc in self.progItemLocs: - if itemLoc.Item.Class == "Boss": - itemLoc.Item.Class = "Minor" - localItemLocs = [il for il in self.itemLocs if il.player == self.player] - localprogItemLocs = [il for il in self.progItemLocs if il.player == self.player] + escapeTrigger = None + if self.variaRando.randoExec.randoSettings.restrictions["EscapeTrigger"]: + #used to simulate received items + first_local_collected_loc = next(itemLoc for itemLoc in SMWorld.spheres if itemLoc.player == self.player) + + playerItemsItemLocs = [ + ItemLocation(copy.copy(ItemManager.Items[ + itemLoc.item.type if isinstance(itemLoc.item, SMItem) and itemLoc.item.type in ItemManager.Items else + 'ArchipelagoItem']), + copy.copy(locationsDict[itemLoc.name] if itemLoc.game == self.game else + locationsDict[first_local_collected_loc.name]), + itemLoc.item.player, + True) + for itemLoc in SMWorld.spheres if itemLoc.item.player == self.player + ] + for itemLoc in playerItemsItemLocs: + if itemLoc.Item.Class == "Boss": + itemLoc.Item.Class = "Minor" + + playerProgItemsItemLocs = [itemLoc for itemLoc in playerItemsItemLocs if itemLoc.item.advancement] + + escapeTrigger = (playerItemsItemLocs, playerProgItemsItemLocs, 'Full') - escapeTrigger = (localItemLocs, localprogItemLocs, 'Full') if self.variaRando.randoExec.randoSettings.restrictions["EscapeTrigger"] else None escapeOk = self.variaRando.randoExec.graphBuilder.escapeGraph(self.variaRando.container, self.variaRando.randoExec.areaGraph, self.variaRando.randoExec.randoSettings.maxDiff, escapeTrigger) - assert escapeOk, "Could not find a solution for escape" - + if (not escapeOk): + logger.warning(f"Escape Rando forced to 'Off' for player {self.multiworld.get_player_name(self.player)} because could not find a solution for escape") + + # if we couldn't find an area layout then the escape graph is not created either + # and getDoorConnections will crash if random escape is activated. self.variaRando.doors = GraphUtils.getDoorConnections(self.variaRando.randoExec.areaGraph, self.variaRando.args.area, self.variaRando.args.bosses, - self.variaRando.args.escapeRando) + self.variaRando.args.escapeRando if escapeOk else False) self.variaRando.randoExec.postProcessItemLocs(self.itemLocs, self.variaRando.args.hideItems) - self.need_comeback_check = False - @classmethod def stage_post_fill(cls, world): new_state = CollectionState(world) @@ -872,29 +873,6 @@ class SMLocation(Location): def __init__(self, player: int, name: str, address=None, parent=None): super(SMLocation, self).__init__(player, name, address, parent) - def can_reach(self, state: CollectionState) -> bool: - # self.access_rule computes faster on average, so placing it first for faster abort - assert self.parent_region, "Can't reach location without region" - return super(SMLocation, self).can_reach(state) and \ - (not state.multiworld.worlds[self.player].need_comeback_check or \ - self.can_comeback(state, self.item)) - - def can_comeback(self, state: CollectionState, item): - randoExec = state.multiworld.worlds[self.player].variaRando.randoExec - randoService = randoExec.setup.services - - comebackCheck = ComebackCheckType.JustComeback - n = 2 if GraphUtils.isStandardStart(randoExec.graphSettings.startAP) else 3 - # is early game - if (len([loc for loc in state.locations_checked if loc.player == self.player]) <= n or randoExec.graphSettings.startAP == state.smbm[self.player].lastAP): - comebackCheck = ComebackCheckType.NoCheck - container = ItemLocContainer(state.smbm[self.player], [], []) - return randoService.fullComebackCheck( container, - state.smbm[self.player].lastAP, - ItemManager.Items[item.type] if item is not None and item.player == self.player else None, - locationsDict[self.name], - comebackCheck) - class SMItem(Item): game = "Super Metroid" type: str diff --git a/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips b/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips index 88a4a308cfbf5e99129afe3229368fe1f0ea41bd..e7b7c54649929a5ea1f5ed11a26d7b84c9e73aaf 100644 GIT binary patch delta 689 zcmX9+PiWI%6n{y(rfCb?w4*~Njh}2wMYLYLJ2$8&Wq45{R+x|x2KBfpZLH0h&af37 z6gFr&DA;POQiLG5vh8A!%^(QFi`9c0^-?y9u7}2#`5nIZ`~BV@-uK@3GfU}9)P-x8 zu3wG;9?Ax84m<=pTB8Bn61asxM+0sf!FdFyjw2ZDXj%W+R0`q!i~;f=1n*`IsJbw7 z;G@xKQ2r{oNp{wt?hHBAY(@4`(~I!lyAh2Q=OfXm8I4+`;vPy^1A53~h4dV2(y-WF z*+9?B8mh5n~Y>)Okj%jI&7s@sh! zRk&i?c`w4hse-5k`I)vT(f)mW%1K*kH0TE$J@|IYN7KEt)oFU{bjtf<0-evDsr4iQ zUg`0$ zF-K)ZawaDWp@Mt_R^nmZWVTw270^F1TL+Bg9uY`EMp11sD5(d|&4NwV7aY|wM*;D0 zGf-OkrH=SYgS+aePv2nGV?JrX1+KN~=HL`{0w=wIOX0<`1|Z>}9X8YMf5}%b4*MxS zq!_itPO^KqE15^zt^t=I+lukVS&Fh*T*qxF>)g(>N&fZKe8!Nun!9eisL^$!Z1zD< zFZqx$p7_e-Tqi?5qaSd#5}C|uWbrUv0eidISIOZQ@PZYnEHg=S?0eJ24J#6vtKNt_ G4*vrnN*P4} delta 197 zcmV;$06PDzl>y?B0Siz;R6|Gr00001|B*2)CiegYT$F~m0J8%C1|l5Dxa#Tw3$p+O zB7KIq0bwQp1|k6eg@6dNO92`J0{w-vX9Gne1snqa1D&&NCv5=+C}^sn006V}C<_4r z1ClBf6S{@Cumh<80ENS)!72X$g~1@ilP4;!LW_jBfFQpF;JB#20^qo+$rS()5hAIC zxQYs@A};=fBD;jRfB-0Z`fDO-k)W>t|IY9Xub2sb$p`?@10WNHYa(>BBrAy@16N3_ diff --git a/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym b/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym index f537a73b..6d73322f 100644 --- a/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym +++ b/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym @@ -2,16 +2,17 @@ ; generated by asar [labels] -B8:83C1 :neg_1_1 -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 +82:FA1A :neg_1_1 +B8:83C1 :neg_1_2 +B8:85DA :neg_1_3 +B8:85F9 :neg_1_4 +85:BAB4 :neg_1_5 +85:BACF :neg_1_6 +B8:C81F :neg_1_7 +B8:C831 :neg_1_8 +B8:C843 :neg_1_9 B8:830C :pos_1_0 -B8:8693 :pos_1_1 +B8:86B4 :pos_1_1 84:FE1B :pos_1_2 84:FE25 :pos_1_3 B8:C862 :pos_1_4 @@ -22,7 +23,7 @@ B8:C87C :pos_1_6 85:990F CLIPLEN_end 85:990C CLIPLEN_no_multi 85:FF1D CLIPSET -B8:8503 COLLECTTANK +B8:8517 COLLECTTANK 85:FF45 MISCFX 84:8BF2 NORMAL 85:FF4E SETFX @@ -30,15 +31,17 @@ B8:8503 COLLECTTANK 84:FD90 SOUNDFX_84 85:FF3C SPECIALFX 84:FC46 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 +B8:85CE ap_playerid_to_rom_other_player_index +B8:85F1 ap_playerid_to_rom_other_player_index_checklastrow +B8:860C ap_playerid_to_rom_other_player_index_correctindex +B8:85D4 ap_playerid_to_rom_other_player_index_do_search_stage_1 +B8:8609 ap_playerid_to_rom_other_player_index_notfound 84:FC24 archipelago_chozo_item_plm 84:FC28 archipelago_hidden_item_plm 84:FC20 archipelago_visible_item_plm 84:FC42 c_item +82:F990 check_reload +82:F9C0 check_reload_end CE:FF04 config_deathlink CE:FF00 config_flags CE:FF00 config_multiworld @@ -50,6 +53,8 @@ B8:83FD copy_memory B8:8417 copy_memory_done B8:8409 copy_memory_even B8:840F copy_memory_loop +82:F9C3 deathhook +82:F9D8 deathhook_zebes 84:FC44 h_item 84:FC5D i_chozo_item 84:FC64 i_hidden_item @@ -58,13 +63,13 @@ B8:885C i_item_setup_shared B8:8878 i_item_setup_shared_all_items B8:8883 i_item_setup_shared_alwaysloaded 84:FE29 i_live_pickup -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 +B8:8611 i_live_pickup_multiworld +B8:868D i_live_pickup_multiworld_end +B8:866D i_live_pickup_multiworld_item_link_item +B8:865D i_live_pickup_multiworld_otherplayers_item +B8:8649 i_live_pickup_multiworld_own_item +B8:8655 i_live_pickup_multiworld_own_item1 +B8:8634 i_live_pickup_multiworld_send_network 84:FDCE i_load_custom_graphics 84:FDE9 i_load_custom_graphics_all_items 84:FDF9 i_load_custom_graphics_alwaysloaded @@ -100,30 +105,30 @@ B8:8620 i_live_pickup_multiworld_send_network 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: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:84CF mw_cleanup_item_link_messagebox +B8:849F mw_display_item_sent +B8:8527 mw_handle_queue +B8:8576 mw_handle_queue_collect_item_if_present +B8:85C7 mw_handle_queue_end +B8:85AF mw_handle_queue_found +B8:8536 mw_handle_queue_lookup_player +B8:8529 mw_handle_queue_loop +B8:8590 mw_handle_queue_new_remote_item +B8:85BB mw_handle_queue_next +B8:85A2 mw_handle_queue_perform_receive +B8:8691 mw_hook_main_game B8:8311 mw_init B8:8366 mw_init_continuereset B8:83EA mw_init_end B8:8300 mw_init_memory B8:833B mw_init_reset_sram 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_prep_item_link_messagebox -B8:84C4 mw_receive_item -B8:84FC mw_receive_item_end +B8:8488 mw_load_sram +B8:8496 mw_load_sram_done +B8:8499 mw_load_sram_setnewgame +B8:84BD mw_prep_item_link_messagebox +B8:84D8 mw_receive_item +B8:8510 mw_receive_item_end B8:8469 mw_save_sram B8:8442 mw_write_message 84:FC38 nonprog_item_eight_palette_indices @@ -150,7 +155,7 @@ B8:8442 mw_write_message 84:FD1E p_visible_item_end 84:FD0B p_visible_item_loop 84:FD17 p_visible_item_trigger -B8:8694 patch_load_multiworld +B8:86B5 patch_load_multiworld 84:FE2E perform_item_pickup 84:FC36 plm_graphics_entry_offworld_item 84:FC2C plm_graphics_entry_offworld_progression_item @@ -161,8 +166,21 @@ B8:DCA0 rando_player_id_table B8:DE34 rando_player_id_table_end B8:D000 rando_player_name_table B8:CF00 rando_seed_data +A0:FE0C setup_game_1 +A0:FE1F setup_game_1_quick +A0:FE2F setup_game_2 +A0:FE40 setup_game_2_quick +A0:FE44 setup_game_3 +A0:FE73 setup_game_3_loadmusic +A0:FE57 setup_game_3_quick +A0:FE00 setup_music +A0:FE0B setup_music_quick +A0:FE94 setup_samus +A0:FEA5 setup_samus_normal +82:FA0C sm_fix_checksum B8:8800 sm_item_graphics B8:882E sm_item_plm_pickup_sequence_pointers +B8:847B sm_save_done_hook B8:C81C start_item B8:C800 start_item_data_major B8:C808 start_item_data_minor @@ -173,732 +191,898 @@ B8:83EF write_repeated_memory B8:83F4 write_repeated_memory_loop [source files] -0000 bf919aa9 main.asm -0001 06780555 ../common/nofanfare.asm -0002 ae952bc9 ../common/multiworld.asm -0003 f7e9db95 ../common/itemextras.asm -0004 b0dd378a ../common/items.asm -0005 dbfcb38d ../common/startitem.asm +0000 fe019f55 main.asm +0001 5d628289 ../common/fast_reload.asm +0002 06780555 ../common/nofanfare.asm +0003 7a8904b6 ../common/multiworld.asm +0004 f7e9db95 ../common/itemextras.asm +0005 b0dd378a ../common/items.asm +0006 dbfcb38d ../common/startitem.asm [rom checksum] -e8b10748 +72f7eb3b [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:8300 0002:0000005a -b8:8302 0002:0000005b -b8:8306 0002:0000005c -b8:8308 0002:0000005d -b8:830c 0002:00000061 -b8:830e 0002:00000062 -b8:8310 0002:00000063 -b8:8311 0002:00000066 -b8:8312 0002:00000066 -b8:8313 0002:00000066 -b8:8314 0002:00000066 +ce:ff0a 0001:00000012 +82:f990 0001:00000016 +82:f991 0001:00000017 +82:f993 0001:00000018 +82:f994 0001:00000019 +82:f996 0001:0000001a +82:f999 0001:0000001b +82:f99c 0001:0000001c +82:f99e 0001:0000001d +82:f9a2 0001:0000001e +82:f9a4 0001:0000001f +82:f9a7 0001:00000020 +82:f9a9 0001:00000021 +82:f9ac 0001:00000022 +82:f9af 0001:00000023 +82:f9b1 0001:00000024 +82:f9b5 0001:00000025 +82:f9b8 0001:00000026 +82:f9ba 0001:00000027 +82:f9bb 0001:00000028 +82:f9bc 0001:00000029 +82:f9bf 0001:0000002a +82:f9c0 0001:0000002c +82:f9c1 0001:0000002d +82:f9c2 0001:0000002e +82:f9c3 0001:00000031 +82:f9c4 0001:00000032 +82:f9c6 0001:00000033 +82:f9c9 0001:00000034 +82:f9cc 0001:00000036 +82:f9d0 0001:00000037 +82:f9d3 0001:00000037 +82:f9d5 0001:00000038 +82:f9d8 0001:0000003a +82:f9d9 0001:0000003b +82:f9dc 0001:0000003b +82:f9dd 0001:0000003b +82:f9e0 0001:0000003c +82:f9e1 0001:0000003c +82:f9e2 0001:0000003d +82:f9e5 0001:0000003d +82:f9e8 0001:0000003e +82:f9e9 0001:0000003f +82:f9ed 0001:00000040 +82:f9f1 0001:00000041 +82:f9f5 0001:00000043 +82:f9f9 0001:00000044 +82:f9fc 0001:00000045 +82:fa00 0001:00000046 +82:fa04 0001:00000047 +82:fa07 0001:00000048 +82:fa0a 0001:00000049 +82:fa0b 0001:0000004a +82:fa0c 0001:0000004d +82:fa0d 0001:0000004e +82:fa0e 0001:0000004f +82:fa0f 0001:00000050 +82:fa10 0000:00000013 +82:fa12 0001:00000054 +82:fa14 0001:00000055 +82:fa15 0001:00000056 +82:fa17 0001:00000057 +82:fa1a 0001:00000059 +82:fa1e 0001:0000005a +82:fa1f 0001:0000005b +82:fa21 0001:0000005c +82:fa23 0001:0000005d +82:fa24 0001:0000005e +82:fa25 0001:0000005f +82:fa28 0001:00000060 +82:fa2a 0001:00000062 +82:fa2d 0001:00000063 +82:fa2f 0001:00000064 +82:fa33 0001:00000065 +82:fa37 0001:00000066 +82:fa3a 0001:00000067 +82:fa3e 0001:00000068 +82:fa42 0001:00000069 +82:fa43 0001:0000006a +82:fa45 0001:0000006c +82:fa46 0001:0000006d +82:fa47 0001:0000006e +82:fa48 0001:0000006f +82:fa49 0001:00000070 +80:a088 0001:00000076 +80:a08c 0001:00000076 +80:a08d 0001:00000076 +80:a095 0001:00000079 +80:a0ce 0001:0000007c +80:a113 0001:0000007f +91:e164 0001:00000082 +91:e168 0001:00000082 +91:e169 0001:00000082 +a0:fe00 0001:00000087 +a0:fe03 0001:00000088 +a0:fe05 0001:00000089 +a0:fe08 0001:0000008a +a0:fe0b 0001:0000008c +a0:fe0c 0001:0000008f +a0:fe10 0001:00000090 +a0:fe13 0001:00000091 +a0:fe15 0001:00000092 +a0:fe18 0001:00000093 +a0:fe1b 0001:00000094 +a0:fe1f 0001:00000096 +a0:fe23 0001:00000097 +a0:fe27 0001:00000098 +a0:fe2b 0001:00000099 +a0:fe2f 0001:0000009c +a0:fe33 0001:0000009d +a0:fe36 0001:0000009e +a0:fe38 0001:0000009f +a0:fe3c 0001:000000a0 +a0:fe40 0001:000000a2 +a0:fe44 0001:000000a5 +a0:fe48 0001:000000a6 +a0:fe49 0001:000000a7 +a0:fe4c 0001:000000a8 +a0:fe4e 0001:000000a9 +a0:fe4f 0001:000000aa +a0:fe53 0001:000000ab +a0:fe57 0001:000000ad +a0:fe58 0001:000000ae +a0:fe5c 0001:000000af +a0:fe5f 0001:000000b0 +a0:fe62 0001:000000b1 +a0:fe65 0001:000000b2 +a0:fe67 0001:000000b3 +a0:fe6a 0001:000000b4 +a0:fe6d 0001:000000b5 +a0:fe6f 0001:000000b6 +a0:fe73 0001:000000b9 +a0:fe76 0001:000000ba +a0:fe79 0001:000000bb +a0:fe7c 0001:000000bc +a0:fe7f 0001:000000be +a0:fe82 0001:000000bf +a0:fe85 0001:000000c0 +a0:fe89 0001:000000c1 +a0:fe8c 0001:000000c2 +a0:fe90 0001:000000c4 +a0:fe94 0001:000000c7 +a0:fe97 0001:000000c8 +a0:fe99 0001:000000c9 +a0:fe9c 0001:000000ca +a0:fe9f 0001:000000cb +a0:fea2 0001:000000cc +a0:fea5 0001:000000ce +a0:fea8 0001:000000cf +a0:feab 0001:000000d0 +85:ff00 0002:0000010b +85:ff03 0002:0000010c +85:ff06 0002:0000010d +85:ff08 0002:0000010e +85:ff0b 0002:0000010f +85:ff0f 0002:00000110 +85:ff12 0002:00000111 +85:ff16 0002:00000112 +85:ff19 0002:00000113 +85:ff1c 0002:00000114 +85:ff1d 0002:00000117 +85:ff20 0002:00000118 +85:ff24 0002:00000119 +85:ff28 0002:0000011a +85:ff2b 0002:0000011c +85:ff2f 0002:0000011d +85:ff30 0002:00000120 +85:ff34 0002:00000121 +85:ff37 0002:00000122 +85:ff3b 0002:00000123 +85:ff3c 0002:00000126 +85:ff40 0002:00000127 +85:ff44 0002:00000128 +85:ff45 0002:0000012b +85:ff49 0002:0000012c +85:ff4d 0002:0000012d +85:ff4e 0002:00000131 +85:ff51 0002:00000132 +85:ff54 0002:00000134 +85:ff57 0002:00000135 +85:ff58 0002:00000136 +85:8490 0002:0000013a +85:9900 0002:0000013e +85:9901 0002:0000013f +85:9905 0002:00000140 +85:9907 0002:00000141 +85:990a 0002:00000142 +85:990c 0002:00000144 +85:990f 0002:00000146 +85:9910 0002:00000147 +82:e126 0002:0000014a +82:e12a 0002:0000014b +85:8089 0002:0000014e +84:8bf2 0002:00000152 +84:8bf6 0002:00000153 +84:8bf7 0002:00000153 +b8:8300 0003:00000060 +b8:8302 0003:00000061 +b8:8306 0003:00000062 +b8:8308 0003:00000063 +b8:830c 0003:00000067 +b8:830e 0003:00000068 +b8:8310 0003:00000069 +b8:8311 0003:0000006c +b8:8312 0003:0000006c +b8:8313 0003:0000006c +b8:8314 0003:0000006c b8:8315 0000:00000013 -b8:8317 0002:0000006a -b8:831b 0002:0000006b -b8:831e 0002:0000006c -b8:8320 0002:0000006d -b8:8324 0002:0000006e -b8:8328 0002:0000006f -b8:832a 0002:00000070 -b8:832e 0002:00000071 -b8:8332 0002:00000072 -b8:8334 0002:00000074 -b8:8338 0002:00000075 -b8:833b 0002:00000078 -b8:833c 0002:00000079 -b8:833f 0002:0000007a -b8:8342 0002:0000007b -b8:8345 0002:0000007c -b8:8348 0002:0000007d -b8:8349 0002:0000007e -b8:834a 0002:0000007f -b8:834e 0002:00000080 -b8:834f 0002:00000082 -b8:8366 0002:00000086 -b8:8368 0002:00000087 -b8:8369 0002:00000088 -b8:836a 0002:00000089 -b8:836c 0002:0000008a -b8:836e 0002:0000008b -b8:8370 0002:0000008c -b8:8372 0002:0000008d -b8:8375 0002:0000008e -b8:8377 0002:0000008f -b8:837a 0002:00000090 -b8:837d 0002:00000091 -b8:837f 0002:00000092 -b8:8383 0002:00000094 -b8:8385 0002:00000095 -b8:8387 0002:00000096 -b8:8389 0002:00000097 -b8:838b 0002:00000098 -b8:838d 0002:00000099 -b8:838f 0002:0000009a -b8:8392 0002:0000009b -b8:8394 0002:0000009c -b8:8397 0002:0000009d -b8:839a 0002:0000009e -b8:839c 0002:0000009f -b8:83a0 0002:000000a1 -b8:83a3 0002:000000a2 -b8:83a7 0002:000000a3 -b8:83ab 0002:000000a4 -b8:83af 0002:000000a5 -b8:83b3 0002:000000a6 -b8:83b7 0002:000000a8 -b8:83bb 0002:000000b0 -b8:83be 0002:000000b1 -b8:83c1 0002:000000b3 -b8:83c2 0002:000000b4 -b8:83c3 0002:000000b5 -b8:83c7 0002:000000b6 -b8:83cb 0002:000000b7 -b8:83cd 0002:000000c4 -b8:83d1 0002:000000c5 -b8:83d4 0002:000000c6 -b8:83d6 0002:000000c7 -b8:83da 0002:000000c8 -b8:83dd 0002:000000c9 -b8:83df 0002:000000ce -b8:83e2 0002:000000cf -b8:83e6 0002:000000d0 -b8:83ea 0002:000000d3 -b8:83eb 0002:000000d3 -b8:83ec 0002:000000d3 -b8:83ed 0002:000000d3 -b8:83ee 0002:000000d4 -b8:83ef 0002:000000db -b8:83f0 0002:000000dc -b8:83f1 0002:000000dd -b8:83f2 0002:000000de -b8:83f3 0002:000000df -b8:83f4 0002:000000e1 -b8:83f7 0002:000000e2 -b8:83f8 0002:000000e3 -b8:83f9 0002:000000e4 -b8:83fa 0002:000000e5 -b8:83fc 0002:000000e7 -b8:83fd 0002:000000ee -b8:83fe 0002:000000ef -b8:83ff 0002:000000f0 -b8:8400 0002:000000f1 -b8:8402 0002:000000f3 -b8:8404 0002:000000f4 -b8:8405 0002:000000f5 -b8:8407 0002:000000f6 -b8:8409 0002:000000f8 -b8:840b 0002:000000f9 -b8:840c 0002:000000fa -b8:840d 0002:000000fb -b8:840f 0002:000000fd -b8:8411 0002:000000fe -b8:8413 0002:000000ff -b8:8414 0002:00000100 -b8:8415 0002:00000101 -b8:8417 0002:00000103 -b8:8418 0002:00000104 -b8:8419 0002:00000108 -b8:841d 0002:00000109 -b8:8421 0002:0000010a -b8:8425 0002:0000010b -b8:8429 0002:0000010c -b8:842d 0002:0000010d -b8:8431 0002:0000010e -b8:8435 0002:0000010f -b8:8439 0002:00000110 -b8:843d 0002:00000111 -b8:8441 0002:00000112 -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:8317 0003:00000070 +b8:831b 0003:00000071 +b8:831e 0003:00000072 +b8:8320 0003:00000073 +b8:8324 0003:00000074 +b8:8328 0003:00000075 +b8:832a 0003:00000076 +b8:832e 0003:00000077 +b8:8332 0003:00000078 +b8:8334 0003:0000007a +b8:8338 0003:0000007b +b8:833b 0003:0000007e +b8:833c 0003:0000007f +b8:833f 0003:00000080 +b8:8342 0003:00000081 +b8:8345 0003:00000082 +b8:8348 0003:00000083 +b8:8349 0003:00000084 +b8:834a 0003:00000085 +b8:834e 0003:00000086 +b8:834f 0003:00000088 +b8:8366 0003:0000008c +b8:8368 0003:0000008d +b8:8369 0003:0000008e +b8:836a 0003:0000008f +b8:836c 0003:00000090 +b8:836e 0003:00000091 +b8:8370 0003:00000092 +b8:8372 0003:00000093 +b8:8375 0003:00000094 +b8:8377 0003:00000095 +b8:837a 0003:00000096 +b8:837d 0003:00000097 +b8:837f 0003:00000098 +b8:8383 0003:0000009a +b8:8385 0003:0000009b +b8:8387 0003:0000009c +b8:8389 0003:0000009d +b8:838b 0003:0000009e +b8:838d 0003:0000009f +b8:838f 0003:000000a0 +b8:8392 0003:000000a1 +b8:8394 0003:000000a2 +b8:8397 0003:000000a3 +b8:839a 0003:000000a4 +b8:839c 0003:000000a5 +b8:83a0 0003:000000a7 +b8:83a3 0003:000000a8 +b8:83a7 0003:000000a9 +b8:83ab 0003:000000aa +b8:83af 0003:000000ab +b8:83b3 0003:000000ac +b8:83b7 0003:000000ae +b8:83bb 0003:000000b6 +b8:83be 0003:000000b7 +b8:83c1 0003:000000b9 +b8:83c2 0003:000000ba +b8:83c3 0003:000000bb +b8:83c7 0003:000000bc +b8:83cb 0003:000000bd +b8:83cd 0003:000000ca +b8:83d1 0003:000000cb +b8:83d4 0003:000000cc +b8:83d6 0003:000000cd +b8:83da 0003:000000ce +b8:83dd 0003:000000cf +b8:83df 0003:000000d4 +b8:83e2 0003:000000d5 +b8:83e6 0003:000000d6 +b8:83ea 0003:000000d9 +b8:83eb 0003:000000d9 +b8:83ec 0003:000000d9 +b8:83ed 0003:000000d9 +b8:83ee 0003:000000da +b8:83ef 0003:000000e1 +b8:83f0 0003:000000e2 +b8:83f1 0003:000000e3 +b8:83f2 0003:000000e4 +b8:83f3 0003:000000e5 +b8:83f4 0003:000000e7 +b8:83f7 0003:000000e8 +b8:83f8 0003:000000e9 +b8:83f9 0003:000000ea +b8:83fa 0003:000000eb +b8:83fc 0003:000000ed +b8:83fd 0003:000000f4 +b8:83fe 0003:000000f5 +b8:83ff 0003:000000f6 +b8:8400 0003:000000f7 +b8:8402 0003:000000f9 +b8:8404 0003:000000fa +b8:8405 0003:000000fb +b8:8407 0003:000000fc +b8:8409 0003:000000fe +b8:840b 0003:000000ff +b8:840c 0003:00000100 +b8:840d 0003:00000101 +b8:840f 0003:00000103 +b8:8411 0003:00000104 +b8:8413 0003:00000105 +b8:8414 0003:00000106 +b8:8415 0003:00000107 +b8:8417 0003:00000109 +b8:8418 0003:0000010a +b8:8419 0003:0000010e +b8:841d 0003:0000010f +b8:8421 0003:00000110 +b8:8425 0003:00000111 +b8:8429 0003:00000112 +b8:842d 0003:00000113 +b8:8431 0003:00000114 +b8:8435 0003:00000115 +b8:8439 0003:00000116 +b8:843d 0003:00000117 +b8:8441 0003:00000118 +b8:8442 0003:00000121 +b8:8443 0003:00000121 +b8:8444 0003:00000122 +b8:8445 0003:00000122 +b8:8446 0003:00000123 +b8:844a 0003:00000124 +b8:844d 0003:00000124 +b8:844e 0003:00000125 +b8:844f 0003:00000126 +b8:8453 0003:00000127 +b8:8454 0003:00000128 +b8:8458 0003:00000129 +b8:8459 0003:0000012a +b8:845d 0003:0000012c +b8:8461 0003:0000012d +b8:8462 0003:0000012e +b8:8466 0003:0000012f +b8:8467 0003:0000012f +b8:8468 0003:00000130 +b8:8469 0003:00000135 +b8:846a 0003:00000135 b8:846b 0000:00000013 -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: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 -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:fc56 0004:00000051 -84:fc59 0004:00000052 -84:fc5c 0004:00000053 -84:fc5d 0004:00000056 -84:fc60 0004:00000057 -84:fc63 0004:00000058 -84:fc64 0004:0000005b -84:fc67 0004:0000005c -84:fc6a 0004:0000005d -84:fd90 0004:000000d4 -84:fd94 0004:000000d5 -84:fd95 0004:000000d8 -84:fd98 0004:000000d9 -84:fd9a 0004:000000da -84:fd9c 0004:000000dd -84:fd9f 0004:000000de -84:fda1 0004:000000e5 -84:fda2 0004:000000e6 -84:fda5 0004:000000e7 -84:fda8 0004:000000e7 -84:fda9 0004:000000e8 -84:fdad 0004:000000e9 -84:fdb0 0004:000000ea -84:fdb2 0004:000000ee -84:fdb5 0004:000000ef -84:fdb6 0004:000000f0 -84:fdba 0004:000000f3 -84:fdbd 0004:000000f4 -84:fdbf 0004:000000f6 -84:fdc1 0004:000000f7 -84:fdc2 0004:000000f8 -84:fdc4 0004:000000f9 -84:fdc5 0004:000000fa -84:fdc9 0004:000000fb -84:fdca 0004:000000fc -84:fdcb 0004:000000fd -84:fdcc 0004:00000100 -84:fdcd 0004:00000101 -84:fdce 0004:00000105 -84:fdcf 0004:00000105 -84:fdd0 0004:00000105 -84:fdd1 0004:00000106 -84:fdd4 0004:00000107 -84:fdd7 0004:00000108 -84:fdd8 0004:00000109 -84:fddc 0004:0000010a -84:fddf 0004:0000010b -84:fde1 0004:0000010d -84:fde4 0004:0000010e -84:fde5 0004:0000010e -84:fde9 0004:00000110 -84:fdea 0004:00000112 -84:fdeb 0004:00000113 -84:fdec 0004:00000114 -84:fdf0 0004:00000115 -84:fdf2 0004:00000116 -84:fdf3 0004:00000117 -84:fdf4 0004:00000118 -84:fdf7 0004:00000119 -84:fdf8 0004:0000011a -84:fdf9 0004:0000011d -84:fdfa 0004:0000011e -84:fdfc 0004:0000011f -84:fdfd 0004:00000120 -84:fe01 0004:00000121 -84:fe02 0004:00000122 -84:fe03 0004:00000125 -84:fe07 0004:00000126 -84:fe0a 0004:00000129 -84:fe0e 0004:0000012a -84:fe11 0004:0000012e -84:fe14 0004:0000012e -84:fe16 0004:0000012f -84:fe19 0004:00000130 -84:fe1b 0004:00000131 -84:fe1e 0004:00000131 -84:fe20 0004:00000132 -84:fe23 0004:00000133 -84:fe25 0004:00000134 -84:fe28 0004:00000137 -84:fe29 0004:0000013b -84:fe2d 0004:0000013c -84:fe2e 0004:00000141 -84:fe2f 0004:00000142 -84:fe30 0004:00000143 -84:fe31 0004:00000143 -84:fe32 0004:00000147 -84:fe36 0004:00000148 -84:fe37 0004:00000149 -84:fe38 0004:0000014a -84:fe39 0004:0000014a -84:fe3a 0004:0000014b -84:fe3d 0004:0000014c -84:fe3e 0004:0000014d -84:fe3f 0004:0000014e -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 +b8:846d 0003:00000137 +b8:8470 0003:00000138 +b8:8474 0003:00000139 +b8:8475 0003:00000139 +b8:8476 0003:0000013b +b8:8477 0003:0000013c +b8:847a 0003:0000013d +b8:847b 0003:00000140 +b8:847e 0003:00000141 +b8:8482 0003:00000142 +b8:8483 0003:00000142 +b8:8484 0003:00000142 +b8:8485 0003:00000142 +b8:8486 0003:00000142 +b8:8487 0003:00000143 +b8:8488 0003:00000147 +b8:8489 0003:00000147 +b8:848a 0000:00000013 +b8:848c 0003:00000149 +b8:8490 0003:0000014a +b8:8494 0003:0000014b +b8:8496 0003:0000014d +b8:8497 0003:0000014d +b8:8498 0003:0000014e +b8:8499 0003:00000156 +b8:849d 0003:00000157 +b8:849f 0003:0000015d +b8:84a1 0003:0000015e +b8:84a3 0003:00000161 +b8:84a6 0003:00000162 +b8:84a8 0003:00000163 +b8:84ab 0003:00000164 +b8:84ad 0003:00000165 +b8:84b0 0003:00000166 +b8:84b4 0003:00000167 +b8:84b6 0003:00000168 +b8:84b8 0003:00000169 +b8:84ba 0003:0000016a +b8:84bc 0003:0000016b +b8:84bd 0003:00000170 +b8:84bf 0003:00000171 +b8:84c1 0003:00000172 +b8:84c4 0003:00000173 +b8:84c6 0003:00000174 +b8:84c9 0003:00000175 +b8:84cb 0003:00000176 +b8:84ce 0003:00000177 +b8:84cf 0003:0000017a +b8:84d1 0003:0000017b +b8:84d3 0003:0000017c +b8:84d5 0003:0000017d +b8:84d7 0003:0000017e +b8:84d8 0003:00000182 +b8:84d9 0003:00000182 +b8:84da 0003:00000183 +b8:84dd 0003:00000184 +b8:84df 0003:00000185 +b8:84e2 0003:00000186 +b8:84e4 0003:00000187 +b8:84e5 0003:00000188 +b8:84e6 0003:0000018a +b8:84e9 0003:0000018b +b8:84eb 0003:0000018c +b8:84ee 0003:0000018d +b8:84ef 0003:0000018e +b8:84f2 0003:0000018f +b8:84f3 0003:0000018f +b8:84f4 0003:00000190 +b8:84f8 0003:00000191 +b8:84f9 0003:00000192 +b8:84fc 0003:00000193 +b8:8500 0003:00000194 +b8:8502 0003:00000196 +b8:8505 0003:00000197 +b8:8507 0003:00000198 +b8:850a 0003:00000199 +b8:850c 0003:0000019b +b8:8510 0003:0000019d +b8:8512 0003:0000019e +b8:8514 0003:0000019f +b8:8515 0003:0000019f +b8:8516 0003:000001a0 +b8:8517 0003:000001ab +b8:8518 0003:000001ac +b8:851c 0003:000001ad +b8:851d 0003:000001ae +b8:8521 0003:000001af +b8:8522 0003:000001b1 +b8:8526 0003:000001b2 +b8:8527 0003:000001e7 +b8:8528 0003:000001e7 +b8:8529 0003:000001ea +b8:852d 0003:000001eb +b8:8531 0003:000001ec +b8:8533 0003:000001ed +b8:8536 0003:000001f0 +b8:8538 0003:000001f0 +b8:8539 0003:000001f3 +b8:853d 0003:000001f4 +b8:853f 0003:000001f5 +b8:8543 0003:000001f6 +b8:8547 0003:000001f7 +b8:8549 0003:000001fb +b8:854b 0003:000001fc +b8:854c 0003:000001fd +b8:854f 0003:000001fe +b8:8552 0003:000001ff +b8:8554 0003:00000208 +b8:8558 0003:00000209 +b8:855b 0003:0000020a +b8:855d 0003:0000020c +b8:855f 0003:0000020d +b8:8560 0003:0000020e +b8:8563 0003:0000020f +b8:8565 0003:00000210 +b8:8566 0003:00000211 +b8:8569 0003:00000212 +b8:856a 0003:00000213 +b8:856e 0003:00000214 +b8:856f 0003:00000215 +b8:8572 0003:00000216 +b8:8574 0003:00000219 +b8:8576 0003:0000021c +b8:8578 0003:0000021d +b8:8579 0003:0000021e +b8:857c 0003:0000021f +b8:857d 0003:00000220 +b8:857e 0003:00000221 +b8:8582 0003:00000224 +b8:8586 0003:00000225 +b8:858a 0003:00000226 +b8:858c 0003:00000228 +b8:858d 0003:00000229 +b8:858e 0003:0000022a +b8:8590 0003:0000022f +b8:8591 0003:00000230 +b8:8595 0003:00000233 +b8:8599 0003:00000234 +b8:859d 0003:00000235 +b8:85a1 0003:00000236 +b8:85a2 0003:0000023a +b8:85a6 0003:0000023b +b8:85aa 0003:0000023c +b8:85ac 0003:0000023d +b8:85af 0003:0000023f +b8:85b1 0003:00000240 +b8:85b3 0003:00000241 +b8:85b6 0003:00000242 +b8:85b8 0003:00000243 +b8:85bb 0003:00000246 +b8:85bf 0003:00000247 +b8:85c0 0003:00000248 +b8:85c4 0003:0000024a +b8:85c7 0003:0000024d +b8:85c9 0003:0000024e +b8:85cb 0003:0000024f +b8:85cc 0003:0000024f +b8:85cd 0003:00000250 +b8:85ce 0003:00000258 +b8:85d1 0003:00000259 +b8:85d3 0003:0000025a +b8:85d4 0003:00000261 +b8:85d6 0003:00000262 +b8:85d7 0003:00000266 +b8:85da 0003:00000269 +b8:85de 0003:0000026a +b8:85e0 0003:0000026b +b8:85e2 0003:0000026c +b8:85e4 0003:0000026d +b8:85e6 0003:0000026f +b8:85e7 0003:00000270 +b8:85e8 0003:00000271 +b8:85eb 0003:00000272 +b8:85ec 0003:00000273 +b8:85ef 0003:00000274 +b8:85f1 0003:00000277 +b8:85f3 0003:00000278 +b8:85f4 0003:00000279 +b8:85f5 0003:0000027a +b8:85f8 0003:0000027b +b8:85f9 0003:0000027d +b8:85fd 0003:0000027e +b8:85ff 0003:0000027f +b8:8601 0003:00000280 +b8:8603 0003:00000281 +b8:8604 0003:00000282 +b8:8605 0003:00000283 +b8:8607 0003:00000284 +b8:8609 0003:00000287 +b8:860a 0003:00000288 +b8:860b 0003:00000289 +b8:860c 0003:0000028b +b8:860d 0003:0000028c +b8:860e 0003:0000028d +b8:860f 0003:0000028e +b8:8610 0003:0000028f +b8:8611 0003:00000293 +b8:8612 0003:00000293 +b8:8613 0003:00000293 +b8:8614 0003:00000294 +b8:8618 0003:00000295 +b8:861b 0003:00000295 +b8:861c 0003:00000297 +b8:8620 0003:00000298 +b8:8621 0003:00000299 +b8:8625 0003:0000029a +b8:8627 0003:0000029c +b8:862b 0003:0000029d +b8:862c 0003:0000029e +b8:862d 0003:0000029f +b8:862e 0003:000002a0 +b8:8632 0003:000002a1 +b8:8633 0003:000002a2 +b8:8634 0003:000002a5 +b8:8638 0003:000002a6 +b8:863c 0003:000002a8 +b8:8640 0003:000002a9 +b8:8642 0003:000002aa +b8:8645 0003:000002ab +b8:8647 0003:000002ad +b8:8649 0003:000002b0 +b8:864d 0003:000002b1 +b8:8650 0003:000002b2 +b8:8652 0003:000002b3 +b8:8655 0003:000002b6 +b8:8656 0003:000002b7 +b8:8657 0003:000002b8 +b8:865b 0003:000002b9 +b8:865d 0003:000002bd +b8:8661 0003:000002be +b8:8662 0003:000002bf +b8:8666 0003:000002c0 +b8:8667 0003:000002c2 +b8:866b 0003:000002c3 +b8:866d 0003:000002c8 +b8:8671 0003:000002c9 +b8:8672 0003:000002ca +b8:8676 0003:000002cb +b8:8677 0003:000002cc +b8:867a 0003:000002cd +b8:867c 0003:000002cf +b8:8680 0003:000002d1 +b8:8681 0003:000002d2 +b8:8682 0003:000002d3 +b8:8683 0003:000002d4 +b8:8687 0003:000002d5 +b8:868b 0003:000002d6 +b8:868d 0003:000002d9 +b8:868e 0003:000002d9 +b8:868f 0003:000002d9 +b8:8690 0003:000002da +b8:8691 0003:000002de +b8:8695 0003:000002df +b8:8699 0003:000002e0 +b8:869d 0003:000002e1 +b8:869f 0003:000002e2 +b8:86a3 0003:000002e3 +b8:86a6 0003:000002e4 +b8:86a8 0003:000002e5 +b8:86ac 0003:000002e6 +b8:86af 0003:000002e7 +b8:86b1 0003:000002e8 +b8:86b4 0003:000002ea +b8:86b5 0003:000002ed +b8:86b9 0003:000002ef +b8:86ba 0003:000002f0 +b8:86bb 0003:000002f1 +b8:86bc 0003:000002f2 +b8:86bd 0003:000002f3 +8b:914a 0003:000002f8 +81:80f7 0003:000002fb +81:8027 0003:000002fe +81:807f 0003:00000301 +82:8bb3 0003:00000304 +85:baa3 0003:000003a5 +85:baa4 0003:000003a5 +85:baa5 0003:000003a8 +85:baa7 0003:000003a9 +85:baad 0003:000003a9 +85:baae 0003:000003aa +85:bab1 0003:000003ab +85:bab2 0003:000003ac +85:bab3 0003:000003ac +85:bab4 0003:000003b0 +85:bab7 0003:000003b1 +85:babb 0003:000003b2 +85:babd 0003:000003b2 +85:babf 0003:000003b3 +85:bac2 0003:000003b4 +85:bac4 0003:000003b6 +85:bac5 0003:000003b7 +85:bac7 0003:000003b8 +85:bacb 0003:000003b8 +85:bacc 0003:000003b9 +85:bacf 0003:000003bb +85:bad3 0003:000003bc +85:bad6 0003:000003bd +85:bad7 0003:000003be +85:bad8 0003:000003be +85:bad9 0003:000003bf +85:badd 0003:000003c0 +85:bade 0003:000003c1 +85:bae2 0003:000003c2 +85:bae4 0003:000003c3 +85:bae5 0003:000003c4 +85:bae6 0003:000003c5 +85:bae9 0003:000003c6 +85:baeb 0003:000003c7 +85:baed 0003:000003ca +85:baee 0003:000003ca +85:baef 0003:000003cb +85:baf2 0003:000003cc +85:bb73 0003:000003da +85:bb75 0003:000003db +85:bb78 0003:000003dc +85:bb7b 0003:000003dd +85:bb7e 0003:000003e5 +85:bb7f 0003:000003e6 +85:bb81 0003:000003e7 +85:bb84 0003:000003e8 +85:bb86 0003:000003e9 +85:bb88 0003:000003ea +85:bb8b 0003:000003eb +85:bb8d 0003:000003ec +85:bb90 0003:000003ed +85:bb92 0003:000003ee +85:bb95 0003:000003ef +85:bb97 0003:000003f2 +85:bb98 0003:000003f3 +85:bb99 0003:000003f4 +85:bb9a 0003:000003f5 +85:bb9c 0003:000003f6 +85:bb9d 0003:000003f7 +85:bb9e 0003:000003f8 +85:bb9f 0003:000003ff +85:bba2 0003:00000400 +85:bba3 0003:00000401 +85:bba6 0003:00000402 +85:bba7 0003:00000403 +85:bba8 0003:00000404 +85:bba9 0003:00000405 +85:bbaa 0003:00000410 +85:bbab 0003:00000411 +85:bbad 0003:00000412 +85:bbb0 0003:00000413 +85:bbb2 0003:00000414 +85:bbb5 0003:00000415 +85:bbb7 0003:00000416 +85:bbba 0003:00000417 +85:bbbc 0003:0000041a +85:bbbd 0003:0000041b +85:bbbe 0003:0000041c +85:bbc0 0003:0000041d +85:bbc1 0003:0000041f +85:bbc2 0003:00000420 +85:bbc4 0003:00000421 +85:bbc7 0003:00000422 +85:bbc9 0003:00000423 +85:bbcc 0003:00000424 +85:bbce 0003:00000425 +85:bbcf 0003:00000427 +85:bbd0 0003:00000428 +85:bbd2 0003:00000429 +85:bbd5 0003:0000042a +85:bbd7 0003:0000042b +85:bbda 0003:0000042c +85:bbdc 0003:0000042d +85:bbdd 0003:0000042f +85:bbde 0003:00000430 +85:bbe0 0003:00000431 +85:bbe3 0003:00000432 +85:bbe5 0003:00000433 +85:bbe8 0003:00000434 +85:bbea 0003:00000435 +85:8246 0003:0000043a +85:8249 0003:0000043b +85:824b 0003:0000043c +85:82f9 0003:00000440 +b8:885c 0004:00000045 +b8:885d 0004:00000045 +b8:885e 0004:00000046 +b8:885f 0004:00000047 +b8:8863 0004:00000048 +b8:8866 0004:00000049 +b8:8867 0004:0000004a +b8:886b 0004:0000004b +b8:886e 0004:0000004c +b8:8870 0004:0000004e +b8:8873 0004:0000004f +b8:8874 0004:0000004f +b8:8878 0004:00000051 +b8:8879 0004:00000052 +b8:887a 0004:00000053 +b8:887e 0004:00000054 +b8:8880 0004:00000056 +b8:8881 0004:00000056 +b8:8882 0004:00000057 +b8:8883 0004:0000005a +b8:8884 0004:0000005a +b8:8885 0004:0000005b +b8:8886 0004:0000005c +b8:888a 0004:0000005d +84:fc56 0005:00000051 +84:fc59 0005:00000052 +84:fc5c 0005:00000053 +84:fc5d 0005:00000056 +84:fc60 0005:00000057 +84:fc63 0005:00000058 +84:fc64 0005:0000005b +84:fc67 0005:0000005c +84:fc6a 0005:0000005d +84:fd90 0005:000000d4 +84:fd94 0005:000000d5 +84:fd95 0005:000000d8 +84:fd98 0005:000000d9 +84:fd9a 0005:000000da +84:fd9c 0005:000000dd +84:fd9f 0005:000000de +84:fda1 0005:000000e5 +84:fda2 0005:000000e6 +84:fda5 0005:000000e7 +84:fda8 0005:000000e7 +84:fda9 0005:000000e8 +84:fdad 0005:000000e9 +84:fdb0 0005:000000ea +84:fdb2 0005:000000ee +84:fdb5 0005:000000ef +84:fdb6 0005:000000f0 +84:fdba 0005:000000f3 +84:fdbd 0005:000000f4 +84:fdbf 0005:000000f6 +84:fdc1 0005:000000f7 +84:fdc2 0005:000000f8 +84:fdc4 0005:000000f9 +84:fdc5 0005:000000fa +84:fdc9 0005:000000fb +84:fdca 0005:000000fc +84:fdcb 0005:000000fd +84:fdcc 0005:00000100 +84:fdcd 0005:00000101 +84:fdce 0005:00000105 +84:fdcf 0005:00000105 +84:fdd0 0005:00000105 +84:fdd1 0005:00000106 +84:fdd4 0005:00000107 +84:fdd7 0005:00000108 +84:fdd8 0005:00000109 +84:fddc 0005:0000010a +84:fddf 0005:0000010b +84:fde1 0005:0000010d +84:fde4 0005:0000010e +84:fde5 0005:0000010e +84:fde9 0005:00000110 +84:fdea 0005:00000112 +84:fdeb 0005:00000113 +84:fdec 0005:00000114 +84:fdf0 0005:00000115 +84:fdf2 0005:00000116 +84:fdf3 0005:00000117 +84:fdf4 0005:00000118 +84:fdf7 0005:00000119 +84:fdf8 0005:0000011a +84:fdf9 0005:0000011d +84:fdfa 0005:0000011e +84:fdfc 0005:0000011f +84:fdfd 0005:00000120 +84:fe01 0005:00000121 +84:fe02 0005:00000122 +84:fe03 0005:00000125 +84:fe07 0005:00000126 +84:fe0a 0005:00000129 +84:fe0e 0005:0000012a +84:fe11 0005:0000012e +84:fe14 0005:0000012e +84:fe16 0005:0000012f +84:fe19 0005:00000130 +84:fe1b 0005:00000131 +84:fe1e 0005:00000131 +84:fe20 0005:00000132 +84:fe23 0005:00000133 +84:fe25 0005:00000134 +84:fe28 0005:00000137 +84:fe29 0005:0000013b +84:fe2d 0005:0000013c +84:fe2e 0005:00000141 +84:fe2f 0005:00000142 +84:fe30 0005:00000143 +84:fe31 0005:00000143 +84:fe32 0005:00000147 +84:fe36 0005:00000148 +84:fe37 0005:00000149 +84:fe38 0005:0000014a +84:fe39 0005:0000014a +84:fe3a 0005:0000014b +84:fe3d 0005:0000014c +84:fe3e 0005:0000014d +84:fe3f 0005:0000014e +81:b303 0006:00000003 +81:b307 0006:00000004 +81:b308 0006:00000005 +b8:c81c 0006:00000016 +b8:c81f 0006:00000018 +b8:c823 0006:00000019 +b8:c827 0006:0000001a +b8:c828 0006:0000001b +b8:c829 0006:0000001c +b8:c82c 0006:0000001d +b8:c82e 0006:0000001e +b8:c831 0006:00000020 +b8:c835 0006:00000021 +b8:c839 0006:00000022 +b8:c83a 0006:00000023 +b8:c83b 0006:00000024 +b8:c83e 0006:00000025 +b8:c840 0006:00000026 +b8:c843 0006:00000028 +b8:c847 0006:00000029 +b8:c84b 0006:0000002a +b8:c84c 0006:0000002b +b8:c84d 0006:0000002c +b8:c850 0006:0000002d +b8:c852 0006:0000002e +b8:c855 0006:00000031 +b8:c856 0006:00000034 +b8:c859 0006:00000035 +b8:c85b 0006:00000036 +b8:c85e 0006:00000037 +b8:c862 0006:00000039 +b8:c866 0006:0000003a +b8:c869 0006:0000003b +b8:c86b 0006:0000003c +b8:c86f 0006:0000003e +b8:c873 0006:0000003f +b8:c876 0006:00000040 +b8:c878 0006:00000041 +b8:c87c 0006:00000043 +b8:c880 0006:00000044 diff --git a/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json b/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json index c5d7c1b4..351a5485 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:8503", + "COLLECTTANK": "B8:8517", "MISCFX": "85:FF45", "NORMAL": "84:8BF2", "SETFX": "85:FF4E", @@ -12,15 +12,17 @@ "SOUNDFX_84": "84:FD90", "SPECIALFX": "85:FF3C", "ammo_loop_table": "84:FC46", - "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", + "ap_playerid_to_rom_other_player_index": "B8:85CE", + "ap_playerid_to_rom_other_player_index_checklastrow": "B8:85F1", + "ap_playerid_to_rom_other_player_index_correctindex": "B8:860C", + "ap_playerid_to_rom_other_player_index_do_search_stage_1": "B8:85D4", + "ap_playerid_to_rom_other_player_index_notfound": "B8:8609", "archipelago_chozo_item_plm": "84:FC24", "archipelago_hidden_item_plm": "84:FC28", "archipelago_visible_item_plm": "84:FC20", "c_item": "84:FC42", + "check_reload": "82:F990", + "check_reload_end": "82:F9C0", "config_deathlink": "CE:FF04", "config_flags": "CE:FF00", "config_multiworld": "CE:FF00", @@ -32,6 +34,8 @@ "copy_memory_done": "B8:8417", "copy_memory_even": "B8:8409", "copy_memory_loop": "B8:840F", + "deathhook": "82:F9C3", + "deathhook_zebes": "82:F9D8", "h_item": "84:FC44", "i_chozo_item": "84:FC5D", "i_hidden_item": "84:FC64", @@ -40,13 +44,13 @@ "i_item_setup_shared_all_items": "B8:8878", "i_item_setup_shared_alwaysloaded": "B8:8883", "i_live_pickup": "84:FE29", - "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_live_pickup_multiworld": "B8:8611", + "i_live_pickup_multiworld_end": "B8:868D", + "i_live_pickup_multiworld_item_link_item": "B8:866D", + "i_live_pickup_multiworld_otherplayers_item": "B8:865D", + "i_live_pickup_multiworld_own_item": "B8:8649", + "i_live_pickup_multiworld_own_item1": "B8:8655", + "i_live_pickup_multiworld_send_network": "B8:8634", "i_load_custom_graphics": "84:FDCE", "i_load_custom_graphics_all_items": "84:FDE9", "i_load_custom_graphics_alwaysloaded": "84:FDF9", @@ -82,30 +86,30 @@ "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: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_cleanup_item_link_messagebox": "B8:84CF", + "mw_display_item_sent": "B8:849F", + "mw_handle_queue": "B8:8527", + "mw_handle_queue_collect_item_if_present": "B8:8576", + "mw_handle_queue_end": "B8:85C7", + "mw_handle_queue_found": "B8:85AF", + "mw_handle_queue_lookup_player": "B8:8536", + "mw_handle_queue_loop": "B8:8529", + "mw_handle_queue_new_remote_item": "B8:8590", + "mw_handle_queue_next": "B8:85BB", + "mw_handle_queue_perform_receive": "B8:85A2", + "mw_hook_main_game": "B8:8691", "mw_init": "B8:8311", "mw_init_continuereset": "B8:8366", "mw_init_end": "B8:83EA", "mw_init_memory": "B8:8300", "mw_init_reset_sram": "B8:833B", "mw_init_smstringdata": "B8:8351", - "mw_load_sram": "B8:8474", - "mw_load_sram_done": "B8:8482", - "mw_load_sram_setnewgame": "B8:8485", - "mw_prep_item_link_messagebox": "B8:84A9", - "mw_receive_item": "B8:84C4", - "mw_receive_item_end": "B8:84FC", + "mw_load_sram": "B8:8488", + "mw_load_sram_done": "B8:8496", + "mw_load_sram_setnewgame": "B8:8499", + "mw_prep_item_link_messagebox": "B8:84BD", + "mw_receive_item": "B8:84D8", + "mw_receive_item_end": "B8:8510", "mw_save_sram": "B8:8469", "mw_write_message": "B8:8442", "nonprog_item_eight_palette_indices": "84:FC38", @@ -132,7 +136,7 @@ "p_visible_item_end": "84:FD1E", "p_visible_item_loop": "84:FD0B", "p_visible_item_trigger": "84:FD17", - "patch_load_multiworld": "B8:8694", + "patch_load_multiworld": "B8:86B5", "perform_item_pickup": "84:FE2E", "plm_graphics_entry_offworld_item": "84:FC36", "plm_graphics_entry_offworld_progression_item": "84:FC2C", @@ -143,8 +147,21 @@ "rando_player_id_table_end": "B8:DE34", "rando_player_name_table": "B8:D000", "rando_seed_data": "B8:CF00", + "setup_game_1": "A0:FE0C", + "setup_game_1_quick": "A0:FE1F", + "setup_game_2": "A0:FE2F", + "setup_game_2_quick": "A0:FE40", + "setup_game_3": "A0:FE44", + "setup_game_3_loadmusic": "A0:FE73", + "setup_game_3_quick": "A0:FE57", + "setup_music": "A0:FE00", + "setup_music_quick": "A0:FE0B", + "setup_samus": "A0:FE94", + "setup_samus_normal": "A0:FEA5", + "sm_fix_checksum": "82:FA0C", "sm_item_graphics": "B8:8800", "sm_item_plm_pickup_sequence_pointers": "B8:882E", + "sm_save_done_hook": "B8:847B", "start_item": "B8:C81C", "start_item_data_major": "B8:C800", "start_item_data_minor": "B8:C808", @@ -153,6 +170,12 @@ "v_item": "84:FC40", "write_repeated_memory": "B8:83EF", "write_repeated_memory_loop": "B8:83F4", + "deathhook82": "82:DDC7", + "freespace82_start": "82:F990", + "freespace82_end": "82:FA4A", + "freespacea0": "a0:fe00", + "SRAM_SAVING": "70:2604", + "current_save_slot": "7e:0952", "ITEM_RAM": "7E:09A2", "SRAM_MW_ITEMS_RECV": "70:2000", "SRAM_MW_ITEMS_RECV_WCOUNT": "70:2602", diff --git a/worlds/sm/docs/en_Super Metroid.md b/worlds/sm/docs/en_Super Metroid.md index 941cbf48..c177582e 100644 --- a/worlds/sm/docs/en_Super Metroid.md +++ b/worlds/sm/docs/en_Super Metroid.md @@ -30,3 +30,9 @@ a small up arrow on the sprite and non-progression don't. When the player receives an item, a text box will appear to show which item was received, and from whom. +## I can't get back to my starting position with a required item (softlocked), what can I do? + +It can happen that a required item is in a place where you cant get back from. While in normal gameplay state, by holding +Start+Select+L+R at the same time, the game will save your progress and put you back at your original starting position. +This can be required by the logic. + diff --git a/worlds/sm/variaRandomizer/logic/smboolmanager.py b/worlds/sm/variaRandomizer/logic/smboolmanager.py index 351e2835..16f90307 100644 --- a/worlds/sm/variaRandomizer/logic/smboolmanager.py +++ b/worlds/sm/variaRandomizer/logic/smboolmanager.py @@ -15,7 +15,7 @@ class SMBoolManager(object): countItems = ['Missile', 'Super', 'PowerBomb', 'ETank', 'Reserve'] percentItems = ['Bomb', 'Charge', 'Ice', 'HiJump', 'SpeedBooster', 'Wave', 'Spazer', 'SpringBall', 'Varia', 'Plasma', 'Grapple', 'Morph', 'Gravity', 'XRayScope', 'SpaceJump', 'ScrewAttack'] - def __init__(self, player=0, maxDiff=sys.maxsize, onlyBossLeft = False, lastAP = 'Landing Site'): + def __init__(self, player=0, maxDiff=sys.maxsize, onlyBossLeft = False): self._items = { } self._counts = { } @@ -23,8 +23,6 @@ class SMBoolManager(object): self.maxDiff = maxDiff self.onlyBossLeft = onlyBossLeft - self.lastAP = lastAP - # cache related #self.cacheKey = 0 #self.computeItemsPositions() @@ -32,7 +30,7 @@ class SMBoolManager(object): Logic.factory('vanilla') self.helpers = Logic.HelpersGraph(self) self.doorsManager = DoorsManager() - self.objectives = Objectives.objDict[player] + self.objectives = Objectives.objDict[player] if player in Objectives.objDict.keys() else Objectives(player) self.createFacadeFunctions() self.createKnowsFunctions(player) self.resetItems() diff --git a/worlds/sm/variaRandomizer/patches/common/ips/draygonimals.ips b/worlds/sm/variaRandomizer/patches/common/ips/draygonimals.ips index aefedb6917ac79acd4cd11ecb757608179dd8c9d..5758c274ec1cdbd12f72eafde542712a446aa29d 100644 GIT binary patch delta 54 zcmV-60LlNp0ki>-LLX_Ueu)4;@Diy20FS)beyKF@kF^JWT=$WWV7RTUtwm2p DvB?y1 delta 50 zcmV-20L}k>f&q|LEbs6D1h}oNtq1TJ035F%*nWusK=2Z&0057?*nX+-?~ktc3K>|d{Nqpp*|;e!xJ>Htv693pk$M1Kqr R?^w%z)|P=u;)AQd8vqZi9@zi@ delta 79 zcmZo*>|&hYtc3K>}Nk~%fKY@f&Kjl2BsZr**{1y$gfwp cQP;`f@Bys)08sUZ_h8i*PV~nBv8%ru0QD;(kN^Mx diff --git a/worlds/sm/variaRandomizer/patches/common/ips/ridleyimals.ips b/worlds/sm/variaRandomizer/patches/common/ips/ridleyimals.ips index db2cfe6e4aec685e09f8c00f923247b295778c05..ef78b81fbeff2588f5a1129640938a6525d4b5d8 100644 GIT binary patch delta 61 zcmZ3>xR`N*lUmqH28MpE8+9ugKJ;&8uZ!6|v46e7jk-<-hYzM8sog-Ss1FmX^?7!z PW#1gZz$Ed()!z*OBD)#m delta 71 zcmZ3?xR!B(lcmr~28MpE8+9ugKJ;&8uZ!6|v7dc&1Ot=A2ln?L7?^gfW&a?-;Iv-h aMqMX^!v|B4>fJ!qAKp*Q&}Vk_cLM maxActiveGoals: diff --git a/worlds/sm/variaRandomizer/rom/rompatcher.py b/worlds/sm/variaRandomizer/rom/rompatcher.py index 5e821da1..913d0d8d 100644 --- a/worlds/sm/variaRandomizer/rom/rompatcher.py +++ b/worlds/sm/variaRandomizer/rom/rompatcher.py @@ -1065,7 +1065,7 @@ class RomPatcher: objectives.writeIntroObjectives(self.romFile, tourian) self.writeItemsMasks(itemLocs) # hack bomb_torizo.ips to wake BT in all cases if necessary, ie chozo bots objective is on, and nothing at bombs - if objectives.isGoalActive("activate chozo robots") and RomPatches.has(RomPatches.BombTorizoWake): + if objectives.isGoalActive("activate chozo robots") and RomPatches.has(self.player, RomPatches.BombTorizoWake): bomb = next((il for il in itemLocs if il.Location.Name == "Bomb"), None) if bomb is not None and bomb.Item.Category == "Nothing": for addrName in ["BTtweaksHack1", "BTtweaksHack2"]: diff --git a/worlds/sm/variaRandomizer/utils/utils.py b/worlds/sm/variaRandomizer/utils/utils.py index 094a3a9c..01029f2f 100644 --- a/worlds/sm/variaRandomizer/utils/utils.py +++ b/worlds/sm/variaRandomizer/utils/utils.py @@ -417,7 +417,10 @@ def loadRandoPreset(world, player, args): args.powerBombQty = world.power_bomb_qty[player].value / float(10) args.minorQty = world.minor_qty[player].value args.energyQty = defaultMultiValues["energyQty"][world.energy_qty[player].value] - args.objective = world.objective[player].value + args.objectiveRandom = world.custom_objective[player].value + args.objectiveList = list(world.custom_objective_list[player].value) + args.nbObjective = world.custom_objective_count[player].value + args.objective = list(world.objective[player].value) args.tourian = defaultMultiValues["tourian"][world.tourian[player].value] #args.minimizerN #args.minimizerTourian