/**
* Sheet seeding (Phase G). Pure construction of a fresh character sheet from a
* universe's rules — the player's starting stats/resources, with optional
* overrides (e.g. a card declaring custom start values, a later addition).
*/
import { Sheet } from "../state/schema.js";
import { RulesDefinition } from "./schema.js";
export interface SheetOverrides {
stats?: Record<string, number>;
resources?: Record<string, number>;
label?: string;
}
/**
* Build a fresh sheet seeded from the rules' defaults. Every declared stat and
* resource gets its `default`, unless an override supplies a value. Marked
* `initialized` so the handler seeds it exactly once.
*/
export function initSheet(
rules: RulesDefinition,
overrides?: SheetOverrides,
): Sheet {
const stats: Record<string, number> = {};
for (const [key, def] of Object.entries(rules.stats)) {
stats[key] = overrides?.stats?.[key] ?? def.default;
}
const resources: Record<string, number> = {};
for (const [key, def] of Object.entries(rules.resources)) {
resources[key] = overrides?.resources?.[key] ?? def.default;
}
return {
initialized: true,
label: overrides?.label ?? "",
stats,
resources,
};
}