/datum/award ///Name of the achievement, If null it wont show up in the achievement browser. (Handy for inheritance trees) var/name var/desc = "You did it." ///Found in /datum/asset/spritesheet/simple/achievements var/icon = "default" var/category = "Normal" ///What ID do we use on the hub? var/hub_id //Value returned on db connection failure, in case we want to differ 0 and nonexistent later on var/default_value = FALSE ///This proc loads the achievement data from the hub. /datum/award/proc/load(key) if(!SSdbcore.Connect()) return default_value if(!key || !hub_id || !name) return default_value var/raw_value = get_raw_value(key) return parse_value(raw_value) ///This saves the changed data to the hub. /datum/award/proc/get_changed_rows(key, value) if(!hub_id || !key || !name) return return list("ckey" = "'[sanitizeSQL(key)]'","achievement_key" = "'[sanitizeSQL(hub_id)]'", "value" = "'[sanitizeSQL(value)]'") ///Get raw numerical achievement value from the database /datum/award/proc/get_raw_value(key) var/datum/DBQuery/Q = SSdbcore.NewQuery("SELECT value FROM [format_table_name("achievements")] WHERE ckey = '[sanitizeSQL(key)]' AND achievement_key = '[sanitizeSQL(hub_id)]'") if(!Q.Execute(async = TRUE)) qdel(Q) return 0 var/result = 0 if(Q.NextRow()) result = text2num(Q.item[1]) qdel(Q) return result //Should return sanitized value for achievement cache /datum/award/proc/parse_value(raw_value) return default_value ///Can be overriden for achievement specific events /datum/award/proc/on_unlock(mob/user) return ///Achievements are one-off awards for usually doing cool things. /datum/award/achievement desc = "Achievement for epic people" /datum/award/achievement/parse_value(raw_value) return raw_value > 0 /datum/award/achievement/on_unlock(mob/user) . = ..() to_chat(user, "Achievement unlocked: [name]!") ///Scores are for leaderboarded things, such as killcount of a specific boss /datum/award/score desc = "you did it sooo many times." category = "Scores" default_value = 0 var/track_high_scores = TRUE var/list/high_scores = list() /datum/award/score/New() . = ..() if(track_high_scores) LoadHighScores() /datum/award/score/proc/LoadHighScores() var/datum/DBQuery/Q = SSdbcore.NewQuery("SELECT ckey,value FROM [format_table_name("achievements")] WHERE achievement_key = '[sanitizeSQL(hub_id)]' ORDER BY value DESC LIMIT 50") if(!Q.Execute(async = TRUE)) qdel(Q) return else while(Q.NextRow()) var/key = Q.item[1] var/score = text2num(Q.item[2]) high_scores[key] = score qdel(Q) /datum/award/score/parse_value(raw_value) return isnum(raw_value) ? raw_value : 0