← all tickets

58 — Implement: Lionsmane (36041)

Status: done

What to build: Implement 36041 — Lionsmane (vp ice, Sentry - AP, rez 6, str 4). Subroutines: 1. "Do 2 net damage." 2. "Do 2 net damage unless the Runner pays 3[credit]." 3. "Do 2 net damage unless the Runner jacks out."

Follow docs/adding-a-card.md: hook block in rust/netrunner-core/src/cards/vp.rs, ≥1 card_36041_* test, flags in game/cards_impl/vp.json.

Watch out for: subs 2 and 3 are Runner "unless" decisions during subroutine resolution — check whether an existing sub offers a Runner pay-or-suffer choice to pattern-match (Tithe 30073 and Ping 30055 are implemented sg ice; Anoetic Void 30050 has a Corp pay-or-else shape). Sub 3's "unless the Runner jacks out" must actually end the run when chosen, and can't be chosen if jacking out isn't legal (e.g. cannot-jack-out effects, if the engine models any). Runner with <3 credits gets no pay option on sub 2.

Comments

No Runner pay-or-suffer sub existed to copy. Funhouse's "give the Runner 1 tag unless they pay 4" (engine::fire_subroutine pattern 13) pays automatically whenever the Runner can afford it — the Runner is never asked. That is a real approximation, but it is a tag, where paying is nearly always right; 2 net damage against 3 credits is a genuine choice, so Lionsmane opens a decision (DecisionData::Lionsmane) instead. Both subs share one decision kind with an escape discriminator, the Cultivate-stage pattern.

Cannot-jack-out is not modelled, so sub 3 always offers the escape. RunState::jack_out is written (Ansel 1.0's third subroutine sets it false) and read by nobody, and no implemented card prints a cannot-jack-out effect. Gating on that flag today would remove an option the Runner really has; the comment on cards::vp::lionsmane_jack_or_damage marks the line that learns to check it when such a card lands.