153 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
from typing import List
 | 
						|
from worlds.smz3.TotalSMZ3.Region import Z3Region, RewardType
 | 
						|
from worlds.smz3.TotalSMZ3.Config import Config, GameMode, KeyShuffle
 | 
						|
from worlds.smz3.TotalSMZ3.Location import Location, LocationType
 | 
						|
from worlds.smz3.TotalSMZ3.Item import Item, Progression, ItemType
 | 
						|
 | 
						|
class GanonsTower(Z3Region):
 | 
						|
    Name = "Ganon's Tower"
 | 
						|
    Area = "Ganon's Tower"
 | 
						|
 | 
						|
    def __init__(self, world, config: Config):
 | 
						|
        super().__init__(world, config)
 | 
						|
        self.Reward = RewardType.Null
 | 
						|
        self.RegionItems = [ ItemType.KeyGT, ItemType.BigKeyGT, ItemType.MapGT , ItemType.CompassGT]
 | 
						|
        self.Locations = [
 | 
						|
            Location(self, 256+189, 0x308161, LocationType.Regular, "Ganon's Tower - Bob's Torch",
 | 
						|
                lambda items: items.Boots),
 | 
						|
            Location(self, 256+190, 0x1EAB8, LocationType.Regular, "Ganon's Tower - DMs Room - Top Left",
 | 
						|
                lambda items: items.Hammer and items.Hookshot),
 | 
						|
            Location(self, 256+191, 0x1EABB, LocationType.Regular, "Ganon's Tower - DMs Room - Top Right",
 | 
						|
                lambda items: items.Hammer and items.Hookshot),
 | 
						|
            Location(self, 256+192, 0x1EABE, LocationType.Regular, "Ganon's Tower - DMs Room - Bottom Left",
 | 
						|
                lambda items: items.Hammer and items.Hookshot),
 | 
						|
            Location(self, 256+193, 0x1EAC1, LocationType.Regular, "Ganon's Tower - DMs Room - Bottom Right",
 | 
						|
                lambda items: items.Hammer and items.Hookshot),
 | 
						|
            Location(self, 256+194, 0x1EAD3, LocationType.Regular, "Ganon's Tower - Map Chest",
 | 
						|
                lambda items: items.Hammer and (items.Hookshot or items.Boots) and items.KeyGT >=
 | 
						|
                    (3 if any(self.GetLocation("Ganon's Tower - Map Chest").ItemIs(type, self.world) for type in [ItemType.BigKeyGT, ItemType.KeyGT]) else 4))
 | 
						|
                .AlwaysAllow(lambda item, items: item.Is(ItemType.KeyGT, self.world) and items.KeyGT >= 3),
 | 
						|
            Location(self, 256+195, 0x1EAD0, LocationType.Regular, "Ganon's Tower - Firesnake Room",
 | 
						|
                lambda items: items.Hammer and items.Hookshot and items.KeyGT >= (2 if any(l.ItemIs(ItemType.BigKeyGT, self.world) for l in [
 | 
						|
                        self.GetLocation("Ganon's Tower - Randomizer Room - Top Right"),
 | 
						|
                        self.GetLocation("Ganon's Tower - Randomizer Room - Top Left"),
 | 
						|
                        self.GetLocation("Ganon's Tower - Randomizer Room - Bottom Left"),
 | 
						|
                        self.GetLocation("Ganon's Tower - Randomizer Room - Bottom Right")
 | 
						|
                    ]) or self.GetLocation("Ganon's Tower - Firesnake Room").ItemIs(ItemType.KeyGT, self.world) else 3)),
 | 
						|
            Location(self, 256+230, 0x1EAC4, LocationType.Regular, "Ganon's Tower - Randomizer Room - Top Left",
 | 
						|
                lambda items: self.LeftSide(items, [
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Top Right"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Bottom Left"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Bottom Right")
 | 
						|
                ])),
 | 
						|
            Location(self, 256+231, 0x1EAC7, LocationType.Regular, "Ganon's Tower - Randomizer Room - Top Right",
 | 
						|
                lambda items: self.LeftSide(items, [
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Top Left"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Bottom Left"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Bottom Right")
 | 
						|
                ])),
 | 
						|
            Location(self, 256+232, 0x1EACA, LocationType.Regular, "Ganon's Tower - Randomizer Room - Bottom Left",
 | 
						|
                lambda items: self.LeftSide(items, [
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Top Right"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Top Left"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Bottom Right")
 | 
						|
                ])),
 | 
						|
            Location(self, 256+233, 0x1EACD, LocationType.Regular, "Ganon's Tower - Randomizer Room - Bottom Right",
 | 
						|
                lambda items: self.LeftSide(items, [
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Top Right"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Top Left"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Randomizer Room - Bottom Left")
 | 
						|
                ])),
 | 
						|
            Location(self, 256+234, 0x1EAD9, LocationType.Regular, "Ganon's Tower - Hope Room - Left"),
 | 
						|
            Location(self, 256+235, 0x1EADC, LocationType.Regular, "Ganon's Tower - Hope Room - Right"),
 | 
						|
            Location(self, 256+236, 0x1EAE2, LocationType.Regular, "Ganon's Tower - Tile Room",
 | 
						|
                lambda items: items.Somaria),
 | 
						|
            Location(self, 256+203, 0x1EAE5, LocationType.Regular, "Ganon's Tower - Compass Room - Top Left",
 | 
						|
                lambda items: self.RightSide(items, [
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Top Right"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Bottom Left"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Bottom Right")
 | 
						|
                ])),
 | 
						|
            Location(self, 256+204, 0x1EAE8, LocationType.Regular, "Ganon's Tower - Compass Room - Top Right",
 | 
						|
                lambda items: self.RightSide(items, [
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Top Left"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Bottom Left"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Bottom Right")
 | 
						|
                ])),
 | 
						|
            Location(self, 256+205, 0x1EAEB, LocationType.Regular, "Ganon's Tower - Compass Room - Bottom Left",
 | 
						|
                lambda items: self.RightSide(items, [
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Top Right"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Top Left"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Bottom Right")
 | 
						|
                ])),
 | 
						|
            Location(self, 256+206, 0x1EAEE, LocationType.Regular, "Ganon's Tower - Compass Room - Bottom Right",
 | 
						|
                lambda items: self.RightSide(items, [
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Top Right"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Top Left"),
 | 
						|
                    self.GetLocation("Ganon's Tower - Compass Room - Bottom Left")
 | 
						|
                ])),
 | 
						|
            Location(self, 256+207, 0x1EADF, LocationType.Regular, "Ganon's Tower - Bob's Chest",
 | 
						|
                lambda items: items.KeyGT >= 3 and (
 | 
						|
                    items.Hammer and items.Hookshot or
 | 
						|
                    items.Somaria and items.Firerod)),
 | 
						|
            Location(self, 256+208, 0x1EAD6, LocationType.Regular, "Ganon's Tower - Big Chest",
 | 
						|
                lambda items: items.BigKeyGT and items.KeyGT >= 3 and (
 | 
						|
                    items.Hammer and items.Hookshot or
 | 
						|
                    items.Somaria and items.Firerod))
 | 
						|
                .Allow(lambda item, items: item.IsNot(ItemType.BigKeyGT, self.world)),
 | 
						|
            Location(self, 256+209, 0x1EAF1, LocationType.Regular, "Ganon's Tower - Big Key Chest", self.BigKeyRoom),
 | 
						|
            Location(self, 256+210, 0x1EAF4, LocationType.Regular, "Ganon's Tower - Big Key Room - Left", self.BigKeyRoom),
 | 
						|
            Location(self, 256+211, 0x1EAF7, LocationType.Regular, "Ganon's Tower - Big Key Room - Right", self.BigKeyRoom),
 | 
						|
            Location(self, 256+212, 0x1EAFD, LocationType.Regular, "Ganon's Tower - Mini Helmasaur Room - Left", self.TowerAscend)
 | 
						|
                .Allow(lambda item, items: item.IsNot(ItemType.BigKeyGT, self.world)),
 | 
						|
            Location(self, 256+213, 0x1EB00, LocationType.Regular, "Ganon's Tower - Mini Helmasaur Room - Right", self.TowerAscend)
 | 
						|
                .Allow(lambda item, items: item.IsNot(ItemType.BigKeyGT, self.world)),
 | 
						|
            Location(self, 256+214, 0x1EB03, LocationType.Regular, "Ganon's Tower - Pre-Moldorm Chest", self.TowerAscend)
 | 
						|
                .Allow(lambda item, items: item.IsNot(ItemType.BigKeyGT, self.world)),
 | 
						|
            Location(self, 256+215, 0x1EB06, LocationType.Regular, "Ganon's Tower - Moldorm Chest",
 | 
						|
                lambda items: items.BigKeyGT and items.KeyGT >= 4 and
 | 
						|
                    items.Bow and items.CanLightTorches() and
 | 
						|
                    self.CanBeatMoldorm(items) and items.Hookshot)
 | 
						|
                .Allow(lambda item, items: all(item.IsNot(type, self.world) for type in [ ItemType.KeyGT, ItemType.BigKeyGT ]))
 | 
						|
            ]
 | 
						|
 | 
						|
    def LeftSide(self, items: Progression, locations: List[Location]):
 | 
						|
        return items.Hammer and items.Hookshot and items.KeyGT >= (3 if any(l.ItemIs(ItemType.BigKeyGT, self.world) for l in locations) else 4)
 | 
						|
 | 
						|
    def RightSide(self, items: Progression, locations: List[Location]):
 | 
						|
        return items.Somaria and items.Firerod and items.KeyGT >= (3 if any(l.ItemIs(ItemType.BigKeyGT, self.world) for l in locations) else 4)
 | 
						|
 | 
						|
    def BigKeyRoom(self, items: Progression):
 | 
						|
        return items.KeyGT >= 3 and \
 | 
						|
            (items.Hammer and items.Hookshot or items.Firerod and items.Somaria) \
 | 
						|
            and self.CanBeatArmos(items)
 | 
						|
 | 
						|
    def TowerAscend(self, items: Progression):
 | 
						|
        return items.BigKeyGT and items.KeyGT >= 3 and items.Bow and items.CanLightTorches()
 | 
						|
        
 | 
						|
    def CanBeatArmos(self, items: Progression):
 | 
						|
        return items.Sword or items.Hammer or items.Bow or \
 | 
						|
            items.CanExtendMagic(2) and (items.Somaria or items.Byrna) or \
 | 
						|
            items.CanExtendMagic(4) and (items.Firerod or items.Icerod)
 | 
						|
 | 
						|
    def CanBeatMoldorm(self, items: Progression):
 | 
						|
        return items.Sword or items.Hammer
 | 
						|
 | 
						|
    def CanEnter(self, items: Progression):
 | 
						|
        return items.MoonPearl and self.world.CanEnter("Dark World Death Mountain East", items) and \
 | 
						|
            self.world.CanAcquireAtLeast(self.world.TowerCrystals, items, RewardType.AnyCrystal) and \
 | 
						|
            self.world.CanAcquireAtLeast(self.world.TourianBossTokens * (self.world.TowerCrystals / 7), items, RewardType.AnyBossToken)
 | 
						|
 | 
						|
    # added for AP completion_condition when TowerCrystals is lower than GanonCrystals
 | 
						|
    def CanComplete(self, items: Progression):
 | 
						|
        return self.world.CanAcquireAtLeast(self.world.GanonCrystals, items, RewardType.AnyCrystal)
 | 
						|
 | 
						|
    def CanFill(self, item: Item):
 | 
						|
        if (self.Config.Multiworld):
 | 
						|
            if (item.World != self.world or item.Progression):
 | 
						|
                return False
 | 
						|
            if (self.Config.Keysanity and not ((item.Type == ItemType.BigKeyGT or item.Type == ItemType.KeyGT) and item.World == self.world) and (item.IsKey() or item.IsBigKey() or item.IsKeycard())):
 | 
						|
                return False
 | 
						|
        return super().CanFill(item)
 | 
						|
 |