85 lines
2.8 KiB
GDScript
85 lines
2.8 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",
|
|
]
|
|
|
|
#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])
|