Saleos
The Pacifist
Unit #103
| HP | PWR | CP | Speed | Range | Tier |
|---|---|---|---|---|---|
| 9 (+3) | 3 (+1) | 3 (+2) | Normal | Distant | B |
Abilities
Passive
After Saleos resolves an action that targets any Demon(s) within the action's range, you may apply e: Actions that Target the targeted Demon(s) ignore range restrictions.
Engine Implementation
def _saleos_range_ignore_trigger(
state: GameState, event: GameEvent, demon: DemonInstance, depth: int
):
"""#103 Saleos — Passive trigger: ABILITY_USED
After Saleos resolves an action targeting Demon(s), apply Status: Actions
targeting those Demons ignore range restrictions.
Fires on ABILITY_USED when the SOURCE is this Saleos instance.
Applies "ignore_range" status (value=1) to the primary target (event.target).
Status expires end of current main phase (NOT permanent — confusion #9).
The full multi-target version (all targets) requires engine-level multi-target
event support. Here we apply to event.target (primary target only).
Re-fetches Saleos from state to check fatally_wounded before acting.
"""
from engine.status_effects import apply_status
# Only fire when Saleos is the ability source
if event.source is None:
return None
if event.source.instance_id != demon.instance_id:
return None # A different demon used an ability — not Saleos
# Re-fetch Saleos from state
saleos_current = next(
(d for d in state.demons if d.instance_id == demon.instance_id), None
)
if saleos_current is None or saleos_current.fatally_wounded:
return None
# Must have a target to apply the status to
if event.target is None:
return None
# Re-fetch target from current state
target_current = next(
(d for d in state.demons if d.instance_id == event.target.instance_id), None
)
if target_current is None:
return None
# Apply "ignore_range" marker status to the target
return apply_status(state, saleos_current, target_current, "ignore_range", 1)
register_trigger("103", 0, _saleos_range_ignore_trigger)
Targeted Surveillance — 1 AP
g: Targeted Surveillance: 1 AP - a, 1x: e: Target Distant Demon cannot perform actions. Saleos's next action ignores a and b costs. (If this "cancels" an action, the costs of that action are not resolved.)
Engine Implementation
def _saleos_targeted_surveillance(
state: GameState, demon: DemonInstance, targets, choices, rng
) -> GameState:
"""#103 Saleos — Targeted Surveillance
Quick, 1 AP, (exhaust), 1x: Status: Target Distant Demon cannot perform actions.
Saleos's next action ignores (exhaust) and (ready) costs.
Effect 1: Apply "cannot_act" status (value=1) to target (expires end of phase).
Effect 2: Apply "free_action_next" marker status (value=1) to Saleos itself
(expires end of phase — the "next action" window).
Status expires end of current main phase (confusion #9 — NOT permanent).
"""
from engine.status_effects import apply_status
if not targets:
return state
target = targets[0]
# Re-fetch target from state
target_in_state = next(
(d for d in state.demons if d.instance_id == target.instance_id), None
)
if target_in_state is None:
return state
# Apply "cannot_act" status to the target Distant demon
state = apply_status(state, demon, target_in_state, "cannot_act", 1)
# Re-fetch Saleos from state
saleos_in_state = next(
(d for d in state.demons if d.instance_id == demon.instance_id), None
)
if saleos_in_state is None:
return state
# Apply "free_action_next" marker to Saleos — next action ignores exhaust/ready
state = apply_status(state, saleos_in_state, saleos_in_state, "free_action_next", 1)
return state
register_ability("103", 1, _saleos_targeted_surveillance)