mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-09 16:05:07 +00:00
* Clean up subsystem Initialize(), require an explicit result returned, give a formal way to fail (for SSlua) * [PR for MIRROR PR] Changes for 16248 (#16277) * Merge skyrat changes, update SR SS's, and remove lobby_eye * Apply suggestions from code review Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * Update modular_skyrat/modules/autotransfer/code/autotransfer.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * restore lobby_cam for now Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> Co-authored-by: Tastyfish <crazychris32@gmail.com> Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
75 lines
2.2 KiB
Plaintext
75 lines
2.2 KiB
Plaintext
SUBSYSTEM_DEF(achievements)
|
|
name = "Achievements"
|
|
flags = SS_NO_FIRE
|
|
init_order = INIT_ORDER_ACHIEVEMENTS
|
|
var/achievements_enabled = FALSE
|
|
|
|
///List of achievements
|
|
var/list/datum/award/achievement/achievements = list()
|
|
///List of scores
|
|
var/list/datum/award/score/scores = list()
|
|
///List of all awards
|
|
var/list/datum/award/awards = list()
|
|
|
|
/datum/controller/subsystem/achievements/Initialize()
|
|
if(!SSdbcore.Connect())
|
|
return SS_INIT_NO_NEED
|
|
achievements_enabled = TRUE
|
|
|
|
for(var/T in subtypesof(/datum/award/achievement))
|
|
var/instance = new T
|
|
achievements[T] = instance
|
|
awards[T] = instance
|
|
|
|
for(var/T in subtypesof(/datum/award/score))
|
|
var/instance = new T
|
|
scores[T] = instance
|
|
awards[T] = instance
|
|
|
|
update_metadata()
|
|
|
|
for(var/i in GLOB.clients)
|
|
var/client/C = i
|
|
if(!C.player_details.achievements.initialized)
|
|
C.player_details.achievements.InitializeData()
|
|
|
|
return SS_INIT_SUCCESS
|
|
|
|
/datum/controller/subsystem/achievements/Shutdown()
|
|
save_achievements_to_db()
|
|
|
|
/datum/controller/subsystem/achievements/proc/save_achievements_to_db()
|
|
var/list/cheevos_to_save = list()
|
|
for(var/ckey in GLOB.player_details)
|
|
var/datum/player_details/PD = GLOB.player_details[ckey]
|
|
if(!PD || !PD.achievements)
|
|
continue
|
|
cheevos_to_save += PD.achievements.get_changed_data()
|
|
if(!length(cheevos_to_save))
|
|
return
|
|
SSdbcore.MassInsert(format_table_name("achievements"),cheevos_to_save,duplicate_key = TRUE)
|
|
|
|
//Update the metadata if any are behind
|
|
/datum/controller/subsystem/achievements/proc/update_metadata()
|
|
var/list/current_metadata = list()
|
|
//select metadata here
|
|
var/datum/db_query/Q = SSdbcore.NewQuery("SELECT achievement_key,achievement_version FROM [format_table_name("achievement_metadata")]")
|
|
if(!Q.Execute(async = TRUE))
|
|
qdel(Q)
|
|
return
|
|
else
|
|
while(Q.NextRow())
|
|
current_metadata[Q.item[1]] = text2num(Q.item[2])
|
|
qdel(Q)
|
|
|
|
var/list/to_update = list()
|
|
for(var/T in awards)
|
|
var/datum/award/A = awards[T]
|
|
if(!A.database_id)
|
|
continue
|
|
if(!current_metadata[A.database_id] || current_metadata[A.database_id] < A.achievement_version)
|
|
to_update += list(A.get_metadata_row())
|
|
|
|
if(to_update.len)
|
|
SSdbcore.MassInsert(format_table_name("achievement_metadata"),to_update,duplicate_key = TRUE)
|