Store categories as authored strings. Trim and deduplicate without changing case, compare without case sensitivity, and keep all observed categories available to filters and editors.
Advance integration drivers only after their requested controls, game state or file effects are observable. Preserve the behavioral assertions and shared viewport capture pipeline.
The code moved to tools_base, scenario_tools_base and the seven editor mods;
editor_tools depends on them and keeps the tool windows suite. Docs list all
seven tool box entries with a new tool box screenshot.
Stop brings the player back to the scene they were in instead of the main
menu, and a scene switch inside the played scenario ends the play-test in
place. New GUI test suite ingame_play covers both.
The mod holding the main game's own scenes and story follows the <game>_game
naming rule; further parts stay <game>_<part>, reusable content is <theme>_pack.
A collection is no longer a file inside a mod: it is a package (folder or zip)
named after its id with collection.json, cover and optional locale/, shipped in
collections/ next to the mods or kept by the player in user://collections/.
Covers and texts come from the package; mods do not ship collections.
Mods are renamed by role (shell2d_base, menu_base, ui_base, live2d_base,
editor_tools, cthangover_story, cthangover_murakami, cthangover_party) and
every reference follows. Engine UI prefabs (dialog, answers, message, game
menu, inventory, map, skills) and their panel entries moved out of the story
mod into the subsystem mods; the card_novel and vn_starter_novel collections
are removed.
The play-test loads the game shell, which frees the screen the editor was
opened from (the novel_editor hub). Both the scenario's end and Stop used to
switch to the engine's main menu; the editor now remembers the route it left
and switches back to it, falling back to the main menu only when it was not
opened from a route. The tools_hub run of the windows suite plays its own
scenario and checks both ways back.
- test_suites/windows (--itest=tools_windows [--shots=<dir>]) opens every
tool window, fails on any engine error logged meanwhile, drives the
map/interactive/light canvases and can save a screenshot per window.
- The tools need the engine mods only; visual_novel_core is no longer a
dependency (the Novel Editor collection brings the content).
Tool windows:
- Every editor (scenario, scene builder, map, interactive objects,
lighting, catalog export) is rebuilt on the interface ToolWindow chrome
and the denser ToolTheme: header with title/close, status bar, Ctrl+S,
dirty-state confirmation.
- Shared building blocks in src/Common: ToolUi (rows, buttons, sections),
CollapsibleSection, FilteredList, ModFileSelector, DragHandle and
BackgroundCanvas (scene background with pan/zoom).
- The map, interactive and light editors draw on canvases
(MapEditorCanvas, InteractiveEditorCanvas, LightEditorCanvas) instead of
one Control "handle" node per object; the *Handle classes are removed.
- Scenario editor: tab data model (TabData), automatic graph layout
(ScenarioGraphLayout), file tree/info/thumbnail panel updates.
- Services: ModFileService (mod file listing and writing),
SceneBackgroundService; MapFileService/ModResourceService follow.
- Catalog export: per-language name/description editing.
- Locale (en/ru) regrouped under tools/*; unused keys removed.
Novel Editor:
- collections/novel_editor.json: a "game" whose entry scene is an
authoring workspace over the novel engine and the story content.
- NovelEditorHub (scenes/novel_editor_hub.tscn) lists every installed
tool through IToolProvider.AddMenuButton; ToolsInitializer registers it
as the logical scene "novel_editor".
- ru name/description for the collection and every block.
- The optional "Validation" block also installs resource_atlas and
locale_atlas next to the validator.