Add session shell and close world presentation follow-ups
Session shell - Startup venue menu (src/game/ui/start_menu.gd): keyboard + mouse, replaces the live-shift boot and V as the player-facing venue path (V stays a debug bind). - Pause overlay on Esc (src/game/ui/pause_overlay.gd): resume, restart shift, settings, quit to menu. - Settings panel (src/game/ui/settings_panel.gd): mouse look sensitivity and HUD font scale, persisted via Save into user://settings.json and loaded on boot. - Shift review "Run another shift" now returns to the venue menu. - New smoke: src/test/smoke_session_shell.gd (menu -> shift -> pause -> settings -> menu), passes headless and windowed. World and presentation - Skyline backdrop restored with a transparent asset and an alpha-scissor unshaded material; fixes the opaque black slab from the earlier attempt and the unimported texture path. - Steps and landing are a StaticBody3D with per-tread colliders, so the guard and NPCs walk up instead of clipping through. - Marquee Label3D scaled up (72 -> 160) so STEP LINE reads from the sidewalk. - Focus torus and name tag enlarged for 2-3 m readability. - Routine traffic despawns after an idle lifetime (NpcAvatar.ephemeral), so the 16-NPC cap no longer fills with standers; authored events stay for the shift. Docs and tests - PLAN.md test/CI section corrected to the custom headless runner and Gitea Actions. - README controls table, smoke checklist, test count, and status lists refreshed. - TODO/DONE/MEMORY updated; completed sections moved to DONE.md. - Headless suite 77 -> 88 passing (settings round-trip, step colliders, skyline alpha, session-shell UI behavior, traffic lifetime).
This commit is contained in:
1 parent
f11b441c07
commit
be429cab29
20 files changed
+989
-90
No files matched your search
@@ -37,3 +37,29 @@ func save_shift_result(result: Dictionary) -> Error:
|
||||
var results := load_shift_results()
|
||||
results.append(result)
|
||||
return _save_json(SHIFT_RESULTS_FILE, results)
|
||||
|
||||
## Defaults for player settings. Kept in code so a missing or partial
|
||||
## settings.json still produces a usable config.
|
||||
const DEFAULT_SETTINGS := {
|
||||
"look_sensitivity": 0.0022,
|
||||
"hud_font_scale": 1.0,
|
||||
"ai_difficulty": "normal",
|
||||
}
|
||||
|
||||
## Load player settings, merged over the defaults. Returns a Dictionary.
|
||||
func load_settings() -> Dictionary:
|
||||
var merged: Dictionary = DEFAULT_SETTINGS.duplicate(true)
|
||||
var data = _load_json(SETTINGS_FILE)
|
||||
if data is Dictionary:
|
||||
for key in data.keys():
|
||||
if merged.has(key):
|
||||
merged[key] = data[key]
|
||||
return merged
|
||||
|
||||
## Persist player settings. Returns Error.
|
||||
func save_settings(settings: Dictionary) -> Error:
|
||||
var merged: Dictionary = DEFAULT_SETTINGS.duplicate(true)
|
||||
for key in settings.keys():
|
||||
if merged.has(key):
|
||||
merged[key] = settings[key]
|
||||
return _save_json(SETTINGS_FILE, merged)
|
||||
Reference in new issue
Block a user