From c80ab41cc2c60972ee067f215c60ab1600c98af7 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Fri, 26 Jul 2024 15:01:58 -0600
Subject: [PATCH 01/17] oh boy here we go
---
code/__DEFINES/DNA.dm | 43 +++--
code/__DEFINES/sprite_accessories.dm | 9 +
code/__DEFINES/surgery.dm | 18 ++
code/_globalvars/bitfields.dm | 10 ++
code/datums/mutations/body.dm | 10 +-
code/game/objects/items/cosmetics.dm | 254 ++++++++++++++-------------
6 files changed, 198 insertions(+), 146 deletions(-)
create mode 100644 code/__DEFINES/sprite_accessories.dm
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index 7ce5594516ee..b78fa6389621 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -66,39 +66,36 @@
#define CLONER_FRESH_CLONE "fresh"
#define CLONER_MATURE_CLONE "mature"
+
+
//species traits for mutantraces
#define MUTCOLORS 1
-#define HAIR 2
-#define FACEHAIR 3
-#define EYECOLOR 4
-#define LIPS 5
-#define NOTRANSSTING 7
-#define NOZOMBIE 8
-#define NO_UNDERWEAR 9
-#define NO_DNA_COPY 10
-#define DRINKSBLOOD 11
-#define SKINTONES 12
-#define ANIME 13
-#define MUTCOLORS_SECONDARY 14
-#define SPECIES_FUR 15
+#define NOTRANSSTING 2
+#define NOZOMBIE 3
+#define NO_UNDERWEAR 4
+#define NO_DNA_COPY 5
+#define DRINKSBLOOD 6
+#define ANIME 7
+#define MUTCOLORS_SECONDARY 8
+#define SPECIES_FUR 9
/// Use this if you want to change the race's color without the player being able to pick their own color. AKA special color shifting
-#define DYNCOLORS 16
-#define AGENDER 17
+#define DYNCOLORS 7
+#define AGENDER 8
/// Do not draw eyes or eyeless overlay
-#define NOEYESPRITES 18
+#define NOEYESPRITES 9
///If we have a limb-specific overlay sprite
-#define HAS_MARKINGS 19
+#define HAS_MARKINGS 10
/// Do not draw blood overlay
-#define NOBLOODOVERLAY 20
+#define NOBLOODOVERLAY 11
///No augments, for monkeys in specific because they will turn into fucking freakazoids https://cdn.discordapp.com/attachments/326831214667235328/791313258912153640/102707682-fa7cad80-4294-11eb-8f13-8c689468aeb0.png
-#define NOAUGMENTS 21
+#define NOAUGMENTS 12
///will be assigned a universal vampire themed last name shared by their department. this is preferenced!
-#define BLOOD_CLANS 22
+#define BLOOD_CLANS 13
-#define REVIVESBYHEALING 23
-#define NOHUSK 24
-#define NOMOUTH 25
+#define REVIVESBYHEALING 14
+#define NOHUSK 15
+#define NOMOUTH 16
//organ slots
#define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator"
diff --git a/code/__DEFINES/sprite_accessories.dm b/code/__DEFINES/sprite_accessories.dm
new file mode 100644
index 000000000000..9c9471130e6f
--- /dev/null
+++ b/code/__DEFINES/sprite_accessories.dm
@@ -0,0 +1,9 @@
+// ~color source defines for sprite accessories
+/// Color of the sprite accessory will match the owner's mutant color, which is granted by certain species
+#define MUTANT_COLOR "mutant_color"
+/// Color of the sprite accessory will match the owner's hair color
+#define HAIR_COLOR "hair_color"
+/// Color of the sprite accessory will match the owner's facial hair color
+#define FACIAL_HAIR_COLOR "facial_hair_color"
+/// Color of the sprite accessory will match the owner's (left) eye color
+#define EYE_COLOR "eye_color"
diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm
index de9fc14fab59..2c037f3728b2 100644
--- a/code/__DEFINES/surgery.dm
+++ b/code/__DEFINES/surgery.dm
@@ -30,6 +30,24 @@
///Bodypart does not get replaced during set_species()
#define BP_BLOCK_CHANGE_SPECIES (1<<0)
+// Flags for the head_flags var on /obj/item/bodypart/head
+/// Head can have hair
+#define HEAD_HAIR (1<<0)
+/// Head can have facial hair
+#define HEAD_FACIAL_HAIR (1<<1)
+/// Head can have lips
+#define HEAD_LIPS (1<<2)
+/// Head can have eye sprites
+#define HEAD_EYESPRITES (1<<3)
+/// Head will have colored eye sprites
+#define HEAD_EYECOLOR (1<<4)
+/// Head can have eyeholes when missing eyes
+#define HEAD_EYEHOLES (1<<5)
+/// Head can have debrain overlay
+#define HEAD_DEBRAIN (1<<6)
+/// All head flags, default for most heads
+#define HEAD_ALL_FEATURES (HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYECOLOR|HEAD_EYEHOLES|HEAD_DEBRAIN)
+
/// When the surgery step fails :(
#define SURGERY_STEP_FAIL -1
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index c59f199af410..e0431a7e2d63 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -398,6 +398,16 @@ DEFINE_BITFIELD(change_exempt_flags, list(
"BP_BLOCK_CHANGE_SPECIES" = BP_BLOCK_CHANGE_SPECIES,
))
+DEFINE_BITFIELD(head_flags, list(
+ "HEAD_HAIR" = HEAD_HAIR,
+ "HEAD_FACIAL_HAIR" = HEAD_FACIAL_HAIR,
+ "HEAD_LIPS" = HEAD_LIPS,
+ "HEAD_EYESPRITES" = HEAD_EYESPRITES,
+ "HEAD_EYECOLOR" = HEAD_EYECOLOR,
+ "HEAD_EYEHOLES" = HEAD_EYEHOLES,
+ "HEAD_DEBRAIN" = HEAD_DEBRAIN,
+))
+
DEFINE_BITFIELD(supports_variations_flags, list(
"CLOTHING_NO_VARIATION" = CLOTHING_NO_VARIATION,
"CLOTHING_DIGITIGRADE_VARIATION" = CLOTHING_DIGITIGRADE_VARIATION,
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index fd54e5c01f7b..1b2c137c6b29 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -502,6 +502,7 @@
. = ..()
if(.)//cant add
return TRUE
+
var/obj/item/organ/internal/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN)
if(brain)
brain.zone = BODY_ZONE_CHEST
@@ -510,11 +511,10 @@
if(head)
owner.visible_message(span_warning("[owner]'s head splatters with a sickening crunch!"), ignored_mobs = list(owner))
new /obj/effect/gibspawner/generic(get_turf(owner), owner)
- head.dismember(BRUTE)
+ head.dismember(dam_type = BRUTE, silent = TRUE)
head.drop_organs()
qdel(head)
- owner.regenerate_icons()
- RegisterSignal(owner, COMSIG_ATTEMPT_CARBON_ATTACH_LIMB, PROC_REF(abortattachment))
+ RegisterSignal(owner, COMSIG_ATTEMPT_CARBON_ATTACH_LIMB, PROC_REF(abort_attachment))
/datum/mutation/human/headless/on_losing()
. = ..()
@@ -522,7 +522,7 @@
return TRUE
var/obj/item/organ/internal/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN)
if(brain) //so this doesn't instantly kill you. we could delete the brain, but it lets people cure brain issues they /really/ shouldn't be
- brain.zone = BODY_ZONE_HEAD
+ brain.zone = initial(brain.zone)
UnregisterSignal(owner, COMSIG_ATTEMPT_CARBON_ATTACH_LIMB)
var/successful = owner.regenerate_limb(BODY_ZONE_HEAD)
if(!successful)
@@ -534,7 +534,7 @@
new /obj/effect/gibspawner/generic(get_turf(owner), owner)
-/datum/mutation/human/headless/proc/abortattachment(datum/source, obj/item/bodypart/new_limb, special) //you aren't getting your head back
+/datum/mutation/human/headless/proc/abort_attachment(datum/source, obj/item/bodypart/new_limb, special) //you aren't getting your head back
SIGNAL_HANDLER
if(istype(new_limb, /obj/item/bodypart/head))
diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm
index c5a156d32ff8..92a9aba12a16 100644
--- a/code/game/objects/items/cosmetics.dm
+++ b/code/game/objects/items/cosmetics.dm
@@ -6,8 +6,10 @@
icon_state = "lipstick"
inhand_icon_state = "lipstick"
w_class = WEIGHT_CLASS_TINY
- var/colour = "red"
var/open = FALSE
+ /// Actual color of the lipstick, also gets applied to the human
+ var/lipstick_color = COLOR_RED
+
/// A trait that's applied while someone has this lipstick applied, and is removed when the lipstick is removed
var/lipstick_trait
@@ -31,33 +33,33 @@
if(!open)
return
var/mutable_appearance/colored_overlay = mutable_appearance(icon, "lipstick_uncap_color")
- colored_overlay.color = colour
+ colored_overlay.color = lipstick_color
. += colored_overlay
/obj/item/lipstick/purple
name = "purple lipstick"
- colour = "purple"
+ lipstick_color = COLOR_PURPLE
/obj/item/lipstick/jade
//It's still called Jade, but theres no HTML color for jade, so we use lime.
name = "jade lipstick"
- colour = "lime"
+ lipstick_color = COLOR_JADE
/obj/item/lipstick/blue
name = "blue lipstick"
- colour = "blue"
+ lipstick_color = COLOR_BLUE
/obj/item/lipstick/green
name = "green lipstick"
- colour = "green"
+ lipstick_color = COLOR_GREEN
/obj/item/lipstick/white
name = "white lipstick"
- colour = "white"
+ lipstick_color = COLOR_WHITE
/obj/item/lipstick/black
name = "black lipstick"
- colour = "black"
+ lipstick_color = COLOR_BLACK
/obj/item/lipstick/black/death
name = "\improper Kiss of Death"
@@ -71,8 +73,16 @@
/obj/item/lipstick/random/Initialize(mapload)
. = ..()
icon_state = "lipstick"
- colour = pick("red","purple","lime","black","green","blue","white")
- name = "[colour] lipstick"
+ var/static/list/possible_colors
+ if(!possible_colors)
+ possible_colors = list()
+ for(var/obj/item/lipstick/lipstick_path as anything in (typesof(/obj/item/lipstick) - src.type))
+ if(!initial(lipstick_path.lipstick_color))
+ continue
+ possible_colors[initial(lipstick_path.lipstick_color)] = initial(lipstick_path.name)
+ lipstick_color = pick(possible_colors)
+ name = possible_colors[lipstick_color]
+ update_appearance()
/obj/item/lipstick/attack_self(mob/user)
to_chat(user, span_notice("You twist [src] [open ? "closed" : "open"]."))
@@ -98,7 +108,7 @@
if(target == user)
user.visible_message(span_notice("[user] does [user.p_their()] lips with \the [src]."), \
span_notice("You take a moment to apply \the [src]. Perfect!"))
- target.update_lips("lipstick", colour, lipstick_trait)
+ target.update_lips("lipstick", lipstick_color, lipstick_trait)
return
user.visible_message(span_warning("[user] begins to do [target]'s lips with \the [src]."), \
@@ -107,7 +117,7 @@
return
user.visible_message(span_notice("[user] does [target]'s lips with \the [src]."), \
span_notice("You apply \the [src] on [target]'s lips."))
- target.update_lips("lipstick", colour, lipstick_trait)
+ target.update_lips("lipstick", lipstick_color, lipstick_trait)
//you can wipe off lipstick with paper!
@@ -147,125 +157,133 @@
shave(user, BODY_ZONE_HEAD)//doesnt need to be BODY_ZONE_HEAD specifically, but whatever
return BRUTELOSS
-/obj/item/razor/attack(mob/M, mob/living/user)
- if(SEND_SIGNAL(M, COMSIG_MOB_SHEARED, toolspeed, src, user))
- return
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/location = user.zone_selected
- if((location in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD)) && !H.get_bodypart(BODY_ZONE_HEAD))
- to_chat(user, span_warning("[H] doesn't have a head!"))
- return
- if(location == BODY_ZONE_PRECISE_MOUTH)
- if(!(user.istate & ISTATE_HARM))
- if(H.gender == MALE)
- if (H == user)
- to_chat(user, span_warning("You need a mirror to properly style your own facial hair!"))
- return
- if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH))
- return
- var/new_style = tgui_input_list(user, "Select a facial hairstyle", "Grooming", GLOB.facial_hairstyles_list)
- if(isnull(new_style))
- return
- if(!get_location_accessible(H, location))
- to_chat(user, span_warning("The mask is in the way!"))
- return
- if(HAS_TRAIT(H, TRAIT_SHAVED))
- to_chat(user, span_warning("[H] is just way too shaved. Like, really really shaved."))
- return
- user.visible_message(span_notice("[user] tries to change [H]'s facial hairstyle using [src]."), span_notice("You try to change [H]'s facial hairstyle using [src]."))
- if(new_style && do_after(user, 60, target = H))
- user.visible_message(span_notice("[user] successfully changes [H]'s facial hairstyle using [src]."), span_notice("You successfully change [H]'s facial hairstyle using [src]."))
- H.facial_hairstyle = new_style
- H.update_body_parts()
- return
- else
- return
+/obj/item/razor/proc/shave(mob/living/carbon/human/skinhead, location = BODY_ZONE_PRECISE_MOUTH)
+ if(location == BODY_ZONE_PRECISE_MOUTH)
+ skinhead.facial_hairstyle = "Shaved"
+ else
+ skinhead.hairstyle = "Skinhead"
- else
- if(!(FACEHAIR in H.dna.species.species_traits))
- to_chat(user, span_warning("There is no facial hair to shave!"))
- return
- if(!get_location_accessible(H, location))
- to_chat(user, span_warning("The mask is in the way!"))
- return
- if(H.facial_hairstyle == "Shaved")
- to_chat(user, span_warning("Already clean-shaven!"))
- return
+ skinhead.update_body_parts()
+ playsound(loc, 'sound/items/welder2.ogg', 20, TRUE)
- if(H == user) //shaving yourself
- user.visible_message(span_notice("[user] starts to shave [user.p_their()] facial hair with [src]."), \
- span_notice("You take a moment to shave your facial hair with [src]..."))
- if(do_after(user, 50, target = H))
- user.visible_message(span_notice("[user] shaves [user.p_their()] facial hair clean with [src]."), \
- span_notice("You finish shaving with [src]. Fast and clean!"))
- shave(H, location)
- else
- user.visible_message(span_warning("[user] tries to shave [H]'s facial hair with [src]."), \
- span_notice("You start shaving [H]'s facial hair..."))
- if(do_after(user, 50, target = H))
- user.visible_message(span_warning("[user] shaves off [H]'s facial hair with [src]."), \
- span_notice("You shave [H]'s facial hair clean off."))
- shave(H, location)
-
- else if(location == BODY_ZONE_HEAD)
- if(!(user.istate & ISTATE_HARM))
- if (H == user)
- to_chat(user, span_warning("You need a mirror to properly style your own hair!"))
+/obj/item/razor/attack(mob/target_mob, mob/living/user, params)
+ if(!ishuman(target_mob))
+ return ..()
+ var/mob/living/carbon/human/human_target = target_mob
+ var/obj/item/bodypart/head/noggin = human_target.get_bodypart(BODY_ZONE_HEAD)
+ var/location = user.zone_selected
+ var/static/list/head_zones = list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD)
+ if(!noggin && (location in head_zones))
+ to_chat(user, span_warning("[human_target] doesn't have a head!"))
+ return
+ if(location == BODY_ZONE_PRECISE_MOUTH)
+ if(!user.combat_mode)
+ if(human_target.gender == MALE)
+ if(human_target == user)
+ to_chat(user, span_warning("You need a mirror to properly style your own facial hair!"))
return
if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH))
return
- var/new_style
- if(src.unlocked)
- new_style = tgui_input_list(user, "Select a hair style", "Grooming", GLOB.hairstyles_list)
- else
- new_style = tgui_input_list(user, "Select a hair style", "Grooming", GLOB.roundstart_hairstyles_list)
+ var/new_style = tgui_input_list(user, "Select a facial hairstyle", "Grooming", GLOB.facial_hairstyles_list)
if(isnull(new_style))
return
- if(!get_location_accessible(H, location))
+ if(!get_location_accessible(human_target, location))
to_chat(user, span_warning("The headgear is in the way!"))
return
- if(HAS_TRAIT(H, TRAIT_BALD))
- to_chat(user, span_warning("[H] is just way too bald. Like, really really bald."))
+ if(!(noggin.head_flags & HEAD_FACIAL_HAIR))
+ to_chat(user, span_warning("There is no facial hair to style!"))
return
- user.visible_message(span_notice("[user] tries to change [H]'s hairstyle using [src]."), span_notice("You try to change [H]'s hairstyle using [src]."))
- if(new_style && do_after(user, 60, target = H))
- user.visible_message(span_notice("[user] successfully changes [H]'s hairstyle using [src]."), span_notice("You successfully change [H]'s hairstyle using [src]."))
- H.hairstyle = new_style
- H.update_body_parts()
+ if(HAS_TRAIT(human_target, TRAIT_SHAVED))
+ to_chat(user, span_warning("[human_target] is just way too shaved. Like, really really shaved."))
return
-
- else
- if(!(HAIR in H.dna.species.species_traits))
- to_chat(user, span_warning("There is no hair to shave!"))
- return
- if(!get_location_accessible(H, location))
- to_chat(user, span_warning("The headgear is in the way!"))
+ user.visible_message(span_notice("[user] tries to change [human_target]'s facial hairstyle using [src]."), span_notice("You try to change [human_target]'s facial hairstyle using [src]."))
+ if(new_style && do_after(user, 6 SECONDS, target = human_target))
+ user.visible_message(span_notice("[user] successfully changes [human_target]'s facial hairstyle using [src]."), span_notice("You successfully change [human_target]'s facial hairstyle using [src]."))
+ human_target.facial_hairstyle = new_style
+ human_target.update_body_parts(update_limb_data = TRUE)
return
- if(H.hairstyle == "Bald" || H.hairstyle == "Balding Hair" || H.hairstyle == "Skinhead")
- to_chat(user, span_warning("There is not enough hair left to shave!"))
- return
-
- if(H == user) //shaving yourself
- user.visible_message(span_notice("[user] starts to shave [user.p_their()] head with [src]."), \
- span_notice("You start to shave your head with [src]..."))
- if(do_after(user, 5, target = H))
- user.visible_message(span_notice("[user] shaves [user.p_their()] head with [src]."), \
- span_notice("You finish shaving with [src]."))
- shave(H, location)
- else
- var/turf/H_loc = H.loc
- user.visible_message(span_warning("[user] tries to shave [H]'s head with [src]!"), \
- span_notice("You start shaving [H]'s head..."))
- if(do_after(user, 50, target = H))
- if(H_loc == H.loc)
- user.visible_message(span_warning("[user] shaves [H]'s head bald with [src]!"), \
- span_notice("You shave [H]'s head bald."))
- shave(H, location)
+ else
+ return
else
- ..()
- else
- ..()
+ if(!get_location_accessible(human_target, location))
+ to_chat(user, span_warning("The mask is in the way!"))
+ return
+ if(!(noggin.head_flags & HEAD_FACIAL_HAIR))
+ to_chat(user, span_warning("There is no facial hair to shave!"))
+ return
+ if(human_target.facial_hairstyle == "Shaved")
+ to_chat(user, span_warning("Already clean-shaven!"))
+ return
+
+ if(human_target == user) //shaving yourself
+ user.visible_message(span_notice("[user] starts to shave [user.p_their()] facial hair with [src]."), \
+ span_notice("You take a moment to shave your facial hair with [src]..."))
+ if(do_after(user, 5 SECONDS, target = user))
+ user.visible_message(span_notice("[user] shaves [user.p_their()] facial hair clean with [src]."), \
+ span_notice("You finish shaving with [src]. Fast and clean!"))
+ shave(user, location)
+ return
+ else
+ user.visible_message(span_warning("[user] tries to shave [human_target]'s facial hair with [src]."), \
+ span_notice("You start shaving [human_target]'s facial hair..."))
+ if(do_after(user, 5 SECONDS, target = human_target))
+ user.visible_message(span_warning("[user] shaves off [human_target]'s facial hair with [src]."), \
+ span_notice("You shave [human_target]'s facial hair clean off."))
+ shave(human_target, location)
+ return
+ else if(location == BODY_ZONE_HEAD)
+ if(!user.combat_mode)
+ if(human_target == user)
+ to_chat(user, span_warning("You need a mirror to properly style your own hair!"))
+ return
+ if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH))
+ return
+ var/new_style = tgui_input_list(user, "Select a hairstyle", "Grooming", GLOB.hairstyles_list)
+ if(isnull(new_style))
+ return
+ if(!get_location_accessible(human_target, location))
+ to_chat(user, span_warning("The headgear is in the way!"))
+ return
+ if(!(noggin.head_flags & HEAD_HAIR))
+ to_chat(user, span_warning("There is no hair to style!"))
+ return
+ if(HAS_TRAIT(human_target, TRAIT_BALD))
+ to_chat(user, span_warning("[human_target] is just way too bald. Like, really really bald."))
+ return
+ user.visible_message(span_notice("[user] tries to change [human_target]'s hairstyle using [src]."), span_notice("You try to change [human_target]'s hairstyle using [src]."))
+ if(new_style && do_after(user, 6 SECONDS, target = human_target))
+ user.visible_message(span_notice("[user] successfully changes [human_target]'s hairstyle using [src]."), span_notice("You successfully change [human_target]'s hairstyle using [src]."))
+ human_target.hairstyle = new_style
+ human_target.update_body_parts(update_limb_data = TRUE)
+ return
+ else
+ if(!get_location_accessible(human_target, location))
+ to_chat(user, span_warning("The headgear is in the way!"))
+ return
+ if(!(noggin.head_flags & HEAD_HAIR))
+ to_chat(user, span_warning("There is no hair to shave!"))
+ return
+ if(human_target.hairstyle == "Bald" || human_target.hairstyle == "Balding Hair" || human_target.hairstyle == "Skinhead")
+ to_chat(user, span_warning("There is not enough hair left to shave!"))
+ return
+
+ if(human_target == user) //shaving yourself
+ user.visible_message(span_notice("[user] starts to shave [user.p_their()] head with [src]."), \
+ span_notice("You start to shave your head with [src]..."))
+ if(do_after(user, 5 SECONDS, target = user))
+ user.visible_message(span_notice("[user] shaves [user.p_their()] head with [src]."), \
+ span_notice("You finish shaving with [src]."))
+ shave(user, location)
+ return
+ else
+ user.visible_message(span_warning("[user] tries to shave [human_target]'s head with [src]!"), \
+ span_notice("You start shaving [human_target]'s head..."))
+ if(do_after(user, 5 SECONDS, target = human_target))
+ user.visible_message(span_warning("[user] shaves [human_target]'s head bald with [src]!"), \
+ span_notice("You shave [human_target]'s head bald."))
+ shave(human_target, location)
+ return
+ return ..()
/obj/item/razor/attackby(obj/item/item, mob/user, params)
.=..()
From a9a43fb0065580b5bb3df7fc3c5ec5c2d9537f07 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Mon, 29 Jul 2024 10:02:11 -0600
Subject: [PATCH 02/17] more edits MORE
---
.../nightmare/nightmare_species.dm | 6 +-
.../modules/client/preferences/_preference.dm | 4 ++
.../preferences/species_features/basic.dm | 18 ++---
code/modules/clothing/head/wig.dm | 8 ++-
code/modules/clothing/suits/wiz_robe.dm | 2 +-
.../exploration_events/resource.dm | 4 +-
.../mob/dead/new_player/sprite_accessories.dm | 10 +--
code/modules/mob/dead/observer/observer.dm | 9 +--
.../mob/living/carbon/carbon_update_icons.dm | 40 +++++++----
.../mob/living/carbon/human/_species.dm | 69 +++++++++----------
.../living/carbon/human/human_update_icons.dm | 5 +-
.../carbon/human/species_types/abductors.dm | 1 -
.../carbon/human/species_types/dullahan.dm | 7 +-
.../carbon/human/species_type/arachnid.dm | 2 -
.../carbon/human/species_type/ethereal.dm | 4 +-
.../carbon/human/species_type/goblin.dm | 3 -
.../carbon/human/species_type/simian.dm | 2 -
.../carbon/human/species_type/skeletons.dm | 1 -
18 files changed, 105 insertions(+), 90 deletions(-)
diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm
index fcfc07af378a..619d5bb79456 100644
--- a/code/modules/antagonists/nightmare/nightmare_species.dm
+++ b/code/modules/antagonists/nightmare/nightmare_species.dm
@@ -8,7 +8,11 @@
burnmod = 1.5
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE
no_equip_flags = ITEM_SLOT_MASK | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_ICLOTHING | ITEM_SLOT_SUITSTORE
- species_traits = list(NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES)
+ species_traits = list(
+ NO_UNDERWEAR,
+ NO_DNA_COPY,
+ NOTRANSSTING,
+ )
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm
index 54695d937b11..e6f260d9a2f6 100644
--- a/code/modules/client/preferences/_preference.dm
+++ b/code/modules/client/preferences/_preference.dm
@@ -109,6 +109,10 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
/// will show the feature as selectable.
var/relevant_external_organ = null
+ /// If the selected species has this head_flag by default,
+ /// will show the feature as selectable. --species nuking
+ var/relevant_head_flag = null
+
/// Called on the saved input when retrieving.
/// Also called by the value sent from the user through UI. Do not trust it.
/// Input is the value inside the savefile, output is to tell other code
diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm
index 0e4695823c55..06a207899e43 100644
--- a/code/modules/client/preferences/species_features/basic.dm
+++ b/code/modules/client/preferences/species_features/basic.dm
@@ -26,7 +26,7 @@
savefile_key = "eye_color"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
- relevant_species_trait = EYECOLOR
+ relevant_head_flag = HEAD_EYECOLOR
/datum/preference/color/eye_color/apply_to_human(mob/living/carbon/human/target, value)
var/hetero = target.eye_color_heterochromatic
@@ -59,7 +59,7 @@
category = PREFERENCE_CATEGORY_FEATURES
main_feature_name = "Facial hair"
should_generate_icons = TRUE
- relevant_species_trait = FACEHAIR
+ relevant_head_flag = HEAD_FACIAL_HAIR
/datum/preference/choiced/facial_hairstyle/init_possible_values()
return generate_possible_values_for_sprite_accessories_on_head(GLOB.facial_hairstyles_list)
@@ -79,7 +79,7 @@
savefile_key = "facial_hair_color"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES
- relevant_species_trait = FACEHAIR
+ relevant_head_flag = HEAD_FACIAL_HAIR
/datum/preference/color/facial_hair_color/apply_to_human(mob/living/carbon/human/target, value)
target.facial_hair_color = value
@@ -90,7 +90,7 @@
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "facial_hair_gradient"
main_feature_name = "Facial hair Gradient"
- relevant_species_trait = FACEHAIR
+ relevant_head_flag = HEAD_FACIAL_HAIR
should_generate_icons = TRUE
/datum/preference/choiced/facial_hair_gradient/init_possible_values()
@@ -141,7 +141,7 @@
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "facial_hair_gradient_color"
- relevant_species_trait = FACEHAIR
+ relevant_head_flag = HEAD_FACIAL_HAIR
/datum/preference/color/facial_hair_gradient/apply_to_human(mob/living/carbon/human/target, value)
LAZYSETLEN(target.grad_color, GRADIENTS_LEN)
@@ -157,7 +157,7 @@
savefile_key = "hair_color"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES
- relevant_species_trait = HAIR
+ relevant_head_flag = HEAD_HAIR
/datum/preference/color/hair_color/apply_to_human(mob/living/carbon/human/target, value)
target.hair_color = value
@@ -168,7 +168,7 @@
category = PREFERENCE_CATEGORY_FEATURES
main_feature_name = "Hairstyle"
should_generate_icons = TRUE
- relevant_species_trait = HAIR
+ relevant_head_flag = HEAD_HAIR
/datum/preference/choiced/hairstyle/init_possible_values()
return generate_possible_values_for_sprite_accessories_on_head(GLOB.hairstyles_list)
@@ -189,7 +189,7 @@
savefile_key = "hair_gradient"
main_feature_name = "Hairstyle Gradient"
should_generate_icons = TRUE
- relevant_species_trait = HAIR
+ relevant_head_flag = HEAD_HAIR
/datum/preference/choiced/hair_gradient/init_possible_values()
var/list/values = possible_values_for_sprite_accessory_list(GLOB.hair_gradients_list)
@@ -250,7 +250,7 @@
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "hair_gradient_color"
- relevant_species_trait = HAIR
+ relevant_head_flag = HEAD_HAIR
/datum/preference/color/hair_gradient/apply_to_human(mob/living/carbon/human/target, value)
LAZYSETLEN(target.grad_color, GRADIENTS_LEN)
diff --git a/code/modules/clothing/head/wig.dm b/code/modules/clothing/head/wig.dm
index 48949965a1a1..93f3960851fa 100644
--- a/code/modules/clothing/head/wig.dm
+++ b/code/modules/clothing/head/wig.dm
@@ -70,13 +70,19 @@
to_chat(user, span_warning("You can't get a good look at [target.p_their()] hair!"))
return
+ var/obj/item/bodypart/head/noggin = target.get_bodypart(BODY_ZONE_HEAD)
+ if(!noggin)
+ to_chat(user, span_warning("[target.p_they(TRUE)] have no head!"))
+ return
+
+
var/selected_hairstyle = null
var/selected_hairstyle_color = null
if(istype(target.head, /obj/item/clothing/head/wig))
var/obj/item/clothing/head/wig/wig = target.head
selected_hairstyle = wig.hairstyle
selected_hairstyle_color = wig.color
- else if((HAIR in target.dna.species.species_traits) && target.hairstyle != "Bald")
+ else if((noggin.head_flags & HEAD_HAIR) && target.hairstyle != "Bald")
selected_hairstyle = target.hairstyle
selected_hairstyle_color = "[target.hair_color]"
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 3019de7ac0ca..457bc7d7c35b 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -66,7 +66,7 @@
inhand_icon_state = "tapehat"
dog_fashion = null
worn_y_offset = 6
- body_parts_covered = HEAD|HAIR
+ body_parts_covered = HEAD //this used to also cover HAIR, but that was never valid code as HAIR is not actually a body_part define!
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
/obj/item/clothing/head/wizard/magus
diff --git a/code/modules/explorer_drone/exploration_events/resource.dm b/code/modules/explorer_drone/exploration_events/resource.dm
index aa334f5685e1..01f8c083c63b 100644
--- a/code/modules/explorer_drone/exploration_events/resource.dm
+++ b/code/modules/explorer_drone/exploration_events/resource.dm
@@ -242,8 +242,8 @@
var/mob/living/carbon/human/head_species_source = new
head_species_source.set_species(/datum/species/skeleton)
head_species_source.real_name = "spaced locker victim"
- var/obj/item/bodypart/head/skeleton_head = new
- skeleton_head.update_limb(FALSE,head_species_source)
+ var/obj/item/bodypart/head/skeleton_head = head_species_source.get_bodypart(BODY_ZONE_HEAD)
+ skeleton_head.drop_limb(FALSE)
qdel(head_species_source)
drone.try_transfer(skeleton_head)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm
index 90b147e0aff1..08608f33a042 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -67,7 +67,7 @@
* Currently only used by mutantparts so don't worry about hair and stuff.
* This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
*/
- var/color_src = MUTCOLORS
+ var/color_src = MUTANT_COLOR
/// Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
var/hasinner = FALSE
/// Is this part locked from roundstart selection? Used for parts that apply effects.
@@ -1780,7 +1780,7 @@ MONKESTATION EDIT
name = "Cat"
icon = 'icons/mob/species/human/cat_features.dmi'
icon_state = "default"
- color_src = HAIR
+ color_src = HAIR_COLOR
/datum/sprite_accessory/tails/monkey
name = "Monkey"
@@ -1891,14 +1891,14 @@ MONKESTATION EDIT
name = "Cat"
icon_state = "cat"
hasinner = TRUE
- color_src = HAIR
+ color_src = HAIR_COLOR
/datum/sprite_accessory/ears/fox
icon = 'icons/mob/species/human/fox_features.dmi'
name = "Fox"
icon_state = "fox"
hasinner = TRUE
- color_src = HAIR
+ color_src = HAIR_COLOR
locked = TRUE
/datum/sprite_accessory/wings/none
@@ -2092,7 +2092,7 @@ MONKESTATION EDIT
/datum/sprite_accessory/caps
icon = 'icons/mob/species/mush_cap.dmi'
- color_src = HAIR
+ color_src = HAIR_COLOR
em_block = TRUE
/datum/sprite_accessory/caps/round
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index fc8782763a46..849468a93b4a 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -107,10 +107,11 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
if(ishuman(body))
var/mob/living/carbon/human/body_human = body
- if(HAIR in body_human.dna.species.species_traits)
+ var/datum/species/human_species = body_human.dna.species
+ if(human_species.check_head_flags(HEAD_HAIR))
hairstyle = body_human.hairstyle
hair_color = brighten_color(body_human.hair_color)
- if(FACEHAIR in body_human.dna.species.species_traits)
+ if(human_species.check_head_flags(HEAD_FACIAL_HAIR))
facial_hairstyle = body_human.facial_hairstyle
facial_hair_color = brighten_color(body_human.facial_hair_color)
@@ -842,11 +843,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/species_type = client.prefs.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
- if(HAIR in species.species_traits)
+ if(species.check_head_flags(HEAD_HAIR))
hairstyle = client.prefs.read_preference(/datum/preference/choiced/hairstyle)
hair_color = brighten_color(client.prefs.read_preference(/datum/preference/color/hair_color))
- if(FACEHAIR in species.species_traits)
+ if(species.check_head_flags(HEAD_FACIAL_HAIR))
facial_hairstyle = client.prefs.read_preference(/datum/preference/choiced/facial_hairstyle)
facial_hair_color = brighten_color(client.prefs.read_preference(/datum/preference/color/facial_hair_color))
diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm
index fef1272d9765..2485d23eabef 100644
--- a/code/modules/mob/living/carbon/carbon_update_icons.dm
+++ b/code/modules/mob/living/carbon/carbon_update_icons.dm
@@ -553,27 +553,41 @@
/obj/item/bodypart/head/generate_icon_key()
. = ..()
- . += "-[facial_hairstyle]"
- . += "-[facial_hair_color]"
- if(facial_hair_gradient_style)
- . += "-[facial_hair_gradient_style]"
- if(hair_gradient_color)
- . += "-[facial_hair_gradient_color]"
+ if(lip_style)
+ . += "-[lip_style]"
+ . += "-[lip_color]"
if(facial_hair_hidden)
. += "-FACIAL_HAIR_HIDDEN"
+ else
+ . += "-[facial_hairstyle]"
+ . += "-[override_hair_color || fixed_hair_color || facial_hair_color]"
+ . += "-[facial_hair_alpha]"
+ if(facial_hair_gradient_style)
+ . += "-[facial_hair_gradient_style]"
+ . += "-[facial_hair_gradient_color]"
+ if(show_missing_eyes)
+ . += "-SHOW_MISSING_EYES"
if(show_debrained)
. += "-SHOW_DEBRAINED"
return .
-
- . += "-[hair_style]"
- . += "-[fixed_hair_color || override_hair_color || hair_color]"
- if(hair_gradient_style)
- . += "-[hair_gradient_style]"
- if(hair_gradient_color)
- . += "-[hair_gradient_color]"
if(hair_hidden)
. += "-HAIR_HIDDEN"
+ else
+ . += "-[hair_style]"
+ . += "-[override_hair_color || fixed_hair_color || hair_color]"
+ . += "-[hair_alpha]"
+ if(hair_gradient_style)
+ . += "-[hair_gradient_style]"
+ . += "-[hair_gradient_color]"
+
+ return .
+/obj/item/bodypart/head/generate_husk_key()
+ . = ..()
+ if(show_missing_eyes)
+ . += "-SHOW_MISSING_EYES"
+ if(show_debrained)
+ . += "-SHOW_DEBRAINED"
return .
GLOBAL_LIST_EMPTY(masked_leg_icons_cache)
diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm
index fa67853e091f..7a528b094226 100644
--- a/code/modules/mob/living/carbon/human/_species.dm
+++ b/code/modules/mob/living/carbon/human/_species.dm
@@ -54,6 +54,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/hair_color
///The alpha used by the hair. 255 is completely solid, 0 is invisible.
var/hair_alpha = 255
+ ///The alpha used by the facial hair. 255 is completely solid, 0 is invisible.
+ var/facial_hair_alpha = 255
///Examine text when the person has cellular damage.
var/cellular_damage_desc = DEFAULT_CLONE_EXAMINE_TEXT
@@ -230,9 +232,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
///List of results you get from knife-butchering. null means you cant butcher it. Associated by resulting type - value of amount
var/list/knife_butcher_results
- ///List of visual overlays created by handle_body()
- var/list/body_vis_overlays = list()
-
/// Should we preload this species's organs?
var/preload = TRUE
@@ -683,34 +682,21 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/list/standing = list()
var/list/standing_face = list()
- var/obj/item/bodypart/head/noggin = species_human.get_bodypart(BODY_ZONE_HEAD)
-
- if(noggin && !(HAS_TRAIT(species_human, TRAIT_HUSK)))
- // lipstick
- if(species_human.lip_style && (LIPS in species_traits))
- var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/species/human/human_face.dmi', "lips_[species_human.lip_style]", -FACE_LAYER)
- lip_overlay.color = species_human.lip_color
- if(OFFSET_FACE in species_human.dna.species.offset_features)
- lip_overlay.pixel_x += species_human.dna.species.offset_features[OFFSET_FACE][1]
- lip_overlay.pixel_y += species_human.dna.species.offset_features[OFFSET_FACE][2]
- lip_overlay.pixel_y += height_offset
- standing_face += lip_overlay
-
- // eyes
- if(!(NOEYESPRITES in species_traits))
+ if(!HAS_TRAIT(species_human, TRAIT_HUSK))
+ var/obj/item/bodypart/head/noggin = species_human.get_bodypart(BODY_ZONE_HEAD)
+ if(noggin?.head_flags & HEAD_EYESPRITES)
+ // eyes (missing eye sprites get handled by the head itself, but sadly we have to do this stupid shit here, for now)
var/obj/item/organ/internal/eyes/eye_organ = species_human.get_organ_slot(ORGAN_SLOT_EYES)
- var/mutable_appearance/no_eyeslay
- var/add_pixel_x = 0
- var/add_pixel_y = 0
- //cut any possible vis overlays
- if(body_vis_overlays.len)
- SSvis_overlays.remove_vis_overlay(species_human, body_vis_overlays)
-
- if(OFFSET_FACE in species_human.dna.species.offset_features)
- add_pixel_x = species_human.dna.species.offset_features[OFFSET_FACE][1]
- add_pixel_y = species_human.dna.species.offset_features[OFFSET_FACE][2]
- add_pixel_y += height_offset
+
+ //Species nuking, this entire if else if for eyes looks fucky needs test
+
+ if(eye_organ)
+ eye_organ.refresh(call_update = FALSE)
+ for(var/mutable_appearance/eye_overlay in eye_organ.generate_body_overlay(species_human))
+ eye_overlay.pixel_y += height_offset
+ standing += eye_overlay
+ /*
if(!eye_organ)
no_eyeslay = mutable_appearance('icons/mob/species/human/human_face.dmi', "eyes_missing", -FACE_LAYER)
no_eyeslay.pixel_x += add_pixel_x
@@ -723,6 +709,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
for(var/mutable_appearance/eye_overlay in eye_organ.generate_body_overlay(species_human))
eye_overlay.pixel_y += height_offset
standing_face += eye_overlay
+ */
// organic body markings
if(HAS_MARKINGS in species_traits)
@@ -887,7 +874,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
switch(accessory.color_src)
if(SKINTONES)
accessory_overlay.color = skintone2hex(source.skin_tone)
- if(MUTCOLORS)
+ if(MUTANT_COLORS)
if(fixed_mut_color)
accessory_overlay.color = fixed_mut_color
else
@@ -897,16 +884,16 @@ GLOBAL_LIST_EMPTY(features_by_species)
accessory_overlay.color = fixed_mut_color
else
accessory_overlay.color = source.dna.features["mcolor_secondary"]
- if(HAIR)
+ if(HAIR_COLOR)
if(hair_color == "mutcolor")
accessory_overlay.color = source.dna.features["mcolor"]
else if(hair_color == "fixedmutcolor")
accessory_overlay.color = fixed_mut_color
else
accessory_overlay.color = source.hair_color
- if(FACEHAIR)
+ if(FACIAL_HAIR_COLOR)
accessory_overlay.color = source.facial_hair_color
- if(EYECOLOR)
+ if(EYE_COLOR)
accessory_overlay.color = source.eye_color_left
if(ANIME)
accessory_overlay.color = source.dna.features["animecolor"]
@@ -1221,7 +1208,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
source.domutcheck()
if(time_since_irradiated > RAD_MOB_HAIRLOSS && SPT_PROB(RAD_MOB_HAIRLOSS_PROB, seconds_per_tick))
- if(!(source.hairstyle == "Bald") && (HAIR in species_traits))
+ var/obj/item/bodypart/head/head = source.get_bodypart(BODY_ZONE_HEAD)
+ if(!(source.hairstyle == "Bald") && (head?.head_flags & HEAD_HAIR|HEAD_FACIAL_HAIR))
to_chat(source, span_danger("Your hair starts to fall out in clumps..."))
addtimer(CALLBACK(src, PROC_REF(go_bald), source), 5 SECONDS)
@@ -1905,7 +1893,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
if ( \
(preference.relevant_mutant_bodypart in mutant_bodyparts) \
|| (preference.relevant_species_trait in species_traits) \
- || (preference.relevant_external_organ in external_organs)
+ || (preference.relevant_external_organ in external_organs) \
+ || (preference.relevant_head_flag && check_head_flags(preference.relevant_head_flag)) \
)
features += preference.savefile_key
@@ -2328,5 +2317,15 @@ GLOBAL_LIST_EMPTY(features_by_species)
target.create_bodyparts(bodypart_overrides)
target.regenerate_icons()
+/**
+ * Checks if the species has a head with these head flags, by default.
+ * Admittedly, this is a very weird and seemingly redundant proc, but it
+ * gets used by some preferences (such as hair style) to determine whether
+ * or not they are accessible.
+ **/
+/datum/species/proc/check_head_flags(check_flags = NONE)
+ var/obj/item/bodypart/head/fake_head = bodypart_overrides[BODY_ZONE_HEAD]
+ return (initial(fake_head.head_flags) & check_flags)
+
/datum/species/proc/spec_revival(mob/living/carbon/human/H)
return
diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm
index 3d6b1de5b43c..ec7f482ae1d9 100644
--- a/code/modules/mob/living/carbon/human/human_update_icons.dm
+++ b/code/modules/mob/living/carbon/human/human_update_icons.dm
@@ -836,12 +836,14 @@ generate/load female uniform sprites matching all previously decided variables
var/obj/item/bodypart/HD = get_bodypart("head")
- if (!istype(HD))
+ if(!istype(HD))
return
HD.update_limb(is_creating = update_limb_data)
add_overlay(HD.get_limb_icon())
+
+ /*
update_damage_overlays()
if(HD && !(HAS_TRAIT(src, TRAIT_HUSK)))
@@ -867,6 +869,7 @@ generate/load female uniform sprites matching all previously decided variables
add_overlay(missing_eyes)
update_worn_head()
update_worn_mask()
+ */
// Hooks into human apply overlay so that we can modify all overlays applied through standing overlays to our height system.
// Some of our overlays will be passed through a displacement filter to make our mob look taller or shorter.
diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm
index 868224c6a266..7987df7b7fef 100644
--- a/code/modules/mob/living/carbon/human/species_types/abductors.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm
@@ -3,7 +3,6 @@
id = SPECIES_ABDUCTOR
sexes = FALSE
species_traits = list(
- NOEYESPRITES,
NO_UNDERWEAR,
)
inherent_traits = list(
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index bea88b0b2aca..5e1d4530228f 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -1,12 +1,7 @@
/datum/species/dullahan
name = "Dullahan"
id = SPECIES_DULLAHAN
- species_traits = list(
- EYECOLOR,
- HAIR,
- FACEHAIR,
- LIPS,
- )
+ species_traits = list()
inherent_traits = list(
TRAIT_NOBREATH,
TRAIT_NOHUNGER,
diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/arachnid.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/arachnid.dm
index 2bdf8aceb1bb..0ceef81fbf51 100644
--- a/monkestation/code/modules/mob/living/carbon/human/species_type/arachnid.dm
+++ b/monkestation/code/modules/mob/living/carbon/human/species_type/arachnid.dm
@@ -6,8 +6,6 @@
visual_gender = FALSE
species_traits = list(
MUTCOLORS,
- EYECOLOR,
- LIPS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
external_organs = list(
diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/ethereal.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/ethereal.dm
index d90d953b961c..f0ed32b70b5a 100644
--- a/monkestation/code/modules/mob/living/carbon/human/species_type/ethereal.dm
+++ b/monkestation/code/modules/mob/living/carbon/human/species_type/ethereal.dm
@@ -22,9 +22,6 @@
species_traits = list(
DYNCOLORS,
NO_UNDERWEAR,
- HAIR,
- EYECOLOR,
- FACEHAIR,
)
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
species_cookie = /obj/item/food/energybar
@@ -37,6 +34,7 @@
bodytemp_cold_damage_limit = (T20C - 10) // about 10c
hair_color = "fixedmutcolor"
hair_alpha = 180
+ facial_hair_alpha = 180
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/ethereal,
diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/goblin.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/goblin.dm
index 0fa326c6d101..a4dfb03b1d78 100644
--- a/monkestation/code/modules/mob/living/carbon/human/species_type/goblin.dm
+++ b/monkestation/code/modules/mob/living/carbon/human/species_type/goblin.dm
@@ -6,9 +6,6 @@
sexes = TRUE
species_traits = list(
MUTCOLORS,
- EYECOLOR,
- HAIR,
- FACEHAIR
)
inherent_traits = list(
TRAIT_DWARF,
diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm
index 6afdad1ae0c0..77992e1cc48b 100644
--- a/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm
+++ b/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm
@@ -6,8 +6,6 @@
bodytype = BODYTYPE_CUSTOM
species_traits = list(
- EYECOLOR,
- LIPS,
NO_UNDERWEAR,
SPECIES_FUR,
)
diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/skeletons.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/skeletons.dm
index 4069b891fb53..7aec8942833f 100644
--- a/monkestation/code/modules/mob/living/carbon/human/species_type/skeletons.dm
+++ b/monkestation/code/modules/mob/living/carbon/human/species_type/skeletons.dm
@@ -12,7 +12,6 @@
meat = /obj/item/food/meat/slab/human/mutant/skeleton
species_traits = list(
NOTRANSSTING,
- NOEYESPRITES,
NO_DNA_COPY,
NO_UNDERWEAR,
NOHUSK,
From d185dd8c56fe1f2fccdc5261fcf5d209f3ec9baf Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Mon, 29 Jul 2024 13:48:54 -0600
Subject: [PATCH 03/17] The march continues
---
.../carbon/human/species_types/humans.dm | 7 +-
.../carbon/human/species_types/jellypeople.dm | 6 +-
.../human/species_types/lizardpeople.dm | 5 -
.../carbon/human/species_types/monkeys.dm | 3 -
.../carbon/human/species_types/mothmen.dm | 2 -
.../carbon/human/species_types/mushpeople.dm | 3 +-
.../carbon/human/species_types/podpeople.dm | 1 -
.../human/species_types/shadowpeople.dm | 4 +-
.../carbon/human/species_types/skeletons.dm | 1 -
.../carbon/human/species_types/vampire.dm | 4 -
.../chemistry/reagents/other_reagents.dm | 13 +-
code/modules/religion/burdened/psyker.dm | 14 +-
code/modules/surgery/bodyparts/_bodyparts.dm | 12 +-
.../surgery/bodyparts/dismemberment.dm | 6 +-
code/modules/surgery/bodyparts/hair.dm | 77 ++++----
code/modules/surgery/bodyparts/head.dm | 177 +++++++++++-------
code/modules/surgery/bodyparts/helpers.dm | 3 +-
.../surgery/bodyparts/robot_bodyparts.dm | 2 +
.../species_parts/ethereal_bodyparts.dm | 1 +
.../species_parts/lizard_bodyparts.dm | 1 +
.../bodyparts/species_parts/misc_bodyparts.dm | 12 +-
.../bodyparts/species_parts/moth_bodyparts.dm | 1 +
.../species_parts/plasmaman_bodyparts.dm | 1 +
code/modules/surgery/organs/eyes.dm | 4 +-
.../modules/botany/species/apid/bodyparts.dm | 2 +
.../surgery/bodyparts/arachnid_bodyparts.dm | 1 +
.../surgery/bodyparts/clockwork_bodyparts.dm | 2 +-
.../surgery/bodyparts/ethereal_bodyparts.dm | 1 +
.../surgery/bodyparts/floran_bodyparts.dm | 1 +
.../surgery/bodyparts/simian_bodyparts.dm | 2 +-
30 files changed, 208 insertions(+), 161 deletions(-)
diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm
index 8fe88ce6e742..caeecface3f7 100644
--- a/code/modules/mob/living/carbon/human/species_types/humans.dm
+++ b/code/modules/mob/living/carbon/human/species_types/humans.dm
@@ -1,12 +1,7 @@
/datum/species/human
name = "\improper Human"
id = SPECIES_HUMAN
- species_traits = list(
- EYECOLOR,
- HAIR,
- FACEHAIR,
- LIPS,
- )
+ species_traits = list()
inherent_traits = list(
TRAIT_CAN_USE_FLIGHT_POTION,
)
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index d20174543871..0deab490f305 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -12,8 +12,7 @@
id = SPECIES_JELLYPERSON
species_traits = list(
MUTCOLORS,
- EYECOLOR,
- )
+ )
inherent_traits = list(
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_TOXINLOVER,
@@ -179,9 +178,10 @@
name = "\improper Slimeperson"
plural_form = "Slimepeople"
id = SPECIES_SLIMEPERSON
- species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR)
+ species_traits = list(MUTCOLORS,)
hair_color = "mutcolor"
hair_alpha = 150
+ facial_hair_alpha = 150
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
mutanteyes = /obj/item/organ/internal/eyes
var/datum/action/innate/split_body/slime_split
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 5fd87552ad8b..a122cbb6f292 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -7,9 +7,6 @@
species_traits = list(
MUTCOLORS,
MUTCOLORS_SECONDARY,
- EYECOLOR,
- LIPS,
- HAIR // monke edit: lizards can have hair (it's the future, why not)
)
inherent_traits = list(
TRAIT_CAN_USE_FLIGHT_POTION,
@@ -128,8 +125,6 @@ Lizard subspecies: ASHWALKERS
species_traits = list(
MUTCOLORS,
MUTCOLORS_SECONDARY,
- EYECOLOR,
- LIPS,
NO_UNDERWEAR, //MONKESTATION ADDITION: no more flesh clothes lol
)
inherent_traits = list(
diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
index aca109b60874..4810b185a43f 100644
--- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm
+++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
@@ -14,15 +14,12 @@
knife_butcher_results = list(/obj/item/food/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
species_traits = list(
NO_UNDERWEAR,
- LIPS,
- NOEYESPRITES,
NOBLOODOVERLAY,
NOTRANSSTING,
NOAUGMENTS,
)
inherent_traits = list(
TRAIT_GUN_NATURAL,
- //TRAIT_LITERATE,
TRAIT_VENTCRAWLER_NUDE,
TRAIT_WEAK_SOUL,
)
diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
index 9e76c1908e6d..2d41b333f5d7 100644
--- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
@@ -3,9 +3,7 @@
plural_form = "Mothmen"
id = SPECIES_MOTH
species_traits = list(
- LIPS,
HAS_MARKINGS,
- HAIR // monke edit: moths can have hair (it's the future, why not)
)
inherent_traits = list(
TRAIT_CAN_USE_FLIGHT_POTION,
diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
index 4a1981f4478c..38eb12e8ba3e 100644
--- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
@@ -10,7 +10,6 @@
species_traits = list(
MUTCOLORS,
- NOEYESPRITES,
NO_UNDERWEAR,
)
inherent_traits = list(
@@ -41,6 +40,8 @@
BODY_ZONE_CHEST = /obj/item/bodypart/chest/mushroom,
)
+ var/datum/martial_art/mushpunch/mush
+
/datum/species/mush/check_roundstart_eligible()
return FALSE //hard locked out of roundstart on the order of design lead kor, this can be removed in the future when planetstation is here OR SOMETHING but right now we have a problem with races.
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index 2690c18927e2..c451d48110b0 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -5,7 +5,6 @@
id = SPECIES_PODPERSON
species_traits = list(
MUTCOLORS,
- EYECOLOR,
)
inherent_traits = list(
TRAIT_PLANT_SAFE,
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 9812b2fad673..e7f1d9658e2f 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -5,9 +5,7 @@
id = SPECIES_SHADOW
sexes = 0
meat = /obj/item/food/meat/slab/human/mutant/shadow
- species_traits = list(
- NOEYESPRITES,
- )
+ species_traits = list()
inherent_traits = list(
TRAIT_NOBREATH,
TRAIT_RADIMMUNE,
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 3fa5ed1a7674..1c294c2579ff 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -6,7 +6,6 @@
meat = /obj/item/food/meat/slab/human/mutant/skeleton
species_traits = list(
NOTRANSSTING,
- NOEYESPRITES,
NO_DNA_COPY,
NO_UNDERWEAR,
NOHUSK,
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index 3cebd9f52233..72f06a970033 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -8,10 +8,6 @@
name = "Vampire"
id = SPECIES_VAMPIRE
species_traits = list(
- EYECOLOR,
- HAIR,
- FACEHAIR,
- LIPS,
DRINKSBLOOD,
BLOOD_CLANS,
)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 8189dbd47b25..5a03d03084f2 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -622,8 +622,9 @@
affected_human.facial_hairstyle = "Shaved"
affected_human.facial_hair_color = "#000000"
affected_human.hair_color = "#000000"
- if(!(HAIR in affected_human.dna.species.species_traits)) //No hair? No problem!
- affected_human.dna.species.species_traits += HAIR
+ var/obj/item/bodypart/head/head = affected_human.get_bodypart(BODY_ZONE_HEAD)
+ if(head)
+ head.head_flags |= HEAD_HAIR //No hair? No problem!
if(affected_human.dna.species.use_skintones)
affected_human.skin_tone = "orange"
else if(MUTCOLORS in affected_human.dna.species.species_traits) //Aliens with custom colors simply get turned orange
@@ -2164,12 +2165,10 @@
var/mob/living/carbon/human/human_mob = affected_mob
if(creation_purity == 1 && human_mob.has_quirk(/datum/quirk/item_quirk/bald))
human_mob.remove_quirk(/datum/quirk/item_quirk/bald)
- var/datum/species/species_datum = human_mob.dna?.species
- if(!species_datum)
+ var/obj/item/bodypart/head/head = human_mob.get_bodypart(BODY_ZONE_HEAD)
+ if(!head || (head.head_flags & HEAD_HAIR))
return
- if(species_datum.species_traits.Find(HAIR))
- return
- species_datum.species_traits |= HAIR
+ head.head_flags |= HEAD_HAIR
var/message
if(HAS_TRAIT(affected_mob, TRAIT_BALD))
message = span_warning("You feel your scalp mutate, but you are still hopelessly bald.")
diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm
index b06e618e0775..4c31e56ac899 100644
--- a/code/modules/religion/burdened/psyker.dm
+++ b/code/modules/religion/burdened/psyker.dm
@@ -36,28 +36,16 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
bodypart_traits = list(TRAIT_DISFIGURED, TRAIT_BALD, TRAIT_SHAVED)
+ head_flags = HEAD_LIPS|HEAD_EYEHOLES|HEAD_DEBRAIN
/obj/item/bodypart/head/psyker/try_attach_limb(mob/living/carbon/new_head_owner, special, abort)
. = ..()
if(!.)
return
new_head_owner.become_blind(limb_id)
- if(!new_head_owner.dna?.species)
- return
-
- new_head_owner.dna.species.species_traits |= NOEYESPRITES //MAKE VISUALS TIED TO BODYPARTS ARGHH
- new_head_owner.update_body()
/obj/item/bodypart/head/psyker/drop_limb(special, dismembered)
owner.cure_blind(limb_id)
- if(!owner.dna?.species)
- return ..()
-
- if(initial(owner.dna.species.species_traits) & NOEYESPRITES)
- return ..()
-
- owner.dna.species.species_traits &= ~NOEYESPRITES
- owner.update_body()
return ..()
/// flavorful variant of psykerizing that deals damage and sends messages before calling psykerize()
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 891a9cd54707..ae99a4298748 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -109,6 +109,11 @@
var/px_x = 0
var/px_y = 0
+ /**
+ * A copy of the original owner's species datum species_traits list (very hacky)
+ * It sucks that we have to do this, but due to MUTCOLORS and others, we have to. For now.
+ */
+
var/species_flags_list = list()
///the type of damage overlay (if any) to use when this bodypart is bruised/burned.
var/dmg_overlay_type = "human"
@@ -886,7 +891,7 @@
// No, xenos don't actually use bodyparts. Don't ask.
var/mob/living/carbon/human/human_owner = owner
var/datum/species/owner_species = human_owner.dna.species
- species_flags_list = owner_species.species_traits
+ species_flags_list = owner_species.species_traits.Copy()
limb_gender = (human_owner.physique == MALE) ? "m" : "f"
if(owner_species.use_skintones)
@@ -1006,8 +1011,9 @@
. += aux_em_block
//EMISSIVE CODE END
- //Ok so legs are a bit goofy in regards to layering, and we will need two images instead of one to fix that
- if((body_zone == BODY_ZONE_R_LEG) || (body_zone == BODY_ZONE_L_LEG))
+ //No need to handle leg layering if dropped, we only face south anyways
+ if(!dropped && ((body_zone == BODY_ZONE_R_LEG) || (body_zone == BODY_ZONE_L_LEG)))
+ //Legs are a bit goofy in regards to layering, and we will need two images instead of one to fix that
var/obj/item/bodypart/leg/leg_source = src
for(var/image/limb_image in .)
//remove the old, unmasked image
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 33cee5db254f..9f4d54e86d61 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -94,7 +94,7 @@
SEND_SIGNAL(owner, COMSIG_CARBON_REMOVE_LIMB, src, dismembered)
SEND_SIGNAL(src, COMSIG_BODYPART_REMOVED, owner, dismembered)
- update_limb(TRUE)
+ update_limb(dropping_limb = TRUE)
//limb is out and about, it can't really be considered an implant
bodypart_flags &= ~BODYPART_IMPLANTED
owner.remove_bodypart(src)
@@ -395,7 +395,7 @@
SEND_SIGNAL(new_limb_owner, COMSIG_CARBON_POST_ATTACH_LIMB, src, special)
return TRUE
-/obj/item/bodypart/head/try_attach_limb(mob/living/carbon/new_head_owner, special = FALSE, abort = FALSE)
+/obj/item/bodypart/head/try_attach_limb(mob/living/carbon/new_head_owner, special = FALSE)
// These are stored before calling super. This is so that if the head is from a different body, it persists its appearance.
var/real_name = src.real_name
@@ -438,6 +438,8 @@
sexy_chad.grad_color[GRADIENT_HAIR_KEY] = hair_gradient_color
sexy_chad.grad_style[GRADIENT_FACIAL_HAIR_KEY] = facial_hair_gradient_style
sexy_chad.grad_color[GRADIENT_FACIAL_HAIR_KEY] = facial_hair_gradient_color
+ sexy_chad.lip_style = lip_style
+ sexy_chad.lip_color = lip_color
new_head_owner.updatehealth()
new_head_owner.update_body()
diff --git a/code/modules/surgery/bodyparts/hair.dm b/code/modules/surgery/bodyparts/hair.dm
index 673af47de27b..842d706f5586 100644
--- a/code/modules/surgery/bodyparts/hair.dm
+++ b/code/modules/surgery/bodyparts/hair.dm
@@ -1,65 +1,61 @@
-#define SET_OVERLAY_VALUE(X,Y,Z) if(X) X.Y = Z
+#define SET_OVERLAY_VALUE(overlay,variable,value) if(overlay) overlay.variable = value
-///Part of `update_limb()`, this proc does what the name implies.
-/obj/item/bodypart/head/proc/update_hair_and_lips()
+/// Part of `update_limb()`, this proc does what the name implies.
+/obj/item/bodypart/head/proc/update_hair_and_lips(dropping_limb, is_creating)
+ // THIS PROC DOES NOT WORK FOR DROPPED HEADS. YET.
+ if(!owner)
+ return
var/mob/living/carbon/human/human_head_owner = owner
var/datum/species/owner_species = human_head_owner.dna.species
- if(human_head_owner.lip_style && (LIPS in owner_species.species_traits))
- lip_style = human_head_owner.lip_style
- lip_color = human_head_owner.lip_color
- else
- lip_style = null
- lip_color = "white"
-
- ///FACIAL HAIR CHECKS START
- //we check if our hat or helmet hides our facial hair.
+ //HIDDEN CHECKS START
+ hair_hidden = FALSE
facial_hair_hidden = FALSE
if(human_head_owner.head)
var/obj/item/hat = human_head_owner.head
+ if(hat.flags_inv & HIDEHAIR)
+ hair_hidden = TRUE
if(hat.flags_inv & HIDEFACIALHAIR)
facial_hair_hidden = TRUE
if(human_head_owner.wear_mask)
var/obj/item/mask = human_head_owner.wear_mask
+ if(mask.flags_inv & HIDEHAIR)
+ hair_hidden = TRUE
if(mask.flags_inv & HIDEFACIALHAIR)
facial_hair_hidden = TRUE
- ///FACIAL HAIR CHECKS END
-
- ///HAIR CHECKS START
- hair_hidden = FALSE
- if(human_head_owner.head)
- var/obj/item/hat = human_head_owner.head
- if(hat.flags_inv & HIDEHAIR)
- hair_hidden = TRUE
if(human_head_owner.w_uniform)
var/obj/item/item_uniform = human_head_owner.w_uniform
if(item_uniform.flags_inv & HIDEHAIR)
hair_hidden = TRUE
-
- if(human_head_owner.wear_mask)
- var/obj/item/mask = human_head_owner.wear_mask
- if(mask.flags_inv & HIDEHAIR)
- hair_hidden = TRUE
- ///HAIR CHECKS END
- //invisibility stuff
- if(HAS_TRAIT(human_head_owner, TRAIT_INVISIBLE_MAN))
+ if(item_uniform.flags_inv & HIDEFACIALHAIR)
+ facial_hair_hidden = TRUE
+ //invisibility and husk stuff
+ if(HAS_TRAIT(human_head_owner, TRAIT_INVISIBLE_MAN) || HAS_TRAIT(human_head_owner, TRAIT_HUSK))
hair_hidden = TRUE
facial_hair_hidden = TRUE
- if(!hair_hidden && !owner.get_organ_slot(ORGAN_SLOT_BRAIN) && !HAS_TRAIT(owner, TRAIT_NOBLOOD))
+ if(!hair_hidden && !owner.get_organ_slot(ORGAN_SLOT_BRAIN) && (head_flags & HEAD_DEBRAIN) && !HAS_TRAIT(owner, TRAIT_NO_DEBRAIN_OVERLAY))
show_debrained = TRUE
else
show_debrained = FALSE
+ if(!owner.get_organ_slot(ORGAN_SLOT_EYES) && (head_flags & HEAD_EYEHOLES))
+ show_missing_eyes = TRUE
+ else
+ show_missing_eyes = FALSE
+
var/datum/sprite_accessory/sprite_accessory
+ lip_overlay = null
facial_overlay = null
facial_gradient_overlay = null
hair_overlay = null
hair_gradient_overlay = null
+ lip_style = human_head_owner.lip_style
+ lip_color = human_head_owner.lip_color
hair_alpha = owner_species.hair_alpha
hair_color = human_head_owner.hair_color
facial_hair_color = human_head_owner.facial_hair_color
@@ -74,12 +70,16 @@
height = num2text(height)
var/offsets = GLOB.human_heights_to_offsets[height]
- if(facial_hairstyle && !facial_hair_hidden && (FACEHAIR in species_flags_list))
+ if(!facial_hair_hidden && lip_style && (head_flags & HEAD_LIPS))
+ lip_overlay = mutable_appearance('icons/mob/species/human/human_face.dmi', "lips_[lip_style]", -BODY_LAYER)
+ lip_overlay.color = lip_color
+
+ if(!facial_hair_hidden && facial_hairstyle && (head_flags & HEAD_FACIAL_HAIR))
sprite_accessory = GLOB.facial_hairstyles_list[facial_hairstyle]
if(sprite_accessory)
- //Create the overlay
+ //Overlay
facial_overlay = mutable_appearance(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER)
- facial_overlay.overlays += emissive_blocker(facial_overlay.icon, facial_overlay.icon_state, location, alpha = hair_alpha)
+ facial_overlay.alpha = facial_hair_alpha
facial_overlay.pixel_y += offsets[1]
//Gradients
facial_hair_gradient_style = LAZYACCESS(human_head_owner.grad_style, GRADIENT_FACIAL_HAIR_KEY)
@@ -87,20 +87,23 @@
facial_hair_gradient_color = LAZYACCESS(human_head_owner.grad_color, GRADIENT_FACIAL_HAIR_KEY)
facial_gradient_overlay = make_gradient_overlay(sprite_accessory.icon, sprite_accessory.icon_state, HAIR_LAYER, GLOB.facial_hair_gradients_list[facial_hair_gradient_style], facial_hair_gradient_color)
facial_gradient_overlay.pixel_y += offsets[1]
+ //Emissive
+ facial_overlay.overlays += emissive_blocker(facial_overlay.icon, facial_overlay.icon_state, location, alpha = facial_hair_alpha)
- facial_overlay.overlays += emissive_blocker(sprite_accessory.icon, sprite_accessory.icon_state, location, alpha = hair_alpha)
-
- if(!hair_hidden && !show_debrained && (HAIR in species_flags_list))
+ if(!show_debrained && !hair_hidden && hair_style && (head_flags & HEAD_HAIR))
sprite_accessory = GLOB.hairstyles_list[hair_style]
if(sprite_accessory)
+ //Overlay
hair_overlay = mutable_appearance(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER)
- hair_overlay.overlays += emissive_blocker(hair_overlay.icon, hair_overlay.icon_state, location, alpha = hair_alpha)
+ hair_overlay.alpha = hair_alpha
+ //Gradients
hair_gradient_style = LAZYACCESS(human_head_owner.grad_style, GRADIENT_HAIR_KEY)
if(hair_gradient_style)
hair_gradient_color = LAZYACCESS(human_head_owner.grad_color, GRADIENT_HAIR_KEY)
hair_gradient_overlay = make_gradient_overlay(sprite_accessory.icon, sprite_accessory.icon_state, HAIR_LAYER, GLOB.hair_gradients_list[hair_gradient_style], hair_gradient_color)
+ //Emissive
+ hair_overlay.overlays += emissive_blocker(hair_overlay.icon, hair_overlay.icon_state, location, alpha = hair_alpha)
- //CREATION-ONLY END
//HAIR COLOR START
if(!override_hair_color)
if(hair_color_source)
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index 5aeb7363ddf3..e64c8b271e01 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -38,38 +38,60 @@
var/show_organs_on_examine = TRUE
//Limb appearance info:
- var/real_name = "" //Replacement name
- ///Hair color source
- var/hair_color_source = null
- ///Hair colour and style
- var/hair_color = "#000000"
- ///An override color that can be cleared later.
- var/override_hair_color = null
- ///An override that cannot be cleared under any circumstances
- var/fixed_hair_color = null
+ /// Replacement name
+ var/real_name = ""
+ /// Flags related to appearance, such as hair, lips, etc
+ var/head_flags = HEAD_ALL_FEATURES
+
+ /// Hair style
var/hair_style = "Bald"
+ /// Hair color source
+ var/hair_color_source = null
+ /// Hair colour and style
+ var/hair_color = "#000000"
+ /// Hair alpha
var/hair_alpha = 255
+ /// Hair gradient style, if any
var/hair_gradient_style = null
+ /// Hair gradient color, if any
var/hair_gradient_color = null
- //Facial hair colour and style
- var/facial_hair_color = "#000000"
+ /// Is the hair currently hidden by something?
+ var/hair_hidden = FALSE
+
+ ///Facial hair style
var/facial_hairstyle = "Shaved"
+ ///Facial hair color
+ var/facial_hair_color = "#000000"
+ ///Facial hair alpha
+ var/facial_hair_alpha = 255
+ ///Facial hair gradient style, if any
var/facial_hair_gradient_style = null
+ ///Facial hair gradient color, if any
var/facial_hair_gradient_color = null
- ///Is the hair currently hidden by something?
- var/hair_hidden
///Is the facial hair currently hidden by something?
- var/facial_hair_hidden
- ///Draw this head as "debrained"
- VAR_PROTECTED/show_debrained = FALSE
-
+ var/facial_hair_hidden = FALSE
+ /// An override color that can be cleared later, affects both hair and facial hair
+ var/override_hair_color = null
+ /// An override that cannot be cleared under any circumstances, affects both hair and facial hair
+ var/fixed_hair_color = null
+ ///Type of lipstick being used, basically
var/lip_style
+ ///Lipstick color
var/lip_color = "white"
+ ///Current lipstick trait, if any (such as TRAIT_KISS_OF_DEATH)
var/stored_lipstick_trait
+
+ ///Draw this head as "debrained"
+ VAR_PROTECTED/show_debrained = FALSE
+ ///Draw this head as missing eyes
+ VAR_PROTECTED/show_missing_eyes = FALSE
+
+ ///The image for lipstick
+ var/mutable_appearance/lip_overlay
///The image for hair
var/mutable_appearance/hair_overlay
///The image for hair gradient
@@ -184,60 +206,53 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/obj/item/bodypart/head/get_limb_icon(dropped, draw_external_organs)
- cut_overlays()
. = ..()
- if(dropped) //certain overlays only appear when the limb is being detached from its owner.
-
- if(IS_ORGANIC_LIMB(src)) //having a robotic head hides certain features.
- //facial hair
- if(facial_hairstyle && (FACEHAIR in species_flags_list))
- var/datum/sprite_accessory/sprite = GLOB.facial_hairstyles_list[facial_hairstyle]
- if(sprite)
- var/image/facial_overlay = image(sprite.icon, "[sprite.icon_state]", -HAIR_LAYER, SOUTH)
- facial_overlay.color = facial_hair_color
- facial_overlay.alpha = hair_alpha
- . += facial_overlay
-
- if(!eyes)
- . += image('icons/mob/species/human/human_face.dmi', "eyes_missing", -FACE_LAYER, SOUTH)
-
- //Applies the debrained overlay if there is no brain
- if(!brain)
- var/image/debrain_overlay = image(layer = -HAIR_LAYER, dir = SOUTH)
- if(bodytype & BODYTYPE_ALIEN)
- debrain_overlay.icon = 'icons/mob/species/alien/bodyparts.dmi'
- debrain_overlay.icon_state = "debrained_alien"
- else if(bodytype & BODYTYPE_LARVA_PLACEHOLDER)
- debrain_overlay.icon = 'icons/mob/species/alien/bodyparts.dmi'
- debrain_overlay.icon_state = "debrained_larva"
- else if(!(TRAIT_NOBLOOD in species_flags_list))
- debrain_overlay.icon = 'icons/mob/species/human/human_face.dmi'
- debrain_overlay.icon_state = "debrained"
- . += debrain_overlay
- else
- var/datum/sprite_accessory/sprite2 = GLOB.roundstart_hairstyles_list[hair_style]
- if(sprite2 && (HAIR in species_flags_list))
- var/image/hair_overlay = image(sprite2.icon, "[sprite2.icon_state]", -HAIR_LAYER, SOUTH)
- hair_overlay.color = hair_color
- hair_overlay.alpha = hair_alpha
- . += hair_overlay
-
+ // logic for the overlays changes when dropped (ugh, rework this later if possible)
+ if(dropped)
+ //BAHHHH don't do any of this if we are husked
+ if(is_husked)
+ return .
// lipstick
- if(lip_style)
+ if(lip_style && (head_flags & HEAD_LIPS))
var/image/lips_overlay = image('icons/mob/species/human/human_face.dmi', "lips_[lip_style]", -FACE_LAYER, SOUTH)
lips_overlay.color = lip_color
+ worn_face_offset?.apply_offset(lips_overlay)
. += lips_overlay
+
+ //facial hair
+ if(facial_hairstyle && (head_flags & HEAD_FACIAL_HAIR))
+ var/datum/sprite_accessory/facial_hair_sprite = GLOB.facial_hairstyles_list[facial_hairstyle]
+ if(facial_hair_sprite)
+ var/image/facial_overlay = image(facial_hair_sprite.icon, "[facial_hair_sprite.icon_state]", -HAIR_LAYER, SOUTH)
+ facial_overlay.color = facial_hair_color
+ facial_overlay.alpha = hair_alpha
+ . += facial_overlay
+
+ //Applies the debrained overlay if there is no brain
+ if(!brain && (head_flags & HEAD_DEBRAIN))
+ . += get_debrain_overlay(can_rotate = FALSE)
+ //Otherwise, applies hair
+ else if(hair_style && (head_flags & HEAD_HAIR))
+ var/datum/sprite_accessory/hair_sprite = GLOB.hairstyles_list[hair_style]
+ if(hair_sprite && (head_flags & HEAD_HAIR))
+ var/image/hair_overlay = image(hair_sprite.icon, "[hair_sprite.icon_state]", -HAIR_LAYER, SOUTH)
+ hair_overlay.color = hair_color
+ hair_overlay.alpha = hair_alpha
+ . += hair_overlay
+
// eyes
- if(eyes) // This is a bit of copy/paste code from eyes.dm:generate_body_overlay
+ // This is a bit of copy/paste code from eyes.dm:generate_body_overlay
+ if(eyes?.eye_icon_state && (head_flags & HEAD_EYESPRITES))
var/image/eye_left = image('icons/mob/species/human/human_face.dmi', "[eyes.eye_icon_state]_l", -FACE_LAYER, SOUTH)
var/image/eye_right = image('icons/mob/species/human/human_face.dmi', "[eyes.eye_icon_state]_r", -FACE_LAYER, SOUTH)
- if(eyes.eye_color_left)
- eye_left.color = eyes.eye_color_left
- if(eyes.eye_color_right)
- eye_right.color = eyes.eye_color_right
+ if(head_flags & HEAD_EYECOLOR)
+ if(eyes.eye_color_left)
+ eye_left.color = eyes.eye_color_left
+ if(eyes.eye_color_right)
+ eye_right.color = eyes.eye_color_right
if(eyes.overlay_ignore_lighting)
eye_left.overlays += emissive_appearance(eye_left.icon, eye_left.icon_state, src, alpha = eye_left.alpha)
eye_right.overlays += emissive_appearance(eye_right.icon, eye_right.icon_state, src, alpha = eye_right.alpha)
@@ -248,21 +263,32 @@
. += eye_left
. += eye_right
else
- if(!facial_hair_hidden && facial_overlay && (FACEHAIR in species_flags_list))
+ if(lip_overlay && (head_flags & HEAD_LIPS))
+ worn_face_offset?.apply_offset(lip_overlay)
+ . += lip_overlay
+
+ if(!facial_hair_hidden && facial_overlay && (head_flags & HEAD_FACIAL_HAIR))
facial_overlay.alpha = hair_alpha
. += facial_overlay
if(facial_gradient_overlay)
. += facial_gradient_overlay
- if(show_debrained)
+ if(show_debrained && (head_flags & HEAD_DEBRAIN))
. += mutable_appearance('icons/mob/species/human/human_face.dmi', "debrained", HAIR_LAYER)
- else if(!hair_hidden && hair_overlay && (HAIR in species_flags_list))
+ else if(!hair_hidden && hair_overlay && (head_flags & HEAD_HAIR))
hair_overlay.alpha = hair_alpha
. += hair_overlay
if(hair_gradient_overlay)
. += hair_gradient_overlay
+ if(show_missing_eyes && (head_flags && HEAD_EYEHOLES))
+ var/mutable_appearance/no_eyes = mutable_appearance('icons/mob/species/human/human_face.dmi', "eyes_missing", -BODY_LAYER)
+ worn_face_offset?.apply_offset(no_eyes)
+ . += no_eyes
+
+ return
+
/mob/living/proc/set_haircolor(hex_string, override)
return
@@ -297,6 +323,30 @@
say(message, language, sanitize = FALSE)
return NOPASS
+/// Returns an appropriate debrained icon state
+/obj/item/bodypart/head/proc/get_debrain_overlay(can_rotate = TRUE)
+ var/debrain_icon = 'icons/mob/species/human/human_face.dmi'
+ var/debrain_icon_state = "debrained"
+ if(bodytype & BODYTYPE_ALIEN)
+ debrain_icon = 'icons/mob/species/alien/bodyparts.dmi'
+ debrain_icon_state = "debrained_alien"
+ else if(bodytype & BODYTYPE_LARVA_PLACEHOLDER)
+ debrain_icon = 'icons/mob/species/alien/bodyparts.dmi'
+ debrain_icon_state = "debrained_larva"
+ else if(bodytype & BODYTYPE_GOLEM)
+ debrain_icon = 'icons/mob/species/golems.dmi'
+ debrain_icon_state = "debrained"
+
+ var/image/debrain_overlay
+ if(can_rotate)
+ debrain_overlay = mutable_appearance(debrain_icon, debrain_icon_state, HAIR_LAYER)
+ else
+ debrain_overlay = image(debrain_icon, debrain_icon_state, -HAIR_LAYER, SOUTH)
+ return debrain_overlay
+
+/mob/living/proc/set_haircolor(hex_string, override)
+ return
+
/obj/item/bodypart/head/GetVoice()
return "The head of [real_name]"
@@ -311,6 +361,7 @@
should_draw_greyscale = FALSE
dmg_overlay_type = SPECIES_MONKEY
is_dimorphic = FALSE
+ head_flags = HEAD_LIPS|HEAD_DEBRAIN
/obj/item/bodypart/head/alien
icon = 'icons/mob/species/alien/bodyparts.dmi'
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index 710b0a1da3ca..2b9d1bd5c96e 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -156,8 +156,7 @@
if(BODY_ZONE_CHEST)
new_bodypart = new /obj/item/bodypart/chest/alien()
if(new_bodypart)
- new_bodypart.update_limb(src)
-
+ new_bodypart.update_limb(is_creating = TRUE)
/proc/skintone2hex(skin_tone)
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index 076b4b4d630e..a45c1d5446dc 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -277,6 +277,8 @@
damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT)
+ head_flags = HEAD_EYESPRITES
+
var/obj/item/assembly/flash/handheld/flash1 = null
var/obj/item/assembly/flash/handheld/flash2 = null
diff --git a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
index 767ee35cb7d7..a60232a5756d 100644
--- a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
@@ -13,6 +13,7 @@
var/mob/living/carbon/human/potato_oc = owner
var/datum/species/ethereal/eth_holder = potato_oc.dna.species
species_color = eth_holder.current_color
+ head_flags = HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
/obj/item/bodypart/chest/ethereal
icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi'
diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
index 08622f070176..7f0c242eca38 100644
--- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
@@ -2,6 +2,7 @@
icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
limb_id = SPECIES_LIZARD
is_dimorphic = FALSE
+ head_flags = HEAD_HAIR|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
/obj/item/bodypart/chest/lizard
icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index db612f440be9..12f98649e2d3 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -2,6 +2,7 @@
/obj/item/bodypart/head/snail
limb_id = SPECIES_SNAIL
is_dimorphic = FALSE
+ head_flags = HEAD_ALL_FEATURES
/obj/item/bodypart/chest/snail
limb_id = SPECIES_SNAIL
@@ -31,6 +32,7 @@
limb_id = SPECIES_ABDUCTOR
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ head_flags = HEAD_ALL_FEATURES
/obj/item/bodypart/chest/abductor
limb_id = SPECIES_ABDUCTOR
@@ -61,6 +63,7 @@
limb_id = SPECIES_JELLYPERSON
is_dimorphic = TRUE
dmg_overlay_type = null
+ head_flags = HEAD_ALL_FEATURES
/obj/item/bodypart/chest/jelly
biological_state = (BIO_FLESH|BIO_BLOODED)
@@ -93,6 +96,7 @@
biological_state = (BIO_FLESH|BIO_BLOODED)
limb_id = SPECIES_SLIMEPERSON
is_dimorphic = FALSE
+ head_flags = HEAD_ALL_FEATURES
/obj/item/bodypart/chest/slime
biological_state = (BIO_FLESH|BIO_BLOODED)
@@ -120,6 +124,7 @@
biological_state = (BIO_FLESH|BIO_BLOODED)
limb_id = SPECIES_LUMINESCENT
is_dimorphic = TRUE
+ head_flags = HEAD_ALL_FEATURES
/obj/item/bodypart/chest/luminescent
biological_state = (BIO_FLESH|BIO_BLOODED)
@@ -147,6 +152,7 @@
limb_id = SPECIES_ZOMBIE
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ head_flags = HEAD_EYESPRITES | HEAD_DEBRAIN
/obj/item/bodypart/chest/zombie
limb_id = SPECIES_ZOMBIE
@@ -203,7 +209,7 @@
limb_id = SPECIES_FLYPERSON
is_dimorphic = FALSE
should_draw_greyscale = FALSE
-
+ head_flags = NONE
/obj/item/bodypart/chest/fly
limb_id = SPECIES_FLYPERSON
is_dimorphic = TRUE
@@ -230,6 +236,7 @@
limb_id = SPECIES_SHADOW
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ head_flags = NONE
/obj/item/bodypart/chest/shadow
limb_id = SPECIES_SHADOW
@@ -301,6 +308,7 @@
/obj/item/bodypart/head/mushroom
limb_id = SPECIES_MUSHROOM
is_dimorphic = TRUE
+ head_flags = NONE
/obj/item/bodypart/chest/mushroom
limb_id = SPECIES_MUSHROOM
@@ -338,6 +346,7 @@
limb_id = SPECIES_GOLEM
is_dimorphic = FALSE
dmg_overlay_type = null
+ head_flags = NONE
/obj/item/bodypart/chest/golem
biological_state = BIO_BONE
@@ -413,6 +422,7 @@
limb_id = SPECIES_GOLEM_CULT
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ head_flags = NONE
/obj/item/bodypart/chest/golem/cult
limb_id = SPECIES_GOLEM_CULT
diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
index c23b935176ba..63e927440935 100644
--- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
@@ -5,6 +5,7 @@
limb_id = SPECIES_MOTH
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ head_flags = HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
/obj/item/bodypart/chest/moth
icon = 'icons/mob/species/moth/bodyparts.dmi'
diff --git a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm
index 3756cee1e8b3..fad07868ea04 100644
--- a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm
@@ -7,6 +7,7 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
dmg_overlay_type = null
+ head_flags = HEAD_EYESPRITES
/obj/item/bodypart/chest/plasmaman
icon = 'icons/mob/species/plasmaman/bodyparts.dmi'
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index aaadb308076d..02a43c17bf54 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -56,7 +56,7 @@
return
eye_recipient.cure_blind(NO_EYES)
apply_damaged_eye_effects()
- refresh(eye_recipient, inserting = TRUE)
+ refresh(eye_recipient, inserting = TRUE, call_update = TRUE)
/// Refreshes the visuals of the eyes
/// If call_update is TRUE, we also will call update_body
@@ -85,7 +85,7 @@
affected_human.add_fov_trait(type, native_fov)
if(call_update)
- affected_human.dna?.species?.handle_body(affected_human) //updates eye icon
+ affected_human.update_body()
/obj/item/organ/internal/eyes/Remove(mob/living/carbon/eye_owner, special = FALSE)
. = ..()
diff --git a/monkestation/code/modules/botany/species/apid/bodyparts.dm b/monkestation/code/modules/botany/species/apid/bodyparts.dm
index 14f0fe6ddf3d..c41e5dcac259 100644
--- a/monkestation/code/modules/botany/species/apid/bodyparts.dm
+++ b/monkestation/code/modules/botany/species/apid/bodyparts.dm
@@ -5,6 +5,8 @@
limb_id = SPECIES_APID
is_dimorphic = TRUE
should_draw_greyscale = FALSE
+ brute_modifier = 1.25 //ethereal are weak to brute damage
+ head_flags = HEAD_HAIR|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
/obj/item/bodypart/chest/apid
icon = 'monkestation/code/modules/botany/icons/apid_sprites.dmi'
diff --git a/monkestation/code/modules/surgery/bodyparts/arachnid_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/arachnid_bodyparts.dm
index 92f15fcadb91..578b83010281 100644
--- a/monkestation/code/modules/surgery/bodyparts/arachnid_bodyparts.dm
+++ b/monkestation/code/modules/surgery/bodyparts/arachnid_bodyparts.dm
@@ -2,6 +2,7 @@
icon_greyscale = 'monkestation/icons/mob/species/arachnid/bodyparts.dmi'
limb_id = SPECIES_ARACHNIDS
is_dimorphic = FALSE
+ head_flags = HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
/obj/item/bodypart/chest/arachnid
icon_greyscale = 'monkestation/icons/mob/species/arachnid/bodyparts.dmi'
diff --git a/monkestation/code/modules/surgery/bodyparts/clockwork_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/clockwork_bodyparts.dm
index 3c48e54f763f..7c3e0061c5f8 100644
--- a/monkestation/code/modules/surgery/bodyparts/clockwork_bodyparts.dm
+++ b/monkestation/code/modules/surgery/bodyparts/clockwork_bodyparts.dm
@@ -88,7 +88,7 @@
burn_modifier = 0.95
damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT)
disabling_threshold_percentage = 1
-
+ head_flags = NONE
/obj/item/bodypart/chest/robot/clockwork
name = "clockwork torso"
diff --git a/monkestation/code/modules/surgery/bodyparts/ethereal_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/ethereal_bodyparts.dm
index 85db21d7e072..fe7b7d994527 100644
--- a/monkestation/code/modules/surgery/bodyparts/ethereal_bodyparts.dm
+++ b/monkestation/code/modules/surgery/bodyparts/ethereal_bodyparts.dm
@@ -1,6 +1,7 @@
/obj/item/bodypart/head/ethereal
icon_greyscale ='monkestation/icons/mob/species/ethereal/bodyparts.dmi'
is_dimorphic = TRUE
+ head_flags = HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
/obj/item/bodypart/chest/ethereal
icon_greyscale = 'monkestation/icons/mob/species/ethereal/bodyparts.dmi'
diff --git a/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm
index e7751c56c7ca..dda88cf77ba7 100644
--- a/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm
+++ b/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm
@@ -2,6 +2,7 @@
icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi'
limb_id = SPECIES_FLORAN
is_dimorphic = FALSE
+ head_flags = HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
/obj/item/bodypart/chest/floran
icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi'
diff --git a/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm
index 522324f44f22..059631cd7ce4 100644
--- a/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm
+++ b/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm
@@ -5,7 +5,7 @@
limb_id = SPECIES_SIMIAN
is_dimorphic = FALSE
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM
-
+ head_flags = HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
dmg_overlay_type = "monkey"
/obj/item/bodypart/chest/simian
From 43d978c72f9652892bdee278ba142d5013bbe0b2 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Mon, 29 Jul 2024 14:23:18 -0600
Subject: [PATCH 04/17] All code applied, Debugging begins
---
.../{hair.dm => head_hair_and_lips.dm} | 0
.../bodyparts/species_parts/misc_bodyparts.dm | 7 +++---
code/modules/surgery/organs/eyes.dm | 22 ++++++++++++-------
.../modules/botany/species/apid/bodyparts.dm | 2 +-
.../modules/botany/species/apid/species.dm | 6 +----
tgstation.dme | 4 ++--
6 files changed, 22 insertions(+), 19 deletions(-)
rename code/modules/surgery/bodyparts/{hair.dm => head_hair_and_lips.dm} (100%)
diff --git a/code/modules/surgery/bodyparts/hair.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm
similarity index 100%
rename from code/modules/surgery/bodyparts/hair.dm
rename to code/modules/surgery/bodyparts/head_hair_and_lips.dm
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index 12f98649e2d3..82520ed4017b 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -2,7 +2,7 @@
/obj/item/bodypart/head/snail
limb_id = SPECIES_SNAIL
is_dimorphic = FALSE
- head_flags = HEAD_ALL_FEATURES
+ head_flags = head_flags = HEAD_EYESPRITES|HEAD_DEBRAIN
/obj/item/bodypart/chest/snail
limb_id = SPECIES_SNAIL
@@ -32,7 +32,7 @@
limb_id = SPECIES_ABDUCTOR
is_dimorphic = FALSE
should_draw_greyscale = FALSE
- head_flags = HEAD_ALL_FEATURES
+ head_flags = NONE
/obj/item/bodypart/chest/abductor
limb_id = SPECIES_ABDUCTOR
@@ -118,13 +118,14 @@
/obj/item/bodypart/leg/right/slime
biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED)
limb_id = SPECIES_SLIMEPERSON
+ head_flags = HEAD_ALL_FEATURES
+
///LUMINESCENT
/obj/item/bodypart/head/luminescent
biological_state = (BIO_FLESH|BIO_BLOODED)
limb_id = SPECIES_LUMINESCENT
is_dimorphic = TRUE
- head_flags = HEAD_ALL_FEATURES
/obj/item/bodypart/chest/luminescent
biological_state = (BIO_FLESH|BIO_BLOODED)
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 02a43c17bf54..b418e152b0dd 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -95,10 +95,9 @@
human_owner.eye_color_left = old_eye_color_left
if(initial(eye_color_right))
human_owner.eye_color_right = old_eye_color_right
- human_owner.update_body()
if(native_fov)
eye_owner.remove_fov_trait(type)
-
+ human_owner.update_body()
// Cure blindness from eye damage
eye_owner.cure_blind(EYE_DAMAGE)
eye_owner.cure_nearsighted(EYE_DAMAGE)
@@ -124,17 +123,24 @@
var/mutable_appearance/eye_left = mutable_appearance(eye_icon, "[eye_icon_state]_l", -FACE_LAYER)
var/mutable_appearance/eye_right = mutable_appearance(eye_icon, "[eye_icon_state]_r", -FACE_LAYER)
- var/list/overlays = list(eye_left, eye_right)
-
- if(EYECOLOR in parent.dna?.species.species_traits)
- eye_right.color = eye_color_right
- eye_left.color = eye_color_left
var/obscured = parent.check_obscured_slots(TRUE)
if(overlay_ignore_lighting && !(obscured & ITEM_SLOT_EYES))
overlays += emissive_appearance_copy(eye_left, src, NONE)
overlays += emissive_appearance_copy(eye_right, src, NONE)
+ var/obj/item/bodypart/head/my_head = parent.get_bodypart(BODY_ZONE_HEAD)
+ if(my_head)
+ if(my_head.head_flags & HEAD_EYECOLOR)
+ eye_right.color = eye_color_right
+ eye_left.color = eye_color_left
+ if(my_head.worn_face_offset)
+ my_head.worn_face_offset.apply_offset(eye_left)
+ my_head.worn_face_offset.apply_offset(eye_right)
+
+ return list(eye_left, eye_right)
+
+ /*
if(OFFSET_FACE in parent.dna?.species.offset_features)
var/offset = parent.dna.species.offset_features[OFFSET_FACE]
for(var/mutable_appearance/overlay in overlays)
@@ -142,7 +148,7 @@
overlay.pixel_y += offset[OFFSET_Y]
return overlays
-
+ */
#undef OFFSET_X
#undef OFFSET_Y
diff --git a/monkestation/code/modules/botany/species/apid/bodyparts.dm b/monkestation/code/modules/botany/species/apid/bodyparts.dm
index c41e5dcac259..b38c15567d4e 100644
--- a/monkestation/code/modules/botany/species/apid/bodyparts.dm
+++ b/monkestation/code/modules/botany/species/apid/bodyparts.dm
@@ -6,7 +6,7 @@
is_dimorphic = TRUE
should_draw_greyscale = FALSE
brute_modifier = 1.25 //ethereal are weak to brute damage
- head_flags = HEAD_HAIR|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
+ head_flags = HEAD_HAIR| HEAD_LIPS | HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN
/obj/item/bodypart/chest/apid
icon = 'monkestation/code/modules/botany/icons/apid_sprites.dmi'
diff --git a/monkestation/code/modules/botany/species/apid/species.dm b/monkestation/code/modules/botany/species/apid/species.dm
index 5424db2b397a..cd67ebf48993 100644
--- a/monkestation/code/modules/botany/species/apid/species.dm
+++ b/monkestation/code/modules/botany/species/apid/species.dm
@@ -27,11 +27,7 @@
name = "\improper Apid"
plural_form = "Apids"
id = SPECIES_APID
- species_traits = list(
- LIPS,
- HAS_MARKINGS,
- HAIR
- )
+ species_traits = list(HAS_MARKINGS,)
/*
mutant_bodyparts = list(
diff --git a/tgstation.dme b/tgstation.dme
index 5a26bb276b5f..82660e406bcf 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -224,6 +224,7 @@
#include "code\__DEFINES\species_clothing_paths.dm"
#include "code\__DEFINES\speech_channels.dm"
#include "code\__DEFINES\speech_controller.dm"
+#include "code\__DEFINES\sprite_accessories.dm"
#include "code\__DEFINES\stack_trace.dm"
#include "code\__DEFINES\stamina.dm"
#include "code\__DEFINES\stat.dm"
@@ -5398,8 +5399,7 @@
#include "code\modules\surgery\bodyparts\_bodyparts.dm"
#include "code\modules\surgery\bodyparts\digitigrade.dm"
#include "code\modules\surgery\bodyparts\dismemberment.dm"
-#include "code\modules\surgery\bodyparts\hair.dm"
-#include "code\modules\surgery\bodyparts\head.dm"
+#include "code\modules\surgery\bodyparts\head_hair_and_lips.dm"
#include "code\modules\surgery\bodyparts\helpers.dm"
#include "code\modules\surgery\bodyparts\parts.dm"
#include "code\modules\surgery\bodyparts\robot_bodyparts.dm"
From fb3ede70c7b1187fc29877ea96d0cb47959a3bd9 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Tue, 30 Jul 2024 09:46:06 -0600
Subject: [PATCH 05/17] Removed duplicate stuff in cosmetics and moved relevent
razor stuff to barber fixed bugs forgot satyrs exist
---
code/__DEFINES/traits.dm | 2 ++
code/_globalvars/traits.dm | 1 +
code/game/objects/items/cosmetics.dm | 2 +-
code/modules/surgery/bodyparts/head_hair_and_lips.dm | 2 +-
.../modules/surgery/bodyparts/species_parts/misc_bodyparts.dm | 4 +---
.../mob/dead/new_player/sprite_accessories/ipc_screens.dm | 2 +-
.../modules/mob/living/carbon/human/species_type/simian.dm | 1 +
monkestation/code/modules/ranching/satyr/bodyparts.dm | 1 +
monkestation/code/modules/ranching/satyr/species.dm | 3 ---
.../code/modules/smithing/ipcs/body/base_bodyparts.dm | 1 +
monkestation/code/modules/smithing/ipcs/species.dm | 3 ---
tgstation.dme | 1 +
12 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 5d7ebb88be40..5f0744e511b6 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -245,6 +245,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_VIRUSIMMUNE "virus_immunity"
#define TRAIT_PIERCEIMMUNE "pierce_immunity"
#define TRAIT_NODISMEMBER "dismember_immunity"
+/// This carbon doesn't show an overlay when they have no brain
+#define TRAIT_NO_DEBRAIN_OVERLAY "no_debrain_overlay"
#define TRAIT_NOFIRE "nonflammable"
#define TRAIT_NOFIRE_SPREAD "no_fire_spreading"
/// Prevents plasmamen from self-igniting if only their helmet is missing
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 5822fcfe5dbc..51a06e09d173 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -61,6 +61,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE,
"TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE,
"TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER,
+ "TRAIT_NO_DEBRAIN_OVERLAY" = TRAIT_NO_DEBRAIN_OVERLAY,
"TRAIT_NOFIRE" = TRAIT_NOFIRE,
"TRAIT_NOGUNS" = TRAIT_NOGUNS,
"TRAIT_NOHUNGER" = TRAIT_NOHUNGER,
diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm
index 92a9aba12a16..b5b089bc6f83 100644
--- a/code/game/objects/items/cosmetics.dm
+++ b/code/game/objects/items/cosmetics.dm
@@ -73,7 +73,7 @@
/obj/item/lipstick/random/Initialize(mapload)
. = ..()
icon_state = "lipstick"
- var/static/list/possible_colors
+ var/static/list/possible_colors
if(!possible_colors)
possible_colors = list()
for(var/obj/item/lipstick/lipstick_path as anything in (typesof(/obj/item/lipstick) - src.type))
diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm
index 842d706f5586..9e0278cb877a 100644
--- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm
+++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm
@@ -30,7 +30,7 @@
if(item_uniform.flags_inv & HIDEHAIR)
hair_hidden = TRUE
if(item_uniform.flags_inv & HIDEFACIALHAIR)
- facial_hair_hidden = TRUE
+ facial_hair_hidden = TRUE
//invisibility and husk stuff
if(HAS_TRAIT(human_head_owner, TRAIT_INVISIBLE_MAN) || HAS_TRAIT(human_head_owner, TRAIT_HUSK))
hair_hidden = TRUE
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index 82520ed4017b..f1e86b85bf6b 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -2,7 +2,7 @@
/obj/item/bodypart/head/snail
limb_id = SPECIES_SNAIL
is_dimorphic = FALSE
- head_flags = head_flags = HEAD_EYESPRITES|HEAD_DEBRAIN
+ head_flags = HEAD_EYESPRITES|HEAD_DEBRAIN
/obj/item/bodypart/chest/snail
limb_id = SPECIES_SNAIL
@@ -118,8 +118,6 @@
/obj/item/bodypart/leg/right/slime
biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED)
limb_id = SPECIES_SLIMEPERSON
- head_flags = HEAD_ALL_FEATURES
-
///LUMINESCENT
/obj/item/bodypart/head/luminescent
diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/ipc_screens.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/ipc_screens.dm
index 7b46fbbae052..9bc2c7f81161 100644
--- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/ipc_screens.dm
+++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/ipc_screens.dm
@@ -1,6 +1,6 @@
/datum/sprite_accessory/ipc_screens
icon = 'monkestation/icons/mob/species/ipc/ipc_screens.dmi'
- color_src = EYECOLOR
+ color_src = HEAD_EYECOLOR
is_emissive = TRUE
/datum/sprite_accessory/ipc_screens/blue
diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm
index 77992e1cc48b..d3e17e50bb00 100644
--- a/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm
+++ b/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm
@@ -8,6 +8,7 @@
species_traits = list(
NO_UNDERWEAR,
SPECIES_FUR,
+ SKINTONES,
)
inherent_traits = list(
TRAIT_VAULTING,
diff --git a/monkestation/code/modules/ranching/satyr/bodyparts.dm b/monkestation/code/modules/ranching/satyr/bodyparts.dm
index ff24f3dc4515..9cef606382c2 100644
--- a/monkestation/code/modules/ranching/satyr/bodyparts.dm
+++ b/monkestation/code/modules/ranching/satyr/bodyparts.dm
@@ -2,6 +2,7 @@
icon_greyscale = 'monkestation/code/modules/ranching/icons/bodyparts.dmi'
limb_id = SPECIES_SATYR
is_dimorphic = TRUE
+ head_flags = HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_EYESPRITES|HEAD_EYECOLOR | HEAD_EYEHOLES|HEAD_DEBRAIN
/obj/item/bodypart/chest/satyr
icon_greyscale = 'monkestation/code/modules/ranching/icons/bodyparts.dmi'
diff --git a/monkestation/code/modules/ranching/satyr/species.dm b/monkestation/code/modules/ranching/satyr/species.dm
index 2ab8c9f1377d..fee044fc78f7 100644
--- a/monkestation/code/modules/ranching/satyr/species.dm
+++ b/monkestation/code/modules/ranching/satyr/species.dm
@@ -6,9 +6,6 @@
no_equip_flags = ITEM_SLOT_FEET
sexes = TRUE
species_traits = list(
- EYECOLOR,
- HAIR,
- FACEHAIR,
NO_UNDERWEAR,
)
inherent_traits = list(
diff --git a/monkestation/code/modules/smithing/ipcs/body/base_bodyparts.dm b/monkestation/code/modules/smithing/ipcs/body/base_bodyparts.dm
index 1b5085b89a56..f7b2992cc97d 100644
--- a/monkestation/code/modules/smithing/ipcs/body/base_bodyparts.dm
+++ b/monkestation/code/modules/smithing/ipcs/body/base_bodyparts.dm
@@ -8,6 +8,7 @@
should_draw_greyscale = FALSE
biological_state = BIO_ROBOTIC
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC
+ head_flags = HEAD_HAIR | HEAD_LIPS | HEAD_EYECOLOR
body_damage_coeff = 1.1 //IPC's Head can dismember //Monkestation Edit
max_damage = 40 //Keep in mind that this value is used in the //Monkestation Edit
diff --git a/monkestation/code/modules/smithing/ipcs/species.dm b/monkestation/code/modules/smithing/ipcs/species.dm
index 44bc9ade80be..67a4e639065d 100644
--- a/monkestation/code/modules/smithing/ipcs/species.dm
+++ b/monkestation/code/modules/smithing/ipcs/species.dm
@@ -28,9 +28,6 @@
species_traits = list(
NO_DNA_COPY,
- EYECOLOR,
- LIPS,
- HAIR,
NOEYESPRITES,
NOTRANSSTING,
NOHUSK
diff --git a/tgstation.dme b/tgstation.dme
index 82660e406bcf..7e14a892a1c9 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -5399,6 +5399,7 @@
#include "code\modules\surgery\bodyparts\_bodyparts.dm"
#include "code\modules\surgery\bodyparts\digitigrade.dm"
#include "code\modules\surgery\bodyparts\dismemberment.dm"
+#include "code\modules\surgery\bodyparts\head.dm"
#include "code\modules\surgery\bodyparts\head_hair_and_lips.dm"
#include "code\modules\surgery\bodyparts\helpers.dm"
#include "code\modules\surgery\bodyparts\parts.dm"
From 5b35173aef233ba5265e6b628683af8864a6faf0 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Tue, 30 Jul 2024 09:47:19 -0600
Subject: [PATCH 06/17] hoot hoot more owl
---
code/__DEFINES/DNA.dm | 1 +
code/game/objects/items/cosmetics.dm | 162 ------------------
.../mob/living/carbon/human/_species.dm | 37 +---
.../carbon/human/species_types/mushpeople.dm | 2 -
code/modules/surgery/bodyparts/head.dm | 10 --
.../bodyparts/species_parts/misc_bodyparts.dm | 2 +
code/modules/surgery/organs/eyes.dm | 27 ++-
.../code/modules/blueshift/items/barber.dm | 29 +++-
.../satyr/accessories/sprites/fluff.dm | 2 +-
.../satyr/accessories/sprites/tail.dm | 2 +-
.../modules/smithing/oozelings/species.dm | 2 -
11 files changed, 53 insertions(+), 223 deletions(-)
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index b78fa6389621..ed8b47ddadd7 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -78,6 +78,7 @@
#define ANIME 7
#define MUTCOLORS_SECONDARY 8
#define SPECIES_FUR 9
+#define SKINTONES 10
/// Use this if you want to change the race's color without the player being able to pick their own color. AKA special color shifting
#define DYNCOLORS 7
diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm
index b5b089bc6f83..3171bd2d8ef1 100644
--- a/code/game/objects/items/cosmetics.dm
+++ b/code/game/objects/items/cosmetics.dm
@@ -41,7 +41,6 @@
lipstick_color = COLOR_PURPLE
/obj/item/lipstick/jade
- //It's still called Jade, but theres no HTML color for jade, so we use lime.
name = "jade lipstick"
lipstick_color = COLOR_JADE
@@ -138,164 +137,3 @@
user.visible_message(span_notice("[user] wipes [target]'s lipstick off with \the [src]."), \
span_notice("You wipe off [target]'s lipstick."))
target.update_lips(null)
-
-
-/obj/item/razor
- name = "electric razor"
- desc = "The latest and greatest power razor born from the science of shaving."
- icon = 'icons/obj/cosmetic.dmi'
- icon_state = "razor"
- inhand_icon_state = "razor"
- toolspeed = 1
- flags_1 = CONDUCT_1
- w_class = WEIGHT_CLASS_TINY
- var/unlocked = FALSE //for unlocking super hairstyles
-
-/obj/item/razor/suicide_act(mob/living/carbon/user)
- user.visible_message(span_suicide("[user] begins shaving [user.p_them()]self without the razor guard! It looks like [user.p_theyre()] trying to commit suicide!"))
- shave(user, BODY_ZONE_PRECISE_MOUTH)
- shave(user, BODY_ZONE_HEAD)//doesnt need to be BODY_ZONE_HEAD specifically, but whatever
- return BRUTELOSS
-
-/obj/item/razor/proc/shave(mob/living/carbon/human/skinhead, location = BODY_ZONE_PRECISE_MOUTH)
- if(location == BODY_ZONE_PRECISE_MOUTH)
- skinhead.facial_hairstyle = "Shaved"
- else
- skinhead.hairstyle = "Skinhead"
-
- skinhead.update_body_parts()
- playsound(loc, 'sound/items/welder2.ogg', 20, TRUE)
-
-/obj/item/razor/attack(mob/target_mob, mob/living/user, params)
- if(!ishuman(target_mob))
- return ..()
- var/mob/living/carbon/human/human_target = target_mob
- var/obj/item/bodypart/head/noggin = human_target.get_bodypart(BODY_ZONE_HEAD)
- var/location = user.zone_selected
- var/static/list/head_zones = list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD)
- if(!noggin && (location in head_zones))
- to_chat(user, span_warning("[human_target] doesn't have a head!"))
- return
- if(location == BODY_ZONE_PRECISE_MOUTH)
- if(!user.combat_mode)
- if(human_target.gender == MALE)
- if(human_target == user)
- to_chat(user, span_warning("You need a mirror to properly style your own facial hair!"))
- return
- if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH))
- return
- var/new_style = tgui_input_list(user, "Select a facial hairstyle", "Grooming", GLOB.facial_hairstyles_list)
- if(isnull(new_style))
- return
- if(!get_location_accessible(human_target, location))
- to_chat(user, span_warning("The headgear is in the way!"))
- return
- if(!(noggin.head_flags & HEAD_FACIAL_HAIR))
- to_chat(user, span_warning("There is no facial hair to style!"))
- return
- if(HAS_TRAIT(human_target, TRAIT_SHAVED))
- to_chat(user, span_warning("[human_target] is just way too shaved. Like, really really shaved."))
- return
- user.visible_message(span_notice("[user] tries to change [human_target]'s facial hairstyle using [src]."), span_notice("You try to change [human_target]'s facial hairstyle using [src]."))
- if(new_style && do_after(user, 6 SECONDS, target = human_target))
- user.visible_message(span_notice("[user] successfully changes [human_target]'s facial hairstyle using [src]."), span_notice("You successfully change [human_target]'s facial hairstyle using [src]."))
- human_target.facial_hairstyle = new_style
- human_target.update_body_parts(update_limb_data = TRUE)
- return
- else
- return
- else
- if(!get_location_accessible(human_target, location))
- to_chat(user, span_warning("The mask is in the way!"))
- return
- if(!(noggin.head_flags & HEAD_FACIAL_HAIR))
- to_chat(user, span_warning("There is no facial hair to shave!"))
- return
- if(human_target.facial_hairstyle == "Shaved")
- to_chat(user, span_warning("Already clean-shaven!"))
- return
-
- if(human_target == user) //shaving yourself
- user.visible_message(span_notice("[user] starts to shave [user.p_their()] facial hair with [src]."), \
- span_notice("You take a moment to shave your facial hair with [src]..."))
- if(do_after(user, 5 SECONDS, target = user))
- user.visible_message(span_notice("[user] shaves [user.p_their()] facial hair clean with [src]."), \
- span_notice("You finish shaving with [src]. Fast and clean!"))
- shave(user, location)
- return
- else
- user.visible_message(span_warning("[user] tries to shave [human_target]'s facial hair with [src]."), \
- span_notice("You start shaving [human_target]'s facial hair..."))
- if(do_after(user, 5 SECONDS, target = human_target))
- user.visible_message(span_warning("[user] shaves off [human_target]'s facial hair with [src]."), \
- span_notice("You shave [human_target]'s facial hair clean off."))
- shave(human_target, location)
- return
- else if(location == BODY_ZONE_HEAD)
- if(!user.combat_mode)
- if(human_target == user)
- to_chat(user, span_warning("You need a mirror to properly style your own hair!"))
- return
- if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH))
- return
- var/new_style = tgui_input_list(user, "Select a hairstyle", "Grooming", GLOB.hairstyles_list)
- if(isnull(new_style))
- return
- if(!get_location_accessible(human_target, location))
- to_chat(user, span_warning("The headgear is in the way!"))
- return
- if(!(noggin.head_flags & HEAD_HAIR))
- to_chat(user, span_warning("There is no hair to style!"))
- return
- if(HAS_TRAIT(human_target, TRAIT_BALD))
- to_chat(user, span_warning("[human_target] is just way too bald. Like, really really bald."))
- return
- user.visible_message(span_notice("[user] tries to change [human_target]'s hairstyle using [src]."), span_notice("You try to change [human_target]'s hairstyle using [src]."))
- if(new_style && do_after(user, 6 SECONDS, target = human_target))
- user.visible_message(span_notice("[user] successfully changes [human_target]'s hairstyle using [src]."), span_notice("You successfully change [human_target]'s hairstyle using [src]."))
- human_target.hairstyle = new_style
- human_target.update_body_parts(update_limb_data = TRUE)
- return
- else
- if(!get_location_accessible(human_target, location))
- to_chat(user, span_warning("The headgear is in the way!"))
- return
- if(!(noggin.head_flags & HEAD_HAIR))
- to_chat(user, span_warning("There is no hair to shave!"))
- return
- if(human_target.hairstyle == "Bald" || human_target.hairstyle == "Balding Hair" || human_target.hairstyle == "Skinhead")
- to_chat(user, span_warning("There is not enough hair left to shave!"))
- return
-
- if(human_target == user) //shaving yourself
- user.visible_message(span_notice("[user] starts to shave [user.p_their()] head with [src]."), \
- span_notice("You start to shave your head with [src]..."))
- if(do_after(user, 5 SECONDS, target = user))
- user.visible_message(span_notice("[user] shaves [user.p_their()] head with [src]."), \
- span_notice("You finish shaving with [src]."))
- shave(user, location)
- return
- else
- user.visible_message(span_warning("[user] tries to shave [human_target]'s head with [src]!"), \
- span_notice("You start shaving [human_target]'s head..."))
- if(do_after(user, 5 SECONDS, target = human_target))
- user.visible_message(span_warning("[user] shaves [human_target]'s head bald with [src]!"), \
- span_notice("You shave [human_target]'s head bald."))
- shave(human_target, location)
- return
- return ..()
-
-/obj/item/razor/attackby(obj/item/item, mob/user, params)
- .=..()
- if(istype(item, /obj/item/stack/sheet/mineral/bananium))
- if(unlocked)
- to_chat(user, "[src] is already powered by bananium!")
- return
- item.use_tool(src, user, amount=1)
- unlocked = TRUE
- to_chat(user, "You insert the bananium into the battery pack.")
-
-/obj/item/razor/gigarazor
- name = "shmick 9000"
- desc = "It gets the job done."
- unlocked = TRUE
diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm
index 7a528b094226..f890f1c648fd 100644
--- a/code/modules/mob/living/carbon/human/_species.dm
+++ b/code/modules/mob/living/carbon/human/_species.dm
@@ -687,39 +687,20 @@ GLOBAL_LIST_EMPTY(features_by_species)
if(noggin?.head_flags & HEAD_EYESPRITES)
// eyes (missing eye sprites get handled by the head itself, but sadly we have to do this stupid shit here, for now)
var/obj/item/organ/internal/eyes/eye_organ = species_human.get_organ_slot(ORGAN_SLOT_EYES)
-
-
- //Species nuking, this entire if else if for eyes looks fucky needs test
-
if(eye_organ)
eye_organ.refresh(call_update = FALSE)
for(var/mutable_appearance/eye_overlay in eye_organ.generate_body_overlay(species_human))
eye_overlay.pixel_y += height_offset
standing += eye_overlay
- /*
- if(!eye_organ)
- no_eyeslay = mutable_appearance('icons/mob/species/human/human_face.dmi', "eyes_missing", -FACE_LAYER)
- no_eyeslay.pixel_x += add_pixel_x
- no_eyeslay.pixel_y += add_pixel_y
- standing += no_eyeslay
- else
- eye_organ.refresh(call_update = FALSE)
- if(!no_eyeslay)
- for(var/mutable_appearance/eye_overlay in eye_organ.generate_body_overlay(species_human))
- eye_overlay.pixel_y += height_offset
- standing_face += eye_overlay
- */
-
- // organic body markings
- if(HAS_MARKINGS in species_traits)
- var/obj/item/bodypart/chest/chest = species_human.get_bodypart(BODY_ZONE_CHEST)
- var/obj/item/bodypart/arm/right/right_arm = species_human.get_bodypart(BODY_ZONE_R_ARM)
- var/obj/item/bodypart/arm/left/left_arm = species_human.get_bodypart(BODY_ZONE_L_ARM)
- var/obj/item/bodypart/leg/right/right_leg = species_human.get_bodypart(BODY_ZONE_R_LEG)
- var/obj/item/bodypart/leg/left/left_leg = species_human.get_bodypart(BODY_ZONE_L_LEG)
- var/datum/sprite_accessory/markings = GLOB.moth_markings_list[species_human.dna.features["moth_markings"]]
- if(markings)
+ // organic body markings
+ if(HAS_MARKINGS in species_traits)
+ var/obj/item/bodypart/chest/chest = species_human.get_bodypart(BODY_ZONE_CHEST)
+ var/obj/item/bodypart/arm/right/right_arm = species_human.get_bodypart(BODY_ZONE_R_ARM)
+ var/obj/item/bodypart/arm/left/left_arm = species_human.get_bodypart(BODY_ZONE_L_ARM)
+ var/obj/item/bodypart/leg/right/right_leg = species_human.get_bodypart(BODY_ZONE_R_LEG)
+ var/obj/item/bodypart/leg/left/left_leg = species_human.get_bodypart(BODY_ZONE_L_LEG)
+ var/datum/sprite_accessory/markings = GLOB.moth_markings_list[species_human.dna.features["moth_markings"]]
if(!HAS_TRAIT(species_human, TRAIT_HUSK))
if(noggin && (IS_ORGANIC_LIMB(noggin)))
var/mutable_appearance/markings_head_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_head", -BODY_LAYER)
@@ -874,7 +855,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
switch(accessory.color_src)
if(SKINTONES)
accessory_overlay.color = skintone2hex(source.skin_tone)
- if(MUTANT_COLORS)
+ if(MUTCOLORS)
if(fixed_mut_color)
accessory_overlay.color = fixed_mut_color
else
diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
index 38eb12e8ba3e..73c3657abae0 100644
--- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
@@ -40,8 +40,6 @@
BODY_ZONE_CHEST = /obj/item/bodypart/chest/mushroom,
)
- var/datum/martial_art/mushpunch/mush
-
/datum/species/mush/check_roundstart_eligible()
return FALSE //hard locked out of roundstart on the order of design lead kor, this can be removed in the future when planetstation is here OR SOMETHING but right now we have a problem with races.
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index e64c8b271e01..211c3f0369d5 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -101,7 +101,6 @@
///The image for facial hair gradient
var/mutable_appearance/facial_gradient_overlay
-
/obj/item/bodypart/head/Destroy()
QDEL_NULL(brainmob) //order is sensitive, see warning in handle_atom_del() below
QDEL_NULL(brain)
@@ -218,7 +217,6 @@
if(lip_style && (head_flags & HEAD_LIPS))
var/image/lips_overlay = image('icons/mob/species/human/human_face.dmi', "lips_[lip_style]", -FACE_LAYER, SOUTH)
lips_overlay.color = lip_color
- worn_face_offset?.apply_offset(lips_overlay)
. += lips_overlay
@@ -264,7 +262,6 @@
. += eye_right
else
if(lip_overlay && (head_flags & HEAD_LIPS))
- worn_face_offset?.apply_offset(lip_overlay)
. += lip_overlay
if(!facial_hair_hidden && facial_overlay && (head_flags & HEAD_FACIAL_HAIR))
@@ -284,7 +281,6 @@
if(show_missing_eyes && (head_flags && HEAD_EYEHOLES))
var/mutable_appearance/no_eyes = mutable_appearance('icons/mob/species/human/human_face.dmi', "eyes_missing", -BODY_LAYER)
- worn_face_offset?.apply_offset(no_eyes)
. += no_eyes
return
@@ -333,9 +329,6 @@
else if(bodytype & BODYTYPE_LARVA_PLACEHOLDER)
debrain_icon = 'icons/mob/species/alien/bodyparts.dmi'
debrain_icon_state = "debrained_larva"
- else if(bodytype & BODYTYPE_GOLEM)
- debrain_icon = 'icons/mob/species/golems.dmi'
- debrain_icon_state = "debrained"
var/image/debrain_overlay
if(can_rotate)
@@ -344,9 +337,6 @@
debrain_overlay = image(debrain_icon, debrain_icon_state, -HAIR_LAYER, SOUTH)
return debrain_overlay
-/mob/living/proc/set_haircolor(hex_string, override)
- return
-
/obj/item/bodypart/head/GetVoice()
return "The head of [real_name]"
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index f1e86b85bf6b..72be428d24d6 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -710,3 +710,5 @@
unarmed_damage_low = 0
unarmed_damage_high = 1
unarmed_stun_threshold = 2
+
+//
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index b418e152b0dd..c8006bd92dc0 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -124,31 +124,26 @@
var/mutable_appearance/eye_left = mutable_appearance(eye_icon, "[eye_icon_state]_l", -FACE_LAYER)
var/mutable_appearance/eye_right = mutable_appearance(eye_icon, "[eye_icon_state]_r", -FACE_LAYER)
- var/obscured = parent.check_obscured_slots(TRUE)
- if(overlay_ignore_lighting && !(obscured & ITEM_SLOT_EYES))
- overlays += emissive_appearance_copy(eye_left, src, NONE)
- overlays += emissive_appearance_copy(eye_right, src, NONE)
-
+ var/list/overlays = list(eye_left, eye_right)
var/obj/item/bodypart/head/my_head = parent.get_bodypart(BODY_ZONE_HEAD)
if(my_head)
if(my_head.head_flags & HEAD_EYECOLOR)
eye_right.color = eye_color_right
eye_left.color = eye_color_left
- if(my_head.worn_face_offset)
- my_head.worn_face_offset.apply_offset(eye_left)
- my_head.worn_face_offset.apply_offset(eye_right)
- return list(eye_left, eye_right)
+ var/obscured = parent.check_obscured_slots(TRUE)
+ if(overlay_ignore_lighting && !(obscured & ITEM_SLOT_EYES))
+ overlays += emissive_appearance_copy(eye_left, src, NONE)
+ overlays += emissive_appearance_copy(eye_right, src, NONE)
- /*
- if(OFFSET_FACE in parent.dna?.species.offset_features)
- var/offset = parent.dna.species.offset_features[OFFSET_FACE]
- for(var/mutable_appearance/overlay in overlays)
- overlay.pixel_x += offset[OFFSET_X]
- overlay.pixel_y += offset[OFFSET_Y]
+ if(OFFSET_FACE in parent.dna?.species.offset_features)
+ var/offset = parent.dna.species.offset_features[OFFSET_FACE]
+ for(var/mutable_appearance/overlay in overlays)
+ overlay.pixel_x += offset[OFFSET_X]
+ overlay.pixel_y += offset[OFFSET_Y]
return overlays
- */
+
#undef OFFSET_X
#undef OFFSET_Y
diff --git a/monkestation/code/modules/blueshift/items/barber.dm b/monkestation/code/modules/blueshift/items/barber.dm
index c8c230fdfe40..9bc6eba87392 100644
--- a/monkestation/code/modules/blueshift/items/barber.dm
+++ b/monkestation/code/modules/blueshift/items/barber.dm
@@ -554,8 +554,27 @@
icon = 'monkestation/code/modules/blueshift/icons/items.dmi'
icon_state = "razor"
w_class = WEIGHT_CLASS_TINY
+ flags_1 = CONDUCT_1
+ toolspeed = 1
// How long do we take to shave someone's (facial) hair?
var/shaving_time = 5 SECONDS
+ //Gigarazor W/ Bananium
+ var/unlocked = FALSE //for unlocking super hairstyles
+
+/obj/item/razor/attackby(obj/item/item, mob/user, params)
+ .=..()
+ if(istype(item, /obj/item/stack/sheet/mineral/bananium))
+ if(unlocked)
+ to_chat(user, "[src] is already powered by bananium!")
+ return
+ item.use_tool(src, user, amount=1)
+ unlocked = TRUE
+ to_chat(user, "You insert the bananium into the battery pack.")
+
+/obj/item/razor/gigarazor
+ name = "shmick 9000"
+ desc = "It gets the job done."
+ unlocked = TRUE
/obj/item/razor/suicide_act(mob/living/carbon/user)
user.visible_message(span_suicide("[user] begins shaving [user.p_them()]self without the razor guard! It looks like [user.p_theyre()] trying to commit suicide!"))
@@ -581,7 +600,7 @@
var/mob/living/carbon/human/target_human = attacked_mob
var/location = user.zone_selected
var/obj/item/bodypart/head/noggin = target_human.get_bodypart(BODY_ZONE_HEAD)
- var/static/list/head_zones = list(BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD)
+ var/static/list/head_zones = list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD)
if(!noggin && (location in head_zones))
to_chat(user, span_warning("[target_human] doesn't have a head!"))
@@ -596,6 +615,10 @@
to_chat(user, span_warning("The mask is in the way!"))
return
+ if(!(noggin.head_flags & HEAD_FACIAL_HAIR))
+ to_chat(user, span_warning("There is no facial hair to style!"))
+ return
+
if(HAS_TRAIT(target_human, TRAIT_SHAVED))
to_chat(user, span_warning("[target_human] is just way too shaved. Like, really really shaved."))
return
@@ -620,6 +643,10 @@
to_chat(user, span_warning("The headgear is in the way!"))
return
+ if(!(noggin.head_flags & HEAD_HAIR))
+ to_chat(user, span_warning("There is no hair to shave!"))
+ return
+
if(target_human.hairstyle == "Bald" || target_human.hairstyle == "Balding Hair" || target_human.hairstyle == "Skinhead")
to_chat(user, span_warning("There is not enough hair left to shave!"))
return
diff --git a/monkestation/code/modules/ranching/satyr/accessories/sprites/fluff.dm b/monkestation/code/modules/ranching/satyr/accessories/sprites/fluff.dm
index a353d5711e3a..e090eff8781a 100644
--- a/monkestation/code/modules/ranching/satyr/accessories/sprites/fluff.dm
+++ b/monkestation/code/modules/ranching/satyr/accessories/sprites/fluff.dm
@@ -1,7 +1,7 @@
/datum/sprite_accessory/satyr_fluff
icon = 'monkestation/code/modules/ranching/icons/satyr_fluff.dmi'
- color_src = HAIR
+ color_src = HEAD_HAIR
/datum/sprite_accessory/satyr_fluff/normal
name = "Normal"
diff --git a/monkestation/code/modules/ranching/satyr/accessories/sprites/tail.dm b/monkestation/code/modules/ranching/satyr/accessories/sprites/tail.dm
index 978e9b73ca83..2c3e197a7f71 100644
--- a/monkestation/code/modules/ranching/satyr/accessories/sprites/tail.dm
+++ b/monkestation/code/modules/ranching/satyr/accessories/sprites/tail.dm
@@ -1,7 +1,7 @@
/datum/sprite_accessory/satyr_tail
icon = 'monkestation/code/modules/ranching/icons/satyr_tail.dmi'
- color_src = HAIR
+ color_src = HEAD_HAIR
/datum/sprite_accessory/satyr_tail/short
name = "Short"
diff --git a/monkestation/code/modules/smithing/oozelings/species.dm b/monkestation/code/modules/smithing/oozelings/species.dm
index 4a5e25dac9c3..d6d1d4df4a6f 100644
--- a/monkestation/code/modules/smithing/oozelings/species.dm
+++ b/monkestation/code/modules/smithing/oozelings/species.dm
@@ -9,8 +9,6 @@
species_traits = list(
MUTCOLORS,
- EYECOLOR,
- HAIR,FACEHAIR,
)
hair_color = "mutcolor"
From b1cf14e761add16ae43032ed42901040239784b4 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Tue, 30 Jul 2024 10:36:48 -0600
Subject: [PATCH 07/17] Added jellypeople to have hair (its in s diff location
now)
---
.../mob/living/carbon/human/species_types/jellypeople.dm | 3 +++
code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm | 1 +
2 files changed, 4 insertions(+)
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 0deab490f305..bc61be0abc8c 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -37,6 +37,9 @@
species_language_holder = /datum/language_holder/jelly
ass_image = 'icons/ass/assslime.png'
wing_types = list(/obj/item/organ/external/wings/functional/slime)
+ hair_color = "mutcolor"
+ hair_alpha = 150
+ facial_hair_alpha = 150
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/jelly,
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index 72be428d24d6..ebc1478fa2ed 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -209,6 +209,7 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
head_flags = NONE
+
/obj/item/bodypart/chest/fly
limb_id = SPECIES_FLYPERSON
is_dimorphic = TRUE
From 995b33beeb359ea2d45c261a67a5e68c277acd86 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Tue, 30 Jul 2024 10:51:55 -0600
Subject: [PATCH 08/17] Fixed skellingtons
---
code/modules/mob/living/carbon/human/species_types/android.dm | 1 -
.../modules/mob/living/carbon/human/species_types/skeletons.dm | 1 -
code/modules/mob/living/carbon/human/species_types/zombies.dm | 1 -
code/modules/surgery/bodyparts/species_parts/android_parts.dm | 1 +
code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm | 3 ++-
.../modules/mob/living/carbon/human/species_type/skeletons.dm | 1 -
6 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index bebb0971acc2..6477477d8e90 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -6,7 +6,6 @@
NOTRANSSTING,
NO_UNDERWEAR,
NOHUSK,
- HAIR, // monke edit: allow them to have hair (it's the future, why not)
)
inherent_traits = list(
TRAIT_CAN_USE_FLIGHT_POTION,
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 937c08d35e70..1c294c2579ff 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -9,7 +9,6 @@
NO_DNA_COPY,
NO_UNDERWEAR,
NOHUSK,
- HAIR, // monke edit: allow them to have hair (it's the future, why not)
)
inherent_traits = list(
TRAIT_CAN_USE_FLIGHT_POTION,
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index c420d355e009..b7f9b81de523 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -10,7 +10,6 @@
species_traits = list(
NOZOMBIE,
NOTRANSSTING,
- HAIR, // monke edit: allow them to have hair (it's the future, why not)
)
inherent_traits = list(
// SHARED WITH ALL ZOMBIES
diff --git a/code/modules/surgery/bodyparts/species_parts/android_parts.dm b/code/modules/surgery/bodyparts/species_parts/android_parts.dm
index e9b821f5934d..0495a426ac5d 100644
--- a/code/modules/surgery/bodyparts/species_parts/android_parts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/android_parts.dm
@@ -6,6 +6,7 @@
/obj/item/bodypart/head/robot/android
change_exempt_flags = null
+ head_flags = HEAD_HAIR
/obj/item/bodypart/chest/robot/android
change_exempt_flags = null
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index ebc1478fa2ed..b7cb3f2944bc 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -151,7 +151,7 @@
limb_id = SPECIES_ZOMBIE
is_dimorphic = FALSE
should_draw_greyscale = FALSE
- head_flags = HEAD_EYESPRITES | HEAD_DEBRAIN
+ head_flags = HEAD_EYESPRITES | HEAD_DEBRAIN | HEAD_HAIR
/obj/item/bodypart/chest/zombie
limb_id = SPECIES_ZOMBIE
@@ -272,6 +272,7 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
dmg_overlay_type = null
+ head_flags = HEAD_HAIR
/obj/item/bodypart/chest/skeleton
biological_state = BIO_BONE
diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/skeletons.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/skeletons.dm
index e48e99d4033c..7aec8942833f 100644
--- a/monkestation/code/modules/mob/living/carbon/human/species_type/skeletons.dm
+++ b/monkestation/code/modules/mob/living/carbon/human/species_type/skeletons.dm
@@ -15,7 +15,6 @@
NO_DNA_COPY,
NO_UNDERWEAR,
NOHUSK,
- HAIR,
)
inherent_traits = list(
TRAIT_CAN_USE_FLIGHT_POTION,
From fe673e749e03d3cfca4ff5bfe57dc1d66eb85b1a Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Tue, 30 Jul 2024 12:18:41 -0600
Subject: [PATCH 09/17] More bugfixes for eyes
---
.../surgery/bodyparts/species_parts/ethereal_bodyparts.dm | 2 +-
.../modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm | 2 +-
code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm | 2 +-
monkestation/code/modules/ranching/satyr/bodyparts.dm | 2 +-
monkestation/code/modules/smithing/ipcs/species.dm | 1 -
.../code/modules/surgery/bodyparts/arachnid_bodyparts.dm | 2 +-
.../code/modules/surgery/bodyparts/ethereal_bodyparts.dm | 2 +-
monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm | 2 +-
monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm | 2 +-
9 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
index a60232a5756d..bcf633419bde 100644
--- a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
@@ -13,7 +13,7 @@
var/mob/living/carbon/human/potato_oc = owner
var/datum/species/ethereal/eth_holder = potato_oc.dna.species
species_color = eth_holder.current_color
- head_flags = HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
+ head_flags = HEAD_HAIR | HEAD_FACIAL_HAIR | HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN | HEAD_EYECOLOR
/obj/item/bodypart/chest/ethereal
icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi'
diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
index 7f0c242eca38..1b496fc3bd74 100644
--- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
@@ -2,7 +2,7 @@
icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
limb_id = SPECIES_LIZARD
is_dimorphic = FALSE
- head_flags = HEAD_HAIR|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
+ head_flags = HEAD_HAIR| HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN | HEAD_EYECOLOR
/obj/item/bodypart/chest/lizard
icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
index 63e927440935..3382a9a4855c 100644
--- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
@@ -5,7 +5,7 @@
limb_id = SPECIES_MOTH
is_dimorphic = FALSE
should_draw_greyscale = FALSE
- head_flags = HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
+ head_flags = HEAD_LIPS |HEAD_EYESPRITES |HEAD_EYEHOLES | HEAD_DEBRAIN
/obj/item/bodypart/chest/moth
icon = 'icons/mob/species/moth/bodyparts.dmi'
diff --git a/monkestation/code/modules/ranching/satyr/bodyparts.dm b/monkestation/code/modules/ranching/satyr/bodyparts.dm
index 9cef606382c2..7809f9185b58 100644
--- a/monkestation/code/modules/ranching/satyr/bodyparts.dm
+++ b/monkestation/code/modules/ranching/satyr/bodyparts.dm
@@ -2,7 +2,7 @@
icon_greyscale = 'monkestation/code/modules/ranching/icons/bodyparts.dmi'
limb_id = SPECIES_SATYR
is_dimorphic = TRUE
- head_flags = HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_EYESPRITES|HEAD_EYECOLOR | HEAD_EYEHOLES|HEAD_DEBRAIN
+ head_flags = HEAD_HAIR | HEAD_FACIAL_HAIR | HEAD_EYESPRITES | HEAD_EYECOLOR | HEAD_EYEHOLES | HEAD_DEBRAIN
/obj/item/bodypart/chest/satyr
icon_greyscale = 'monkestation/code/modules/ranching/icons/bodyparts.dmi'
diff --git a/monkestation/code/modules/smithing/ipcs/species.dm b/monkestation/code/modules/smithing/ipcs/species.dm
index 67a4e639065d..101eef01e94f 100644
--- a/monkestation/code/modules/smithing/ipcs/species.dm
+++ b/monkestation/code/modules/smithing/ipcs/species.dm
@@ -28,7 +28,6 @@
species_traits = list(
NO_DNA_COPY,
- NOEYESPRITES,
NOTRANSSTING,
NOHUSK
)
diff --git a/monkestation/code/modules/surgery/bodyparts/arachnid_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/arachnid_bodyparts.dm
index 578b83010281..6feabe23fc6d 100644
--- a/monkestation/code/modules/surgery/bodyparts/arachnid_bodyparts.dm
+++ b/monkestation/code/modules/surgery/bodyparts/arachnid_bodyparts.dm
@@ -2,7 +2,7 @@
icon_greyscale = 'monkestation/icons/mob/species/arachnid/bodyparts.dmi'
limb_id = SPECIES_ARACHNIDS
is_dimorphic = FALSE
- head_flags = HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
+ head_flags = HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN | HEAD_EYECOLOR
/obj/item/bodypart/chest/arachnid
icon_greyscale = 'monkestation/icons/mob/species/arachnid/bodyparts.dmi'
diff --git a/monkestation/code/modules/surgery/bodyparts/ethereal_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/ethereal_bodyparts.dm
index fe7b7d994527..e815032fcbfa 100644
--- a/monkestation/code/modules/surgery/bodyparts/ethereal_bodyparts.dm
+++ b/monkestation/code/modules/surgery/bodyparts/ethereal_bodyparts.dm
@@ -1,7 +1,7 @@
/obj/item/bodypart/head/ethereal
icon_greyscale ='monkestation/icons/mob/species/ethereal/bodyparts.dmi'
is_dimorphic = TRUE
- head_flags = HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
+ head_flags = HEAD_HAIR | HEAD_FACIAL_HAIR | HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN | HEAD_EYECOLOR
/obj/item/bodypart/chest/ethereal
icon_greyscale = 'monkestation/icons/mob/species/ethereal/bodyparts.dmi'
diff --git a/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm
index dda88cf77ba7..e428b76c6dff 100644
--- a/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm
+++ b/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm
@@ -2,7 +2,7 @@
icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi'
limb_id = SPECIES_FLORAN
is_dimorphic = FALSE
- head_flags = HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
+ head_flags = HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN | HEAD_EYECOLOR
/obj/item/bodypart/chest/floran
icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi'
diff --git a/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm
index 059631cd7ce4..a4f869adb794 100644
--- a/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm
+++ b/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm
@@ -5,7 +5,7 @@
limb_id = SPECIES_SIMIAN
is_dimorphic = FALSE
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM
- head_flags = HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN
+ head_flags = HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN | HEAD_EYECOLOR
dmg_overlay_type = "monkey"
/obj/item/bodypart/chest/simian
From fd9f0950a6b25cf75ae4b5ab892bc7b90d0393d0 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Tue, 30 Jul 2024 12:23:32 -0600
Subject: [PATCH 10/17] w
---
.../mob/living/carbon/human/_species.dm | 57 ++++++++++---------
1 file changed, 29 insertions(+), 28 deletions(-)
diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm
index 643ab391270b..327813775fac 100644
--- a/code/modules/mob/living/carbon/human/_species.dm
+++ b/code/modules/mob/living/carbon/human/_species.dm
@@ -704,34 +704,35 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/obj/item/bodypart/leg/right/right_leg = species_human.get_bodypart(BODY_ZONE_R_LEG)
var/obj/item/bodypart/leg/left/left_leg = species_human.get_bodypart(BODY_ZONE_L_LEG)
var/datum/sprite_accessory/markings = GLOB.moth_markings_list[species_human.dna.features["moth_markings"]]
- if(!HAS_TRAIT(species_human, TRAIT_HUSK))
- if(noggin && (IS_ORGANIC_LIMB(noggin)))
- var/mutable_appearance/markings_head_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_head", -BODY_LAYER)
- markings_head_overlay.pixel_y += height_offset
- standing += markings_head_overlay
-
- if(chest && (IS_ORGANIC_LIMB(chest)))
- var/mutable_appearance/markings_chest_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_chest", -BODY_LAYER)
- markings_chest_overlay.pixel_y += height_offset
- standing += markings_chest_overlay
-
- if(right_arm && (IS_ORGANIC_LIMB(right_arm)))
- var/mutable_appearance/markings_r_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_arm", -BODY_LAYER)
- markings_r_arm_overlay.pixel_y += height_offset
- standing += markings_r_arm_overlay
-
- if(left_arm && (IS_ORGANIC_LIMB(left_arm)))
- var/mutable_appearance/markings_l_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_arm", -BODY_LAYER)
- markings_l_arm_overlay.pixel_y += height_offset
- standing += markings_l_arm_overlay
-
- if(right_leg && (IS_ORGANIC_LIMB(right_leg)))
- var/mutable_appearance/markings_r_leg_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_leg", -BODY_LAYER)
- standing += markings_r_leg_overlay
-
- if(left_leg && (IS_ORGANIC_LIMB(left_leg)))
- var/mutable_appearance/markings_l_leg_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_leg", -BODY_LAYER)
- standing += markings_l_leg_overlay
+ if(markings)
+ if(!HAS_TRAIT(species_human, TRAIT_HUSK))
+ if(noggin && (IS_ORGANIC_LIMB(noggin)))
+ var/mutable_appearance/markings_head_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_head", -BODY_LAYER)
+ markings_head_overlay.pixel_y += height_offset
+ standing += markings_head_overlay
+
+ if(chest && (IS_ORGANIC_LIMB(chest)))
+ var/mutable_appearance/markings_chest_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_chest", -BODY_LAYER)
+ markings_chest_overlay.pixel_y += height_offset
+ standing += markings_chest_overlay
+
+ if(right_arm && (IS_ORGANIC_LIMB(right_arm)))
+ var/mutable_appearance/markings_r_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_arm", -BODY_LAYER)
+ markings_r_arm_overlay.pixel_y += height_offset
+ standing += markings_r_arm_overlay
+
+ if(left_arm && (IS_ORGANIC_LIMB(left_arm)))
+ var/mutable_appearance/markings_l_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_arm", -BODY_LAYER)
+ markings_l_arm_overlay.pixel_y += height_offset
+ standing += markings_l_arm_overlay
+
+ if(right_leg && (IS_ORGANIC_LIMB(right_leg)))
+ var/mutable_appearance/markings_r_leg_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_leg", -BODY_LAYER)
+ standing += markings_r_leg_overlay
+
+ if(left_leg && (IS_ORGANIC_LIMB(left_leg)))
+ var/mutable_appearance/markings_l_leg_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_leg", -BODY_LAYER)
+ standing += markings_l_leg_overlay
//Underwear, Undershirts & Socks
if(!(NO_UNDERWEAR in species_traits))
From e6681b7f2cc9f3ee0941bd2d2842122387cd8686 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Tue, 30 Jul 2024 14:38:55 -0600
Subject: [PATCH 11/17] Fixed eyes, need HEAD_EYESPRITES to have white eyes
---
.../bodyparts/species_parts/android_parts.dm | 2 +-
.../bodyparts/species_parts/misc_bodyparts.dm | 4 ++--
...s__datum_species_human_krokodil_addict.png | Bin 1072 -> 1072 bytes
.../surgery/bodyparts/floran_bodyparts.dm | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/code/modules/surgery/bodyparts/species_parts/android_parts.dm b/code/modules/surgery/bodyparts/species_parts/android_parts.dm
index 0495a426ac5d..b7a1f55bf43f 100644
--- a/code/modules/surgery/bodyparts/species_parts/android_parts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/android_parts.dm
@@ -6,7 +6,7 @@
/obj/item/bodypart/head/robot/android
change_exempt_flags = null
- head_flags = HEAD_HAIR
+ head_flags = HEAD_HAIR | HEAD_EYESPRITES
/obj/item/bodypart/chest/robot/android
change_exempt_flags = null
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index b7cb3f2944bc..237d1748b9bf 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -208,7 +208,7 @@
limb_id = SPECIES_FLYPERSON
is_dimorphic = FALSE
should_draw_greyscale = FALSE
- head_flags = NONE
+ head_flags = HEAD_EYESPRITES | HEAD_DEBRAIN
/obj/item/bodypart/chest/fly
limb_id = SPECIES_FLYPERSON
@@ -347,7 +347,7 @@
limb_id = SPECIES_GOLEM
is_dimorphic = FALSE
dmg_overlay_type = null
- head_flags = NONE
+ head_flags = HEAD_EYESPRITES
/obj/item/bodypart/chest/golem
biological_state = BIO_BONE
diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_krokodil_addict.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_krokodil_addict.png
index 30f9080a6c3c773a7f9231295abc62b4fb8105d1..e9251e73cc5494b39f532b644e462225e558005c 100644
GIT binary patch
delta 22
ecmdnMv4LYkF!TTa|0jk;u{`KYf3$H+4Ko0JmJ2ih
delta 22
ecmdnMv4LYkFf#)K!^E&CmcElU2R3f0VFmzFp$HQI
diff --git a/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm
index e428b76c6dff..353882d35acb 100644
--- a/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm
+++ b/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm
@@ -2,7 +2,7 @@
icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi'
limb_id = SPECIES_FLORAN
is_dimorphic = FALSE
- head_flags = HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN | HEAD_EYECOLOR
+ head_flags = HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN
/obj/item/bodypart/chest/floran
icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi'
From 095b23bb6bdbc62ec2fe6c5ef446a8e0a9a447b7 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Tue, 30 Jul 2024 15:12:23 -0600
Subject: [PATCH 12/17] fuck golems
---
.../surgery/bodyparts/species_parts/misc_bodyparts.dm | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index 237d1748b9bf..3522df549ea8 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -340,7 +340,7 @@
unarmed_damage_high = 15
unarmed_stun_threshold = 14
-///GOLEMS (i hate xenobio SO FUCKING MUCH) (from 2022: Yeah I fucking feel your pain brother)
+///GOLEMS (i hate xenobio SO FUCKING MUCH) (from 2022: Yeah I fucking feel your pain brother) (2024: yeah this is shit)
/obj/item/bodypart/head/golem
biological_state = BIO_BONE
bodytype = BODYTYPE_ORGANIC
@@ -490,6 +490,7 @@
limb_id = SPECIES_GOLEM_CARDBOARD
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ head_flags = NONE
/obj/item/bodypart/chest/golem/cardboard
limb_id = SPECIES_GOLEM_CARDBOARD
@@ -539,6 +540,7 @@
limb_id = SPECIES_GOLEM_DURATHREAD
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ head_flags = NONE
/obj/item/bodypart/chest/golem/durathread
limb_id = SPECIES_GOLEM_DURATHREAD
@@ -567,6 +569,7 @@
limb_id = SPECIES_GOLEM_BONE
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ head_flags = NONE
/obj/item/bodypart/chest/golem/bone
biological_state = BIO_BONE
@@ -599,6 +602,7 @@
limb_id = SPECIES_GOLEM_SNOW
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ head_flags = NONE
/obj/item/bodypart/chest/golem/snow
limb_id = SPECIES_GOLEM_SNOW
From ff30fd7a65327ad9bd8faab65a35cb94128a6ac1 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Sat, 3 Aug 2024 11:59:14 -0600
Subject: [PATCH 13/17] ipcs have lips?
---
monkestation/code/modules/smithing/ipcs/body/base_bodyparts.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/monkestation/code/modules/smithing/ipcs/body/base_bodyparts.dm b/monkestation/code/modules/smithing/ipcs/body/base_bodyparts.dm
index f7b2992cc97d..dfcf48856c9c 100644
--- a/monkestation/code/modules/smithing/ipcs/body/base_bodyparts.dm
+++ b/monkestation/code/modules/smithing/ipcs/body/base_bodyparts.dm
@@ -8,7 +8,7 @@
should_draw_greyscale = FALSE
biological_state = BIO_ROBOTIC
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC
- head_flags = HEAD_HAIR | HEAD_LIPS | HEAD_EYECOLOR
+ head_flags = HEAD_HAIR | HEAD_LIPS | HEAD_EYECOLOR | HEAD_LIPS
body_damage_coeff = 1.1 //IPC's Head can dismember //Monkestation Edit
max_damage = 40 //Keep in mind that this value is used in the //Monkestation Edit
From c69d8dfaf789485294adb4725bb12a33136c8529 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Sat, 3 Aug 2024 20:58:42 -0600
Subject: [PATCH 14/17] it took me 8 hours to fix this spelling mistake :)
---
.../mob/dead/new_player/sprite_accessories/ipc_screens.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/ipc_screens.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/ipc_screens.dm
index 9bc2c7f81161..a4e57f99fd88 100644
--- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/ipc_screens.dm
+++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/ipc_screens.dm
@@ -1,6 +1,6 @@
/datum/sprite_accessory/ipc_screens
icon = 'monkestation/icons/mob/species/ipc/ipc_screens.dmi'
- color_src = HEAD_EYECOLOR
+ color_src = EYE_COLOR
is_emissive = TRUE
/datum/sprite_accessory/ipc_screens/blue
From 2486480c823a99f5c393ba4e25aab8d0ed107f26 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Sun, 4 Aug 2024 17:18:22 -0600
Subject: [PATCH 15/17] Re added moth hair oops
---
code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
index 3382a9a4855c..f0fc78f83f0b 100644
--- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
@@ -5,7 +5,7 @@
limb_id = SPECIES_MOTH
is_dimorphic = FALSE
should_draw_greyscale = FALSE
- head_flags = HEAD_LIPS |HEAD_EYESPRITES |HEAD_EYEHOLES | HEAD_DEBRAIN
+ head_flags = HEAD_LIPS |HEAD_EYESPRITES |HEAD_EYEHOLES | HEAD_DEBRAIN | HEAD_HAIR
/obj/item/bodypart/chest/moth
icon = 'icons/mob/species/moth/bodyparts.dmi'
From 64acaf48a760afd649fe7876b944635310d24221 Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Wed, 7 Aug 2024 00:46:58 -0600
Subject: [PATCH 16/17] commented out facial hair offsets for now, not sure how
it sets other sprite heights me eepy
---
code/modules/surgery/bodyparts/head_hair_and_lips.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm
index 9e0278cb877a..b011c23da730 100644
--- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm
+++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm
@@ -80,13 +80,13 @@
//Overlay
facial_overlay = mutable_appearance(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER)
facial_overlay.alpha = facial_hair_alpha
- facial_overlay.pixel_y += offsets[1]
+ // facial_overlay.pixel_y += offsets[1]
//Gradients
facial_hair_gradient_style = LAZYACCESS(human_head_owner.grad_style, GRADIENT_FACIAL_HAIR_KEY)
if(facial_hair_gradient_style)
facial_hair_gradient_color = LAZYACCESS(human_head_owner.grad_color, GRADIENT_FACIAL_HAIR_KEY)
facial_gradient_overlay = make_gradient_overlay(sprite_accessory.icon, sprite_accessory.icon_state, HAIR_LAYER, GLOB.facial_hair_gradients_list[facial_hair_gradient_style], facial_hair_gradient_color)
- facial_gradient_overlay.pixel_y += offsets[1]
+ // facial_gradient_overlay.pixel_y += offsets[1]
//Emissive
facial_overlay.overlays += emissive_blocker(facial_overlay.icon, facial_overlay.icon_state, location, alpha = facial_hair_alpha)
From d4289a04d47f469b29805c05fa26be73232a309f Mon Sep 17 00:00:00 2001
From: ThePooba <81843097+ThePooba@users.noreply.github.com>
Date: Fri, 9 Aug 2024 08:26:39 -0600
Subject: [PATCH 17/17] Fixed beards for everything but dwarves. I dont know
why dwarf beards only work in preview.
---
code/modules/surgery/bodyparts/head_hair_and_lips.dm | 7 -------
1 file changed, 7 deletions(-)
diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm
index b011c23da730..670462bdac8c 100644
--- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm
+++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm
@@ -64,11 +64,6 @@
facial_hairstyle = human_head_owner.facial_hairstyle
var/atom/location = loc || owner || src
- var/height = human_head_owner.get_mob_height()
- if(height == HUMAN_HEIGHT_DWARF)
- height += 2
- height = num2text(height)
- var/offsets = GLOB.human_heights_to_offsets[height]
if(!facial_hair_hidden && lip_style && (head_flags & HEAD_LIPS))
lip_overlay = mutable_appearance('icons/mob/species/human/human_face.dmi', "lips_[lip_style]", -BODY_LAYER)
@@ -80,13 +75,11 @@
//Overlay
facial_overlay = mutable_appearance(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER)
facial_overlay.alpha = facial_hair_alpha
- // facial_overlay.pixel_y += offsets[1]
//Gradients
facial_hair_gradient_style = LAZYACCESS(human_head_owner.grad_style, GRADIENT_FACIAL_HAIR_KEY)
if(facial_hair_gradient_style)
facial_hair_gradient_color = LAZYACCESS(human_head_owner.grad_color, GRADIENT_FACIAL_HAIR_KEY)
facial_gradient_overlay = make_gradient_overlay(sprite_accessory.icon, sprite_accessory.icon_state, HAIR_LAYER, GLOB.facial_hair_gradients_list[facial_hair_gradient_style], facial_hair_gradient_color)
- // facial_gradient_overlay.pixel_y += offsets[1]
//Emissive
facial_overlay.overlays += emissive_blocker(facial_overlay.icon, facial_overlay.icon_state, location, alpha = facial_hair_alpha)