More models organization

This commit is contained in:
Dominic Ferrando
2026-07-04 15:57:20 -04:00
parent a7b8dd0bea
commit 28c5b3df18
9 changed files with 148 additions and 134 deletions
+69
View File
@@ -0,0 +1,69 @@
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<Attribute, number>;
};
export type NumberMetric = Extract<keyof Metrics, "age" | "weight">;
export const LevelsSchema = t.Record(t.String(), t.Number());
export type Levels = Static<typeof LevelsSchema>;
// ================
// STANDARDS
// ================
export const StandardSchema = t.Object({
metrics: MetricsSchema,
levels: LevelsSchema,
});
export type Standard = Static<typeof StandardSchema>;
export const GeneratorSchema = t.Object({
metric: t.Union([t.Literal("age"), t.Literal("weight")]),
});
export type Generator = Static<typeof GeneratorSchema>;
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<typeof StandardsDataSchema>;
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<typeof StandardsParamsSchema>;