- Introduce CharacterState value object to group character properties → Character constructor reduced from 5 to 1 parameter - Introduce Faction value type (previously bare string) - Remove cross-story methods: isAllyOf, isAlive, isDead, add, isMax, next, diff - Remove misleading level parameter from Health.create - Remove trivial invariant tests (dead-code paths on fresh characters) - Move cross-cutting invariants out of character-creation.allium - ESLint: forbid unused params (remove argsIgnorePattern), max-params=5 - null parameters enforced by TypeScript strictNullChecks (tsconfig)
30 lines
716 B
TypeScript
30 lines
716 B
TypeScript
/**
|
|
* Level value object — constrained to 1..10.
|
|
*
|
|
* "I can't believe it's not Haskell": invalid states are unrepresentable.
|
|
* Level progression (next) and combat modifiers (diff) belong to later stories.
|
|
*/
|
|
export class Level {
|
|
#value: number;
|
|
|
|
private constructor(n: number) {
|
|
this.#value = n;
|
|
}
|
|
|
|
static create(n: number): Level {
|
|
if (n < 1 || n > 10) {
|
|
throw new Error(`Level must be between 1 and 10, got ${n}`);
|
|
}
|
|
return new Level(n);
|
|
}
|
|
|
|
get value(): number {
|
|
return this.#value;
|
|
}
|
|
|
|
/** Maximum health for this level: 1000 until level 6, 1500 from level 6 onward. */
|
|
static maxHealthForLevel(level: number): number {
|
|
return level >= 6 ? 1500 : 1000;
|
|
}
|
|
}
|