167 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			167 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from typing import Dict, List | |||
|  | import random | |||
|  | 
 | |||
|  | import worlds.smz3.TotalSMZ3.Region as Region | |||
|  | import worlds.smz3.TotalSMZ3.Config as Config | |||
|  | import worlds.smz3.TotalSMZ3.Item as Item | |||
|  | import worlds.smz3.TotalSMZ3.Location as Location | |||
|  | 
 | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.CastleTower import CastleTower | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.EasternPalace import EasternPalace | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.DesertPalace import DesertPalace | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.TowerOfHera import TowerOfHera | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.PalaceOfDarkness import PalaceOfDarkness | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.SwampPalace import SwampPalace | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.SkullWoods import SkullWoods | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.ThievesTown import ThievesTown | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.IcePalace import IcePalace | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.MiseryMire import MiseryMire | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.TurtleRock import TurtleRock | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.GanonsTower import GanonsTower | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.LightWorld.DeathMountain.West import West as LightWorldDeathMountainWest | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.LightWorld.DeathMountain.East import East as LightWorldDeathMountainEast | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.LightWorld.NorthWest import NorthWest as LightWorldNorthWest | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.LightWorld.NorthEast import NorthEast as LightWorldNorthEast | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.LightWorld.South import South as LightWorldSouth | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.HyruleCastle import HyruleCastle | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.DarkWorld.DeathMountain.West import West as DarkWorldDeathMountainWest | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.DarkWorld.DeathMountain.East import East as DarkWorldDeathMountainEast | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.DarkWorld.NorthWest import NorthWest as DarkWorldNorthWest | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.DarkWorld.NorthEast import NorthEast as DarkWorldNorthEast | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.DarkWorld.South import South as DarkWorldSouth | |||
|  | from worlds.smz3.TotalSMZ3.Regions.Zelda.DarkWorld.Mire import Mire as DarkWorldMire | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.Crateria.Central import Central | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.Crateria.West import West as CrateriaWest  | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.Crateria.East import East as CrateriaEast | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.Brinstar.Blue import Blue | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.Brinstar.Green import Green | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.Brinstar.Kraid import Kraid | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.Brinstar.Pink import Pink | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.Brinstar.Red import Red | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.Maridia.Outer import Outer | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.Maridia.Inner import Inner | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.NorfairUpper.West import West as NorfairUpperWest | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.NorfairUpper.East import East as NorfairUpperEast | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.NorfairUpper.Crocomire import Crocomire | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.NorfairLower.West import West as NorfairLowerWest | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.NorfairLower.East import East as NorfairLowerEast | |||
|  | from worlds.smz3.TotalSMZ3.Regions.SuperMetroid.WreckedShip import WreckedShip | |||
|  | 
 | |||
|  | class World: | |||
|  |     Locations: List[Location.Location] | |||
|  |     Regions: List[Region.Region] | |||
|  |     Config: Config.Config | |||
|  |     Player: str | |||
|  |     Guid: str | |||
|  |     Id: int | |||
|  | 
 | |||
|  |     def Items(self): | |||
|  |         return [l.Item for l in self.Locations if l.Item != None] | |||
|  | 
 | |||
|  |     locationLookup: Dict[str, Location.Location] | |||
|  |     regionLookup: Dict[str, Region.Region] | |||
|  | 
 | |||
|  |     def GetLocation(self, name:str): return self.locationLookup[name] | |||
|  |     def GetRegion(self, name:str): return self.regionLookup[name] | |||
|  | 
 | |||
|  |     def __init__(self, config: Config, player: str, id: int, guid: str): | |||
|  |         self.Config = config | |||
|  |         self.Player = player | |||
|  |         self.Id = id | |||
|  |         self.Guid = guid | |||
|  | 
 | |||
|  |         self.Regions = [ | |||
|  |             CastleTower(self, self.Config), | |||
|  |             EasternPalace(self, self.Config), | |||
|  |             DesertPalace(self, self.Config), | |||
|  |             TowerOfHera(self, self.Config), | |||
|  |             PalaceOfDarkness(self, self.Config), | |||
|  |             SwampPalace(self, self.Config), | |||
|  |             SkullWoods(self, self.Config), | |||
|  |             ThievesTown(self, self.Config), | |||
|  |             IcePalace(self, self.Config), | |||
|  |             MiseryMire(self, self.Config), | |||
|  |             TurtleRock(self, self.Config), | |||
|  |             GanonsTower(self, self.Config), | |||
|  |             LightWorldDeathMountainWest(self, self.Config), | |||
|  |             LightWorldDeathMountainEast(self, self.Config), | |||
|  |             LightWorldNorthWest(self, self.Config), | |||
|  |             LightWorldNorthEast(self, self.Config), | |||
|  |             LightWorldSouth(self, self.Config), | |||
|  |             HyruleCastle(self, self.Config), | |||
|  |             DarkWorldDeathMountainWest(self, self.Config), | |||
|  |             DarkWorldDeathMountainEast(self, self.Config), | |||
|  |             DarkWorldNorthWest(self, self.Config), | |||
|  |             DarkWorldNorthEast(self, self.Config), | |||
|  |             DarkWorldSouth(self, self.Config), | |||
|  |             DarkWorldMire(self, self.Config), | |||
|  |             Central(self, self.Config), | |||
|  |             CrateriaWest(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), | |||
|  |             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) | |||
|  |         ] | |||
|  | 
 | |||
|  |         self.Locations = [] | |||
|  |         for r in self.Regions: | |||
|  |             self.Locations = self.Locations + r.Locations | |||
|  | 
 | |||
|  |         self.regionLookup = {r.Name:r for r in self.Regions} | |||
|  |         self.locationLookup = {loc.Name:loc for loc in self.Locations} | |||
|  |          | |||
|  |         for region in self.Regions: | |||
|  |             region.GenerateLocationLookup() | |||
|  | 
 | |||
|  | 
 | |||
|  |     def CanEnter(self, regionName: str, items: Item.Progression): | |||
|  |         region = self.regionLookup[regionName] | |||
|  |         if (region == None): | |||
|  |             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): | |||
|  |         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 | |||
|  | 
 | |||
|  |         # return all(region.CanComplete(items) for region in self.Regions if (isinstance(region, Region.IReward) and region.Reward in rewards)) | |||
|  | 
 | |||
|  |     def Setup(self, rnd: random): | |||
|  |         self.SetMedallions(rnd) | |||
|  |         self.SetRewards(rnd) | |||
|  | 
 | |||
|  |     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, 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) | |||
|  | 
 |