Support staged group Emperor aid
Verify and publish checkpoint container / container (push) Successful in 10m13s

This commit is contained in:
Quintine committed 2026-10-28 23:33:37 +11:00
1 parent b89c225d5b
commit 9081249574
10 files changed
+413 -17

No files matched your search

+20 -6
View File
@@ -16060,6 +16060,14 @@ function coalitionFundingAvailable(g: Game, p: Player, committedBid = false): bo
const group = coalitionRule(() => coalitionOf(g.players, g.coalitionState, p.id));
return group?.members.length === 3;
}
function coalitionEmperorGroup(g: Game, p: Player) {
if (!g.coalitionState || p.faction !== 'emperor' || g.status !== 'playing' || g.advanced ||
g.expansions.length || g.homeworlds || g.nexusCards || g.leaderSkills || g.techTokens ||
g.strongholdCards || g.ecazTreachery || g.discoveryEnabled ||
!g.players.every(seat => ['atreides', 'beneGesserit', 'emperor', 'fremen', 'guild', 'harkonnen'].includes(seat.faction))) return null;
const group = coalitionRule(() => coalitionOf(g.players, g.coalitionState, p.id));
return group?.members.length === 3 ? group : null;
}
function guildGroupAlly(g: Game, p: Player): boolean {
return coalitionRule(() => groupGuildShipmentRate(g.players, p.id, g.coalitionState));
}
@@ -44640,11 +44648,12 @@ function applyActionInner(
return g;
}
if (t === 'emperorGift' || t === 'emperorRevival') {
requireRule(
p.faction === 'emperor' && p.ally,
'Only the Emperor may use this power for an ally.',
);
const recipient = getPlayer(g, p.ally);
const group = coalitionEmperorGroup(g, p);
const recipientId = group ? stringField(action.target) : p.ally;
requireRule(p.faction === 'emperor' && recipientId &&
(group ? recipientId !== id && group.members.includes(recipientId) : recipientId === p.ally),
'Only the Emperor may use this power for an ally.');
const recipient = getPlayer(g, recipientId);
if (t === 'emperorRevival') {
requireRule(
!revivalPrevented(g, recipient.id),
@@ -44685,7 +44694,7 @@ function applyActionInner(
);
if (t === 'emperorRevival')
requireRule(
p.spice >= paidForceRevivalCost(recipient, amount, elite),
uncommittedSpice(g, p) >= paidForceRevivalCost(recipient, amount, elite),
'Not enough spice for these extra revivals.',
);
if (liveShipmentPromises(g.shipmentPromises ?? [], p.id, g.turn).length ||
@@ -47019,6 +47028,11 @@ export function viewGame(state: Game, id: string, now?: number) {
? g.aid[me.ally].amount
: 0,
},
coalitionEmperor: (() => {
const group = coalitionEmperorGroup(g, me);
return group ? {allies: group.members.filter(member => member !== id),
availableSpice: Math.max(0, uncommittedSpice(g, me))} : null;
})(),
coalitionFunding: coalitionFundingAvailable(g, me) ? (() => {
const group = coalitionRule(() => coalitionOf(g.players, g.coalitionState, id))!;
const pledges = g.coalitionEscrow!.pledges;