The script-test content symbols are declared explicitly in test/template.cpp.in,
so profiler.nut (added in the profiler feature) needs its content symbol wired
there, otherwise the unit_test link fails with an unresolved profiler_content.
Adds the common-layer IDecalQuery capability (spawn/remove/clear/count/setLimit with an opaque texture handle) provided by the decal module at construction, so editor/devtools can drive decals without linking the module; adds a Squirrel script test (decal.nut + DecalScriptTest) covering eve.Decal() getName/clearAll/setLimit/update, and a C++ capability consumer test.
- Image: expose newImageData(newImageDataFromFile)/newEmptyImageData/isCompressed and a
full ImageData script class (getWidth/Height/Format/Size, pixel get/set, paste, clone,
rotate). ImageData is now registered once by the Image module; drop the duplicate
minimal registrations in Font and Model3D that could overwrite each other.
- Joystick: expose getJoystick/getJoystickFromID/getIndex/addJoystick/removeJoystick and a
Pad class with raw axes/buttons/hats, GameController axis/button names, device info,
and vibration. Pads stay owned by the module (non-owning script handles).
- Mouse: expose setRelativeMode/getRelativeMode plus setVisible/setPosition/setX/setY/
setGrabbed/isGrabbed (SDL backend already implemented them).
- Tests: add image.nut/image_script.cpp and joystick.nut/joystick_script.cpp script tests,
extend mouse.nut with relative-mode/visibility checks, wire into test CMake and the nut
embed template.
- Docs: update image/joystick/mouse user chapters, MODULES.md and the REVIEW log.
Add data-driven procedural dialogue to eve.Dialogue:
- Variables: setVar/getVar*/hasVar/clearVar/clearVars with global and
scene scopes; the scene scope auto-clears when the selected Scene host
changes (polled in update()).
- Conditions: structured tables ({var,op,value} with eq/ne/gt/ge/lt/le/
has/missing, all/any/not, script predicates) + evalCondition().
- Line pools: loadPoolsFromTable() with weight/when/meta/tags, seeded
weighted selection (setRandomSeed), per-pool no-repeat history, and
playLine()/playPool() that resolve {var} interpolation or i18n keys and
auto-apply meta.expression/motion to bound avatars.
- .dnut authoring format compiled by a new C++ parser (DnutParser):
loadPoolsFromDnut(source, path) / loadPoolsFromDnutFile(path); parse
errors surface path:line via getLastPoolsError(). The previous Squirrel
compiler script and its engine wiring are removed.
- Example (examples/dialogue) uses pools.dnut with mood/hour variables,
scene-scope auto-clear demo, and hot reload via eve_asset_reload.
- Tests: C++ unit tests (dialogue_proc.cpp) covering variables,
conditions, pools, selection/dedupe, meta, i18n, scene auto-clear and
the .dnut parser; Squirrel integration test for the script-facing API.
- Docs: design doc updated with the new content model / API / format.
Add an i18n module (eve.I18n) for game localization:
- Load per-language JSON locale tables from VFS or raw JSON.
- Dot-path key lookup with {name} placeholder substitution.
- CLDR-style plural rules (en/fr/ru/pl/cs/zh and more).
- Fall back to default language, then to the raw key.
- Optional file auto-reload via update(dt).
Self-contained JSON parser (no Poco) so it builds on WASM too.
Includes C++ + Squirrel script tests, user/module docs, an
examples/i18n demo, and i18n integration in the dialogue example.
- Added new methods for event polling and handling in the Event module, including `pollName` for retrieving message names.
- Introduced new graphics functions for clearing the screen and drawing solid rectangles with RGBA support.
- Updated the Window module to expose new settings and graphics functionalities.
- Refactored the main script to utilize the new graphics and event features, improving the example game structure.