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])