Refactors body markings into bodypart overlays (#83744)

## About The Pull Request
Refactors body markings (lizard and moths) into the bodypart overlays
system
I've also renamed the icon states for lizard bodymarkings (downstreams
with lots of lizard body markings might have problems with this)

## Why It's Good For The Game
Gives us better controle over /human appearances. I didn't add any means
of actually changing them on the person (aside from genetics. how would
that even work? with a waterproof marker?), but makes it easy for
when/if I do. Also unloads mutant_bodyparts more, moving is yet closer
to full species dedatumization

## Changelog
🆑
refactor: Lizard and moth markings now use the bodypart overlay system
/🆑
This commit is contained in:
Time-Green
2024-06-18 14:07:47 +02:00
committed by GitHub
parent 71428d5bf6
commit 4fd0e28f42
19 changed files with 118 additions and 74 deletions
-2
View File
@@ -138,8 +138,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_AGENDER "agender"
/// Species with this trait have a blood clan mechanic
#define TRAIT_BLOOD_CLANS "blood_clans"
/// Species with this trait have markings (this SUCKS, remove this later in favor of bodypart overlays)
#define TRAIT_HAS_MARKINGS "has_markings"
/// Species with this trait use skin tones for coloration
#define TRAIT_USES_SKINTONES "uses_skintones"
/// Species with this trait use mutant colors for coloration
-1
View File
@@ -248,7 +248,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED,
"TRAIT_HAS_BEEN_KIDNAPPED" = TRAIT_HAS_BEEN_KIDNAPPED,
"TRAIT_HAS_CRANIAL_FISSURE" = TRAIT_HAS_CRANIAL_FISSURE,
"TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS,
"TRAIT_HATED_BY_DOGS" = TRAIT_HATED_BY_DOGS,
"TRAIT_HEAD_INJURY_BLOCKED" = TRAIT_HEAD_INJURY_BLOCKED,
"TRAIT_HEALS_FROM_CARP_RIFTS" = TRAIT_HEALS_FROM_CARP_RIFTS,
-1
View File
@@ -94,7 +94,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_GUNFLIP" = TRAIT_GUNFLIP,
"TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED,
"TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED,
"TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS,
"TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER,
"TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS,
"TRAIT_HOLY" = TRAIT_HOLY,
@@ -35,7 +35,7 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
var/list/socks_list //! stores /datum/sprite_accessory/socks indexed by name
//Lizard Bits (all datum lists indexed by name)
var/list/body_markings_list
var/list/lizard_markings_list
var/list/snouts_list
var/list/horns_list
var/list/frills_list
@@ -87,7 +87,7 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
socks_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/socks)[DEFAULT_SPRITE_LIST]
body_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings)[DEFAULT_SPRITE_LIST]
lizard_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/lizard_markings)[DEFAULT_SPRITE_LIST]
tails_list_human = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
tails_list_lizard = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
tails_list_monkey = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
@@ -0,0 +1,31 @@
/// For body markings applied on the species, which need some extra code
/datum/bodypart_overlay/simple/body_marking
layers = EXTERNAL_ADJACENT
/// Listen to the gendercode, if the limb is bimorphic
var/use_gender = FALSE
/// Which dna feature key to draw from
var/dna_feature_key
/// Which bodyparts do we apply ourselves to?
var/list/applies_to = list(/obj/item/bodypart/head, /obj/item/bodypart/chest, /obj/item/bodypart/arm/left, /obj/item/bodypart/arm/right, \
/obj/item/bodypart/leg/left, /obj/item/bodypart/leg/right)
/// Get the accessory list from SSaccessories. Used in species.dm to get the right sprite
/datum/bodypart_overlay/simple/body_marking/proc/get_accessory(name)
CRASH("get_accessories() not overriden on [type] !")
/datum/bodypart_overlay/simple/body_marking/get_image(layer, obj/item/bodypart/limb)
var/gender_string = (use_gender && limb.is_dimorphic) ? (limb.gender == MALE ? MALE : FEMALE + "_") : "" //we only got male and female sprites
return image(icon, gender_string + icon_state + "_" + limb.body_zone, layer = layer)
/datum/bodypart_overlay/simple/body_marking/moth
dna_feature_key = "moth_markings"
/datum/bodypart_overlay/simple/body_marking/moth/get_accessory(name)
return SSaccessories.moth_markings_list[name]
/datum/bodypart_overlay/simple/body_marking/lizard
dna_feature_key = "lizard_markings"
applies_to = list(/obj/item/bodypart/chest)
/datum/bodypart_overlay/simple/body_marking/lizard/get_accessory(name)
return SSaccessories.lizard_markings_list[name]
+6 -10
View File
@@ -207,8 +207,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
L[DNA_MUTANT_COLOR_BLOCK] = sanitize_hexcolor(features["mcolor"], include_crunch = FALSE)
if(features["ethcolor"])
L[DNA_ETHEREAL_COLOR_BLOCK] = sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE)
if(features["body_markings"])
L[DNA_LIZARD_MARKINGS_BLOCK] = construct_block(SSaccessories.body_markings_list.Find(features["body_markings"]), length(SSaccessories.body_markings_list))
if(features["lizard_markings"])
L[DNA_LIZARD_MARKINGS_BLOCK] = construct_block(SSaccessories.lizard_markings_list.Find(features["lizard_markings"]), length(SSaccessories.lizard_markings_list))
if(features["tail_cat"])
L[DNA_TAIL_BLOCK] = construct_block(SSaccessories.tails_list_human.Find(features["tail_cat"]), length(SSaccessories.tails_list_human))
if(features["tail_lizard"])
@@ -354,7 +354,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
if(DNA_ETHEREAL_COLOR_BLOCK)
set_uni_feature_block(blocknumber, sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE))
if(DNA_LIZARD_MARKINGS_BLOCK)
set_uni_feature_block(blocknumber, construct_block(SSaccessories.body_markings_list.Find(features["body_markings"]), length(SSaccessories.body_markings_list)))
set_uni_feature_block(blocknumber, construct_block(SSaccessories.lizard_markings_list.Find(features["lizard_markings"]), length(SSaccessories.lizard_markings_list)))
if(DNA_TAIL_BLOCK)
set_uni_feature_block(blocknumber, construct_block(SSaccessories.tails_list_human.Find(features["tail_cat"]), length(SSaccessories.tails_list_human)))
if(DNA_LIZARD_TAIL_BLOCK)
@@ -649,8 +649,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
dna.features["mcolor"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_MUTANT_COLOR_BLOCK))
if(dna.features["ethcolor"])
dna.features["ethcolor"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_ETHEREAL_COLOR_BLOCK))
if(dna.features["body_markings"])
dna.features["body_markings"] = SSaccessories.body_markings_list[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_MARKINGS_BLOCK), length(SSaccessories.body_markings_list))]
if(dna.features["lizard_markings"])
dna.features["lizard_markings"] = SSaccessories.lizard_markings_list[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_MARKINGS_BLOCK), length(SSaccessories.lizard_markings_list))]
if(dna.features["snout"])
dna.features["snout"] = SSaccessories.snouts_list[deconstruct_block(get_uni_feature_block(features, DNA_SNOUT_BLOCK), length(SSaccessories.snouts_list))]
if(dna.features["horns"])
@@ -686,14 +686,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
external_organ.mutate_feature(features, src)
if(icon_update)
if(mutcolor_update)
update_body(is_creating = TRUE)
else
update_body()
update_body(is_creating = mutcolor_update)
if(mutations_overlay_update)
update_mutations_overlay()
/mob/proc/domutcheck()
return
+6 -6
View File
@@ -1700,24 +1700,24 @@
// MutantParts Definitions //
/////////////////////////////
/datum/sprite_accessory/body_markings
icon = 'icons/mob/human/species/lizard/lizard_misc.dmi'
/datum/sprite_accessory/lizard_markings
icon = 'icons/mob/human/species/lizard/lizard_markings.dmi'
/datum/sprite_accessory/body_markings/none
/datum/sprite_accessory/lizard_markings/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/body_markings/dtiger
/datum/sprite_accessory/lizard_markings/dtiger
name = "Dark Tiger Body"
icon_state = "dtiger"
gender_specific = TRUE
/datum/sprite_accessory/body_markings/ltiger
/datum/sprite_accessory/lizard_markings/ltiger
name = "Light Tiger Body"
icon_state = "ltiger"
gender_specific = TRUE
/datum/sprite_accessory/body_markings/lbelly
/datum/sprite_accessory/lizard_markings/lbelly
name = "Light Belly"
icon_state = "lbelly"
gender_specific = TRUE
@@ -112,6 +112,10 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
/// will show the feature as selectable.
var/relevant_mutant_bodypart = null
/// If the selected species has this in its /datum/species/body_markings,
/// will show the feature as selectable.
var/relevant_body_markings = null
/// If the selected species has this in its /datum/species/inherent_traits,
/// will show the feature as selectable.
var/relevant_inherent_trait = null
@@ -333,6 +337,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
|| !isnull(relevant_inherent_trait) \
|| !isnull(relevant_external_organ) \
|| !isnull(relevant_head_flag) \
|| !isnull(relevant_body_markings) \
)
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
@@ -29,20 +29,20 @@
category = PREFERENCE_CATEGORY_FEATURES
main_feature_name = "Body markings"
should_generate_icons = TRUE
relevant_mutant_bodypart = "body_markings"
relevant_body_markings = /datum/bodypart_overlay/simple/body_marking/lizard
/datum/preference/choiced/lizard_body_markings/init_possible_values()
return assoc_to_keys_features(SSaccessories.body_markings_list)
return assoc_to_keys_features(SSaccessories.lizard_markings_list)
/datum/preference/choiced/lizard_body_markings/icon_for(value)
var/datum/sprite_accessory/sprite_accessory = SSaccessories.body_markings_list[value]
var/datum/sprite_accessory/sprite_accessory = SSaccessories.lizard_markings_list[value]
var/icon/final_icon = icon('icons/mob/human/species/lizard/bodyparts.dmi', "lizard_chest_m")
if (sprite_accessory.icon_state != "none")
var/icon/body_markings_icon = icon(
'icons/mob/human/species/lizard/lizard_misc.dmi',
"m_body_markings_[sprite_accessory.icon_state]_ADJ",
"male_[sprite_accessory.icon_state]_chest",
)
final_icon.Blend(body_markings_icon, ICON_OVERLAY)
@@ -55,7 +55,7 @@
return final_icon
/datum/preference/choiced/lizard_body_markings/apply_to_human(mob/living/carbon/human/target, value)
target.dna.features["body_markings"] = value
target.dna.features["lizard_markings"] = value
/datum/preference/choiced/lizard_frills
savefile_key = "feature_lizard_frills"
@@ -34,7 +34,7 @@
category = PREFERENCE_CATEGORY_FEATURES
main_feature_name = "Body markings"
should_generate_icons = TRUE
relevant_mutant_bodypart = "moth_markings"
relevant_body_markings = /datum/bodypart_overlay/simple/body_marking/moth
/datum/preference/choiced/moth_markings/init_possible_values()
return assoc_to_keys_features(SSaccessories.moth_markings_list)
@@ -755,7 +755,7 @@
"wings" = "None",
"frills" = "None",
"spines" = "Long",
"body_markings" = "Dark Tiger Body",
"lizard_markings" = "Dark Tiger Body",
"legs" = DIGITIGRADE_LEGS,
)
consumer.eye_color_left = "#FEE5A3"
@@ -102,6 +102,9 @@ GLOBAL_LIST_EMPTY(features_by_species)
///Replaces default appendix with a different organ.
var/obj/item/organ/internal/appendix/mutantappendix = /obj/item/organ/internal/appendix
/// Store body marking defines. See mobs.dm for bitflags
var/list/body_markings = list()
/// Flat modifier on all damage taken via [apply_damage][/mob/living/proc/apply_damage] (so being punched, shot, etc.)
/// IE: 10 = 10% less damage taken.
var/damage_modifier = 0
@@ -466,7 +469,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/obj/item/organ/external/new_organ = SSwardrobe.provide_type(organ_path)
new_organ.Insert(human, special=TRUE, movement_flags = DELETE_IF_REPLACED)
add_body_markings(human_who_gained_species)
if(length(inherent_traits))
human_who_gained_species.add_traits(inherent_traits, SPECIES_TRAIT)
@@ -526,6 +529,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
clear_tail_moodlets(C)
remove_body_markings(C)
// Removes all languages previously associated with [LANGUAGE_SPECIES], gaining our new species will add new ones back
var/datum/language_holder/losing_holder = GLOB.prototype_language_holders[species_language_holder]
for(var/language in losing_holder.understood_languages)
@@ -560,42 +565,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
eye_organ.refresh(call_update = FALSE)
standing += eye_organ.generate_body_overlay(species_human)
// organic body markings (oh my god this is terrible please rework this to be done on the limbs themselves i beg you)
if(HAS_TRAIT(species_human, TRAIT_HAS_MARKINGS))
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 = SSaccessories.moth_markings_list[species_human.dna.features["moth_markings"]]
var/mutable_appearance/marking = mutable_appearance(layer = -BODY_LAYER, appearance_flags = KEEP_TOGETHER)
if(noggin && (IS_ORGANIC_LIMB(noggin)))
var/mutable_appearance/markings_head_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_head")
marking.overlays += markings_head_overlay
if(chest && (IS_ORGANIC_LIMB(chest)))
var/mutable_appearance/markings_chest_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_chest")
marking.overlays += 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")
marking.overlays += 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")
marking.overlays += 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")
marking.overlays += 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")
marking.overlays += markings_l_leg_overlay
standing += marking
//Underwear, Undershirts & Socks
if(!HAS_TRAIT(species_human, TRAIT_NO_UNDERWEAR))
if(species_human.underwear)
@@ -672,8 +641,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
switch(bodypart)
if("ears")
accessory = SSaccessories.ears_list[source.dna.features["ears"]]
if("body_markings")
accessory = SSaccessories.body_markings_list[source.dna.features["body_markings"]]
if("legs")
accessory = SSaccessories.legs_list[source.dna.features["legs"]]
@@ -727,6 +694,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
source.apply_overlay(BODY_ADJ_LAYER)
source.apply_overlay(BODY_FRONT_LAYER)
update_body_markings(source)
//This exists so sprite accessories can still be per-layer without having to include that layer's
//number in their sprite name, which causes issues when those numbers change.
/datum/species/proc/mutant_bodyparts_layertext(layer)
@@ -1519,6 +1488,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
|| (preference.relevant_inherent_trait in inherent_traits) \
|| (preference.relevant_external_organ in external_organs) \
|| (preference.relevant_head_flag && check_head_flags(preference.relevant_head_flag)) \
|| (preference.relevant_body_markings in body_markings) \
)
features += preference.savefile_key
@@ -2110,3 +2080,48 @@ GLOBAL_LIST_EMPTY(features_by_species)
return fixed_mut_color
return null
/// Add species appropriate body markings
/datum/species/proc/add_body_markings(mob/living/carbon/human/hooman)
for(var/markings_type in body_markings) //loop through possible species markings
var/datum/bodypart_overlay/simple/body_marking/markings = new markings_type() // made to die... mostly because we cant use initial on lists but its convenient and organized
var/accessory_name = hooman.dna.features[markings.dna_feature_key] //get the accessory name from dna
var/datum/sprite_accessory/moth_markings/accessory = markings.get_accessory(accessory_name) //get the actual datum
if(isnull(accessory))
CRASH("Value: [accessory_name] did not have a corresponding sprite accessory!")
for(var/obj/item/bodypart/part as anything in markings.applies_to) //check through our limbs
var/obj/item/bodypart/people_part = hooman.get_bodypart(initial(part.body_zone)) // and see if we have a compatible marking for that limb
if(!people_part)
continue
var/datum/bodypart_overlay/simple/body_marking/overlay = new markings_type ()
// Tell the overlay what it should look like
overlay.icon = accessory.icon
overlay.icon_state = accessory.icon_state
overlay.use_gender = accessory.gender_specific
overlay.draw_color = accessory.color_src ? hooman.dna.features["mcolor"] : null
people_part.add_bodypart_overlay(overlay)
/// Remove body markings
/datum/species/proc/remove_body_markings(mob/living/carbon/human/hooman)
for(var/obj/item/bodypart/part as anything in hooman.bodyparts)
for(var/datum/bodypart_overlay/simple/body_marking/marking in part.bodypart_overlays)
part.remove_bodypart_overlay(marking)
/// Update the overlays if necessary
/datum/species/proc/update_body_markings(mob/living/carbon/human/hooman)
var/needs_update = FALSE
for(var/datum/bodypart_overlay/simple/body_marking/marking as anything in body_markings)
if(initial(marking.dna_feature_key) == body_markings[marking]) // dna is same as our species (sort of mini-cache), so no update needed
continue
needs_update = TRUE
break
if(needs_update)
remove_body_markings(hooman)
add_body_markings(hooman)
@@ -103,7 +103,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
/proc/create_consistent_human_dna(mob/living/carbon/human/target)
target.dna.features["mcolor"] = COLOR_VIBRANT_LIME
target.dna.features["ethcolor"] = COLOR_WHITE
target.dna.features["body_markings"] = get_consistent_feature_entry(SSaccessories.body_markings_list)
target.dna.features["lizard_markings"] = get_consistent_feature_entry(SSaccessories.lizard_markings_list)
target.dna.features["ears"] = get_consistent_feature_entry(SSaccessories.ears_list)
target.dna.features["frills"] = get_consistent_feature_entry(SSaccessories.frills_list)
target.dna.features["horns"] = get_consistent_feature_entry(SSaccessories.horns_list)
@@ -8,7 +8,8 @@
TRAIT_TACKLING_TAILED_DEFENDER,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE
mutant_bodyparts = list("body_markings" = "None", "legs" = "Normal Legs")
mutant_bodyparts = list("legs" = "Normal Legs")
body_markings = list(/datum/bodypart_overlay/simple/body_marking/lizard = "None")
external_organs = list(
/obj/item/organ/external/horns = "None",
/obj/item/organ/external/frills = "None",
@@ -49,7 +50,7 @@
/datum/species/lizard/randomize_features()
var/list/features = ..()
features["body_markings"] = pick(SSaccessories.body_markings_list)
features["lizard_markings"] = pick(SSaccessories.lizard_markings_list)
return features
/datum/species/lizard/get_scream_sound(mob/living/carbon/human/lizard)
@@ -3,12 +3,11 @@
plural_form = "Mothmen"
id = SPECIES_MOTH
inherent_traits = list(
TRAIT_HAS_MARKINGS,
TRAIT_TACKLING_WINGED_ATTACKER,
TRAIT_ANTENNAE,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
mutant_bodyparts = list("moth_markings" = "None")
body_markings = list(/datum/bodypart_overlay/simple/body_marking/moth = "None")
external_organs = list(/obj/item/organ/external/wings/moth = "Plain", /obj/item/organ/external/antennae = "Plain")
meat = /obj/item/food/meat/slab/human/mutant/moth
mutanttongue = /obj/item/organ/internal/tongue/moth
+1 -1
View File
@@ -80,7 +80,7 @@
ling.dna.features["horns"] = "Curled"
ling.dna.features["frills"] = "Short"
ling.dna.features["spines"] = "Long + Membrane"
ling.dna.features["body_markings"] = "Light Belly"
ling.dna.features["lizard_markings"] = "Light Belly"
ling.dna.features["legs"] = DIGITIGRADE_LEGS
ling.eye_color_left = COLOR_WHITE
ling.eye_color_right = COLOR_WHITE
Binary file not shown.

After

Width:  |  Height:  |  Size: 977 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

+1
View File
@@ -989,6 +989,7 @@
#include "code\datums\atmosphere\planetary.dm"
#include "code\datums\bodypart_overlays\bodypart_overlay.dm"
#include "code\datums\bodypart_overlays\emote_bodypart_overlay.dm"
#include "code\datums\bodypart_overlays\markings_bodypart_overlay.dm"
#include "code\datums\bodypart_overlays\mutant_bodypart_overlay.dm"
#include "code\datums\bodypart_overlays\simple_bodypart_overlay.dm"
#include "code\datums\brain_damage\brain_trauma.dm"