Skip to content

Commit 74ed6b0

Browse files
authored
Fix/character prefs not loading (#261)
* fix: clear prefs handles, read prefs version directly from file * fix: skin tone change not visible in character setup menu * chore: revert moving force_update_limb on character copy, skin tone change rebuild_organs, adjust max tone settings to reflect description
1 parent 71a44ad commit 74ed6b0

File tree

9 files changed

+49
-29
lines changed

9 files changed

+49
-29
lines changed

code/modules/client/preference_setup/general/02_body.dm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
205205

206206
mob_species = GLOB.all_species[pref.species]
207207
if(new_s_tone && CanUseTopic(user))
208-
pref.s_tone = 35 - max(min(round(new_s_tone), 220), 1)
208+
pref.s_tone = 35 - max(min(round(new_s_tone), 225), 1)
209+
pref.preview_should_rebuild_organs = TRUE
209210
return TOPIC_REFRESH_UPDATE_PREVIEW
210211

211212
else if(href_list["skin_color"])

code/modules/client/preference_setup/general/04_equipment.dm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@
175175

176176
return ..()
177177

178-
/datum/category_item/player_setup_item/physical/equipment/update_setup(savefile/preferences, savefile/character)
179-
if(preferences["version"] <= 16)
178+
/datum/category_item/player_setup_item/physical/equipment/update_setup(pref_version, savefile/character)
179+
if(pref_version <= 16)
180180
var/list/old_index_to_backpack_type = list(
181181
/decl/backpack_outfit/nothing,
182182
/decl/backpack_outfit/backsport,

code/modules/client/preference_setup/global/05_settings.dm

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@
1515
to_file(S["default_slot"], pref.default_slot)
1616
to_file(S["preference_values"], pref.preference_values)
1717

18-
/datum/category_item/player_setup_item/player_global/settings/update_setup(savefile/preferences, savefile/character)
19-
if(preferences["version"] < 16)
18+
/datum/category_item/player_setup_item/player_global/settings/update_setup(pref_version, savefile/character)
19+
if(pref_version < 16)
2020
var/list/preferences_enabled
2121
var/list/preferences_disabled
22-
from_file(preferences["preferences"], preferences_enabled)
23-
from_file(preferences["preferences_disabled"], preferences_disabled)
22+
// The old preferences/preferences_disabled keys live at cd="/" of the
23+
// same file. Temporarily navigate there, read, then restore cd.
24+
var/old_cd = character.cd
25+
character.cd = "/"
26+
from_file(character["preferences"], preferences_enabled)
27+
from_file(character["preferences_disabled"], preferences_disabled)
28+
character.cd = old_cd
2429

2530
if(!istype(preferences_enabled))
2631
preferences_enabled = list()
@@ -36,6 +41,7 @@
3641
else
3742
pref.preference_values[cp.key] = cp.default_value
3843
return 1
44+
return 0
3945

4046
/datum/category_item/player_setup_item/player_global/settings/sanitize_preferences()
4147
// Ensure our preferences are lists.

code/modules/client/preference_setup/loadout/loadout.dm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,16 +287,16 @@ GLOBAL_LIST_EMPTY(gear_datums)
287287
return TOPIC_REFRESH
288288
return ..()
289289

290-
/datum/category_item/player_setup_item/loadout/update_setup(savefile/preferences, savefile/character)
291-
if(preferences["version"] < 14)
290+
/datum/category_item/player_setup_item/loadout/update_setup(pref_version, savefile/character)
291+
if(pref_version < 14)
292292
var/list/old_gear = character["gear"]
293293
if(istype(old_gear)) // During updates data isn't sanitized yet, we have to do manual checks
294294
if(!istype(pref.gear_list)) pref.gear_list = list()
295295
if(!pref.gear_list.len) pref.gear_list.len++
296296
pref.gear_list[1] = old_gear
297297
return 1
298298

299-
if(preferences["version"] < 15)
299+
if(pref_version < 15)
300300
if(istype(pref.gear_list))
301301
// Checks if the key of the pref.gear_list is a list.
302302
// If not the key is replaced with the corresponding value.

code/modules/client/preference_setup/matchmaking/relations.dm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@
5555
return TOPIC_REFRESH
5656
return ..()
5757

58-
/datum/category_item/player_setup_item/relations/update_setup(savefile/preferences, savefile/character)
59-
if(preferences["version"] < 18)
58+
/datum/category_item/player_setup_item/relations/update_setup(pref_version, savefile/character)
59+
if(pref_version < 18)
6060
// Remove old relation types
6161
for(var/i in pref.relations)
6262
var/f = FALSE

code/modules/client/preference_setup/preference_setup.dm

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ var/const/CHARACTER_PREFERENCE_INPUT_TITLE = "Character Preference"
9292
for(var/datum/category_group/player_setup_category/PS in categories)
9393
PS.save_preferences(S)
9494

95-
/datum/category_collection/player_setup_collection/proc/update_setup(savefile/preferences, savefile/character)
95+
/datum/category_collection/player_setup_collection/proc/update_setup(pref_version, savefile/character)
9696
for(var/datum/category_group/player_setup_category/PS in categories)
97-
. = PS.update_setup(preferences, character) || .
97+
. = PS.update_setup(pref_version, character) || .
9898

9999
/datum/category_collection/player_setup_collection/proc/header()
100100
var/dat = ""
@@ -164,9 +164,9 @@ var/const/CHARACTER_PREFERENCE_INPUT_TITLE = "Character Preference"
164164
for(var/datum/category_item/player_setup_item/PI in items)
165165
PI.save_preferences(S)
166166

167-
/datum/category_group/player_setup_category/proc/update_setup(savefile/preferences, savefile/character)
167+
/datum/category_group/player_setup_category/proc/update_setup(pref_version, savefile/character)
168168
for(var/datum/category_item/player_setup_item/PI in items)
169-
. = PI.update_setup(preferences, character) || .
169+
. = PI.update_setup(pref_version, character) || .
170170

171171
/datum/category_group/player_setup_category/proc/content(mob/user)
172172
. = "<table style='width:100%'><tr style='vertical-align:top'><td style='width:50%'>"
@@ -238,7 +238,7 @@ var/const/CHARACTER_PREFERENCE_INPUT_TITLE = "Character Preference"
238238
/*
239239
* Called when the item is asked to update user/global settings
240240
*/
241-
/datum/category_item/player_setup_item/proc/update_setup(savefile/preferences, savefile/character)
241+
/datum/category_item/player_setup_item/proc/update_setup(pref_version, savefile/character)
242242
return 0
243243

244244
/datum/category_item/player_setup_item/proc/content()

code/modules/client/preferences.dm

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@
7070

7171
/datum/preferences/proc/load_and_update_character(slot)
7272
load_character(slot)
73-
if(update_setup(loaded_preferences, loaded_character))
73+
var/migrated = update_setup(savefile_version, loaded_character)
74+
if(loaded_character) del(loaded_character)
75+
if(migrated)
7476
save_preferences()
7577
save_character()
7678

@@ -235,7 +237,6 @@
235237
character.update_implants(0)
236238
preview_should_rebuild_organs = FALSE
237239

238-
239240
character.update_body(0)
240241
character.update_underwear(0)
241242

@@ -269,6 +270,8 @@
269270
dat += "<body>"
270271
dat += "<tt><center>"
271272

273+
if(loaded_preferences) del(loaded_preferences)
274+
if(loaded_character) del(loaded_character)
272275
var/savefile/S = new /savefile(path)
273276
if(S)
274277
dat += "<b>Select a character slot to load</b><hr>"

code/modules/client/preferences_savefile.dm

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
return 0
1515
if(!fexists(path)) return 0
1616
debug_world_log("LOADING PREFS FOR [usr]/[usr?.ckey] - PATH: [path]")
17+
if(loaded_preferences) del(loaded_preferences)
18+
if(loaded_character) del(loaded_character)
1719
var/savefile/S = new /savefile(path)
1820
if(!S) return 0
1921
S.cd = "/"
@@ -30,13 +32,15 @@
3032
to_chat(client, span_warning("You're attempting to save your preferences a little too fast. Wait half a second, then try again."))
3133
return 0
3234
debug_world_log("SAVING PREFS FOR [usr]/[usr?.ckey] - PATH: [path]")
35+
if(loaded_preferences) del(loaded_preferences)
36+
if(loaded_character) del(loaded_character)
3337
var/savefile/S = new /savefile(path)
3438
if(!S) return 0
3539
S.cd = "/"
3640

3741
WRITE_FILE(S["version"], SAVEFILE_VERSION_MAX)
3842
player_setup.save_preferences(S)
39-
loaded_preferences = S
43+
del(S)
4044
return 1
4145

4246
/datum/preferences/proc/load_character(slot)
@@ -49,6 +53,8 @@
4953
if(!fexists(path)) return 0
5054

5155
debug_world_log("LOADING CHARACTER FOR [usr]/[usr?.ckey] - PATH: [path]")
56+
if(loaded_preferences) del(loaded_preferences)
57+
if(loaded_character) del(loaded_character)
5258
var/savefile/S = new /savefile(path)
5359
if(!S) return 0
5460
S.cd = "/"
@@ -80,23 +86,25 @@
8086
to_chat(client, span_warning("You're attempting to save your character a little too fast. Wait half a second, then try again."))
8187
return 0
8288
debug_world_log("SAVING CHARACTER FOR [usr]/[usr?.ckey] - PATH: [path]")
89+
if(loaded_preferences) del(loaded_preferences)
90+
if(loaded_character) del(loaded_character)
8391
var/savefile/S = new /savefile(path)
8492
if(!S) return 0
8593
S.cd = GLOB.maps_data.character_save_path(default_slot)
8694

8795
S["version"] << SAVEFILE_VERSION_MAX
8896
player_setup.save_character(S)
89-
loaded_character = S
90-
return S
97+
del(S)
98+
return 1
9199

92100
/datum/preferences/proc/sanitize_preferences()
93101
player_setup.sanitize_setup()
94102
return 1
95103

96-
/datum/preferences/proc/update_setup(savefile/preferences, savefile/character)
97-
if(!preferences || !character)
104+
/datum/preferences/proc/update_setup(pref_version, savefile/character)
105+
if(!character)
98106
return 0
99-
return player_setup.update_setup(preferences, character)
107+
return player_setup.update_setup(pref_version, character)
100108

101109
#undef SAVEFILE_VERSION_MAX
102110
#undef SAVEFILE_VERSION_MIN

code/modules/multiz/map_data.dm

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,12 @@ GLOBAL_DATUM_INIT(maps_data, /datum/maps_data, new)
162162
S.cd = original_cd // Attempting to make this call as side-effect free as possible
163163

164164
/datum/maps_data/proc/private_use_legacy_saves(savefile/S, slot)
165-
if(!S.dir.Find(path)) // If we cannot find the map path folder, load the legacy save
166-
return TRUE
167-
S.cd = "/[path]" // Finally, if we cannot find the character slot in the map path folder, load the legacy save
168-
return !S.dir.Find("character[slot]")
165+
// Directly read the version key at the path
166+
// If no version is found, the slot has no version data, fall back to legacy
167+
S.cd = "/[path]/character[slot]"
168+
var/new_version
169+
S["version"] >> new_version
170+
return !new_version
169171

170172

171173
/datum/maps_data/proc/registrate(obj/map_data/MD)

0 commit comments

Comments
 (0)