Stolas
The Crazed Poisoner
Unit #022
| HP | PWR | CP | Speed | Range | Tier |
|---|---|---|---|---|---|
| 15 (+9) | 2 | 4 (+3) | Slow | Local | D |
Abilities
Passive
c: After Any Other Demon Exhausts, deal 1 damage to All Other Local Demons.
Engine Implementation
def _stolas_field_trigger(state: GameState, event: GameEvent, demon: DemonInstance, depth: int):
"""#022 Stolas — Field Passive trigger
After Any Other Demon Exhausts, deal 1 damage to All Other Local Demons.
Fires on DEMON_EXHAUSTED event. Checks that the exhausting demon is NOT Stolas.
"All Other Local Demons" = all demons in Stolas's lane except Stolas itself.
1 damage is Fixed (no DEF qualifier).
CRITICAL (confusion #21): includes allied demons in Stolas's lane.
"""
from engine.operations import deal_fixed_damage
# Only fire if the exhausted demon is NOT this Stolas instance
if event.source and event.source.instance_id == demon.instance_id:
return None # Stolas exhausted itself — passive does not trigger
# Deal 1 Fixed Damage to all other local demons
local_others = [
d for d in state.demons
if d.lane == demon.lane and d.instance_id != demon.instance_id
]
if not local_others:
return None
for t in local_others:
state = deal_fixed_damage(state, t, 1)
return state
register_trigger("022", 0, _stolas_field_trigger)
Noxious Gas — 4 AP
g: Noxious Gas: 4 AP - a: e: All Demons have -2n.
Engine Implementation
def _stolas_noxious_gas(state: GameState, demon: DemonInstance, targets, choices, rng) -> GameState:
"""#022 Stolas — Noxious Gas
Quick, 4 AP, (exhaust): Status: All Demons have -2 DEF.
Status expires end of current main phase.
CRITICAL: "All Demons" includes allies (confusion #21).
Targets: None (applies to all demons on field)
"""
for d in list(state.demons):
state = apply_status(state, demon, d, "def", -2)
return state
def _stolas_noxious_gas(state: GameState, demon: DemonInstance, targets, choices, rng) -> GameState:
"""#022 Stolas — Noxious Gas
Quick, 4 AP, (exhaust): Status: All Demons have -2 DEF.
CRITICAL: "All Demons" includes your own allied demons (confusion #21).
Status expires end of current main phase (confusion #9 — NOT permanent).
"""
from engine.status_effects import apply_status
from engine.targeting import get_all_demons
all_demons = get_all_demons(state)
for d in all_demons:
state = apply_status(state, demon, d, "def", -2)
return state
register_ability("022", 1, _stolas_noxious_gas)