Dionysus
Demon of Hedonism
Unit #038
| HP | PWR | CP | Speed | Range | Tier |
|---|---|---|---|---|---|
| 12 (+6) | 3 (+1) | 3 (+2) | Fast | Local | B |
Abilities
Hangover — 0 AP
g: Hangover: 0 AP - b, 1x: Move Dionysus to a Random Lane.
Engine Implementation
def _dionysus_hangover(state: GameState, demon: DemonInstance, targets, choices, rng) -> GameState:
"""#038 Dionysus — Hangover
Quick, 0 AP, (ready), 1x: Move Dionysus to a Random Lane.
Quick timing, (ready) — does NOT exhaust.
1x per turn (confusion #20).
Uses rng.choice to select a random lane from all valid lanes [0, 1, 2].
Self-targeting: moves the performing demon (Dionysus).
Targets: None
"""
return _move_to_lane(state, demon, rng.choice(list(range(LANE_COUNT))))
register_ability("038", 0, _dionysus_hangover)
Drunken Match — 2 AP
s: Drunken Match: 2 AP - a: Deal 2pk damage to Target Local Demon. The targeted Demon deals 2p k damage to this action's performer.
Engine Implementation
def _dionysus_drunken_match(
state: GameState, demon: DemonInstance, targets, choices, rng
) -> GameState:
"""#038 Dionysus — Drunken Match
Universal, 2 AP, (exhaust): Deal 2×PWR damage to Target Local Demon.
The targeted Demon deals 2×their PWR damage to this action's performer.
Universal: ANY demon (including enemies) can perform this.
Dealer uses ITS OWN 2×PWR (get_effective_pwr of performer).
Counter-damage: target deals 2×target's PWR back to the performer.
For now: deal both directions in sequence (performer → target, then target → performer).
Both damage values go through DEF reduction (deal_damage, NOT fixed).
NOTE: Counter-attack is implemented as regular damage — the target's DEF applies
when receiving, and the performer's DEF applies to counter-damage received.
Targets: [target_local_demon]
"""
target = targets[0]
performer_pwr = get_effective_pwr(state, demon)
state = deal_damage(state, demon, target, 2 * performer_pwr)
# Counter: target deals 2×target's PWR back to performer (if target still alive)
target_in_new = next(
(d for d in state.demons if d.instance_id == target.instance_id), None
)
if target_in_new is not None and not target_in_new.fatally_wounded:
target_pwr = get_effective_pwr(state, target_in_new)
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:
state = deal_damage(state, target_in_new, performer_in_new, 2 * target_pwr)
return state
register_ability("038", 1, _dionysus_drunken_match)