manage stats and achievements

This commit is contained in:
2026-07-07 10:03:12 +02:00
parent b87be91521
commit 6da7021a58
6 changed files with 68 additions and 32 deletions

View File

@@ -6,6 +6,11 @@ extends Node
const KNOWN := [
"ACH_CHANGE_METEO",
"ACH_CHANGE_TRAIN_COLOR",
"ACH_DISTANCE_100",
"ACH_DISTANCE_200",
"ACH_10_PHOTOS",
"ACH_10_TOOTTOOT",
"ACH_DISTANCE_1000"
]
#how it works:

View File

@@ -13,6 +13,13 @@ const KNOWN := [
"stat_photo_number",
"stat_toottoot_number",
]
const TIME_PLAYED_STAT: String = "stat_time_played"
const DISTANCE_KM_STAT: String = "stat_distance_km"
const STATS_STORE_INTERVAL_SECONDS: int = 60
var _pending_time_played_seconds: float = 0.0
var _pending_distance_km: float = 0.0
var _stats_store_timer: float = 0.0
#how it works:
#func _on_match_finished(score: int) -> void:
@@ -25,10 +32,20 @@ const KNOWN := [
func _ready() -> void:
if not SteamManager.is_on_steam:
set_process(false)
return
Steam.user_stats_stored.connect(_on_stats_stored)
func _process(delta: float) -> void:
_pending_time_played_seconds += delta
_stats_store_timer += delta
if _stats_store_timer >= STATS_STORE_INTERVAL_SECONDS:
_flush_periodic_stats(false)
func _exit_tree() -> void:
_flush_periodic_stats(true)
func get_int(stat: String) -> int:
if not SteamManager.is_on_steam:
return 0
@@ -62,6 +79,14 @@ func add_int(stat: String, amount: int = 1) -> void:
return
set_int(stat, get_int(stat) + amount)
func add_distance_km(distance_km: float) -> void:
if not SteamManager.is_on_steam:
return
if distance_km <= 0.0:
return
_pending_distance_km += distance_km
func update_avg_rate(stat: String, count_this_session: float, session_length: float) -> void:
if not SteamManager.is_on_steam:
return
@@ -74,6 +99,32 @@ func store() -> void:
if not Steam.storeStats():
push_error("storeStats failed; data saved locally")
#periodic stats incrementation; store data every 60 secs
func _flush_periodic_stats(force_store: bool) -> void:
if not SteamManager.is_on_steam:
_pending_time_played_seconds = 0.0
_pending_distance_km = 0.0
_stats_store_timer = 0.0
return
var has_changes: bool = false
var whole_seconds: int = int(floor(_pending_time_played_seconds))
if whole_seconds > 0:
_pending_time_played_seconds -= float(whole_seconds)
add_int(TIME_PLAYED_STAT, whole_seconds)
has_changes = true
var whole_km: int = int(floor(_pending_distance_km))
if whole_km > 0:
_pending_distance_km -= float(whole_km)
add_int(DISTANCE_KM_STAT, whole_km)
has_changes = true
_stats_store_timer = 0.0
if has_changes and (force_store or whole_seconds > 0 or whole_km > 0):
store()
#Development only: reset stats
func reset_all(include_achievements: bool = false) -> void:
if not SteamManager.is_on_steam: