diff --git a/code/modules/client/preference_setup/vore/08_nif.dm b/code/modules/client/preference_setup/vore/08_nif.dm index 365b072f393..e4a760be833 100644 --- a/code/modules/client/preference_setup/vore/08_nif.dm +++ b/code/modules/client/preference_setup/vore/08_nif.dm @@ -5,19 +5,34 @@ var/list/nif_savedata // Definition of the stuff for NIFs +// Magic bullshit, they're stored separately from everything else /datum/category_item/player_setup_item/vore/nif name = "NIF Data" sort_order = 8 -/datum/category_item/player_setup_item/vore/nif/load_character(list/save_data) - pref.nif_path = save_data["nif_path"] - pref.nif_durability = save_data["nif_durability"] - pref.nif_savedata = save_data["nif_savedata"] +/proc/nif_savefile_path(ckey) + if(!ckey) + return + return "data/player_saves/[copytext(ckey,1,2)]/[ckey]/nif.json" -/datum/category_item/player_setup_item/vore/nif/save_character(list/save_data) - save_data["nif_path"] = pref.nif_path - save_data["nif_durability"] = pref.nif_durability - save_data["nif_savedata"] = pref.nif_savedata +/datum/category_item/player_setup_item/vore/nif/load_character() + var/datum/json_savefile/savefile = new /datum/json_savefile(nif_savefile_path(pref.client_ckey)) + var/list/save_data_file = savefile.get_entry("character[pref.default_slot]", list()) + + pref.nif_path = save_data_file["nif_path"] + pref.nif_durability = save_data_file["nif_durability"] + pref.nif_savedata = save_data_file["nif_savedata"] + +/datum/category_item/player_setup_item/vore/nif/save_character() + var/datum/json_savefile/savefile = new /datum/json_savefile(nif_savefile_path(pref.client_ckey)) + var/list/save_data_file = savefile.get_entry("character[pref.default_slot]", list()) + + save_data_file["nif_path"] = pref.nif_path + save_data_file["nif_durability"] = pref.nif_durability + save_data_file["nif_savedata"] = pref.nif_savedata + + savefile.set_entry("character[pref.default_slot]", save_data_file) + savefile.save() /datum/category_item/player_setup_item/vore/nif/sanitize_character() if(pref.nif_path && !ispath(pref.nif_path)) //We have at least a text string that should be a path. diff --git a/code/modules/client/preferences/migrations/14_nifs.dm b/code/modules/client/preferences/migrations/14_nifs.dm new file mode 100644 index 00000000000..4cc8f550c96 --- /dev/null +++ b/code/modules/client/preferences/migrations/14_nifs.dm @@ -0,0 +1,17 @@ +/// Moves nif stuff to it's own file +/datum/preferences/proc/migration_14_nifs(datum/json_savefile/S) + var/datum/json_savefile/new_savefile = new /datum/json_savefile(nif_savefile_path(client_ckey)) + + for(var/slot in 1 to config.character_slots) + var/list/prefs = S.get_entry("character[slot]", null) + if(!islist(prefs)) + continue + + var/list/new_data = list() + new_data["nif_path"] = prefs["nif_path"] + new_data["nif_durability"] = prefs["nif_durability"] + new_data["nif_savedata"] = prefs["nif_savedata"] + + new_savefile.set_entry("character[slot]", new_data) + + new_savefile.save() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 622e693379e..9bdba72a23b 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -1,5 +1,5 @@ #define SAVEFILE_VERSION_MIN 8 -#define SAVEFILE_VERSION_MAX 13 +#define SAVEFILE_VERSION_MAX 14 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -49,6 +49,16 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car log_debug("[client_ckey] preferences successfully migrated from [current_version] to v13.") to_chat(client, span_danger("v13 savefile migration complete.")) + // Migration for nifs + if(current_version < 14) + log_debug("[client_ckey] preferences migrating from [current_version] to v14....") + to_chat(client, span_danger("Migrating savefile from version [current_version] to v14...")) + + migration_14_nifs(S) + + log_debug("[client_ckey] preferences successfully migrated from [current_version] to v14.") + to_chat(client, span_danger("v14 savefile migration complete.")) + /datum/preferences/proc/update_character(current_version, list/save_data) // Migration from BYOND savefiles to JSON: Important milemark. diff --git a/code/modules/vore/persist/persist_vr.dm b/code/modules/vore/persist/persist_vr.dm index 0d55a07e279..09f5b05b6a8 100644 --- a/code/modules/vore/persist/persist_vr.dm +++ b/code/modules/vore/persist/persist_vr.dm @@ -106,6 +106,7 @@ prefs.size_multiplier = H.size_multiplier prefs.save_character() + prefs.save_preferences() // Saves mob's current coloration state to prefs // This basically needs to be the reverse of /datum/category_item/player_setup_item/general/body/copy_to_mob() ~Leshana @@ -230,35 +231,49 @@ * towards future shenanigans such as upgradable NIFs or different types or things of that nature, * without invoking the need for a bunch of different save file variables. */ -/proc/persist_nif_data(var/mob/living/carbon/human/H,var/datum/preferences/prefs) +/proc/persist_nif_data(mob/living/carbon/human/H) if(!istype(H)) stack_trace("Persist (NIF): Given a nonhuman: [H]") return - if(!prefs) - prefs = prep_for_persist(H) - - if(!prefs) - warning("Persist (NIF): [H] has no prefs datum, skipping") - return - var/obj/item/device/nif/nif = H.nif if(nif && H.ckey != nif.owner_key) return + var/slot = H?.mind?.loaded_from_slot + if(isnull(slot)) + warning("Persist (NIF): [H] has no mind slot, skipping") + return + + var/datum/json_savefile/savefile = new /datum/json_savefile(nif_savefile_path(H.ckey)) + var/list/save_data = savefile.get_entry("character[slot]", list()) + //If they have one, and if it's not installing without an owner, because //Someone who joins and immediately leaves again (wrong job choice, maybe) //should keep it even though it was probably doing the quick-calibrate, and their //owner will have been pre-set during the constructor. + var/nif_path + var/nif_durability + var/nif_savedata if(nif && !(nif.stat == NIF_INSTALLING && !nif.owner)) - prefs.nif_path = nif.type - prefs.nif_durability = nif.durability - prefs.nif_savedata = nif.save_data.Copy() + nif_path = nif.type + nif_durability = nif.durability + nif_savedata = nif.save_data.Copy() else - prefs.nif_path = null - prefs.nif_durability = null - prefs.nif_savedata = null + nif_path = null + nif_durability = null + nif_savedata = null - prefs.save_character() - prefs.save_preferences() + save_data["nif_path"] = nif_path + save_data["nif_durability"] = nif_durability + save_data["nif_savedata"] = nif_savedata + + savefile.set_entry("character[slot]", save_data) + savefile.save() + + // If they still have the same character loaded, update prefs + if(H?.client?.prefs?.default_slot == slot) + var/datum/category_group/player_setup_category/vore_cat = H.client.prefs.player_setup.categories_by_name["VORE"] + var/datum/category_item/player_setup_item/vore/nif/nif_prefs = vore_cat.items_by_name["NIF Data"] + nif_prefs.load_character() diff --git a/vorestation.dme b/vorestation.dme index 7d88a9b911c..5e43f984f15 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2027,6 +2027,7 @@ #include "code\modules\client\preferences\preferences_tg.dm" #include "code\modules\client\preferences\middleware\_middleware.dm" #include "code\modules\client\preferences\migrations\13_preferences.dm" +#include "code\modules\client\preferences\migrations\14_nifs.dm" #include "code\modules\client\preferences\types\admin.dm" #include "code\modules\client\preferences\types\chat.dm" #include "code\modules\client\preferences\types\ghost.dm"