rimlike/autoload/save_system.gd
megaproxy 128294c14f Phase 0 scaffold + asset audit findings
Project scaffold:
- project.godot at repo root, GL Compatibility renderer (max mobile reach),
  pixel-snap on, texture filter nearest, sensor_landscape orientation
- 7 autoloads: World, Sim, GameState, EventBus, Strings, Audit, SaveSystem
- scenes/main/main.{tscn,gd} smoke-test scene with autoload assertions
- Folder layout matches tavernkeep idiom: autoload/ at root, scripts
  co-located with scenes/ (not the scripts/autoloads/ mirror originally
  sketched in implementation.md)
- Input map: pause, speed_cycle, speed_normal/fast/ultra, confirm, cancel.
  Mobile gestures (pinch/drag/long-press) handled at script level via
  Godot's InputEventScreenTouch/Drag/MagnifyGesture.
- SaveSystem skeleton: SAVE_VERSION=1, JSON to user://save_slot.json,
  version-mismatch warning. Phase 3 expands to real entity state.
- icon.svg placeholder (cabin silhouette on dark green field)
- README.md points at memory.md / implementation.md / docs/

Headless verification: 'godot --headless --path . --quit' exits 0,
'[main] Phase 0 smoke test online.' prints, no errors. Editor-side
green-dot check still pending — needs human launch of editor.

Asset audit (researcher Haiku, 2026-05-10):
- FG_Houses.png NOT autotile-solvable — pre-built decorative house
  compositions, 4 distinct roof palettes, no modular wall family.
  ~½–1 day per material to author terrain bits on top.
- FG_Fortress.png IS autotile-solvable — ~20–30 modular tan-stone
  pieces. Wang-style Godot 4 terrain works with minimal extra art.
  Iconic Homestead $19.99 fallback not needed.
- No wolf sprite anywhere in the bundle. EvoMonster packs all
  cute/fantasy. Need commission, CC0 source, or Ventilatore check.
- Retro Graveyard 16x16 [Kingdom Explorer] confirmed in Tier 3 with
  full graveyard suite — direct use in Phase 14.

New open questions surfaced in memory.md:
- Player-built wall material strategy (3 options laid out)
- Wolf sprite acquisition path (Phase 10 blocker)

Project move:
- Repo physical location moved from ~/claude/projects/rimlike to
  /mnt/d/godot/rimlike (D: drive, fast for Windows-side editor).
- Symlink at the original WSL path preserves the home-CLAUDE.md
  layout convention. Mirrors tavernkeep's pattern.
- Set core.filemode=false to silence DrvFs's everything-is-0777
  false-positive on git diff.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 20:09:11 +01:00

45 lines
1.3 KiB
GDScript

extends Node
## Save/load skeleton — version field, file IO, save-between-ticks contract.
##
## Saves only happen between sim ticks (Sim owns the loop). JobRunner mid-toil
## state must round-trip from day one — see docs/architecture.md.
##
## Phase 0: file-IO smoke test only. Phase 3 expands to real entity state.
## Phase 16 closes coverage of every system.
const SAVE_VERSION: int = 1
const SAVE_PATH: String = "user://save_slot.json"
func write_save() -> bool:
# Smoke-test payload. Phase 3 expands this.
var payload := {
"version": SAVE_VERSION,
"sim_tick": Sim.tick,
"game_state": GameState.save_dict(),
}
var f := FileAccess.open(SAVE_PATH, FileAccess.WRITE)
if f == null:
push_error("SaveSystem.write_save: cannot open %s" % SAVE_PATH)
return false
f.store_string(JSON.stringify(payload))
return true
func read_save() -> Dictionary:
if not FileAccess.file_exists(SAVE_PATH):
return {}
var f := FileAccess.open(SAVE_PATH, FileAccess.READ)
if f == null:
return {}
var raw := f.get_as_text()
var parsed: Variant = JSON.parse_string(raw)
if typeof(parsed) != TYPE_DICTIONARY:
push_error("SaveSystem.read_save: corrupt save")
return {}
if int(parsed.get("version", 0)) != SAVE_VERSION:
push_warning(
"SaveSystem.read_save: version mismatch (%s vs %s)" %
[parsed.get("version", "?"), SAVE_VERSION]
)
return parsed