Skip to main content

Castor

The Gemini

Unit #112

HPPWRCPSpeedRangeTier
7 (+1)22 (+1)NormalLocalC

Abilities

Passive

q: When Castor comes into play, play or Fuse the Familiar Pollux in Any Lane.
Engine Implementation
def _castor_deploy_pollux_trigger(
state: GameState, event: GameEvent, demon: DemonInstance, depth: int
):
"""#112 Castor — Deploy trigger: When Castor enters play, deploy Pollux Familiar.

Fires on DEMON_DEPLOYED. Only activates when the deployed demon IS this
Castor instance (event.source.instance_id == demon.instance_id).

Deploys Pollux (familiar_id="112_1") in Castor's lane if Pollux is in the
owner's familiar_deck and not already in play.

The "or Fuse" clause (fusing Pollux onto an existing demon) is complex and
requires player choice — we implement auto-deploy only; fuse is out of scope.
"""
from engine.operations import deploy_familiar

if event.source is None:
return None
if event.source.instance_id != demon.instance_id:
return None # A different demon deployed — not Castor

POLLUX_ID = "112_1"
owner = demon.owner

# Check if Pollux is already in play
already_in_play = any(d.unit_id == POLLUX_ID for d in state.demons)
if already_in_play:
return None

# Check if Pollux is available in the familiar_deck
if POLLUX_ID not in state.players[owner].familiar_deck:
return None

# Deploy Pollux to Castor's current lane
return deploy_familiar(state, owner, POLLUX_ID, demon.lane)

register_trigger("112", 0, _castor_deploy_pollux_trigger)

Passive

Castor and Pollux also have the abilities of each other's Fused Demons. When Castor or Pollux resolves or applies an ability, if the text uses the keywords Other Demon(s), then it excludes both Castor and Pollux, not just the originating demon.
Engine Implementation
def _pollux_castor_mirror_trigger(state: GameState, event: GameEvent, demon: DemonInstance, depth: int) -> GameState | None:
"""Castor (112) mirror — after Pollux (112_1) acts for the first time in a
Main Phase, Castor may perform the same action with -2 AP Cost.
"""
source = event.source
if source is None:
return None

if source.unit_id != "112_1":
return None
if source.owner != demon.owner:
return None

new_state = apply_status(state, source, demon, "ap_cost", -2)
return new_state

register_trigger("112", 1, _pollux_castor_mirror_trigger)

Reminder

(Fused Demons have both names. Abilities include both passives and actions.)
Castor