import { useState } from 'react'; import { Swords, TrendingUp, Shield, Users, Brain, ShoppingCart } from 'lucide-react'; import { useGameStore } from '@/store'; import { ConfirmModal } from '@/components/common/ConfirmModal'; import { Tooltip } from '@/components/common/Tooltip'; import { formatMoney, formatNumber } from '@ai-tycoon/shared'; import type { Era } from '@ai-tycoon/shared'; const ARCHETYPE_LABELS: Record = { 'safety-first': 'Safety-First Lab', 'move-fast': 'Move-Fast Startup', 'big-tech': 'Big Tech Giant', 'open-source': 'Open Source Maximalist', 'stealth-startup': 'Stealth Startup', }; const ARCHETYPE_COLORS: Record = { 'safety-first': 'text-green-400', 'move-fast': 'text-red-400', 'big-tech': 'text-blue-400', 'open-source': 'text-orange-400', 'stealth-startup': 'text-purple-400', }; export function CompetitorsPage() { const rivals = useGameStore((s) => s.competitors.rivals); const industryBenchmark = useGameStore((s) => s.competitors.industryBenchmark); const playerBest = useGameStore((s) => s.models.bestDeployedModelScore); const era = useGameStore((s) => s.meta.currentEra); const money = useGameStore((s) => s.economy.money); const acquireCompetitor = useGameStore((s) => s.acquireCompetitor); const canAcquire = (era: Era) => era === 'bigtech' || era === 'agi'; const [acquireConfirm, setAcquireConfirm] = useState<{ id: string; name: string; cost: number } | null>(null); return (

Competitors

Industry Benchmark: {industryBenchmark.toFixed(1)}

Your Position

Best Model
{playerBest.toFixed(1)}/100
{rivals.filter(r => r.status === 'active').map(rival => (
))}
You: {playerBest.toFixed(1)} {rivals.filter(r => r.status === 'active').map(rival => ( {rival.name}: {rival.estimatedCapability.toFixed(1)} ))}
{rivals.map(rival => (

{rival.name}

{ARCHETYPE_LABELS[rival.archetype]}
{canAcquire(era) && rival.status === 'active' && (() => { const cost = rival.estimatedRevenue * 500 + rival.estimatedCapability * 100_000; return (
{money < cost && (
Need {formatMoney(cost - money)} more
)}
); })()} {rival.status}
{Object.entries(rival.personality).map(([key, val]) => (
{key.replace(/([A-Z])/g, ' $1').trim()}
))}
))}
{rivals.length === 0 && (

No competitors detected yet.

)} {acquireConfirm && ( { acquireCompetitor(acquireConfirm.id); setAcquireConfirm(null); }} onCancel={() => setAcquireConfirm(null)} /> )}
); } function Stat({ icon: Icon, label, value, sub }: { icon: typeof Brain; label: string; value: string; sub?: string; }) { return (
{label}
{value}
{sub &&
{sub}
}
); }