Prototype unlimited alliance variant
Verify and publish checkpoint container / container (push) Canceled after 0s

This commit is contained in:
Quintine committed 2026-10-29 00:33:42 +11:00
1 parent 37acaeb9d2
commit 9cb65a21f5
23 files changed
+677 -52

No files matched your search

+6 -5
View File
@@ -16112,7 +16112,7 @@ function coalitionFundingAvailable(g: Game, p: Player, committedBid = false): bo
g.revivalPromises, g.leaderRevivalPromises, g.revivalExpressionPromises,
g.bribePromises, g.bribeExpressionPromises].some(unsettledPromises))) return false;
const group = coalitionRule(() => coalitionOf(g.players, g.coalitionState, p.id));
return group?.members.length === 3;
return !!group && group.members.length >= 3;
}
function coalitionEmperorGroup(g: Game, p: Player) {
if (!g.coalitionState || p.faction !== 'emperor' || g.status !== 'playing' || g.advanced ||
@@ -16120,7 +16120,7 @@ function coalitionEmperorGroup(g: Game, p: Player) {
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;
return group && group.members.length >= 3 ? group : null;
}
function guildGroupAlly(g: Game, p: Player): boolean {
return coalitionRule(() => groupGuildShipmentRate(g.players, p.id, g.coalitionState));
@@ -44546,14 +44546,14 @@ function applyActionInner(
g.allianceOffers = Object.fromEntries(Object.entries(g.allianceOffers)
.filter(([from, to]) => !members.has(from) && !members.has(to)));
}
log(g, formed ? 'All three players agreed to the group alliance.'
log(g, formed ? 'All participants agreed to the group alliance.'
: action.accept ? `${p.name} approved the group invitation.`
: `${p.name} declined the group invitation; the existing alliance remains.`);
} else {
const result = coalitionRule(() => leaveCoalition(g.players, g.coalitionState,
{actor: id, expectedRevision: revision}));
applyCoalitionTransition(g, result);
log(g, `${p.name} left the group alliance. Remaining partners stay allied if two remain.`);
log(g, `${p.name} left the group alliance. Remaining partners stay allied if at least two remain.`);
}
g.ready = [];
return g;
@@ -44568,7 +44568,7 @@ function applyActionInner(
requireRule(!g.coalitionState.proposal, 'Resolve the group invitation before changing alliances.');
const own = coalitionRule(() => coalitionOf(g.players, g.coalitionState, id));
const otherGroup = target ? coalitionRule(() => coalitionOf(g.players, g.coalitionState, target)) : null;
requireRule(own?.members.length !== 3 && otherGroup?.members.length !== 3,
requireRule(!(own && own.members.length >= 3) && !(otherGroup && otherGroup.members.length >= 3),
'Group members must use the group alliance controls.');
if (target === null && own && g.coalitionState.groups.some(group => group.id === own.id)) {
requireRule(coalitionNexusAvailable(g), 'Group negotiations are unavailable in this Nexus.');
@@ -46825,6 +46825,7 @@ export function viewGame(state: Game, id: string, now?: number) {
groups: coalitionRule(() => coalitionGroups(g.players, g.coalitionState)),
proposal: g.coalitionState!.proposal,
revision: g.coalitionState!.revision,
...(g.coalitionState!.variant ? {variant: g.coalitionState!.variant} : {}),
} : null,
homeworldAllianceBlocks: Object.fromEntries(g.players.filter((p) => p.id !== id)
.flatMap((p) => { const reason = homeworldAllianceReason(g, id, p.id); return reason ? [[p.id, reason]] : []; })),