Renderers now use LocalizationManager for all UI text: box opening,
loot reveal, feature unlock, prompts, and error messages. Added
missing localization keys to both en.json and fr.json.
Box selection and inventory now show "Boite pas ouf (x4)" instead of
listing each instance separately. Picks the first instance of the
selected type when opening.
Every box now always drops a box_of_boxes (auto-open) alongside its
normal loot, ensuring the core loop never breaks. The player always
has at least one box to open next. Only auto-opening boxes (box_of_boxes
itself, box_adventure) are excluded to prevent infinite recursion.
GetItem() returns null for box definition IDs, causing [MISSING:box_*]
display. Added GetLocalizedName() helper that checks both item and box
registries before resolving the localization key.
- Fix LootTable.GuaranteedRolls type (int -> List<string>) to match JSON schema
- Fix BoxEngine guaranteed rolls to iterate item IDs directly
- Fix BoxEngine resource condition evaluation for "any" targetId
- Make ItemDefinition.DescriptionKey optional
- Fix font meta item nameKeys to use proper localization keys
- Add 43 xUnit content validation tests (deserialization, cross-refs, localization)
- Add self-contained single-file publish via publish.ps1
- Update README with distribute and test sections