SM: comeback fix4 (#1741)

This commit is contained in:
lordlou 2023-04-20 03:10:21 -04:00 committed by GitHub
parent 4ef7e43521
commit a38a2903d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 4 deletions

View File

@ -127,6 +127,7 @@ class AreaRandomization(Choice):
option_off = 0 option_off = 0
option_light = 1 option_light = 1
option_full = 2 option_full = 2
alias_true = 2
default = 0 default = 0
class AreaLayout(Toggle): class AreaLayout(Toggle):

View File

@ -8,6 +8,7 @@ import base64
from typing import Any, Dict, Iterable, List, Set, TextIO, TypedDict from typing import Any, Dict, Iterable, List, Set, TextIO, TypedDict
from BaseClasses import Region, Entrance, Location, MultiWorld, Item, ItemClassification, CollectionState, Tutorial from BaseClasses import Region, Entrance, Location, MultiWorld, Item, ItemClassification, CollectionState, Tutorial
from Fill import fill_restrictive
from worlds.AutoWorld import World, AutoLogicRegister, WebWorld from worlds.AutoWorld import World, AutoLogicRegister, WebWorld
logger = logging.getLogger("Super Metroid") logger = logging.getLogger("Super Metroid")
@ -149,6 +150,7 @@ class SMWorld(World):
pool = [] pool = []
self.locked_items = {} self.locked_items = {}
self.NothingPool = [] self.NothingPool = []
self.prefilled_locked_items = []
weaponCount = [0, 0, 0] weaponCount = [0, 0, 0]
for item in itemPool: for item in itemPool:
isAdvancement = True isAdvancement = True
@ -170,13 +172,21 @@ class SMWorld(World):
elif item.Category == 'Nothing': elif item.Category == 'Nothing':
isAdvancement = False isAdvancement = False
classification = ItemClassification.progression if isAdvancement else ItemClassification.filler
itemClass = ItemManager.Items[item.Type].Class itemClass = ItemManager.Items[item.Type].Class
smitem = SMItem(item.Name, smitem = SMItem(item.Name,
classification, ItemClassification.progression if isAdvancement else ItemClassification.filler,
item.Type, item.Type,
None if itemClass == 'Boss' else self.item_name_to_id[item.Name], None if itemClass == 'Boss' else self.item_name_to_id[item.Name],
player=self.player) player=self.player)
beamItems = ['Spazer', 'Ice', 'Wave' ,'Plasma']
self.ammoItems = ['Missile', 'Super', 'PowerBomb']
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)
elif item.Type in self.ammoItems and isAdvancement:
self.prefilled_locked_items.append(smitem)
if itemClass == 'Boss': if itemClass == 'Boss':
self.locked_items[item.Name] = smitem self.locked_items[item.Name] = smitem
elif item.Category == 'Nothing': elif item.Category == 'Nothing':
@ -205,11 +215,22 @@ class SMWorld(World):
def set_rules(self): def set_rules(self):
set_rules(self.multiworld, self.player) set_rules(self.multiworld, self.player)
def create_regions(self): def create_regions(self):
create_locations(self, self.player) create_locations(self, self.player)
create_regions(self, self.multiworld, self.player) create_regions(self, self.multiworld, self.player)
def pre_fill(self):
from Fill import fill_restrictive
if len(self.prefilled_locked_items) > 0:
locations = [loc for loc in self.locations.values() if loc.item is None]
self.multiworld.random.shuffle(locations)
all_state = self.multiworld.get_all_state(False)
for item in self.ammoItems:
while (all_state.has(item.name, self.player, 1)):
all_state.remove(item)
fill_restrictive(self.multiworld, all_state, locations, self.prefilled_locked_items, True, True)
def getWordArray(self, w: int) -> List[int]: def getWordArray(self, w: int) -> List[int]:
""" little-endian convert a 16-bit number to an array of numbers <= 255 each """ """ little-endian convert a 16-bit number to an array of numbers <= 255 each """
return [w & 0x00FF, (w & 0xFF00) >> 8] return [w & 0x00FF, (w & 0xFF00) >> 8]
@ -813,7 +834,7 @@ class SMLocation(Location):
comebackCheck = ComebackCheckType.JustComeback comebackCheck = ComebackCheckType.JustComeback
n = 2 if GraphUtils.isStandardStart(randoExec.graphSettings.startAP) else 3 n = 2 if GraphUtils.isStandardStart(randoExec.graphSettings.startAP) else 3
# is early game # is early game
if (len([loc for loc in state.locations_checked if loc.player == self.player]) <= n): 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 comebackCheck = ComebackCheckType.NoCheck
container = ItemLocContainer(state.smbm[self.player], [], []) container = ItemLocContainer(state.smbm[self.player], [], [])
return randoService.fullComebackCheck( container, return randoService.fullComebackCheck( container,

View File

@ -373,6 +373,8 @@ def loadRandoPreset(world, player, args):
args.gravityBehaviour = defaultMultiValues["gravityBehaviour"][world.gravity_behaviour[player].value] args.gravityBehaviour = defaultMultiValues["gravityBehaviour"][world.gravity_behaviour[player].value]
args.nerfedCharge = world.nerfed_charge[player].value args.nerfedCharge = world.nerfed_charge[player].value
args.area = world.area_randomization[player].current_key args.area = world.area_randomization[player].current_key
if (args.area == "true"):
args.area = "full"
if args.area != "off": if args.area != "off":
args.areaLayoutBase = not world.area_layout[player].value args.areaLayoutBase = not world.area_layout[player].value
args.escapeRando = world.escape_rando[player].value args.escapeRando = world.escape_rando[player].value