- Introduced a new document detailing the design of a universal quest tracker for the RPG module, covering objectives, policies, and event handling.
- Updated existing RPG framework documentation to reference the new quest tracking system.
- Created an implementation plan outlining the architecture, file structure, and initial tasks for developing the quest tracker.
CI showed GPU/window tests are ~70x slower when several share one
process (bundle/animation_sprite_spine.cpp: 373s vs 5s per-case under
Lavapipe), so the default make test/* now runs per-case (fast, process
isolated) and excludes bundle/* entries. Bundle runs remain available
via FILTER=bundle/<file>.cpp or ctest -L bundle for CPU-focused local
runs. ClassicScenes fast headless defaults (VIEW_SECONDS, PERF_FRAMES)
stay enabled.
- test/voxel.cpp: merge parameter-variant families into single cases
(pack roundtrip, single voxel mesh, mesher API, frustum, decode
planes/UV/origin, visible batches, dirty flags, remove chunk,
registry) and drop 3 face-cull cases subsumed by the six-axis test;
134 -> 90 cases, all assertions preserved.
- test/particles_attach_skin.cpp: fold followRotationOff / yzPlane /
skinnedCacheReadable assertions into their siblings; 11 -> 8 cases.
- cmake/ZeroErrDiscoverTestsImpl.cmake: register one CTest bundle/<file>
per test source (label bundle) alongside per-case entries, preferring
zeroerr --list-format=plain with a legacy-format fallback; default
make test/* runs -L bundle so the suite spawns ~115 processes instead
of ~1385.
- Makefile: fast headless defaults for ClassicScenes (VIEW_SECONDS=0.3,
PERF_FRAMES=30) and bundle-mode ctest invocation.
- sceneloader: apply the known scene-ecs merge fix (linkTarget/linkKind
-> SceneLink) from codex/fix-sceneloader-merge-ci so this branch builds.
- docs: test-suite optimization + per-file pruning log.
Normalize all header comments to Doxygen @brief form and fill in missing class/method docs across engine common, cmdline, and module headers (~2368 @brief entries). Add root Doxyfile, 'make docs' target, CMake docs target, .gitignore for docs/api, README/docs/dev updates, and a Windows (native) + code-conventions section in AGENTS.md.
TileRenderSystem::collect walks the global ECS, so leftover TileLayer
entities from earlier cases made tilesContributeDepthY (and dual-grid
depth sort) see extra draw items. Hide other layers first, matching
the rest of the map suite.
drawMeshShader always runs inside an open 3D pass, so lazily calling
vkCreateGraphicsPipelines for the xray variant crashed Lavapipe.
Create that pipeline with the shader (and recreate it on MSAA/RP
change) instead, and skip the draw if it is still missing.
Also refresh module counts after rebasing onto grid / buildingfx.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
Marks the architecture document as implemented, replaces the roadmap section
with what each step actually landed and the measured result, and regenerates
the module inventory against the post-change dependency graph (scene is L1 now,
gameplay modules no longer pull data, and each row names the first profile that
includes it).
Adds docs/usr/TRIMMING.md for the user-facing side: profiles, per-module
switches, how dependency closure and the configure-time conflict errors behave,
has_module() in scripts, what cannot be trimmed and why, and measured savings.
Linked from the user and developer indexes.
Headline numbers after S1-S6: dependency cycles 26 -> 0, layering back-edges
16 -> 3, JSON implementations 6 -> 1, modules using Poco 15 -> 9, boot scripts
2 -> 1, and any module trimmable on desktop where none were before.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
Count by module directory (51) throughout, and state the directory-vs-script-
class discrepancy up front: filesystem also exposes HotReload, Cmdline lives in
engine/cmdline, and data/tensor bind under different class names.
Also align the layer diagram with the script's computed depths, add math and
audio to the functional-domain table, and correct the figures that were
estimated during drafting (97 soft lookups, 202 cross-module includes,
136 Poco include sites of which 79 are JSON).
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
Analyse how the 53 modules currently collaborate and why none of them can be
trimmed outside the hardcoded WASM axis, then lay out a target architecture and
a six-step route to per-module build options.
Adds scripts/module_depgraph.py, which produces the dependency graph, the
7-layer topological ordering and the cycle list the document cites. Its --check
mode fails on any back-edge outside the 16 known ones, so it doubles as the CI
guardrail for step S1.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
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.
Adds 'eve mcp': a desktop-only headless MCP host (stdio by default, --port for TCP, --root for the project). It runs the full runtime, attaches DevTools (eve_eval / eve_run_script / snapshot), and starts the new EditorHost module that renders JSON-defined editor Views (ImGui) bound two-way to Squirrel ViewModel tables (MVVM), persists editors under editors/, and exposes the eve_host_* tool family (apply/state/set_value/events/capture/script/shutdown...). The stdio transport uses a background stdin reader and keeps stdout JSON-RPC-only; script print() is routed to stderr.
Tests: stdio handshake + tools/list round trip, host editor binding (VM<->View sync, set_value -> VM write + onChange events, save/reload persistence). Docs updated (AI与MCP支持.md, 命令行设计.md, tools/eve-mcp README) with the editor JSON protocol and Codex stdio setup.
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.
One-line story -> stage brief (parse_stage) -> creative-brain plan -> build
via scene_director -> scene-qc inspection/fix loop -> report + screenshots.
Reuses the in-repo creative-brain and scene-qc packages; ships a dry-run
in-memory executor and tests, an empty examples/ai-stage host, an openCode
subagent, and the AI场景导演 integration doc that doubles as the
agent-queryable scene-director spec.
Add the scene_director Squirrel kit (src/scripts/scene_director.nut) with
spawn/move/scale/rotate/remove/material/lighting/camera/cameras/info/modify/
reset, embedded into the engine and exposed to host games as
eve.sceneDirectorScript. New MCP tools (eve_scene_director_install/status,
eve_scene_reset, eve_scene_modify, eve_scene_info, eve_camera_generate) are
thin dispatchers over the kit, so agents can place props, set lighting,
frame cameras, inspect truth and reset the stage through MCP alone.
The kit's cross-references are written explicitly as scene_director.<field>
to avoid Squirrel table-closure his resolution, and cameras() uses a
fixed 6-way compass table (no math-lib dependency) so it works both in the
engine and in plain ssq test VMs.