mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-19 11:18:49 +01:00
Co-authored-by: silicons <no@you.cat> Co-authored-by: LordME <58342752+TheLordME@users.noreply.github.com>
285 lines
8.2 KiB
Plaintext
285 lines
8.2 KiB
Plaintext
/**
|
|
* sets a character data key to a value
|
|
*
|
|
* warning: lists are actually a shared reference, this is a known issue
|
|
* todo: on character setup refactor, redo this behavior if possible
|
|
*/
|
|
/datum/preferences/proc/set_character_data(key, value)
|
|
character[key] = value
|
|
|
|
/**
|
|
* reads a character data key
|
|
*
|
|
* warning: lists are actually a shared reference, this is a known issue
|
|
* todo: on character setup refactor, redo this behavior if possible
|
|
*/
|
|
/datum/preferences/proc/get_character_data(key)
|
|
return character[key]
|
|
|
|
/**
|
|
* sets a global options data key to a value
|
|
*/
|
|
/datum/preferences/proc/set_global_data(key, value)
|
|
options[key] = value
|
|
|
|
/**
|
|
* reads a global options data key
|
|
*/
|
|
/datum/preferences/proc/get_global_data(key)
|
|
return options[key]
|
|
|
|
/**
|
|
* checked read of a global options key;
|
|
* use when accessing from an outside datum to that key
|
|
*/
|
|
/datum/preferences/proc/checked_get_global_data(key)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(!I.is_global)
|
|
CRASH("tried to get character key")
|
|
return options[key]
|
|
|
|
/**
|
|
* checked write of a global options key;
|
|
* use when accessing from an outside datum to that key
|
|
*/
|
|
/datum/preferences/proc/checked_set_global_data(key, value)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(!I.is_global)
|
|
CRASH("tried to set character key")
|
|
options[key] = I.filter_data(src, value)
|
|
|
|
/**
|
|
* checked read of a character key;
|
|
* use when accessing from an outside datum to that key
|
|
*/
|
|
/datum/preferences/proc/checked_get_character_data(key)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(!I.is_global)
|
|
CRASH("tried to get global key")
|
|
return character[key]
|
|
|
|
/**
|
|
* checked write of a character key;
|
|
* use when accessing from an outside datum to that key
|
|
*/
|
|
/datum/preferences/proc/checked_set_character_data(key, value)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(I.is_global)
|
|
CRASH("tried to set global key")
|
|
character[key] = I.filter_data(src, value)
|
|
|
|
/**
|
|
* flush character data to disk
|
|
*/
|
|
/datum/preferences/proc/write_character_data(savefile/S, slot, list/errors)
|
|
var/old_cd = S.cd
|
|
S.cd = "/"
|
|
var/list/transformed = list()
|
|
//! warning: missing keys are automatically dropped.
|
|
//? Handle abstract
|
|
//! Write character data version
|
|
transformed[CHARACTER_DATA_VERSION] = character[CHARACTER_DATA_VERSION]
|
|
//? Handle prefs
|
|
for(var/key in character)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(!I)
|
|
continue
|
|
if(I.is_global)
|
|
continue
|
|
transformed[key] = I.serialize_data(src, I.filter_data(src, character[key], errors), errors)
|
|
S["slot_[slot]"] << transformed
|
|
S.cd = old_cd
|
|
|
|
/**
|
|
* load character data from disk
|
|
*/
|
|
/datum/preferences/proc/read_character_data(savefile/S, slot, list/errors)
|
|
character = list()
|
|
var/old_cd = S.cd
|
|
S.cd = "/"
|
|
var/list/transforming
|
|
S["slot_[slot]"] >> transforming
|
|
if(!islist(transforming))
|
|
transforming = list()
|
|
//! warning: missing keys are automatically dropped.
|
|
//? Handle abstract
|
|
//! Read character data version
|
|
character[CHARACTER_DATA_VERSION] = transforming[CHARACTER_DATA_VERSION]
|
|
//? Handle prefs
|
|
for(var/key in preference_by_key)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(!I)
|
|
continue
|
|
if(I.is_global)
|
|
continue
|
|
character[key] = I.filter_data(src, I.deserialize_data(src, transforming[key], errors), errors)
|
|
S.cd = old_cd
|
|
|
|
/**
|
|
* flush global data to disk
|
|
*/
|
|
/datum/preferences/proc/write_global_data(savefile/S, list/errors)
|
|
var/old_cd = S.cd
|
|
S.cd = "/"
|
|
var/list/transformed = list()
|
|
//! warning: missing keys are automatically dropped.
|
|
//? Handle abstract
|
|
//? Handle prefs
|
|
for(var/key in options)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(!I)
|
|
continue
|
|
if(!I.is_global)
|
|
continue
|
|
transformed[key] = I.serialize_data(src, I.filter_data(src, character[key], errors), errors)
|
|
S["global"] << transformed
|
|
S.cd = old_cd
|
|
|
|
/**
|
|
* load global data from disk
|
|
*/
|
|
/datum/preferences/proc/read_global_data(savefile/S, list/errors)
|
|
options = list()
|
|
var/old_cd = S.cd
|
|
S.cd = "/"
|
|
var/list/transforming
|
|
S["global"] >> transforming
|
|
if(!islist(transforming))
|
|
transforming = list()
|
|
//! warning: missing keys are automatically dropped.
|
|
//? Handle abstract
|
|
//? Handle prefs
|
|
for(var/key in preference_by_key)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(!I)
|
|
continue
|
|
if(!I.is_global)
|
|
continue
|
|
character[key] = I.filter_data(src, I.deserialize_data(src, transforming[key], errors), errors)
|
|
S.cd = old_cd
|
|
|
|
/**
|
|
* checked set preference data
|
|
*/
|
|
/datum/preferences/proc/set_preference(pref, value)
|
|
var/datum/category_item/player_setup_item/preference = preference_by_type[pref]
|
|
value = preference.filter_data(src, value)
|
|
if(preference.is_global)
|
|
options[preference.save_key] = value
|
|
else
|
|
character[preference.save_key] = value
|
|
|
|
/**
|
|
* checked get preference data
|
|
*/
|
|
/datum/preferences/proc/get_preference(pref)
|
|
var/datum/category_item/player_setup_item/preference = preference_by_type[pref]
|
|
if(preference.is_global)
|
|
return options[preference.save_key]
|
|
else
|
|
return character[preference.save_key]
|
|
|
|
/**
|
|
* sanitize prefs data
|
|
*/
|
|
/datum/preferences/proc/sanitize_preference(pref, list/errors)
|
|
var/datum/category_item/player_setup_item/preference = preference_by_type[pref]
|
|
if(preference.is_global)
|
|
return options[preference.save_key] = preference.filter_data(src, options[preference.save_key], errors)
|
|
else
|
|
return character[preference.save_key] = preference.filter_data(src, character[preference.save_key], errors)
|
|
|
|
/**
|
|
* resanitize everything
|
|
*/
|
|
/datum/preferences/proc/sanitize_everything(list/errors)
|
|
for(var/key in preference_by_key)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
I.sanitize_data(src, errors)
|
|
|
|
/datum/preferences/proc/sanitize_character(list/errors)
|
|
for(var/key in preference_by_key)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(I.is_global)
|
|
continue
|
|
I.sanitize_data(src, errors)
|
|
|
|
/datum/preferences/proc/sanitize_global(list/errors)
|
|
for(var/key in preference_by_key)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(!I.is_global)
|
|
continue
|
|
I.sanitize_data(src, errors)
|
|
|
|
/**
|
|
* default everything that has save keys
|
|
*/
|
|
/datum/preferences/proc/reset_everything_to_default()
|
|
character = list()
|
|
options = list()
|
|
for(var/key in preference_by_key)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(I.is_global)
|
|
set_global_data(key, I.informed_default_value(src))
|
|
else
|
|
set_character_data(key, I.informed_default_value(src))
|
|
|
|
/datum/preferences/proc/reset_character_to_default()
|
|
character = list()
|
|
for(var/key in preference_by_key)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(I.is_global)
|
|
continue
|
|
set_character_data(key, I.informed_default_value(src))
|
|
|
|
/datum/preferences/proc/reset_options_to_default()
|
|
options = list()
|
|
for(var/key in preference_by_key)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(!I.is_global)
|
|
continue
|
|
set_global_data(key, I.informed_default_value(src))
|
|
|
|
/**
|
|
* json export
|
|
*/
|
|
/datum/preferences/proc/json_export_character(list/errors)
|
|
var/list/transformed = list()
|
|
for(var/key in character)
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
transformed[key] = I.serialize_data(src, I.filter_data(src, character[key], errors), errors)
|
|
return json_encode(transformed)
|
|
|
|
/**
|
|
* json import
|
|
*/
|
|
/datum/preferences/proc/json_import_character(list/json, list/errors)
|
|
if(!islist(json))
|
|
json = safe_json_decode(json)
|
|
if(!islist(json))
|
|
return FALSE
|
|
var/list/parsed = list()
|
|
for(var/key in preference_by_key)
|
|
if(!json[key])
|
|
continue
|
|
var/datum/category_item/player_setup_item/I = preference_by_key[key]
|
|
if(!I)
|
|
continue
|
|
parsed += key
|
|
if(I.is_global)
|
|
errors?.Add("Skipping key [key] - was global")
|
|
continue
|
|
character[key] = I.filter_data(src, I.deserialize_data(src, json[key], errors), errors)
|
|
var/list/skipped = json - parsed
|
|
for(var/key in skipped)
|
|
errors?.Add("Skipping key [key] - no datum found.")
|
|
return TRUE
|
|
|
|
//! Skin stuff
|
|
/datum/preferences/proc/set_skin_data(key, value)
|
|
skin[key] = value
|
|
save_skin()
|
|
|
|
/datum/preferences/proc/get_skin_data(key)
|
|
return skin[key]
|