mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
Smz3 updated to version 11.3 (#886)
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user