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)