Skin Masquerade: Epidermal Applicator, Lifelike Quirk, and the Skinmonger Implant (#31185)

* adds the epidermal applicator, lifelike quirk, and skinmonger traitor implant

* lint

* lint

* attack chain fix

* more linty fixes

* more lint

* fix some buggy bugs, synthetic skinned body parts recolor to their host

* make emp on skinmonger work, fix a skinmonger bug

* make bruising / denting examine text not betray the masquerade

* burn away synthetic skin with acid

* comment / code structure / description tweaks

* i sell pharmaceuticals and pharmaceutical accessories

* code review comments

* oops

* god damn it

* god damn it (x2)

* Update code/modules/surgery/organs/augments_internal.dm

Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Signed-off-by: Pooble <90473506+poobsie@users.noreply.github.com>

* lower syndi level for implant

* Update code/modules/research/designs/medical_designs.dm

Co-authored-by: JimKil3 <47290811+JimKil3@users.noreply.github.com>
Signed-off-by: Pooble <90473506+poobsie@users.noreply.github.com>

* Update code/game/objects/items/tools/epidermal_applicator.dm

Co-authored-by: JimKil3 <47290811+JimKil3@users.noreply.github.com>
Signed-off-by: Pooble <90473506+poobsie@users.noreply.github.com>

* Update code/modules/surgery/organs/organ_external.dm

Co-authored-by: JimKil3 <47290811+JimKil3@users.noreply.github.com>
Signed-off-by: Pooble <90473506+poobsie@users.noreply.github.com>

* Update code/modules/surgery/organs/organ_external.dm

Co-authored-by: JimKil3 <47290811+JimKil3@users.noreply.github.com>
Signed-off-by: Pooble <90473506+poobsie@users.noreply.github.com>

* tweaks for review

* Update code/__DEFINES/dcs/datum_signals.dm

Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Signed-off-by: Pooble <90473506+poobsie@users.noreply.github.com>

---------

Signed-off-by: Pooble <90473506+poobsie@users.noreply.github.com>
Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Co-authored-by: JimKil3 <47290811+JimKil3@users.noreply.github.com>
Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
This commit is contained in:
Pooble
2026-03-22 18:08:25 -04:00
committed by GitHub
parent 11486a2245
commit aaeb5fdf28
18 changed files with 679 additions and 8 deletions
@@ -409,6 +409,11 @@ emp_act
update_hair()
update_fhair()
if(affecting.has_synthetic_skin)
visible_message(SPAN_WARNING("The synthetic skin on [src]'s [affecting.name] bubbles and melts away."), \
SPAN_WARNING("The synthetic skin on your [affecting.name] bubbles and melts away."))
affecting.remove_synthetic_skin(TRUE)
UpdateDamageIcon()
//MELTING INVENTORY ITEMS//
@@ -116,6 +116,8 @@
var/list/quirks = list()
/// The cooldown for jumping into a closet or crate
COOLDOWN_DECLARE(skittish_cooldown)
/// Cache whether or not an IPC appears human during examine to avoid needless recalculation
var/ipc_masquerade_status
/mob/living/carbon/human/fake
flags = ABSTRACT
@@ -53,6 +53,12 @@
if(C.species_disguise)
displayed_species = C.species_disguise
break
// If an IPC's covered in synthetic skin, they can appear human.
if(calculate_ipc_masquerade_status())
displayed_species = "Human"
examine_color = "#d1aa2e"
if(skip_jumpsuit && skip_face || HAS_TRAIT(src, TRAIT_NOEXAMINE)) //either obscured or on the nospecies list
msg += "!" //omit the species when examining
else
@@ -122,7 +128,7 @@
continue
if(!ismachineperson(src))
if(E.is_robotic())
if(E.is_robotic() && !E.has_synthetic_skin)
wound_flavor_text["[E.limb_name]"] = "[p_they(TRUE)] [p_have()] a robotic [E.name]!\n"
else if(E.status & ORGAN_SPLINTED)
@@ -256,5 +262,61 @@
return msg
/mob/living/carbon/human/proc/calculate_ipc_masquerade_status()
if(!ismachineperson(src))
return FALSE
var/all_visible_parts_have_skin = TRUE
for(var/obj/item/organ/external/limb as anything in bodyparts)
if(!limb || !limb.is_robotic())
continue
// If it's covered by clothing then it doesn't need to have skin for the masquerade
if(is_bodypart_covered_by_clothing(limb.limb_name))
continue
if(!limb.has_synthetic_skin)
return FALSE
return all_visible_parts_have_skin
/mob/living/carbon/human/examine_get_brute_message()
return !ismachineperson(src) ? "bruising" : "denting"
if(!ismachineperson(src) || calculate_ipc_masquerade_status())
return "bruising"
return "denting"
/// Checks if a body part is covered by clothing
/mob/living/carbon/human/proc/is_bodypart_covered_by_clothing(part_name)
var/bodypart_clothing_bitflag = bodypart_name_to_clothing_bitflag(part_name)
if(!bodypart_clothing_bitflag)
return FALSE
// Masks
if(bodypart_clothing_bitflag & HEAD)
var/obj/item/clothing/mask/current_mask = wear_mask
if(istype(current_mask) && (current_mask.body_parts_covered & bodypart_clothing_bitflag))
return TRUE
// Jumpsuit/uniform
var/chest_groin_arms_legs_bitflag = ARMS | LEGS | UPPER_TORSO | LOWER_TORSO
if(bodypart_clothing_bitflag & chest_groin_arms_legs_bitflag)
if(w_uniform && (w_uniform.body_parts_covered & bodypart_clothing_bitflag))
return TRUE
if(wear_suit && (wear_suit.body_parts_covered & bodypart_clothing_bitflag))
return TRUE
// Gloves
if(bodypart_clothing_bitflag & HANDS)
var/obj/item/clothing/gloves/current_gloves = gloves
if(istype(current_gloves) && (current_gloves.body_parts_covered & bodypart_clothing_bitflag))
return TRUE
// Shoes
if(bodypart_clothing_bitflag & FEET)
var/obj/item/clothing/shoes/current_shoes = shoes
if(istype(current_shoes) && (current_shoes.body_parts_covered & bodypart_clothing_bitflag))
return TRUE
return FALSE
@@ -198,6 +198,8 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
base_icon = chest.get_icon(skeleton)
for(var/obj/item/organ/external/part in bodyparts)
part.sync_colour_to_human(src)
// We just drew the chest, don't draw it twice.
if(part == chest)
continue