extends Node const SAVE_PATH = "user://stats.json" var _session_start_ms: int = 0 var _run_active: bool = false var data: Dictionary = { "runs_played": 0, "total_deaths": 0, "longest_run_seconds": 0.0, "total_survive_seconds": 0.0, "kills": { "slime": 0, "blue_slime": 0, "fire_slime": 0 }, "spells_cast": { "fireball": 0, "shuriken": 0, "laser": 0, "fire_swirl": 0, "tornado": 0, "purge": 0, "throwing_knife": 0 } } func _ready() -> void: _load() func start_run() -> void: _session_start_ms = Time.get_ticks_msec() _run_active = true data["runs_played"] += 1 _save() func end_run(died: bool) -> void: if not _run_active: return _run_active = false var survived_sec = (Time.get_ticks_msec() - _session_start_ms) / 1000.0 if died: data["total_deaths"] += 1 data["total_survive_seconds"] += survived_sec if survived_sec > data["longest_run_seconds"]: data["longest_run_seconds"] = survived_sec _save() func on_kill(enemy_type: String) -> void: if data["kills"].has(enemy_type): data["kills"][enemy_type] += 1 func on_spell_cast(spell_type: String) -> void: if data["spells_cast"].has(spell_type): data["spells_cast"][spell_type] += 1 func _save() -> void: var file = FileAccess.open(SAVE_PATH, FileAccess.WRITE) if file == null: return file.store_string(JSON.stringify(data, "\t")) file.close() func _load() -> void: if not FileAccess.file_exists(SAVE_PATH): return var file = FileAccess.open(SAVE_PATH, FileAccess.READ) if file == null: return var json = JSON.new() var err = json.parse(file.get_as_text()) file.close() if err != OK: return var loaded = json.get_data() if typeof(loaded) != TYPE_DICTIONARY: return for key in loaded: if not data.has(key): continue if typeof(data[key]) == TYPE_DICTIONARY and typeof(loaded[key]) == TYPE_DICTIONARY: for sub in loaded[key]: if data[key].has(sub): data[key][sub] = loaded[key][sub] else: data[key] = loaded[key]