Haagenti
Demon of Liquor
Unit #108
| HP | PWR | CP | Speed | Range | Tier |
|---|---|---|---|---|---|
| 15 (+9) | 2 | 4 (+3) | Normal | Local | B |
Abilities
Vodka Shots — 1 AP
i: Vodka Shots: 1 AP - b: X is the number of Local Demons. Deal X Fixed Damage to this action's performer. e: This action's performer has +Xk and cannot be Readied.
Engine Implementation
def _haagenti_vodka_shots(
state: GameState, demon: DemonInstance, targets, choices, rng
) -> GameState:
"""#108 Haagenti — Vodka Shots
Allied, 1 AP, (ready): X is the number of Local Demons. Deal X Fixed Damage
to this action's performer. Status: This action's performer has +X PWR and
cannot be Readied.
Status expires end of current main phase.
Allied: any allied demon can perform this (ability_implementation_guide.json).
X = count of ALL demons in the performer's lane (both sides — confusion #21).
Fixed Damage bypasses DEF entirely.
Performer receives +X PWR status and "cannot_be_readied" status.
(ready) — does NOT exhaust the performer.
Targets: None (self-targeting: performer is 'demon')
"""
# X = number of ALL local demons in performer's lane (includes allies + enemies)
x = sum(1 for d in state.demons if d.lane == demon.lane)
# Deal X Fixed Damage to the performer (self)
state = deal_fixed_damage(state, demon, x)
# Relocate performer in new state after deepcopy from deal_fixed_damage
performer_in_new = next(
(d for d in state.demons if d.instance_id == demon.instance_id), None
)
if performer_in_new is not None:
# Status: +X PWR
state = apply_status(state, performer_in_new, performer_in_new, "pwr", x)
# Re-locate again after apply_status deepcopy
performer_in_new2 = next(
(d for d in state.demons if d.instance_id == demon.instance_id), None
)
if performer_in_new2 is not None:
# Status: cannot be Readied
state = apply_status(
state, performer_in_new2, performer_in_new2, "cannot_be_readied", 1
)
return state
register_ability("108", 0, _haagenti_vodka_shots)