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:
1 parent
2d89ddb6e1
commit
6c83148ead
14 files changed
+855
-16
No files matched your search
@@ -1,3 +1,5 @@
|
||||
import type { SaphoExtortionOrder } from './sapho-extortion';
|
||||
|
||||
/** Isolated Extortion ledger; authorization and Mentat scheduling belong to the engine.
|
||||
* Source: docs/MORITANI_EXTORTION_RULES.md. No placement-relative priority is encoded.
|
||||
*/
|
||||
@@ -16,6 +18,8 @@ export type ExtortionState = {
|
||||
cursor: number;
|
||||
stage: 'reserved' | 'payment' | 'settled';
|
||||
payer: string | null;
|
||||
/** Public ordered-action exception; absent in original storm-order ledgers. */
|
||||
saphoOrder?: SaphoExtortionOrder;
|
||||
};
|
||||
export type ExtortionTransfer =
|
||||
| { from: 'reservedBank'; to: string; amount: 5 }
|
||||
@@ -135,6 +139,7 @@ function clone(state: ExtortionState): ExtortionState {
|
||||
cursor: state.cursor,
|
||||
stage: state.stage,
|
||||
payer: state.payer,
|
||||
...(state.saphoOrder ? {saphoOrder: structuredClone(state.saphoOrder)} : {}),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -209,7 +214,7 @@ export function answerExtortion(
|
||||
);
|
||||
requireValid(
|
||||
state.queue[state.cursor] === playerId,
|
||||
'Wait for your Extortion turn in storm order.',
|
||||
'Wait for your current Extortion payment opportunity.',
|
||||
);
|
||||
requireValid(
|
||||
typeof pay === 'boolean',
|
||||
|
||||
Reference in new issue
Block a user