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)