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.
Buffer reward messages until the shell returns without allocating detached UI nodes. Register mod tests that verify notification ordering and prevent duplicates.
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 resource atlas reported them as used by the interface widgets but
shipped by visual_novel_core, a content mod the interface does not depend
on. They move here, next to their users.
- MenuBuilder skips a button whose MenuButtonEntry.Visible predicate is
false (e.g. "Continue" only when a last session exists); a throwing
predicate is logged and the button stays visible.
- MenuBuilder.OpenScene returns the overlay it opened (null when the
scene failed to build), so callers can configure it.
- Text for mods left out of a game's mod set: mods/not_in_game_reason.
- ToolBox: instead of a text button per tool (which did not fit the 60x60
icon row and overlapped the icons) the HUD gets one "tools" icon button
with a popup listing every visible tool, sorted by localized name.
- ToolWindow: chrome that follows the UI style guide (title on the left,
close on the right, drag-to-move, double-click/maximize, edge resize),
a status bar with buffered status/hint text, dirty-state confirmation
and keyboard shortcuts (Ctrl+S in _Input, other keys only when no
focused control consumed them).
- ToolTheme: denser copy of the game theme for editor toolbars;
ToolStatusKind: status bar message kinds.
- New tools icon and the tool window texts (unsaved changes, maximize,
close, menu title) in en/ru.