From 0a94d5d56e261ff6c4afb048c537040d7e01bcb3 Mon Sep 17 00:00:00 2001 From: BartDrown <40639741+BartDrown@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:34:13 +0100 Subject: [PATCH 1/3] fix: clear prefs handles, read prefs version directly from file --- .../preference_setup/general/04_equipment.dm | 4 ++-- .../preference_setup/global/05_settings.dm | 14 +++++++++---- .../preference_setup/loadout/loadout.dm | 6 +++--- .../preference_setup/matchmaking/relations.dm | 4 ++-- .../preference_setup/preference_setup.dm | 10 +++++----- code/modules/client/preferences.dm | 6 +++++- code/modules/client/preferences_savefile.dm | 20 +++++++++++++------ code/modules/multiz/map_data.dm | 10 ++++++---- 8 files changed, 47 insertions(+), 27 deletions(-) diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm index 40be767a7f0..eccc08a499b 100644 --- a/code/modules/client/preference_setup/general/04_equipment.dm +++ b/code/modules/client/preference_setup/general/04_equipment.dm @@ -175,8 +175,8 @@ return ..() -/datum/category_item/player_setup_item/physical/equipment/update_setup(savefile/preferences, savefile/character) - if(preferences["version"] <= 16) +/datum/category_item/player_setup_item/physical/equipment/update_setup(pref_version, savefile/character) + if(pref_version <= 16) var/list/old_index_to_backpack_type = list( /decl/backpack_outfit/nothing, /decl/backpack_outfit/backsport, diff --git a/code/modules/client/preference_setup/global/05_settings.dm b/code/modules/client/preference_setup/global/05_settings.dm index b2548cba185..2bf06f93ea3 100644 --- a/code/modules/client/preference_setup/global/05_settings.dm +++ b/code/modules/client/preference_setup/global/05_settings.dm @@ -15,12 +15,17 @@ to_file(S["default_slot"], pref.default_slot) to_file(S["preference_values"], pref.preference_values) -/datum/category_item/player_setup_item/player_global/settings/update_setup(savefile/preferences, savefile/character) - if(preferences["version"] < 16) +/datum/category_item/player_setup_item/player_global/settings/update_setup(pref_version, savefile/character) + if(pref_version < 16) var/list/preferences_enabled var/list/preferences_disabled - from_file(preferences["preferences"], preferences_enabled) - from_file(preferences["preferences_disabled"], preferences_disabled) + // The old preferences/preferences_disabled keys live at cd="/" of the + // same file. Temporarily navigate there, read, then restore cd. + var/old_cd = character.cd + character.cd = "/" + from_file(character["preferences"], preferences_enabled) + from_file(character["preferences_disabled"], preferences_disabled) + character.cd = old_cd if(!istype(preferences_enabled)) preferences_enabled = list() @@ -36,6 +41,7 @@ else pref.preference_values[cp.key] = cp.default_value return 1 + return 0 /datum/category_item/player_setup_item/player_global/settings/sanitize_preferences() // Ensure our preferences are lists. diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index c2c925d40b7..c6848b7ae55 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -287,8 +287,8 @@ GLOBAL_LIST_EMPTY(gear_datums) return TOPIC_REFRESH return ..() -/datum/category_item/player_setup_item/loadout/update_setup(savefile/preferences, savefile/character) - if(preferences["version"] < 14) +/datum/category_item/player_setup_item/loadout/update_setup(pref_version, savefile/character) + if(pref_version < 14) var/list/old_gear = character["gear"] if(istype(old_gear)) // During updates data isn't sanitized yet, we have to do manual checks if(!istype(pref.gear_list)) pref.gear_list = list() @@ -296,7 +296,7 @@ GLOBAL_LIST_EMPTY(gear_datums) pref.gear_list[1] = old_gear return 1 - if(preferences["version"] < 15) + if(pref_version < 15) if(istype(pref.gear_list)) // Checks if the key of the pref.gear_list is a list. // If not the key is replaced with the corresponding value. diff --git a/code/modules/client/preference_setup/matchmaking/relations.dm b/code/modules/client/preference_setup/matchmaking/relations.dm index eeb694ea56e..d8c68644ae3 100644 --- a/code/modules/client/preference_setup/matchmaking/relations.dm +++ b/code/modules/client/preference_setup/matchmaking/relations.dm @@ -55,8 +55,8 @@ return TOPIC_REFRESH return ..() -/datum/category_item/player_setup_item/relations/update_setup(savefile/preferences, savefile/character) - if(preferences["version"] < 18) +/datum/category_item/player_setup_item/relations/update_setup(pref_version, savefile/character) + if(pref_version < 18) // Remove old relation types for(var/i in pref.relations) var/f = FALSE diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index 86e3009b50c..24c6d108731 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -92,9 +92,9 @@ var/const/CHARACTER_PREFERENCE_INPUT_TITLE = "Character Preference" for(var/datum/category_group/player_setup_category/PS in categories) PS.save_preferences(S) -/datum/category_collection/player_setup_collection/proc/update_setup(savefile/preferences, savefile/character) +/datum/category_collection/player_setup_collection/proc/update_setup(pref_version, savefile/character) for(var/datum/category_group/player_setup_category/PS in categories) - . = PS.update_setup(preferences, character) || . + . = PS.update_setup(pref_version, character) || . /datum/category_collection/player_setup_collection/proc/header() var/dat = "" @@ -164,9 +164,9 @@ var/const/CHARACTER_PREFERENCE_INPUT_TITLE = "Character Preference" for(var/datum/category_item/player_setup_item/PI in items) PI.save_preferences(S) -/datum/category_group/player_setup_category/proc/update_setup(savefile/preferences, savefile/character) +/datum/category_group/player_setup_category/proc/update_setup(pref_version, savefile/character) for(var/datum/category_item/player_setup_item/PI in items) - . = PI.update_setup(preferences, character) || . + . = PI.update_setup(pref_version, character) || . /datum/category_group/player_setup_category/proc/content(mob/user) . = "
" @@ -238,7 +238,7 @@ var/const/CHARACTER_PREFERENCE_INPUT_TITLE = "Character Preference" /* * Called when the item is asked to update user/global settings */ -/datum/category_item/player_setup_item/proc/update_setup(savefile/preferences, savefile/character) +/datum/category_item/player_setup_item/proc/update_setup(pref_version, savefile/character) return 0 /datum/category_item/player_setup_item/proc/content() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index aebcb318cd9..76d1549d320 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -70,7 +70,9 @@ /datum/preferences/proc/load_and_update_character(slot) load_character(slot) - if(update_setup(loaded_preferences, loaded_character)) + var/migrated = update_setup(savefile_version, loaded_character) + if(loaded_character) del(loaded_character) + if(migrated) save_preferences() save_character() @@ -269,6 +271,8 @@ dat += "" dat += "
" + if(loaded_preferences) del(loaded_preferences) + if(loaded_character) del(loaded_character) var/savefile/S = new /savefile(path) if(S) dat += "Select a character slot to load
" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 3ae3f2b563f..b83812b3ea0 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -14,6 +14,8 @@ return 0 if(!fexists(path)) return 0 debug_world_log("LOADING PREFS FOR [usr]/[usr?.ckey] - PATH: [path]") + if(loaded_preferences) del(loaded_preferences) + if(loaded_character) del(loaded_character) var/savefile/S = new /savefile(path) if(!S) return 0 S.cd = "/" @@ -30,13 +32,15 @@ to_chat(client, span_warning("You're attempting to save your preferences a little too fast. Wait half a second, then try again.")) return 0 debug_world_log("SAVING PREFS FOR [usr]/[usr?.ckey] - PATH: [path]") + if(loaded_preferences) del(loaded_preferences) + if(loaded_character) del(loaded_character) var/savefile/S = new /savefile(path) if(!S) return 0 S.cd = "/" WRITE_FILE(S["version"], SAVEFILE_VERSION_MAX) player_setup.save_preferences(S) - loaded_preferences = S + del(S) return 1 /datum/preferences/proc/load_character(slot) @@ -49,6 +53,8 @@ if(!fexists(path)) return 0 debug_world_log("LOADING CHARACTER FOR [usr]/[usr?.ckey] - PATH: [path]") + if(loaded_preferences) del(loaded_preferences) + if(loaded_character) del(loaded_character) var/savefile/S = new /savefile(path) if(!S) return 0 S.cd = "/" @@ -80,23 +86,25 @@ to_chat(client, span_warning("You're attempting to save your character a little too fast. Wait half a second, then try again.")) return 0 debug_world_log("SAVING CHARACTER FOR [usr]/[usr?.ckey] - PATH: [path]") + if(loaded_preferences) del(loaded_preferences) + if(loaded_character) del(loaded_character) var/savefile/S = new /savefile(path) if(!S) return 0 S.cd = GLOB.maps_data.character_save_path(default_slot) S["version"] << SAVEFILE_VERSION_MAX player_setup.save_character(S) - loaded_character = S - return S + del(S) + return 1 /datum/preferences/proc/sanitize_preferences() player_setup.sanitize_setup() return 1 -/datum/preferences/proc/update_setup(savefile/preferences, savefile/character) - if(!preferences || !character) +/datum/preferences/proc/update_setup(pref_version, savefile/character) + if(!character) return 0 - return player_setup.update_setup(preferences, character) + return player_setup.update_setup(pref_version, character) #undef SAVEFILE_VERSION_MAX #undef SAVEFILE_VERSION_MIN diff --git a/code/modules/multiz/map_data.dm b/code/modules/multiz/map_data.dm index f3a9a88851c..665a7c3fdec 100644 --- a/code/modules/multiz/map_data.dm +++ b/code/modules/multiz/map_data.dm @@ -162,10 +162,12 @@ GLOBAL_DATUM_INIT(maps_data, /datum/maps_data, new) S.cd = original_cd // Attempting to make this call as side-effect free as possible /datum/maps_data/proc/private_use_legacy_saves(savefile/S, slot) - if(!S.dir.Find(path)) // If we cannot find the map path folder, load the legacy save - return TRUE - S.cd = "/[path]" // Finally, if we cannot find the character slot in the map path folder, load the legacy save - return !S.dir.Find("character[slot]") + // Directly read the version key at the path + // If no version is found, the slot has no version data, fall back to legacy + S.cd = "/[path]/character[slot]" + var/new_version + S["version"] >> new_version + return !new_version /datum/maps_data/proc/registrate(obj/map_data/MD) From 607fbad8ea2e315e3d547f718c46a89ba2d9c42a Mon Sep 17 00:00:00 2001 From: BartDrown <40639741+BartDrown@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:34:56 +0100 Subject: [PATCH 2/3] fix: skin tone change not visible in character setup menu --- code/modules/client/preferences.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 76d1549d320..c96ebcc9b10 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -232,13 +232,11 @@ character.backpack_setup = new(backpack, backpack_metadata["[backpack]"]) if (preview_should_rebuild_organs || !is_preview_copy) - character.force_update_limbs() character.update_mutations(0) character.update_implants(0) preview_should_rebuild_organs = FALSE - - character.update_body(0) + character.force_update_limbs() character.update_underwear(0) character.update_hair(0) From f64a8620de677b7993872c536f529d570a9fcdfd Mon Sep 17 00:00:00 2001 From: BartDrown <40639741+BartDrown@users.noreply.github.com> Date: Wed, 25 Feb 2026 21:26:42 +0100 Subject: [PATCH 3/3] chore: revert moving force_update_limb on character copy, skin tone change rebuild_organs, adjust max tone settings to reflect description --- code/modules/client/preference_setup/general/02_body.dm | 3 ++- code/modules/client/preferences.dm | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preference_setup/general/02_body.dm b/code/modules/client/preference_setup/general/02_body.dm index a0f8c5e87fe..d85ef2df3a7 100644 --- a/code/modules/client/preference_setup/general/02_body.dm +++ b/code/modules/client/preference_setup/general/02_body.dm @@ -205,7 +205,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O mob_species = GLOB.all_species[pref.species] if(new_s_tone && CanUseTopic(user)) - pref.s_tone = 35 - max(min(round(new_s_tone), 220), 1) + pref.s_tone = 35 - max(min(round(new_s_tone), 225), 1) + pref.preview_should_rebuild_organs = TRUE return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["skin_color"]) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c96ebcc9b10..0860bf62a19 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -232,11 +232,12 @@ character.backpack_setup = new(backpack, backpack_metadata["[backpack]"]) if (preview_should_rebuild_organs || !is_preview_copy) + character.force_update_limbs() character.update_mutations(0) character.update_implants(0) preview_should_rebuild_organs = FALSE - character.force_update_limbs() + character.update_body(0) character.update_underwear(0) character.update_hair(0)