Skip to main content

Dionysus

Demon of Hedonism

Unit #038

HPPWRCPSpeedRangeTier
12 (+6)3 (+1)3 (+2)FastLocalB

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