From f3bda2092f620464a6f73ef844663c89bf6193ec Mon Sep 17 00:00:00 2001 From: Leshana Date: Sat, 3 Jul 2021 15:43:03 -0400 Subject: [PATCH] Implement saving of paintings via the persistence mechanism. --- code/controllers/subsystems/persistence.dm | 3 +- code/game/objects/structures/artstuff.dm | 30 +++++++++------- code/modules/persistence/artwork.dm | 0 .../persistence/datum/persistence_datum.dm | 16 ++++----- code/modules/persistence/paintings.dm | 36 +++++++++++++++++++ vorestation.dme | 1 + 6 files changed, 64 insertions(+), 22 deletions(-) delete mode 100644 code/modules/persistence/artwork.dm create mode 100644 code/modules/persistence/paintings.dm diff --git a/code/controllers/subsystems/persistence.dm b/code/controllers/subsystems/persistence.dm index b751aa967f0..52adf3ae211 100644 --- a/code/controllers/subsystems/persistence.dm +++ b/code/controllers/subsystems/persistence.dm @@ -6,7 +6,8 @@ SUBSYSTEM_DEF(persistence) var/list/persistence_datums = list() /// Places our subsystem can spawn paintings (helps with art spawning differently across maps) - var/list/painting_frames = list() + var/list/obj/structure/sign/painting/painting_frames = list() + var/list/paintings = list() /datum/controller/subsystem/persistence/Initialize() . = ..() diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index ade24fea2b4..d1fba70ef67 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -293,7 +293,8 @@ /obj/structure/sign/painting/Initialize(mapload, dir, building) . = ..() - SSpersistence.painting_frames += src + if(persistence_id) + SSpersistence.painting_frames += src if(dir) set_dir(dir) if(building) @@ -369,20 +370,21 @@ for(var/y in 1 to height) grid[x][y] = I.GetPixel(x,h-y) -/* - /** * Loads a painting from SSpersistence. Called globally by said subsystem when it inits * * Deleting paintings leaves their json, so this proc will remove the json and try again if it finds one of those. */ /obj/structure/sign/painting/proc/load_persistent() - if(!persistence_id || !SSpersistence.paintings || !SSpersistence.paintings[persistence_id]) + if(!persistence_id || !SSpersistence.paintings) return - var/list/painting_category = SSpersistence.paintings[persistence_id] + var/list/painting_category = list() + for (var/list/P in SSpersistence.paintings) + if(P["persistence_id"] == persistence_id) + painting_category[++painting_category.len] = P var/list/painting while(!painting) - if(!length(SSpersistence.paintings[persistence_id])) + if(!length(painting_category)) return //aborts loading anything this category has no usable paintings var/list/chosen = pick(painting_category) if(!fexists("data/paintings/[persistence_id]/[chosen["md5"]].png")) //shitmin deleted this art, lets remove json entry to avoid errors @@ -426,10 +428,8 @@ current_canvas.painting_name = "Untitled Artwork" var/data = current_canvas.get_data_string() var/md5 = md5(lowertext(data)) - var/list/current = SSpersistence.paintings[persistence_id] - if(!current) - current = list() - for(var/list/entry in current) + LAZYINITLIST(SSpersistence.paintings) + for(var/list/entry in SSpersistence.paintings) if(entry["md5"] == md5) return var/png_directory = "data/paintings/[persistence_id]/" @@ -437,9 +437,13 @@ var/result = rustg_dmi_create_png(png_path,"[current_canvas.width]","[current_canvas.height]",data) if(result) CRASH("Error saving persistent painting: [result]") - current += list(list("title" = current_canvas.painting_name , "md5" = md5, "author" = current_canvas.author_name, "ckey" = current_canvas.author_ckey)) - SSpersistence.paintings[persistence_id] = current -*/ + SSpersistence.paintings += list(list( + "persistence_id" = persistence_id, + "title" = current_canvas.painting_name, + "md5" = md5, + "author" = current_canvas.author_name, + "ckey" = current_canvas.author_ckey + )) /* /obj/structure/sign/painting/vv_get_dropdown() diff --git a/code/modules/persistence/artwork.dm b/code/modules/persistence/artwork.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/persistence/datum/persistence_datum.dm b/code/modules/persistence/datum/persistence_datum.dm index a52b57fb66c..325ff15ceda 100644 --- a/code/modules/persistence/datum/persistence_datum.dm +++ b/code/modules/persistence/datum/persistence_datum.dm @@ -20,6 +20,14 @@ if(!isnull(entries_decay_at) && !isnull(entries_expire_at)) entries_decay_at = round(entries_expire_at * entries_decay_at) +/datum/persistent/proc/Initialize() + if(fexists(filename)) + var/list/tokens = json_decode(file2text(filename)) + for(var/list/token in tokens) + if(!CheckTokenSanity(token)) + tokens -= token + ProcessAndApplyTokens(tokens) + /datum/persistent/proc/GetValidTurf(var/turf/T, var/list/token) if(T && CheckTurfContents(T, token)) return T @@ -93,14 +101,6 @@ "age" = GetEntryAge(entry) ) -/datum/persistent/proc/Initialize() - if(fexists(filename)) - var/list/tokens = json_decode(file2text(filename)) - for(var/list/token in tokens) - if(!CheckTokenSanity(token)) - tokens -= token - ProcessAndApplyTokens(tokens) - /datum/persistent/proc/Shutdown() if(fexists(filename)) fdel(filename) diff --git a/code/modules/persistence/paintings.dm b/code/modules/persistence/paintings.dm new file mode 100644 index 00000000000..440cf34a743 --- /dev/null +++ b/code/modules/persistence/paintings.dm @@ -0,0 +1,36 @@ +/datum/persistent/paintings + name = "paintings" + entries_expire_at = 10 // 10 rounds + +/datum/persistent/paintings/SetFilename() + filename = "data/persistent/paintings.json" + +/datum/persistent/paintings/Initialize() + . = ..() + if(fexists(filename)) + SSpersistence.paintings = json_decode(file2text(filename)) + var/list/tokens = SSpersistence.paintings + for(var/list/token in tokens) + token["age"]++ // Increment age! + if(!CheckTokenSanity(token)) + tokens -= token + + for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames) + P.load_persistent() + return + +/datum/persistent/paintings/CheckTokenSanity(var/list/token) + var/png_filename = "data/paintings/[token["persistence_id"]]/[token["md5"]].png" + if(!fexists(png_filename)) + return FALSE + if(token["age"] > entries_expire_at) + fdel(png_filename) + return FALSE + +/datum/persistent/paintings/Shutdown() + for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames) + P.save_persistent() + + if(fexists(filename)) + fdel(filename) + to_file(file(filename), json_encode(SSpersistence.paintings)) diff --git a/vorestation.dme b/vorestation.dme index 34378447057..3dff6f48bf7 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3327,6 +3327,7 @@ #include "code\modules\persistence\filth.dm" #include "code\modules\persistence\graffiti.dm" #include "code\modules\persistence\noticeboard.dm" +#include "code\modules\persistence\paintings.dm" #include "code\modules\persistence\serialize.dm" #include "code\modules\persistence\datum\persistence_datum.dm" #include "code\modules\persistence\effects\filth.dm"