Files
2023-07-22 12:00:59 +02:00

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]