Support staged group Fremen revival grants
Verify and publish checkpoint container / container (push) Canceled after 0s

This commit is contained in:
Quintine committed 2026-10-28 23:37:46 +11:00
1 parent 9081249574
commit d8d2e7207b
9 files changed
+277 -15

No files matched your search

+22
View File
@@ -15,6 +15,28 @@ export function FremenRevivalGrant({
}) {
const grant = game.fremenRevivalGrant;
const me = game.players.find((player) => player.id === game.me);
const group = game.fremenGroupRevivalGrant;
if (group && game.status === 'playing' && game.phase === 4 && me?.faction === 'fremen') {
const busyWindow = busy || !!game.truthtrance || !!game.nexusTraitors?.pending;
return (
<section className="notice space-y-3" aria-label="Fremen group ally free revival">
<h3 className="font-serif text-xl">Fremen group revival</h3>
<p className="muted">Choose an ally to receive the ordinary Fremen free-revival rate of three for this phase. This replaces their native rate; normal revival limits still apply.</p>
<p className="fine">The grant to each ally is a provisional interpretation of the larger-alliance rule. Each declaration opens a Karama response.</p>
{group.map(option => {
const name = game.players.find(player => player.id === option.recipient)?.name ?? 'Ally';
return <div key={option.recipient}>
{option.granted && <p className="fine">Free revival has been granted to {name}.</p>}
{option.blocked && !option.granted && <p className="fine">{name}: {option.blocked}</p>}
<Button className="game-action" disabled={busyWindow || option.granted || !!option.blocked}
onClick={() => act({type:'grantRevival', target:option.recipient})}>
Grant {name} free revival <ArrowRight size={15} />
</Button>
</div>;
})}
</section>
);
}
if (!grant || game.status !== 'playing' || game.phase !== 4 ||
me?.faction !== 'fremen' || me.ally !== grant.recipient) return null;
const recipient = game.players.find((player) => player.id === grant.recipient)?.name ?? 'your ally';