diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index d630d983c05..9e99f0bd92c 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -22,14 +22,15 @@ var/global/list/portals = list() //for use by portals
//Preferences stuff
//Hairstyles
var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
-var/global/list/hair_styles_male_list = list()
-var/global/list/hair_styles_female_list = list()
+var/global/list/hair_styles_male_list = list() //stores only hair names
+var/global/list/hair_styles_female_list = list() //stores only hair names
var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name
-var/global/list/facial_hair_styles_male_list = list()
-var/global/list/facial_hair_styles_female_list = list()
+var/global/list/facial_hair_styles_male_list = list() //stores only hair names
+var/global/list/facial_hair_styles_female_list = list() //stores only hair names
//Underwear
-var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "Love-Hearts", "Black2", "Grey2", "Stripey", "Kinky", "Red", "None") //Curse whoever made male/female underwear diffrent colours
-var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "Babydoll", "Baby-Blue", "Green", "Pink", "Kinky", "Tankini", "None")
+var/global/list/underwear_all = list() //stores /datum/sprite_accessory/underwear indexed by name
+var/global/list/underwear_m = list() //stores only underwear name
+var/global/list/underwear_f = list() //stores only underwear name
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel")
@@ -38,34 +39,17 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel")
//////////////////////////
/proc/make_datum_references_lists()
- var/list/paths
- //Hair - Initialise all /datum/sprite_accessory/hair into an list indexed by hair-style name
- paths = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair
- for(var/path in paths)
- var/datum/sprite_accessory/hair/H = new path()
- hair_styles_list[H.name] = H
- switch(H.gender)
- if(MALE) hair_styles_male_list += H.name
- if(FEMALE) hair_styles_female_list += H.name
- else
- hair_styles_male_list += H.name
- hair_styles_female_list += H.name
-
- //Facial Hair - Initialise all /datum/sprite_accessory/facial_hair into an list indexed by facialhair-style name
- paths = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair
- for(var/path in paths)
- var/datum/sprite_accessory/facial_hair/H = new path()
- facial_hair_styles_list[H.name] = H
- switch(H.gender)
- if(MALE) facial_hair_styles_male_list += H.name
- if(FEMALE) facial_hair_styles_female_list += H.name
- else
- facial_hair_styles_male_list += H.name
- facial_hair_styles_female_list += H.name
-
+ //hair
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, hair_styles_list, hair_styles_male_list, hair_styles_female_list)
+ //facial hair
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_hair, facial_hair_styles_list, facial_hair_styles_male_list, facial_hair_styles_female_list)
+ //underwear
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear, underwear_all, underwear_m, underwear_f)
+
//Surgeries
- paths = typesof(/datum/surgery) - /datum/surgery
- for(var/path in paths)
+ for(var/path in typesof(/datum/surgery))
+ if(path == /datum/surgery)
+ continue
var/datum/surgery/S = new path()
surgeries_list[S.name] = S
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 01d14dd22f2..366052ba80d 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -1,3 +1,9 @@
+/proc/random_underwear(gender)
+ switch(gender)
+ if(MALE) return pick(underwear_m)
+ if(FEMALE) return pick(underwear_f)
+ else return pick(underwear_all)
+
proc/random_hair_style(gender)
switch(gender)
if(MALE) return pick(hair_styles_male_list)
diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm
index 4b521f9bfbb..1be69032cf1 100644
--- a/code/__HELPERS/sanitize_values.dm
+++ b/code/__HELPERS/sanitize_values.dm
@@ -14,7 +14,7 @@
/proc/sanitize_inlist(value, list/List, default)
if(value in List) return value
if(default) return default
- if(List && List.len)return List[1]
+ if(List && List.len)return pick(List)
diff --git a/code/game/dna.dm b/code/game/dna.dm
index d963957fee7..c5633d5f70d 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -77,7 +77,7 @@
//Hair
var/hair = 0
if(!character.h_style)
- character.h_style = "Bald"
+ character.h_style = random_hair_style(character.gender)
var/hrange = round(4095 / hair_styles_list.len)
var/index = hair_styles_list.Find(character.h_style)
@@ -87,7 +87,7 @@
//Facial Hair
var/beard = 0
if(!character.f_style)
- character.f_style = "Shaved"
+ character.f_style = random_facial_hair_style(character.gender)
var/f_hrange = round(4095 / facial_hair_styles_list.len)
index = facial_hair_styles_list.Find(character.f_style)
diff --git a/code/game/machinery/computer/hologram.dm b/code/game/machinery/computer/hologram.dm
index d7db69e9bc8..4c6b5bb6380 100644
--- a/code/game/machinery/computer/hologram.dm
+++ b/code/game/machinery/computer/hologram.dm
@@ -35,7 +35,7 @@
I.Blend(rgb(- src.lumens, -src.lumens, -src.lumens), ICON_SUBTRACT)
I.Blend(new /icon('icons/mob/human.dmi', "mouth_m_s"), ICON_OVERLAY)
- I.Blend(new /icon('icons/mob/human.dmi', "underwear1_m_s"), ICON_OVERLAY)
+ I.Blend(new /icon('icons/mob/underwear.dmi', "Mens White"), ICON_OVERLAY)
var/icon/U = new /icon('icons/mob/human_face.dmi', "hair_a_s")
U.Blend(rgb(src.h_r, src.h_g, src.h_b), ICON_ADD)
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 5e9e8f5c4a7..517c51a6061 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -10,18 +10,11 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.gender == MALE)
- var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_m
- if(!in_range(src, usr))//no tele-grooming
- return
- if(new_undies)
- H.underwear = underwear_m.Find(new_undies)
- else
- var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_f
- if(!in_range(src, usr))
- return
- if(new_undies)
- H.underwear = underwear_f.Find(new_undies)
+ var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_all
+ if(!in_range(src, user))//no tele-grooming
+ return
+ if(new_undies)
+ H.underwear = new_undies
add_fingerprint(H)
H.update_body()
\ No newline at end of file
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 71d4bc8c3e7..528dbd61d4d 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -391,13 +391,7 @@ client/proc/one_click_antag()
new_character.gender = pick(MALE,FEMALE)
var/datum/preferences/A = new()
- A.randomize_appearance_for(new_character)
- if(new_character.gender == MALE)
- new_character.real_name = "[pick(first_names_male)] [pick(last_names)]"
- else
- new_character.real_name = "[pick(first_names_female)] [pick(last_names)]"
- new_character.name = new_character.real_name
- new_character.age = rand(17,45)
+ A.copy_to(new_character)
new_character.dna.ready_dna(new_character)
new_character.key = G_found.key
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 0903627d067..0927e3b93e8 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -304,14 +304,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
else
new_character.gender = pick(MALE,FEMALE)
var/datum/preferences/A = new()
- A.randomize_appearance_for(new_character)
- new_character.real_name = G_found.real_name
+ A.real_name = G_found.real_name
+ A.copy_to(new_character)
if(!new_character.real_name)
- if(new_character.gender == MALE)
- new_character.real_name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
- else
- new_character.real_name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
+ new_character.real_name = random_name(new_character.gender)
new_character.name = new_character.real_name
if(G_found.mind && !G_found.mind.active)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 93e25325213..88e18fb925d 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -24,7 +24,6 @@ datum/preferences
//doohickeys for savefiles
var/path
var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
- var/savefile_version = 0
//non-preference stuff
var/warns = 0
@@ -45,7 +44,7 @@ datum/preferences
var/gender = MALE //gender of character (well duh)
var/age = 30 //age of character
var/b_type = "A+" //blood type (not-chooseable)
- var/underwear = 1 //underwear type
+ var/underwear = "Nude" //underwear type
var/backbag = 2 //backpack type
var/h_style = "Bald" //Hair type
var/r_hair = 0 //Hair color
@@ -91,11 +90,17 @@ datum/preferences
if(istype(C))
if(!IsGuestKey(C.key))
load_path(C.ckey)
- if(load_preferences())
- if(load_character())
- return
- gender = pick(MALE, FEMALE)
+ var/loaded_preferences_successfully = load_preferences()
+ if(loaded_preferences_successfully)
+ if(load_character())
+ return
+ //we couldn't load character data so just randomize the character appearance + name
+ random_character() //let's create a random character then - rather than a fat, bald and naked man.
real_name = random_name(gender)
+ if(!loaded_preferences_successfully)
+ save_preferences()
+ save_character() //let's save this new random character so it doesn't keep generating new ones.
+ return
/datum/preferences
proc/ShowChoices(mob/user)
@@ -157,12 +162,7 @@ datum/preferences
dat += "Blood Type: [b_type]
"
dat += "Skin Tone:
[-s_tone + 35]/220
"
-
- if(gender == MALE)
- dat += "Underwear:
[underwear_m[underwear]]
"
- else
- dat += "Underwear:
[underwear_f[underwear]]
"
-
+ dat += "Underwear:
[underwear]
"
dat += "Backpack:
[backbaglist[backbag]]
"
@@ -497,7 +497,7 @@ datum/preferences
if("f_style")
f_style = random_facial_hair_style(gender)
if("underwear")
- underwear = rand(1,underwear_m.len)
+ underwear = random_underwear(gender)
if("eyes")
r_eyes = rand(0,255)
g_eyes = rand(0,255)
@@ -507,7 +507,7 @@ datum/preferences
if("bag")
backbag = rand(1,3)
if("all")
- randomize_appearance_for() //no params needed
+ random_character()
if("input")
switch(href_list["preference"])
@@ -561,7 +561,7 @@ datum/preferences
var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options
if(new_underwear)
- underwear = underwear_options.Find(new_underwear)
+ underwear = new_underwear
if("eyes")
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") as color|null
@@ -591,6 +591,8 @@ datum/preferences
gender = FEMALE
else
gender = MALE
+ underwear = random_underwear(gender)
+
if("hear_adminhelps")
toggles ^= SOUND_ADMINHELP
@@ -636,7 +638,10 @@ datum/preferences
load_character()
if("changeslot")
- load_character(text2num(href_list["num"]))
+ if(!load_character(text2num(href_list["num"])))
+ random_character()
+ real_name = random_name(gender)
+ save_character()
if("tab")
if (href_list["tab"])
@@ -645,9 +650,9 @@ datum/preferences
ShowChoices(user)
return 1
- proc/copy_to(mob/living/carbon/human/character, safety = 0)
+ proc/copy_to(mob/living/carbon/human/character)
if(be_random_name)
- real_name = random_name()
+ real_name = random_name(gender)
if(config.humans_need_surnames)
var/firstspace = findtext(real_name, " ")
@@ -679,21 +684,19 @@ datum/preferences
character.b_facial = b_facial
character.s_tone = s_tone
-
character.h_style = h_style
character.f_style = f_style
-
- if(underwear > underwear_m.len || underwear < 1)
- underwear = 1 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me.
character.underwear = underwear
if(backbag > 3 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
+ /*
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
if(character.gender in list(PLURAL, NEUTER))
if(isliving(src)) //Ghosts get neuter by default
message_admins("[character] ([character.ckey]) has spawned with their gender as plural or neuter. Please notify coders.")
character.gender = MALE
+ */
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 49d57c6ec5c..5db400749b8 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -1,51 +1,108 @@
+//This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped.
#define SAVEFILE_VERSION_MIN 8
-#define SAVEFILE_VERSION_MAX 8
-//handles converting savefiles to new formats
-//MAKE SURE YOU KEEP THIS UP TO DATE!
-//If the sanity checks are capable of handling any issues. Only increase SAVEFILE_VERSION_MAX,
-//this will mean that savefile_version will still be over SAVEFILE_VERSION_MIN, meaning
-//this savefile update doesn't run everytime we load from the savefile.
-//This is mainly for format changes, such as the bitflags in toggles changing order or something.
-//if a file can't be updated, return 0 to delete it and start again
-//if a file was updated, return 1
-/datum/preferences/proc/savefile_update()
- if(savefile_version < 8) //lazily delete everything + additional files so they can be saved in the new format
- for(var/ckey in preferences_datums)
- var/datum/preferences/D = preferences_datums[ckey]
- if(D == src)
- var/delpath = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/"
- if(delpath && fexists(delpath))
- fdel(delpath)
- break
- return 0
+//This is the current version, anything below this will attempt to update (if it's not obsolete)
+#define SAVEFILE_VERSION_MAX 9
- if(savefile_version == SAVEFILE_VERSION_MAX) //update successful.
- save_preferences()
- save_character()
- return 1
- return 0
+/*//This will allow you to print savefiles
+/client/verb/read_savefile(client/C in clients)
+ var/savefile/S = new /savefile(prefs.path)
+ S.ExportText("/",file("savefile.txt"))
+*/
+
+/*
+SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
+ This proc checks if the current directory of the savefile S needs updating
+ It is to be used by the load_character and load_preferences procs.
+ (S.cd=="/" is preferences, S.cd=="/character[integer]" is a character slot, etc)
+
+ if the current directory's version is below SAVEFILE_VERSION_MIN it will simply wipe everything in that directory
+ (if we're at root "/" then it'll just wipe the entire savefile, for instance.)
+
+ if its version is below SAVEFILE_VERSION_MAX but above the minimum, it will load data but later call the
+ respective update_preferences() or update_character() proc.
+ Those procs allow coders to specify format changes so users do not lose their setups and have to redo them again.
+
+ Failing all that, the standard sanity checks are performed. They simply check the data is suitable, reverting to
+ initial() values if necessary.
+*/
+/datum/preferences/proc/savefile_needs_update(savefile/S)
+ var/savefile_version
+ S["version"] >> savefile_version
+
+ if(savefile_version < SAVEFILE_VERSION_MIN)
+ S.dir.Cut()
+ return -2
+ if(savefile_version < SAVEFILE_VERSION_MAX)
+ return savefile_version
+ return -1
+
+/datum/preferences/proc/update_preferences(current_version)
+ return
+
+//should this proc get fairly long (say 3 versions long),
+//just increase SAVEFILE_VERSION_MIN so it's not as far behind
+//SAVEFILE_VERSION_MAX and then delete any obsolete if clauses
+//from this proc.
+//It's only really meant to avoid annoying frequent players
+//if your savefile is 3 months out of date, then 'tough shit'.
+/datum/preferences/proc/update_character(current_version)
+ if(current_version < 9) //an example, underwear were an index for a hardcoded list, converting to a string
+ if(gender == MALE)
+ switch(underwear)
+ if(1) underwear = "Mens White"
+ if(2) underwear = "Mens Grey"
+ if(3) underwear = "Mens Green"
+ if(4) underwear = "Mens Blue"
+ if(5) underwear = "Mens Black"
+ if(6) underwear = "Mankini"
+ if(7) underwear = "Mens Hearts Boxer"
+ if(8) underwear = "Mens Black Boxer"
+ if(9) underwear = "Mens Grey Boxer"
+ if(10) underwear = "Mens Striped Boxer"
+ if(11) underwear = "Mens Kinky"
+ if(12) underwear = "Mens Red"
+ if(13) underwear = "Nude"
+ else
+ switch(underwear)
+ if(1) underwear = "Ladies Red"
+ if(2) underwear = "Ladies White"
+ if(3) underwear = "Ladies Yellow"
+ if(4) underwear = "Ladies Blue"
+ if(5) underwear = "Ladies Black"
+ if(6) underwear = "Ladies Thong"
+ if(7) underwear = "Babydoll"
+ if(8) underwear = "Ladies Baby-Blue"
+ if(9) underwear = "Ladies Green"
+ if(10) underwear = "Ladies Pink"
+ if(11) underwear = "Ladies Kinky"
+ if(12) underwear = "Tankini"
+ if(13) underwear = "Nude"
+
+ /*
+ if(current_version < 10) //would be the step to upgrade 9 to 10
+ //do stuff
+ if(current_version < 11) //and so on...
+ //more stuff
+ */
+
+ return
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey) return
path = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/[filename]"
- savefile_version = SAVEFILE_VERSION_MAX
/datum/preferences/proc/load_preferences()
if(!path) return 0
if(!fexists(path)) return 0
+
var/savefile/S = new /savefile(path)
if(!S) return 0
S.cd = "/"
-
- S["version"] >> savefile_version
- //Conversion
- if(!savefile_version || !isnum(savefile_version) || savefile_version < SAVEFILE_VERSION_MIN || savefile_version > SAVEFILE_VERSION_MAX)
- if(!savefile_update()) //handles updates
- savefile_version = SAVEFILE_VERSION_MAX
- save_preferences()
- save_character()
- return 0
+
+ var/needs_update = savefile_needs_update(S)
+ if(needs_update == -2) //fatal, can't load any data
+ return 0
//general preferences
S["ooccolor"] >> ooccolor
@@ -55,6 +112,10 @@
S["default_slot"] >> default_slot
S["toggles"] >> toggles
+ //try to fix any outdated data if necessary
+ if(needs_update >= 0)
+ update_preferences(needs_update) //needs_update = savefile_version if we need an update (positive integer)
+
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
@@ -71,7 +132,7 @@
if(!S) return 0
S.cd = "/"
- S["version"] << savefile_version
+ S["version"] << SAVEFILE_VERSION_MAX //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date
//general preferences
S["ooccolor"] << ooccolor
@@ -94,7 +155,11 @@
if(slot != default_slot)
default_slot = slot
S["default_slot"] << slot
+
S.cd = "/character[slot]"
+ var/needs_update = savefile_needs_update(S)
+ if(needs_update == -2) //fatal, can't load any data
+ return 0
//Character
S["OOC_Notes"] >> metadata
@@ -130,12 +195,24 @@
S["job_engsec_med"] >> job_engsec_med
S["job_engsec_low"] >> job_engsec_low
+ //try to fix any outdated data if necessary
+ if(needs_update >= 0)
+ update_character(needs_update) //needs_update == savefile_version if we need an update (positive integer)
+
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
real_name = reject_bad_name(real_name)
- if(!real_name) real_name = random_name()
+ 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)
+ if(gender == MALE)
+ h_style = sanitize_inlist(h_style, hair_styles_male_list)
+ f_style = sanitize_inlist(f_style, facial_hair_styles_male_list)
+ underwear = sanitize_inlist(underwear, underwear_m)
+ else
+ h_style = sanitize_inlist(h_style, hair_styles_female_list)
+ f_style = sanitize_inlist(f_style, facial_hair_styles_female_list)
+ underwear = sanitize_inlist(underwear, underwear_f)
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))
@@ -144,12 +221,9 @@
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))
userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob))
@@ -170,6 +244,8 @@
var/savefile/S = new /savefile(path)
if(!S) return 0
S.cd = "/character[default_slot]"
+
+ S["version"] << SAVEFILE_VERSION_MAX //load_character will sanitize any bad data, so assume up-to-date.
//Character
S["OOC_Notes"] << metadata
diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm
index fd025fc6791..1667cd53981 100644
--- a/code/modules/events/ninja.dm
+++ b/code/modules/events/ninja.dm
@@ -341,14 +341,10 @@ ________________________________________________________________________________
/proc/create_space_ninja(turf/spawnturf)
var/mob/living/carbon/human/new_ninja = new(spawnturf)
- var/ninja_title = pick(ninja_titles)
- var/ninja_name = pick(ninja_names)
- new_ninja.gender = pick(MALE, FEMALE)
var/datum/preferences/A = new()//Randomize appearance for the ninja.
- A.randomize_appearance_for(new_ninja)
- new_ninja.real_name = "[ninja_title] [ninja_name]"
- new_ninja.dna.ready_dna(new_ninja)
+ A.real_name = "[pick(ninja_titles)] [pick(ninja_names)]"
+ A.copy_to(new_ninja)
new_ninja.equip_space_ninja()
return new_ninja
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index e97c00f5017..ba335b591bd 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -23,7 +23,7 @@
var/age = 30 //Player's age (pure fluff)
var/b_type = "A+" //Player's bloodtype (Not currently used, just character fluff)
- var/underwear = 1 //Which underwear the player wants
+ var/underwear = "Nude" //Which underwear the player wants
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
//Equipment slots
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 047c25a1bc3..9d041c51f42 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -233,10 +233,12 @@ Please contact me on #coderbus IRC. ~Carn x
lying_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_l"), ICON_OVERLAY)
//Underwear
- if(underwear >0 && underwear < underwear_m.len)
- if(!fat && !skeleton)
- stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
- lying_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_l"), ICON_OVERLAY)
+ if(underwear && !fat && !skeleton)
+ var/datum/sprite_accessory/underwear/U = underwear_all[underwear]
+ if(U)
+ stand_icon.Blend(new /icon(U.icon, "[U.icon_state]_s"), ICON_OVERLAY)
+ lying_icon.Blend(new /icon(U.icon, "[U.icon_state]_l"), ICON_OVERLAY)
+
if(update_icons) update_icons()
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 4149e763329..a87a8577778 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -116,7 +116,7 @@
src << "\blue Now teleporting."
observer.loc = O.loc
if(client.prefs.be_random_name)
- client.prefs.real_name = random_name()
+ client.prefs.real_name = random_name(gender)
observer.real_name = client.prefs.real_name
observer.name = observer.real_name
observer.key = key
@@ -309,11 +309,9 @@
new_character.lastarea = get_area(loc)
if(ticker.random_players)
- new_character.gender = pick(MALE, FEMALE)
- client.prefs.real_name = random_name()
- client.prefs.randomize_appearance_for(new_character)
- else
- client.prefs.copy_to(new_character)
+ client.prefs.random_character()
+ client.prefs.real_name = random_name(gender)
+ client.prefs.copy_to(new_character)
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 7ab0a74932b..8a36c953e74 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -1,22 +1,19 @@
datum/preferences
//The mob should have a gender you want before running this proc. Will run fine without H
- proc/randomize_appearance_for(var/mob/living/carbon/human/H)
- if(H)
- if(H.gender == MALE)
- gender = MALE
- else
- gender = FEMALE
+ proc/random_character(gender_override)
+ if(gender_override)
+ gender = gender_override
+ else
+ gender = pick(MALE,FEMALE)
+ underwear = random_underwear(gender)
s_tone = random_skin_tone()
h_style = random_hair_style(gender)
f_style = random_facial_hair_style(gender)
randomize_hair_color("hair")
randomize_hair_color("facial")
randomize_eyes_color()
- underwear = rand(1,underwear_m.len)
backbag = 2
age = rand(AGE_MIN,AGE_MAX)
- if(H)
- copy_to(H,1)
proc/randomize_hair_color(var/target = "hair")
@@ -144,8 +141,10 @@ datum/preferences
else
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
- if (underwear < underwear_m.len)
- preview_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
+ if(underwear)
+ var/datum/sprite_accessory/underwear/U = underwear_all[underwear]
+ if(U)
+ preview_icon.Blend(new /icon(U.icon, "[U.icon_state]_s"), ICON_OVERLAY)
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes_s")
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 3f223f30f3e..d4cb557a17e 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -16,29 +16,36 @@
from doing this unless you absolutely know what you are doing, and have defined a
conversion in savefile.dm
*/
+/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female)
+ if(!istype(L)) L = list()
+ if(!istype(male)) male = list()
+ if(!istype(female)) female = list()
+
+ for(var/path in typesof(prototype))
+ if(path == prototype) continue
+ var/datum/sprite_accessory/D = new path()
+
+ if(D.icon_state) L[D.name] = D
+ else L += D.name
+
+ switch(D.gender)
+ if(MALE) male += D.name
+ if(FEMALE) female += D.name
+ else
+ male += D.name
+ female += D.name
+ return L
/datum/sprite_accessory
+ var/icon //the icon file the accessory is located in
+ var/icon_state //the icon_state of the accessory
+ var/name //the preview name of the accessory
+ var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
- var/icon // the icon file the accessory is located in
- var/icon_state // the icon_state of the accessory
- var/preview_state // a custom preview state for whatever reason
-
- var/name // the preview name of the accessory
-
- // Determines if the accessory will be skipped or included in random hair generations
- var/gender = NEUTER
-
-
-/*
-////////////////////////////
-/ =--------------------= /
-/ == Hair Definitions == /
-/ =--------------------= /
-////////////////////////////
-*/
-
+//////////////////////
+// Hair Definitions //
+//////////////////////
/datum/sprite_accessory/hair
-
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
short
@@ -263,25 +270,19 @@
bald
name = "Bald"
- icon_state = "bald"
+ icon_state = null
gender = MALE
-/*
-///////////////////////////////////
-/ =---------------------------= /
-/ == Facial Hair Definitions == /
-/ =---------------------------= /
-///////////////////////////////////
-*/
-
+/////////////////////////////
+// Facial Hair Definitions //
+/////////////////////////////
/datum/sprite_accessory/facial_hair
-
icon = 'icons/mob/human_face.dmi'
gender = MALE // barf (unless you're a dorf, dorfs dig chix /w beards :P)
shaved
name = "Shaved"
- icon_state = "bald"
+ icon_state = null
gender = NEUTER
watson
@@ -347,3 +348,135 @@
dwarf
name = "Dwarf Beard"
icon_state = "facial_dwarf"
+
+///////////////////////////
+// Underwear Definitions //
+///////////////////////////
+/datum/sprite_accessory/underwear
+ icon = 'icons/mob/underwear.dmi'
+
+ nude
+ name = "Nude"
+ icon_state = null
+ gender = NEUTER
+
+ male_white
+ name = "Mens White"
+ icon_state = "male_white"
+ gender = MALE
+
+ male_grey
+ name = "Mens Grey"
+ icon_state = "male_grey"
+ gender = MALE
+
+ male_green
+ name = "Mens Green"
+ icon_state = "male_green"
+ gender = MALE
+
+ male_blue
+ name = "Mens Blue"
+ icon_state = "male_blue"
+ gender = MALE
+
+ male_black
+ name = "Mens Black"
+ icon_state = "male_black"
+ gender = MALE
+
+ male_mankini
+ name = "Mankini"
+ icon_state = "male_mankini"
+ gender = MALE
+
+ male_hearts
+ name = "Mens Hearts Boxer"
+ icon_state = "male_hearts"
+ gender = MALE
+
+ male_blackalt
+ name = "Mens Black Boxer"
+ icon_state = "male_blackalt"
+ gender = MALE
+
+ male_greyalt
+ name = "Mens Grey Boxer"
+ icon_state = "male_greyalt"
+ gender = MALE
+
+ male_stripe
+ name = "Mens Striped Boxer"
+ icon_state = "male_stripe"
+ gender = MALE
+
+ male_kinky
+ name = "Mens Kinky"
+ icon_state = "male_kinky"
+ gender = MALE
+
+ male_red
+ name = "Mens Red"
+ icon_state = "male_red"
+ gender = MALE
+
+ female_red
+ name = "Ladies Red"
+ icon_state = "female_red"
+ gender = FEMALE
+
+ female_white
+ name = "Ladies White"
+ icon_state = "female_white"
+ gender = FEMALE
+
+ female_yellow
+ name = "Ladies Yellow"
+ icon_state = "female_yellow"
+ gender = FEMALE
+
+ female_blue
+ name = "Ladies Blue"
+ icon_state = "female_blue"
+ gender = FEMALE
+
+ female_black
+ name = "Ladies Black"
+ icon_state = "female_black"
+ gender = FEMALE
+
+ female_thong
+ name = "Ladies Thong"
+ icon_state = "female_thong"
+ gender = FEMALE
+
+ female_babydoll
+ name = "Babydoll"
+ icon_state = "female_babydoll"
+ gender = FEMALE
+
+ female_babyblue
+ name = "Ladies Baby-Blue"
+ icon_state = "female_babyblue"
+ gender = FEMALE
+
+ female_green
+ name = "Ladies Green"
+ icon_state = "female_green"
+ gender = FEMALE
+
+ female_pink
+ name = "Ladies Pink"
+ icon_state = "female_pink"
+ gender = FEMALE
+
+ female_kinky
+ name = "Ladies Kinky"
+ icon_state = "female_kinky"
+ gender = FEMALE
+
+ female_tankini
+ name = "Tankini"
+ icon_state = "female_tankini"
+ gender = FEMALE
+
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm
index 0e3ab19aa45..ddee9eb444b 100644
--- a/code/modules/projectiles/projectile/change.dm
+++ b/code/modules/projectiles/projectile/change.dm
@@ -66,17 +66,9 @@
new_mob.universal_speak = 1*/
if("human")
new_mob = new /mob/living/carbon/human(M.loc)
- if(M.gender == MALE)
- new_mob.gender = MALE
- new_mob.name = pick(first_names_male)
- else
- new_mob.gender = FEMALE
- new_mob.name = pick(first_names_female)
- new_mob.name += " [pick(last_names)]"
- new_mob.real_name = new_mob.name
var/datum/preferences/A = new() //Randomize appearance for the human
- A.randomize_appearance_for(new_mob)
+ A.copy_to(new_mob)
var/mob/living/carbon/human/H = new_mob
if(H.dna)
diff --git a/code/unused/specops.dm b/code/unused/specops.dm
index 32037ccabba..1c8cc989c92 100644
--- a/code/unused/specops.dm
+++ b/code/unused/specops.dm
@@ -102,13 +102,14 @@ var/global/sent_strike_team = 0
var/commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
var/commando_name = pick(last_names)
- new_commando.gender = pick(MALE, FEMALE)
-
var/datum/preferences/A = new()//Randomize appearance for the commando.
- A.randomize_appearance_for(new_commando)
-
- new_commando.real_name = "[!leader_selected ? commando_rank : commando_leader_rank] [commando_name]"
- new_commando.age = !leader_selected ? rand(23,35) : rand(35,45)
+ if(leader_selected)
+ A.age = rand(35,45)
+ A.real_name = "[commando_leader_rank] [commando_name]"
+ else
+ A.real_name = "[commando_rank] [commando_name]"
+ A.real_name = "[!leader_selected ? commando_rank :
+ A.copy_to(new_commando)
new_commando.dna.ready_dna(new_commando)//Creates DNA.
diff --git a/code/unused/tensioner.dm b/code/unused/tensioner.dm
index 1cf5eb2acd8..eba4083ea96 100644
--- a/code/unused/tensioner.dm
+++ b/code/unused/tensioner.dm
@@ -765,16 +765,8 @@ var/global/datum/tension/tension_master
//First we spawn a dude.
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
- new_character.gender = pick(MALE,FEMALE)
-
var/datum/preferences/A = new()
- A.randomize_appearance_for(new_character)
- if(new_character.gender == MALE)
- new_character.real_name = "[pick(first_names_male)] [pick(last_names)]"
- else
- new_character.real_name = "[pick(first_names_female)] [pick(last_names)]"
- new_character.name = new_character.real_name
- new_character.age = rand(17,45)
+ A.copy_to(new_character)
new_character.dna.ready_dna(new_character)
new_character.key = G_found.key
@@ -787,14 +779,14 @@ var/global/datum/tension/tension_master
var/syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
var/syndicate_commando_name = pick(last_names)
- new_syndicate_commando.gender = pick(MALE, FEMALE)
-
var/datum/preferences/A = new()//Randomize appearance for the commando.
- A.randomize_appearance_for(new_syndicate_commando)
-
- new_syndicate_commando.real_name = "[!syndicate_leader_selected ? syndicate_commando_rank : syndicate_commando_leader_rank] [syndicate_commando_name]"
- new_syndicate_commando.name = new_syndicate_commando.real_name
- new_syndicate_commando.age = !syndicate_leader_selected ? rand(23,35) : rand(35,45)
+ if(syndicate_leader_selected)
+ A.real_name = "[syndicate_commando_leader_rank] [syndicate_commando_name]"
+ A.age = rand(35,45)
+ else
+ A.real_name = "[syndicate_commando_rank] [syndicate_commano_name]"
+ A.copy_to(new_syndicate_commando)
+
new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA.
diff --git a/html/changelog.html b/html/changelog.html
index 227bff59b83..ac5a225a6d7 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -49,6 +49,15 @@ should be listed in the changelog upon commit tho. Thanks. -->
+