diff --git a/CLAUDE.md b/CLAUDE.md index 5b07b9c..7e1bbb1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -42,10 +42,25 @@ Adventures use Loreline `.lor` script format. Custom functions available in scri - Cosmetics: `hasCosmetic(id)`, `hasEquipped(slot, style)` - Progression: `hasCompletedAdventure(theme)`, `markSecretBranch(id)`, `hasSecretBranch(id)`, `countSecretBranches()`, `allSecretBranches()` -Hints for disabled choices use `|||` separator: `Option text|||Hint text #label [if condition]` +Hints for disabled choices use `|||` separator: `Option text|||Hint text #label if condition` full documentation: https://loreline.app/fr/docs/ +## Pacing Test +To check game progression balance after modifying loot tables (`content/data/boxes.json`): +``` +dotnet test --filter "FullRun_PacingReport" --logger "console;verbosity=detailed" +``` +This runs a full simulation (3 seeds: 42, 123, 777) and prints a report showing when each milestone is first reached (UI features, adventures, cosmetics, resources, crafting, lore). Use this to verify that rebalancing changes produce the desired early-game pacing. + +Key things to look for: +- **1st Meta UI unlock** should happen before box ~50 for a good early experience +- **1st Adventure** should appear before box ~120 +- **All content reachable** within ~1000 boxes (game completion) +- No long gaps between milestones (>100 boxes without progress feels stale) + +Weights are in `content/data/boxes.json`. The main generator is `box_of_boxes` (auto-opens, produces the next box). Adjust weights there and in tier boxes (`box_not_great`, `box_ok_tier`, etc.) to tune pacing. + ## Conventions - C# 12 with file-scoped namespaces, primary constructors where appropriate - Immutable records for value types, sealed classes for services