'use client'; import { useState } from 'react'; import { territory, splitLocation } from '@/game/board'; import type { Action, GameView } from '@/game/engine'; import { fighterCount } from '@/game/advisors'; import { Button } from './ui/button'; import { Input } from './ui/input'; export function FaceDanceDecision({ game: g, act, busy, }: { game: GameView; act: (a: Action) => void; busy: boolean; }) { const d = g.decision; const me = g.players.find((p) => p.id === g.me)!; const world = d?.kind === 'faceDance' ? g.combatLocations?.find( (place) => place.id === d.territory && place.kind === 'homeworld', ) : undefined; const foreign = d?.kind === 'faceDance' ? world?.forces?.[d.winner] : undefined; const maximum = d?.kind === 'faceDance' ? world ? (foreign?.normal ?? 0) + (foreign?.elite ?? 0) : d.winners ? g.players.reduce((sum, player) => sum + (d.winners!.includes(player.id) ? fighterCount(player, d.territory) : 0), 0) : fighterCount(g.players.find((player) => player.id === d.winner)!, d.territory) : 0; const [sources, setSources] = useState>( world ? {} : { reserves: Math.min(me.reserves, maximum), }, ); const [sector, setSector] = useState( d?.kind === 'faceDance' && !world ? territory(d.territory).sectors[0] : 0, ); if (d?.kind !== 'faceDance') return null; const held = me.faceDancers?.some( (c) => !c.revealed && c.leader === d.identity, ); const total = Object.values(sources).reduce((sum, n) => sum + n, 0); const availableSources = world ? me.forces : { reserves: me.reserves, ...me.forces }; return ( <>

Face Dancer opportunity

{g.players.find((p) => p.id === d.winner)?.name} won in{' '} {world?.name ?? territory(d.territory).name}. Their battle rewards remain theirs.

{d.blocked && ( {d.blocked} )} {held ? ( <>

Return the {d.winners ? 'winning allied side’s' : 'winner’s'} {maximum} remaining forces to reserves. Replace up to {maximum} with your forces. The selected winning leader goes to the tanks without a spice bounty.

{world && (

Your native forces already at {world.name} remain there. Choose any additional replacement forces from your positions on Arrakis, or reveal with zero additional forces.

)} {Object.entries(availableSources).map(([key, available]) => ( ))} {!world && ( )}

{total} / {maximum} replacement forces selected

) : (

You have no unrevealed Face Dancer matching the winning leader.

)} ); }