Satan
Demon of Wrath
Unit #109
| HP | PWR | CP | Speed | Range | Tier |
|---|---|---|---|---|---|
| 9 (+3) | 2 | 3 (+2) | Slow | Local | B |
Abilities
Passive
c: After Satan takes X damage (after n), deal X-2 damage to All Other Local Demons.
Engine Implementation
def _satan_field_trigger(state: GameState, event: GameEvent, demon: DemonInstance, depth: int):
"""#109 Satan — Field Passive trigger
After Satan takes X damage (after DEF), deal X-2 damage to All Other Local Demons.
Fires on DAMAGE_RECEIVED event. Only activates if Satan is the target.
X = damage Satan just took (after DEF, stored in event.value).
Deals max(0, X-2) Fixed Damage to all other demons in Satan's lane.
CRITICAL (confusion #21): "All Other Local Demons" includes allied demons.
"""
from engine.operations import deal_fixed_damage
# Only fire if this Satan is the target of the damage event
if not event.target or event.target.instance_id != demon.instance_id:
return None
x = event.value if event.value is not None else 0
splash_damage = max(0, x - 2)
if splash_damage <= 0:
return None
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, splash_damage)
return state
register_trigger("109", 0, _satan_field_trigger)
Satan's Wrath — 1 AP
g: Satan's Wrath: 1 AP - a, 1x: e: When the next action is resolved, if Satan is a Valid target of that action (while ignoring range), change 1 of its targets to Satan. That action's resolution ignores range.
Engine Implementation
def _satan_satans_wrath(
state: GameState, demon: DemonInstance, targets, choices, rng
) -> GameState:
"""#109 Satan — Satan's Wrath
Quick, 1 AP, (exhaust), 1x: Status: When the next action is resolved, if Satan
is a Valid target (ignoring range), change 1 of its targets to Satan. That
action's resolution ignores range.
Applies "satans_wrath" status marker to Satan (value=1).
Action resolution system reads this marker to apply target redirection.
Status expires end of current main phase.
"""
from engine.status_effects import apply_status
state = apply_status(state, demon, demon, "satans_wrath", 1)
return state
register_ability("109", 1, _satan_satans_wrath)