Smz3 updated to version 11.3 (#886)

This commit is contained in:
lordlou
2022-08-15 10:48:13 -04:00
committed by GitHub
parent c02c6ee58c
commit 898fa203ad
32 changed files with 907 additions and 482 deletions

View File

@@ -54,10 +54,26 @@ class World:
Player: str
Guid: str
Id: int
WorldState = None
@property
def TowerCrystals(self):
return 7 if self.WorldState is None else self.WorldState.TowerCrystals
@property
def GanonCrystals(self):
return 7 if self.WorldState is None else self.WorldState.GanonCrystals
@property
def TourianBossTokens(self):
return 4 if self.WorldState is None else self.WorldState.TourianBossTokens
def Items(self):
return [l.Item for l in self.Locations if l.Item != None]
ForwardSearch: bool = False
rewardLookup: Dict[int, List[Region.IReward]]
locationLookup: Dict[str, Location.Location]
regionLookup: Dict[str, Region.Region]
@@ -95,22 +111,22 @@ class World:
DarkWorldNorthEast(self, self.Config),
DarkWorldSouth(self, self.Config),
DarkWorldMire(self, self.Config),
Central(self, self.Config),
CrateriaWest(self, self.Config),
Central(self, self.Config),
CrateriaEast(self, self.Config),
Blue(self, self.Config),
Green(self, self.Config),
Kraid(self, self.Config),
Pink(self, self.Config),
Red(self, self.Config),
Kraid(self, self.Config),
WreckedShip(self, self.Config),
Outer(self, self.Config),
Inner(self, self.Config),
NorfairUpperWest(self, self.Config),
NorfairUpperEast(self, self.Config),
Crocomire(self, self.Config),
NorfairLowerWest(self, self.Config),
NorfairLowerEast(self, self.Config),
WreckedShip(self, self.Config)
NorfairLowerEast(self, self.Config)
]
self.Locations = []
@@ -130,37 +146,32 @@ class World:
raise Exception(f"World.CanEnter: Invalid region name {regionName}", f'{regionName=}'.partition('=')[0])
return region.CanEnter(items)
def CanAquire(self, items: Item.Progression, reward: Region.RewardType):
def CanAcquire(self, items: Item.Progression, reward: Region.RewardType):
return next(iter([region for region in self.Regions if isinstance(region, Region.IReward) and region.Reward == reward])).CanComplete(items)
def CanAquireAll(self, items: Item.Progression, *rewards: Region.RewardType):
for region in self.Regions:
if issubclass(type(region), Region.IReward):
if (region.Reward in rewards):
if not region.CanComplete(items):
return False
return True
def CanAcquireAll(self, items: Item.Progression, rewardsMask: Region.RewardType):
return all(region.CanComplete(items) for region in self.rewardLookup[rewardsMask.value])
# return all(region.CanComplete(items) for region in self.Regions if (isinstance(region, Region.IReward) and region.Reward in rewards))
def CanAcquireAtLeast(self, amount, items: Item.Progression, rewardsMask: Region.RewardType):
return len([region for region in self.rewardLookup[rewardsMask.value] if region.CanComplete(items)]) >= amount
def Setup(self, rnd: random):
self.SetMedallions(rnd)
self.SetRewards(rnd)
def Setup(self, state):
self.WorldState = state
self.SetMedallions(state.Medallions)
self.SetRewards(state.Rewards)
self.SetRewardLookup()
def SetMedallions(self, rnd: random):
medallionMap = {0: Item.ItemType.Bombos, 1: Item.ItemType.Ether, 2: Item.ItemType.Quake}
regionList = [region for region in self.Regions if isinstance(region, Region.IMedallionAccess)]
for region in regionList:
region.Medallion = medallionMap[rnd.randint(0, 2)]
def SetRewards(self, rewards: List):
regions = [region for region in self.Regions if isinstance(region, Region.IReward) and region.Reward == Region.RewardType.Null]
for (region, reward) in zip(regions, rewards):
region.Reward = reward
def SetRewards(self, rnd: random):
rewards = [
Region.RewardType.PendantGreen, Region.RewardType.PendantNonGreen, Region.RewardType.PendantNonGreen, Region.RewardType.CrystalRed, Region.RewardType.CrystalRed,
Region.RewardType.CrystalBlue, Region.RewardType.CrystalBlue, Region.RewardType.CrystalBlue, Region.RewardType.CrystalBlue, Region.RewardType.CrystalBlue
]
rnd.shuffle(rewards)
regionList = [region for region in self.Regions if isinstance(region, Region.IReward) and region.Reward == Region.RewardType.Null]
for region in regionList:
region.Reward = rewards[0]
rewards.remove(region.Reward)
def SetMedallions(self, medallions: List):
self.GetRegion("Misery Mire").Medallion = medallions[0]
self.GetRegion("Turtle Rock").Medallion = medallions[1]
def SetRewardLookup(self):
#/* Generate a lookup of all possible regions for any given reward combination for faster lookup later */
self.rewardLookup: Dict[int, Region.IReward] = {}
for i in range(0, 512):
self.rewardLookup[i] = [region for region in self.Regions if isinstance(region, Region.IReward) and (region.Reward.value & i) != 0]