 355223b8f0
			
		
	
	355223b8f0
	
	
	
		
			
			Co-authored-by: Silvris <58583688+Silvris@users.noreply.github.com> Co-authored-by: Alchav <59858495+Alchav@users.noreply.github.com> Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
		
			
				
	
	
		
			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)
 |