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. --> +
+

28 March 2013

+

Carnie updated:

+ +
+

14 March 2013

Major_sephiroth updated:

diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index 6d61b079b32..afac50b3dc7 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..48c2760d065 Binary files /dev/null and b/icons/mob/underwear.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 9e40c9a8d56..31950ece9e2 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ