Files
tgcc/core/steam_manager/achievement_manager.gd

90 lines
2.9 KiB
GDScript

extends Node
#Achievements and stats must be published on Steam even if game is not yet released
#if you have an error setting achievements or stats in debug mode remember to open your steam client
#with jmp games account or another account who bought this game. If error persist try to clos and reopen steam client.
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:
#func _on_player_won() -> void:
# AchievementManager.unlock("ACH_DISTANCE_100") #unlock the achievement at first win
#func _on_match_finished(coins_collected: int) -> void:
#update stats
#...
#check thresholds and unlock achievements
# if StatsManager.get_int("stat_distance_km") >= 100:
# AchievementManager.unlock("ACH_DISTANCE_100")
# if StatsManager.get_int("stat_distance_km") >= 200:
# AchievementManager.unlock("ACH_DISTANCE_200")
signal unlocked(api_name: String)
func _ready() -> void:
if not SteamManager.is_on_steam:
return
Steam.user_achievement_stored.connect(_on_achievement_stored)
Steam.global_achievement_percentages_ready.connect(_on_global_percentages_ready)
Steam.requestGlobalAchievementPercentages() # asincrona
func _on_global_percentages_ready(_game: int, _result: int) -> void:
pass
func unlock(api_name: String) -> void:
if not SteamManager.is_on_steam:
return
if not KNOWN.has(api_name):
push_warning("Achievement unknown: %s" % api_name)
return
if is_unlocked(api_name):
return
if not Steam.setAchievement(api_name):
push_error("setAchievement failed (is published on Steam?): %s" % api_name)
return
Steam.storeStats()
unlocked.emit(api_name)
func is_unlocked(api_name: String) -> bool:
if not SteamManager.is_on_steam:
return false
var data: Dictionary = Steam.getAchievement(api_name)
return data.get("achieved", false)
func get_display_name(api_name: String) -> String:
if not SteamManager.is_on_steam:
return ""
return Steam.getAchievementDisplayAttribute(api_name, "name")
func get_description(api_name: String) -> String:
if not SteamManager.is_on_steam:
return ""
return Steam.getAchievementDisplayAttribute(api_name, "desc")
#Global percentage of player who have unlocked the achievement
func get_global_percent(api_name: String) -> float:
if not SteamManager.is_on_steam:
return 0.0
var data: Dictionary = Steam.getAchievementAchievedPercent(api_name)
if not data.get("ret", false):
return -1.0 #global percentage not yet available
return data.get("percent", 0.0)
#for development only: reset an achievement
func clear(api_name: String) -> void:
if not SteamManager.is_on_steam:
return
Steam.clearAchievement(api_name)
Steam.storeStats()
func _on_achievement_stored(_game: int, _group: bool, api_name: String, current: int, maximum: int) -> void:
print("Achievement confirmed by server: %s (%d/%d)" % [api_name, current, maximum])