Keep Atomics penalties on original targets after alliance changes

This commit is contained in:
Quintine committed 2026-10-14 21:06:32 +11:00
1 parent 1f38f12beb
commit 4bf6cfc875
15 files changed
+303 -181

No files matched your search

+7 -14
View File
@@ -49,7 +49,6 @@ import { NexusAdvisors } from './nexus-advisors';
import { NexusSardaukar } from './nexus-sardaukar';
import { TerrorBoardMarkers } from './terror-board-markers';
import { homeworldRevivalActionBlock } from '@/game/homeworld-revival-deployment-options';
import { atomicsAllianceChangeBlocked } from '@/game/moritani-atomics';
import { GuildHomeworldShipment } from './guild-homeworld-shipment';
import { JunctionTransport } from './junction-transport';
import { BiddingEnd } from './bidding-end';
@@ -3954,29 +3953,23 @@ export function GameTable({
<option value="">Choose a player</option>
{g.players
.filter((p) => p.id !== me.id)
.map((p) => {
const atomicsBlocked = atomicsAllianceChangeBlocked(g.moritaniAtomics, me.id, p.id);
return <option value={p.id} key={p.id}
disabled={!!g.homeworldAllianceBlocks?.[p.id] || atomicsBlocked}>
.map((p) => (
<option value={p.id} key={p.id}
disabled={!!g.homeworldAllianceBlocks?.[p.id]}>
{p.name}
{g.homeworldAllianceBlocks?.[p.id] ? ` · ${g.homeworldAllianceBlocks[p.id]}` : ''}
{atomicsBlocked ? ' · Atomics alliance ruling pending' : ''}
{g.allianceOffers[p.id] === me.id ? ' · Invited you' : ''}
</option>;
})}
</option>
))}
</select>
</label>
{g.homeworldAllianceBlocks?.[target] && <p className="notice">{g.homeworldAllianceBlocks[target]}</p>}
{!!target && atomicsAllianceChangeBlocked(g.moritaniAtomics, me.id, target) &&
<p className="notice">Changing Moritani’s ally after Atomics awaits a hand-limit ruling.</p>}
{actionButton('Propose / accept alliance', {
type: 'alliance',
target,
}, !target || !!g.homeworldAllianceBlocks?.[target] ||
atomicsAllianceChangeBlocked(g.moritaniAtomics, me.id, target))}
}, !target || !!g.homeworldAllianceBlocks?.[target])}
{me.ally &&
actionButton('Break alliance', { type: 'alliance' },
atomicsAllianceChangeBlocked(g.moritaniAtomics, me.id, null))}
actionButton('Break alliance', { type: 'alliance' })}
</>
)}
{g.phase === 1 && !g.nexus && !g.spiceWindow && (
+5 -1
View File
@@ -264,6 +264,8 @@ export function MoritaniTerrorSupply({ game }: { game: GameView }) {
<p className="mt-1 mb-0">
A lasting hand-limit reduction of one applies to {affectedNames}.
Any excess cards were discarded at random when Atomics resolved.
The provisional penalty stays on these original players if alliances
later change; a new ally does not inherit it.
</p>
</div>
)}
@@ -597,7 +599,9 @@ export function MoritaniEntry({
otherwise legal movement or Sneak Attack. Your hand limit
falls by one starting this turn; your ally’s at activation
does too, if you have one. Each hand over its new limit
discards one random card per excess card.
discards one random card per excess card. Under the provisional
persistent-target interpretation, later alliance changes do not
move this penalty to a new ally.
</p>
)}
{entry.kind === 'sneakAttack' && sneak && (