import type { CountrySnapshot, WorldSnapshot } from "../types"; import { formatModelStatus, modelStatusClass, shortModelLabel } from "./modelStatus"; import { TooltipLabel } from "./TooltipLabel"; const WIN_SURVIVAL_TICKS = 600; type ScoreboardHeaderProps = { snapshot: WorldSnapshot | null; isWaitingForTick: boolean; }; export function ScoreboardHeader({ snapshot, isWaitingForTick }: ScoreboardHeaderProps) { const simulation = snapshot?.simulation; const countries = snapshot?.countries ?? []; const population = simulation?.population ?? snapshot?.entities.length ?? 0; const tick = snapshot?.tick ?? 0; const survivalProgress = Math.min(1, tick / WIN_SURVIVAL_TICKS); const famineUntil = simulation?.famine_until ?? -1; const isFamineActive = famineUntil >= 0 && tick <= famineUntil; const activityLabel = isWaitingForTick ? "simulating..." : (simulation?.last_tick_source ?? "idle"); return (
Tick {tick} {activityLabel} Population {population} {isFamineActive ? ( FAMINE ({famineUntil - tick}) ) : null}
{countries.length > 0 ? ( countries.map((country) => ( entity.id === country.ruler_id)?.label ?? null } /> )) ) : (
Countries are loading
)}
Survival {Math.min(tick, WIN_SURVIVAL_TICKS)}/{WIN_SURVIVAL_TICKS}
{(simulation?.models ?? []).length > 0 ? (
{(simulation?.models ?? []).map((model) => ( {`${shortModelLabel(model.label)} ${formatModelStatus(model.status)}`} ))}
) : null}
); } type CountryCardProps = { country: CountrySnapshot; rulerName: string | null; tick: number; }; function CountryCard({ country, rulerName, tick }: CountryCardProps) { const treasury = country.treasury?.resources ?? {}; const election = country.next_election_tick <= tick ? "election active" : `election T${country.next_election_tick}`; const cannon = country.cannon ? country.cannon.operator_id ? `cannon: ${country.cannon.operator_id}` : "cannon: no operator" : "no cannon"; return (
{country.badge} {country.name} {country.citizen_ids.length} citizens

{country.policy}

Ruler: {rulerName ?? country.ruler_id ?? "none"} {election} treasury F{treasury.food ?? 0} H{treasury.herbs ?? 0} W{treasury.wood ?? 0} C{treasury.coins ?? 0} {cannon}
); }