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.
Remove the legacy-save migration instructions. Slots are listed per game, and saves without a game cannot be assigned or loaded through the normal menu.
Enter through LauncherPlay and reload cthangover_game, which owns the starter party. Report missing mods, incompatible versions and collection problems when a game is unavailable.
The main menu warms every ready game's mods up into the assembly cache in the
background (last played first), so picking a game only loads cached assemblies.
Game picker and save browser are scenes on the shared MenuWindowShell (also used by
the settings): caps title, close on the right, footer hint; the picker footer shows
the warm-up state, cards get framed covers with a letter placeholder and Continue as
the main action; the save browser shows 3x2 large cards with the game selector in
the header. new_game waits for the warm-up; menu_flow takes --shots.
Display tab: window mode (windowed/maximized/borderless/exclusive), monitor, window
size per monitor (centred, disabled in fullscreen), V-Sync, frame rate cap, reset;
applied and saved at once through the core DisplaySettingsService. Language is read
through LanguageCode (en-en/en_US = English). The window follows the style guide
shell: title and tabs in the header, close on the right, footer hint and per-tab reset.
The main menu hides every session panel of UiHost (pause menu stayed above it).
New suite display_settings (+ --shots); collection_edit leaves the game through the
pause menu and checks it is closed.
A data-only probe mod depending on characters_base has its character edited;
after the reload the template must carry the new name. It failed while the
character factory cached the previous mod set's data.
New game / Load of the running game re-enter it in place only while it still
matches its collection; after the player edited the collection the mod set is
switched, so added mechanics (the editors) appear. Test suite collection_edit.
The novel template becomes the intended layering: collection novel_template
lists my_novel_game (its own scenes, scenarios, text), town_pack (reusable
backgrounds and the bar ambience) and the engine. The town entrance and the
home vestibule move from cthangover_game into town_pack instead of being
copied; cthangover_game depends on it. Docs explain how to start a game from
these three layers.
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.