Sm various fixes (#518)

This commit is contained in:
lordlou 2022-05-25 02:50:32 -04:00 committed by GitHub
parent e8be80ccd7
commit 9b855c7de0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 39 additions and 9 deletions

View File

@ -93,12 +93,11 @@ class SMWorld(World):
itemManager: ItemManager
locations = {}
Logic.factory('vanilla')
def __init__(self, world: MultiWorld, player: int):
self.rom_name_available_event = threading.Event()
self.locations = {}
super().__init__(world, player)
@classmethod
@ -142,6 +141,7 @@ class SMWorld(World):
# Generate item pool
pool = []
self.locked_items = {}
self.NothingPool = []
weaponCount = [0, 0, 0]
for item in itemPool:
isAdvancement = True
@ -167,6 +167,8 @@ class SMWorld(World):
smitem = SMItem(item.Name, isAdvancement, item.Type, None if itemClass == 'Boss' else self.item_name_to_id[item.Name], player = self.player)
if itemClass == 'Boss':
self.locked_items[item.Name] = smitem
elif item.Category == 'Nothing':
self.NothingPool.append(smitem)
else:
pool.append(smitem)
@ -182,7 +184,8 @@ class SMWorld(World):
for src, dest in self.variaRando.randoExec.areaGraph.InterAreaTransitions:
src_region = self.world.get_region(src.Name, self.player)
dest_region = self.world.get_region(dest.Name, self.player)
src_region.exits.append(Entrance(self.player, src.Name + "->" + dest.Name, src_region))
if ((src.Name + "->" + dest.Name, self.player) not in self.world._entrance_cache):
src_region.exits.append(Entrance(self.player, src.Name + "->" + dest.Name, src_region))
srcDestEntrance = self.world.get_entrance(src.Name + "->" + dest.Name, self.player)
srcDestEntrance.connect(dest_region)
add_entrance_rule(self.world.get_entrance(src.Name + "->" + dest.Name, self.player), self.player, getAccessPoint(src.Name).traverse)
@ -556,6 +559,28 @@ class SMWorld(World):
item.player != self.player or
item.name != "Morph Ball"]
if len(self.NothingPool) > 0:
nonChozoLoc = []
chozoLoc = []
for loc in self.locations.values():
if loc.item is None:
if locationsDict[loc.name].isChozo():
chozoLoc.append(loc)
else:
nonChozoLoc.append(loc)
self.world.random.shuffle(nonChozoLoc)
self.world.random.shuffle(chozoLoc)
missingCount = len(self.NothingPool) - len(nonChozoLoc)
locations = nonChozoLoc
if (missingCount > 0):
locations += chozoLoc[:missingCount]
locations = locations[:len(self.NothingPool)]
for item, loc in zip(self.NothingPool, locations):
loc.place_locked_item(item)
loc.address = loc.item.code = None
@classmethod
def stage_fill_hook(cls, world, progitempool, nonexcludeditempool, localrestitempool, nonlocalrestitempool,
restitempool, fill_locations):
@ -581,11 +606,6 @@ class SMWorld(World):
world.state.smbm[player].onlyBossLeft = True
break
# Turn Nothing items into event pairs.
for location in world.get_locations():
if location.game == location.item.game == "Super Metroid" and location.item.type == "Nothing":
location.address = location.item.code = None
def write_spoiler(self, spoiler_handle: TextIO):
if self.world.area_randomization[self.player].value != 0:
spoiler_handle.write('\n\nArea Transitions:\n\n')
@ -627,8 +647,18 @@ class SMLocation(Location):
super(SMLocation, self).__init__(player, name, address, parent)
def can_fill(self, state: CollectionState, item: Item, check_access=True) -> bool:
return self.always_allow(state, item) or (self.item_rule(item) and (not check_access or self.can_reach(state)))
return self.always_allow(state, item) or (self.item_rule(item) and (not check_access or (self.can_reach(state) and self.can_comeback(state, item))))
def can_comeback(self, state: CollectionState, item: Item):
randoExec = state.world.worlds[self.player].variaRando.randoExec
for key in locationsDict[self.name].AccessFrom.keys():
if (randoExec.areaGraph.canAccess( state.smbm[self.player],
key,
randoExec.graphSettings.startAP,
state.smbm[self.player].maxDiff,
None)):
return True
return False
class SMItem(Item):
game = "Super Metroid"