| 
									
										
										
										
											2022-04-01 03:23:52 +02:00
										 |  |  | from ..generic.Rules import set_rule, add_rule | 
					
						
							| 
									
										
										
										
											2022-07-03 08:10:10 -07:00
										 |  |  | from ..AutoWorld import World | 
					
						
							|  |  |  | from .GeneratedRules import set_generated_rules | 
					
						
							| 
									
										
										
										
											2024-04-09 14:12:50 -05:00
										 |  |  | from .GodhomeData import set_godhome_rules | 
					
						
							| 
									
										
										
										
											2022-07-03 08:10:10 -07:00
										 |  |  | from typing import NamedTuple | 
					
						
							| 
									
										
										
										
											2021-02-25 02:07:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-24 06:02:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 08:10:10 -07:00
										 |  |  | class CostTerm(NamedTuple): | 
					
						
							|  |  |  |     term: str | 
					
						
							|  |  |  |     option: str | 
					
						
							|  |  |  |     singular: str | 
					
						
							|  |  |  |     plural: str | 
					
						
							|  |  |  |     weight: int  # CostSanity | 
					
						
							|  |  |  |     sort: int | 
					
						
							| 
									
										
										
										
											2022-04-01 03:23:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 08:10:10 -07:00
										 |  |  | 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), | 
					
						
							|  |  |  | )} | 
					
						
							| 
									
										
										
										
											2022-04-01 03:23:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 08:10:10 -07:00
										 |  |  | def hk_set_rule(hk_world: World, location: str, rule): | 
					
						
							| 
									
										
										
										
											2022-04-01 03:23:52 +02:00
										 |  |  |     player = hk_world.player | 
					
						
							| 
									
										
										
										
											2021-02-24 06:02:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 08:10:10 -07:00
										 |  |  |     locations = hk_world.created_multi_locations.get(location) | 
					
						
							|  |  |  |     if locations is None: | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2022-10-31 21:41:21 -05:00
										 |  |  |             locations = [hk_world.multiworld.get_location(location, player)] | 
					
						
							| 
									
										
										
										
											2022-07-03 08:10:10 -07:00
										 |  |  |         except KeyError: | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2022-04-01 03:23:52 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 08:10:10 -07:00
										 |  |  |     for location in locations: | 
					
						
							|  |  |  |         set_rule(location, rule) | 
					
						
							| 
									
										
										
										
											2022-04-01 03:23:52 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-24 06:02:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 08:10:10 -07:00
										 |  |  | def set_rules(hk_world: World): | 
					
						
							|  |  |  |     player = hk_world.player | 
					
						
							|  |  |  |     set_generated_rules(hk_world, hk_set_rule) | 
					
						
							| 
									
										
										
										
											2024-04-09 14:12:50 -05:00
										 |  |  |     set_godhome_rules(hk_world, hk_set_rule) | 
					
						
							| 
									
										
										
										
											2022-07-03 08:10:10 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Shop costs | 
					
						
							| 
									
										
										
										
											2023-10-29 19:53:57 +01:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2024-07-28 16:27:39 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     ) |