- Add RectangleShape2D to Character and InteractiveObject collision areas - Fix HUD button signal connections in _ready() - Fix character_placed signal emitting global_position - Extract DEFAULT_DRAG_RADIUS constant in DragDropComponent - Type Variant on JSON parsed variable in SaveManager - Extract music symbol constants in HUD - Refactor duplicated drag input code in InputManager Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
41 lines
992 B
GDScript
41 lines
992 B
GDScript
## SaveManager — persists game state as JSON to user://savegame.json, auto-saves on state_changed.
|
|
extends Node
|
|
|
|
const SAVE_PATH: String = "user://savegame.json"
|
|
|
|
|
|
func _ready() -> void:
|
|
GameState.state_changed.connect(_on_state_changed)
|
|
|
|
|
|
func save_game() -> void:
|
|
var data: Dictionary = GameState.get_save_data()
|
|
var file: FileAccess = FileAccess.open(SAVE_PATH, FileAccess.WRITE)
|
|
if file == null:
|
|
return
|
|
file.store_string(JSON.stringify(data))
|
|
file.close()
|
|
|
|
|
|
func load_game() -> void:
|
|
if not FileAccess.file_exists(SAVE_PATH):
|
|
return
|
|
var file: FileAccess = FileAccess.open(SAVE_PATH, FileAccess.READ)
|
|
if file == null:
|
|
return
|
|
var raw: String = file.get_as_text()
|
|
file.close()
|
|
var parsed: Variant = JSON.parse_string(raw)
|
|
if parsed is Dictionary:
|
|
GameState.apply_save_data(parsed)
|
|
|
|
|
|
func reset_game() -> void:
|
|
if FileAccess.file_exists(SAVE_PATH):
|
|
DirAccess.remove_absolute(SAVE_PATH)
|
|
GameState.apply_save_data({})
|
|
|
|
|
|
func _on_state_changed() -> void:
|
|
save_game()
|