Connect Kull bid answers and group transport
Verify and publish checkpoint container / container (push) Successful in 12m6s

This commit is contained in:
Quintine committed 2026-10-29 00:17:48 +11:00
1 parent 420943b890
commit f667383565
16 files changed
+438 -26

No files matched your search

+4 -11
View File
@@ -285,6 +285,7 @@ import { MoritaniAssassinate, MoritaniAssassinateHistory } from './moritani-assa
import { MoritaniExtortion, MoritaniExtortionNotice } from './moritani-extortion';
import { AdvancedAllySeparation } from './advanced-ally-separation';
import { CoalitionNexus } from './coalition-nexus';
import { RosterAlliance } from './roster-alliance';
import { CoalitionFunding, coalitionFundingContributions, type CoalitionFundingContribution } from './coalition-funding';
import { CoalitionEmperorAid } from './coalition-emperor-aid';
import { NexusEmperorPayment } from './nexus-emperor-payment';
@@ -423,7 +424,7 @@ export function GameTable({
const guildTransport =
useGuildSecret ||
me.faction === 'guild' ||
!!g.coalitionFunding && groupGuildShipmentRate(g.players, me.id, g.coalitionState) ||
groupGuildShipmentRate(g.players, me.id, g.coalitionState) ||
g.players.some((p) => p.faction === 'guild' && p.id === me.ally);
const [botFaction, setBotFaction] = useState('');
const [botDifficulty, setBotDifficulty] = useState<Difficulty>('Medium');
@@ -1626,15 +1627,7 @@ export function GameTable({
` · ${g.techTokens![id].spice} spice at phase end`}
</div>
))}
{p.ally && (
<div className="fine">
Allied with{' '}
{
faction(g.players.find((x) => x.id === p.ally)!.faction)
.name
}
</div>
)}
<RosterAlliance game={g} playerId={p.id} />
</div>
))}
{g.status === 'lobby' &&
@@ -2260,7 +2253,7 @@ export function GameTable({
Structured bid, alliance, Revival, bribe and combined turn-action questions are unavailable.
</> : <>
Requires Basic CHOAM with the CHOAM and Ix decks plus each faction’s deck, and no other optional modules.
Phase-wide bid and combined turn-action Truthtrance questions are unavailable.
Combined turn-action Truthtrance questions are unavailable.
When Richese is seated, structured bid, alliance, Revival and bribe commitments are also unavailable,
and some Kull reactions may be unavailable in complex response windows.
</>}{' '}
+23
View File
@@ -0,0 +1,23 @@
'use client';
import { faction } from '@/game/catalog';
import { coalitionAllies } from '@/game/coalition-alliance';
import type { GameView } from '@/game/engine';
/** Alliance membership is public; a staged larger alliance has no scalar
* player.ally value, so use its authoritative public membership ledger. */
export function RosterAlliance({game, playerId}: {
game: Pick<GameView, 'players' | 'coalitionState'>;
playerId: string;
}) {
const player = game.players.find(seat => seat.id === playerId);
if (!player) return null;
const ids = game.coalitionState
? coalitionAllies(game.players, game.coalitionState, playerId)
: player.ally ? [player.ally] : [];
const names = ids.flatMap(id => {
const ally = game.players.find(seat => seat.id === id);
return ally ? [faction(ally.faction).name] : [];
});
return names.length ? <div className="fine">Allied with {names.join(' and ')}</div> : null;
}