/** * Level value object — constrained to 1..10. * * "I can't believe it's not Haskell": invalid states are unrepresentable. */ 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; } /** Difference in levels (target - this). Positive means target is higher. */ diff(other: Level): number { return other.value - this.value; } /** Next level, or throws if already at max. */ next(): Level { if (this.#value >= 10) { throw new Error('Cannot level up beyond level 10'); } return Level.create(this.#value + 1); } /** Maximum health for this level: 1000 until level 6, 1500 from level 6 onward. */ static maxHealthForLevel(level: number): number { return level >= 6 ? 1500 : 1000; } }