Changes the character setup update flow.

Changes the way savefile version upgrades are done, letting each sub-setting handle it own upgrade path, while also making it easier to transfer settings between preferences and individual characters save slots.
This commit is contained in:
PsiOmegaDelta
2015-12-05 12:03:34 +01:00
parent eb06bc74af
commit fefa400604
3 changed files with 37 additions and 41 deletions
@@ -66,6 +66,10 @@
for(var/datum/category_group/player_setup_category/PS in categories)
PS.save_preferences(S)
/datum/category_collection/player_setup_collection/proc/update_setup(var/savefile/preferences, var/savefile/character)
for(var/datum/category_group/player_setup_category/PS in categories)
. = . || PS.update_setup(preferences, character)
/datum/category_collection/player_setup_collection/proc/header()
var/dat = ""
for(var/datum/category_group/player_setup_category/PS in categories)
@@ -137,6 +141,10 @@
for(var/datum/category_item/player_setup_item/PI in items)
PI.save_preferences(S)
/datum/category_group/player_setup_category/proc/update_setup(var/savefile/preferences, var/savefile/character)
for(var/datum/category_item/player_setup_item/PI in items)
. = . || PI.update_setup(preferences, character)
/datum/category_group/player_setup_category/proc/content(var/mob/user)
. = "<table style='width:100%'><tr style='vertical-align:top'><td style='width:50%'>"
var/current = 0
@@ -195,6 +203,12 @@
/datum/category_item/player_setup_item/proc/save_preferences(var/savefile/S)
return
/*
* Called when the item is asked to update user/global settings
*/
/datum/category_item/player_setup_item/proc/update_setup(var/savefile/preferences, var/savefile/character)
return 0
/datum/category_item/player_setup_item/proc/content()
return
+12 -5
View File
@@ -109,6 +109,8 @@ datum/preferences
var/client/client = null
var/savefile/loaded_preferences
var/savefile/loaded_character
var/datum/category_collection/player_setup_collection/player_setup
/datum/preferences/New(client/C)
@@ -123,9 +125,14 @@ datum/preferences
client = C
if(!IsGuestKey(C.key))
load_path(C.ckey)
if(load_preferences())
if(load_character())
return
load_preferences()
load_and_update_character()
/datum/preferences/proc/load_and_update_character(var/slot)
load_character(slot)
if(update_setup(loaded_preferences, loaded_character))
save_preferences()
save_character()
/datum/preferences/proc/ZeroSkills(var/forced = 0)
for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V])
@@ -219,7 +226,7 @@ datum/preferences
if("reload")
load_preferences()
load_character()
load_and_update_character()
if("open_load_dialog")
if(!IsGuestKey(user.key))
@@ -227,7 +234,7 @@ datum/preferences
return 1
if("changeslot")
load_character(text2num(href_list["num"]))
load_and_update_character(text2num(href_list["num"]))
close_load_dialog(user)
ShowChoices(user)
+11 -36
View File
@@ -1,30 +1,5 @@
#define SAVEFILE_VERSION_MIN 8
#define SAVEFILE_VERSION_MAX 11
//handles converting savefiles to new formats
//MAKE SURE YOU KEEP THIS UP TO DATE!
//If the sanity checks are capable of handling any issues. Only increase SAVEFILE_VERSION_MAX,
//this will mean that savefile_version will still be over SAVEFILE_VERSION_MIN, meaning
//this savefile update doesn't run everytime we load from the savefile.
//This is mainly for format changes, such as the bitflags in toggles changing order or something.
//if a file can't be updated, return 0 to delete it and start again
//if a file was updated, return 1
/datum/preferences/proc/savefile_update()
if(savefile_version < 8) //lazily delete everything + additional files so they can be saved in the new format
for(var/ckey in preferences_datums)
var/datum/preferences/D = preferences_datums[ckey]
if(D == src)
var/delpath = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/"
if(delpath && fexists(delpath))
fdel(delpath)
break
return 0
if(savefile_version == SAVEFILE_VERSION_MAX) //update successful.
save_preferences()
save_character()
return 1
return 0
#define SAVEFILE_VERSION_MAX 12
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey) return
@@ -39,15 +14,8 @@
S.cd = "/"
S["version"] >> savefile_version
//Conversion
if(!savefile_version || !isnum(savefile_version) || savefile_version < SAVEFILE_VERSION_MIN || savefile_version > SAVEFILE_VERSION_MAX)
if(!savefile_update()) //handles updates
savefile_version = SAVEFILE_VERSION_MAX
save_preferences()
save_character()
return 0
player_setup.load_preferences(S)
loaded_preferences = S
return 1
/datum/preferences/proc/save_preferences()
@@ -56,8 +24,9 @@
if(!S) return 0
S.cd = "/"
S["version"] << savefile_version
S["version"] << SAVEFILE_VERSION_MAX
player_setup.save_preferences(S)
loaded_preferences = S
return 1
/datum/preferences/proc/load_character(slot)
@@ -74,6 +43,7 @@
S.cd = "/character[slot]"
player_setup.load_character(S)
loaded_character = S
return 1
/datum/preferences/proc/save_character()
@@ -82,12 +52,17 @@
if(!S) return 0
S.cd = "/character[default_slot]"
S["version"] << SAVEFILE_VERSION_MAX
player_setup.save_character(S)
return 1
loaded_character = S
return S
/datum/preferences/proc/sanitize_preferences()
player_setup.sanitize_setup()
return 1
/datum/preferences/proc/update_setup(var/savefile/preferences, var/savefile/character)
return player_setup.update_setup(preferences, character)
#undef SAVEFILE_VERSION_MAX
#undef SAVEFILE_VERSION_MIN