Hippolyta
Demon of Muscle
Unit #073
| HP | PWR | CP | Speed | Range | Tier |
|---|---|---|---|---|---|
| 12 (+6) | 5 (+3) | 3 (+2) | Slow | Local | B |
Abilities
Muscle Magic — 1 AP
Muscle Magic: 1 AP - b, 1x: e: Target Other Demon with Range: ^Local^ has +2 AP Cost and +3k.
Engine Implementation
def _hippolyta_muscle_magic(
state: GameState, demon: DemonInstance, targets, choices, rng
) -> GameState:
"""#073 Hippolyta — Muscle Magic
1 AP, (ready), 1x: Status: Target Other Demon with Range: Local has +2 AP Cost and +3 PWR.
Status expires end of current main phase.
(ready) — does NOT exhaust on use.
Target must be Other (not self) with Range: Local — enforced by targeting logic.
Applies +2 AP Cost and +3 PWR status to the target.
Targets: [target_other_local_range_demon]
"""
target = targets[0]
state = apply_status(state, demon, target, "ap_cost", 2)
state = apply_status(state, demon, target, "pwr", 3)
return state
register_ability("073", 0, _hippolyta_muscle_magic)
Muscle Parade — 4 AP
Muscle Parade: 4 AP - a, 1x: Ready All Other Allied Demons with Range: ^Local^ and at least 5k. Gain 1 AP for each Demon Readied this way.
Engine Implementation
def _hippolyta_muscle_parade(
state: GameState, demon: DemonInstance, targets, choices, rng
) -> GameState:
"""#073 Hippolyta — Muscle Parade
Action, 4 AP, (exhaust), 1x: Ready All Other Allied Demons with Range: Local
and at least 5 PWR. Gain 1 AP for each Demon Readied this way.
"Other Allied Demons with Range: Local and at least 5 PWR" = allied demons
(not Hippolyta itself) with Local range and effective PWR >= 5.
Readies each qualifying demon. Owner gains 1 AP per readied demon.
"""
from engine.operations import get_effective_pwr, ready_demon
from engine.data_loader import UNITS, FAMILIARS
from engine.constants import Range
owner = demon.owner
readied_count = 0
# Find qualifying demons: other allied, Range=Local, PWR>=5
allied_others = [
d for d in state.demons
if d.owner == owner and d.instance_id != demon.instance_id
]
qualifying = []
for d in allied_others:
# Check Range: Local
uid = d.unit_id
if uid in UNITS:
d_range = UNITS[uid].range_enum
elif uid in FAMILIARS:
d_range = FAMILIARS[uid].range_enum
else:
continue
if d_range != Range.LOCAL:
continue
# Check PWR >= 5
pwr = get_effective_pwr(state, d)
if pwr < 5:
continue
qualifying.append(d)
for q in qualifying:
q_current = next(
(d for d in state.demons if d.instance_id == q.instance_id), None
)
if q_current is None or q_current.fatally_wounded:
continue
if q_current.state != DemonState.READIED:
state = ready_demon(state, q_current)
readied_count += 1
# Owner gains 1 AP per readied demon
if readied_count > 0:
new_state = copy.deepcopy(state)
new_state.players[owner].ap += readied_count
state = new_state
return state
register_ability("073", 1, _hippolyta_muscle_parade)