Connect Sapho first and last to Extortion payer choices

Apply the printed ordered-action alternative provisionally to the unanswered native Extortion suffix. Preserve collected bank5, completed declines, payer membership, one payment3 and placement-first policy. Replay a public local-order receipt and retain it through ledger answers; expire the old payer event even when the same player remains next. Permit only the exact current Extortion decision as a clean Sapho window. Add persistent remaining-order/card controls and existing minimal policy participation. The typed Semuta suffix parks one updated payer decision and restores it without paying, advancing or recollecting.

Validation:9-file115/115, types/lint/build and six original public Basic/Advanced host/setup/paid-cache1/placed-Terror/paid-entry1/reveal/Mentat-placement-before-bank5 programmes. An actual earlier decline stays finished; first/payment3 and last/payment3 or all-decline preserve native retirement/recovery. Four profiles make eight legal holder/payer proposals and complete. Public order and private payer affordability render in actual GameTable plus enabled/busy controls. Pure replay/no-op/recovered reuse cases are separate. Bounded source/continuation review found no concrete defect.

Extortion/Sapho boundary is provisional. Direct combined Semuta claim/capture, broader combinations, complete modes, final assurance and browser/deployed acceptance remain open. No saved-room/database/reset/restart/deployment operation.
This commit is contained in:
Quintine committed 2026-10-18 14:07:08 +11:00
1 parent 2d89ddb6e1
commit 6c83148ead
14 files changed
+855 -16

No files matched your search

+4
View File
@@ -18,12 +18,16 @@ export function MoritaniExtortionNotice({ game }: { game: GameView }) {
</p>
)}
{pending && (
<>
<p>
Moritani has collected the bank award. {payer?.name ?? 'The current player'}
{' '}may pay {pending.amount} spice to prevent Extortion’s return, or decline.
The first payment ends the opportunity; if everyone declines, the token
returns to Moritani’s hidden supply.
</p>
<p>Remaining choices: {pending.remaining.map(id => game.players.find(player => player.id === id)?.name ?? id).join(' → ')}.</p>
{pending.saphoReordered && <p>Juice of Sapho changed the remaining order. Earlier declines stay finished.</p>}
</>
)}
</section>
);