|
|
|
|
@@ -5,7 +5,7 @@
|
|
|
|
|
// You do not need to raise this if you are adding new values that have sane defaults.
|
|
|
|
|
// Only raise this value when changing the meaning/format/name/layout of an existing value
|
|
|
|
|
// where you would want the updater procs below to run
|
|
|
|
|
#define SAVEFILE_VERSION_MAX 53
|
|
|
|
|
#define SAVEFILE_VERSION_MAX 54
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
|
|
|
|
|
@@ -72,15 +72,15 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
var/job_engsec_med = 0
|
|
|
|
|
var/job_engsec_low = 0
|
|
|
|
|
|
|
|
|
|
S["job_civilian_high"] >> job_civilian_high
|
|
|
|
|
S["job_civilian_med"] >> job_civilian_med
|
|
|
|
|
S["job_civilian_low"] >> job_civilian_low
|
|
|
|
|
S["job_medsci_high"] >> job_medsci_high
|
|
|
|
|
S["job_medsci_med"] >> job_medsci_med
|
|
|
|
|
S["job_medsci_low"] >> job_medsci_low
|
|
|
|
|
S["job_engsec_high"] >> job_engsec_high
|
|
|
|
|
S["job_engsec_med"] >> job_engsec_med
|
|
|
|
|
S["job_engsec_low"] >> job_engsec_low
|
|
|
|
|
S["job_civilian_high"] >> job_civilian_high
|
|
|
|
|
S["job_civilian_med"] >> job_civilian_med
|
|
|
|
|
S["job_civilian_low"] >> job_civilian_low
|
|
|
|
|
S["job_medsci_high"] >> job_medsci_high
|
|
|
|
|
S["job_medsci_med"] >> job_medsci_med
|
|
|
|
|
S["job_medsci_low"] >> job_medsci_low
|
|
|
|
|
S["job_engsec_high"] >> job_engsec_high
|
|
|
|
|
S["job_engsec_med"] >> job_engsec_med
|
|
|
|
|
S["job_engsec_low"] >> job_engsec_low
|
|
|
|
|
|
|
|
|
|
//Can't use SSjob here since this happens right away on login
|
|
|
|
|
for(var/job in subtypesof(/datum/job))
|
|
|
|
|
@@ -173,10 +173,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
var/devourable
|
|
|
|
|
var/feeding
|
|
|
|
|
var/lickable
|
|
|
|
|
S["digestable"] >> digestable
|
|
|
|
|
S["devourable"] >> devourable
|
|
|
|
|
S["feeding"] >> feeding
|
|
|
|
|
S["lickable"] >> lickable
|
|
|
|
|
S["digestable"] >> digestable
|
|
|
|
|
S["devourable"] >> devourable
|
|
|
|
|
S["feeding"] >> feeding
|
|
|
|
|
S["lickable"] >> lickable
|
|
|
|
|
if(digestable)
|
|
|
|
|
vore_flags |= DIGESTABLE
|
|
|
|
|
if(devourable)
|
|
|
|
|
@@ -196,8 +196,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
features["taur"] = "Cow (Spotted)"
|
|
|
|
|
|
|
|
|
|
if(current_version < 31)
|
|
|
|
|
S["wing_color"] >> features["wings_color"]
|
|
|
|
|
S["horn_color"] >> features["horns_color"]
|
|
|
|
|
S["wing_color"] >> features["wings_color"]
|
|
|
|
|
S["horn_color"] >> features["horns_color"]
|
|
|
|
|
|
|
|
|
|
if(current_version < 33)
|
|
|
|
|
features["flavor_text"] = html_encode(features["flavor_text"])
|
|
|
|
|
@@ -346,6 +346,16 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
if(current_version < 53)
|
|
|
|
|
parallax = PARALLAX_INSANE
|
|
|
|
|
|
|
|
|
|
// Some genius decided to make features update on the loading part, go figure.
|
|
|
|
|
if(current_version < 54)
|
|
|
|
|
var/old_silicon_flavor = S["silicon_feature_flavor_text"]
|
|
|
|
|
if(length(old_silicon_flavor))
|
|
|
|
|
features["feature_silicon_flavor_text"] = old_silicon_flavor
|
|
|
|
|
var/old_flavor_text = S["flavor_text"]
|
|
|
|
|
// If they have the old flavor text but also have the new one, i suppose the new one is more important.
|
|
|
|
|
if(length(old_flavor_text) && !length(features["feature_flavor_text"]))
|
|
|
|
|
features["feature_flavor_text"] = old_flavor_text
|
|
|
|
|
|
|
|
|
|
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
|
|
|
|
|
if(!ckey)
|
|
|
|
|
return
|
|
|
|
|
@@ -380,70 +390,70 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
. = TRUE
|
|
|
|
|
|
|
|
|
|
//general preferences
|
|
|
|
|
S["ooccolor"] >> ooccolor
|
|
|
|
|
S["lastchangelog"] >> lastchangelog
|
|
|
|
|
S["UI_style"] >> UI_style
|
|
|
|
|
S["outline_color"] >> outline_color
|
|
|
|
|
S["outline_enabled"] >> outline_enabled
|
|
|
|
|
S["screentip_pref"] >> screentip_pref
|
|
|
|
|
S["screentip_color"] >> screentip_color
|
|
|
|
|
S["hotkeys"] >> hotkeys
|
|
|
|
|
S["chat_on_map"] >> chat_on_map
|
|
|
|
|
S["max_chat_length"] >> max_chat_length
|
|
|
|
|
S["ooccolor"] >> ooccolor
|
|
|
|
|
S["lastchangelog"] >> lastchangelog
|
|
|
|
|
S["UI_style"] >> UI_style
|
|
|
|
|
S["outline_color"] >> outline_color
|
|
|
|
|
S["outline_enabled"] >> outline_enabled
|
|
|
|
|
S["screentip_pref"] >> screentip_pref
|
|
|
|
|
S["screentip_color"] >> screentip_color
|
|
|
|
|
S["hotkeys"] >> hotkeys
|
|
|
|
|
S["chat_on_map"] >> chat_on_map
|
|
|
|
|
S["max_chat_length"] >> max_chat_length
|
|
|
|
|
S["see_chat_non_mob"] >> see_chat_non_mob
|
|
|
|
|
S["tgui_fancy"] >> tgui_fancy
|
|
|
|
|
S["tgui_lock"] >> tgui_lock
|
|
|
|
|
S["buttons_locked"] >> buttons_locked
|
|
|
|
|
S["windowflash"] >> windowflashing
|
|
|
|
|
S["tgui_fancy"] >> tgui_fancy
|
|
|
|
|
S["tgui_lock"] >> tgui_lock
|
|
|
|
|
S["buttons_locked"] >> buttons_locked
|
|
|
|
|
S["windowflash"] >> windowflashing
|
|
|
|
|
S["be_special"] >> be_special
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S["default_slot"] >> default_slot
|
|
|
|
|
S["chat_toggles"] >> chat_toggles
|
|
|
|
|
S["toggles"] >> toggles
|
|
|
|
|
S["deadmin"] >> deadmin
|
|
|
|
|
S["ghost_form"] >> ghost_form
|
|
|
|
|
S["ghost_orbit"] >> ghost_orbit
|
|
|
|
|
S["ghost_accs"] >> ghost_accs
|
|
|
|
|
S["ghost_others"] >> ghost_others
|
|
|
|
|
S["preferred_map"] >> preferred_map
|
|
|
|
|
S["ignoring"] >> ignoring
|
|
|
|
|
S["ghost_hud"] >> ghost_hud
|
|
|
|
|
S["inquisitive_ghost"] >> inquisitive_ghost
|
|
|
|
|
S["default_slot"] >> default_slot
|
|
|
|
|
S["chat_toggles"] >> chat_toggles
|
|
|
|
|
S["toggles"] >> toggles
|
|
|
|
|
S["deadmin"] >> deadmin
|
|
|
|
|
S["ghost_form"] >> ghost_form
|
|
|
|
|
S["ghost_orbit"] >> ghost_orbit
|
|
|
|
|
S["ghost_accs"] >> ghost_accs
|
|
|
|
|
S["ghost_others"] >> ghost_others
|
|
|
|
|
S["preferred_map"] >> preferred_map
|
|
|
|
|
S["ignoring"] >> ignoring
|
|
|
|
|
S["ghost_hud"] >> ghost_hud
|
|
|
|
|
S["inquisitive_ghost"] >> inquisitive_ghost
|
|
|
|
|
S["uses_glasses_colour"]>> uses_glasses_colour
|
|
|
|
|
S["clientfps"] >> clientfps
|
|
|
|
|
S["parallax"] >> parallax
|
|
|
|
|
S["ambientocclusion"] >> ambientocclusion
|
|
|
|
|
S["auto_fit_viewport"] >> auto_fit_viewport
|
|
|
|
|
S["widescreenpref"] >> widescreenpref
|
|
|
|
|
S["long_strip_menu"] >> long_strip_menu
|
|
|
|
|
S["clientfps"] >> clientfps
|
|
|
|
|
S["parallax"] >> parallax
|
|
|
|
|
S["ambientocclusion"] >> ambientocclusion
|
|
|
|
|
S["auto_fit_viewport"] >> auto_fit_viewport
|
|
|
|
|
S["widescreenpref"] >> widescreenpref
|
|
|
|
|
S["long_strip_menu"] >> long_strip_menu
|
|
|
|
|
S["pixel_size"] >> pixel_size
|
|
|
|
|
S["scaling_method"] >> scaling_method
|
|
|
|
|
S["hud_toggle_flash"] >> hud_toggle_flash
|
|
|
|
|
S["hud_toggle_color"] >> hud_toggle_color
|
|
|
|
|
S["menuoptions"] >> menuoptions
|
|
|
|
|
S["enable_tips"] >> enable_tips
|
|
|
|
|
S["tip_delay"] >> tip_delay
|
|
|
|
|
S["pda_style"] >> pda_style
|
|
|
|
|
S["pda_color"] >> pda_color
|
|
|
|
|
S["pda_skin"] >> pda_skin
|
|
|
|
|
S["hud_toggle_flash"] >> hud_toggle_flash
|
|
|
|
|
S["hud_toggle_color"] >> hud_toggle_color
|
|
|
|
|
S["menuoptions"] >> menuoptions
|
|
|
|
|
S["enable_tips"] >> enable_tips
|
|
|
|
|
S["tip_delay"] >> tip_delay
|
|
|
|
|
S["pda_style"] >> pda_style
|
|
|
|
|
S["pda_color"] >> pda_color
|
|
|
|
|
S["pda_skin"] >> pda_skin
|
|
|
|
|
|
|
|
|
|
// Custom hotkeys
|
|
|
|
|
S["key_bindings"] >> key_bindings
|
|
|
|
|
S["modless_key_bindings"] >> modless_key_bindings
|
|
|
|
|
S["key_bindings"] >> key_bindings
|
|
|
|
|
S["modless_key_bindings"] >> modless_key_bindings
|
|
|
|
|
|
|
|
|
|
//citadel code
|
|
|
|
|
S["arousable"] >> arousable
|
|
|
|
|
S["screenshake"] >> screenshake
|
|
|
|
|
S["damagescreenshake"] >> damagescreenshake
|
|
|
|
|
S["autostand"] >> autostand
|
|
|
|
|
S["cit_toggles"] >> cit_toggles
|
|
|
|
|
S["preferred_chaos"] >> preferred_chaos
|
|
|
|
|
S["auto_ooc"] >> auto_ooc
|
|
|
|
|
S["no_tetris_storage"] >> no_tetris_storage
|
|
|
|
|
S["arousable"] >> arousable
|
|
|
|
|
S["screenshake"] >> screenshake
|
|
|
|
|
S["damagescreenshake"] >> damagescreenshake
|
|
|
|
|
S["autostand"] >> autostand
|
|
|
|
|
S["cit_toggles"] >> cit_toggles
|
|
|
|
|
S["preferred_chaos"] >> preferred_chaos
|
|
|
|
|
S["auto_ooc"] >> auto_ooc
|
|
|
|
|
S["no_tetris_storage"] >> no_tetris_storage
|
|
|
|
|
|
|
|
|
|
//favorite outfits
|
|
|
|
|
S["favorite_outfits"] >> favorite_outfits
|
|
|
|
|
S["favorite_outfits"] >> favorite_outfits
|
|
|
|
|
|
|
|
|
|
var/list/parsed_favs = list()
|
|
|
|
|
for(var/typetext in favorite_outfits)
|
|
|
|
|
@@ -461,47 +471,47 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
update_preferences(needs_update, S) //needs_update = savefile_version if we need an update (positive integer)
|
|
|
|
|
|
|
|
|
|
//Sanitize
|
|
|
|
|
ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor)))
|
|
|
|
|
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
|
|
|
|
|
UI_style = sanitize_inlist(UI_style, GLOB.available_ui_styles, GLOB.available_ui_styles[1])
|
|
|
|
|
hotkeys = sanitize_integer(hotkeys, 0, 1, initial(hotkeys))
|
|
|
|
|
chat_on_map = sanitize_integer(chat_on_map, 0, 1, initial(chat_on_map))
|
|
|
|
|
ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor)))
|
|
|
|
|
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
|
|
|
|
|
UI_style = sanitize_inlist(UI_style, GLOB.available_ui_styles, GLOB.available_ui_styles[1])
|
|
|
|
|
hotkeys = sanitize_integer(hotkeys, 0, 1, initial(hotkeys))
|
|
|
|
|
chat_on_map = sanitize_integer(chat_on_map, 0, 1, initial(chat_on_map))
|
|
|
|
|
max_chat_length = sanitize_integer(max_chat_length, 1, CHAT_MESSAGE_MAX_LENGTH, initial(max_chat_length))
|
|
|
|
|
see_chat_non_mob = sanitize_integer(see_chat_non_mob, 0, 1, initial(see_chat_non_mob))
|
|
|
|
|
tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy))
|
|
|
|
|
tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock))
|
|
|
|
|
buttons_locked = sanitize_integer(buttons_locked, 0, 1, initial(buttons_locked))
|
|
|
|
|
windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing))
|
|
|
|
|
default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot))
|
|
|
|
|
toggles = sanitize_integer(toggles, 0, 16777215, initial(toggles))
|
|
|
|
|
deadmin = sanitize_integer(deadmin, 0, 16777215, initial(deadmin))
|
|
|
|
|
clientfps = sanitize_integer(clientfps, 0, 1000, 0)
|
|
|
|
|
parallax = sanitize_integer(parallax, PARALLAX_DISABLE, PARALLAX_INSANE, null)
|
|
|
|
|
ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
|
|
|
|
|
auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport))
|
|
|
|
|
widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref))
|
|
|
|
|
long_strip_menu = sanitize_integer(long_strip_menu, 0, 1, initial(long_strip_menu))
|
|
|
|
|
pixel_size = sanitize_integer(pixel_size, PIXEL_SCALING_AUTO, PIXEL_SCALING_3X, initial(pixel_size))
|
|
|
|
|
scaling_method = sanitize_text(scaling_method, initial(scaling_method))
|
|
|
|
|
see_chat_non_mob = sanitize_integer(see_chat_non_mob, 0, 1, initial(see_chat_non_mob))
|
|
|
|
|
tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy))
|
|
|
|
|
tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock))
|
|
|
|
|
buttons_locked = sanitize_integer(buttons_locked, 0, 1, initial(buttons_locked))
|
|
|
|
|
windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing))
|
|
|
|
|
default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot))
|
|
|
|
|
toggles = sanitize_integer(toggles, 0, 16777215, initial(toggles))
|
|
|
|
|
deadmin = sanitize_integer(deadmin, 0, 16777215, initial(deadmin))
|
|
|
|
|
clientfps = sanitize_integer(clientfps, 0, 1000, 0)
|
|
|
|
|
parallax = sanitize_integer(parallax, PARALLAX_DISABLE, PARALLAX_INSANE, null)
|
|
|
|
|
ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
|
|
|
|
|
auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport))
|
|
|
|
|
widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref))
|
|
|
|
|
long_strip_menu = sanitize_integer(long_strip_menu, 0, 1, initial(long_strip_menu))
|
|
|
|
|
pixel_size = sanitize_integer(pixel_size, PIXEL_SCALING_AUTO, PIXEL_SCALING_3X, initial(pixel_size))
|
|
|
|
|
scaling_method = sanitize_text(scaling_method, initial(scaling_method))
|
|
|
|
|
hud_toggle_flash = sanitize_integer(hud_toggle_flash, 0, 1, initial(hud_toggle_flash))
|
|
|
|
|
hud_toggle_color = sanitize_hexcolor(hud_toggle_color, 6, 1, initial(hud_toggle_color))
|
|
|
|
|
ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form))
|
|
|
|
|
ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit))
|
|
|
|
|
ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION)
|
|
|
|
|
ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION)
|
|
|
|
|
menuoptions = SANITIZE_LIST(menuoptions)
|
|
|
|
|
be_special = SANITIZE_LIST(be_special)
|
|
|
|
|
pda_style = sanitize_inlist(pda_style, GLOB.pda_styles, initial(pda_style))
|
|
|
|
|
pda_color = sanitize_hexcolor(pda_color, 6, 1, initial(pda_color))
|
|
|
|
|
pda_skin = sanitize_inlist(pda_skin, GLOB.pda_reskins, PDA_SKIN_ALT)
|
|
|
|
|
screenshake = sanitize_integer(screenshake, 0, 800, initial(screenshake))
|
|
|
|
|
damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake))
|
|
|
|
|
autostand = sanitize_integer(autostand, 0, 1, initial(autostand))
|
|
|
|
|
cit_toggles = sanitize_integer(cit_toggles, 0, 16777215, initial(cit_toggles))
|
|
|
|
|
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
|
|
|
|
|
no_tetris_storage = sanitize_integer(no_tetris_storage, 0, 1, initial(no_tetris_storage))
|
|
|
|
|
key_bindings = sanitize_islist(key_bindings, list())
|
|
|
|
|
modless_key_bindings = sanitize_islist(modless_key_bindings, list())
|
|
|
|
|
ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form))
|
|
|
|
|
ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit))
|
|
|
|
|
ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION)
|
|
|
|
|
ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION)
|
|
|
|
|
menuoptions = SANITIZE_LIST(menuoptions)
|
|
|
|
|
be_special = SANITIZE_LIST(be_special)
|
|
|
|
|
pda_style = sanitize_inlist(pda_style, GLOB.pda_styles, initial(pda_style))
|
|
|
|
|
pda_color = sanitize_hexcolor(pda_color, 6, 1, initial(pda_color))
|
|
|
|
|
pda_skin = sanitize_inlist(pda_skin, GLOB.pda_reskins, PDA_SKIN_ALT)
|
|
|
|
|
screenshake = sanitize_integer(screenshake, 0, 800, initial(screenshake))
|
|
|
|
|
damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake))
|
|
|
|
|
autostand = sanitize_integer(autostand, 0, 1, initial(autostand))
|
|
|
|
|
cit_toggles = sanitize_integer(cit_toggles, 0, 16777215, initial(cit_toggles))
|
|
|
|
|
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
|
|
|
|
|
no_tetris_storage = sanitize_integer(no_tetris_storage, 0, 1, initial(no_tetris_storage))
|
|
|
|
|
key_bindings = sanitize_islist(key_bindings, list())
|
|
|
|
|
modless_key_bindings = sanitize_islist(modless_key_bindings, list())
|
|
|
|
|
favorite_outfits = SANITIZE_LIST(favorite_outfits)
|
|
|
|
|
|
|
|
|
|
verify_keybindings_valid() // one of these days this will runtime and you'll be glad that i put it in a different proc so no one gets their saves wiped
|
|
|
|
|
@@ -663,7 +673,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
|
|
|
|
|
//Species
|
|
|
|
|
var/species_id
|
|
|
|
|
S["species"] >> species_id
|
|
|
|
|
S["species"] >> species_id
|
|
|
|
|
if(species_id)
|
|
|
|
|
if(species_id == "avian" || species_id == "aquatic")
|
|
|
|
|
species_id = "mammal"
|
|
|
|
|
@@ -678,63 +688,63 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
scars_index = rand(1,5) // WHY
|
|
|
|
|
|
|
|
|
|
//Character
|
|
|
|
|
S["real_name"] >> real_name
|
|
|
|
|
S["nameless"] >> nameless
|
|
|
|
|
S["custom_species"] >> custom_species
|
|
|
|
|
S["name_is_always_random"] >> be_random_name
|
|
|
|
|
S["body_is_always_random"] >> be_random_body
|
|
|
|
|
S["gender"] >> gender
|
|
|
|
|
S["body_model"] >> features["body_model"]
|
|
|
|
|
S["body_size"] >> features["body_size"]
|
|
|
|
|
S["age"] >> age
|
|
|
|
|
S["hair_color"] >> hair_color
|
|
|
|
|
S["facial_hair_color"] >> facial_hair_color
|
|
|
|
|
S["eye_type"] >> eye_type
|
|
|
|
|
S["left_eye_color"] >> left_eye_color
|
|
|
|
|
S["right_eye_color"] >> right_eye_color
|
|
|
|
|
S["use_custom_skin_tone"] >> use_custom_skin_tone
|
|
|
|
|
S["skin_tone"] >> skin_tone
|
|
|
|
|
S["hair_style_name"] >> hair_style
|
|
|
|
|
S["facial_style_name"] >> facial_hair_style
|
|
|
|
|
S["grad_style"] >> grad_style
|
|
|
|
|
S["grad_color"] >> grad_color
|
|
|
|
|
S["underwear"] >> underwear
|
|
|
|
|
S["undie_color"] >> undie_color
|
|
|
|
|
S["undershirt"] >> undershirt
|
|
|
|
|
S["shirt_color"] >> shirt_color
|
|
|
|
|
S["socks"] >> socks
|
|
|
|
|
S["socks_color"] >> socks_color
|
|
|
|
|
S["backbag"] >> backbag
|
|
|
|
|
S["jumpsuit_style"] >> jumpsuit_style
|
|
|
|
|
S["uplink_loc"] >> uplink_spawn_loc
|
|
|
|
|
S["custom_speech_verb"] >> custom_speech_verb
|
|
|
|
|
S["custom_tongue"] >> custom_tongue
|
|
|
|
|
S["additional_language"] >> additional_language
|
|
|
|
|
S["feature_mcolor"] >> features["mcolor"]
|
|
|
|
|
S["feature_lizard_tail"] >> features["tail_lizard"]
|
|
|
|
|
S["feature_lizard_snout"] >> features["snout"]
|
|
|
|
|
S["feature_lizard_horns"] >> features["horns"]
|
|
|
|
|
S["feature_lizard_frills"] >> features["frills"]
|
|
|
|
|
S["feature_lizard_spines"] >> features["spines"]
|
|
|
|
|
S["feature_lizard_legs"] >> features["legs"]
|
|
|
|
|
S["feature_human_tail"] >> features["tail_human"]
|
|
|
|
|
S["feature_human_ears"] >> features["ears"]
|
|
|
|
|
S["feature_deco_wings"] >> features["deco_wings"]
|
|
|
|
|
S["feature_insect_wings"] >> features["insect_wings"]
|
|
|
|
|
S["feature_insect_fluff"] >> features["insect_fluff"]
|
|
|
|
|
S["feature_insect_markings"] >> features["insect_markings"]
|
|
|
|
|
S["feature_arachnid_legs"] >> features["arachnid_legs"]
|
|
|
|
|
S["feature_arachnid_spinneret"] >> features["arachnid_spinneret"]
|
|
|
|
|
S["feature_arachnid_mandibles"] >> features["arachnid_mandibles"]
|
|
|
|
|
S["feature_horns_color"] >> features["horns_color"]
|
|
|
|
|
S["feature_wings_color"] >> features["wings_color"]
|
|
|
|
|
S["feature_color_scheme"] >> features["color_scheme"]
|
|
|
|
|
S["real_name"] >> real_name
|
|
|
|
|
S["nameless"] >> nameless
|
|
|
|
|
S["custom_species"] >> custom_species
|
|
|
|
|
S["name_is_always_random"] >> be_random_name
|
|
|
|
|
S["body_is_always_random"] >> be_random_body
|
|
|
|
|
S["gender"] >> gender
|
|
|
|
|
S["body_model"] >> features["body_model"]
|
|
|
|
|
S["body_size"] >> features["body_size"]
|
|
|
|
|
S["age"] >> age
|
|
|
|
|
S["hair_color"] >> hair_color
|
|
|
|
|
S["facial_hair_color"] >> facial_hair_color
|
|
|
|
|
S["eye_type"] >> eye_type
|
|
|
|
|
S["left_eye_color"] >> left_eye_color
|
|
|
|
|
S["right_eye_color"] >> right_eye_color
|
|
|
|
|
S["use_custom_skin_tone"] >> use_custom_skin_tone
|
|
|
|
|
S["skin_tone"] >> skin_tone
|
|
|
|
|
S["hair_style_name"] >> hair_style
|
|
|
|
|
S["facial_style_name"] >> facial_hair_style
|
|
|
|
|
S["grad_style"] >> grad_style
|
|
|
|
|
S["grad_color"] >> grad_color
|
|
|
|
|
S["underwear"] >> underwear
|
|
|
|
|
S["undie_color"] >> undie_color
|
|
|
|
|
S["undershirt"] >> undershirt
|
|
|
|
|
S["shirt_color"] >> shirt_color
|
|
|
|
|
S["socks"] >> socks
|
|
|
|
|
S["socks_color"] >> socks_color
|
|
|
|
|
S["backbag"] >> backbag
|
|
|
|
|
S["jumpsuit_style"] >> jumpsuit_style
|
|
|
|
|
S["uplink_loc"] >> uplink_spawn_loc
|
|
|
|
|
S["custom_speech_verb"] >> custom_speech_verb
|
|
|
|
|
S["custom_tongue"] >> custom_tongue
|
|
|
|
|
S["additional_language"] >> additional_language
|
|
|
|
|
S["feature_mcolor"] >> features["mcolor"]
|
|
|
|
|
S["feature_lizard_tail"] >> features["tail_lizard"]
|
|
|
|
|
S["feature_lizard_snout"] >> features["snout"]
|
|
|
|
|
S["feature_lizard_horns"] >> features["horns"]
|
|
|
|
|
S["feature_lizard_frills"] >> features["frills"]
|
|
|
|
|
S["feature_lizard_spines"] >> features["spines"]
|
|
|
|
|
S["feature_lizard_legs"] >> features["legs"]
|
|
|
|
|
S["feature_human_tail"] >> features["tail_human"]
|
|
|
|
|
S["feature_human_ears"] >> features["ears"]
|
|
|
|
|
S["feature_deco_wings"] >> features["deco_wings"]
|
|
|
|
|
S["feature_insect_wings"] >> features["insect_wings"]
|
|
|
|
|
S["feature_insect_fluff"] >> features["insect_fluff"]
|
|
|
|
|
S["feature_insect_markings"] >> features["insect_markings"]
|
|
|
|
|
S["feature_arachnid_legs"] >> features["arachnid_legs"]
|
|
|
|
|
S["feature_arachnid_spinneret"] >> features["arachnid_spinneret"]
|
|
|
|
|
S["feature_arachnid_mandibles"] >> features["arachnid_mandibles"]
|
|
|
|
|
S["feature_horns_color"] >> features["horns_color"]
|
|
|
|
|
S["feature_wings_color"] >> features["wings_color"]
|
|
|
|
|
S["feature_color_scheme"] >> features["color_scheme"]
|
|
|
|
|
S["persistent_scars"] >> persistent_scars
|
|
|
|
|
S["scars1"] >> scars_list["1"]
|
|
|
|
|
S["scars2"] >> scars_list["2"]
|
|
|
|
|
S["scars3"] >> scars_list["3"]
|
|
|
|
|
S["scars4"] >> scars_list["4"]
|
|
|
|
|
S["scars5"] >> scars_list["5"]
|
|
|
|
|
S["scars1"] >> scars_list["1"]
|
|
|
|
|
S["scars2"] >> scars_list["2"]
|
|
|
|
|
S["scars3"] >> scars_list["3"]
|
|
|
|
|
S["scars4"] >> scars_list["4"]
|
|
|
|
|
S["scars5"] >> scars_list["5"]
|
|
|
|
|
var/limbmodstr
|
|
|
|
|
S["modified_limbs"] >> limbmodstr
|
|
|
|
|
if(length(limbmodstr))
|
|
|
|
|
@@ -756,100 +766,88 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
else
|
|
|
|
|
tcg_decks = list()
|
|
|
|
|
|
|
|
|
|
S["chosen_limb_id"] >> chosen_limb_id
|
|
|
|
|
S["hide_ckey"] >> hide_ckey //saved per-character
|
|
|
|
|
S["chosen_limb_id"] >> chosen_limb_id
|
|
|
|
|
S["hide_ckey"] >> hide_ckey //saved per-character
|
|
|
|
|
|
|
|
|
|
//Custom names
|
|
|
|
|
for(var/custom_name_id in GLOB.preferences_custom_names)
|
|
|
|
|
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
|
|
|
|
|
S[savefile_slot_name] >> custom_names[custom_name_id]
|
|
|
|
|
|
|
|
|
|
S["preferred_ai_core_display"] >> preferred_ai_core_display
|
|
|
|
|
S["prefered_security_department"] >> prefered_security_department
|
|
|
|
|
S["preferred_ai_core_display"] >> preferred_ai_core_display
|
|
|
|
|
S["prefered_security_department"] >> prefered_security_department
|
|
|
|
|
|
|
|
|
|
//Jobs
|
|
|
|
|
S["joblessrole"] >> joblessrole
|
|
|
|
|
S["joblessrole"] >> joblessrole
|
|
|
|
|
|
|
|
|
|
//Load prefs
|
|
|
|
|
S["job_preferences"] >> job_preferences
|
|
|
|
|
S["job_preferences"] >> job_preferences
|
|
|
|
|
|
|
|
|
|
//Quirks
|
|
|
|
|
S["all_quirks"] >> all_quirks
|
|
|
|
|
S["all_quirks"] >> all_quirks
|
|
|
|
|
|
|
|
|
|
//Records
|
|
|
|
|
S["security_records"] >> security_records
|
|
|
|
|
S["medical_records"] >> medical_records
|
|
|
|
|
S["security_records"] >> security_records
|
|
|
|
|
S["medical_records"] >> medical_records
|
|
|
|
|
|
|
|
|
|
//Citadel code
|
|
|
|
|
S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"]
|
|
|
|
|
S["feature_mcolor2"] >> features["mcolor2"]
|
|
|
|
|
S["feature_mcolor3"] >> features["mcolor3"]
|
|
|
|
|
S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"]
|
|
|
|
|
S["feature_mcolor2"] >> features["mcolor2"]
|
|
|
|
|
S["feature_mcolor3"] >> features["mcolor3"]
|
|
|
|
|
// note safe json decode will runtime the first time it migrates but this is fine and it solves itself don't worry about it if you see it error
|
|
|
|
|
features["mam_body_markings"] = safe_json_decode(S["feature_mam_body_markings"])
|
|
|
|
|
S["feature_mam_tail"] >> features["mam_tail"]
|
|
|
|
|
S["feature_mam_ears"] >> features["mam_ears"]
|
|
|
|
|
S["feature_mam_tail_animated"] >> features["mam_tail_animated"]
|
|
|
|
|
S["feature_taur"] >> features["taur"]
|
|
|
|
|
S["feature_mam_snouts"] >> features["mam_snouts"]
|
|
|
|
|
S["feature_meat"] >> features["meat_type"]
|
|
|
|
|
S["feature_mam_tail"] >> features["mam_tail"]
|
|
|
|
|
S["feature_mam_ears"] >> features["mam_ears"]
|
|
|
|
|
S["feature_mam_tail_animated"] >> features["mam_tail_animated"]
|
|
|
|
|
S["feature_taur"] >> features["taur"]
|
|
|
|
|
S["feature_mam_snouts"] >> features["mam_snouts"]
|
|
|
|
|
S["feature_meat"] >> features["meat_type"]
|
|
|
|
|
//Xeno features
|
|
|
|
|
S["feature_xeno_tail"] >> features["xenotail"]
|
|
|
|
|
S["feature_xeno_dors"] >> features["xenodorsal"]
|
|
|
|
|
S["feature_xeno_head"] >> features["xenohead"]
|
|
|
|
|
S["feature_xeno_tail"] >> features["xenotail"]
|
|
|
|
|
S["feature_xeno_dors"] >> features["xenodorsal"]
|
|
|
|
|
S["feature_xeno_head"] >> features["xenohead"]
|
|
|
|
|
//cock features
|
|
|
|
|
S["feature_has_cock"] >> features["has_cock"]
|
|
|
|
|
S["feature_cock_shape"] >> features["cock_shape"]
|
|
|
|
|
S["feature_cock_color"] >> features["cock_color"]
|
|
|
|
|
S["feature_cock_length"] >> features["cock_length"]
|
|
|
|
|
S["feature_cock_diameter"] >> features["cock_diameter"]
|
|
|
|
|
S["feature_cock_taur"] >> features["cock_taur"]
|
|
|
|
|
S["feature_cock_visibility"] >> features["cock_visibility"]
|
|
|
|
|
S["feature_has_cock"] >> features["has_cock"]
|
|
|
|
|
S["feature_cock_shape"] >> features["cock_shape"]
|
|
|
|
|
S["feature_cock_color"] >> features["cock_color"]
|
|
|
|
|
S["feature_cock_length"] >> features["cock_length"]
|
|
|
|
|
S["feature_cock_diameter"] >> features["cock_diameter"]
|
|
|
|
|
S["feature_cock_taur"] >> features["cock_taur"]
|
|
|
|
|
S["feature_cock_visibility"] >> features["cock_visibility"]
|
|
|
|
|
//balls features
|
|
|
|
|
S["feature_has_balls"] >> features["has_balls"]
|
|
|
|
|
S["feature_balls_color"] >> features["balls_color"]
|
|
|
|
|
S["feature_balls_shape"] >> features["balls_shape"]
|
|
|
|
|
S["feature_balls_size"] >> features["balls_size"]
|
|
|
|
|
S["feature_balls_visibility"] >> features["balls_visibility"]
|
|
|
|
|
S["feature_has_balls"] >> features["has_balls"]
|
|
|
|
|
S["feature_balls_color"] >> features["balls_color"]
|
|
|
|
|
S["feature_balls_shape"] >> features["balls_shape"]
|
|
|
|
|
S["feature_balls_size"] >> features["balls_size"]
|
|
|
|
|
S["feature_balls_visibility"] >> features["balls_visibility"]
|
|
|
|
|
//breasts features
|
|
|
|
|
S["feature_has_breasts"] >> features["has_breasts"]
|
|
|
|
|
S["feature_breasts_size"] >> features["breasts_size"]
|
|
|
|
|
S["feature_breasts_shape"] >> features["breasts_shape"]
|
|
|
|
|
S["feature_breasts_color"] >> features["breasts_color"]
|
|
|
|
|
S["feature_breasts_producing"] >> features["breasts_producing"]
|
|
|
|
|
S["feature_breasts_visibility"] >> features["breasts_visibility"]
|
|
|
|
|
S["feature_has_breasts"] >> features["has_breasts"]
|
|
|
|
|
S["feature_breasts_size"] >> features["breasts_size"]
|
|
|
|
|
S["feature_breasts_shape"] >> features["breasts_shape"]
|
|
|
|
|
S["feature_breasts_color"] >> features["breasts_color"]
|
|
|
|
|
S["feature_breasts_producing"] >> features["breasts_producing"]
|
|
|
|
|
S["feature_breasts_visibility"] >> features["breasts_visibility"]
|
|
|
|
|
//vagina features
|
|
|
|
|
S["feature_has_vag"] >> features["has_vag"]
|
|
|
|
|
S["feature_vag_shape"] >> features["vag_shape"]
|
|
|
|
|
S["feature_vag_color"] >> features["vag_color"]
|
|
|
|
|
S["feature_vag_visibility"] >> features["vag_visibility"]
|
|
|
|
|
S["feature_has_vag"] >> features["has_vag"]
|
|
|
|
|
S["feature_vag_shape"] >> features["vag_shape"]
|
|
|
|
|
S["feature_vag_color"] >> features["vag_color"]
|
|
|
|
|
S["feature_vag_visibility"] >> features["vag_visibility"]
|
|
|
|
|
//womb features
|
|
|
|
|
S["feature_has_womb"] >> features["has_womb"]
|
|
|
|
|
S["feature_has_womb"] >> features["has_womb"]
|
|
|
|
|
//butt features
|
|
|
|
|
S["feature_has_butt"] >> features["has_butt"]
|
|
|
|
|
S["feature_butt_color"] >> features["butt_color"]
|
|
|
|
|
S["feature_butt_size"] >> features["butt_size"]
|
|
|
|
|
S["feature_butt_visibility"] >> features["butt_visibility"]
|
|
|
|
|
S["feature_has_butt"] >> features["has_butt"]
|
|
|
|
|
S["feature_butt_color"] >> features["butt_color"]
|
|
|
|
|
S["feature_butt_size"] >> features["butt_size"]
|
|
|
|
|
S["feature_butt_visibility"] >> features["butt_visibility"]
|
|
|
|
|
|
|
|
|
|
//flavor text
|
|
|
|
|
//Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts:
|
|
|
|
|
if((S["flavor_text"] != "") && (S["flavor_text"] != null) && S["flavor_text"]) //If old text isn't null and isn't "" but still exists.
|
|
|
|
|
S["flavor_text"] >> features["flavor_text"] //Load old flavortext as current dna-based flavortext
|
|
|
|
|
// Flavor texts, Made into a standard.
|
|
|
|
|
S["feature_flavor_text"] >> features["flavor_text"]
|
|
|
|
|
S["feature_silicon_flavor_text"] >> features["silicon_flavor_text"]
|
|
|
|
|
S["feature_ooc_notes"] >> features["ooc_notes"]
|
|
|
|
|
|
|
|
|
|
WRITE_FILE(S["feature_flavor_text"], features["flavor_text"]) //Save it in our new type of flavor-text
|
|
|
|
|
WRITE_FILE(S["flavor_text"] , "") //Remove old flavortext, completing the cut-and-paste into the new format.
|
|
|
|
|
|
|
|
|
|
else //We have no old flavortext, default to new
|
|
|
|
|
S["feature_flavor_text"] >> features["flavor_text"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S["silicon_feature_flavor_text"] >> features["silicon_flavor_text"]
|
|
|
|
|
|
|
|
|
|
S["feature_ooc_notes"] >> features["ooc_notes"]
|
|
|
|
|
S["silicon_flavor_text"] >> features["silicon_flavor_text"]
|
|
|
|
|
|
|
|
|
|
S["vore_flags"] >> vore_flags
|
|
|
|
|
S["vore_taste"] >> vore_taste
|
|
|
|
|
S["vore_smell"] >> vore_smell
|
|
|
|
|
S["vore_flags"] >> vore_flags
|
|
|
|
|
S["vore_taste"] >> vore_taste
|
|
|
|
|
S["vore_smell"] >> vore_smell
|
|
|
|
|
var/char_vr_path = "[vr_path]/character_[default_slot]_v2.json"
|
|
|
|
|
if(fexists(char_vr_path))
|
|
|
|
|
var/list/json_from_file = json_decode(file2text(char_vr_path))
|
|
|
|
|
@@ -869,69 +867,69 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
|
|
|
|
|
//Sanitize
|
|
|
|
|
|
|
|
|
|
real_name = reject_bad_name(real_name)
|
|
|
|
|
gender = sanitize_gender(gender, TRUE, TRUE)
|
|
|
|
|
real_name = reject_bad_name(real_name)
|
|
|
|
|
gender = sanitize_gender(gender, TRUE, TRUE)
|
|
|
|
|
features["body_model"] = sanitize_gender(features["body_model"], FALSE, FALSE, gender == FEMALE ? FEMALE : MALE)
|
|
|
|
|
if(!real_name)
|
|
|
|
|
real_name = random_unique_name(gender)
|
|
|
|
|
custom_species = reject_bad_name(custom_species)
|
|
|
|
|
real_name = random_unique_name(gender)
|
|
|
|
|
custom_species = reject_bad_name(custom_species)
|
|
|
|
|
for(var/custom_name_id in GLOB.preferences_custom_names)
|
|
|
|
|
var/namedata = GLOB.preferences_custom_names[custom_name_id]
|
|
|
|
|
custom_names[custom_name_id] = reject_bad_name(custom_names[custom_name_id],namedata["allow_numbers"])
|
|
|
|
|
if(!custom_names[custom_name_id])
|
|
|
|
|
custom_names[custom_name_id] = get_default_name(custom_name_id)
|
|
|
|
|
|
|
|
|
|
nameless = sanitize_integer(nameless, 0, 1, initial(nameless))
|
|
|
|
|
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
|
|
|
|
|
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
|
|
|
|
|
nameless = sanitize_integer(nameless, 0, 1, initial(nameless))
|
|
|
|
|
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
|
|
|
|
|
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
|
|
|
|
|
|
|
|
|
|
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_list)
|
|
|
|
|
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_list)
|
|
|
|
|
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
|
|
|
|
|
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
|
|
|
|
|
undie_color = sanitize_hexcolor(undie_color, 6, FALSE, initial(undie_color))
|
|
|
|
|
shirt_color = sanitize_hexcolor(shirt_color, 6, FALSE, initial(shirt_color))
|
|
|
|
|
socks = sanitize_inlist(socks, GLOB.socks_list)
|
|
|
|
|
socks_color = sanitize_hexcolor(socks_color, 6, FALSE, initial(socks_color))
|
|
|
|
|
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
|
|
|
|
|
hair_color = sanitize_hexcolor(hair_color, 6, FALSE)
|
|
|
|
|
facial_hair_color = sanitize_hexcolor(facial_hair_color, 6, FALSE)
|
|
|
|
|
grad_style = sanitize_inlist(grad_style, GLOB.hair_gradients_list, "None")
|
|
|
|
|
grad_color = sanitize_hexcolor(grad_color, 6, FALSE)
|
|
|
|
|
eye_type = sanitize_inlist(eye_type, GLOB.eye_types, DEFAULT_EYES_TYPE)
|
|
|
|
|
left_eye_color = sanitize_hexcolor(left_eye_color, 6, FALSE)
|
|
|
|
|
right_eye_color = sanitize_hexcolor(right_eye_color, 6, FALSE)
|
|
|
|
|
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_list)
|
|
|
|
|
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_list)
|
|
|
|
|
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
|
|
|
|
|
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
|
|
|
|
|
undie_color = sanitize_hexcolor(undie_color, 6, FALSE, initial(undie_color))
|
|
|
|
|
shirt_color = sanitize_hexcolor(shirt_color, 6, FALSE, initial(shirt_color))
|
|
|
|
|
socks = sanitize_inlist(socks, GLOB.socks_list)
|
|
|
|
|
socks_color = sanitize_hexcolor(socks_color, 6, FALSE, initial(socks_color))
|
|
|
|
|
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
|
|
|
|
|
hair_color = sanitize_hexcolor(hair_color, 6, FALSE)
|
|
|
|
|
facial_hair_color = sanitize_hexcolor(facial_hair_color, 6, FALSE)
|
|
|
|
|
grad_style = sanitize_inlist(grad_style, GLOB.hair_gradients_list, "None")
|
|
|
|
|
grad_color = sanitize_hexcolor(grad_color, 6, FALSE)
|
|
|
|
|
eye_type = sanitize_inlist(eye_type, GLOB.eye_types, DEFAULT_EYES_TYPE)
|
|
|
|
|
left_eye_color = sanitize_hexcolor(left_eye_color, 6, FALSE)
|
|
|
|
|
right_eye_color = sanitize_hexcolor(right_eye_color, 6, FALSE)
|
|
|
|
|
|
|
|
|
|
var/static/allow_custom_skintones
|
|
|
|
|
if(isnull(allow_custom_skintones))
|
|
|
|
|
allow_custom_skintones = CONFIG_GET(flag/allow_custom_skintones)
|
|
|
|
|
use_custom_skin_tone = allow_custom_skintones ? sanitize_integer(use_custom_skin_tone, FALSE, TRUE, initial(use_custom_skin_tone)) : FALSE
|
|
|
|
|
use_custom_skin_tone = allow_custom_skintones ? sanitize_integer(use_custom_skin_tone, FALSE, TRUE, initial(use_custom_skin_tone)) : FALSE
|
|
|
|
|
if(use_custom_skin_tone)
|
|
|
|
|
skin_tone = sanitize_hexcolor(skin_tone, 6, TRUE, "#FFFFFF")
|
|
|
|
|
skin_tone = sanitize_hexcolor(skin_tone, 6, TRUE, "#FFFFFF")
|
|
|
|
|
else
|
|
|
|
|
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones - GLOB.nonstandard_skin_tones, initial(skin_tone))
|
|
|
|
|
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones - GLOB.nonstandard_skin_tones, initial(skin_tone))
|
|
|
|
|
|
|
|
|
|
features["horns_color"] = sanitize_hexcolor(features["horns_color"], 6, FALSE, "85615a")
|
|
|
|
|
features["wings_color"] = sanitize_hexcolor(features["wings_color"], 6, FALSE, "FFFFFF")
|
|
|
|
|
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
|
|
|
|
|
jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
|
|
|
|
|
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
|
|
|
|
|
features["mcolor"] = sanitize_hexcolor(features["mcolor"], 6, FALSE)
|
|
|
|
|
features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
|
|
|
|
|
features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human)
|
|
|
|
|
features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list)
|
|
|
|
|
features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
|
|
|
|
|
features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list)
|
|
|
|
|
features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
|
|
|
|
|
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
|
|
|
|
|
features["legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Plantigrade")
|
|
|
|
|
features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None")
|
|
|
|
|
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
|
|
|
|
|
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
|
|
|
|
|
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
|
|
|
|
|
features["arachnid_legs"] = sanitize_inlist(features["arachnid_legs"], GLOB.arachnid_legs_list, "Plain")
|
|
|
|
|
features["arachnid_spinneret"] = sanitize_inlist(features["arachnid_spinneret"], GLOB.arachnid_spinneret_list, "Plain")
|
|
|
|
|
features["arachnid_mandibles"] = sanitize_inlist(features["arachnid_mandibles"], GLOB.arachnid_mandibles_list, "Plain")
|
|
|
|
|
features["horns_color"] = sanitize_hexcolor(features["horns_color"], 6, FALSE, "85615a")
|
|
|
|
|
features["wings_color"] = sanitize_hexcolor(features["wings_color"], 6, FALSE, "FFFFFF")
|
|
|
|
|
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
|
|
|
|
|
jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
|
|
|
|
|
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
|
|
|
|
|
features["mcolor"] = sanitize_hexcolor(features["mcolor"], 6, FALSE)
|
|
|
|
|
features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
|
|
|
|
|
features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human)
|
|
|
|
|
features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list)
|
|
|
|
|
features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
|
|
|
|
|
features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list)
|
|
|
|
|
features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
|
|
|
|
|
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
|
|
|
|
|
features["legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Plantigrade")
|
|
|
|
|
features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None")
|
|
|
|
|
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
|
|
|
|
|
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
|
|
|
|
|
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
|
|
|
|
|
features["arachnid_legs"] = sanitize_inlist(features["arachnid_legs"], GLOB.arachnid_legs_list, "Plain")
|
|
|
|
|
features["arachnid_spinneret"] = sanitize_inlist(features["arachnid_spinneret"], GLOB.arachnid_spinneret_list, "Plain")
|
|
|
|
|
features["arachnid_mandibles"] = sanitize_inlist(features["arachnid_mandibles"], GLOB.arachnid_mandibles_list, "Plain")
|
|
|
|
|
|
|
|
|
|
var/static/size_min
|
|
|
|
|
if(!size_min)
|
|
|
|
|
@@ -939,7 +937,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
var/static/size_max
|
|
|
|
|
if(!size_max)
|
|
|
|
|
size_max = CONFIG_GET(number/body_size_max)
|
|
|
|
|
features["body_size"] = sanitize_num_clamp(features["body_size"], size_min, size_max, RESIZE_DEFAULT_SIZE, 0.01)
|
|
|
|
|
features["body_size"] = sanitize_num_clamp(features["body_size"], size_min, size_max, RESIZE_DEFAULT_SIZE, 0.01)
|
|
|
|
|
|
|
|
|
|
var/static/list/B_sizes
|
|
|
|
|
if(!B_sizes)
|
|
|
|
|
@@ -963,33 +961,33 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
var/list/L = CONFIG_GET(keyed_list/safe_visibility_toggles)
|
|
|
|
|
safe_visibilities = L.Copy()
|
|
|
|
|
|
|
|
|
|
features["breasts_size"] = sanitize_inlist(features["breasts_size"], B_sizes, BREASTS_SIZE_DEF)
|
|
|
|
|
features["cock_length"] = sanitize_integer(features["cock_length"], min_D, max_D, COCK_SIZE_DEF)
|
|
|
|
|
features["butt_size"] = sanitize_integer(features["butt_size"], min_B, max_B, BUTT_SIZE_DEF)
|
|
|
|
|
features["breasts_shape"] = sanitize_inlist(features["breasts_shape"], GLOB.breasts_shapes_list, DEF_BREASTS_SHAPE)
|
|
|
|
|
features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE)
|
|
|
|
|
features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE)
|
|
|
|
|
features["vag_shape"] = sanitize_inlist(features["vag_shape"], GLOB.vagina_shapes_list, DEF_VAGINA_SHAPE)
|
|
|
|
|
features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 6, FALSE, "FFFFFF")
|
|
|
|
|
features["cock_color"] = sanitize_hexcolor(features["cock_color"], 6, FALSE, "FFFFFF")
|
|
|
|
|
features["balls_color"] = sanitize_hexcolor(features["balls_color"], 6, FALSE, "FFFFFF")
|
|
|
|
|
features["vag_color"] = sanitize_hexcolor(features["vag_color"], 6, FALSE, "FFFFFF")
|
|
|
|
|
features["breasts_visibility"] = sanitize_inlist(features["breasts_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
|
|
|
|
|
features["cock_visibility"] = sanitize_inlist(features["cock_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
|
|
|
|
|
features["balls_visibility"] = sanitize_inlist(features["balls_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
|
|
|
|
|
features["vag_visibility"] = sanitize_inlist(features["vag_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
|
|
|
|
|
features["butt_visibility"] = sanitize_inlist(features["butt_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
|
|
|
|
|
features["breasts_size"] = sanitize_inlist(features["breasts_size"], B_sizes, BREASTS_SIZE_DEF)
|
|
|
|
|
features["cock_length"] = sanitize_integer(features["cock_length"], min_D, max_D, COCK_SIZE_DEF)
|
|
|
|
|
features["butt_size"] = sanitize_integer(features["butt_size"], min_B, max_B, BUTT_SIZE_DEF)
|
|
|
|
|
features["breasts_shape"] = sanitize_inlist(features["breasts_shape"], GLOB.breasts_shapes_list, DEF_BREASTS_SHAPE)
|
|
|
|
|
features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE)
|
|
|
|
|
features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE)
|
|
|
|
|
features["vag_shape"] = sanitize_inlist(features["vag_shape"], GLOB.vagina_shapes_list, DEF_VAGINA_SHAPE)
|
|
|
|
|
features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 6, FALSE, "FFFFFF")
|
|
|
|
|
features["cock_color"] = sanitize_hexcolor(features["cock_color"], 6, FALSE, "FFFFFF")
|
|
|
|
|
features["balls_color"] = sanitize_hexcolor(features["balls_color"], 6, FALSE, "FFFFFF")
|
|
|
|
|
features["vag_color"] = sanitize_hexcolor(features["vag_color"], 6, FALSE, "FFFFFF")
|
|
|
|
|
features["breasts_visibility"] = sanitize_inlist(features["breasts_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
|
|
|
|
|
features["cock_visibility"] = sanitize_inlist(features["cock_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
|
|
|
|
|
features["balls_visibility"] = sanitize_inlist(features["balls_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
|
|
|
|
|
features["vag_visibility"] = sanitize_inlist(features["vag_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
|
|
|
|
|
features["butt_visibility"] = sanitize_inlist(features["butt_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
|
|
|
|
|
|
|
|
|
|
custom_speech_verb = sanitize_inlist(custom_speech_verb, GLOB.speech_verbs, "default")
|
|
|
|
|
custom_tongue = sanitize_inlist(custom_tongue, GLOB.roundstart_tongues, "default")
|
|
|
|
|
additional_language = sanitize_inlist(additional_language, GLOB.roundstart_languages, "None")
|
|
|
|
|
custom_speech_verb = sanitize_inlist(custom_speech_verb, GLOB.speech_verbs, "default")
|
|
|
|
|
custom_tongue = sanitize_inlist(custom_tongue, GLOB.roundstart_tongues, "default")
|
|
|
|
|
additional_language = sanitize_inlist(additional_language, GLOB.roundstart_languages, "None")
|
|
|
|
|
|
|
|
|
|
security_records = copytext(security_records, 1, MAX_FLAVOR_LEN)
|
|
|
|
|
medical_records = copytext(medical_records, 1, MAX_FLAVOR_LEN)
|
|
|
|
|
security_records = copytext(security_records, 1, MAX_FLAVOR_LEN)
|
|
|
|
|
medical_records = copytext(medical_records, 1, MAX_FLAVOR_LEN)
|
|
|
|
|
|
|
|
|
|
features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
|
|
|
|
|
features["silicon_flavor_text"] = copytext(features["silicon_flavor_text"], 1, MAX_FLAVOR_LEN)
|
|
|
|
|
features["ooc_notes"] = copytext(features["ooc_notes"], 1, MAX_FLAVOR_LEN)
|
|
|
|
|
features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
|
|
|
|
|
features["silicon_flavor_text"] = copytext(features["silicon_flavor_text"], 1, MAX_FLAVOR_LEN)
|
|
|
|
|
features["ooc_notes"] = copytext(features["ooc_notes"], 1, MAX_FLAVOR_LEN)
|
|
|
|
|
|
|
|
|
|
//load every advanced coloring mode thing in one go
|
|
|
|
|
//THIS MUST BE DONE AFTER ALL FEATURE SAVES OR IT WILL NOT WORK
|
|
|
|
|
@@ -1011,11 +1009,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!")
|
|
|
|
|
continue
|
|
|
|
|
if(S["feature_[primary_string]"])
|
|
|
|
|
S["feature_[primary_string]"] >> features[primary_string]
|
|
|
|
|
S["feature_[primary_string]"] >> features[primary_string]
|
|
|
|
|
if(S["feature_[secondary_string]"])
|
|
|
|
|
S["feature_[secondary_string]"] >> features[secondary_string]
|
|
|
|
|
S["feature_[secondary_string]"] >> features[secondary_string]
|
|
|
|
|
if(S["feature_[tertiary_string]"])
|
|
|
|
|
S["feature_[tertiary_string]"] >> features[tertiary_string]
|
|
|
|
|
S["feature_[tertiary_string]"] >> features[tertiary_string]
|
|
|
|
|
|
|
|
|
|
persistent_scars = sanitize_integer(persistent_scars)
|
|
|
|
|
scars_list["1"] = sanitize_text(scars_list["1"])
|
|
|
|
|
@@ -1024,7 +1022,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
scars_list["4"] = sanitize_text(scars_list["4"])
|
|
|
|
|
scars_list["5"] = sanitize_text(scars_list["5"])
|
|
|
|
|
|
|
|
|
|
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
|
|
|
|
|
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
|
|
|
|
|
//Validate job prefs
|
|
|
|
|
for(var/j in job_preferences)
|
|
|
|
|
if(job_preferences["[j]"] != JP_LOW && job_preferences["[j]"] != JP_MEDIUM && job_preferences["[j]"] != JP_HIGH)
|
|
|
|
|
@@ -1032,10 +1030,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|
|
|
|
|
|
|
|
|
all_quirks = SANITIZE_LIST(all_quirks)
|
|
|
|
|
|
|
|
|
|
vore_flags = sanitize_integer(vore_flags, 0, MAX_VORE_FLAG, 0)
|
|
|
|
|
vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN)
|
|
|
|
|
vore_smell = copytext(vore_smell, 1, MAX_TASTE_LEN)
|
|
|
|
|
belly_prefs = SANITIZE_LIST(belly_prefs)
|
|
|
|
|
vore_flags = sanitize_integer(vore_flags, 0, MAX_VORE_FLAG, 0)
|
|
|
|
|
vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN)
|
|
|
|
|
vore_smell = copytext(vore_smell, 1, MAX_TASTE_LEN)
|
|
|
|
|
belly_prefs = SANITIZE_LIST(belly_prefs)
|
|
|
|
|
|
|
|
|
|
cit_character_pref_load(S)
|
|
|
|
|
|
|
|
|
|
|