diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 69080fa8001..843f1108c9f 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -248,7 +248,7 @@ var/global/datum/controller/occupations/job_master
for(var/mob/new_player/player in player_list)
if(player.ready && player.mind && !player.mind.assigned_role)
unassigned += player
-
+ if(player.client.prefs.randomslot) player.client.prefs.random_character()
Debug("DO, Len: [unassigned.len]")
if(unassigned.len == 0) return 0
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 7f195f01f4c..0de42a51dd5 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -114,6 +114,9 @@ datum/preferences
var/metadata = ""
var/slot_name = ""
+ // Whether or not to use randomized character slots
+ var/randomslot = 0
+
/datum/preferences/New(client/C)
b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
if(istype(C))
@@ -246,7 +249,6 @@ datum/preferences
dat += "\[...\]
"
else
dat += "
"
-
if(gender == MALE)
dat += "Underwear: [underwear_m[underwear]]
"
else
@@ -293,6 +295,7 @@ datum/preferences
dat += "-Alpha(transparence): [UI_style_alpha]
"
dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
"
dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
"
+ dat += "Randomized Character Slot: [randomslot ? "Yes" : "No"]
"
dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
"
dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
"
@@ -1197,6 +1200,9 @@ datum/preferences
if("name")
be_random_name = !be_random_name
+ if("randomslot")
+ randomslot = !randomslot
+
if("hear_midis")
toggles ^= SOUND_MIDI
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 0fe785c72c7..1f33848115e 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -56,7 +56,7 @@
S["toggles"] >> toggles
S["UI_style_color"] >> UI_style_color
S["UI_style_alpha"] >> UI_style_alpha
-
+ S["randomslot"] >> randomslot
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
@@ -67,8 +67,7 @@
toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color))
UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha))
-
-
+ randomslot = sanitize_integer(randomslot, 0, 1, initial(randomslot))
return 1
/datum/preferences/proc/save_preferences()
@@ -88,22 +87,13 @@
S["toggles"] << toggles
S["UI_style_color"] << UI_style_color
S["UI_style_alpha"] << UI_style_alpha
-
-
+ S["randomslot"] << randomslot
return 1
-/datum/preferences/proc/load_character(slot)
- if(!path) return 0
- if(!fexists(path)) return 0
+/datum/preferences/proc/load_save(dir)
var/savefile/S = new /savefile(path)
- if(!S) return 0
- S.cd = "/"
- if(!slot) slot = default_slot
- slot = sanitize_integer(slot, 1, MAX_SAVE_SLOTS, initial(default_slot))
- if(slot != default_slot)
- default_slot = slot
- S["default_slot"] << slot
- S.cd = "/character[slot]"
+ if(!S) return 0
+ S.cd = dir
//Character
S["OOC_Notes"] >> metadata
@@ -198,6 +188,133 @@
if(!organ_data) src.organ_data = list()
//if(!skin_style) skin_style = "Default"
+/datum/preferences/proc/random_character()
+ if(!path) return 0
+ if(!fexists(path)) return 0
+ var/savefile/S = new /savefile(path)
+ if(!S) return 0
+ var/list/saves = list()
+ var/name
+ for(var/i=1, i<=MAX_SAVE_SLOTS, i++)
+ S.cd = "/character[i]"
+ S["real_name"] >> name
+ if(!name) continue
+ saves.Add(S.cd)
+
+ if(!saves.len)
+ load_character()
+ return 0
+ S.cd = pick(saves)
+ load_save(S.cd)
+ return 1
+
+/datum/preferences/proc/load_character(slot)
+ if(!path) return 0
+ if(!fexists(path)) return 0
+ var/savefile/S = new /savefile(path)
+ if(!S) return 0
+ S.cd = "/"
+ if(!slot) slot = default_slot
+ slot = sanitize_integer(slot, 1, MAX_SAVE_SLOTS, initial(default_slot))
+ if(slot != default_slot)
+ default_slot = slot
+ S["default_slot"] << slot
+ S.cd = "/character[slot]"
+ load_save(S.cd)
+/* Now loaded by proc load_save(S.cd)
+ //Character
+ S["OOC_Notes"] >> metadata
+ S["real_name"] >> real_name
+ S["name_is_always_random"] >> be_random_name
+ S["gender"] >> gender
+ S["age"] >> age
+ S["species"] >> species
+ S["language"] >> language
+
+ //colors to be consolidated into hex strings (requires some work with dna code)
+ S["hair_red"] >> r_hair
+ S["hair_green"] >> g_hair
+ S["hair_blue"] >> b_hair
+ S["facial_red"] >> r_facial
+ S["facial_green"] >> g_facial
+ S["facial_blue"] >> b_facial
+ S["skin_tone"] >> s_tone
+ S["hair_style_name"] >> h_style
+ S["facial_style_name"] >> f_style
+ S["eyes_red"] >> r_eyes
+ S["eyes_green"] >> g_eyes
+ S["eyes_blue"] >> b_eyes
+ S["underwear"] >> underwear
+ S["backbag"] >> backbag
+ S["b_type"] >> b_type
+
+ //Jobs
+ S["alternate_option"] >> alternate_option
+ 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
+
+ //Miscellaneous
+ S["flavor_text"] >> flavor_text
+ S["med_record"] >> med_record
+ S["sec_record"] >> sec_record
+ S["gen_record"] >> gen_record
+ S["be_special"] >> be_special
+ S["disabilities"] >> disabilities
+ S["player_alt_titles"] >> player_alt_titles
+ S["organ_data"] >> organ_data
+
+ S["nanotrasen_relation"] >> nanotrasen_relation
+ //S["skin_style"] >> skin_style
+
+ //Sanitize
+ metadata = sanitize_text(metadata, initial(metadata))
+ real_name = reject_bad_name(real_name)
+ if(isnull(species)) species = "Human"
+ if(isnull(language)) language = "None"
+ if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation)
+ if(!real_name) real_name = random_name(gender)
+ be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
+ gender = sanitize_gender(gender)
+ age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
+ r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair))
+ g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair))
+ b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair))
+ r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial))
+ g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial))
+ b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial))
+ s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone))
+ h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style))
+ f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style))
+ r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes))
+ g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes))
+ b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
+ underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear))
+ backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
+ b_type = sanitize_text(b_type, initial(b_type))
+
+ alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option))
+ job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
+ job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med))
+ job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low))
+ job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high))
+ job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med))
+ job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low))
+ job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high))
+ job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med))
+ job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low))
+
+ if(isnull(disabilities)) disabilities = 0
+ if(!player_alt_titles) player_alt_titles = new()
+ if(!organ_data) src.organ_data = list()
+ //if(!skin_style) skin_style = "Default"
+*/
return 1
/datum/preferences/proc/save_character()