Scorpio
Unit #062
| HP | PWR | CP | Speed | Range | Tier |
|---|---|---|---|---|---|
| 15 (+9) | 7 (+5) | 4 (+3) | Slow | Local | D |
Abilities
Range
Scorpio can only Fuse with a Demon with Range: ^Local.^
Engine Implementation
def _scorpio_fusion_restriction_noop(state, demon) -> dict:
"""No-op passive registering ability index 0 for Scorpio.
The actual fusion restriction logic is in scorpio_can_fuse_with().
This registration ensures the ability slot is tracked.
"""
return {}
register_passive("062", 0, _scorpio_fusion_restriction_noop)
Passive
Scorpio has +1 AP Cost on all actions.
Engine Implementation
def _scorpio_ap_cost(state: GameState, demon: DemonInstance) -> dict[str, int]:
return {"ap_cost": 1}
register_passive("062", 1, _scorpio_ap_cost)
Passive
After Scorpio resolves an action targeting Any Demon(s), move the targeted Demon(s) 1 or 2 Lanes Away From Scorpio.
Engine Implementation
def _scorpio_post_action_push(
state,
event,
demon,
depth: int,
):
"""After Scorpio uses an ability, push the target demon away from Scorpio.
Fires on ABILITY_USED. Moves the targeted demon the maximum possible
distance away from Scorpio (1 or 2 lanes, capped by board bounds).
event.source = Scorpio (the acting demon)
event.target = the targeted demon
event.lane = Scorpio's lane at time of action
"""
# Only fire for this Scorpio's own actions
if event.source is None:
return None
if event.source.instance_id != demon.instance_id:
return None
if event.target is None:
# Untargeted ability — no push
return None
new_state = copy.deepcopy(state)
target_in_state = next(
(d for d in new_state.demons if d.instance_id == event.target.instance_id),
None,
)
if target_in_state is None:
return None
scorpio_lane = demon.lane
# Determine direction away from Scorpio
if target_in_state.lane > scorpio_lane:
# Target is to the right — push right (increasing lane)
direction = 1
elif target_in_state.lane < scorpio_lane:
# Target is to the left — push left (decreasing lane)
direction = -1
else:
# Target is in same lane (local) — push in whichever direction is possible
# Prefer pushing to the right; if at right edge, push left
direction = 1 if scorpio_lane < LANE_COUNT - 1 else -1
# Move target the maximum distance away (2 lanes preferred, 1 if at edge)
target_lane = target_in_state.lane
for _ in range(2):
next_lane = target_lane + direction
if 0 <= next_lane < LANE_COUNT:
target_lane = next_lane
else:
break
target_in_state.lane = target_lane
return new_state
register_trigger("062", 2, _scorpio_post_action_push)