483 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			483 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from BaseClasses import CollectionState
							 | 
						||
| 
								 | 
							
								from typing import TYPE_CHECKING
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from .Options import StageLogic, BowserDoor, ObjectVis
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if TYPE_CHECKING:
							 | 
						||
| 
								 | 
							
								    from . import YoshisIslandWorld
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class YoshiLogic:
							 | 
						||
| 
								 | 
							
								    player: int
							 | 
						||
| 
								 | 
							
								    game_logic: str
							 | 
						||
| 
								 | 
							
								    midring_start: bool
							 | 
						||
| 
								 | 
							
								    clouds_always_visible: bool
							 | 
						||
| 
								 | 
							
								    consumable_logic: bool
							 | 
						||
| 
								 | 
							
								    luigi_pieces: int
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self, world: "YoshisIslandWorld") -> None:
							 | 
						||
| 
								 | 
							
								        self.player = world.player
							 | 
						||
| 
								 | 
							
								        self.boss_order = world.boss_order
							 | 
						||
| 
								 | 
							
								        self.luigi_pieces = world.options.luigi_pieces_required.value
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if world.options.stage_logic == StageLogic.option_strict:
							 | 
						||
| 
								 | 
							
								            self.game_logic = "Easy"
							 | 
						||
| 
								 | 
							
								        elif world.options.stage_logic == StageLogic.option_loose:
							 | 
						||
| 
								 | 
							
								            self.game_logic = "Normal"
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            self.game_logic = "Hard"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.midring_start = not world.options.shuffle_midrings
							 | 
						||
| 
								 | 
							
								        self.consumable_logic = not world.options.item_logic
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.clouds_always_visible =  world.options.hidden_object_visibility >= ObjectVis.option_clouds_only
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.bowser_door = world.options.bowser_door_mode.value
							 | 
						||
| 
								 | 
							
								        if self.bowser_door == BowserDoor.option_door_4:
							 | 
						||
| 
								 | 
							
								            self.bowser_door = BowserDoor.option_door_3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def has_midring(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        return self.midring_start or state.has("Middle Ring", self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def reconstitute_luigi(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        return state.has("Piece of Luigi", self.player, self.luigi_pieces)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def bandit_bonus(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        return state.has("Bandit Consumables", self.player) or state.has("Bandit Watermelons", self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def item_bonus(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        return state.has("Bonus Consumables", self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def combat_item(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if not self.consumable_logic:
							 | 
						||
| 
								 | 
							
								            return False
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								                return self.item_bonus(state)
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                return self.bandit_bonus(state) or self.item_bonus(state)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def melon_item(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if not self.consumable_logic:
							 | 
						||
| 
								 | 
							
								            return False
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								                return self.item_bonus(state)
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                return state.has("Bandit Watermelons", self.player) or self.item_bonus(state)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def default_vis(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.clouds_always_visible:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return False
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def cansee_clouds(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic != "Easy":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return self.default_vis(state) or state.has("Secret Lens", self.player) or self.combat_item(state)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def bowserdoor_1(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Egg Plant", "! Switch"}, self.player) and state.has("Egg Capacity Upgrade", self.player, 2)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has("Egg Plant", self.player) and state.has("Egg Capacity Upgrade", self.player, 1)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has("Egg Plant", self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def bowserdoor_2(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return ((state.has("Egg Capacity Upgrade", self.player, 3) and state.has("Egg Plant", self.player)) or self.combat_item(state)) and state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return ((state.has("Egg Capacity Upgrade", self.player, 2) and state.has("Egg Plant", self.player)) or self.combat_item(state)) and state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return ((state.has("Egg Capacity Upgrade", self.player, 1) and state.has("Egg Plant", self.player)) or self.combat_item(state)) and state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def bowserdoor_3(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def bowserdoor_4(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _68Route(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.bowser_door == 0:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.bowser_door == 1:
							 | 
						||
| 
								 | 
							
								            return self.bowserdoor_1(state)
							 | 
						||
| 
								 | 
							
								        elif self.bowser_door == 2:
							 | 
						||
| 
								 | 
							
								            return self.bowserdoor_2(state)
							 | 
						||
| 
								 | 
							
								        elif self.bowser_door == 3:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.bowser_door == 4:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.bowser_door == 5:
							 | 
						||
| 
								 | 
							
								            return self.bowserdoor_1(state) and self.bowserdoor_2(state) and self.bowserdoor_3(state)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _68CollectibleRoute(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.bowser_door == 0:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.bowser_door == 1:
							 | 
						||
| 
								 | 
							
								            return self.bowserdoor_1(state)
							 | 
						||
| 
								 | 
							
								        elif self.bowser_door == 2:
							 | 
						||
| 
								 | 
							
								            return self.bowserdoor_2(state)
							 | 
						||
| 
								 | 
							
								        elif self.bowser_door == 3:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.bowser_door == 4:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.bowser_door == 5:
							 | 
						||
| 
								 | 
							
								            return self.bowserdoor_1(state)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _13Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _14Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _14Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has("Egg Plant", self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has("Egg Plant", self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return (state.has("Egg Capacity Upgrade", self.player, 5) or state.has("Egg Plant", self.player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _14CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[0], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _17Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _18Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Key", "Arrow Wheel"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Key", "Arrow Wheel"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Key", "Arrow Wheel"}, self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _18Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _18CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[1], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _21Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Poochy", "Large Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Poochy", "Large Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Poochy", "Large Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _23Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Mole Tank Morph", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Mole Tank Morph", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Mole Tank Morph", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _24Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"! Switch", "Key", "Dashed Stairs"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"! Switch", "Dashed Stairs"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has("! Switch", self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _24Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _24CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[2], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _26Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Large Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Large Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Large Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _27Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _28Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Arrow Wheel", "Key"}, self.player) and (state.has("Egg Capacity Upgrade", self.player, 1))
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Arrow Wheel", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Arrow Wheel", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _28Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _28CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[3], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _32Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Dashed Stairs", "Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Dashed Stairs", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Dashed Stairs", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _34Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has("Dashed Platform", self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return (state.has("Dashed Platform", self.player) or self.has_midring(state))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _34Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has("Giant Eggs", self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _34CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[4], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _37Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Key", "Large Spring Ball"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _38Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return (state.has("Egg Capacity Upgrade", self.player, 3) or self.combat_item(state))
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return (state.has("Egg Capacity Upgrade", self.player, 1) or self.combat_item(state))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _38Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _38CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[5], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _42Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Large Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Large Spring Ball", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _44Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Dashed Stairs", "Vanishing Arrow Wheel", "Arrow Wheel", "Bucket", "Key"}, self.player) and (state.has("Egg Capacity Upgrade", self.player, 1) or self.combat_item(state))
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Dashed Stairs", "Vanishing Arrow Wheel", "Arrow Wheel", "Bucket", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Dashed Stairs", "Vanishing Arrow Wheel", "Arrow Wheel", "Bucket", "Key"}, self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _44Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _44CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[6], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								########################################################################################################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _46Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Key", "Large Spring Ball"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Key", "Large Spring Ball"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Key", "Large Spring Ball"}, self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _47Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Key", "Large Spring Ball"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Key", "Large Spring Ball"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Key", "Large Spring Ball"}, self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _48Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return (state.has_all({"Dashed Stairs", "Vanishing Arrow Wheel", "Key", "Large Spring Ball"}, self.player))
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return (state.has_all({"Dashed Stairs", "Vanishing Arrow Wheel", "Key", "Large Spring Ball"}, self.player))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return (state.has_all({"Key", "Large Spring Ball"}, self.player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _48Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return (state.has("Egg Capacity Upgrade", self.player, 3))
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return (state.has("Egg Capacity Upgrade", self.player, 2))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return (state.has("Egg Capacity Upgrade", self.player, 1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _48CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[7], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								######################################################################################################################
							 | 
						||
| 
								 | 
							
								    def _51Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _54Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return (state.has_all({"Dashed Stairs", "Platform Ghost", "Dashed Platform"}, self.player))
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return (state.has_all({"Dashed Stairs", "Platform Ghost", "Dashed Platform"}, self.player))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return (state.has_all({"Dashed Stairs", "Platform Ghost"}, self.player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _54Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return (state.has("Egg Capacity Upgrade", self.player, 2) and state.has("Egg Plant", self.player))
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return ((state.has("Egg Capacity Upgrade", self.player, 1) and state.has("Egg Plant", self.player)) or (state.has("Egg Capacity Upgrade", self.player, 5) and self.has_midring(state)))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return ((state.has("Egg Plant", self.player)) or (state.has("Egg Capacity Upgrade", self.player, 3) and self.has_midring(state)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _54CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[8], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								###################################################################################################
							 | 
						||
| 
								 | 
							
								    def _58Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Arrow Wheel", "Large Spring Ball"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Arrow Wheel", "Large Spring Ball"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Arrow Wheel", "Large Spring Ball"}, self.player)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _58Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _58CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[9], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _61Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Dashed Platform", "Key", "Beanstalk"}, self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Dashed Platform", "Key", "Beanstalk"}, self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _64Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Spring Ball", "Large Spring Ball", "Egg Plant", "Key"}, self.player) and (state.has("Egg Capacity Upgrade", self.player, 3) or self.combat_item(state))
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Large Spring Ball", "Egg Plant", "Key"}, self.player) and (state.has("Egg Capacity Upgrade", self.player, 2) or self.combat_item(state))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Egg Plant", "Key"}, self.player) and (state.has("Egg Capacity Upgrade", self.player, 1) or self.combat_item(state))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _64Boss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has("Egg Plant", self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has("Egg Plant", self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _64CanFightBoss(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if state.can_reach(self.boss_order[10], "Location", self.player):
							 | 
						||
| 
								 | 
							
								            return True
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _67Game(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has("Key", self.player)
							 | 
						||
| 
								 | 
							
								##############################################################################
							 | 
						||
| 
								 | 
							
								    def _68Clear(self, state: CollectionState) -> bool:
							 | 
						||
| 
								 | 
							
								        if self.game_logic == "Easy":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Helicopter Morph", "Egg Plant", "Giant Eggs"}, self.player) and self._68Route(state)
							 | 
						||
| 
								 | 
							
								        elif self.game_logic == "Normal":
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Helicopter Morph", "Egg Plant", "Giant Eggs"}, self.player) and self._68Route(state)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            return state.has_all({"Helicopter Morph", "Giant Eggs"}, self.player) and self._68Route(state)
							 |