gae_wild_jam/scripts/stats_manager.gd

90 lines
2.0 KiB
GDScript

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
AchievementManager.call_deferred("check_all")
func on_spell_cast(spell_type: String) -> void:
if data["spells_cast"].has(spell_type):
data["spells_cast"][spell_type] += 1
AchievementManager.call_deferred("check_all")
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]