Connect printed Diplomat defenses and Ecaz Tanked Duke Cunning

This commit is contained in:
Quintine committed 2026-10-08 19:05:08 +11:00
1 parent 039fe4e87f
commit be8703dc51
17 files changed
+811 -182

No files matched your search

+19 -2
View File
@@ -1,7 +1,8 @@
'use client';
import type { Action, GameView } from '@/game/engine';
import { battleCardLabel } from '@/game/battle-cards';
import { isPortableSnooper } from '@/game/battle-cards';
import { copiedDefenseKind, diplomatDefenseLabel } from '@/game/diplomat-defense';
import { Button } from './ui/button';
export function DiplomatDefense({
@@ -20,7 +21,16 @@ export function DiplomatDefense({
const visibleCards = [...(game.battle?.cards ?? []), ...(me?.hand ?? [])];
const card = (id: string) => visibleCards.find((entry) => entry.id === id);
const source = card(decision.source);
const copiedDefense = source ? battleCardLabel(source.kind) : 'defense';
const copiedKind =
game.battle?.diplomatDefense?.kind ?? copiedDefenseKind(source);
const copiedDefense = copiedKind
? diplomatDefenseLabel(copiedKind)
: 'defense';
const interpretedRole =
copiedKind === 'shieldSnooper' ||
copiedKind === 'weirdingWay' ||
copiedKind === 'chemistry' ||
isPortableSnooper(source);
return (
<div className="flex flex-col gap-3" aria-label="Diplomat defense choice">
<p>
@@ -34,6 +44,13 @@ export function DiplomatDefense({
must be discarded after this battle. Decline to proceed without a copied
defense.
</p>
{interpretedRole && (
<p className="fine" data-copied-role-interpretation="true">
First-version interpretation: copy the defense role already used by
the opponent, not its activation, late-play opportunity or requirement
for another card in your own plan.
</p>
)}
{decision.cards.map((id) => (
<Button
key={id}
+2 -2
View File
@@ -16,8 +16,8 @@ export function NexusEcazDuke({ game, act, busy }: Props) {
<section aria-label="Your Ecaz Nexus Duke Cunning" className="space-y-3 rounded-lg border border-[#a88b60]/50 p-3">
<h3>Ecaz Nexus · Cunning · Duke Prad Vidal</h3>
<p>Current public controller: {offer.dukeController ? controller?.name ?? 'another player' : 'none'}.</p>
<p>Spend and discard your physical Ecaz Nexus card to take the living, uncaptured, non-Ghola Duke for this turn, even from Moritani. If unused, this temporary control expires at turn end; using him in battle consumes the shared Duke.</p>
<p className="fine">The printed Tanks revival, capture, and Ghola effects are not supported by this Cunning action.</p>
<p>Spend and discard your physical Ecaz Nexus card to take the uncaptured, non-Ghola Duke for this turn, even from Moritani or the Tanks. A Tanked acquisition revives the same shared disc without a separate paid revival and preserves his death history. If unused, this temporary control expires at turn end; using him in battle sets the shared Duke aside.</p>
<p className="fine">This independent resurrection clears his prior battle-use stamp and permits a new battle use. Taking a living Duke does not clear a battle-use stamp. That use composition is provisional; capture and Ghola acquisition/return destinations remain unsupported, as does Duke battle use with Advanced Harkonnen.</p>
{offer.blocked && <p className="notice">{offer.blocked}</p>}
<Button className="game-action min-h-11 whitespace-normal" disabled={busy || !action}
onClick={() => { if (!busy && action) act(action); }}>