import { classById, raceById } from "../app/characterCatalog"; import type { CharacterProfile } from "../app/types"; export interface PlayerFrameMeter { current: number; maximum: number; label: string; tone: string; } export interface PlayerFrameProps { character: CharacterProfile | null; health: PlayerFrameMeter; resource: PlayerFrameMeter; shield?: number; dead?: boolean; } function safePercent(current: number, maximum: number): number { if (!Number.isFinite(current) || !Number.isFinite(maximum) || maximum <= 0) return 0; return Math.max(0, Math.min(100, (current / maximum) * 100)); } function Meter({ current, maximum, label, tone }: PlayerFrameMeter) { const percent = safePercent(current, maximum); return (
{label} {Math.max(0, Math.round(current))} / {Math.max(0, Math.round(maximum))}
); } export function PlayerFrame({ character, health, resource, shield = 0, dead = false }: PlayerFrameProps) { const race = character ? raceById(character.raceId) : null; const characterClass = character ? classById(character.classId) : null; return (
{character?.name ?? "Adventurer"} {characterClass?.name ?? "Explorer"}
{shield > 0 && +{Math.round(shield)} absorb} {dead && Defeated}
); }