mirror of
https://github.com/fulpstation/fulpstation.git
synced 2025-12-09 16:09:15 +00:00
Drops byond hub support and adds score and top 50 browsers. Requires DB changes and manual creation of migration script if we want to keep old achievements so no random merges please.
89 lines
2.7 KiB
Plaintext
89 lines
2.7 KiB
Plaintext
/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, "<span class='greenannounce'><B>Achievement unlocked: [name]!</B></span>")
|
|
|
|
///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
|