extends Node ## Top-level mutable game state. SaveSystem serializes via save_dict() / apply_dict(). ## ## Holds session-wide flags and the "what map are we on" pointer. Per-entity state ## lives on the entities themselves; per-tile state on the TileMap or World. ## See docs/architecture.md. var current_map_id: StringName = &"slice_temperate_forest" var session_started_at_unix: int = 0 # for "you've been away X minutes" toast # Phase 17 — player settings persisted across sessions. # Auto-pause booleans mirror the SettingsMenu checkboxes. # Audio floats are 0.0..1.0; default 1.0 (full volume). # Accessibility stubs wired in a later phase. var settings: Dictionary = { "pause_on_threat": true, "pause_on_wanderer": true, "pause_on_pawn_down": true, "pause_on_modal": true, "show_day_summary": true, # Phase 19 — onboarding hint system. # show_hints: master toggle; dismissed_hints: per-hint dismissal log (Array[String]). "show_hints": true, "dismissed_hints": [] as Array, "audio_master": 1.0, "audio_music": 1.0, "audio_sfx": 1.0, "audio_ambient": 1.0, "accessibility_large_text": false, "accessibility_reduce_motion": false, } func _ready() -> void: session_started_at_unix = int(Time.get_unix_time_from_system()) ## Apply a dictionary of setting values. Unknown keys are silently ignored so ## callers can pass partial dicts (e.g. only the audio block). Each recognised ## key is type-coerced to match the default type in `settings`. func apply_settings(d: Dictionary) -> void: for key in d: if not settings.has(key): continue var default_val = settings[key] if default_val is bool: settings[key] = bool(d[key]) elif default_val is float: settings[key] = clampf(float(d[key]), 0.0, 1.0) else: settings[key] = d[key] # Phase 16 expands these into real save round-trip. func save_dict() -> Dictionary: return { "current_map_id": String(current_map_id), "session_started_at_unix": session_started_at_unix, "settings": settings.duplicate(), } func apply_dict(d: Dictionary) -> void: if d.has("current_map_id"): current_map_id = StringName(d["current_map_id"]) if d.has("session_started_at_unix"): session_started_at_unix = int(d["session_started_at_unix"]) # Phase 17 — restore settings block; partial saves are fine. if d.has("settings") and d["settings"] is Dictionary: apply_settings(d["settings"])