diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 32dc9630bb0..43dcaa1c75d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -9,7 +9,7 @@ //head accessory init_sprite_accessory_subtypes(/datum/sprite_accessory/head_accessory, head_accessory_styles_list) //hair - init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, hair_styles_list, hair_styles_male_list, hair_styles_female_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, hair_styles_public_list, hair_styles_male_list, hair_styles_female_list, hair_styles_full_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 diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index f20be8c1c0b..cf030dc65ed 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -49,8 +49,8 @@ proc/pick_species_allowed_underwear(list/all_picks, species) proc/random_hair_style(var/gender, species = "Human", var/datum/robolimb/robohead) var/h_style = "Bald" var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + for(var/hairstyle in hair_styles_public_list) + var/datum/sprite_accessory/S = hair_styles_public_list[hairstyle] if(hairstyle == "Bald") //Just in case. valid_hairstyles += hairstyle diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 4639f5d93cf..b71498e0636 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -4,9 +4,10 @@ var/global/list/head_accessory_styles_list = list() //stores /datum/sprite_acces //Marking styles var/global/list/marking_styles_list = list() //stores /datum/sprite_accessory/body_markings indexed by name //Hairstyles -var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name +var/global/list/hair_styles_public_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_full_list = list() //fluff hair styles 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() diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index d611396a45a..558f6407528 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -405,7 +405,7 @@ var/record_id_num = 1001 eyes_s.Blend(eyes_organ.eye_colour, ICON_ADD) face_s.Blend(eyes_s, ICON_OVERLAY) - var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style] + var/datum/sprite_accessory/hair_style = hair_styles_full_list[head_organ.h_style] if(hair_style) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") // I'll want to make a species-specific proc for this sooner or later diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 01424b35934..6c05dfd6f2b 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -185,9 +185,9 @@ /datum/dna/proc/write_head_attributes(obj/item/organ/external/head/head_organ) //Hair - var/hair = GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_list.len) - if((hair > 0) && (hair <= hair_styles_list.len)) - head_organ.h_style = hair_styles_list[hair] + var/hair = GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_full_list.len) + if((hair > 0) && (hair <= hair_styles_full_list.len)) + head_organ.h_style = hair_styles_full_list[hair] head_organ.hair_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HAIR_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_B, 255)) head_organ.sec_hair_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_B, 255)) @@ -229,7 +229,7 @@ return if(!head_organ.h_style) head_organ.h_style = "Skinhead" - var/hair = hair_styles_list.Find(head_organ.h_style) + var/hair = hair_styles_full_list.Find(head_organ.h_style) // Facial Hair if(!head_organ.f_style) @@ -261,6 +261,6 @@ SetUIValueRange(DNA_UI_HACC_G, color2G(head_organ.headacc_colour), 255, 1) SetUIValueRange(DNA_UI_HACC_B, color2B(head_organ.headacc_colour), 255, 1) - SetUIValueRange(DNA_UI_HAIR_STYLE, hair, hair_styles_list.len, 1) + SetUIValueRange(DNA_UI_HAIR_STYLE, hair, hair_styles_full_list.len, 1) SetUIValueRange(DNA_UI_BEARD_STYLE, beard, facial_hair_styles_list.len, 1) SetUIValueRange(DNA_UI_HACC_STYLE, headacc, head_accessory_styles_list.len, 1) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index cbacd5faf00..f33ab1e2dfe 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -68,7 +68,7 @@ if(new_hair) M.change_hair_color(new_hair) - var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style] + var/datum/sprite_accessory/hair_style = hair_styles_public_list[head_organ.h_style] if(hair_style.secondary_theme && !hair_style.no_sec_colour) new_hair = input("Please select secondary hair color.", "Character Generation", head_organ.sec_hair_colour) as null|color if(new_hair) diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index ef49db0e449..862c39b31b4 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -58,8 +58,8 @@ //handle normal hair var/list/species_hair = list() if(C.species) - for(var/i in hair_styles_list) - var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] + for(var/i in hair_styles_public_list) + var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i] if(C.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles. if(C.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list. if(robohead.is_monitor) @@ -76,7 +76,7 @@ to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.") return else - species_hair = hair_styles_list + species_hair = hair_styles_public_list var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair user.visible_message("[user] starts cutting [M]'s hair!", "You start cutting [M]'s hair!") //arguments for this are: 1. what others see 2. what the user sees. --Fixed grammar, (TGameCo) playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1) diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index a0a445f59be..c1a0a0de770 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -321,7 +321,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Hair: " dat += "[h_style]" dat += "Color [color_square(h_colour)]" - var/datum/sprite_accessory/temp_hair_style = hair_styles_list[h_style] + var/datum/sprite_accessory/temp_hair_style = hair_styles_public_list[h_style] if(temp_hair_style && temp_hair_style.secondary_theme && !temp_hair_style.no_sec_colour) dat += " Color #2 [color_square(h_sec_colour)]" dat += "
" @@ -1397,7 +1397,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("secondary_hair") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) - var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + var/datum/sprite_accessory/hair_style = hair_styles_public_list[h_style] if(hair_style.secondary_theme && !hair_style.no_sec_colour) var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", h_sec_colour) as color|null if(new_hair) @@ -1405,8 +1405,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("h_style") var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/SA = hair_styles_list[hairstyle] + for(var/hairstyle in hair_styles_public_list) + var/datum/sprite_accessory/SA = hair_styles_public_list[hairstyle] if(hairstyle == "Bald") //Just in case. valid_hairstyles += hairstyle @@ -1798,7 +1798,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("Normal") if(limb == "head") m_styles["head"] = "None" - h_style = hair_styles_list["Bald"] + h_style = hair_styles_public_list["Bald"] f_style = facial_hair_styles_list["Shaved"] organ_data[limb] = null rlimb_data[limb] = null @@ -1849,7 +1849,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(limb == "head") ha_style = "None" alt_head = null - h_style = hair_styles_list["Bald"] + h_style = hair_styles_public_list["Bald"] f_style = facial_hair_styles_list["Shaved"] m_styles["head"] = "None" rlimb_data[limb] = choice diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index a7c3810a40d..5581d0a1844 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -263,7 +263,7 @@ for(var/marking_location in m_colours) m_colours[marking_location] = sanitize_hexcolor(m_colours[marking_location], DEFAULT_MARKING_COLOURS[marking_location]) hacc_colour = sanitize_hexcolor(hacc_colour) - h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) + h_style = sanitize_inlist(h_style, hair_styles_public_list, initial(h_style)) f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) for(var/marking_location in m_styles) m_styles[marking_location] = sanitize_inlist(m_styles[marking_location], marking_styles_list, DEFAULT_MARKING_STYLES[marking_location]) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index a85a34caffb..348a9178721 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1195,6 +1195,26 @@ return 1 ..() +/obj/item/fluff/zekemirror //phantasmicdream : Zeke Varloss + name = "engraved hand mirror" + desc = "A very classy hand mirror, with fancy detailing." + icon = 'icons/obj/custom_items.dmi' + icon_state = "hand_mirror" + attack_verb = list("smacked") + hitsound = 'sound/weapons/tap.ogg' + force = 0 + throwforce = 0 + w_class = WEIGHT_CLASS_SMALL + +/obj/item/fluff/zekemirror/attack_self(mob/user) + var/mob/living/carbon/human/target = user + if(!istype(target) || target.get_species() != "Skrell") // It'd be strange to see other races with head tendrils. + return + + if(target.change_hair("Zekes Tentacles", 1)) + to_chat(target, "You take time to admire yourself in [src], brushing your tendrils down and revealing their true length.") + + /obj/item/clothing/accessory/necklace/locket/fluff/fethasnecklace //Fethas: Sefra'neem name = "Orange gemmed locket" desc = "A locket with a orange gem set on the front, the picture inside seems to be of a Tajaran." @@ -1212,4 +1232,4 @@ righthand_file = 'icons/mob/inhands/fluff_righthand.dmi' icon_state = "sheetcosmos" item_state = "sheetcosmos" - item_color = "sheetcosmos" + item_color = "sheetcosmos" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 3cb6cec5720..80b871e7996 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -21,7 +21,7 @@ gender = new_gender - var/datum/sprite_accessory/hair/current_hair = hair_styles_list[H.h_style] + var/datum/sprite_accessory/hair/current_hair = hair_styles_full_list[H.h_style] if(current_hair.gender != NEUTER && current_hair.gender != gender) reset_head_hair() @@ -35,9 +35,12 @@ update_body() return 1 -/mob/living/carbon/human/proc/change_hair(var/hair_style) +/mob/living/carbon/human/proc/change_hair(var/hair_style, var/fluff) var/obj/item/organ/external/head/H = get_organ("head") - if(!hair_style || !H || H.h_style == hair_style || !(hair_style in hair_styles_list)) + + if(!hair_style || !H || H.h_style == hair_style) + return + if(!(fluff || (hair_style in hair_styles_public_list))) return H.h_style = hair_style @@ -339,8 +342,8 @@ if(!H) return //No head, no hair. - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + for(var/hairstyle in hair_styles_public_list) + var/datum/sprite_accessory/S = hair_styles_public_list[hairstyle] if(hairstyle == "Bald") //Just in case. valid_hairstyles += hairstyle diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index 761f35b9520..cf49a328981 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -140,3 +140,4 @@ var/global/list/body_accessory_by_species = list("None" = null) icon_state = "vulptail6" animated_icon_state = "vulptail6_a" allowed_species = list("Vulpkanin") + diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6a223324268..42968e5d63b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1590,8 +1590,8 @@ else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize. var/list/hair = list() - for(var/i in hair_styles_list) - var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] + for(var/i in hair_styles_public_list) + var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i] if((head_organ.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use. hair += i diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 90002196c0f..90ee068486f 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -442,7 +442,7 @@ var/global/list/damage_icon_parts = list() //var/icon/debrained_s = new /icon("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s") if(head_organ.h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()))) - var/datum/sprite_accessory/hair/hair_style = hair_styles_list[head_organ.h_style] + var/datum/sprite_accessory/hair/hair_style = hair_styles_full_list[head_organ.h_style] //if(!src.get_int_organ(/obj/item/organ/internal/brain) && src.get_species() != "Machine" )//make it obvious we have NO BRAIN // hair_standing.Blend(debrained_s, ICON_OVERLAY) if(hair_style && hair_style.species_allowed) @@ -759,7 +759,7 @@ var/global/list/damage_icon_parts = list() else new_glasses = image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]") - var/datum/sprite_accessory/hair/hair_style = hair_styles_list[head_organ.h_style] + var/datum/sprite_accessory/hair/hair_style = hair_styles_full_list[head_organ.h_style] if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. overlays_standing[GLASSES_OVER_LAYER] = new_glasses else diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index a1ee93e986a..63a8d5ad78c 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -341,7 +341,7 @@ face_s.Blend(eyes_s, ICON_OVERLAY) - var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + var/datum/sprite_accessory/hair_style = hair_styles_full_list[h_style] if(hair_style) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(current_species.name == "Slime People") // whee I am part of the problem diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 5572f9cc8af..3c44bb5a82a 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -17,16 +17,21 @@ conversion in savefile.dm */ -/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female) +/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female, var/list/full_list) if(!istype(L)) L = list() if(!istype(male)) male = list() if(!istype(female)) female = list() + if(!istype(full_list)) full_list = list() for(var/path in subtypesof(prototype)) var/datum/sprite_accessory/D = new path() if(D.name) - L[D.name] = D + if(D.fluff) + full_list[D.name] = D + else + L[D.name] = D + full_list[D.name] = D switch(D.gender) if(MALE) male[D.name] = D @@ -50,7 +55,7 @@ var/marking_location //Specifies which bodypart a body marking is located on. var/secondary_theme = null //If exists, there's a secondary colour to that hair style and the secondary theme's icon state's suffix is equal to this. var/no_sec_colour = null //If exists, prohibit the colouration of the secondary theme. - + var/fluff = 0 // Whether or not the accessory can be affected by colouration var/do_colouration = 1 @@ -65,7 +70,7 @@ /datum/sprite_accessory/hair icon = 'icons/mob/human_face.dmi' // default icon for all hairs - var/glasses_over //Hair styles with hair that don't overhang the arms of glasses should have glasses_over set to a positive value. + var/glasses_over //Hair styles with hair that don't overhang the arms of glasses should have glasses_over set to a positive value /datum/sprite_accessory/hair/bald name = "Bald" @@ -566,7 +571,7 @@ name = "Unathi Side Frills" icon_state = "unathi_sidefrills" secondary_theme = "webbing" - + /datum/sprite_accessory/hair/unathi/una_cobra_hood icon = 'icons/mob/human_face.dmi' name = "Unathi Cobra Hood" @@ -742,6 +747,8 @@ icon_state = "hair_fingerwave" glasses_over = null + + /datum/sprite_accessory/hair/vulpkanin species_allowed = list("Vulpkanin") @@ -927,6 +934,15 @@ icon_state = "nuc_neutron" + +/datum/sprite_accessory/hair/fluff + fluff = 1 + +/datum/sprite_accessory/hair/fluff/zeke_fluff_tentacle //Zeke Fluff hair + name = "Zekes Tentacles" + icon_state = "zeke_fluff_hair" + species_allowed = list("Skrell") + /* /////////////////////////////////// / =---------------------------= / diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index 93d151a022f..a67fcd0f751 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -332,7 +332,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/head/head_organ = H.get_organ("head") - var/datum/sprite_accessory/tmp_hair_style = hair_styles_list["Very Long Hair"] + var/datum/sprite_accessory/tmp_hair_style = hair_styles_full_list["Very Long Hair"] var/datum/sprite_accessory/tmp_facial_hair_style = facial_hair_styles_list["Very Long Beard"] if(head_organ.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them. diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm index c42a946661d..c0c7754eb0a 100644 --- a/code/modules/surgery/organs/organ_icon.dm +++ b/code/modules/surgery/organs/organ_icon.dm @@ -148,7 +148,7 @@ var/global/list/limb_icon_cache = list() overlays |= facial_s if(h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR))) - var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + var/datum/sprite_accessory/hair_style = hair_styles_full_list[h_style] if(hair_style && ((species.name in hair_style.species_allowed) || (src.species.bodyflags & ALL_RPARTS))) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(species.name == "Slime People") // I am el worstos diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index b507d77eeb9..ec474c2ec77 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/inhands/fluff_lefthand.dmi b/icons/mob/inhands/fluff_lefthand.dmi index a98e287404b..0894c079317 100644 Binary files a/icons/mob/inhands/fluff_lefthand.dmi and b/icons/mob/inhands/fluff_lefthand.dmi differ diff --git a/icons/mob/inhands/fluff_righthand.dmi b/icons/mob/inhands/fluff_righthand.dmi index 25fa1186a69..b110617db86 100644 Binary files a/icons/mob/inhands/fluff_righthand.dmi and b/icons/mob/inhands/fluff_righthand.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index f48c88b807f..e4d993eec3e 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ