90 lines
2.0 KiB
GDScript
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]
|