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 += "Preview
" @@ -984,10 +984,10 @@ datum/preferences if("f_style") f_style = random_facial_hair_style(gender, species) if("underwear") - underwear = rand(1,underwear_m.len) + underwear = random_underwear(gender) ShowChoices(user) if("undershirt") - undershirt = rand(1,undershirt_t.len) + undershirt = random_undershirt(gender) ShowChoices(user) if("eyes") r_eyes = rand(0,255) @@ -1006,7 +1006,7 @@ datum/preferences /*if("skin_style") h_style = random_skin_style(gender)*/ if("all") - randomize_appearance_for() //no params needed + random_character() if("input") switch(href_list["preference"]) if("name") @@ -1176,16 +1176,17 @@ 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 ShowChoices(user) if("undershirt") - var/list/undershirt_options - undershirt_options = undershirt_t - - var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_options - if (new_undershirt) - undershirt = undershirt_options.Find(new_undershirt) + var/new_undershirt + if(gender == MALE) + new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m + else + new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f + if(new_undershirt) + undershirt = new_undershirt ShowChoices(user) if("eyes") @@ -1340,7 +1341,7 @@ datum/preferences gender = FEMALE else gender = MALE - + underwear = random_underwear(gender) if("hear_adminhelps") sound ^= SOUND_ADMINHELP @@ -1410,7 +1411,10 @@ datum/preferences close_load_dialog(user) if("changeslot") - load_character(user,text2num(href_list["num"])) + if(!load_character(user,text2num(href_list["num"]))) + random_character() + real_name = random_name(gender) + save_character(user) close_load_dialog(user) if("tab") @@ -1420,7 +1424,7 @@ 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(gender,species) @@ -1517,12 +1521,7 @@ datum/preferences W.buckled_mob = character W.add_fingerprint(character) - if(underwear > underwear_m.len || underwear < 1) - underwear = 0 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. //HAH NOW NO MORE MAGIC CLONING UNDIES character.underwear = underwear - - if(undershirt > undershirt_t.len || undershirt < 1) - undershirt = 0 character.undershirt = undershirt if(backbag > 4 || backbag < 1) diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index f098ff77989..c76ef2e3ee9 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -87,8 +87,8 @@ r_eyes = text2num(query.item[23]) g_eyes = text2num(query.item[24]) b_eyes = text2num(query.item[25]) - underwear = text2num(query.item[26]) - undershirt = text2num(query.item[27]) + underwear = query.item[26] + undershirt = query.item[27] backbag = text2num(query.item[28]) b_type = query.item[29] @@ -147,8 +147,8 @@ 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)) - undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt)) + underwear = sanitize_text(underwear, initial(underwear)) + undershirt = sanitize_text(undershirt, initial(undershirt)) backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) b_type = sanitize_text(b_type, initial(b_type)) @@ -204,7 +204,7 @@ message_admins("SQL ERROR during character slot saving. Error : \[[err]\]\n") return return 1 - +/* /datum/preferences/proc/random_character(client/C) var/DBQuery/query = dbcon.NewQuery("SELECT slot FROM characters WHERE ckey='[C.ckey]' ORDER BY slot") @@ -218,4 +218,4 @@ load_character(C) return 0 load_character(C,pick(saves)) - return 1 \ No newline at end of file + return 1*/ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 39e0f052f2b..bc10d54b1c8 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -29,8 +29,8 @@ var/age = 30 //Player's age (pure fluff) var/b_type = "A+" //Player's bloodtype - var/underwear = 1 //Which underwear the player wants - var/undershirt = 0 //Which undershirt the player wants. + var/underwear = "Nude" //Which underwear the player wants + var/undershirt = "Nude" //Which undershirt 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 f7db0be92ab..1ba23b125d2 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -318,10 +318,14 @@ var/global/list/damage_icon_parts = list() //Underwear if(underwear && species.flags & HAS_UNDERWEAR) - stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY) + var/datum/sprite_accessory/underwear/U = underwear_list[underwear] + if(U) + stand_icon.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY) if(undershirt && species.flags & HAS_UNDERWEAR) - stand_icon.Blend(new /icon('icons/mob/human.dmi', "undershirt[undershirt]_s"), ICON_OVERLAY) + var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt] + if(U2) + stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), 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 15456b3fa7c..dab6510418c 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -468,11 +468,9 @@ if(is_alien_whitelisted(src, client.prefs.language) || !config.usealienwhitelist || !(chosen_language.flags & WHITELISTED)) new_character.add_language(client.prefs.language) if(ticker.random_players || appearance_isbanned(new_character)) - new_character.gender = pick(MALE, FEMALE) + client.prefs.random_character() client.prefs.real_name = random_name(new_character.gender) - client.prefs.randomize_appearance_for(new_character) - else - client.prefs.copy_to(new_character) + 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 363675b723c..b60ebe12c5d 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -1,11 +1,12 @@ 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) + undershirt = random_undershirt(gender) if(species == "Human") s_tone = random_skin_tone() h_style = random_hair_style(gender, species) @@ -16,12 +17,8 @@ datum/preferences randomize_eyes_color() if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Vulpkanin") randomize_skin_color() - underwear = rand(1,underwear_m.len) - undershirt = rand(1,undershirt_t.len) backbag = 2 age = rand(AGE_MIN,AGE_MAX) - if(H) - copy_to(H,1) proc/randomize_hair_color(var/target = "hair") @@ -256,12 +253,16 @@ datum/preferences var/icon/underwear_s = null - if(underwear > 0 && underwear < 7 && current_species.flags & HAS_UNDERWEAR) - underwear_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "underwear[underwear]_[g]_s") + if(underwear && current_species.flags & HAS_UNDERWEAR) + var/datum/sprite_accessory/underwear/U = underwear_list[underwear] + if(U) + underwear_s = new/icon(U.icon, "[U.icon_state]_s", ICON_OVERLAY) var/icon/undershirt_s = null - if(undershirt > 0 && undershirt < 45 && current_species.flags & HAS_UNDERWEAR) - undershirt_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "undershirt[undershirt]_s") + if(undershirt && current_species.flags & HAS_UNDERWEAR) + var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt] + if(U2) + undershirt_s = new/icon(U2.icon, "[U2.icon_state]_s", ICON_OVERLAY) var/icon/clothes_s = null var/uniform_dmi='icons/mob/uniform.dmi' diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 24959d7e151..45fe53c3d82 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -17,16 +17,29 @@ conversion in savefile.dm */ +/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female) + if(!istype(L)) L = list() + if(!istype(male)) male = list() + if(!istype(female)) female = list() + + for(var/path in subtypesof(prototype)) + var/datum/sprite_accessory/D = new path() + + L[D.name] = D + + 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/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 + 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 // Restrict some styles to specific species var/list/species_allowed = list("Human") @@ -935,3 +948,316 @@ icon_state = "default" icon = 'icons/mob/human_races/r_skrell.dmi' species_allowed = list("Skrell") + +/////////////////////////// +// Underwear Definitions // +/////////////////////////// +/datum/sprite_accessory/underwear + icon = 'icons/mob/underwear.dmi' + + species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington") + + 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 + + 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_kinky + name = "Ladies Kinky" + icon_state = "female_kinky" + gender = FEMALE + +//////////////////////////// +// Undershirt Definitions // +//////////////////////////// +/datum/sprite_accessory/undershirt + icon = 'icons/mob/underwear.dmi' + + species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington") + +/datum/sprite_accessory/undershirt/nude + name = "Nude" + icon_state = null + gender = NEUTER + +//plain color shirts +/datum/sprite_accessory/undershirt/shirt_white + name = "White Shirt" + icon_state = "shirt_white" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_black + name = "Black Shirt" + icon_state = "shirt_black" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_grey + name = "Grey Shirt" + icon_state = "shirt_grey" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_red + name = "Red Shirt" + icon_state = "shirt_red" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_blue + name = "Blue Shirt" + icon_state = "shirt_blue" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_yellow + name = "Yellow Shirt" + icon_state = "shirt_yellow" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_green + name = "Green Shirt" + icon_state = "shirt_green" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_darkblue + name = "Dark Blue Shirt" + icon_state = "shirt_darkblue" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_darkred + name = "Dark Red Shirt" + icon_state = "shirt_darkred" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_darkgreen + name = "Dark Green Shirt" + icon_state = "shirt_darkgreen" + gender = NEUTER +//end plain color shirts + +/datum/sprite_accessory/undershirt/shirt_heart + name = "Heart Shirt" + icon_state = "shirt_heart" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_corgi + name = "Corgi Shirt" + icon_state = "shirt_corgi" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_jack + name = "Union Jack Shirt" + icon_state = "shirt_jack" + gender = NEUTER + +/datum/sprite_accessory/undershirt/love_nt + name = "I Love NT Shirt" + icon_state = "shirt_lovent" + gender = NEUTER + +/datum/sprite_accessory/undershirt/peace + name = "Peace Shirt" + icon_state = "shirt_peace" + gender = NEUTER + +/datum/sprite_accessory/undershirt/mondmondjaja + name = "Band Shirt" + icon_state = "shirt_band" + gender = NEUTER + +/datum/sprite_accessory/undershirt/pacman + name = "Pogoman Shirt" + icon_state = "shirt_pogoman" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_ss13 + name = "SS13 Shirt" + icon_state = "shirt_ss13" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_question + name = "Question Mark Shirt" + icon_state = "shirt_question" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_skull + name = "Skull Shirt" + icon_state = "shirt_skull" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_commie + name = "Communist Shirt" + icon_state = "shirt_commie" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_nano + name = "Nanotrasen Shirt" + icon_state = "shirt_nano" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_meat + name = "Meat Shirt" + icon_state = "shirt_meat" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_tiedie + name = "Tiedie Shirt" + icon_state = "shirt_tiedie" + gender = NEUTER + +/datum/sprite_accessory/undershirt/blue_striped + name = "Striped Blue Shirt" + icon_state = "shirt_bluestripe" + gender = NEUTER + +/datum/sprite_accessory/undershirt/brightblue_striped + name = "Striped Bright Blue Shirt" + icon_state = "shirt_brightbluestripe" + gender = NEUTER + + +//short sleeved +/datum/sprite_accessory/undershirt/short_white + name = "White Short-sleeved Shirt" + icon_state = "short_white" + gender = NEUTER + +/datum/sprite_accessory/undershirt/short_purple + name = "Purple Short-sleeved Shirt" + icon_state = "short_purple" + gender = NEUTER + +/datum/sprite_accessory/undershirt/short_blue + name = "Blue Short-sleeved Shirt" + icon_state = "short_blue" + gender = NEUTER + +/datum/sprite_accessory/undershirt/short_green + name = "Green Short-sleeved Shirt" + icon_state = "short_green" + gender = NEUTER + +/datum/sprite_accessory/undershirt/short_black + name = "Black Short-sleeved Shirt" + icon_state = "short_black" + gender = NEUTER +//end short sleeved + +//polo shirts +/datum/sprite_accessory/undershirt/polo_blue + name = "Blue Polo Shirt" + icon_state = "polo_blue" + gender = NEUTER + +/datum/sprite_accessory/undershirt/polo_red + name = "Red Polo Shirt" + icon_state = "polo_red" + gender = NEUTER + +/datum/sprite_accessory/undershirt/polo_greyelllow + name = "Grey-Yellow Polo Shirt" + icon_state = "polo_greyellow" + gender = NEUTER +//end polo shirts + +//sport shirts +/datum/sprite_accessory/undershirt/sport_green + name = "Green Sports Shirt" + icon_state = "sport_green" + gender = NEUTER + +/datum/sprite_accessory/undershirt/sport_red + name = "Red Sports Shirt" + icon_state = "sport_red" + gender = NEUTER + +/datum/sprite_accessory/undershirt/sport_blue + name = "Blue Sports Shirt" + icon_state = "sport_blue" + gender = NEUTER +//end sport shirts + +/datum/sprite_accessory/undershirt/jersey_red + name = "Red Jersey" + icon_state = "jersey_red" + gender = NEUTER + +/datum/sprite_accessory/undershirt/jersey_blue + name = "Blue Jersey" + icon_state = "jersey_blue" + gender = NEUTER + + +//tanktops +/datum/sprite_accessory/undershirt/tank_white + name = "White Tank-Top" + icon_state = "tank_white" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tank_black + name = "Black Tank-Top" + icon_state = "tank_black" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tank_grey + name = "Grey Tank-Top" + icon_state = "tank_grey" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tank_fire + name = "Fire Tank-Top" + icon_state = "tank_fire" + gender = NEUTER +//end tanktops \ No newline at end of file diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index a7bbaf50f7c..e7aefc86107 100644 Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi new file mode 100644 index 00000000000..5c303cbf642 Binary files /dev/null and b/icons/mob/underwear.dmi differ