From abb528366e725a30aceeea4a4eca82aab9aaf268 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Sun, 27 Dec 2015 19:43:12 -0500 Subject: [PATCH] Guts Tails (for now), adds Horn Colour Customization, Fixes Icon Typo, Cuts Old File, Adds Species Checks Cuts tail markings to be implemented in another PR, adds the ability to change the horn colour independent of the body colour and reworks the code accordingly, drops the preferences_savefile.dm as it's unused (@crazylemon64), adds some species checks just for uniformity --- code/datums/datacore.dm | 8 +- code/modules/client/preferences.dm | 63 ++- code/modules/client/preferences_savefile.dm | 453 ------------------ .../living/carbon/human/body_accessories.dm | 50 -- .../mob/living/carbon/human/human_defines.dm | 5 +- .../mob/living/carbon/human/update_icons.dm | 6 +- .../mob/new_player/preferences_setup.dm | 2 +- icons/mob/body_accessory.dmi | Bin 10373 -> 3612 bytes icons/mob/human_face.dmi | Bin 78896 -> 78896 bytes 9 files changed, 53 insertions(+), 534 deletions(-) delete mode 100644 code/modules/client/preferences_savefile.dm diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index a65a57a345c..d967b5cc2cf 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -175,10 +175,10 @@ proc/get_id_photo(var/mob/living/carbon/human/H) //Horns if(H.species.bodyflags & HAS_HORNS) - var/datum/sprite_accessory/horns = horn_styles_list[H.horns] - if(horns) - var/icon/horns_s = new/icon("icon" = horns.icon, "icon_state" = "[horns.icon_state]_s") - horns_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) + var/datum/sprite_accessory/horn_style = horn_styles_list[H.hn_style] + if(horn_style) + var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") + horns_s.Blend(rgb(H.r_horns, H.g_horns, H.b_horns), ICON_ADD) eyes_s.Blend(horns_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style] diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 57e56808de6..0e1c731e428 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -110,7 +110,10 @@ datum/preferences var/undershirt = "Nude" //undershirt type var/socks = "Nude" //socks type var/backbag = 2 //backpack type - var/horns = "None" //Horn style + var/hn_style = "None" //Horn style + var/r_horns = 0 //Horn colour + var/g_horns = 0 //Horn colour + var/b_horns = 0 //Horn colour var/m_style = "None" //Marking style var/r_markings = 0 //Marking colour var/g_markings = 0 //Marking colour @@ -360,7 +363,8 @@ datum/preferences if(species == "Unathi") //Species that have horns. dat += "
Horns
" - dat += "Style: [horns]
" + dat += "Change Color
__
" + dat += "Style: [hn_style]
" dat += "
Body Markings
" dat += "Change Color
__
" @@ -1201,21 +1205,32 @@ datum/preferences if(new_h_style) h_style = new_h_style + if("horns") - var/list/valid_hornstyles = list() - for(var/hornstyle in horn_styles_list) - var/datum/sprite_accessory/H = horn_styles_list[hornstyle] - if( !(species in H.species_allowed)) - continue + if(species == "Unathi") // Species with horns + var/input = "Choose the colour of your your character's horns:" + var/new_horns = input(user, input, "Character Preference", rgb(r_horns, g_horns, b_horns)) as color|null + if(new_horns) + r_horns = hex2num(copytext(new_horns, 2, 4)) + g_horns = hex2num(copytext(new_horns, 4, 6)) + b_horns = hex2num(copytext(new_horns, 6, 8)) - valid_hornstyles[hornstyle] = horn_styles_list[hornstyle] + if("hn_style") + if(species == "Unathi") // Species with horns + var/list/valid_hornstyles = list() + for(var/hornstyle in horn_styles_list) + var/datum/sprite_accessory/H = horn_styles_list[hornstyle] + if( !(species in H.species_allowed)) + continue - var/new_horn_style = input(user, "Choose your character's horn style:", "Character Preference") as null|anything in valid_hornstyles - if(new_horn_style) - horns = new_horn_style + valid_hornstyles[hornstyle] = horn_styles_list[hornstyle] + + var/new_horn_style = input(user, "Choose your character's horn style:", "Character Preference") as null|anything in valid_hornstyles + if(new_horn_style) + hn_style = new_horn_style if("markings") - if(species == "Unathi") + if(species == "Unathi") // Species with markings var/input = "Choose the colour of your your character's body markings:" var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null if(new_markings) @@ -1224,17 +1239,18 @@ datum/preferences b_markings = hex2num(copytext(new_markings, 6, 8)) if("m_style") - var/list/valid_markings = list() - for(var/markingstyle in marking_styles_list) - var/datum/sprite_accessory/M = marking_styles_list[markingstyle] - if( !(species in M.species_allowed)) - continue + if(species == "Unathi") // Species with markings + var/list/valid_markings = list() + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/M = marking_styles_list[markingstyle] + if( !(species in M.species_allowed)) + continue - valid_markings[markingstyle] = marking_styles_list[markingstyle] + valid_markings[markingstyle] = marking_styles_list[markingstyle] - var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference") as null|anything in valid_markings - if(new_marking_style) - m_style = new_marking_style + var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference") as null|anything in valid_markings + if(new_marking_style) + m_style = new_marking_style if("body_accessory") var/list/possible_body_accessories = list() @@ -1656,7 +1672,10 @@ datum/preferences character.socks = socks if(character.species.bodyflags & HAS_HORNS) - character.horns = horns + character.r_horns = r_horns + character.g_horns = g_horns + character.b_horns = b_horns + character.hn_style = hn_style if(character.species.bodyflags & HAS_MARKINGS) character.r_markings = r_markings character.g_markings = g_markings diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm deleted file mode 100644 index b0f6524b085..00000000000 --- a/code/modules/client/preferences_savefile.dm +++ /dev/null @@ -1,453 +0,0 @@ -#define SAVEFILE_VERSION_MIN 8 -#define SAVEFILE_VERSION_MAX 12 - -//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 - - if(savefile_version == SAVEFILE_VERSION_MAX) //update successful. - save_preferences() - save_character() - return 1 - return 0 - -/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 - - //general preferences - S["ooccolor"] >> ooccolor - S["lastchangelog"] >> lastchangelog - S["UI_style"] >> UI_style - S["be_special"] >> be_special - S["default_slot"] >> default_slot - S["toggles"] >> toggles - S["sound"] >> sound - S["UI_style_color"] >> UI_style_color - S["UI_style_alpha"] >> UI_style_alpha - S["randomslot"] >> randomslot - S["volume"] >> volume - //Sanitize - ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) - lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) - UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style)) - be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) - default_slot = sanitize_integer(default_slot, 1, MAX_SAVE_SLOTS, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) - sound = sanitize_integer(sound, 0, 65535, initial(toggles)) - UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color)) - UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha)) - randomslot = sanitize_integer(randomslot, 0, 1, initial(randomslot)) - volume = sanitize_integer(volume, 0, 100, initial(volume)) - return 1 - -/datum/preferences/proc/save_preferences() - if(!path) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/" - - S["version"] << savefile_version - - //general preferences - S["ooccolor"] << ooccolor - S["lastchangelog"] << lastchangelog - S["UI_style"] << UI_style - S["be_special"] << be_special - S["default_slot"] << default_slot - S["toggles"] << toggles - S["sound"] << sound - S["UI_style_color"] << UI_style_color - S["UI_style_alpha"] << UI_style_alpha - S["randomslot"] << randomslot - S["volume"] << volume - return 1 - - -//saving volume changes -/datum/preferences/proc/save_volume() - if(!path) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/" - - S["volume"] << volume - return 1 -*/ - -/datum/preferences/proc/load_save(dir) - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = dir - - //Character - S["OOC_Notes"] >> metadata - S["real_name"] >> real_name - S["name_is_always_random"] >> be_random_name - S["gender"] >> gender - S["age"] >> age - S["species"] >> species - S["language"] >> language - S["spawnpoint"] >> spawnpoint - - //colors to be consolidated into hex strings (requires some work with dna code) - S["markings_red"] >> r_markings - S["markings_green"] >> g_markings - S["markings_blue"] >> b_markings - S["hair_red"] >> r_hair - S["hair_green"] >> g_hair - S["hair_blue"] >> b_hair - S["facial_red"] >> r_facial - S["facial_green"] >> g_facial - S["facial_blue"] >> b_facial - S["skin_tone"] >> s_tone - S["skin_red"] >> r_skin - S["skin_green"] >> g_skin - S["skin_blue"] >> b_skin - S["horn_style_name"] >> horns - S["marking_style_name"] >> m_style - S["hair_style_name"] >> h_style - S["facial_style_name"] >> f_style - S["eyes_red"] >> r_eyes - S["eyes_green"] >> g_eyes - S["eyes_blue"] >> b_eyes - S["underwear"] >> underwear - S["undershirt"] >> undershirt - S["socks"] >> socks - S["backbag"] >> backbag - S["b_type"] >> b_type - S["accent"] >> accent - S["voice"] >> voice - S["pitch"] >> pitch - S["talkspeed"] >> talkspeed - - //Jobs - S["alternate_option"] >> alternate_option - S["job_civilian_high"] >> job_civilian_high - S["job_civilian_med"] >> job_civilian_med - S["job_civilian_low"] >> job_civilian_low - S["job_medsci_high"] >> job_medsci_high - S["job_medsci_med"] >> job_medsci_med - S["job_medsci_low"] >> job_medsci_low - S["job_engsec_high"] >> job_engsec_high - S["job_engsec_med"] >> job_engsec_med - S["job_engsec_low"] >> job_engsec_low - S["job_karma_high"] >> job_karma_high - S["job_karma_med"] >> job_karma_med - S["job_karma_low"] >> job_karma_low - - //Miscellaneous - S["flavor_text"] >> flavor_text - S["med_record"] >> med_record - S["sec_record"] >> sec_record - S["gen_record"] >> gen_record - S["be_special"] >> be_special - S["disabilities"] >> disabilities - S["player_alt_titles"] >> player_alt_titles - S["organ_data"] >> organ_data - - S["nanotrasen_relation"] >> nanotrasen_relation - //S["skin_style"] >> skin_style - - //Sanitize - metadata = sanitize_text(metadata, initial(metadata)) - real_name = reject_bad_name(real_name) - if(isnull(species)) species = "Human" - if(isnull(language)) language = "None" - if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation) - if(!real_name) real_name = random_name(gender,species) - be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) - gender = sanitize_gender(gender) - age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) - r_markings = sanitize_integer(r_markings, 0, 255, initial(r_markings)) - g_markings = sanitize_integer(g_markings, 0, 255, initial(g_markings)) - b_markings = sanitize_integer(b_markings, 0, 255, initial(b_markings)) - r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) - g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) - b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) - r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial)) - g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial)) - b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial)) - s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone)) - r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) - g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) - b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) - horns = sanitize_inlist(horns, horn_styles_list, initial(horns)) - m_style = sanitize_inlist(m_style, marking_styles_list, initial(m_style)) - 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)) - undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt)) - socks = sanitize_integer(socks,1 socks_t.len, initial(socks)) - backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) - b_type = sanitize_text(b_type, initial(b_type)) - accent = sanitize_text(accent, initial(accent)) - voice = sanitize_text(voice, initial(voice)) - pitch = sanitize_text(pitch, initial(pitch)) - talkspeed = sanitize_text(talkspeed, initial(talkspeed)) - - alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option)) - job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) - job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) - job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) - job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high)) - job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med)) - job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low)) - job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high)) - job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) - job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) - job_karma_high = sanitize_integer(job_karma_high, 0, 65535, initial(job_karma_high)) - job_karma_med = sanitize_integer(job_karma_med, 0, 65535, initial(job_karma_med)) - job_karma_low = sanitize_integer(job_karma_low, 0, 65535, initial(job_karma_low)) - - if(isnull(disabilities)) disabilities = 0 - if(!player_alt_titles) player_alt_titles = new() - if(!organ_data) src.organ_data = list() - //if(!skin_style) skin_style = "Default" - -/datum/preferences/proc/random_character() - if(!path) return 0 - if(!fexists(path)) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - var/list/saves = list() - var/name - for(var/i=1, i<=MAX_SAVE_SLOTS, i++) - S.cd = "/character[i]" - S["real_name"] >> name - if(!name) continue - saves.Add(S.cd) - - if(!saves.len) - load_character() - return 0 - S.cd = pick(saves) - load_save(S.cd) - return 1 -/* -/datum/preferences/proc/load_character(slot) - if(!path) return 0 - if(!fexists(path)) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/" - if(!slot) slot = default_slot - slot = sanitize_integer(slot, 1, MAX_SAVE_SLOTS, initial(default_slot)) - if(slot != default_slot) - default_slot = slot - S["default_slot"] << slot - S.cd = "/character[slot]" - load_save(S.cd) - Now loaded by proc load_save(S.cd) - //Character - S["OOC_Notes"] >> metadata - S["real_name"] >> real_name - S["name_is_always_random"] >> be_random_name - S["gender"] >> gender - S["age"] >> age - S["species"] >> species - S["language"] >> language - - //colors to be consolidated into hex strings (requires some work with dna code) - S["hair_red"] >> r_hair - S["hair_green"] >> g_hair - S["hair_blue"] >> b_hair - S["facial_red"] >> r_facial - S["facial_green"] >> g_facial - S["facial_blue"] >> b_facial - S["skin_tone"] >> s_tone - S["skin_red"] >> r_skin - S["skin_green"] >> g_skin - S["skin_blue"] >> b_skin - S["hair_style_name"] >> h_style - S["facial_style_name"] >> f_style - S["eyes_red"] >> r_eyes - S["eyes_green"] >> g_eyes - S["eyes_blue"] >> b_eyes - S["underwear"] >> underwear - S["undershirt"] >> undershirt - S["backbag"] >> backbag - S["b_type"] >> b_type - - //Jobs - S["alternate_option"] >> alternate_option - S["job_civilian_high"] >> job_civilian_high - S["job_civilian_med"] >> job_civilian_med - S["job_civilian_low"] >> job_civilian_low - S["job_medsci_high"] >> job_medsci_high - S["job_medsci_med"] >> job_medsci_med - S["job_medsci_low"] >> job_medsci_low - S["job_engsec_high"] >> job_engsec_high - S["job_engsec_med"] >> job_engsec_med - S["job_engsec_low"] >> job_engsec_low - - //Miscellaneous - S["flavor_text"] >> flavor_text - S["med_record"] >> med_record - S["sec_record"] >> sec_record - S["gen_record"] >> gen_record - S["be_special"] >> be_special - S["disabilities"] >> disabilities - S["player_alt_titles"] >> player_alt_titles - S["organ_data"] >> organ_data - - S["nanotrasen_relation"] >> nanotrasen_relation - //S["skin_style"] >> skin_style - - - //Sanitize - metadata = sanitize_text(metadata, initial(metadata)) - real_name = reject_bad_name(real_name) - if(isnull(species)) species = "Human" - if(isnull(language)) language = "None" - if(isnull(spawnpoint)) spawnpoint = "Arrivals Shuttle" - if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation) - if(!real_name) real_name = random_name(gender) - be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) - gender = sanitize_gender(gender) - age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) - r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) - g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) - b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) - r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial)) - g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial)) - b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial)) - s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone)) - r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) - g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) - b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) - 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)) - undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt)) - backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) - b_type = sanitize_text(b_type, initial(b_type)) - - alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option)) - job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) - job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) - job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) - job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high)) - job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med)) - job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low)) - job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high)) - job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) - job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) - - if(isnull(disabilities)) disabilities = 0 - if(!player_alt_titles) player_alt_titles = new() - if(!organ_data) src.organ_data = list() - //if(!skin_style) skin_style = "Default" - - return 1 - -/datum/preferences/proc/save_character() - if(!path) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/character[default_slot]" - - //Character - S["OOC_Notes"] << metadata - S["real_name"] << real_name - S["name_is_always_random"] << be_random_name - S["gender"] << gender - S["age"] << age - S["species"] << species - S["language"] << language - S["hair_red"] << r_hair - S["hair_green"] << g_hair - S["hair_blue"] << b_hair - S["facial_red"] << r_facial - S["facial_green"] << g_facial - S["facial_blue"] << b_facial - S["skin_tone"] << s_tone - S["skin_red"] << r_skin - S["skin_green"] << g_skin - S["skin_blue"] << b_skin - S["hair_style_name"] << h_style - S["facial_style_name"] << f_style - S["eyes_red"] << r_eyes - S["eyes_green"] << g_eyes - S["eyes_blue"] << b_eyes - S["underwear"] << underwear - S["undershirt"] << undershirt - S["backbag"] << backbag - S["b_type"] << b_type - S["accent"] << accent - S["voice"] << voice - S["pitch"] << pitch - S["talkspeed"] << talkspeed - - //Jobs - S["alternate_option"] << alternate_option - S["job_civilian_high"] << job_civilian_high - S["job_civilian_med"] << job_civilian_med - S["job_civilian_low"] << job_civilian_low - S["job_medsci_high"] << job_medsci_high - S["job_medsci_med"] << job_medsci_med - S["job_medsci_low"] << job_medsci_low - S["job_engsec_high"] << job_engsec_high - S["job_engsec_med"] << job_engsec_med - S["job_engsec_low"] << job_engsec_low - S["job_karma_high"] << job_karma_high - S["job_karma_med"] << job_karma_med - S["job_karma_low"] << job_karma_low - - //Miscellaneous - S["flavor_text"] << flavor_text - S["med_record"] << med_record - S["sec_record"] << sec_record - S["gen_record"] << gen_record - S["player_alt_titles"] << player_alt_titles - S["be_special"] << be_special - S["disabilities"] << disabilities - S["organ_data"] << organ_data - - S["nanotrasen_relation"] << nanotrasen_relation - //S["skin_style"] << skin_style - - return 1 -*/ - -#undef SAVEFILE_VERSION_MAX -#undef SAVEFILE_VERSION_MIN diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index f9450c457ee..ca94bd49baf 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -128,53 +128,3 @@ var/global/list/body_accessory_by_species = list("None" = null) icon_state = "vulptail5" animated_icon_state = "vulptail5_a" allowed_species = list("Vulpkanin") - -//Unathi -/datum/body_accessory/tail/unathi_2 - name = "Unathi Alt 1 (Smooth)" - - icon_state = "liztail2" - animated_icon_state = "liztail2_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_3 - name = "Unathi Alt 2 (Light)" - - icon_state = "liztail3" - animated_icon_state = "liztail3_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_4 - name = "Unathi Alt 3 (Dark Stripe)" - - icon_state = "liztail4" - animated_icon_state = "liztail4_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_5 - name = "Unathi Alt 4 (Light Stripe)" - - icon_state = "liztail5" - animated_icon_state = "liztail5_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_6 - name = "Unathi Alt 5 (Dark Tiger)" - - icon_state = "liztail6" - animated_icon_state = "liztail6_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_7 - name = "Unathi Alt 6 (Light Tiger)" - - icon_state = "liztail7" - animated_icon_state = "liztail7_a" - allowed_species = list("Unathi") - -/datum/body_accessory/tail/unathi_8 - name = "Unathi Alt 7 (Aquatic)" - - icon_state = "liztail8" - animated_icon_state = "liztail8_a" - allowed_species = list("Unathi") \ 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 a75b1ab7bb5..65d4002c7d3 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -15,7 +15,10 @@ var/h_style = "Bald" //Horns - var/horns = "None" + var/r_horns = 0 + var/g_horns = 0 + var/b_horns = 0 + var/hn_style = "None" //Facial hair colour and style var/r_facial = 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 3f01c0937da..da3e0af38f2 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -408,13 +408,13 @@ var/global/list/damage_icon_parts = list() //base icons var/icon/horns_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") - if(horns && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()) && (src.species.bodyflags & HAS_HORNS))) - var/datum/sprite_accessory/horn_style = horn_styles_list[horns] + if(hn_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()) && (src.species.bodyflags & HAS_HORNS))) + var/datum/sprite_accessory/horn_style = horn_styles_list[hn_style] if(horn_style && horn_style.species_allowed) if(src.species.name in horn_style.species_allowed) var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") if(horn_style.do_colouration) - horns_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + horns_s.Blend(rgb(r_horns, g_horns, b_horns), ICON_ADD) horns_standing.Blend(horns_s, ICON_OVERLAY) else //warning("Invalid horns for [species.name]: [horns]") diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index b8cc06da85b..1b217dcf23a 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -269,7 +269,7 @@ datum/preferences //Horns if(current_species && (current_species.bodyflags & HAS_HORNS)) - var/datum/sprite_accessory/horn_style = horn_styles_list[horns] + var/datum/sprite_accessory/horn_style = horn_styles_list[hn_style] if(horn_style) var/icon/horns_s = new/icon("icon" = horn_style.icon, "icon_state" = "[horn_style.icon_state]_s") horns_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index dc91d47685ffbd44ae058a4a94debc791d6fc466..b66a22cd08ae782e9ce25a800c4f5c0dc3281815 100644 GIT binary patch literal 3612 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 F{~xTwAO!#b literal 10373 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 diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 2501df9741f0789900a17720d9c5c327768bccfb..34f7669cc857d987746050d8c735b55ba081089f 100644 GIT binary patch delta 51 zcmdn+f@K2`@v#bPtzB~cti1Mz)6G$y-ObzXlwQ!7tjH?P@wi-Y(I+Z|XL HKj;AfWmpy$ delta 51 zcmdn+f@K2`@v#bLJ>8@CFQPVnPH>cGck{M8r598tE3%4nEDI9U+Z=xAX|n_Cb_Z6* G4|)JtRu#Aa