diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index be694d8d56d..a07a3e37015 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -95,6 +95,10 @@ #define BODYTYPE_GOLEM (1<<4) //The limb is a peg limb #define BODYTYPE_PEG (1<<5) +//The limb is plantly (and will regen if photosynthesis is active) +#define BODYTYPE_PLANT (1<<6) +//This limb is shadowy and will regen if shadowheal is active +#define BODYTYPE_SHADOW (1<<7) // Bodyshape defines for how things can be worn, i.e., what "shape" the mob sprite is ///The limb fits the human mold. This is not meant to be literal, if the sprite "fits" on a human, it is "humanoid", regardless of origin. diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 851d9784e49..f75516c9868 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -614,29 +614,33 @@ desc = "You're immune to radiation, get settled quick!" icon_state = "radiation_shield" -/// Heal in darkness and potentially trigger other effects, persists for a short duration after leaving -/datum/status_effect/shadow_regeneration - id = "shadow_regeneration" +/// Throw an alert we're in darkness!! Nightvision can make it hard to tell so this is useful +/datum/status_effect/shadow + id = "shadow" duration = 2 SECONDS status_type = STATUS_EFFECT_REFRESH alert_type = /atom/movable/screen/alert/status_effect/shadow_regeneration -/datum/status_effect/shadow_regeneration/on_apply() +/// Same as above, but also heal in darkness!! Mostly superseded but some simple mobs use this +/datum/status_effect/shadow/regeneration + id = "shadow_regeneration" + +/datum/status_effect/shadow/regeneration/on_apply() . = ..() if (!.) return FALSE heal_owner() return TRUE -/datum/status_effect/shadow_regeneration/refresh(effect) +/datum/status_effect/shadow/regeneration/refresh(effect) . = ..() heal_owner() /// Regenerate health whenever this status effect is applied or reapplied -/datum/status_effect/shadow_regeneration/proc/heal_owner() +/datum/status_effect/shadow/regeneration/proc/heal_owner() owner.heal_overall_damage(brute = 1, burn = 1, required_bodytype = BODYTYPE_ORGANIC) /atom/movable/screen/alert/status_effect/shadow_regeneration name = "Shadow Regeneration" - desc = "Bathed in soothing darkness, you will slowly heal yourself." + desc = "Bathed in soothing darkness, you will slowly heal yourself" icon_state = "lightless" diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm index e4b4528d616..e2a9b684003 100644 --- a/code/modules/antagonists/nightmare/nightmare_organs.dm +++ b/code/modules/antagonists/nightmare/nightmare_organs.dm @@ -3,13 +3,12 @@ /// A special flag value used to make a nightmare heart not grant a light eater. Appears to be unused. #define HEART_SPECIAL_SHADOWIFY 2 - /obj/item/organ/brain/shadow/nightmare name = "tumorous mass" desc = "A fleshy growth that was dug out of the skull of a Nightmare." icon = 'icons/obj/medical/organs/organs.dmi' icon_state = "brain-x-d" - applied_status = /datum/status_effect/shadow_regeneration/nightmare + ///Our associated shadow jaunt spell, for all nightmares var/datum/action/cooldown/spell/jaunt/shadow_walk/our_jaunt ///Our associated terrorize spell, for antagonist nightmares @@ -34,26 +33,35 @@ QDEL_NULL(our_jaunt) QDEL_NULL(terrorize_spell) -/atom/movable/screen/alert/status_effect/shadow_regeneration/nightmare - name = "Lightless Domain" - desc = "Bathed in soothing darkness you will slowly regenerate, even past the point of death. \ - Heightened reflexes will allow you to dodge projectile weapons." +/obj/item/organ/brain/shadow/nightmare/on_life(seconds_per_tick, times_fired) + . = ..() -/datum/status_effect/shadow_regeneration/nightmare + var/turf/owner_turf = owner.loc + if(!isturf(owner_turf)) + return + var/light_amount = owner_turf.get_lumcount() + + if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //dodge in the dark + owner.apply_status_effect(/datum/status_effect/shadow/nightmare) + +/datum/status_effect/shadow/nightmare + id = "nightmare" + duration = 2 SECONDS + status_type = STATUS_EFFECT_REFRESH alert_type = /atom/movable/screen/alert/status_effect/shadow_regeneration/nightmare -/datum/status_effect/shadow_regeneration/nightmare/on_apply() +/datum/status_effect/shadow/nightmare/on_apply() . = ..() if (!.) return FALSE RegisterSignal(owner, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(dodge_bullets)) return TRUE -/datum/status_effect/shadow_regeneration/nightmare/on_remove() +/datum/status_effect/shadow/nightmare/on_remove() UnregisterSignal(owner, COMSIG_ATOM_PRE_BULLET_ACT) return ..() -/datum/status_effect/shadow_regeneration/nightmare/proc/dodge_bullets(mob/living/carbon/human/source, obj/projectile/hitting_projectile, def_zone) +/datum/status_effect/shadow/nightmare/proc/dodge_bullets(mob/living/carbon/human/source, obj/projectile/hitting_projectile, def_zone) SIGNAL_HANDLER source.visible_message( span_danger("[source] dances in the shadows, evading [hitting_projectile]!"), @@ -62,6 +70,11 @@ playsound(source, SFX_BULLET_MISS, 75, TRUE) return COMPONENT_BULLET_PIERCED +/atom/movable/screen/alert/status_effect/shadow_regeneration/nightmare + name = "Lightless Domain" + desc = "Bathed in soothing darkness you will slowly regenerate, even past the point of death. \ + Heightened reflexes will allow you to dodge projectile weapons." + /obj/item/organ/heart/nightmare name = "heart of darkness" desc = "An alien organ that twists and writhes when exposed to light." diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index d3a978344b8..0d0b6d1bd2f 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -209,7 +209,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) var/light_amount = our_turf.get_lumcount() if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //heal in the dark - mob.apply_status_effect(/datum/status_effect/shadow_regeneration) + mob.apply_status_effect(/datum/status_effect/shadow/regeneration) /datum/fish_trait/heavy name = "Demersal" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a387723a017..3885df91037 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1049,6 +1049,11 @@ bodyparts += new_bodypart new_bodypart.update_owner(src) + // Apply a bodypart effect or merge with an existing one, for stuff like plant limbs regenning in light + for(var/datum/status_effect/grouped/bodypart_effect/effect_type as anything in new_bodypart.bodypart_effects) + apply_status_effect(effect_type, type, new_bodypart) + + // Tell the organs in the bodyparts that we are in a mob again for(var/obj/item/organ/organ in new_bodypart) organ.mob_insert(src) 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 692bbe7c7a7..dcc94068281 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -39,30 +39,6 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/pod, ) -/datum/species/pod/spec_life(mob/living/carbon/human/podperson, seconds_per_tick, times_fired) - . = ..() - if(podperson.stat == DEAD) - return - - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(podperson.loc)) //else, there's considered to be no light - var/turf/turf_loc = podperson.loc - light_amount = min(1, turf_loc.get_lumcount()) - 0.5 - podperson.adjust_nutrition(5 * light_amount * seconds_per_tick) - if(light_amount > 0.2) //if there's enough light, heal - var/need_mob_update = FALSE - need_mob_update += podperson.heal_overall_damage(brute = 0.5 * seconds_per_tick, burn = 0.5 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) - need_mob_update += podperson.adjustToxLoss(-0.5 * seconds_per_tick, updating_health = FALSE) - need_mob_update += podperson.adjustOxyLoss(-0.5 * seconds_per_tick, updating_health = FALSE) - if(need_mob_update) - podperson.updatehealth() - - if(podperson.nutrition > NUTRITION_LEVEL_ALMOST_FULL) //don't make podpeople fat because they stood in the sun for too long - podperson.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL) - - if(podperson.nutrition < NUTRITION_LEVEL_STARVING + 50) - podperson.take_overall_damage(brute = 1 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - /datum/species/pod/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) . = ..() if(. & COMSIG_MOB_STOP_REAGENT_CHECK) 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 8ecb1b8b773..f67f7fbeeab 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -98,22 +98,8 @@ pepperspray_protect = TRUE flash_protect = FLASH_PROTECTION_SENSITIVE -/// the key to some of their powers +/// the key to none of their powers /obj/item/organ/brain/shadow name = "shadowling tumor" desc = "Something that was once a brain, before being remolded by a shadowling. It has adapted to the dark, irreversibly." icon = 'icons/obj/medical/organs/shadow_organs.dmi' - /// What status effect do we gain while in darkness? - var/applied_status = /datum/status_effect/shadow_regeneration - -/obj/item/organ/brain/shadow/on_life(seconds_per_tick, times_fired) - . = ..() - var/turf/owner_turf = owner.loc - if(!isturf(owner_turf)) - return - var/light_amount = owner_turf.get_lumcount() - - if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //heal in the dark - owner.apply_status_effect(applied_status) - if (!owner.has_status_effect(applied_status)) - owner.take_overall_damage(brute = 0.5 * seconds_per_tick, burn = 0.5 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 2b6f111b2eb..558a26a3f56 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -203,6 +203,8 @@ var/robotic_emp_paralyze_damage_percent_threshold = 0.3 /// A potential texturing overlay to put on the limb var/datum/bodypart_overlay/texture/texture_bodypart_overlay + /// Lazylist of /datum/status_effect/grouped/bodypart_effect types. Instances of this are applied to the carbon when added the limb is attached, and merged with similair limbs + var/list/bodypart_effects /obj/item/bodypart/apply_fantasy_bonuses(bonus) . = ..() @@ -265,7 +267,6 @@ return FALSE return ..() - /obj/item/bodypart/proc/on_forced_removal(atom/old_loc, dir, forced, list/old_locs) SIGNAL_HANDLER diff --git a/code/modules/surgery/bodyparts/bodypart_effects.dm b/code/modules/surgery/bodyparts/bodypart_effects.dm new file mode 100644 index 00000000000..96a3770ebbb --- /dev/null +++ b/code/modules/surgery/bodyparts/bodypart_effects.dm @@ -0,0 +1,134 @@ +/// For scaling the effectiveness of certain effects to the total bodypart count +#define GET_BODYPART_COEFFICIENT(X) round(X.len / BODYPARTS_DEFAULT_MAXIMUM , 0.1) +/// Check if it's full body. These are mostly here so we can change just one place when we ever add more limbs (?) +#define IS_FULL_BODY(X) (X.len == BODYPARTS_DEFAULT_MAXIMUM ) + +/// Effects added to a carbon focused on the bodyparts itself, such as adding a photosynthesis component that +/datum/status_effect/grouped/bodypart_effect + id = "bodypart_effect" + duration = STATUS_EFFECT_PERMANENT + processing_speed = STATUS_EFFECT_NORMAL_PROCESS + + /// List of bodyparts contributing to this effect + var/list/bodyparts = list() + /// Minimum amount of bodyparts required for on_apply to be called. When tipping below, on_remove is called + var/minimum_bodyparts = 1 + /// Are we currently active? We don't NEED to track it, but it's a lot easier and faster if we do + var/is_active = FALSE + +/datum/status_effect/grouped/bodypart_effect/source_added(source, obj/item/bodypart/bodypart) + add_bodypart(bodypart) + +/// Merge a bodypart into the effect +/datum/status_effect/grouped/bodypart_effect/proc/add_bodypart(bodypart) + RegisterSignal(bodypart, COMSIG_BODYPART_REMOVED, PROC_REF(on_bodypart_removed)) + RegisterSignal(bodypart, COMSIG_QDELETING, PROC_REF(on_bodypart_destroyed)) + + bodyparts.Add(bodypart) + + if(!is_active && bodyparts.len >= minimum_bodyparts) + activate() + +/// Remove a bodypart from the effect. Deleting = TRUE is used during clean-up phase +/datum/status_effect/grouped/bodypart_effect/proc/remove_bodypart(obj/item/bodypart/bodypart, deleting = FALSE) + UnregisterSignal(bodypart, COMSIG_BODYPART_REMOVED) + + bodyparts.Remove(bodypart) + + if(deleting) + return + + if(bodyparts.len == 0) + qdel(src) + + else if(is_active && bodyparts.len < minimum_bodyparts) + deactivate() + +/// Signal called when a bodypart is removed +/datum/status_effect/grouped/bodypart_effect/proc/on_bodypart_removed(obj/item/bodypart/bodypart) + SIGNAL_HANDLER + + remove_bodypart(owner, bodypart) + +/// Signal called when a bodypart is destroyed. Destruction of a bodypart doesn't necessarily drop it +/datum/status_effect/grouped/bodypart_effect/proc/on_bodypart_destroyed(obj/item/bodypart/bodypart) + SIGNAL_HANDLER + + remove_bodypart(bodypart) + +/// Activate some sort of effect when a threshold is reached +/datum/status_effect/grouped/bodypart_effect/proc/activate() + PROTECTED_PROC(TRUE) + SHOULD_CALL_PARENT(TRUE) + + is_active = TRUE + // Maybe add support for different stages? AKA add a stronger effect when there are more limbs + +/// Remove an effect whenever a threshold is no longer reached +/datum/status_effect/grouped/bodypart_effect/proc/deactivate() + PROTECTED_PROC(TRUE) + SHOULD_CALL_PARENT(TRUE) + + is_active = FALSE + +/// Clean up all references and self-destruct +/datum/status_effect/grouped/bodypart_effect/Destroy() + deactivate() + for(var/obj/item/bodypart/bodypart as anything in bodyparts) + remove_bodypart(bodypart, deleting = TRUE) + + return ..() + +/// This limb regens in light! Only BODYTYPE_PLANT limbs will heal, but limbs without the flag (and with the effect) still contribute to healing of the other limbs +/datum/status_effect/grouped/bodypart_effect/photosynthesis + processing_speed = STATUS_EFFECT_NORMAL_PROCESS + tick_interval = 1 SECONDS + id = "photosynthesis" + +/datum/status_effect/grouped/bodypart_effect/photosynthesis/tick(seconds_between_ticks) + var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing + var/bodypart_coefficient = GET_BODYPART_COEFFICIENT(bodyparts) + + if(isturf(owner.loc)) //else, there's considered to be no light + var/turf/turf_loc = owner.loc + light_amount = min(1, turf_loc.get_lumcount()) - 0.5 + + if(owner.nutrition < NUTRITION_LEVEL_ALMOST_FULL) + owner.adjust_nutrition(5 * light_amount * bodypart_coefficient) + + if(light_amount > 0.2) //if there's enough light, heal + var/need_mob_update = FALSE + need_mob_update += owner.heal_overall_damage(brute = 0.5 * bodypart_coefficient, \ + burn = 0.5 * bodypart_coefficient, updating_health = FALSE, required_bodytype = BODYTYPE_PLANT) + need_mob_update += owner.adjustToxLoss(-0.5 * bodypart_coefficient, updating_health = FALSE) + need_mob_update += owner.adjustOxyLoss(-0.5 * bodypart_coefficient, updating_health = FALSE) + if(need_mob_update) + owner.updatehealth() + + if(owner.nutrition < NUTRITION_LEVEL_STARVING + 50) + owner.take_overall_damage(brute = 1 * bodypart_coefficient, required_bodytype = BODYTYPE_PLANT) + +/// This limb heals in darkness and dies in light! +/// Only BODYTYPE_SHADOW limbs will heal, but limbs without the flag (and with the effect) still contribute to healing of the other limbs +/datum/status_effect/grouped/bodypart_effect/nyxosynthesis + tick_interval = 1 SECONDS + id = "nyxosynthesis" + +/datum/status_effect/grouped/bodypart_effect/nyxosynthesis/tick(seconds_between_ticks) + var/turf/owner_turf = owner.loc + if(!isturf(owner_turf)) + return + var/light_amount = owner_turf.get_lumcount() + + var/bodypart_coefficient = GET_BODYPART_COEFFICIENT(bodyparts) + + if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //heal in the dark + owner.heal_overall_damage(brute = 0.5 * bodypart_coefficient, burn = 0.5 * bodypart_coefficient, required_bodytype = BODYTYPE_SHADOW) + if(!owner.has_status_effect(/datum/status_effect/shadow/nightmare)) //somewhat awkward, but let's not duplicate the alerts + //this only appears when in shadows, don't move to bodypart effect so people with nightvision can still tell if they're in light or not + owner.apply_status_effect(/datum/status_effect/shadow) + else + owner.take_overall_damage(brute = 1 * bodypart_coefficient, burn = 1 * bodypart_coefficient, required_bodytype = BODYTYPE_SHADOW) + +#undef GET_BODYPART_COEFFICIENT +#undef IS_FULL_BODY diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index 74219a32cf2..3faed250ce9 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -212,12 +212,18 @@ burn_modifier = 1.25 head_flags = HEAD_EYESPRITES|HEAD_EYECOLOR|HEAD_EYEHOLES|HEAD_DEBRAIN + bodytype = BODYTYPE_ORGANIC | BODYTYPE_PLANT + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/photosynthesis) + /obj/item/bodypart/chest/pod limb_id = SPECIES_PODPERSON is_dimorphic = TRUE burn_modifier = 1.25 wing_types = null + bodytype = BODYTYPE_ORGANIC | BODYTYPE_PLANT + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/photosynthesis) + /obj/item/bodypart/chest/pod/get_butt_sprite() return icon('icons/mob/butts.dmi', BUTT_SPRITE_FLOWERPOT) @@ -230,6 +236,9 @@ unarmed_miss_sound = 'sound/items/weapons/slashmiss.ogg' burn_modifier = 1.25 + bodytype = BODYTYPE_ORGANIC | BODYTYPE_PLANT + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/photosynthesis) + /obj/item/bodypart/arm/right/pod limb_id = SPECIES_PODPERSON unarmed_attack_verbs = list("slash", "lash") @@ -239,14 +248,23 @@ unarmed_miss_sound = 'sound/items/weapons/slashmiss.ogg' burn_modifier = 1.25 + bodytype = BODYTYPE_ORGANIC | BODYTYPE_PLANT + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/photosynthesis) + /obj/item/bodypart/leg/left/pod limb_id = SPECIES_PODPERSON burn_modifier = 1.25 + bodytype = BODYTYPE_ORGANIC | BODYTYPE_PLANT + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/photosynthesis) + /obj/item/bodypart/leg/right/pod limb_id = SPECIES_PODPERSON burn_modifier = 1.25 + bodytype = BODYTYPE_ORGANIC | BODYTYPE_PLANT + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/photosynthesis) + ///FLY /obj/item/bodypart/head/fly limb_id = SPECIES_FLYPERSON @@ -287,6 +305,9 @@ burn_modifier = 1.5 head_flags = NONE + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/nyxosynthesis) + bodytype = BODYTYPE_ORGANIC | BODYTYPE_SHADOW + /obj/item/bodypart/chest/shadow limb_id = SPECIES_SHADOW is_dimorphic = FALSE @@ -294,32 +315,53 @@ burn_modifier = 1.5 wing_types = null + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/nyxosynthesis) + bodytype = BODYTYPE_ORGANIC | BODYTYPE_SHADOW + /obj/item/bodypart/arm/left/shadow limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE burn_modifier = 1.5 + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/nyxosynthesis) + bodytype = BODYTYPE_ORGANIC | BODYTYPE_SHADOW + /obj/item/bodypart/arm/right/shadow limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE burn_modifier = 1.5 + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/nyxosynthesis) + bodytype = BODYTYPE_ORGANIC | BODYTYPE_SHADOW + /obj/item/bodypart/leg/left/shadow limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE burn_modifier = 1.5 + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/nyxosynthesis) + bodytype = BODYTYPE_ORGANIC | BODYTYPE_SHADOW + /obj/item/bodypart/leg/right/shadow limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE burn_modifier = 1.5 + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/nyxosynthesis) + bodytype = BODYTYPE_ORGANIC | BODYTYPE_SHADOW + /obj/item/bodypart/arm/left/shadow/nightmare bodypart_traits = list(TRAIT_CHUNKYFINGERS) + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/nyxosynthesis) + bodytype = BODYTYPE_ORGANIC | BODYTYPE_SHADOW + /obj/item/bodypart/arm/right/shadow/nightmare bodypart_traits = list(TRAIT_CHUNKYFINGERS) + bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/nyxosynthesis) + bodytype = BODYTYPE_ORGANIC | BODYTYPE_SHADOW + ///SKELETON /obj/item/bodypart/head/skeleton biological_state = BIO_BONE diff --git a/tgstation.dme b/tgstation.dme index 98bb7da2fcb..27a7d558e7d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6142,6 +6142,7 @@ #include "code\modules\surgery\advanced\bioware\nerve_splicing.dm" #include "code\modules\surgery\advanced\bioware\vein_threading.dm" #include "code\modules\surgery\bodyparts\_bodyparts.dm" +#include "code\modules\surgery\bodyparts\bodypart_effects.dm" #include "code\modules\surgery\bodyparts\dismemberment.dm" #include "code\modules\surgery\bodyparts\ghetto_parts.dm" #include "code\modules\surgery\bodyparts\head.dm"