Skip to main content

Saleos

The Pacifist

Unit #103

HPPWRCPSpeedRangeTier
9 (+3)3 (+1)3 (+2)NormalDistantB

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