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
|
|
)
|
|
)
|