diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index f1858339c50..a65a57a345c 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -173,12 +173,6 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
hair_s.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD)
eyes_s.Blend(hair_s, ICON_OVERLAY)
- var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style]
- if(facial_hair_style)
- var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
- facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD)
- eyes_s.Blend(facial_s, ICON_OVERLAY)
-
//Horns
if(H.species.bodyflags & HAS_HORNS)
var/datum/sprite_accessory/horns = horn_styles_list[H.horns]
@@ -187,7 +181,13 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
horns_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD)
eyes_s.Blend(horns_s, ICON_OVERLAY)
- //Horns
+ var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style]
+ if(facial_hair_style)
+ var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
+ facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD)
+ eyes_s.Blend(facial_s, ICON_OVERLAY)
+
+ //Markings
if(H.species.bodyflags & HAS_MARKINGS)
var/datum/sprite_accessory/marking_style = marking_styles_list[H.m_style]
if(marking_style)
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 06973f6f4e6..f909a241805 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -168,6 +168,7 @@
H.force_update_limbs()
H.update_eyes()
H.update_hair()
+ H.update_fhair()
return 1
else
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index 974879a0553..4ca71490dc0 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -70,6 +70,7 @@
H.update_inv_wear_suit()
H.update_inv_head()
H.update_hair()
+ H.update_fhair()
if(blood_on_castoff)
var/turf/simulated/T = get_turf(H)
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 17e60881cc5..0a95335a99a 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -334,6 +334,7 @@ var/global/list/multiverse = list()
domutcheck(M, null)
M.update_body()
M.update_hair()
+ M.update_fhair()
equip_copy(M)
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index 08cc4086a9a..409679d4ac3 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -105,7 +105,7 @@
user.visible_message("[user] shaves his facial hair clean with the [src].", \
"You finish shaving with the [src]. Fast and clean!")
H.f_style = "Shaved"
- H.update_hair()
+ H.update_fhair()
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
else
var/turf/user_loc = user.loc
@@ -117,7 +117,7 @@
user.visible_message("[user] shaves off [H]'s facial hair with \the [src].", \
"You shave [H]'s facial hair clean off.")
H.f_style = "Shaved"
- H.update_hair()
+ H.update_fhair()
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
if(user.zone_sel.selecting == "head")
if(!get_location_accessible(H, "head"))
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index bc0226f4597..26612b66ed1 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -54,7 +54,7 @@
f_style = facial_hair_style
- update_hair()
+ update_fhair()
return 1
/mob/living/carbon/human/proc/reset_hair()
@@ -74,6 +74,7 @@
f_style = "Shaved"
update_hair()
+ update_fhair()
/mob/living/carbon/human/proc/change_eye_color(var/red, var/green, var/blue)
if(red == r_eyes && green == g_eyes && blue == b_eyes)
@@ -106,7 +107,7 @@
g_facial = green
b_facial = blue
- update_hair()
+ update_fhair()
return 1
/mob/living/carbon/human/proc/change_skin_color(var/red, var/green, var/blue)
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index bac4225bd9c..2c7b2cb8bd3 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -150,6 +150,7 @@
f_style = "Shaved"
if(h_style)
h_style = "Bald"
+ update_fhair(0)
update_hair(0)
mutations.Add(SKELETON)
@@ -166,6 +167,7 @@
f_style = "Shaved" //we only change the icon_state of the hair datum, so it doesn't mess up their UI/UE
if(h_style)
h_style = "Bald"
+ update_fhair(0)
update_hair(0)
mutations.Add(HUSK)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index e728fb2db9d..4b7fa40588e 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -143,6 +143,7 @@
head = null
if(I.flags & BLOCKHAIR || I.flags & BLOCKHEADHAIR)
update_hair() //rebuild hair
+ update_fhair()
update_inv_head()
else if(I == r_ear)
r_ear = null
@@ -160,6 +161,7 @@
wear_mask = null
if(I.flags & BLOCKHAIR || I.flags & BLOCKHEADHAIR)
update_hair() //rebuild hair
+ update_fhair()
if(internal)
if(internals)
internals.icon_state = "internal0"
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index e40c148082f..3f01c0937da 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -122,16 +122,17 @@ Please contact me on #coderbus IRC. ~Carn x
#define BACK_LAYER 15
#define HAIR_LAYER 16 //TODO: make part of head layer?
#define HORN_LAYER 17
-#define FACEMASK_LAYER 18
-#define HEAD_LAYER 19
-#define COLLAR_LAYER 20
-#define HANDCUFF_LAYER 21
-#define LEGCUFF_LAYER 22
-#define L_HAND_LAYER 23
-#define R_HAND_LAYER 24
-#define TARGETED_LAYER 25 //BS12: Layer for the target overlay from weapon targeting system
-#define FIRE_LAYER 26 //If you're on fire
-#define TOTAL_LAYERS 26
+#define FHAIR_LAYER 18
+#define FACEMASK_LAYER 19
+#define HEAD_LAYER 20
+#define COLLAR_LAYER 21
+#define HANDCUFF_LAYER 22
+#define LEGCUFF_LAYER 23
+#define L_HAND_LAYER 24
+#define R_HAND_LAYER 25
+#define TARGETED_LAYER 26 //BS12: Layer for the target overlay from weapon targeting system
+#define FIRE_LAYER 27 //If you're on fire
+#define TOTAL_LAYERS 27
@@ -356,11 +357,13 @@ var/global/list/damage_icon_parts = list()
update_horns(0)
//markings
update_markings(0)
+ //hair
+ update_hair(0)
+ update_fhair(0)
//MARKINGS OVERLAY
/mob/living/carbon/human/proc/update_markings(var/update_icons=1)
- world << "\red PROC CALLED"
//Reset our markings
overlays_standing[MARKINGS_LAYER] = null
@@ -436,6 +439,41 @@ var/global/list/damage_icon_parts = list()
if(update_icons) update_icons()
return
+ //base icons
+ var/icon/hair_standing = new /icon('icons/mob/human_face.dmi',"bald_s")
+
+ if(h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic())))
+ var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
+ if(hair_style && hair_style.species_allowed)
+ if(src.species.name in hair_style.species_allowed)
+ var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
+ if(hair_style.do_colouration)
+ hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
+
+ hair_standing.Blend(hair_s, ICON_OVERLAY)
+ else
+ //warning("Invalid h_style for [species.name]: [h_style]")
+
+ overlays_standing[HAIR_LAYER] = image(hair_standing)
+
+ if(update_icons) update_icons()
+
+
+//FACIAL HAIR OVERLAY
+/mob/living/carbon/human/proc/update_fhair(var/update_icons=1)
+ //Reset our facial hair
+ overlays_standing[FHAIR_LAYER] = null
+
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
+ if(update_icons) update_icons()
+ return
+
+ //masks and helmets can obscure our facial hair, unless we're a synthetic
+ if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if(update_icons) update_icons()
+ return
+
//base icons
var/icon/face_standing = new /icon('icons/mob/human_face.dmi',"bald_s")
@@ -450,19 +488,7 @@ var/global/list/damage_icon_parts = list()
else
//warning("Invalid f_style for [species.name]: [f_style]")
- if(h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic())))
- var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
- if(hair_style && hair_style.species_allowed)
- if(src.species.name in hair_style.species_allowed)
- var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
- if(hair_style.do_colouration)
- hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
-
- face_standing.Blend(hair_s, ICON_OVERLAY)
- else
- //warning("Invalid h_style for [species.name]: [h_style]")
-
- overlays_standing[HAIR_LAYER] = image(face_standing)
+ overlays_standing[FHAIR_LAYER] = image(face_standing)
if(update_icons) update_icons()
@@ -526,6 +552,7 @@ var/global/list/damage_icon_parts = list()
skeleton = null
update_hair(0)
+ update_fhair(0)
if(update_icons) update_icons()
//Call when target overlay should be added/removed
@@ -554,6 +581,8 @@ var/global/list/damage_icon_parts = list()
update_mutations(0)
update_body(0)
update_hair(0)
+ update_horns(0)
+ update_fhair(0)
update_mutantrace(0)
update_inv_w_uniform(0,0)
update_inv_wear_id(0)
@@ -1103,6 +1132,7 @@ var/global/list/damage_icon_parts = list()
#undef HAIR_LAYER
#undef HEAD_LAYER
#undef HORN_LAYER
+#undef FHAIR_LAYER
#undef COLLAR_LAYER
#undef HANDCUFF_LAYER
#undef LEGCUFF_LAYER
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index e577a2e2709..ce81f116920 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -112,7 +112,7 @@
if(self_message && M==src)
msg = self_message
M.show_message(msg, 2, deaf_message, 1)
-
+
// based on say code
var/omsg = replacetext(message, "[src] ", "")
var/list/listening_obj = new
@@ -177,6 +177,7 @@
if(ishuman(src) && W == src:head)
src:update_hair()
+ src:update_fhair()
/mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1)
if(equip_to_slot_if_possible(W, slot_l_hand, del_on_fail, disable_warning, redraw_mob))
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 4ee2449150a..b8cc06da85b 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -267,12 +267,6 @@ datum/preferences
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
eyes_s.Blend(hair_s, ICON_OVERLAY)
- var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
- if(facial_hair_style)
- var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
- facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
- eyes_s.Blend(facial_s, ICON_OVERLAY)
-
//Horns
if(current_species && (current_species.bodyflags & HAS_HORNS))
var/datum/sprite_accessory/horn_style = horn_styles_list[horns]
@@ -281,6 +275,12 @@ datum/preferences
horns_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
eyes_s.Blend(horns_s, ICON_OVERLAY)
+ var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
+ if(facial_hair_style)
+ var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
+ facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
+ eyes_s.Blend(facial_s, ICON_OVERLAY)
+
var/icon/underwear_s = null
if(underwear && (current_species.clothing_flags & HAS_UNDERWEAR))
var/datum/sprite_accessory/underwear/U = underwear_list[underwear]
@@ -821,8 +821,6 @@ datum/preferences
else if(backbag == 3 || backbag == 4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
- if(!(current_species.bodyflags & NO_EYES))
- preview_icon.Blend(eyes_s, ICON_OVERLAY)
if(underwear_s)
preview_icon.Blend(underwear_s, ICON_OVERLAY)
if(undershirt_s)
@@ -831,6 +829,8 @@ datum/preferences
preview_icon.Blend(socks_s, ICON_OVERLAY)
if(clothes_s)
preview_icon.Blend(clothes_s, ICON_OVERLAY)
+ if(!(current_species.bodyflags & NO_EYES))
+ preview_icon.Blend(eyes_s, ICON_OVERLAY)
preview_icon_front = new(preview_icon, dir = SOUTH)
preview_icon_side = new(preview_icon, dir = WEST)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 5184fd694c4..b498e433760 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -981,44 +981,44 @@
//Unathi
una_spines_long
- name = "Long Unathi Spines"
+ name = "Long Spines"
icon_state = "soghun_longspines"
species_allowed = list("Unathi")
gender = NEUTER
una_spines_short
- name = "Short Unathi Spines"
+ name = "Short Spines"
icon_state = "soghun_shortspines"
species_allowed = list("Unathi")
gender = NEUTER
una_frills_long
- name = "Long Unathi Frills"
+ name = "Long Frills"
icon_state = "soghun_longfrills"
species_allowed = list("Unathi")
gender = NEUTER
una_frills_short
- name = "Short Unathi Frills"
+ name = "Short Frills"
icon_state = "soghun_shortfrills"
species_allowed = list("Unathi")
gender = NEUTER
- una_simple
- name = "Simple"
- icon_state = "soghun_longwebbed_frills"
+ una_frills_webbed_long
+ name = "Long Webbed Frills"
+ icon_state = "soghun_longfrills_webbed"
species_allowed = list("Unathi")
gender = NEUTER
- una_short
- name = "Short"
- icon_state = "soghun_shortwebbed_frills"
+ una_frills_webbed_short
+ name = "Short Webbed Frills"
+ icon_state = "soghun_shortfrills_webbed"
species_allowed = list("Unathi")
gender = NEUTER
- una_aquatic
- name = "Aquatic"
- icon_state = "soghun_aquafrills"
+ una_frills_webbed_aquatic
+ name = "Aquatic Frills"
+ icon_state = "soghun_aquaticfrills_webbed"
species_allowed = list("Unathi")
gender = NEUTER
@@ -1588,26 +1588,14 @@
name = "None"
icon_state = "accessory_none"
-/datum/sprite_accessory/body_markings/dstripe
- name = "Dark Stripe"
- icon_state = "markings_dstripe"
+/datum/sprite_accessory/body_markings/stripe
+ name = "Stripe"
+ icon_state = "markings_stripe"
-/datum/sprite_accessory/body_markings/lstripe
- name = "Light Stripe"
- icon_state = "markings_lstripe"
+/datum/sprite_accessory/body_markings/tiger
+ name = "Tiger Body"
+ icon_state = "markings_tiger"
-/datum/sprite_accessory/body_markings/dtiger
- name = "Dark Tiger Body"
- icon_state = "markings_dtiger"
-
-/datum/sprite_accessory/body_markings/dtigerhead
- name = "Dark Tiger Body + Head"
- icon_state = "markings_dtigerhead"
-
-/datum/sprite_accessory/body_markings/ltiger
- name = "Light Tiger Body"
- icon_state = "markings_ltiger"
-
-/datum/sprite_accessory/body_markings/ltigerhead
- name = "Light Tiger Body + Head"
- icon_state = "markings_ltigerhead"
+/datum/sprite_accessory/body_markings/tigerhead
+ name = "Tiger Body + Head"
+ icon_state = "markings_tigerhead"
diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm
index 6663f833bef..893c415d1f8 100644
--- a/code/modules/organs/subtypes/standard.dm
+++ b/code/modules/organs/subtypes/standard.dm
@@ -145,6 +145,7 @@
owner.unEquip(owner.wear_mask)
spawn(1)
owner.update_hair()
+ owner.update_fhair()
..()
/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm
index fa33c4fbf8e..30fde95fc3c 100644
--- a/code/modules/reagents/newchem/other.dm
+++ b/code/modules/reagents/newchem/other.dm
@@ -204,6 +204,7 @@ datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume)
H.g_hair = rand(0,255)
H.b_hair = rand(0,255)
H.update_hair()
+ H.update_fhair()
..()
return
@@ -229,6 +230,7 @@ datum/reagent/hairgrownium/reaction_mob(var/mob/living/M, var/volume)
H.h_style = random_hair_style(H.gender, H.species)
H.f_style = random_facial_hair_style(H.gender, H.species)
H.update_hair()
+ H.update_fhair()
..()
return
@@ -256,6 +258,7 @@ datum/reagent/super_hairgrownium/on_mob_life(var/mob/living/M as mob)
H.h_style = "Very Long Hair"
H.f_style = "Very Long Beard"
H.update_hair()
+ H.update_fhair()
if(!H.wear_mask || H.wear_mask && !istype(H.wear_mask, /obj/item/clothing/mask/fakemoustache))
if(H.wear_mask)
H.unEquip(H.wear_mask)
diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm
index 6a9fcd3ffad..eca8911f6ad 100644
--- a/code/modules/virus2/effect.dm
+++ b/code/modules/virus2/effect.dm
@@ -593,7 +593,7 @@
if(H.species.name == "Human" && !(H.f_style == "Elvis Sideburns"))
spawn(50)
H.f_style = "Elvis Sideburns"
- H.update_hair()
+ H.update_fhair()
/obj/item/clothing/glasses/virussunglasses
@@ -805,7 +805,7 @@ var/list/compatible_mobs = list(/mob/living/carbon/human)
H << "Your chin and neck itch!."
spawn(50)
H.f_style = "Full Beard"
- H.update_hair()
+ H.update_fhair()
/datum/disease2/effect/bloodynose
name = "Intranasal Hemorrhage"
diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi
index a4fc178e04b..e0f708c69f9 100644
Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index e6e77045dd1..2501df9741f 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ