2026-03-22 23:57:14 -05:00
|
|
|
import { type GameState } from "../game/types";
|
|
|
|
|
|
2026-03-22 23:33:24 -05:00
|
|
|
const objectives = [
|
2026-03-23 00:06:01 -05:00
|
|
|
"Clear lower-tier debris to unlock heavier targets",
|
|
|
|
|
"Meteorites and larger bodies only absorb after their mass gate",
|
2026-03-22 23:57:14 -05:00
|
|
|
"Persist profile data in M3"
|
2026-03-22 23:33:24 -05:00
|
|
|
];
|
|
|
|
|
|
2026-03-22 23:57:14 -05:00
|
|
|
interface HudProps {
|
|
|
|
|
gameState: GameState;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function Hud({ gameState }: HudProps) {
|
2026-03-22 23:33:24 -05:00
|
|
|
return (
|
|
|
|
|
<aside className="rounded-3xl border border-white/10 bg-white/5 p-5 shadow-2xl shadow-cyan-950/30 backdrop-blur">
|
|
|
|
|
<div className="mb-6">
|
|
|
|
|
<p className="text-xs uppercase tracking-[0.3em] text-glow/70">Mission Board</p>
|
2026-03-22 23:57:14 -05:00
|
|
|
<h2 className="mt-2 text-2xl font-semibold text-white">Sector Absorption</h2>
|
2026-03-22 23:33:24 -05:00
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<dl className="grid grid-cols-2 gap-3 text-sm">
|
|
|
|
|
<div className="rounded-2xl bg-black/20 p-3">
|
|
|
|
|
<dt className="text-slate-400">Mass</dt>
|
2026-03-22 23:57:14 -05:00
|
|
|
<dd className="mt-1 text-xl font-semibold">{gameState.mass.toFixed(0)}</dd>
|
2026-03-22 23:33:24 -05:00
|
|
|
</div>
|
|
|
|
|
<div className="rounded-2xl bg-black/20 p-3">
|
|
|
|
|
<dt className="text-slate-400">Tier</dt>
|
2026-03-22 23:57:14 -05:00
|
|
|
<dd className="mt-1 text-xl font-semibold">{gameState.tier}</dd>
|
2026-03-22 23:33:24 -05:00
|
|
|
</div>
|
|
|
|
|
<div className="rounded-2xl bg-black/20 p-3">
|
|
|
|
|
<dt className="text-slate-400">Pull Radius</dt>
|
2026-03-22 23:57:14 -05:00
|
|
|
<dd className="mt-1 text-xl font-semibold">{gameState.pullRadius.toFixed(0)}m</dd>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="rounded-2xl bg-black/20 p-3">
|
|
|
|
|
<dt className="text-slate-400">FPS</dt>
|
|
|
|
|
<dd className="mt-1 text-xl font-semibold">{gameState.fps.toFixed(0)}</dd>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="rounded-2xl bg-black/20 p-3">
|
|
|
|
|
<dt className="text-slate-400">Consumed</dt>
|
2026-03-23 00:06:01 -05:00
|
|
|
<dd className="mt-1 text-xl font-semibold">{gameState.consumedObjects}</dd>
|
2026-03-22 23:33:24 -05:00
|
|
|
</div>
|
|
|
|
|
<div className="rounded-2xl bg-black/20 p-3">
|
2026-03-23 00:06:01 -05:00
|
|
|
<dt className="text-slate-400">Objects Left</dt>
|
|
|
|
|
<dd className="mt-1 text-xl font-semibold">{gameState.objectsRemaining}</dd>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="rounded-2xl bg-black/20 p-3">
|
|
|
|
|
<dt className="text-slate-400">Max Prey</dt>
|
|
|
|
|
<dd className="mt-1 text-xl font-semibold">{gameState.preyTier}</dd>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="rounded-2xl bg-black/20 p-3">
|
|
|
|
|
<dt className="text-slate-400">Next Unlock</dt>
|
|
|
|
|
<dd className="mt-1 text-xl font-semibold">{gameState.nextUnlock ?? "Complete"}</dd>
|
2026-03-22 23:33:24 -05:00
|
|
|
</div>
|
|
|
|
|
</dl>
|
|
|
|
|
|
|
|
|
|
<div className="mt-6">
|
|
|
|
|
<p className="text-xs uppercase tracking-[0.3em] text-amber-300/70">Next Steps</p>
|
|
|
|
|
<ul className="mt-3 space-y-3 text-sm text-slate-200">
|
|
|
|
|
{objectives.map((objective) => (
|
|
|
|
|
<li key={objective} className="rounded-2xl border border-white/10 bg-black/20 px-4 py-3">
|
|
|
|
|
{objective}
|
|
|
|
|
</li>
|
|
|
|
|
))}
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
</aside>
|
|
|
|
|
);
|
|
|
|
|
}
|