Focalor
Sovereign of the Sea
Unit #069
| HP | PWR | CP | Speed | Range | Tier |
|---|---|---|---|---|---|
| 9 (+3) | 5 (+3) | 3 (+2) | Slow | Any | A |
Abilities
The Great Blue Spot — 4 AP
The Great Blue Spot: 4 AP - a: Evenly Divide 3pk Fixed Damage (rounded up) between All Demons in Target Lane.
Engine Implementation
def _focalor_great_blue_spot(state: GameState, demon: DemonInstance, targets, choices, rng) -> GameState:
"""#069 Focalor — The Great Blue Spot
Action, 4 AP, (exhaust): Evenly Divide 3×PWR Fixed Damage (rounded up)
between All Demons in Target Lane.
CRITICAL: "All Demons in Target Lane" INCLUDES your own allies (confusion #21).
Fixed Damage bypasses DEF entirely (use deal_fixed_damage).
PWR uses get_effective_pwr which includes fusion bonus fPWR.
The target lane is specified via choices["lane"]. If not present, falls back
to the first target's lane.
"""
from engine.operations import get_effective_pwr, deal_fixed_damage
from engine.targeting import get_local_demons
# Determine target lane from choices or first target
if choices and "lane" in choices:
target_lane = choices["lane"]
elif targets:
target_lane = targets[0].lane
else:
return state # no target specified, no-op
demons_in_lane = get_local_demons(state, target_lane)
if not demons_in_lane:
return state # empty lane — nothing to hit
total_damage = 3 * get_effective_pwr(state, demon)
n = len(demons_in_lane)
# "rounded up" per demon: math.ceil(total / n)
per_demon = math.ceil(total_damage / n)
for d in demons_in_lane:
state = deal_fixed_damage(state, d, per_demon)
return state
register_ability("069", 0, _focalor_great_blue_spot)
Focus — 0 AP
h: Focus: 0 AP - b, 1x: e: Focalor has +5k and -3n. At the end of this Main Phase, Focalor may perform an action.
Engine Implementation
def _focalor_focus(state: GameState, demon: DemonInstance, targets, choices, rng) -> GameState:
"""#069 Focalor — Focus
Start of Turn, 0 AP, (ready), 1x: Status: Focalor has +5 PWR and -3 DEF.
At the end of this Main Phase, Focalor may perform an action.
Applies +5 PWR and -3 DEF as status effects (expire end of this main phase).
The "may perform an action" at end of phase is a deferred trigger tracked
separately by the turn sequence (not implemented here — just the status).
CRITICAL (confusion #9): Status effects expire end of main phase — NOT permanent.
"""
from engine.status_effects import apply_status
# Re-find Focalor in state (state is already the mutable copy passed to us)
state = apply_status(state, demon, demon, "pwr", 5)
state = apply_status(state, demon, demon, "def", -3)
return state
register_ability("069", 1, _focalor_focus)