Skip to main content

Stolas

The Crazed Poisoner

Unit #022

HPPWRCPSpeedRangeTier
15 (+9)24 (+3)SlowLocalD

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