diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index c05e74a467a..5bd9322806c 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -50,8 +50,8 @@ CREATE TABLE `characters` (
`eyes_red` smallint(4) NOT NULL,
`eyes_green` smallint(4) NOT NULL,
`eyes_blue` smallint(4) NOT NULL,
- `underwear` smallint(4) NOT NULL,
- `undershirt` smallint(4) NOT NULL,
+ `underwear` mediumtext NOT NULL,
+ `undershirt` mediumtext NOT NULL,
`backbag` smallint(4) NOT NULL,
`b_type` varchar(45) NOT NULL,
`alternate_option` smallint(4) NOT NULL,
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 210e5ed891e..c69742b94c8 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -4,32 +4,16 @@
//////////////////////////
/proc/makeDatumRefLists()
+ //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_list, underwear_m, underwear_f)
+ //undershirt
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f)
+
var/list/paths
-
- //Hair - Initialise all /datum/sprite_accessory/hair into an list indexed by hair-style name
- paths = subtypesof(/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 = subtypesof(/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
-
//Surgery Steps - Initialize all /datum/surgery_step into a list
paths = subtypesof(/datum/surgery_step)
for(var/T in paths)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 4658e6691ea..cf23b83bc96 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -1,4 +1,16 @@
-proc/random_hair_style(gender, species = "Human")
+/proc/random_underwear(var/gender)
+ switch(gender)
+ if(MALE) return pick(underwear_m)
+ if(FEMALE) return pick(underwear_f)
+ else return pick(underwear_list)
+
+/proc/random_undershirt(var/gender)
+ switch(gender)
+ if(MALE) return pick(undershirt_m)
+ if(FEMALE) return pick(undershirt_f)
+ else return pick(undershirt_list)
+
+proc/random_hair_style(var/gender, species = "Human")
var/h_style = "Bald"
var/list/valid_hairstyles = list()
@@ -29,7 +41,7 @@ proc/random_hair_style(gender, species = "Human")
if(SOUTHEAST) return NORTHWEST
return 0
-proc/random_facial_hair_style(gender, species = "Human")
+proc/random_facial_hair_style(var/gender, species = "Human")
var/f_style = "Shaved"
var/list/valid_facialhairstyles = 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/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 8ec230cc13b..882331d21de 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -8,12 +8,13 @@ var/global/list/facial_hair_styles_male_list = list()
var/global/list/facial_hair_styles_female_list = list()
var/global/list/skin_styles_female_list = list() //unused
//Underwear
-var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "None")
-var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "None")
-var/global/list/underwear_list = underwear_m + underwear_f
- //undershirt
-var/global/list/undershirt_t = list("White Shirt", "White Tank top", "Black shirt", "Black Tank top", "Grey Shirt", "Grey tank top", "Lover Shirt", "Blue Ian Shirt", "UK Shirt","I Love NT Shirt", "Peace Shirt", "Band Shirt", "PogoMan Shirt", "Matroska Shirt", "White Short-sleeved shirt", "Purple Short-sleeved shirt", "Blue Short-sleeved shirt", "Green Short-sleeved shirt", "Black Short-Sleeved shirt", "Blue T-Shirt", "Red T-Shirt", "Yellow T-Shirt", "Green T-Shirt", "Blue Polo Shirt", "Red Polo Shirt", "White Polo Shirt", "Gray-Yellow Polo Shirt", "Green Sports Shirt", "Red Sports Shirt", "Blue Sports Shirt", "SS13 Shirt", "Fire Tank Top", "Question Shirt", "Skull Shirt", "Commie Shirt", "Nanotrasen Shirt", "Striped Shirt", "Blue Shirt", "Red Shirt", "Green Shirt", "Meat Shirt", "Tie-Dye Shirt", "Red Jersey", "Blue Jersey", "None")
-var/global/list/undershirt_list = undershirt_t
+var/global/list/underwear_list = 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
+ //Undershirts
+var/global/list/undershirt_list = list() //stores /datum/sprite_accessory/undershirt indexed by name
+var/global/list/undershirt_m = list() //stores only undershirt name
+var/global/list/undershirt_f = list() //stores only undershirt name
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
diff --git a/code/game/dna/dna.dm b/code/game/dna/dna.dm
index 2835a1614ed..716d563a6e7 100644
--- a/code/game/dna/dna.dm
+++ b/code/game/dna/dna.dm
@@ -74,7 +74,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)
@@ -84,7 +84,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/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm
index 52df698a96f..f0cc2f28cbe 100644
--- a/code/game/gamemodes/nations/nations.dm
+++ b/code/game/gamemodes/nations/nations.dm
@@ -293,8 +293,7 @@ datum/game_mode/nations
else
new_character.gender = pick(MALE,FEMALE)
var/datum/preferences/A = new()
- A.randomize_appearance_for(new_character)
- new_character.real_name = real_name
+ A.copy_to(new_character)
if(!new_character.real_name)
if(new_character.gender == MALE)
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index eff70300720..1b60f3fb006 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -198,7 +198,8 @@
if(M.current.vampire_power(50, 0))
M.current.visible_message("[M.current.name] transforms!")
M.current.client.prefs.real_name = M.current.generate_name() //random_name(M.current.gender)
- M.current.client.prefs.randomize_appearance_for(M.current)
+ M.current.client.prefs.random_character()
+ M.current.client.prefs.copy_to(M.current)
M.current.regenerate_icons()
M.current.remove_vampire_blood(50)
M.current.verbs -= /client/vampire/proc/vampire_shapeshift
diff --git a/code/game/machinery/computer/hologram.dm b/code/game/machinery/computer/hologram.dm
index c21e3cf8b4f..bfd95d46457 100644
--- a/code/game/machinery/computer/hologram.dm
+++ b/code/game/machinery/computer/hologram.dm
@@ -36,7 +36,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 6a773177c59..10898e80a47 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -6,47 +6,26 @@
density = 1
anchored = 1
-/obj/structure/dresser/proc/convUnM(mund)
- return underwear_m.Find(mund)
-
-/obj/structure/dresser/proc/convUnF(fund)
- return underwear_f.Find(fund)
-
-/obj/structure/dresser/proc/convUs(us)
- return undershirt_list.Find(us)
-
/obj/structure/dresser/attack_hand(mob/user as mob)
if(!Adjacent(user))//no tele-grooming
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/choice = input(user, "Underwear, or Undershirt?", "Changing") as null|anything in list("Underwear","Undershirt")
+ var/choice = input(user, "Underwear or Undershirt?", "Changing") as null|anything in list("Underwear","Undershirt")
if(!Adjacent(user))
return
switch(choice)
if("Underwear")
- if(H.gender == FEMALE)
- var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_f
- if(new_undies)
- H << "\red You selected [new_undies]."
- var/freturn = convUnF(new_undies)
- H.underwear = freturn
-
- else
- var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_m
- if(new_undies)
- H << "\red You selected [new_undies]."
- var/mreturn = convUnM(new_undies)
- H.underwear = mreturn
+ var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_list
+ if(new_undies)
+ H.underwear = new_undies
if("Undershirt")
var/new_undershirt = input(user, "Select your undershirt", "Changing") as null|anything in undershirt_list
if(new_undershirt)
- H << "\red You selected [new_undershirt]"
- var/usreturn = convUs(new_undershirt)
- H.undershirt = usreturn
+ H.undershirt = new_undershirt
add_fingerprint(H)
H.update_body()
\ No newline at end of file
diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm
index 9b383a93d17..e64cbf66574 100644
--- a/code/modules/admin/verbs/honksquad.dm
+++ b/code/modules/admin/verbs/honksquad.dm
@@ -79,13 +79,13 @@ var/global/sent_honksquad = 0
var/honksquad_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
var/honksquad_name = pick(clown_names)
- new_honksquad.gender = pick(MALE, FEMALE)
-
var/datum/preferences/A = new()//Randomize appearance for the commando.
- A.randomize_appearance_for(new_honksquad)
-
- new_honksquad.real_name = "[!honk_leader_selected ? honksquad_rank : honksquad_leader_rank] [honksquad_name]"
- new_honksquad.age = !honk_leader_selected ? rand(23,35) : rand(35,45)
+ if(honk_leader_selected)
+ A.age = rand(35,45)
+ A.real_name = "[honksquad_leader_rank] [honksquad_name]"
+ else
+ A.real_name = "[honksquad_rank] [honksquad_name]"
+ A.copy_to(new_honksquad)
new_honksquad.dna.ready_dna(new_honksquad)//Creates DNA.
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 6bb2f96ba06..93e5bb5c078 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -396,16 +396,8 @@ client/proc/one_click_antag()
//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
@@ -418,14 +410,13 @@ client/proc/one_click_antag()
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_commando_name]"
+ A.copy_to(new_syndicate_commando)
new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA.
@@ -610,14 +601,7 @@ client/proc/one_click_antag()
var/mob/living/carbon/human/newMember = new(L.loc)
- newMember.gender = pick(MALE,FEMALE)
- A.randomize_appearance_for(newMember)
- if(newMember.gender == MALE)
- newMember.real_name = "[pick(first_names_male)] [pick(last_names)]"
- else
- newMember.real_name = "[pick(first_names_female)] [pick(last_names)]"
- newMember.name = newMember.real_name
- newMember.age = rand(17,45)
+ A.copy_to(newMember)
newMember.dna.ready_dna(newMember)
@@ -639,14 +623,7 @@ client/proc/one_click_antag()
var/mob/living/carbon/human/newMember = new(L.loc)
- newMember.gender = pick(MALE,FEMALE)
- A.randomize_appearance_for(newMember)
- if(newMember.gender == MALE)
- newMember.real_name = "[pick(first_names_male)] [pick(last_names)]"
- else
- newMember.real_name = "[pick(first_names_female)] [pick(last_names)]"
- newMember.name = newMember.real_name
- newMember.age = rand(17,45)
+ A.copy_to(newMember)
newMember.dna.ready_dna(newMember)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index feb735baef2..d01ff7de39e 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -433,14 +433,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/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index 347f461dca8..c4fda49439a 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -104,13 +104,13 @@ 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.copy_to(new_commando)
new_commando.dna.ready_dna(new_commando)//Creates DNA.
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index 3113e58c2be..42a635feafb 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -108,13 +108,13 @@ var/global/sent_syndicate_strike_team = 0
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.age = !syndicate_leader_selected ? rand(23,35) : rand(35,45)
+ if(syndicate_leader_selected)
+ A.age = rand(35,45)
+ A.real_name = "[syndicate_commando_leader_rank] [syndicate_commando_name]"
+ else
+ A.real_name = "[syndicate_commando_rank] [syndicate_commando_name]"
+ A.copy_to(new_syndicate_commando)
new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA.
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 6c985f2a002..744ddd8a04a 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -30,7 +30,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
num2text(BE_REV) = 14,
num2text(BE_VAMPIRE) = 14,
num2text(BE_BLOB) = 14,
- num2text(BE_REVENANT) = 14,
+ num2text(BE_REVENANT) = 14,
num2text(BE_OPERATIVE) = 21,
num2text(BE_CULTIST) = 21,
num2text(BE_RAIDER) = 21,
@@ -104,8 +104,8 @@ datum/preferences
var/age = 30 //age of character
var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
var/b_type = "A+" //blood type (not-chooseable)
- var/underwear = 1 //underwear type
- var/undershirt = 1 //undershirt type
+ var/underwear = "Nude" //underwear type
+ var/undershirt = "Nude" //undershirt type
var/backbag = 2 //backpack type
var/h_style = "Bald" //Hair type
var/r_hair = 0 //Hair color
@@ -185,14 +185,17 @@ datum/preferences
var/volume = 100
/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))
- if(!IsGuestKey(C.key))
-// load_path(C.ckey)
- if(load_preferences(C))
- if(load_character(C))
- return
- gender = pick(MALE, FEMALE)
+
+ var/loaded_preferences_successfully = load_preferences(C)
+ if(loaded_preferences_successfully)
+ if(load_character(C))
+ 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(C)
+ save_character(C) //let's save this new random character so it doesn't keep generating new ones.
/datum/preferences
proc/ShowChoices(mob/user)
@@ -316,11 +319,8 @@ datum/preferences
dat += "\[...\]
"
else
dat += "
"
- if(gender == MALE)
- dat += "Underwear: [underwear_m[underwear]]
"
- else
- dat += "Underwear: [underwear_f[underwear]]
"
- dat += "Undershirt: [undershirt_t[undershirt]]
"
+ dat += "Underwear:
[underwear]
"
+ dat += "Undershirt:
[undershirt]
"
dat += "Backpack Type:
[backbaglist[backbag]]
"
dat += "Nanotrasen Relation:
[nanotrasen_relation]
"
dat += "