 e764da3dc6
			
		
	
	e764da3dc6
	
	
	
		
			
			* updates HK to consistently use world.random, use world.options, don't use world = self.multiworld, and remove some things from the logicMixin * Update HK to new options dataclass * Move completion condition helpers to Rules.py * updates from review
		
			
				
	
	
		
			91 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from ..generic.Rules import set_rule, add_rule
 | |
| from ..AutoWorld import World
 | |
| from .GeneratedRules import set_generated_rules
 | |
| from .GodhomeData import set_godhome_rules
 | |
| from typing import NamedTuple
 | |
| 
 | |
| 
 | |
| class CostTerm(NamedTuple):
 | |
|     term: str
 | |
|     option: str
 | |
|     singular: str
 | |
|     plural: str
 | |
|     weight: int  # CostSanity
 | |
|     sort: int
 | |
| 
 | |
| 
 | |
| cost_terms = {x.term: x for x in (
 | |
|     CostTerm("RANCIDEGGS", "Egg", "Rancid Egg", "Rancid Eggs", 1, 3),
 | |
|     CostTerm("GRUBS", "Grub", "Grub", "Grubs", 1, 2),
 | |
|     CostTerm("ESSENCE", "Essence", "Essence", "Essence", 1, 4),
 | |
|     CostTerm("CHARMS", "Charm", "Charm", "Charms", 1, 1),
 | |
|     CostTerm("GEO", "Geo", "Geo", "Geo", 8, 9999),
 | |
| )}
 | |
| 
 | |
| 
 | |
| def hk_set_rule(hk_world: World, location: str, rule):
 | |
|     player = hk_world.player
 | |
| 
 | |
|     locations = hk_world.created_multi_locations.get(location)
 | |
|     if locations is None:
 | |
|         try:
 | |
|             locations = [hk_world.multiworld.get_location(location, player)]
 | |
|         except KeyError:
 | |
|             return
 | |
| 
 | |
|     for location in locations:
 | |
|         set_rule(location, rule)
 | |
| 
 | |
| 
 | |
| def set_rules(hk_world: World):
 | |
|     player = hk_world.player
 | |
|     set_generated_rules(hk_world, hk_set_rule)
 | |
|     set_godhome_rules(hk_world, hk_set_rule)
 | |
| 
 | |
|     # Shop costs
 | |
|     for location in hk_world.multiworld.get_locations(player):
 | |
|         if location.costs:
 | |
|             for term, amount in location.costs.items():
 | |
|                 if term == "GEO":  # No geo logic!
 | |
|                     continue
 | |
|                 add_rule(location, lambda state, term=term, amount=amount: state.count(term, player) >= amount)
 | |
| 
 | |
| 
 | |
| def _hk_nail_combat(state, player) -> bool:
 | |
|     return state.has_any({'LEFTSLASH', 'RIGHTSLASH', 'UPSLASH'}, player)
 | |
| 
 | |
| 
 | |
| def _hk_can_beat_thk(state, player) -> bool:
 | |
|     return (
 | |
|         state.has('Opened_Black_Egg_Temple', player)
 | |
|         and (state.count('FIREBALL', player) + state.count('SCREAM', player) + state.count('QUAKE', player)) > 1
 | |
|         and _hk_nail_combat(state, player)
 | |
|         and (
 | |
|             state.has_any({'LEFTDASH', 'RIGHTDASH'}, player)
 | |
|             or state._hk_option(player, 'ProficientCombat')
 | |
|         )
 | |
|         and state.has('FOCUS', player)
 | |
|     )
 | |
| 
 | |
| 
 | |
| def _hk_siblings_ending(state, player) -> bool:
 | |
|     return _hk_can_beat_thk(state, player) and state.has('WHITEFRAGMENT', player, 3)
 | |
| 
 | |
| 
 | |
| def _hk_can_beat_radiance(state, player) -> bool:
 | |
|     return (
 | |
|         state.has('Opened_Black_Egg_Temple', player)
 | |
|         and _hk_nail_combat(state, player)
 | |
|         and state.has('WHITEFRAGMENT', player, 3)
 | |
|         and state.has('DREAMNAIL', player)
 | |
|         and (
 | |
|             (state.has('LEFTCLAW', player) and state.has('RIGHTCLAW', player))
 | |
|             or state.has('WINGS', player)
 | |
|         )
 | |
|         and (state.count('FIREBALL', player) + state.count('SCREAM', player) + state.count('QUAKE', player)) > 1
 | |
|         and (
 | |
|             (state.has('LEFTDASH', player, 2) and state.has('RIGHTDASH', player, 2))  # Both Shade Cloaks
 | |
|             or (state._hk_option(player, 'ProficientCombat') and state.has('QUAKE', player))  # or Dive
 | |
|         )
 | |
|     )
 |