import { Activity, Attribute, MetricsSchema, type Metrics, } from "@blade-and-brawn/domain"; import { Type as t, type Static } from "@sinclair/typebox"; // ================ // CALCULATOR // ================ export type LevelCalculatorOutput = { player: number; attributes: Record; }; export type NumberMetric = Extract; export const LevelsSchema = t.Record(t.String(), t.Number()); export type Levels = Static; // ================ // STANDARDS // ================ export const StandardSchema = t.Object({ metrics: MetricsSchema, levels: LevelsSchema, }); export type Standard = Static; export const GeneratorSchema = t.Object({ metric: t.Union([t.Literal("age"), t.Literal("weight")]), }); export type Generator = Static; export const StandardsDataSchema = t.Record( t.Enum(Activity), t.Object({ metadata: t.Object({ attribute: t.Enum(Attribute), generators: t.Array(GeneratorSchema), unit: t.Union([t.Literal("ms"), t.Literal("cm"), t.Literal("kg")]), name: t.String(), }), standards: t.Array(StandardSchema), }), ); export type StandardsData = Static; export const StandardsParamsSchema = t.Object({ global: t.Object({ maxLevel: t.Number(), }), activity: t.Record(t.Enum(Activity), t.Object({ weightModifier: t.Number(), weightSkew: t.Number(), ageModifier: t.Number(), enableGeneration: t.Boolean(), difficultyModifier: t.Number(), peakAge: t.Number(), stretch: t.Object({ upper: t.Number(), lower: t.Number(), }), })) }); export type StandardsParams = Static;