Prototype Leader Skills setup, battle disciplines and capture

Connect all fourteen physical skills and private setup to five card-role battle
modifiers, public posture, Harkonnen skilled capture, death return and optional
own-leader revival through controls, legal AI and persisted room actions.
Nine skill effects and combined-mode/publication acceptance remain unfinished.
Captured replacement entitlement and foreign ghola integration stay guarded.

Fresh publisher/designer research supports skilled-capture publicity through
its unique known physical card; this is recorded as a component inference.
Independent review found and fixed Voice/must-use-leader and invalid saved
assignment/offer cases. A pre-existing Discovery privacy assertion confused
card ID prefixes; the corrected deterministic physical-pair scenario was
independently reviewed. The first broad run was 4410/4411; corrected final
verification passes types/lint, all 4411 offline tests, build and 43 HTTP tests.
Final durations: check 149741ms, build 6659ms, integration 28274ms.
Source fingerprint: aef655ac1ebc0eb2f64294e13d3d27337167312cf8ab17568a166ee9c39f6a85.
Private final report: 20260913-leader-skills/checks-final/report.json.

Three seeded prototype games completed with no rejected bot candidates. Browser
setup/card inspection/refresh passed. Another user-reported power outage stopped
the server; backup and necessary restart restored the same private seat. All
292 games at restart and their original application records remain unchanged;
33 isolated HTTP-test rooms bring the current total to 325. No database reset.

Efficiency: one shared setup/lifecycle implementation supports five connected
role effects; selective existing agents handled catalog/UI/tests/research and
independent reviews. One repeated broad check was required by the reproduced
ID-prefix assertion failure. Aggregate goal counter rose from 65529766 to
67313673 through this checkpoint (1783907), including inherited context and
coordination; this is not a billing or savings estimate. Full goal remains active.
This commit is contained in:
Quintine committed 2026-09-13 17:31:37 +10:00
1 parent 369371671f
commit 6e6fecc9d4
28 files changed
+4196 -38

No files matched your search

+150
View File
@@ -0,0 +1,150 @@
/** Canonical summaries of the fourteen physical CHOAM & Richese Leader Skill
* cards. This reference catalog does not enable the optional module or execute
* its effects. Source and lifecycle contract: docs/LEADER_SKILLS_RULES.md. */
export const LEADER_SKILL_CARDS = [
{
id: 'bureaucrat',
name: 'Bureaucrat',
normal: [
'Once per phase, when another player pays at least 5 spice to a player other than you, you may redirect 2 of that payment to the Spice Bank.',
],
battle: [
'Your opponent subtracts 1 from their battle total for each stronghold they occupy; Bene Gesserit advisors do not count as occupation for this penalty.',
],
},
{
id: 'spice-banker',
name: 'Spice Banker',
normal: [
'Once per phase, when another player pays at least 4 spice to the Spice Bank, place 1 spice in front of your shield and collect it during the Mentat Pause.',
],
battle: [
'Commit 1–3 spice with your Battle Plan and add the same amount to this leader’s strength.',
'This payment is separate from spice paid to make forces fight at full strength.',
],
},
{
id: 'diplomat',
name: 'Diplomat',
normal: [
'When you play no defense, one Worthless card in your Battle Plan may count as the defense your opponent used in that battle; discard the Worthless card afterward.',
],
battle: [
'If you lose, retreat undialed forces up to this leader’s strength to one empty adjacent territory that is not a stronghold.',
],
},
{
id: 'mentat',
name: 'Mentat',
normal: [
'Before Battle Plans, name a specific weapon and ask whether your opponent holds it. They reveal that card if held, or a different Treachery Card otherwise.',
'Revealing the named weapon does not require your opponent to use it.',
],
battle: ['Add 2 to this leader’s strength.'],
},
{
id: 'suk-graduate',
name: 'Suk Graduate',
normal: [
'After you win a battle and lose forces, return 1 such force to reserves instead of the Tleilaxu Tanks.',
],
battle: [
'After you win and lose forces, save up to 3 of them from going to the Tleilaxu Tanks: leave 1 in the battle territory and return the rest to reserves.',
],
},
{
id: 'rihani-decipherer',
name: 'Rihani Decipherer',
normal: [
'After you win a battle, secretly inspect 2 random cards from the Traitor Deck, then reshuffle them into that deck.',
],
battle: [
'After you win, draw 2 Traitor Cards and keep 1 by revealing an unused Traitor Card you already hold.',
'Shuffle the revealed card and the unkept drawn card into the Traitor Deck.',
],
},
{
id: 'sandmaster',
name: 'Sandmaster',
normal: [
'When moving forces into or through a territory containing spice, you may immediately collect 1 spice there, once per territory traversed.',
],
battle: [
'After winning a battle in a territory that contains spice, add 3 spice to that territory.',
],
},
{
id: 'smuggler',
name: 'Smuggler',
normal: [
'When shipping forces from off-planet to an empty territory, one additional force may accompany that shipment for free.',
],
battle: [
'When Battle Plans are revealed, collect spice from the battle territory equal to this leader’s strength, limited by the spice present and subject to the skilled leader surviving the battle.',
],
},
{
id: 'planetologist',
name: 'Planetologist',
normal: [
'For a movement, either add 1 to movement range, capped at 3, or move forces from two different territories when both groups share one destination.',
],
battle: [
'In place of a weapon, reveal a green Special card other than a Cheap Hero and add 2 to this leader’s strength.',
'Discard that Special card after the battle.',
],
},
{
id: 'warmaster',
name: 'Warmaster',
normal: [
'Add 1 to your other leader discs when their Battle Plan contains at least one Worthless card.',
],
battle: [
'Add 3 to this leader’s strength when its Battle Plan contains at least one Worthless card.',
],
},
{
id: 'master-of-assassins',
name: 'Master of Assassins',
normal: ['Add 1 to your other leader discs when they use a Poison Weapon.'],
battle: ['Add 3 to this leader’s strength when it uses a Poison Weapon.'],
},
{
id: 'swordmaster-of-ginaz',
name: 'Swordmaster of Ginaz',
normal: [
'Add 1 to your other leader discs when they use a Projectile Weapon.',
],
battle: [
'Add 3 to this leader’s strength when it uses a Projectile Weapon.',
],
},
{
id: 'killer-medic',
name: 'Killer Medic',
normal: [
'Add 1 to your other leader discs when they use a Poison Defense.',
],
battle: ['Add 3 to this leader’s strength when it uses a Poison Defense.'],
},
{
id: 'prana-bindu-adept',
name: 'Prana Bindu Adept',
normal: [
'Add 1 to your other leader discs when they use a Projectile Defense.',
],
battle: [
'Add 3 to this leader’s strength when it uses a Projectile Defense.',
],
},
] as const;
export type LeaderSkillCard = (typeof LEADER_SKILL_CARDS)[number];
export type LeaderSkillId = LeaderSkillCard['id'];
export function leaderSkillCard(id: LeaderSkillId): LeaderSkillCard {
const card = LEADER_SKILL_CARDS.find((candidate) => candidate.id === id);
if (!card) throw new Error('Unknown Leader Skill Card.');
return card;
}