'use client'; import { controlsLeader, nativeAvailable } from '@/game/leader-control'; import { useState } from 'react'; import type { Action, GameView } from '@/game/engine'; import { Button } from './ui/button'; import { Input } from './ui/input'; import { revivalTurnOrderBlock } from './revival-turn'; export function RevivalCommerce({ game: g, act, busy, }: { game: GameView; act: (action: Action) => void; busy: boolean; }) { const me = g.players.find((p) => p.id === g.me)!; const tleilaxu = g.players.find((p) => p.faction === 'tleilaxu'); const [selection, setSelection] = useState(''); const [prices, setPrices] = useState>({}); if (!tleilaxu) return null; const orderBlocked = revivalTurnOrderBlock(g); const name = (id: string) => id === 'kwisatz' ? 'Kwisatz Haderach' : (g.allLeaders.find((l) => l.id === id)?.name ?? id); if (me.id === tleilaxu.id) return (

Revival commerce

Allow another faction to revive five forces. Your ally pays for their own revivals; you may offer half price.

{g.advanced && (

Foreign gholas

Fill your active leader pool up to five. A ghola keeps its traitor identity and can be sold back only after it dies.

{g.leaderSkills && (

Reviving a foreign ghola does not draw or assign a Leader Skill. Your native skilled leader keeps its own assignment.

)} {orderBlocked &&

{orderBlocked}

} {g.players .filter((p) => p.id !== me.id) .flatMap((p) => p.leaders) .filter( (l) => l.faction !== me.faction && l.dead && !l.capturedBy && l.name !== 'Auditor', ) .map((l) => { const cost = g.revival.discount ? Math.ceil(l.strength / 2) : l.strength; const unavailable = busy || !!orderBlocked || cost > (me.spice ?? 0) || me.gholaBlocked?.includes(l.id) || me.leaders.filter(leader => !leader.dead && controlsLeader(me, leader)).length >= 5; return ( ); })}
)} {g.players .filter((p) => p.id !== me.id) .map((p) => (
{p.name} · {p.tanks} forces in the tanks{' '}
))} {me.ally && ( )} {Object.entries(g.revivalRequests).map(([id, request]) => (

{g.players.find((p) => p.id === id)?.name} requests{' '} {name(request.leader)}.

{request.declined ? 'Declined' : request.price === null ? 'No quote yet' : `Current quote: ${request.price} spice`}

))}
); const request = g.revivalRequests[me.id]; const deadNative = me.leaders.filter( (l) => l.faction === me.faction && l.dead && !l.capturedBy, ); const hasNative = me.leaders.some( (l) => l.faction === me.faction && nativeAvailable(l), ); const eligible = deadNative.filter((l) => hasNative || l.gholaBy); const canRequest = !g.revival.prevented && !me.leaderRevived && (hasNative || eligible.some((l) => l.gholaBy)); return (

Request a leader revival or ghola buyback

A request and its quoted price are visible only to you and Tleilaxu. No spice is paid until you accept and the response resolves.

{orderBlocked &&

{orderBlocked}

} {request ? ( <>

{name(request.leader)} ·{' '} {request.declined ? 'Request declined' : request.price === null ? 'Awaiting a quote' : `${request.price} spice`}

{request.price !== null && !request.declined && ( )} ) : canRequest && (eligible.length > 0 || me.kwisatz?.dead) ? ( <> ) : (

Early revival needs an available native leader. A dead foreign ghola requires a buyback agreement; other leaders use ordinary revival when all are unavailable.

)}
); }