'use client'; import type { Action, GameView } from '@/game/engine'; import { liveShipmentPromises, matchesShipment, shipmentClaimText } from '@/game/shipment-promises'; import { truthQuestionText } from '@/game/truthtrance'; import { CHEAP_HERO_TRAITOR } from '@/game/traitors'; import { territory } from '@/game/board'; import { reserveShipmentCost, guildShipmentCost } from '@/game/shipment-price'; import { Button } from './ui/button'; export function ShipmentPromises({ game: g, act, busy, }: { game: GameView; act: (action: Action) => void; busy: boolean; }) { const promises = liveShipmentPromises(g.shipmentPromises, g.me, g.turn); if (!promises.length) return null; const me = g.players.find((p) => p.id === g.me)!; const next = g.shipmentCompletion?.actions[0]; const shipping = next && (next.type === 'ship' || next.type === 'guildShip'); const halfRate = g.karamaShipping?.player === me.id || (!g.guildRateCanceled && (me.faction === 'guild' || g.players.some((p) => p.faction === 'guild' && p.id === me.ally))); const cost = shipping ? next.type === 'guildShip' ? guildShipmentCost( String(next.territory) === 'reserves' ? 'reserves' : territory(String(next.territory)).type, Number(next.amount), g.karamaShipping?.player === me.id || !g.guildRateCanceled, ) : reserveShipmentCost( { faction: me.faction, halfRate }, territory(String(next.territory)).type, Number(next.amount), ) : null; const share = shipping ? Number(next.allyPayment ?? Math.max(0, cost! - (me.spice ?? 0))) : 0; const elite = Number(next?.elite ?? 0); const allocation = elite > 0 ? `, including ${elite} ${me.faction === 'emperor' ? 'Sardaukar' : me.faction === 'fremen' ? 'Fedaykin' : 'elite force' + (elite === 1 ? '' : 's')}` : ''; const description = next ? shipping ? `Ship ${Number(next.amount)} forces${allocation} to ${territory(String(next.territory)).name}, sector ${Number(next.sector)}` : next.type === 'pledgeAid' ? 'Reclaim your unused ally pledge' : `Play ${me.hand?.find((c) => c.id === next.card)?.name ?? 'your preparation card'}${next.amount ? ` to revive ${Number(next.amount)} forces${allocation}` : ' for your shipment discount'}` : ''; return (

Your shipment promises

{promises.some((p) => matchesShipment(p, null) !== p.answer) ? (

Complete a qualifying shipment before ground movement or finishing your turn: skipping would not honor the whole claim you answered. You can choose any legal count, sector and funding that honor all your answers. Current facts remain fixed at the time of your answer.

) : (

Skipping shipment honors your whole claims. If you ship, choose a legal shipment that honors every answer. Current facts are historical and create no later card, spice or force holding obligation.

)} {next && (
Suggested next step · private

{description}.

{cost !== null && (

Cost: {cost} spice · Your payment: {cost - share} · Ally pledge:{' '} {share}.

)}
)}
); }