Connect source-ordered Advanced Ecaz new-ally Duke grant

This commit is contained in:
Quintine committed 2026-10-08 10:14:08 +11:00
1 parent 5e293f567a
commit 59a406830c
9 files changed
+95 -22

No files matched your search

+1 -1
View File
@@ -23,7 +23,7 @@ import { TERRITORIES } from '@/game/board';
import { faction } from '@/game/catalog';
export const AMBASSADOR_COVERAGE =
'Development coverage: Ambassador placement, Ecaz’s direct Duke acquisition and consensual alliance, Emperor, Atreides, Harkonnen, CHOAM, Ixian, Richese, Fremen, Guild and Tleilaxu entry effects are supported, plus Bene Gesserit copies. The Tleilaxu effect offers physical force returns or a first-death own-leader revival. Basic Ecaz can optionally lend Duke to a newly accepted ally, with provisional one-battle/turn-end tenure. Ordinary revival accounting, repeat-death/shared-leader cases, Advanced loans and competing arrival reactions remain for refinement; full Ecaz starts remain disabled.';
'Development coverage: Ambassador placement, Ecaz’s direct Duke acquisition and consensual alliance, Emperor, Atreides, Harkonnen, CHOAM, Ixian, Richese, Fremen, Guild and Tleilaxu entry effects are supported, plus Bene Gesserit copies. The Tleilaxu effect offers physical force returns or a first-death own-leader revival. Basic offers an optional new-ally Duke loan; Advanced automatically grants the available Duke after accepted alliance consent. One-battle loan tenure is provisional; an unused living loan is set aside at turn end. Ordinary revival accounting, repeat-death/shared-leader cases and competing arrivals remain for refinement; full Ecaz starts remain disabled.';
function tokenLocation(token: AmbassadorToken) {
if (token.zone === 'placed')
return `Placed in ${TERRITORIES.find((t) => t.id === token.location)?.name ?? 'a stronghold'}`;
+16 -4
View File
@@ -72,6 +72,13 @@ export function EcazEntry({
{game.players.find((p) => p.id === entry.entrant)?.name} entered this
stronghold. {guide.gameplay}
</p>
{game.advanced && entry.effect === 'ecaz' && (
<p className="fine">
Advanced source override: supplied rulebook, physical page 30, adds an
available Duke after accepted alliance consent automatically. The
publisher token guide’s optional loan wording above remains Basic guidance.
</p>
)}
{token && <AmbassadorInspector token={token} />}
{entry.stage === 'offer' ? (
<>
@@ -141,8 +148,10 @@ export function EcazEntry({
<p className="m-0 text-sm leading-6">
Both factions must be unallied. The entrant chooses whether to
accept. The triggered Ambassador returns to supply even if the
offer is refused. In Basic, an accepted alliance can be followed
by an optional Duke loan when the disc is available.
offer is refused.{' '}
{game.advanced
? 'In Advanced, accepting also adds an available Duke to the entrant’s pool automatically. The first version uses one-battle tenure and sets an unused living Duke aside at turn end.'
: 'In Basic, an accepted alliance can be followed by an optional Duke loan when the disc is available.'}
</p>
</>
) : (
@@ -195,8 +204,11 @@ export function EcazEntry({
<p className="m-0 text-sm leading-6">
{game.players.find((p) => p.id === entry.owner)?.name} offers you an
alliance. Accepting activates both factions’ alliance abilities
immediately. In Basic, Ecaz can then optionally lend an available
Duke Vidal. Your remaining actions resume after those choices.
immediately.{' '}
{game.advanced
? 'An available Duke Vidal is added to your pool automatically, without a second acknowledgement. One-battle tenure is provisional; an unused living Duke is set aside at turn end.'
: 'In Basic, Ecaz can then optionally lend an available Duke Vidal.'}{' '}
Your remaining actions then resume.
</p>
<Button
className={buttonClass}