diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index 157fa1c30b9..f64022136ef 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -81,3 +81,4 @@
#define NO_INTORGANS "no_internal_organs"
#define CAN_WINGDINGS "can_wingdings"
#define NO_CLONESCAN "no_clone_scan"
+#define NO_HAIR "no_hair"
diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm
index 087231017b4..a1f244c5566 100644
--- a/code/datums/diseases/advance/symptoms/shedding.dm
+++ b/code/datums/diseases/advance/symptoms/shedding.dm
@@ -31,6 +31,8 @@ BONUS
to_chat(M, "[pick("Your scalp itches.", "Your skin feels flakey.")]")
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
+ if(NO_HAIR in H.dna.species.species_traits)
+ return // Hair can't fall out if you don't have any
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
switch(A.stage)
if(3, 4)
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 7c8bd56e822..14603c1681a 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -103,7 +103,7 @@
icon = H.icon
speak_emote = list("groans")
icon_state = "zombie2_s"
- if(head_organ)
+ if(head_organ && !(NO_HAIR in H.dna.species.species_traits))
head_organ.h_style = null
H.update_hair()
human_overlays = H.overlays
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 5b1e11d1437..4e3727aaf25 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -354,11 +354,12 @@ emp_act
if(prob(min(acidpwr * acid_volume / 10, 90))) //Applies disfigurement
head_organ.receive_damage(acidity, 2 * acidity)
emote("scream")
- head_organ.h_style = "Bald"
- head_organ.f_style = "Shaved"
- update_hair()
- update_fhair()
head_organ.disfigure()
+ if(!(NO_HAIR in dna.species.species_traits))
+ head_organ.h_style = "Bald"
+ head_organ.f_style = "Shaved"
+ update_hair()
+ update_fhair()
UpdateDamageIcon()
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index 9d642c155f8..215f43b2491 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -807,7 +807,7 @@
if(radiation > RAD_MOB_HAIRLOSS)
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
- if(!head_organ)
+ if(!head_organ || (NO_HAIR in species_traits))
return
if(prob(15) && head_organ.h_style != "Bald")
to_chat(H, "Your hair starts to fall out in clumps...")
diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm
index 058abc8d0cf..646dbe8ac58 100644
--- a/code/modules/mob/living/carbon/human/species/abductor.dm
+++ b/code/modules/mob/living/carbon/human/species/abductor.dm
@@ -13,7 +13,7 @@
"eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight.
)
- species_traits = list(NO_BLOOD)
+ species_traits = list(NO_BLOOD, NO_HAIR)
inherent_traits = list(TRAIT_VIRUSIMMUNE, TRAIT_CHUNKYFINGERS, TRAIT_NOHUNGER, TRAIT_NOBREATH, TRAIT_NOEXAMINE)
dies_at_threshold = TRUE
diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm
index ffb7510dd40..3813dedbdd7 100644
--- a/code/modules/mob/living/carbon/human/species/diona.dm
+++ b/code/modules/mob/living/carbon/human/species/diona.dm
@@ -20,6 +20,7 @@
even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
water and other radiation."
+ species_traits = list(NO_HAIR)
inherent_traits = list(TRAIT_NOGERMS, TRAIT_NODECAY)
inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT
clothing_flags = HAS_SOCKS
diff --git a/code/modules/mob/living/carbon/human/species/drask.dm b/code/modules/mob/living/carbon/human/species/drask.dm
index 5eb62de833f..05767c244f1 100644
--- a/code/modules/mob/living/carbon/human/species/drask.dm
+++ b/code/modules/mob/living/carbon/human/species/drask.dm
@@ -31,7 +31,7 @@
"is sucking in warm air!",
"is holding their breath!")
- species_traits = list(LIPS, IS_WHITELISTED)
+ species_traits = list(LIPS, IS_WHITELISTED, NO_HAIR)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
has_gender = FALSE
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index e940136702d..3880d578b58 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -4,7 +4,7 @@
icobase = 'icons/mob/human_races/r_golem.dmi'
- species_traits = list(NO_BLOOD)
+ species_traits = list(NO_BLOOD, NO_HAIR)
inherent_traits = list(TRAIT_RESISTHEAT, TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_NOFIRE, TRAIT_CHUNKYFINGERS, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOPAIN)
inherent_biotypes = MOB_HUMANOID | MOB_MINERAL
dies_at_threshold = TRUE
diff --git a/code/modules/mob/living/carbon/human/species/grey.dm b/code/modules/mob/living/carbon/human/species/grey.dm
index 008fa9b39ac..26b56be2315 100644
--- a/code/modules/mob/living/carbon/human/species/grey.dm
+++ b/code/modules/mob/living/carbon/human/species/grey.dm
@@ -18,7 +18,7 @@
brute_mod = 1.25 //greys are fragile
- species_traits = list(LIPS, IS_WHITELISTED, CAN_WINGDINGS)
+ species_traits = list(LIPS, IS_WHITELISTED, CAN_WINGDINGS, NO_HAIR)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_BODY_MARKINGS
dietflags = DIET_HERB
diff --git a/code/modules/mob/living/carbon/human/species/kidan.dm b/code/modules/mob/living/carbon/human/species/kidan.dm
index da887e261b6..df364f6122b 100644
--- a/code/modules/mob/living/carbon/human/species/kidan.dm
+++ b/code/modules/mob/living/carbon/human/species/kidan.dm
@@ -9,7 +9,7 @@
hunger_drain = 0.15
tox_mod = 1.7
- species_traits = list(IS_WHITELISTED)
+ species_traits = list(IS_WHITELISTED, NO_HAIR)
inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_BUG
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 69f28131aa0..926ed17348e 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -5,7 +5,7 @@
dangerous_existence = TRUE //So so much
//language = "Clatter"
- species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
+ species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING, NO_HAIR)
inherent_traits = list(TRAIT_RADIMMUNE, TRAIT_NOHUNGER)
inherent_biotypes = MOB_HUMANOID | MOB_MINERAL
forced_heartattack = TRUE // Plasmamen have no blood, but they should still get heart-attacks
diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm
index a0f929f3f48..92207de211e 100644
--- a/code/modules/mob/living/carbon/human/species/skeleton.dm
+++ b/code/modules/mob/living/carbon/human/species/skeleton.dm
@@ -9,7 +9,7 @@
blood_color = "#FFFFFF"
flesh_color = "#E6E6C6"
- species_traits = list(NO_BLOOD)
+ species_traits = list(NO_BLOOD, NO_HAIR)
inherent_traits = list(TRAIT_RESISTHEAT, TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOHUNGER, TRAIT_XENO_IMMUNE)
inherent_biotypes = MOB_UNDEAD | MOB_HUMANOID
tox_mod = 0
diff --git a/code/modules/mob/living/carbon/human/species/skrell.dm b/code/modules/mob/living/carbon/human/species/skrell.dm
index 99fa6344253..1beed1d8773 100644
--- a/code/modules/mob/living/carbon/human/species/skrell.dm
+++ b/code/modules/mob/living/carbon/human/species/skrell.dm
@@ -12,7 +12,7 @@
the secrets of their empire to their allies."
- species_traits = list(LIPS)
+ species_traits = list(LIPS, NO_HAIR)
inherent_traits = list(TRAIT_NOFAT, TRAIT_WATERBREATH)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS
diff --git a/code/modules/mob/living/carbon/human/species/wryn.dm b/code/modules/mob/living/carbon/human/species/wryn.dm
index 78b707aed31..a88b0efaf8b 100644
--- a/code/modules/mob/living/carbon/human/species/wryn.dm
+++ b/code/modules/mob/living/carbon/human/species/wryn.dm
@@ -34,7 +34,7 @@
"antennae" = /obj/item/organ/internal/wryn/hivenode
)
- species_traits = list(LIPS, IS_WHITELISTED, NO_CLONESCAN, HIVEMIND)
+ species_traits = list(LIPS, IS_WHITELISTED, NO_CLONESCAN, NO_HAIR, HIVEMIND)
inherent_traits = list(TRAIT_NOBREATH)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index c093c8e3d36..8cd010d96e7 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -76,9 +76,9 @@
attacktext = "bites"
attack_sound = 'sound/creatures/zombie_attack.ogg'
icon_state = "zombie2_s"
- if(head_organ)
+ if(head_organ && !(NO_HAIR in H.dna.species.species_traits))
head_organ.h_style = null
- H.update_hair()
+ H.update_hair()
host_species = H.dna.species.name
human_overlays = H.overlays
update_icons()