diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 55a594cf21..802c761901 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -211,23 +211,27 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/load_preferences()
if(!path)
- return 0
+ return FALSE
if(world.time < loadprefcooldown)
if(istype(parent))
to_chat(parent, "You're attempting to load your preferences a little too fast. Wait half a second, then try again.")
- return 0
+ return FALSE
loadprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
if(!fexists(path))
- return 0
+ return FALSE
var/savefile/S = new /savefile(path)
if(!S)
- return 0
+ return FALSE
S.cd = "/"
var/needs_update = savefile_needs_update(S)
if(needs_update == -2) //fatal, can't load any data
- return 0
+ var/bacpath = "[path].updatebac" //todo: if the savefile version is higher then the server, check the backup, and give the player a prompt to load the backup
+ if (fexists(bacpath))
+ fdel(bacpath) //only keep 1 version of backup
+ fcopy(S, bacpath) //byond helpfully lets you use a savefile for the first arg.
+ return FALSE
. = TRUE
@@ -289,8 +293,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//try to fix any outdated data if necessary
if(needs_update >= 0)
+ var/bacpath = "[path].updatebac" //todo: if the savefile version is higher then the server, check the backup, and give the player a prompt to load the backup
+ if (fexists(bacpath))
+ fdel(bacpath) //only keep 1 version of backup
+ fcopy(S, bacpath) //byond helpfully lets you use a savefile for the first arg.
update_preferences(needs_update, S) //needs_update = savefile_version if we need an update (positive integer)
+
+
//Sanitize
ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor)))
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
@@ -332,7 +342,25 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
verify_keybindings_valid() // one of these days this will runtime and you'll be glad that i put it in a different proc so no one gets their saves wiped
- return 1
+ if(needs_update >= 0) //save the updated version
+ var/old_default_slot = default_slot
+ var/old_max_save_slots = max_save_slots
+
+ for (var/slot in S.dir) //but first, update all current character slots.
+ if (copytext(slot, 1, 10) != "character")
+ continue
+ var/slotnum = text2num(copytext(slot, 10))
+ if (!slotnum)
+ continue
+ max_save_slots = max(max_save_slots, slotnum) //so we can still update byond member slots after they lose memeber status
+ default_slot = slotnum
+ if (load_character()) // this updtates char slots
+ save_character()
+ default_slot = old_default_slot
+ max_save_slots = old_max_save_slots
+ save_preferences()
+
+ return TRUE
/datum/preferences/proc/verify_keybindings_valid()
// Sanitize the actual keybinds to make sure they exist.
@@ -422,17 +450,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/load_character(slot)
if(!path)
- return 0
+ return FALSE
if(world.time < loadcharcooldown) //This is before the check to see if the filepath exists to ensure that BYOND can't get hung up on read attempts when the hard drive is a little slow
if(istype(parent))
to_chat(parent, "You're attempting to load your character a little too fast. Wait half a second, then try again.")
return "SLOW THE FUCK DOWN" //the reason this isn't null is to make sure that people don't have their character slots overridden by random chars if they accidentally double-click a slot
loadcharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
if(!fexists(path))
- return 0
+ return FALSE
var/savefile/S = new /savefile(path)
if(!S)
- return 0
+ return FALSE
S.cd = "/"
if(!slot)
slot = default_slot
@@ -444,7 +472,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S.cd = "/character[slot]"
var/needs_update = savefile_needs_update(S)
if(needs_update == -2) //fatal, can't load any data
- return 0
+ return FALSE
. = TRUE
@@ -462,7 +490,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
pref_species = new newtype
- scars_index = rand(1,5)
+ scars_index = rand(1,5) // WHY
//Character
S["real_name"] >> real_name
@@ -616,6 +644,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
gear_points -= init_cost
//try to fix any outdated data if necessary
+ //preference updating will handle saving the updated data for us.
if(needs_update >= 0)
update_character(needs_update, S) //needs_update == savefile_version if we need an update (positive integer)