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.
141 lines
5.2 KiB
Plaintext
141 lines
5.2 KiB
Plaintext
///Datum that handles
|
|
/datum/achievement_data
|
|
///Ckey of this achievement data's owner
|
|
var/owner_ckey
|
|
///Up to date list of all achievements and their info.
|
|
var/data = list()
|
|
///Original status of achievement.
|
|
var/original_cached_data = list()
|
|
///Have we done our set-up yet?
|
|
var/initialized = FALSE
|
|
|
|
/datum/achievement_data/New(ckey)
|
|
owner_ckey = ckey
|
|
if(SSachievements.initialized && !initialized)
|
|
InitializeData()
|
|
|
|
/datum/achievement_data/proc/InitializeData()
|
|
initialized = TRUE
|
|
load_all_achievements() //So we know which achievements we have unlocked so far.
|
|
|
|
///Gets list of changed rows in MassInsert format
|
|
/datum/achievement_data/proc/get_changed_data()
|
|
. = list()
|
|
for(var/T in data)
|
|
var/datum/award/A = SSachievements.awards[T]
|
|
if(data[T] != original_cached_data[T])//If our data from before is not the same as now, save it to db.
|
|
var/deets = A.get_changed_rows(owner_ckey,data[T])
|
|
if(deets)
|
|
. += list(deets)
|
|
|
|
/datum/achievement_data/proc/load_all_achievements()
|
|
set waitfor = FALSE
|
|
|
|
var/list/kv = list()
|
|
var/datum/DBQuery/Query = SSdbcore.NewQuery("SELECT achievement_key,value FROM [format_table_name("achievements")] WHERE ckey = '[sanitizeSQL(owner_ckey)]'")
|
|
if(!Query.Execute())
|
|
qdel(Query)
|
|
return
|
|
while(Query.NextRow())
|
|
var/key = Query.item[1]
|
|
var/value = text2num(Query.item[2])
|
|
kv[key] = value
|
|
qdel(Query)
|
|
|
|
for(var/T in subtypesof(/datum/award))
|
|
var/datum/award/A = SSachievements.awards[T]
|
|
if(!A || !A.name) //Skip abstract achievements types
|
|
continue
|
|
if(!data[T])
|
|
data[T] = A.parse_value(kv[A.hub_id])
|
|
original_cached_data[T] = data[T]
|
|
|
|
///Updates local cache with db data for the given achievement type if it wasn't loaded yet.
|
|
/datum/achievement_data/proc/get_data(achievement_type)
|
|
var/datum/award/A = SSachievements.awards[achievement_type]
|
|
if(!A.name)
|
|
return FALSE
|
|
if(!data[achievement_type])
|
|
data[achievement_type] = A.load(owner_ckey)
|
|
original_cached_data[achievement_type] = data[achievement_type]
|
|
|
|
///Unlocks an achievement of a specific type.
|
|
/datum/achievement_data/proc/unlock(achievement_type, mob/user)
|
|
var/datum/award/A = SSachievements.awards[achievement_type]
|
|
get_data(achievement_type) //Get the current status first if necessary
|
|
if(istype(A, /datum/award/achievement))
|
|
data[achievement_type] = TRUE
|
|
A.on_unlock(user) //Only on default achievement, as scores keep going up.
|
|
else if(istype(A, /datum/award/score))
|
|
data[achievement_type] += 1
|
|
|
|
///Getter for the status/score of an achievement
|
|
/datum/achievement_data/proc/get_achievement_status(achievement_type)
|
|
return data[achievement_type]
|
|
|
|
///Resets an achievement to default values.
|
|
/datum/achievement_data/proc/reset(achievement_type)
|
|
var/datum/award/A = SSachievements.awards[achievement_type]
|
|
get_data(achievement_type)
|
|
if(istype(A, /datum/award/achievement))
|
|
data[achievement_type] = FALSE
|
|
else if(istype(A, /datum/award/score))
|
|
data[achievement_type] = 0
|
|
|
|
/datum/achievement_data/ui_base_html(html)
|
|
var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/achievements)
|
|
. = replacetext(html, "<!--customheadhtml-->", assets.css_tag())
|
|
|
|
/datum/achievement_data/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.always_state)
|
|
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
|
if(!ui)
|
|
var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/achievements)
|
|
assets.send(user)
|
|
ui = new(user, src, ui_key, "achievements", "Achievements Menu", 800, 1000, master_ui, state)
|
|
ui.open()
|
|
|
|
/datum/achievement_data/ui_data(mob/user)
|
|
var/ret_data = list() // screw standards (qustinnus you must rename src.data ok)
|
|
ret_data["categories"] = list("Bosses", "Misc" , "Scores")
|
|
ret_data["achievements"] = list()
|
|
ret_data["user_key"] = user.ckey
|
|
|
|
var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/achievements)
|
|
//This should be split into static data later
|
|
for(var/achievement_type in SSachievements.awards)
|
|
if(!SSachievements.awards[achievement_type].name) //No name? we a subtype.
|
|
continue
|
|
if(isnull(data[achievement_type])) //We're still loading
|
|
continue
|
|
var/list/this = list(
|
|
"name" = SSachievements.awards[achievement_type].name,
|
|
"desc" = SSachievements.awards[achievement_type].desc,
|
|
"category" = SSachievements.awards[achievement_type].category,
|
|
"icon_class" = assets.icon_class_name(SSachievements.awards[achievement_type].icon),
|
|
"value" = data[achievement_type],
|
|
"score" = ispath(achievement_type,/datum/award/score)
|
|
)
|
|
ret_data["achievements"] += list(this)
|
|
|
|
return ret_data
|
|
|
|
/datum/achievement_data/ui_static_data(mob/user)
|
|
. = ..()
|
|
.["highscore"] = list()
|
|
for(var/score in SSachievements.scores)
|
|
var/datum/award/score/S = SSachievements.scores[score]
|
|
if(!S.name || !S.track_high_scores || !S.high_scores.len)
|
|
continue
|
|
.["highscore"] += list(list("name" = S.name,"scores" = S.high_scores))
|
|
|
|
/client/verb/checkachievements()
|
|
set category = "OOC"
|
|
set name = "Check achievements"
|
|
set desc = "See all of your achievements!"
|
|
|
|
player_details.achievements.ui_interact(usr)
|
|
|
|
|
|
/mob/verb/gimme_jackpot()
|
|
client.give_award(/datum/award/achievement/misc/time_waste,src)
|