Vual
The Eternal Light
Unit #083
| HP | PWR | CP | Speed | Range | Tier |
|---|---|---|---|---|---|
| 9 (+3) | 4 (+2) | 3 (+2) | Fast | Any | B |
Abilities
Oasis of Life — 2 AP
Oasis of Life: 2 AP - a: Remove k damage from All Demons in Target Lane.
Engine Implementation
def _vual_oasis_of_life(state: GameState, demon: DemonInstance, targets, choices, rng) -> GameState:
"""#083 Vual — Oasis of Life
Action, 2 AP, (exhaust): Remove PWR damage from All Demons in Target Lane.
CRITICAL: "All Demons" includes allied AND enemy demons (confusion #21).
Heals PWR damage from every demon in the target lane.
Target lane via choices["lane"] or first target's lane.
"""
from engine.operations import get_effective_pwr, remove_damage
from engine.targeting import get_local_demons
if choices and "lane" in choices:
target_lane = choices["lane"]
elif targets:
target_lane = targets[0].lane
else:
return state
pwr = get_effective_pwr(state, demon)
demons_in_lane = get_local_demons(state, target_lane)
for t in demons_in_lane:
state = remove_damage(state, t, pwr)
return state
register_ability("083", 0, _vual_oasis_of_life)
The Sun Does Not Set — 1 AP
h: The Sun Does Not Set: 1 AP - a: e: All Demons are considered to have k additional HP. At the end of this Main Phase, Vual may perform an action, ignoring a and b costs.
Engine Implementation
def _vual_sun_does_not_set(
state: GameState, demon: DemonInstance, targets, choices, rng
) -> GameState:
"""#083 Vual — The Sun Does Not Set
Start of Turn, 1 AP, (exhaust): Status: All Demons are considered to have
PWR additional HP. At the end of this Main Phase, Vual may perform an action,
ignoring (exhaust) and (ready) costs.
Applies +PWR status to ALL demons' HP (modeled as "hp" stat modifier).
Vual's PWR is used as the bonus amount (includes fusion bonus via get_effective_pwr).
Status expires end of current main phase (confusion #9 — NOT permanent).
The "may perform an action at end of phase" deferred effect is out of scope
for this batch (requires turn-sequence integration).
"""
from engine.operations import get_effective_pwr
from engine.status_effects import apply_status
from engine.targeting import get_all_demons
pwr = get_effective_pwr(state, demon)
if pwr <= 0:
return state
all_demons = get_all_demons(state)
for d in all_demons:
state = apply_status(state, demon, d, "hp", pwr)
# Mark Vual for a bonus action at end of main phase.
# "Vual may perform an action, ignoring (exhaust) and (ready) costs."
# The turn_sequence checks for this status in end_main_phase.
state = apply_status(state, demon, demon, "sun_bonus_action", 1)
return state
register_ability("083", 1, _vual_sun_does_not_set)