diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 4428f8ee34..de0a271ae6 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -219,3 +219,7 @@ #define SUIT_SENSOR_BINARY 1 #define SUIT_SENSOR_VITAL 2 #define SUIT_SENSOR_TRACKING 3 + +// Hair Defines +#define HAIR_VERY_SHORT 0x1 +#define HAIR_TIEABLE 0x4 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 41c240b98a..66f5d2c713 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -1,6 +1,38 @@ // These should all be procs, you can add them to humans/subspecies by // species.dm's inherent_verbs ~ Z +/mob/living/carbon/human/proc/tie_hair() + set name = "Tie Hair" + set desc = "Style your hair." + set category = "IC" + + if(incapacitated()) + to_chat(src, "You can't mess with your hair right now!") + return + + if(h_style) + var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style] + var/selected_string + if(!(hair_style.flags & HAIR_TIEABLE)) + to_chat(src, "Your hair isn't long enough to tie.") + return + else + var/list/datum/sprite_accessory/hair/valid_hairstyles = list() + for(var/hair_string in hair_styles_list) + var/list/datum/sprite_accessory/hair/test = hair_styles_list[hair_string] + if(test.flags & HAIR_TIEABLE) + valid_hairstyles.Add(hair_string) + selected_string = input("Select a new hairstyle", "Your hairstyle", hair_style) as null|anything in valid_hairstyles + if(incapacitated()) + to_chat(src, "You can't mess with your hair right now!") + return + else if(selected_string && h_style != selected_string) + h_style = selected_string + regenerate_icons() + visible_message("[src] pauses a moment to style their hair.") + else + to_chat(src, "You're already using that style.") + /mob/living/carbon/human/proc/tackle() set category = "Abilities" set name = "Tackle" diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index f941d65de8..a3acd5ed09 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -23,6 +23,9 @@ spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR + inherent_verbs = list( + /mob/living/carbon/human/proc/tie_hair) + /datum/species/human/get_bodytype(var/mob/living/carbon/human/H) return SPECIES_HUMAN diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 8a2f769018..5141eed979 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -47,60 +47,80 @@ icon = 'icons/mob/Human_face_m.dmi' // default icon for all hairs var/icon_add = 'icons/mob/human_face.dmi' + var/flags bald name = "Bald" icon_state = "bald" gender = MALE + flags = HAIR_VERY_SHORT species_allowed = list(SPECIES_HUMAN,SPECIES_UNATHI,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_VOX) short name = "Short Hair" // try to capatilize the names please~ icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you + flags = HAIR_VERY_SHORT short2 name = "Short Hair 2" icon_state = "hair_shorthair3" + flags = HAIR_VERY_SHORT short3 name = "Short Hair 3" icon_state = "hair_shorthair4" + flags = HAIR_VERY_SHORT twintail name = "Twintail" icon_state = "hair_twintail" + flags = HAIR_TIEABLE cut name = "Cut Hair" icon_state = "hair_c" + flags = HAIR_VERY_SHORT flair name = "Flaired Hair" icon_state = "hair_flair" + flags = HAIR_TIEABLE long name = "Shoulder-length Hair" icon_state = "hair_b" + flags = HAIR_TIEABLE - /*longish +/* + longish name = "Longer Hair" - icon_state = "hair_b2"*/ - + icon_state = "hair_b2" + flags = HAIR_TIEABLE +*/ longer name = "Long Hair" icon_state = "hair_vlong" + flags = HAIR_TIEABLE + + longeralt2 + name = "Long Hair Alt 2" + icon_state = "hair_longeralt2" + flags = HAIR_TIEABLE longest name = "Very Long Hair" icon_state = "hair_longest" + flags = HAIR_TIEABLE longfringe name = "Long Fringe" icon_state = "hair_longfringe" + flags = HAIR_TIEABLE longestalt name = "Longer Fringe" icon_state = "hair_vlongfringe" + flags = HAIR_TIEABLE halfbang name = "Half-banged Hair" @@ -113,57 +133,72 @@ ponytail1 name = "Ponytail 1" icon_state = "hair_ponytail" + flags = HAIR_TIEABLE ponytail2 name = "Ponytail 2" icon_state = "hair_pa" + flags = HAIR_TIEABLE ponytail3 name = "Ponytail 3" icon_state = "hair_ponytail3" + flags = HAIR_TIEABLE ponytail4 name = "Ponytail 4" icon_state = "hair_ponytail4" + flags = HAIR_TIEABLE ponytail5 name = "Ponytail 5" icon_state = "hair_ponytail5" + flags = HAIR_TIEABLE ponytail6 name = "Ponytail 6" icon_state = "hair_ponytail6" + flags = HAIR_TIEABLE fringetail name = "Fringetail" icon_state = "hair_fringetail" + flags = HAIR_TIEABLE sideponytail name = "Side Ponytail" icon_state = "hair_stail" + flags = HAIR_TIEABLE sideponytail4 //Not happy about this... but it's for the save files. name = "Side Ponytail 2" icon_state = "hair_ponytailf" + flags = HAIR_TIEABLE sideponytail2 name = "One Shoulder" icon_state = "hair_oneshoulder" + flags = HAIR_TIEABLE sideponytail3 name = "Tress Shoulder" icon_state = "hair_tressshoulder" + flags = HAIR_TIEABLE spikyponytail name = "Spiky Ponytail" icon_state = "hair_spikyponytail" + flags = HAIR_TIEABLE zieglertail name = "Zieglertail" icon_state = "hair_ziegler" + flags = HAIR_TIEABLE + wisp name = "Wisp" icon_state = "hair_wisp" + flags = HAIR_TIEABLE parted name = "Parted" @@ -176,6 +211,7 @@ sleeze name = "Sleeze" icon_state = "hair_sleeze" + flags = HAIR_VERY_SHORT quiff name = "Quiff" @@ -192,32 +228,39 @@ bedhead3 name = "Bedhead 3" icon_state = "hair_bedheadv3" + flags = HAIR_TIEABLE bedheadlong name = "Bedhead Long" icon_state = "hair_long_bedhead" + flags = HAIR_TIEABLE beehive name = "Beehive" icon_state = "hair_beehive" + flags = HAIR_TIEABLE beehive2 name = "Beehive 2" icon_state = "hair_beehive2" + flags = HAIR_TIEABLE bobcurl name = "Bobcurl" icon_state = "hair_bobcurl" species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI) + flags = HAIR_TIEABLE bob name = "Bob" icon_state = "hair_bobcut" species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI) + flags = HAIR_TIEABLE bobcutalt name = "Chin Length Bob" icon_state = "hair_bobcutalt" + flags = HAIR_TIEABLE bun name = "Bun" @@ -238,15 +281,18 @@ buzz name = "Buzzcut" icon_state = "hair_buzzcut" + flags = HAIR_VERY_SHORT species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI) shavehair name = "Shaved Hair" icon_state = "hair_shaved" + flags = HAIR_VERY_SHORT crew name = "Crewcut" icon_state = "hair_crewcut" + flags = HAIR_VERY_SHORT combover name = "Combover" @@ -271,6 +317,7 @@ curls name = "Curls" icon_state = "hair_curls" + flags = HAIR_TIEABLE afro name = "Afro" @@ -287,14 +334,17 @@ rows name = "Rows" icon_state = "hair_rows1" + flags = HAIR_VERY_SHORT rows2 name = "Rows 2" icon_state = "hair_rows2" + flags = HAIR_TIEABLE sargeant name = "Flat Top" icon_state = "hair_sargeant" + flags = HAIR_VERY_SHORT emo name = "Emo" @@ -307,10 +357,12 @@ longemo name = "Long Emo" icon_state = "hair_emolong" + flags = HAIR_TIEABLE fringeemo name = "Emo Fringe" icon_state = "hair_emofringe" + flags = HAIR_TIEABLE veryshortovereyealternate name = "Overeye Very Short, Alternate" @@ -327,6 +379,7 @@ longovereye name = "Overeye Long" icon_state = "hair_longovereye" + flags = HAIR_TIEABLE flowhair name = "Flow Hair" @@ -335,6 +388,7 @@ feather name = "Feather" icon_state = "hair_feather" + flags = HAIR_TIEABLE hitop name = "Hitop" @@ -356,6 +410,7 @@ gentle name = "Gentle" icon_state = "hair_gentle" + flags = HAIR_TIEABLE spiky name = "Spiky" @@ -369,51 +424,63 @@ kagami name = "Pigtails" icon_state = "hair_kagami" + flags = HAIR_TIEABLE himecut name = "Hime Cut" icon_state = "hair_himecut" + flags = HAIR_TIEABLE shorthime name = "Short Hime Cut" icon_state = "hair_shorthime" + flags = HAIR_TIEABLE grandebraid name = "Grande Braid" icon_state = "hair_grande" + flags = HAIR_TIEABLE mbraid name = "Medium Braid" icon_state = "hair_shortbraid" + flags = HAIR_TIEABLE braid2 name = "Long Braid" icon_state = "hair_hbraid" + flags = HAIR_TIEABLE braid name = "Floorlength Braid" icon_state = "hair_braid" + flags = HAIR_TIEABLE odango name = "Odango" icon_state = "hair_odango" + flags = HAIR_TIEABLE ombre name = "Ombre" icon_state = "hair_ombre" + flags = HAIR_TIEABLE updo name = "Updo" icon_state = "hair_updo" + flags = HAIR_TIEABLE skinhead name = "Skinhead" icon_state = "hair_skinhead" + flags = HAIR_VERY_SHORT balding name = "Balding Hair" icon_state = "hair_e" gender = MALE + flags = HAIR_VERY_SHORT familyman name = "The Family Man" @@ -434,10 +501,13 @@ poofy name = "Poofy" icon_state = "hair_poofy" + flags = HAIR_TIEABLE poofy2 name = "Poofy2" icon_state = "hair_poofy2" + flags = HAIR_TIEABLE + crono name = "Chrono" icon_state = "hair_toriyama" @@ -461,6 +531,7 @@ nitori name = "Nitori" icon_state = "hair_nitori" + flags = HAIR_TIEABLE joestar name = "Joestar" @@ -469,6 +540,7 @@ volaju name = "Volaju" icon_state = "hair_volaju" + flags = HAIR_TIEABLE eighties name = "80's" @@ -486,14 +558,6 @@ name = "Modern" icon_state = "hair_modern" - bald - name = "Bald" - icon_state = "bald" - - longeralt2 - name = "Long Hair Alt 2" - icon_state = "hair_longeralt2" - shortbangs name = "Short Bangs" icon_state = "hair_shortbangs" @@ -505,10 +569,12 @@ bun name = "Casual Bun" icon_state = "hair_bun" + flags = HAIR_TIEABLE doublebun name = "Double-Bun" icon_state = "hair_doublebun" + flags = HAIR_TIEABLE oxton name = "Oxton" @@ -518,93 +584,113 @@ name = "Low Fade" icon_state = "hair_lowfade" gender = MALE + flags = HAIR_VERY_SHORT medfade name = "Medium Fade" icon_state = "hair_medfade" + flags = HAIR_VERY_SHORT highfade name = "High Fade" icon_state = "hair_highfade" gender = MALE + flags = HAIR_VERY_SHORT baldfade name = "Balding Fade" icon_state = "hair_baldfade" gender = MALE + flags = HAIR_VERY_SHORT nofade name = "Regulation Cut" icon_state = "hair_nofade" gender = MALE + flags = HAIR_VERY_SHORT trimflat name = "Trimmed Flat Top" icon_state = "hair_trimflat" gender = MALE + flags = HAIR_VERY_SHORT trimmed name = "Trimmed" icon_state = "hair_trimmed" gender = MALE + flags = HAIR_VERY_SHORT tightbun name = "Tight Bun" icon_state = "hair_tightbun" gender = FEMALE + flags = HAIR_VERY_SHORT | HAIR_TIEABLE coffeehouse name = "Coffee House Cut" icon_state = "hair_coffeehouse" gender = MALE + flags = HAIR_VERY_SHORT undercut1 name = "Undercut" icon_state = "hair_undercut1" gender = MALE + flags = HAIR_VERY_SHORT undercut2 name = "Undercut Swept Right" icon_state = "hair_undercut2" gender = MALE + flags = HAIR_VERY_SHORT undercut3 name = "Undercut Swept Left" icon_state = "hair_undercut3" gender = MALE + flags = HAIR_VERY_SHORT partfade name = "Parted Fade" icon_state = "hair_shavedpart" gender = MALE + flags = HAIR_VERY_SHORT hightight name = "High and Tight" icon_state = "hair_hightight" + flags = HAIR_VERY_SHORT rowbun name = "Row Bun" icon_state = "hair_rowbun" + flags = HAIR_TIEABLE rowdualbraid name = "Row Dual Braid" icon_state = "hair_rowdualtail" + flags = HAIR_TIEABLE rowbraid name = "Row Braid" icon_state = "hair_rowbraid" + flags = HAIR_TIEABLE regulationmohawk name = "Regulation Mohawk" icon_state = "hair_shavedmohawk" + flags = HAIR_VERY_SHORT topknot name = "Topknot" icon_state = "hair_topknot" + flags = HAIR_TIEABLE ronin name = "Ronin" icon_state = "hair_ronin" + flags = HAIR_TIEABLE bowlcut2 name = "Bowl2" @@ -613,18 +699,22 @@ thinning name = "Thinning" icon_state = "hair_thinning" + flags = HAIR_VERY_SHORT thinningfront name = "Thinning Front" icon_state = "hair_thinningfront" + flags = HAIR_VERY_SHORT thinningback name = "Thinning Back" icon_state = "hair_thinningrear" + flags = HAIR_VERY_SHORT manbun name = "Manbun" icon_state = "hair_manbun" + flags = HAIR_TIEABLE shy name = "Shy" diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index b664600bfd..480fdd75d1 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -51,10 +51,10 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/head/get_icon() ..() - + //The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item cut_overlays() - + //Every 'addon' below requires information from species if(!owner || !owner.species) return @@ -78,7 +78,7 @@ var/global/list/limb_icon_cache = list() eyes_icon.Blend(rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes), ICON_ADD) add_overlay(eyes_icon) mob_icon.Blend(eyes_icon, ICON_OVERLAY) - + //Lip color/icon if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") @@ -94,27 +94,42 @@ var/global/list/limb_icon_cache = list() mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons icon_cache_key += "[M][markings[M]["color"]]" + overlays |= get_hair_icon() + + return mob_icon + +/obj/item/organ/external/head/proc/get_hair_icon() + var/image/res = image('icons/mob/human_face.dmi',"bald_s") //Facial hair if(owner.f_style) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(facial_hair_style.do_colouration) +<<<<<<< HEAD facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_MULTIPLY) // VOREStation edit add_overlay(facial_s) +======= + facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) + res.overlays |= facial_s +>>>>>>> e8020de... Merge pull request #5335 from Anewbe/hair_stealing //Head hair if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))) - var/datum/sprite_accessory/hair/hair_style = hair_styles_list[owner.h_style] + var/style = owner.h_style + var/datum/sprite_accessory/hair/hair_style = hair_styles_list[style] + if(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR)) + if(!(hair_style.flags & HAIR_VERY_SHORT)) + hair_style = hair_styles_list["Short Hair"] if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed)) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s") if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY) hair_s.Blend(hair_s_add, ICON_ADD) - add_overlay(hair_s) + res.overlays |= hair_s - return mob_icon + return res /obj/item/organ/external/proc/get_icon(var/skeletal)