working through a review

This commit is contained in:
itsamejms
2026-08-09 13:49:54 +01:00
parent abf3668081
commit 65aee44d6b
21 changed files with 1134 additions and 259 deletions
+42
View File
@@ -62,3 +62,45 @@ export const DIFFICULTY_COLOR: Record<Difficulty, string> = {
Hard: "var(--color-gold-bright)",
Deadly: "var(--color-danger)",
};
// ─── Self-check (run: node scripts/check-encounter-budget.ts) ────
// ponytail: the smallest thing that fails if the budget math breaks. No
// framework — plain asserts. Verifies the per-level table scales, the
// party-size multiplier, level clamping, and the XP→difficulty bucketing
// (the boundary the DMG relies on: a budget-equal XP is the *next* tier).
function assert(cond: boolean, msg: string): void {
if (!cond) throw new Error(`encounter-budget self-check failed: ${msg}`);
}
export function demo(): void {
// Level 5, 4 PCs — DMG p.82 per-character: Easy 250 / Med 500 / Hard 750 / Deadly 1100.
const b = encounterBudget(5, 4);
assert(b.easy === 1000, "L5×4 easy = 250×4");
assert(b.medium === 2000, "L5×4 medium = 500×4");
assert(b.hard === 3000, "L5×4 hard = 750×4");
assert(b.deadly === 4400, "L5×4 deadly = 1100×4");
// Solo L1 character.
const solo = encounterBudget(1, 1);
assert(solo.easy === 25 && solo.deadly === 100, "L1×1 matches table");
// Level clamps to 1..20; size clamps to >=1.
const low = encounterBudget(0, 1);
assert(low.easy === 25, "level clamps up to 1");
const high = encounterBudget(99, 1);
assert(high.deadly === 12700, "level clamps down to 20");
const zero = encounterBudget(5, 0);
assert(zero.medium === 500, "size clamps up to 1");
// difficultyForXp: budget-equal XP lands in the *next* tier up (>=, not >),
// and anything below the easy floor is still Easy (never undefined).
const d = encounterBudget(5, 4);
assert(difficultyForXp(999, d) === "Easy", "below easy floor stays Easy");
assert(difficultyForXp(1000, d) === "Easy", "== easy budget is Easy");
assert(difficultyForXp(2000, d) === "Medium", "== medium budget is Medium");
assert(difficultyForXp(3000, d) === "Hard", "== hard budget is Hard");
assert(difficultyForXp(4400, d) === "Deadly", "== deadly budget is Deadly");
assert(difficultyForXp(9999, d) === "Deadly", "over deadly stays Deadly");
console.log("encounter-budget self-check passed ✓");
}