From 1fe0d145a3fa07a41ffc51e23fbe12500c4d55f3 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 Feb 2023 22:08:32 +0100 Subject: [PATCH] [MIRROR] Converts blindness and nearsightedness to status effects, scratches some VERY dumb blindness handling that resulted in mobs becoming "incurably" blind [MDB IGNORE] (#18760) * Converts blindness and nearsightedness to status effects, scratches some VERY dumb blindness handling that resulted in mobs becoming "incurably" blind * Fixes the conflicts and makes shit compile! * Fixes other things that didn't show up because I hadn't updated * Fixes the lints. * Okay NOW it's ready (please don't add anything else that touches blindness I beg you) --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: GoldenAlpharex --- code/__DEFINES/alerts.dm | 1 - code/__DEFINES/status_effects.dm | 36 ++++ code/__DEFINES/traits.dm | 9 +- code/_globalvars/traits.dm | 2 - code/_onclick/hud/alert.dm | 6 - code/datums/brain_damage/phobia.dm | 2 +- code/datums/components/food/edible.dm | 4 +- code/datums/components/irradiated.dm | 2 +- .../diseases/advance/symptoms/sensory.dm | 38 ++-- .../diseases/advance/symptoms/vision.dm | 69 ++++--- code/datums/elements/eyestab.dm | 50 ++++-- code/datums/elements/light_eaten.dm | 2 +- code/datums/mutations/body.dm | 22 +-- .../status_effects/_status_effect_helpers.dm | 44 ++++- .../status_effects/debuffs/blindness.dm | 124 +++++++++++++ code/datums/status_effects/debuffs/debuffs.dm | 21 +-- .../datums/status_effects/debuffs/pacifism.dm | 14 ++ code/game/machinery/hypnochair.dm | 4 +- code/game/objects/items/crayons.dm | 6 +- .../items/devices/scanners/health_analyzer.dm | 2 +- .../objects/items/granters/magic/blind.dm | 3 +- code/game/objects/items/weaponry.dm | 2 +- code/game/objects/structures/displaycase.dm | 1 - code/modules/admin/admin.dm | 13 -- .../antagonists/changeling/powers/headcrab.dm | 20 +-- .../changeling/powers/tiny_prick.dm | 9 +- code/modules/antagonists/cult/cult_items.dm | 2 +- .../antagonists/heretic/items/madness_mask.dm | 4 +- .../heretic/status_effects/debuffs.dm | 8 +- .../heretic/structures/carving_knife.dm | 2 +- .../traitor/objectives/eyesnatching.dm | 2 +- code/modules/assembly/flash.dm | 4 +- code/modules/clothing/glasses/_glasses.dm | 21 +-- code/modules/clothing/masks/muzzle.dm | 2 +- code/modules/mob/living/brain/brain_item.dm | 10 ++ code/modules/mob/living/brain/life.dm | 6 - code/modules/mob/living/brain/status_procs.dm | 11 -- code/modules/mob/living/carbon/alien/alien.dm | 2 - code/modules/mob/living/carbon/alien/life.dm | 6 - .../living/carbon/alien/special/facehugger.dm | 4 +- .../mob/living/carbon/alien/status_procs.dm | 20 --- code/modules/mob/living/carbon/carbon.dm | 63 ++++--- .../mob/living/carbon/carbon_defense.dm | 85 +++++---- .../mob/living/carbon/carbon_defines.dm | 3 - .../mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 16 +- .../mob/living/carbon/human/inventory.dm | 5 - code/modules/mob/living/carbon/human/life.dm | 8 - .../mob/living/carbon/human/species.dm | 6 +- .../modules/mob/living/carbon/status_procs.dm | 3 +- code/modules/mob/living/life.dm | 11 -- code/modules/mob/living/living.dm | 3 - code/modules/mob/living/living_defense.dm | 49 ++++- code/modules/mob/living/living_fov.dm | 2 +- code/modules/mob/living/living_say.dm | 4 +- code/modules/mob/living/silicon/ai/life.dm | 6 +- .../simple_animal/hostile/netherworld.dm | 3 +- .../living/simple_animal/hostile/statue.dm | 2 +- .../mob/living/simple_animal/slime/life.dm | 15 +- .../mob/living/simple_animal/status_procs.dm | 9 - code/modules/mob/living/status_procs.dm | 29 +-- code/modules/mob/mob.dm | 9 +- code/modules/mob/mob_defines.dm | 2 - code/modules/mob/mob_helpers.dm | 5 - code/modules/mob/status_procs.dm | 45 ----- .../chemistry/reagents/drink_reagents.dm | 9 +- .../chemistry/reagents/food_reagents.dm | 8 +- .../impure_reagents/impure_toxin_reagents.dm | 11 +- .../chemistry/reagents/medicine_reagents.dm | 36 ++-- code/modules/reagents/reagent_containers.dm | 4 +- code/modules/religion/burdened/psyker.dm | 20 ++- .../spell_types/pointed/abyssal_gaze.dm | 15 +- .../spells/spell_types/pointed/blind.dm | 12 +- code/modules/surgery/eye_surgery.dm | 6 +- code/modules/surgery/organs/_organ.dm | 14 +- code/modules/surgery/organs/eyes.dm | 169 ++++++++++-------- code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/blindness.dm | 147 +++++++++++++++ .../modules/clothing/glasses/glasses.dm | 8 +- .../modules/hairbrush/code/hairbrush.dm | 2 +- .../modules/huds/code/glasses/HUD_Glasses.dm | 14 +- .../loadout_items/loadout_datum_glasses.dm | 2 - .../modules/modular_implants/code/nifs.dm | 6 +- .../modular_items/code/modular_glasses.dm | 10 +- .../lewd_items/code/lewd_quirks.dm | 2 +- .../morenarcotics/code/cocaine_item.dm | 4 +- .../modules/morenarcotics/code/opium.dm | 4 +- tgstation.dme | 5 +- 88 files changed, 850 insertions(+), 654 deletions(-) create mode 100644 code/datums/status_effects/debuffs/blindness.dm create mode 100644 code/datums/status_effects/debuffs/pacifism.dm delete mode 100644 code/modules/mob/living/brain/status_procs.dm delete mode 100644 code/modules/mob/living/carbon/alien/status_procs.dm delete mode 100644 code/modules/mob/living/simple_animal/status_procs.dm create mode 100644 code/modules/unit_tests/blindness.dm diff --git a/code/__DEFINES/alerts.dm b/code/__DEFINES/alerts.dm index 26958fad157..d309ebd8d2e 100644 --- a/code/__DEFINES/alerts.dm +++ b/code/__DEFINES/alerts.dm @@ -16,7 +16,6 @@ /** Mob related */ #define ALERT_SUCCUMB "succumb" -#define ALERT_BLIND "blind" #define ALERT_BUCKLED "buckled" #define ALERT_HANDCUFFED "handcuffed" #define ALERT_LEGCUFFED "legcuffed" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ef7295f788a..d4fda9e71c7 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -39,6 +39,34 @@ #define STASIS_SHAPECHANGE_EFFECT "stasis_shapechange" +/// Causes the mob to become blind via the passed source +#define become_blind(source) apply_status_effect(/datum/status_effect/grouped/blindness, source) +/// Cures the mob's blindness from the passed source, removing blindness wholesale if no sources are left +#define cure_blind(source) remove_status_effect(/datum/status_effect/grouped/blindness, source) + +/// Is the mob blind? +#define is_blind(...) has_status_effect(/datum/status_effect/grouped/blindness) +/// Is the mob blind from the passed source or sources? +#define is_blind_from(sources) has_status_effect_from_source(/datum/status_effect/grouped/blindness, sources) + +/// Causes the mob to become nearsighted via the passed source +#define become_nearsighted(source) apply_status_effect(/datum/status_effect/grouped/nearsighted, source) +/// Cures the mob's nearsightedness from the passed source, removing nearsighted wholesale if no sources are left +#define cure_nearsighted(source) remove_status_effect(/datum/status_effect/grouped/nearsighted, source) + +/// Is the mob nearsighted? +#define is_nearsighted(...) has_status_effect(/datum/status_effect/grouped/nearsighted) +/// Is the mob nearsigthed from the passed source or sources? +#define is_nearsighted_from(sources) has_status_effect_from_source(/datum/status_effect/grouped/nearsighted, sources) +/// Is the mob nearsighted CURRENTLY? +/// This check fails if the mob is nearsighted but is wearing glasses, +/// While is_nearsighted will always succeed even if they are wearing glasses. +/mob/proc/is_nearsighted_currently() + var/datum/status_effect/grouped/nearsighted/nearsight = has_status_effect(/datum/status_effect/grouped/nearsighted) + if(isnull(nearsight)) + return FALSE + return nearsight.should_be_nearsighted() + // Status effect application helpers. // These are macros for easier use of adjust_timed_status_effect and set_timed_status_effect. // @@ -114,7 +142,15 @@ #define set_drowsiness(duration) set_timed_status_effect(duration, /datum/status_effect/drowsiness) #define set_drowsiness_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/drowsiness, TRUE) +#define adjust_pacifism(duration) adjust_timed_status_effect(/datum/status_effect/pacify, duration) +#define set_pacifism(duration) set_timed_status_effect(/datum/status_effect/pacify, duration) + #define adjust_eye_blur(duration) adjust_timed_status_effect(duration, /datum/status_effect/eye_blur) #define adjust_eye_blur_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/eye_blur, up_to) #define set_eye_blur(duration) set_timed_status_effect(duration, /datum/status_effect/eye_blur) #define set_eye_blur_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/eye_blur, TRUE) + +#define adjust_temp_blindness(duration) adjust_timed_status_effect(duration, /datum/status_effect/temporary_blindness) +#define adjust_temp_blindness_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/temporary_blindness, up_to) +#define set_temp_blindness(duration) set_timed_status_effect(duration, /datum/status_effect/temporary_blindness) +#define set_temp_blindness_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/temporary_blindness, TRUE) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e6f7b1cbf62..a709b32c0ca 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -144,7 +144,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_LITERATE "literate" /// Blacklist for mobs that can't read or write #define TRAIT_ILLITERATE "illiterate" -#define TRAIT_BLIND "blind" /// Mute. Can't talk. #define TRAIT_MUTE "mute" /// Gibs on death and slips like ice. @@ -152,7 +151,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Emotemute. Can't... emote. #define TRAIT_EMOTEMUTE "emotemute" #define TRAIT_DEAF "deaf" -#define TRAIT_NEARSIGHT "nearsighted" #define TRAIT_FAT "fat" #define TRAIT_HUSK "husk" ///Blacklisted from being revived via defibrilator @@ -298,6 +296,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_QUICK_BUILD "quick-build" /// We can handle 'dangerous' plants in botany safely #define TRAIT_PLANT_SAFE "plant_safe" +/// Prevents the overlay from nearsighted +#define TRAIT_NEARSIGHTED_CORRECTED "fixes_nearsighted" #define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech" #define TRAIT_UNSTABLE "unstable" #define TRAIT_OIL_FRIED "oil_fried" @@ -799,16 +799,15 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define CHANGELING_DRAIN "drain" /// changelings with this trait can no longer talk over the hivemind #define CHANGELING_HIVEMIND_MUTE "ling_mute" -#define ABYSSAL_GAZE_BLIND "abyssal_gaze" #define HIGHLANDER "highlander" #define TRAIT_HULK "hulk" #define STASIS_MUTE "stasis" #define GENETICS_SPELL "genetics_spell" #define EYES_COVERED "eyes_covered" +#define NO_EYES "no_eyes" #define HYPNOCHAIR_TRAIT "hypnochair" #define FLASHLIGHT_EYES "flashlight_eyes" #define IMPURE_OCULINE "impure_oculine" -#define BLINDFOLD_TRAIT "blindfolded" #define TRAIT_SANTA "santa" #define SCRYING_ORB "scrying-orb" #define ABDUCTOR_ANTAGONIST "abductor-antagonist" @@ -891,8 +890,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define ORBITING_TRAIT "orbiting" /// From the item_scaling element #define ITEM_SCALING_TRAIT "item_scaling" -/// Trait given by Objects that provide blindsight -#define ITEM_BLIND_TRAIT "blind_item_trait" /// Trait given by choking #define CHOKING_TRAIT "choking_trait" /// Trait given by hallucinations diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 0e457a4c530..7979091511b 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -18,11 +18,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, - "TRAIT_BLIND" = TRAIT_BLIND, "TRAIT_MUTE" = TRAIT_MUTE, "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, "TRAIT_DEAF" = TRAIT_DEAF, - "TRAIT_NEARSIGHT" = TRAIT_NEARSIGHT, "TRAIT_FAT" = TRAIT_FAT, "TRAIT_HUSK" = TRAIT_HUSK, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 89b90a74041..2b41790103e 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -230,12 +230,6 @@ desc = "The air around you is hazardously thick. A fire suit would protect you." icon_state = "highpressure" -/atom/movable/screen/alert/blind - name = "Blind" - desc = "You can't see! This may be caused by a genetic defect, eye trauma, being unconscious, \ - or something covering your eyes." - icon_state = ALERT_BLIND - /atom/movable/screen/alert/hypnosis name = "Hypnosis" desc = "Something's hypnotizing you, but you're not really sure about what." diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index d033652f337..59833ed2c87 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -121,7 +121,7 @@ if(3) to_chat(owner, span_warning("You shut your eyes in terror!")) owner.set_jitter_if_lower(10 SECONDS) - owner.adjust_blindness(10) + owner.adjust_temp_blindness(20 SECONDS) if(4) owner.adjust_dizzy(20 SECONDS) owner.adjust_confusion(10 SECONDS) diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index c802e2a138e..499c256d4e8 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -451,9 +451,9 @@ Behavior that's still missing from this component that original food items had t return FALSE var/mob/living/carbon/C = eater var/covered = "" - if(C.is_mouth_covered(head_only = 1)) + if(C.is_mouth_covered(ITEM_SLOT_HEAD)) covered = "headgear" - else if(C.is_mouth_covered(mask_only = 1)) + else if(C.is_mouth_covered(ITEM_SLOT_MASK)) covered = "mask" if(covered) var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]" diff --git a/code/datums/components/irradiated.dm b/code/datums/components/irradiated.dm index 44cfa091be2..762168fe106 100644 --- a/code/datums/components/irradiated.dm +++ b/code/datums/components/irradiated.dm @@ -135,7 +135,7 @@ span_boldwarning("Your [affected_limb.plaintext_zone] bubbles unnaturally, then bursts into blisters!"), ) - if (human_parent.is_blind()) + if(human_parent.is_blind()) to_chat(human_parent, span_boldwarning("Your [affected_limb.plaintext_zone] feels like it's bubbling, then burns like hell!")) human_parent.apply_damage(RADIATION_BURN_SPLOTCH_DAMAGE, BURN, affected_limb) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 59cd170acb5..155b6cc15b3 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -84,32 +84,34 @@ symptom_delay_min = 1 symptom_delay_max = 1 -/datum/symptom/sensory_restoration/Activate(datum/disease/advance/A) +/datum/symptom/sensory_restoration/Activate(datum/disease/advance/source_disease) . = ..() if(!.) return - var/mob/living/carbon/M = A.affected_mob - switch(A.stage) + var/mob/living/carbon/ill_mob = source_disease.affected_mob + switch(source_disease.stage) if(4, 5) - var/obj/item/organ/internal/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = ill_mob.getorganslot(ORGAN_SLOT_EARS) if(ears) ears.adjustEarDamage(-4, -4) - M.adjust_blindness(-2) - M.adjust_eye_blur(-4 SECONDS) - var/obj/item/organ/internal/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) + + ill_mob.adjust_temp_blindness(-4 SECONDS) + ill_mob.adjust_eye_blur(-4 SECONDS) + + var/obj/item/organ/internal/eyes/eyes = ill_mob.getorganslot(ORGAN_SLOT_EYES) if(!eyes) // only dealing with eye stuff from here on out return + eyes.applyOrganDamage(-2) - if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE)) - if(prob(20)) - to_chat(M, span_warning("Your vision slowly returns...")) - M.cure_blind(EYE_DAMAGE) - M.cure_nearsighted(EYE_DAMAGE) - M.set_eye_blur_if_lower(70 SECONDS) - else if(HAS_TRAIT_FROM(M, TRAIT_NEARSIGHT, EYE_DAMAGE)) - to_chat(M, span_warning("The blackness in your peripheral vision fades.")) - M.cure_nearsighted(EYE_DAMAGE) - M.set_eye_blur_if_lower(20 SECONDS) + if(prob(20)) + if(ill_mob.is_blind_from(EYE_DAMAGE)) + to_chat(ill_mob, span_warning("Your vision slowly returns...")) + ill_mob.adjust_eye_blur(20 SECONDS) + + else if(ill_mob.is_nearsighted_from(EYE_DAMAGE)) + to_chat(ill_mob, span_warning("The blackness in your peripheral vision begins to fade.")) + ill_mob.adjust_eye_blur(5 SECONDS) + else if(prob(base_message_chance)) - to_chat(M, span_notice("[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]")) + to_chat(ill_mob, span_notice("[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]")) diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index 38b57d781e1..60dabac9bd7 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -18,12 +18,14 @@ base_message_chance = 50 symptom_delay_min = 25 symptom_delay_max = 80 - var/remove_eyes = FALSE threshold_descs = list( "Resistance 12" = "Weakens extraocular muscles, eventually leading to complete detachment of the eyes.", "Stealth 4" = "The symptom remains hidden until active.", ) + /// At max stage: If FALSE, cause blindness. If TRUE, cause their eyes to fall out. + var/remove_eyes = FALSE + /datum/symptom/visionloss/Start(datum/disease/advance/A) . = ..() if(!.) @@ -33,34 +35,45 @@ if(A.totalResistance() >= 12) //goodbye eyes remove_eyes = TRUE -/datum/symptom/visionloss/Activate(datum/disease/advance/A) +/datum/symptom/visionloss/Activate(datum/disease/advance/source_disease) . = ..() if(!.) return - var/mob/living/carbon/M = A.affected_mob - var/obj/item/organ/internal/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) - if(eyes) - switch(A.stage) - if(1, 2) - if(prob(base_message_chance) && !suppress_warning) - to_chat(M, span_warning("Your eyes itch.")) - if(3, 4) - to_chat(M, span_boldwarning("Your eyes burn!")) - M.set_eye_blur_if_lower(20 SECONDS) - eyes.applyOrganDamage(1) + var/mob/living/carbon/ill_mob = source_disease.affected_mob + var/obj/item/organ/internal/eyes/eyes = ill_mob.getorganslot(ORGAN_SLOT_EYES) + if(!eyes) + return // can't do much + + switch(source_disease.stage) + if(1, 2) + if(prob(base_message_chance) && !suppress_warning) + to_chat(ill_mob, span_warning("Your eyes itch.")) + + if(3, 4) + to_chat(ill_mob, span_boldwarning("Your eyes burn!")) + ill_mob.set_eye_blur_if_lower(20 SECONDS) + eyes.applyOrganDamage(1) + + else + ill_mob.set_eye_blur_if_lower(40 SECONDS) + eyes.applyOrganDamage(5) + + // Applies nearsighted at minimum + if(!ill_mob.is_nearsighted_from(EYE_DAMAGE) && eyes.damage <= eyes.low_threshold) + eyes.setOrganDamage(eyes.low_threshold) + + if(prob(eyes.damage - eyes.low_threshold + 1)) + if(remove_eyes) + ill_mob.visible_message( + span_warning("[ill_mob]'s eyes fall out of their sockets!"), + span_userdanger("Your eyes fall out of their sockets!"), + ) + eyes.Remove(ill_mob) + eyes.forceMove(get_turf(ill_mob)) + + else if(!ill_mob.is_blind_from(EYE_DAMAGE)) + to_chat(ill_mob, span_userdanger("You go blind!")) + eyes.applyOrganDamage(eyes.maxHealth) + else - M.set_eye_blur_if_lower(40 SECONDS) - eyes.applyOrganDamage(5) - if(eyes.damage >= 10) - M.become_nearsighted(EYE_DAMAGE) - if(prob(eyes.damage - 10 + 1)) - if(!remove_eyes) - if(!M.is_blind()) - to_chat(M, span_userdanger("You go blind!")) - eyes.applyOrganDamage(eyes.maxHealth) - else - M.visible_message(span_warning("[M]'s eyes fall out of their sockets!"), span_userdanger("Your eyes fall out of their sockets!")) - eyes.Remove(M) - eyes.forceMove(get_turf(M)) - else - to_chat(M, span_userdanger("Your eyes burn horrifically!")) + to_chat(ill_mob, span_userdanger("Your eyes burn horrifically!")) diff --git a/code/datums/elements/eyestab.dm b/code/datums/elements/eyestab.dm index 83823aae773..91adf2675e7 100644 --- a/code/datums/elements/eyestab.dm +++ b/code/datums/elements/eyestab.dm @@ -1,5 +1,9 @@ +/// What's the probability a clumsy person stabs themselves in the eyes? #define CLUMSY_ATTACK_SELF_CHANCE 50 +/// The damage threshold (of the victim's eyes) after which they start taking more serious effects #define EYESTAB_BLEEDING_THRESHOLD 10 +/// How much blur we can apply +#define EYESTAB_MAX_BLUR (4 MINUTES) /// An element that lets you stab people in the eyes when targeting them /datum/element/eyestab @@ -28,13 +32,18 @@ /datum/element/eyestab/proc/on_item_attack(datum/source, mob/living/target, mob/living/user) SIGNAL_HANDLER - if (user.zone_selected == BODY_ZONE_PRECISE_EYES) - if (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(CLUMSY_ATTACK_SELF_CHANCE)) - target = user + if (user.zone_selected != BODY_ZONE_PRECISE_EYES) + return - perform_eyestab(source, target, user) + if (HAS_TRAIT(user, TRAIT_PACIFISM)) + return - return COMPONENT_SKIP_ATTACK + if (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(CLUMSY_ATTACK_SELF_CHANCE)) + target = user + + perform_eyestab(source, target, user) + + return COMPONENT_SKIP_ATTACK /datum/element/eyestab/proc/perform_eyestab(obj/item/item, mob/living/target, mob/living/user) var/obj/item/bodypart/target_limb = target.get_bodypart(BODY_ZONE_HEAD) @@ -84,31 +93,36 @@ if (!eyes) return - target.adjust_eye_blur(6 SECONDS) - eyes.applyOrganDamage(rand(2,4)) + target.adjust_eye_blur_up_to(6 SECONDS, EYESTAB_MAX_BLUR) + eyes.applyOrganDamage(rand(2, 4)) if(eyes.damage < EYESTAB_BLEEDING_THRESHOLD) return - target.adjust_eye_blur(30 SECONDS) + // At over 10 damage we apply a lot of eye blur + target.adjust_eye_blur_up_to(30 SECONDS, EYESTAB_MAX_BLUR) if (target.stat != DEAD) to_chat(target, span_danger("Your eyes start to bleed profusely!")) - if (!target.is_blind() && !HAS_TRAIT(target, TRAIT_NEARSIGHT)) - to_chat(target, span_danger("You become nearsighted!")) - - target.become_nearsighted(EYE_DAMAGE) + // At over 10 damage, we cause at least enough eye damage to force nearsightedness + if (!target.is_nearsighted_from(EYE_DAMAGE) && eyes.damage <= eyes.low_threshold) + eyes.setOrganDamage(eyes.low_threshold) + // At over 10 damage, there is a 50% chance they drop all their items if (prob(50)) if (target.stat != DEAD && target.drop_all_held_items()) to_chat(target, span_danger("You drop what you're holding and clutch at your eyes!")) - target.adjust_eye_blur(20 SECONDS) - target.Unconscious(20) - target.Paralyze(40) + target.adjust_eye_blur_up_to(20 SECONDS, EYESTAB_MAX_BLUR) + target.Unconscious(2 SECONDS) + target.Paralyze(4 SECONDS) - if (prob(eyes.damage - EYESTAB_BLEEDING_THRESHOLD + 1)) - target.become_blind(EYE_DAMAGE) - to_chat(target, span_danger("You go blind!")) + // At over 10 damage, there is a chance (based on eye damage) of going blind + if (prob(eyes.damage - eyes.low_threshold + 1)) + if (!target.is_blind_from(EYE_DAMAGE)) + eyes.setOrganDamage(eyes.maxHealth) + // Also cause some temp blindness, so that they're still blind even if they get healed + target.adjust_temp_blindness_up_to(20 SECONDS, 1 MINUTES) #undef CLUMSY_ATTACK_SELF_CHANCE #undef EYESTAB_BLEEDING_THRESHOLD +#undef EYESTAB_MAX_BLUR diff --git a/code/datums/elements/light_eaten.dm b/code/datums/elements/light_eaten.dm index 4924514e12d..36bf1f20067 100644 --- a/code/datums/elements/light_eaten.dm +++ b/code/datums/elements/light_eaten.dm @@ -67,6 +67,6 @@ if(isliving(examiner) && prob(20)) var/mob/living/target = examiner examine_text += span_danger("You can feel something in [eaten_light.p_them()] gnash at your eyes!") - target.adjust_blindness(5) + target.adjust_temp_blindness(10 SECONDS) target.set_eye_blur_if_lower(20 SECONDS) return NONE diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 05006c00dec..f5ec73a4df0 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -492,19 +492,19 @@ qdel(I) explosion(owner, light_impact_range = 2, adminlog = TRUE, explosion_cause = src) - for(var/mob/living/carbon/human/H in view(2,owner)) - var/obj/item/organ/internal/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + for(var/mob/living/carbon/human/splashed in view(2, owner)) + var/obj/item/organ/internal/eyes/eyes = splashed.getorganslot(ORGAN_SLOT_EYES) if(eyes) - to_chat(H, span_userdanger("You are blinded by a shower of blood!")) + to_chat(splashed, span_userdanger("You are blinded by a shower of blood!")) + eyes.applyOrganDamage(5) else - to_chat(H, span_userdanger("You are knocked down by a wave of... blood?!")) - H.Stun(20) - H.set_eye_blur_if_lower(40 SECONDS) - eyes?.applyOrganDamage(5) - H.adjust_confusion(3 SECONDS) - for(var/mob/living/silicon/S in view(2,owner)) - to_chat(S, span_userdanger("Your sensors are disabled by a shower of blood!")) - S.Paralyze(60) + to_chat(splashed, span_userdanger("You are knocked down by a wave of... blood?!")) + splashed.Stun(2 SECONDS) + splashed.set_eye_blur_if_lower(40 SECONDS) + splashed.adjust_confusion(3 SECONDS) + for(var/mob/living/silicon/borgo in view(2, owner)) + to_chat(borgo, span_userdanger("Your sensors are disabled by a shower of blood!")) + borgo.Paralyze(6 SECONDS) owner.investigate_log("has been gibbed by the martyrdom mutation.", INVESTIGATE_DEATHS) owner.gib() diff --git a/code/datums/status_effects/_status_effect_helpers.dm b/code/datums/status_effects/_status_effect_helpers.dm index 9cd5f4f3c86..0ee95220061 100644 --- a/code/datums/status_effects/_status_effect_helpers.dm +++ b/code/datums/status_effects/_status_effect_helpers.dm @@ -69,7 +69,13 @@ * * Returns an instance of a status effect, or NULL if none were found. */ -/mob/living/proc/has_status_effect(datum/status_effect/checked_effect) +/mob/proc/has_status_effect(datum/status_effect/checked_effect) + // Yes I'm being cringe and putting this on the mob level even though status effects only apply to the living level + // There's quite a few places (namely examine and, bleh, cult code) where it's easier to not need to cast to living before checking + // for an effect such as blindness + return null + +/mob/living/has_status_effect(datum/status_effect/checked_effect) RETURN_TYPE(/datum/status_effect) for(var/datum/status_effect/present_effect as anything in status_effects) @@ -78,6 +84,36 @@ return null +/** + * Checks if this mob has a status effect that shares the passed effect's ID + * and has the passed sources are in its list of sources (ONLY works for grouped efects!) + * + * checked_effect - TYPEPATH of a status effect to check for. Checks for its ID, not it's typepath + * + * Returns an instance of a status effect, or NULL if none were found. + */ +/mob/proc/has_status_effect_from_source(datum/status_effect/grouped/checked_effect, sources) + // See [/mob/proc/has_status_effect] for reason behind having this on the mob level + return null + +/mob/living/has_status_effect_from_source(datum/status_effect/grouped/checked_effect, sources) + RETURN_TYPE(/datum/status_effect) + + if(!ispath(checked_effect)) + CRASH("has_status_effect_from_source passed with an improper status effect path.") + + if(!islist(sources)) + sources = list(sources) + + for(var/datum/status_effect/grouped/present_effect in status_effects) + if(present_effect.id != initial(checked_effect.id)) + continue + var/list/matching_sources = present_effect.sources & sources + if(length(matching_sources)) + return present_effect + + return null + /** * Returns a list of all status effects that share the passed effect type's ID * @@ -85,7 +121,11 @@ * * Returns a list */ -/mob/living/proc/has_status_effect_list(datum/status_effect/checked_effect) +/mob/proc/has_status_effect_list(datum/status_effect/checked_effect) + // See [/mob/proc/has_status_effect] for reason behind having this on the mob level + return null + +/mob/living/has_status_effect_list(datum/status_effect/checked_effect) RETURN_TYPE(/list) var/list/effects_found = list() diff --git a/code/datums/status_effects/debuffs/blindness.dm b/code/datums/status_effects/debuffs/blindness.dm new file mode 100644 index 00000000000..7584e9ca5b1 --- /dev/null +++ b/code/datums/status_effects/debuffs/blindness.dm @@ -0,0 +1,124 @@ +/// Helper macro, for ease of expanding checks for mobs which cannot be blinded +/// There are no reason why these cannot be blinded, it is simply for "design reasons" (these things shouldn't be blinded) +#define CAN_BE_BLIND(mob) (!isanimal_or_basicmob(mob) && !isbrain(mob) && !isrevenant(mob)) + +/// Nearsighted +/datum/status_effect/grouped/nearsighted + id = "nearsighted" + tick_interval = -1 + alert_type = null + // This is not "remove on fullheal" as in practice, + // fullheal should instead remove all the sources and in turn cure this + + /// Static list of signals that, when recieved, we force an update to our nearsighted overlay + var/static/list/update_signals = list(SIGNAL_ADDTRAIT(TRAIT_NEARSIGHTED_CORRECTED), SIGNAL_REMOVETRAIT(TRAIT_NEARSIGHTED_CORRECTED)) + /// How severe is our nearsightedness right now + var/overlay_severity = 1 + +/datum/status_effect/grouped/nearsighted/on_apply() + RegisterSignals(owner, update_signals, PROC_REF(update_nearsightedness)) + update_nearsighted_overlay() + return ..() + +/datum/status_effect/grouped/nearsighted/on_remove() + UnregisterSignal(owner, update_signals) + owner.clear_fullscreen(id) + return ..() + +/// Signal proc for when we gain or lose [TRAIT_NEARSIGHTED_CORRECTED] - (temporarily) disable the overlay if we're correcting it +/datum/status_effect/grouped/nearsighted/proc/update_nearsightedness(datum/source) + SIGNAL_HANDLER + + update_nearsighted_overlay() + +/// Checks if we should be nearsighted currently, or if we should clear the overlay +/datum/status_effect/grouped/nearsighted/proc/should_be_nearsighted() + return !HAS_TRAIT(owner, TRAIT_NEARSIGHTED_CORRECTED) + +/// Updates our nearsightd overlay, either removing it if we have the trait or adding it if we don't +/datum/status_effect/grouped/nearsighted/proc/update_nearsighted_overlay() + if(should_be_nearsighted()) + owner.overlay_fullscreen(id, /atom/movable/screen/fullscreen/impaired, overlay_severity) + else + owner.clear_fullscreen(id) + +/// Sets the severity of our nearsighted overlay +/datum/status_effect/grouped/nearsighted/proc/set_nearsighted_severity(to_value) + if(!isnum(to_value)) + return + if(overlay_severity == to_value) + return + + overlay_severity = to_value + update_nearsighted_overlay() + +/// Blindness +/datum/status_effect/grouped/blindness + id = "blindness" + tick_interval = -1 + alert_type = /atom/movable/screen/alert/status_effect/blind + // This is not "remove on fullheal" as in practice, + // fullheal should instead remove all the sources and in turn cure this + +/datum/status_effect/grouped/blindness/on_apply() + if(!CAN_BE_BLIND(owner)) + return FALSE + + owner.overlay_fullscreen(id, /atom/movable/screen/fullscreen/blind) + // You are blind - at most, able to make out shapes near you + owner.add_client_colour(/datum/client_colour/monochrome/blind) + return ..() + +/datum/status_effect/grouped/blindness/on_remove() + owner.clear_fullscreen(id) + owner.remove_client_colour(/datum/client_colour/monochrome/blind) + return ..() + +/atom/movable/screen/alert/status_effect/blind + name = "Blind" + desc = "You can't see! This may be caused by a genetic defect, eye trauma, being unconscious, or something covering your eyes." + icon_state = "blind" + +/// This status effect handles applying a temporary blind to the mob. +/datum/status_effect/temporary_blindness + id = "temporary_blindness" + tick_interval = 2 SECONDS + alert_type = null + remove_on_fullheal = TRUE + +/datum/status_effect/temporary_blindness/on_creation(mob/living/new_owner, duration = 10 SECONDS) + src.duration = duration + return ..() + +/datum/status_effect/temporary_blindness/on_apply() + if(!CAN_BE_BLIND(owner)) + return FALSE + + owner.become_blind(id) + return TRUE + +/datum/status_effect/temporary_blindness/on_remove() + owner.cure_blind(id) + +/datum/status_effect/temporary_blindness/tick(delta_time, times_fired) + if(owner.stat == DEAD) + return + + // Temp. blindness heals faster if our eyes are covered + if(!owner.is_blind_from(EYES_COVERED)) + return + + // Knocks 2 seconds off of our duration + // If we should be deleted, give a message letting them know + var/mob/living/stored_owner = owner + if(remove_duration(2 SECONDS)) + to_chat(stored_owner, span_green("Your eyes start to feel better!")) + return + + // Otherwise add a chance to let them know that it's working + else if(DT_PROB(5, delta_time)) + var/obj/item/thing_covering_eyes = owner.is_eyes_covered() + // "Your blindfold soothes your eyes", for example + to_chat(owner, span_green("Your [thing_covering_eyes?.name || "eye covering"] soothes your eyes.")) + +#undef CAN_BE_BLIND diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index d119887b512..4256d69161a 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -192,7 +192,7 @@ var/is_sleeping_in_darkness = rest_turf.get_lumcount() <= LIGHTING_TILE_IS_DARK // sleeping with a blindfold or in the dark helps us rest - if(HAS_TRAIT_FROM(owner, TRAIT_BLIND, BLINDFOLD_TRAIT) || is_sleeping_in_darkness) + if(owner.is_blind_from(EYES_COVERED) || is_sleeping_in_darkness) healing += 0.1 // sleeping in silence is always better @@ -296,25 +296,6 @@ desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." icon_state = "stasis" -/datum/status_effect/pacify - id = "pacify" - status_type = STATUS_EFFECT_REPLACE - tick_interval = 1 - duration = 100 - alert_type = null - -/datum/status_effect/pacify/on_creation(mob/living/new_owner, set_duration) - if(isnum(set_duration)) - duration = set_duration - . = ..() - -/datum/status_effect/pacify/on_apply() - ADD_TRAIT(owner, TRAIT_PACIFISM, STATUS_EFFECT_TRAIT) - return ..() - -/datum/status_effect/pacify/on_remove() - REMOVE_TRAIT(owner, TRAIT_PACIFISM, STATUS_EFFECT_TRAIT) - /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace id = "his_wrath" duration = -1 diff --git a/code/datums/status_effects/debuffs/pacifism.dm b/code/datums/status_effects/debuffs/pacifism.dm new file mode 100644 index 00000000000..ef186113dc6 --- /dev/null +++ b/code/datums/status_effects/debuffs/pacifism.dm @@ -0,0 +1,14 @@ +/datum/status_effect/pacify + id = "pacify" + alert_type = null + +/datum/status_effect/pacify/on_creation(mob/living/new_owner, duration = 10 SECONDS) + src.duration = duration + return ..() + +/datum/status_effect/pacify/on_apply() + ADD_TRAIT(owner, TRAIT_PACIFISM, id) + return TRUE + +/datum/status_effect/pacify/on_remove() + REMOVE_TRAIT(owner, TRAIT_PACIFISM, id) diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm index e08510f43cc..106740cbc3c 100644 --- a/code/game/machinery/hypnochair.dm +++ b/code/game/machinery/hypnochair.dm @@ -91,7 +91,7 @@ playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, TRUE) return victim = C - if(!(C.get_eye_protection() > 0)) + if(C.get_eye_protection() <= 0) to_chat(C, span_warning("Strobing coloured lights assault you relentlessly! You're losing your ability to think straight!")) C.become_blind(HYPNOCHAIR_TRAIT) ADD_TRAIT(C, TRAIT_DEAF, HYPNOCHAIR_TRAIT) @@ -148,7 +148,7 @@ if(QDELETED(victim)) victim = null return - victim.cure_blind("hypnochair") + victim.cure_blind(HYPNOCHAIR_TRAIT) REMOVE_TRAIT(victim, TRAIT_DEAF, HYPNOCHAIR_TRAIT) if(!(victim.get_eye_protection() > 0)) var/time_diff = world.time - start_time diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 3243f3b7a73..7e609ddd26d 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -437,9 +437,9 @@ if(iscarbon(M)) var/mob/living/carbon/C = M var/covered = "" - if(C.is_mouth_covered(head_only = 1)) + if(C.is_mouth_covered(ITEM_SLOT_HEAD)) covered = "headgear" - else if(C.is_mouth_covered(mask_only = 1)) + else if(C.is_mouth_covered(ITEM_SLOT_MASK)) covered = "mask" if(covered) to_chat(C, span_warning("You have to remove your [covered] first!")) @@ -696,7 +696,7 @@ if(C.client) C.set_eye_blur_if_lower(6 SECONDS) - C.adjust_blindness(1) + C.adjust_temp_blindness(2 SECONDS) if(C.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS. Warning: don't add a stun here. It's a roundstart item with some quirks. C.apply_effects(eyeblur = 5, jitter = 10) flash_color(C, flash_color=paint_color, flash_time=40) diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 0f87ed0627d..603d3b99eb7 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -217,7 +217,7 @@ if(istype(eyes)) if(carbontarget.is_blind()) render_list += "Subject is blind.\n" - else if(HAS_TRAIT(carbontarget, TRAIT_NEARSIGHT)) + else if(carbontarget.is_nearsighted()) render_list += "Subject is nearsighted.\n" // Body part damage report diff --git a/code/game/objects/items/granters/magic/blind.dm b/code/game/objects/items/granters/magic/blind.dm index 1a1bb5e9f0f..ced3b84326b 100644 --- a/code/game/objects/items/granters/magic/blind.dm +++ b/code/game/objects/items/granters/magic/blind.dm @@ -16,7 +16,7 @@ /obj/item/book/granter/action/spell/blind/recoil(mob/living/user) . = ..() to_chat(user, span_warning("You go blind!")) - user.adjust_blindness(10) + user.adjust_temp_blindness(20 SECONDS) /obj/item/book/granter/action/spell/blind/wgw name = "Woody's Got Wood" @@ -30,4 +30,3 @@ "Please, make it stop...", "HELP ME SOMEONE, WHY AM I READING THIS...", ) - diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index c3ee34603ef..2d1a656a042 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -498,7 +498,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_continuous_on = list("smacks", "strikes", "cracks", "beats"), \ attack_verb_simple_on = list("smack", "strike", "crack", "beat")) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) - ADD_TRAIT(src, TRAIT_BLIND_TOOL, ITEM_BLIND_TRAIT) + ADD_TRAIT(src, TRAIT_BLIND_TOOL, INNATE_TRAIT) /* * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 785eeb330f3..4d2e23dcdac 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -649,4 +649,3 @@ /obj/structure/displaycase/forsale/kitchen desc = "A display case with an ID-card swiper. Use your ID to purchase the contents. Meant for the bartender and chef." req_one_access = list(ACCESS_KITCHEN, ACCESS_BAR) - diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index fdaaa615a17..33431a5783b 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -120,19 +120,6 @@ log_admin("[key_name(usr)] spawned cargo pack [chosen] at [AREACOORD(usr)]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Cargo") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/admins/proc/toggletintedweldhelmets() - set category = "Debug" - set desc="Reduces view range when wearing welding helmets" - set name="Toggle tinted welding helmes" - GLOB.tinted_weldhelh = !( GLOB.tinted_weldhelh ) - if (GLOB.tinted_weldhelh) - to_chat(world, "The tinted_weldhelh has been enabled!", confidential = TRUE) - else - to_chat(world, "The tinted_weldhelh has been disabled!", confidential = TRUE) - log_admin("[key_name(usr)] toggled tinted_weldhelh.") - message_admins("[key_name_admin(usr)] toggled tinted_weldhelh.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Tinted Welding Helmets", "[GLOB.tinted_weldhelh ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /datum/admins/proc/dynamic_mode_options(mob/user) var/dat = {"

Dynamic Mode Options


diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index debfec31520..1b06062d0d9 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -18,18 +18,18 @@ var/list/organs = user.getorganszone(BODY_ZONE_HEAD, TRUE) explosion(user, light_impact_range = 2, adminlog = TRUE, explosion_cause = src) - for(var/mob/living/carbon/human/blinded_humans in range(2, user)) - var/obj/item/organ/internal/eyes/eyes = blinded_humans.getorganslot(ORGAN_SLOT_EYES) - if(!eyes || blinded_humans.is_blind()) + for(var/mob/living/carbon/human/blinded_human in range(2, user)) + var/obj/item/organ/internal/eyes/eyes = blinded_human.getorganslot(ORGAN_SLOT_EYES) + if(!eyes || blinded_human.is_blind()) continue - to_chat(blinded_humans, span_userdanger("You are blinded by a shower of blood!")) - blinded_humans.Stun(20) - blinded_humans.set_eye_blur_if_lower(40 SECONDS) - blinded_humans.adjust_confusion(3 SECONDS) + to_chat(blinded_human, span_userdanger("You are blinded by a shower of blood!")) + blinded_human.Stun(2 SECONDS) + blinded_human.set_eye_blur_if_lower(40 SECONDS) + blinded_human.adjust_confusion(3 SECONDS) - for(var/mob/living/silicon/blinded_silicons in range(2,user)) - to_chat(blinded_silicons, span_userdanger("Your sensors are disabled by a shower of blood!")) - blinded_silicons.Paralyze(60) + for(var/mob/living/silicon/blinded_silicon in range(2,user)) + to_chat(blinded_silicon, span_userdanger("Your sensors are disabled by a shower of blood!")) + blinded_silicon.Paralyze(6 SECONDS) var/turf/user_turf = get_turf(user) user.transfer_observers_to(user_turf) // user is about to be deleted, store orbiters on the turf diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index ada7d492c7e..1afdf169995 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -206,10 +206,15 @@ dna_cost = 1 /datum/action/changeling/sting/blind/sting_action(mob/user, mob/living/carbon/target) + var/obj/item/organ/internal/eyes/eyes = target.getorganslot(ORGAN_SLOT_EYES) + if(!eyes) + to_chat(user, span_notice("You prepare to sting [target], but one of the voices in your hivemind points out they have no eyes.")) + return FALSE + log_combat(user, target, "stung", "blind sting") to_chat(target, span_danger("Your eyes burn horrifically!")) - target.become_nearsighted(EYE_DAMAGE) - target.adjust_blindness(20) + eyes.applyOrganDamage(eyes.maxHealth * 0.8) + target.adjust_temp_blindness(40 SECONDS) target.set_eye_blur_if_lower(80 SECONDS) return TRUE diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index ebecfb59f5c..532b05706b5 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -452,7 +452,7 @@ Striking a noncultist, however, will tear their flesh."} user.dropItemToGround(src, TRUE) user.set_dizzy_if_lower(1 MINUTES) user.Paralyze(100) - user.adjust_blindness(30) + user.adjust_temp_blindness(60 SECONDS) /obj/item/reagent_containers/cup/beaker/unholywater name = "flask of unholy water" diff --git a/code/modules/antagonists/heretic/items/madness_mask.dm b/code/modules/antagonists/heretic/items/madness_mask.dm index 27a613b0a97..e72e9ccd782 100644 --- a/code/modules/antagonists/heretic/items/madness_mask.dm +++ b/code/modules/antagonists/heretic/items/madness_mask.dm @@ -53,9 +53,7 @@ REMOVE_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) for(var/mob/living/carbon/human/human_in_range in view(local_user)) - if(IS_HERETIC_OR_MONSTER(human_in_range)) - continue - if(human_in_range.is_blind()) + if(IS_HERETIC_OR_MONSTER(human_in_range) || human_in_range.is_blind()) continue human_in_range.mob_mood.direct_sanity_drain(rand(-2, -20) * delta_time) diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 9763aabae78..4d95f666bf4 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -85,15 +85,11 @@ /datum/status_effect/cloudstruck/on_apply() owner.add_overlay(mob_overlay) - owner.become_blind(STATUS_EFFECT_TRAIT) - owner.update_blindness() // become_blind is supposed to call this but it doesn't work for some reason because blindness is a fuck + owner.become_blind(id) return TRUE /datum/status_effect/cloudstruck/on_remove() - if(QDELETED(owner)) - return - owner.cure_blind(STATUS_EFFECT_TRAIT) - owner.update_blindness() + owner.cure_blind(id) owner.cut_overlay(mob_overlay) /datum/status_effect/corrosion_curse diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm index 927ebbcf178..02f713e795d 100644 --- a/code/modules/antagonists/heretic/structures/carving_knife.dm +++ b/code/modules/antagonists/heretic/structures/carving_knife.dm @@ -244,6 +244,6 @@ carbon_victim.adjust_confusion(5 SECONDS) carbon_victim.set_jitter_if_lower(20 SECONDS) carbon_victim.set_dizzy_if_lower(40 SECONDS) - carbon_victim.adjust_blindness(2) + carbon_victim.adjust_temp_blindness(4 SECONDS) carbon_victim.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus) playsound(src, 'sound/magic/blind.ogg', 75, TRUE) diff --git a/code/modules/antagonists/traitor/objectives/eyesnatching.dm b/code/modules/antagonists/traitor/objectives/eyesnatching.dm index bd23aa84fc4..231e89f91b0 100644 --- a/code/modules/antagonists/traitor/objectives/eyesnatching.dm +++ b/code/modules/antagonists/traitor/objectives/eyesnatching.dm @@ -201,7 +201,7 @@ if(!do_after(user, 5 SECONDS, target = victim, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, victim))) return - if(!HAS_TRAIT(victim, TRAIT_BLIND)) + if(!victim.is_blind()) to_chat(victim, span_userdanger("You suddenly go blind!")) if(prob(1)) to_chat(victim, span_notice("At least you got a new pirate-y look out of it...")) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 85344b89811..fd451711710 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -399,7 +399,7 @@ M.adjust_confusion_up_to(10 SECONDS, 20 SECONDS) M.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS) M.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS) - M.apply_status_effect(/datum/status_effect/pacify, 100) + M.adjust_pacifism(10 SECONDS) else M.apply_status_effect(/datum/status_effect/trance, 200, TRUE) @@ -413,7 +413,7 @@ M.adjust_confusion_up_to(4 SECONDS, 20 SECONDS) M.adjust_dizzy_up_to(8 SECONDS, 40 SECONDS) M.adjust_drowsiness_up_to(8 SECONDS, 40 SECONDS) - M.apply_status_effect(/datum/status_effect/pacify, 40) + M.adjust_pacifism(4 SECONDS) #undef CONFUSION_STACK_MAX_MULTIPLIER #undef DEVIATION_NONE diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 24ad308a413..05592fc4314 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -20,8 +20,6 @@ var/lighting_alpha /// The current hud icons var/list/icon/current = list() - /// Does wearing these glasses correct some of our vision defects? - var/vision_correction = FALSE /// Colors your vision when worn var/glass_colour_type /// Whether or not vision coloring is forcing @@ -63,7 +61,7 @@ if(H.glasses == src) to_chat(H, span_danger("[src] overloads and blinds you!")) H.flash_act(visual = 1) - H.adjust_blindness(3) + H.adjust_temp_blindness(6 SECONDS) H.set_eye_blur_if_lower(10 SECONDS) eyes.applyOrganDamage(5) @@ -243,7 +241,7 @@ desc = "Made by Nerd. Co." icon_state = "glasses" inhand_icon_state = "glasses" - vision_correction = TRUE //corrects nearsightedness + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/regular/Initialize(mapload) . = ..() @@ -269,7 +267,7 @@ /obj/item/clothing/glasses/regular/atom_destruction(damage_flag) . = ..() - vision_correction = FALSE + clothing_traits -= TRAIT_NEARSIGHTED_CORRECTED /obj/item/clothing/glasses/regular/welder_act(mob/living/user, obj/item/I) . = ..() @@ -285,7 +283,7 @@ /obj/item/clothing/glasses/regular/repair() . = ..() - vision_correction = TRUE + clothing_traits |= TRAIT_NEARSIGHTED_CORRECTED /obj/item/clothing/glasses/regular/thin name = "thin prescription glasses" @@ -397,19 +395,10 @@ icon_state = "blindfold" inhand_icon_state = "blindfold" flash_protect = FLASH_PROTECTION_WELDER - tint = 3 + tint = INFINITY // You WILL Be blind, no matter what darkness_view = 1 dog_fashion = /datum/dog_fashion/head -/obj/item/clothing/glasses/blindfold/equipped(mob/living/carbon/human/user, slot) - . = ..() - if(slot & ITEM_SLOT_EYES) - user.become_blind(BLINDFOLD_TRAIT) - -/obj/item/clothing/glasses/blindfold/dropped(mob/living/carbon/human/user) - ..() - user.cure_blind(BLINDFOLD_TRAIT) - /obj/item/clothing/glasses/trickblindfold name = "blindfold" desc = "A see-through blindfold perfect for cheating at games like pin the stun baton on the clown." diff --git a/code/modules/clothing/masks/muzzle.dm b/code/modules/clothing/masks/muzzle.dm index 067d386c0b8..abcf768d4ee 100644 --- a/code/modules/clothing/masks/muzzle.dm +++ b/code/modules/clothing/masks/muzzle.dm @@ -68,7 +68,7 @@ /obj/item/clothing/mask/muzzle/tape/attack(mob/living/carbon/victim, mob/living/carbon/attacker, params) if(attacker.combat_mode) return ..() - if(victim.is_mouth_covered(head_only = TRUE)) + if(victim.is_mouth_covered(ITEM_SLOT_HEAD)) to_chat(attacker, span_notice("[victim]'s mouth is covered.")) return if(!mob_can_equip(victim, ITEM_SLOT_MASK)) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index f7a83637136..1fb9a1bb912 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -105,6 +105,7 @@ if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !no_id_transfer) transfer_identity(C) C.update_body_parts() + C.clear_mood_event("brain_damage") /obj/item/organ/internal/brain/proc/transfer_identity(mob/living/L) name = "[L.name]'s [initial(name)]" @@ -477,6 +478,15 @@ amount_cured++ return amount_cured +/obj/item/organ/internal/brain/applyOrganDamage(damage_amount, maximum, required_organtype) + . = ..() + if(!owner) + return + if(damage >= 60) + owner.add_mood_event("brain_damage", /datum/mood_event/brain_damage) + else + owner.clear_mood_event("brain_damage") + /// This proc lets the mob's brain decide what bodypart to attack with in an unarmed strike. /obj/item/organ/internal/brain/proc/get_attacking_limb(mob/living/carbon/human/target) var/obj/item/bodypart/arm/active_hand = owner.get_active_hand() diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm index aa034e33dbd..2902b11c3a7 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -30,9 +30,3 @@ emp_damage = 0 else emp_damage = max(emp_damage - (0.5 * delta_time), 0) - -/mob/living/brain/handle_traits(delta_time, times_fired) - return - - - diff --git a/code/modules/mob/living/brain/status_procs.dm b/code/modules/mob/living/brain/status_procs.dm deleted file mode 100644 index e20f82bf2fe..00000000000 --- a/code/modules/mob/living/brain/status_procs.dm +++ /dev/null @@ -1,11 +0,0 @@ -//Here are the procs used to modify status effects of a mob. -//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness -// eye damage, eye_blind, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait. - -/////////////////////////////////// EYE_BLIND //////////////////////////////////// - -/mob/living/brain/adjust_blindness() - return - -/mob/living/brain/set_blindness() - return diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index c3ada1aa5e3..4f8cc38ea54 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -12,8 +12,6 @@ type_of_meat = /obj/item/food/meat/slab/xeno blocks_emissive = EMISSIVE_BLOCK_UNIQUE - var/move_delay_add = 0 // movement delay to add - status_flags = CANUNCONSCIOUS|CANPUSH heat_protection = 0.5 // minor heat insulation diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 0d01dfbb7fa..115ea3c1b7d 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -44,9 +44,3 @@ /mob/living/carbon/alien/adult/Life(delta_time, times_fired) . = ..() handle_organs(delta_time, times_fired) - -/mob/living/carbon/alien/handle_traits(delta_time, times_fired) - . = ..() - //natural reduction of movement delay due to stun. - if(move_delay_add > 0) - move_delay_add = max(0, move_delay_add - (0.5 * rand(1, 2) * delta_time)) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 01091a0eb62..f9524807ac7 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -158,7 +158,7 @@ span_userdanger("[src] leaps at your face!")) // probiscis-blocker handling - if(target.is_mouth_covered(head_only = TRUE)) + if(target.is_mouth_covered(ITEM_SLOT_HEAD)) target.visible_message(span_danger("[src] smashes against [target]'s [target.head]!"), \ span_userdanger("[src] smashes against your [target.head]!")) Die() @@ -263,7 +263,7 @@ var/mob/living/carbon/C = M if(ishuman(C) && !(C.dna.species.no_equip_flags & ITEM_SLOT_MASK)) var/mob/living/carbon/human/H = C - if(H.is_mouth_covered(head_only = 1)) + if(H.is_mouth_covered(ITEM_SLOT_HEAD)) return FALSE return TRUE return FALSE diff --git a/code/modules/mob/living/carbon/alien/status_procs.dm b/code/modules/mob/living/carbon/alien/status_procs.dm deleted file mode 100644 index 040e2d50b74..00000000000 --- a/code/modules/mob/living/carbon/alien/status_procs.dm +++ /dev/null @@ -1,20 +0,0 @@ -//Here are the procs used to modify status effects of a mob. -//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage, -// eye damage, eye_blind, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait. - -/////////////////////////////////// STUN //////////////////////////////////// - -/mob/living/carbon/alien/Stun(amount, ignore_canstun = FALSE) - . = ..() - if(!.) - move_delay_add = min(move_delay_add + round(amount / 2), 10) //a maximum delay of 10 - -/mob/living/carbon/alien/SetStun(amount, ignore_canstun = FALSE) - . = ..() - if(!.) - move_delay_add = min(move_delay_add + round(amount / 2), 10) - -/mob/living/carbon/alien/AdjustStun(amount, ignore_canstun = FALSE) - . = ..() - if(!.) - move_delay_add = clamp(move_delay_add + round(amount/2), 0, 10) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0c09a37db9e..74b661beebd 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -570,15 +570,14 @@ var/new_sight = initial(sight) lighting_alpha = initial(lighting_alpha) - var/obj/item/organ/internal/eyes/E = getorganslot(ORGAN_SLOT_EYES) - if(!E) - update_tint() - else - set_invis_see(E.see_invisible) - set_see_in_dark(E.see_in_dark) - new_sight |= E.sight_flags - if(!isnull(E.lighting_alpha)) - lighting_alpha = E.lighting_alpha + + var/obj/item/organ/internal/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) + if(eyes) + set_invis_see(eyes.see_invisible) + set_see_in_dark(eyes.see_in_dark) + new_sight |= eyes.sight_flags + if(!isnull(eyes.lighting_alpha)) + lighting_alpha = eyes.lighting_alpha if(client.eye && client.eye != src) var/atom/A = client.eye @@ -621,34 +620,34 @@ set_sight(new_sight) return ..() - -//to recalculate and update the mob's total tint from tinted equipment it's wearing. +/** + * Calculates how visually impaired the mob is by their equipment and other factors + * + * This is where clothing adds its various vision limiting effects, such as welding helmets + */ /mob/living/carbon/proc/update_tint() - if(!GLOB.tinted_weldhelh) - return - tinttotal = get_total_tint() - if(tinttotal >= TINT_BLIND) + var/tint = 0 + if(isclothing(head)) + tint += head.tint + if(isclothing(wear_mask)) + tint += wear_mask.tint + if(isclothing(glasses)) + tint += glasses.tint + + var/obj/item/organ/internal/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) + if(eyes) + tint += eyes.tint + + if(tint >= TINT_BLIND) become_blind(EYES_COVERED) - else if(tinttotal >= TINT_DARKENED) + + else if(tint >= TINT_DARKENED) cure_blind(EYES_COVERED) overlay_fullscreen("tint", /atom/movable/screen/fullscreen/impaired, 2) + else cure_blind(EYES_COVERED) - clear_fullscreen("tint", 0) - -/mob/living/carbon/proc/get_total_tint() - . = 0 - if(isclothing(head)) - . += head.tint - if(isclothing(wear_mask)) - . += wear_mask.tint - - var/obj/item/organ/internal/eyes/E = getorganslot(ORGAN_SLOT_EYES) - if(E) - . += E.tint - - else - . += INFINITY + clear_fullscreen("tint", 0 SECONDS) //this handles hud updates /mob/living/carbon/update_damage_hud() @@ -1205,7 +1204,7 @@ var/obscured = check_obscured_slots() // If the eyes are covered by anything but glasses, that thing will be covering any potential glasses as well. - if(glasses && is_eyes_covered(FALSE, TRUE, TRUE) && glasses.wash(clean_types)) + if(glasses && is_eyes_covered(ITEM_SLOT_MASK|ITEM_SLOT_HEAD) && glasses.wash(clean_types)) update_worn_glasses() . = TRUE diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index bf7ebe64a81..7108e654ff0 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -4,13 +4,13 @@ /mob/living/carbon/get_eye_protection() . = ..() - if(HAS_TRAIT_NOT_FROM(src, TRAIT_BLIND, list(UNCONSCIOUS_TRAIT, HYPNOCHAIR_TRAIT))) + if(is_blind() && !is_blind_from(list(UNCONSCIOUS_TRAIT, HYPNOCHAIR_TRAIT))) return INFINITY //For all my homies that can not see in the world - var/obj/item/organ/internal/eyes/E = getorganslot(ORGAN_SLOT_EYES) - if(!E) - return INFINITY //Can't get flashed without eyes + var/obj/item/organ/internal/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) + if(eyes) + . += eyes.flash_protect else - . += E.flash_protect + return INFINITY //Can't get flashed without eyes if(isclothing(head)) //Adds head protection . += head.flash_protect if(isclothing(glasses)) //Glasses @@ -28,24 +28,32 @@ else . += E.bang_protect -/mob/living/carbon/is_mouth_covered(head_only = FALSE, mask_only = FALSE) - if( (!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)) ) - return TRUE - -/mob/living/carbon/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE) - if(check_head && head && (head.flags_cover & HEADCOVERSEYES)) +/mob/living/carbon/is_mouth_covered(check_flags = ALL) + if((check_flags & ITEM_SLOT_HEAD) && head && (head.flags_cover & HEADCOVERSMOUTH)) return head - if(check_mask && wear_mask && (wear_mask.flags_cover & MASKCOVERSEYES)) + if((check_flags & ITEM_SLOT_MASK) && wear_mask && (wear_mask.flags_cover & HEADCOVERSMOUTH)) return wear_mask - if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES)) + + return null + +/mob/living/carbon/is_eyes_covered(check_flags = ALL) + if((check_flags & ITEM_SLOT_HEAD) && head && (head.flags_cover & HEADCOVERSEYES)) + return head + if((check_flags & ITEM_SLOT_MASK) && wear_mask && (wear_mask.flags_cover & MASKCOVERSEYES)) + return wear_mask + if((check_flags & ITEM_SLOT_EYES) && glasses && (glasses.flags_cover & GLASSESCOVERSEYES)) return glasses -/mob/living/carbon/is_pepper_proof(check_head = TRUE, check_mask = TRUE) - if(check_head &&(head?.flags_cover & PEPPERPROOF)) + return null + +/mob/living/carbon/is_pepper_proof(check_flags = ALL) + if((check_flags & ITEM_SLOT_HEAD) && head && (head.flags_cover & PEPPERPROOF)) return head - if(check_mask &&(wear_mask?.flags_cover & PEPPERPROOF)) + if((check_flags & ITEM_SLOT_MASK) && wear_mask && (wear_mask.flags_cover & PEPPERPROOF)) return wear_mask + return null + /mob/living/carbon/check_projectile_dismemberment(obj/projectile/P, def_zone) var/obj/item/bodypart/affecting = get_bodypart(def_zone) if(affecting && affecting.dismemberable && affecting.get_damage() >= (affecting.max_damage - P.dismemberment)) @@ -630,40 +638,39 @@ if(visual) return - if (damage == 1) - to_chat(src, span_warning("Your eyes sting a little.")) - if(prob(40)) - eyes.applyOrganDamage(1) + switch(damage) + if(1) + to_chat(src, span_warning("Your eyes sting a little.")) + if(prob(40)) + eyes.applyOrganDamage(1) - else if (damage == 2) - to_chat(src, span_warning("Your eyes burn.")) - eyes.applyOrganDamage(rand(2, 4)) + if(2) + to_chat(src, span_warning("Your eyes burn.")) + eyes.applyOrganDamage(rand(2, 4)) - else if( damage >= 3) - to_chat(src, span_warning("Your eyes itch and burn severely!")) - eyes.applyOrganDamage(rand(12, 16)) + if(3 to INFINITY) + to_chat(src, span_warning("Your eyes itch and burn severely!")) + eyes.applyOrganDamage(rand(12, 16)) if(eyes.damage > 10) - adjust_blindness(damage) + adjust_temp_blindness(damage * 2 SECONDS) set_eye_blur_if_lower(damage * rand(6 SECONDS, 12 SECONDS)) - if(eyes.damage > 20) - if(prob(eyes.damage - 20)) - if(!HAS_TRAIT(src, TRAIT_NEARSIGHT)) - to_chat(src, span_warning("Your eyes start to burn badly!")) - become_nearsighted(EYE_DAMAGE) + if(eyes.damage > eyes.low_threshold) + if(!is_nearsighted_from(EYE_DAMAGE) && prob(eyes.damage - eyes.low_threshold)) + to_chat(src, span_warning("Your eyes start to burn badly!")) + eyes.applyOrganDamage(eyes.low_threshold) - else if(prob(eyes.damage - 25)) - if(!is_blind()) - to_chat(src, span_warning("You can't see anything!")) + else if(!is_blind() && prob(eyes.damage - eyes.high_threshold)) + to_chat(src, span_warning("You can't see anything!")) eyes.applyOrganDamage(eyes.maxHealth) else to_chat(src, span_warning("Your eyes are really starting to hurt. This can't be good for you!")) - return 1 - else if(damage == 0) // just enough protection - if(prob(20)) - to_chat(src, span_notice("Something bright flashes in the corner of your vision!")) + return TRUE + + else if(damage == 0 && prob(20)) // just enough protection + to_chat(src, span_notice("Something bright flashes in the corner of your vision!")) /mob/living/carbon/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index b703834f566..25ab43a4dd0 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -67,9 +67,6 @@ var/rotate_on_lying = 1 - /// Total level of visualy impairing items - var/tinttotal = 0 - /// Gets filled up in [/datum/species/proc/replace_body]. /// Will either contain a list of typepaths if nothing has been created yet, /// or a list of the body part objects. diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 30a8b1ec003..3f0b1ddb512 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -352,7 +352,7 @@ if(mob_mood.sanity <= SANITY_DISTURBED) msg += "[t_He] seem[p_s()] distressed.\n" living_user.add_mood_event("empath", /datum/mood_event/sad_empath, src) - if (is_blind()) + if(is_blind()) msg += "[t_He] appear[p_s()] to be staring off into space.\n" if (HAS_TRAIT(src, TRAIT_DEAF)) msg += "[t_He] appear[p_s()] to not be responding to noises.\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 2cd4530dfb4..c73606438e1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -6,6 +6,9 @@ setup_mood() + // All start without eyes, and get them via set species + become_blind(NO_EYES) + create_dna() dna.species.create_fresh_body(src) setup_human_dna() @@ -647,7 +650,7 @@ if(!is_mouth_covered() && clean_lips()) . = TRUE - if(glasses && is_eyes_covered(FALSE, TRUE, TRUE) && glasses.wash(clean_types)) + if(glasses && is_eyes_covered(ITEM_SLOT_MASK|ITEM_SLOT_HEAD) && glasses.wash(clean_types)) update_worn_glasses() . = TRUE @@ -738,11 +741,6 @@ if(general_record) general_record.fields["name"] = newname -/mob/living/carbon/human/get_total_tint() - . = ..() - if(glasses) - . += glasses.tint - /mob/living/carbon/human/update_health_hud() if(!client || !hud_used) return @@ -799,12 +797,6 @@ return ..() -/mob/living/carbon/human/is_nearsighted() - var/obj/item/clothing/glasses/eyewear = glasses - if(istype(eyewear) && eyewear.vision_correction) - return FALSE - return ..() - /mob/living/carbon/human/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) if(blood && HAS_TRAIT(src, TRAIT_NOBLOOD) && !HAS_TRAIT(src, TRAIT_TOXINLOVER)) if(message) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 598b024d3a3..9d746bc7941 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -136,8 +136,6 @@ update_glasses_color(G, 1) if(G.tint) update_tint() - if(G.vision_correction) - clear_fullscreen("nearsighted") if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() update_worn_glasses() @@ -263,9 +261,6 @@ update_glasses_color(G, 0) if(G.tint) update_tint() - if(G.vision_correction) - if(HAS_TRAIT(src, TRAIT_NEARSIGHT)) - overlay_fullscreen("nearsighted", /atom/movable/screen/fullscreen/impaired, 1) if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() if(!QDELETED(src)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 2188c3f4ac2..94e68840c6c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -70,14 +70,6 @@ return (occupied_space.contents_pressure_protection * ONE_ATMOSPHERE + (1 - occupied_space.contents_pressure_protection) * pressure) return pressure - -/mob/living/carbon/human/handle_traits(delta_time, times_fired) - if (getOrganLoss(ORGAN_SLOT_BRAIN) >= 60) - add_mood_event("brain_damage", /datum/mood_event/brain_damage) - else - clear_mood_event("brain_damage") - return ..() - /mob/living/carbon/human/breathe() if(!HAS_TRAIT(src, TRAIT_NOBREATH)) return ..() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 9bb519c3872..121ec9f1042 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -921,8 +921,8 @@ GLOBAL_LIST_EMPTY(features_by_species) if(ITEM_SLOT_EYES) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE - var/obj/item/organ/internal/eyes/E = H.getorganslot(ORGAN_SLOT_EYES) - if(E?.no_glasses) + var/obj/item/organ/internal/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + if(eyes?.no_glasses) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) if(ITEM_SLOT_HEAD) @@ -1149,7 +1149,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/atk_effect = attacking_bodypart.unarmed_attack_effect if(atk_effect == ATTACK_EFFECT_BITE) - if(user.is_mouth_covered(mask_only = TRUE)) + if(user.is_mouth_covered(ITEM_SLOT_MASK)) to_chat(user, span_warning("You can't [atk_verb] with your mouth covered!")) return FALSE user.do_attack_animation(target, atk_effect) diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 34a819d34b8..de35eb8872b 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -1,6 +1,5 @@ //Here are the procs used to modify status effects of a mob. -//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage, -//eye_blind, TRAIT_BLIND trait, TRAIT_NEARSIGHT trait, and TRAIT_HUSK trait. +//The effects include: stun, knockdown, unconscious, sleeping, resting /mob/living/carbon/IsParalyzed(include_stamcrit = TRUE) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 1e3582cf140..18dd38adcd6 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -67,9 +67,6 @@ handle_gravity(delta_time, times_fired) - if(stat != DEAD) - handle_traits(delta_time, times_fired) // eye, ear, brain damages - if(machine) machine.check_eye(src) @@ -136,14 +133,6 @@ /mob/living/proc/has_reagent(reagent, amount = -1, needs_metabolizing = FALSE) return reagents.has_reagent(reagent, amount, needs_metabolizing) -/mob/living/proc/handle_traits(delta_time, times_fired) - //Eyes - if(eye_blind) //blindness, heals slowly over time - if(HAS_TRAIT_FROM(src, TRAIT_BLIND, EYES_COVERED)) //covering your eyes heals blurry eyes faster - adjust_blindness(-1.5 * delta_time) - else if(!stat && !(HAS_TRAIT(src, TRAIT_BLIND))) - adjust_blindness(-0.5 * delta_time) - /mob/living/proc/update_damage_hud() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6f6dd0de33a..8a1334d0979 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -896,10 +896,7 @@ // These should be tracked by status effects losebreath = 0 - set_blindness(0) set_disgust(0) - cure_nearsighted() - cure_blind() cure_husk() if(heal_flags & HEAL_TEMP) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index ec61f5c64c5..39b3b053669 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -46,13 +46,48 @@ return 1 return 0 -/mob/living/proc/is_mouth_covered(head_only = 0, mask_only = 0) - return FALSE +/** + * Checks if our mob has their mouth covered. + * + * Note that we only care about [ITEM_SLOT_HEAD] and [ITEM_SLOT_MASK]. + * (so if you check all slots, it'll return head, then mask) + *That is also the priority order + * Arguments + * * check_flags: What item slots should we check? + * + * Retuns a truthy value (a ref to what is covering mouth), or a falsy value (null) + */ +/mob/living/proc/is_mouth_covered(check_flags = ALL) + return null + +/** + * Checks if our mob has their eyes covered. + * + * Note that we only care about [ITEM_SLOT_HEAD], [ITEM_SLOT_MASK], and [ITEM_SLOT_GLASSES]. + * That is also the priority order (so if you check all slots, it'll return head, then mask, then glasses) + * + * Arguments + * * check_flags: What item slots should we check? + * + * Retuns a truthy value (a ref to what is covering eyes), or a falsy value (null) + */ +/mob/living/proc/is_eyes_covered(check_flags = ALL) + return null + +/** + * Checks if our mob is protected from pepper spray. + * + * Note that we only care about [ITEM_SLOT_HEAD] and [ITEM_SLOT_MASK]. + * That is also the priority order (so if you check all slots, it'll return head, then mask) + * + * Arguments + * * check_flags: What item slots should we check? + * + * Retuns a truthy value (a ref to what is protecting us), or a falsy value (null) + */ +/mob/living/proc/is_pepper_proof(check_flags = ALL) + return null -/mob/living/proc/is_eyes_covered(check_glasses = 1, check_head = 1, check_mask = 1) - return FALSE -/mob/living/proc/is_pepper_proof(check_head = TRUE, check_mask = TRUE) - return FALSE /mob/living/proc/on_hit(obj/projectile/P) return BULLET_ACT_HIT @@ -289,7 +324,7 @@ to_chat(user, span_warning("You don't want to hurt anyone!")) return FALSE - if(user.is_muzzled() || user.is_mouth_covered(FALSE, TRUE)) + if(user.is_muzzled() || user.is_mouth_covered(ITEM_SLOT_MASK)) to_chat(user, span_warning("You can't bite with your mouth covered!")) return FALSE user.do_attack_animation(src, ATTACK_EFFECT_BITE) diff --git a/code/modules/mob/living/living_fov.dm b/code/modules/mob/living/living_fov.dm index 90e5ee5221a..7de84d59988 100644 --- a/code/modules/mob/living/living_fov.dm +++ b/code/modules/mob/living/living_fov.dm @@ -45,7 +45,7 @@ . = TRUE // Handling nearsightnedness - if(. && is_nearsighted()) + if(. && is_nearsighted_currently()) if((rel_x >= NEARSIGHTNESS_FOV_BLINDNESS || rel_x <= -NEARSIGHTNESS_FOV_BLINDNESS) || (rel_y >= NEARSIGHTNESS_FOV_BLINDNESS || rel_y <= -NEARSIGHTNESS_FOV_BLINDNESS)) return FALSE diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 1f9cd4023e3..2e23a4f5ac7 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -291,13 +291,13 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( deaf_type = MSG_AUDIBLE // Create map text prior to modifying message for goonchat, sign lang edition - if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && !(stat == UNCONSCIOUS || stat == HARD_CRIT || is_blind(src)) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) + if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && !(stat == UNCONSCIOUS || stat == HARD_CRIT || is_blind()) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) if (message_mods[MODE_CUSTOM_SAY_ERASE_INPUT]) create_chat_message(speaker, null, message_mods[MODE_CUSTOM_SAY_EMOTE], spans, EMOTE_MESSAGE) else create_chat_message(speaker, message_language, raw_message, spans) - if(is_blind(src)) + if(is_blind()) return FALSE message = deaf_message diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 0c2e14ea026..5bc93b5b180 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -5,8 +5,6 @@ update_gravity(has_gravity()) - handle_traits(delta_time, times_fired) - if(malfhack?.aidisabled) deltimer(malfhacking) // This proc handles cleanup of screen notifications and @@ -155,14 +153,14 @@ else to_chat(src, span_notice("Alert cancelled. Power has been restored without our assistance.")) setAiRestorePowerRoutine(POWER_RESTORATION_OFF) - set_blindness(0) + remove_status_effect(/datum/status_effect/temporary_blindness) apc_override = null update_sight() /mob/living/silicon/ai/proc/ai_lose_power() disconnect_shell() setAiRestorePowerRoutine(POWER_RESTORATION_START) - adjust_blindness(1) + adjust_temp_blindness(2 SECONDS) update_sight() to_chat(src, span_alert("You've lost power!")) addtimer(CALLBACK(src, PROC_REF(start_RestorePowerRoutine)), 20) diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 8250697e15e..857f188f7f3 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -81,8 +81,7 @@ if(!M.is_blind()) return M for(var/obj/vehicle/sealed/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you - for(var/O in M.occupants) - var/mob/mechamob = O + for(var/mob/mechamob as anything in M.occupants) if(mechamob.client && !mechamob.is_blind()) return mechamob return null diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 6b147cff367..4bd8b7fcec2 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -195,4 +195,4 @@ return things /datum/action/cooldown/spell/aoe/blindness/cast_on_thing_in_aoe(mob/living/victim, atom/caster) - victim.adjust_blindness(4) + victim.adjust_temp_blindness(8 SECONDS) diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 617945e7e0c..9f30a634901 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -13,9 +13,12 @@ if(!.) return - if(buckled) + // We get some passive bruteloss healing if we're not dead + if(stat != DEAD && DT_PROB(16, delta_time)) + adjustBruteLoss(-0.5 * delta_time) + if(ismob(buckled)) handle_feeding(delta_time, times_fired) - if(stat) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech + if(stat != CONSCIOUS) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech return handle_nutrition(delta_time, times_fired) if(QDELETED(src)) // Stop if the slime split during handle_nutrition() @@ -164,15 +167,7 @@ updatehealth() - -/mob/living/simple_animal/slime/handle_traits(delta_time, times_fired) - . = ..() - if(!stat && DT_PROB(16, delta_time)) - adjustBruteLoss(-0.5 * delta_time) - /mob/living/simple_animal/slime/proc/handle_feeding(delta_time, times_fired) - if(!ismob(buckled)) - return var/mob/M = buckled if(stat) diff --git a/code/modules/mob/living/simple_animal/status_procs.dm b/code/modules/mob/living/simple_animal/status_procs.dm deleted file mode 100644 index 7c03351d389..00000000000 --- a/code/modules/mob/living/simple_animal/status_procs.dm +++ /dev/null @@ -1,9 +0,0 @@ - -/mob/living/simple_animal/adjust_blindness() - return - -/mob/living/simple_animal/set_blindness() - return - -/mob/living/simple_animal/become_blind() - return diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index f8ff5cac599..c61c5a21abc 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -1,6 +1,5 @@ //Here are the procs used to modify status effects of a mob. -//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, -// eye damage, eye_blind, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait. +//The effects include: stun, knockdown, unconscious, sleeping, resting #define IS_STUN_IMMUNE(source, ignore_canstun) ((source.status_flags & GODMODE) || (!ignore_canstun && (!(source.status_flags & CANKNOCKDOWN) || HAS_TRAIT(source, TRAIT_STUNIMMUNE)))) @@ -518,32 +517,6 @@ return TRUE return FALSE -/* TRAIT PROCS */ -/mob/living/proc/cure_blind(source) - if(source) - REMOVE_TRAIT(src, TRAIT_BLIND, source) - else - REMOVE_TRAIT_NOT_FROM(src, TRAIT_BLIND, list(QUIRK_TRAIT, EYES_COVERED, BLINDFOLD_TRAIT)) - if(!HAS_TRAIT(src, TRAIT_BLIND)) - update_blindness() - -/mob/living/proc/become_blind(source) - if(!HAS_TRAIT(src, TRAIT_BLIND)) // not blind already, add trait then overlay - ADD_TRAIT(src, TRAIT_BLIND, source) - update_blindness() - else - ADD_TRAIT(src, TRAIT_BLIND, source) - -/mob/living/proc/cure_nearsighted(source) - REMOVE_TRAIT(src, TRAIT_NEARSIGHT, source) - if(!HAS_TRAIT(src, TRAIT_NEARSIGHT)) - clear_fullscreen("nearsighted") - -/mob/living/proc/become_nearsighted(source) - if(!HAS_TRAIT(src, TRAIT_NEARSIGHT)) - overlay_fullscreen("nearsighted", /atom/movable/screen/fullscreen/impaired, 1) - ADD_TRAIT(src, TRAIT_NEARSIGHT, source) - /mob/living/proc/cure_husk(source) REMOVE_TRAIT(src, TRAIT_HUSK, source) if(!HAS_TRAIT(src, TRAIT_HUSK)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 39557323252..df83b4396a0 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -211,7 +211,7 @@ msg = copytext_char(msg, 1, MAX_MESSAGE_LEN) if(type) - if(type & MSG_VISUAL && is_blind() )//Vision related + if(type & MSG_VISUAL && is_blind())//Vision related if(!alt_msg) return else @@ -1191,10 +1191,6 @@ /mob/proc/has_nightvision() return see_in_dark >= NIGHTVISION_FOV_RANGE -/// Is this mob affected by nearsight -/mob/proc/is_nearsighted() - return HAS_TRAIT(src, TRAIT_NEARSIGHT) - /// This mob is abile to read books /mob/proc/is_literate() return HAS_TRAIT(src, TRAIT_LITERATE) && !HAS_TRAIT(src, TRAIT_ILLITERATE) @@ -1402,9 +1398,6 @@ if(NAMEOF(src, stat)) set_stat(var_value) . = TRUE - if(NAMEOF(src, eye_blind)) - set_blindness(var_value) - . = TRUE if(!isnull(.)) datum_flags |= DF_VAR_EDITED diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 0ef423476ed..d6434d82ad2 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -83,8 +83,6 @@ */ var/notransform = null //Carbon - /// Is the mob blind - var/eye_blind = 0 //Carbon /// What is the mobs real name (name is overridden for disguises etc) var/real_name = null diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 7e3ed64bd3e..3b0bb13694d 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -206,11 +206,6 @@ return " \[[real_name]\]" return "" -///Checks if the mob is able to see or not. eye_blind is temporary blindness, the trait is if they're permanently blind. -/mob/proc/is_blind() - SHOULD_BE_PURE(TRUE) - return eye_blind ? TRUE : HAS_TRAIT(src, TRAIT_BLIND) - // moved out of admins.dm because things other than admin procs were calling this. /// Returns TRUE if the game has started and we're either an AI with a 0th law, or we're someone with a special role/antag datum /proc/is_special_character(mob/M) diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 02a7db2c5b7..ebfceaf2971 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -1,49 +1,4 @@ //Here are the procs used to modify status effects of a mob. -/** - * Adjust a mobs blindness by an amount - * - * Will apply the blind alerts if needed - */ -/mob/proc/adjust_blindness(amount) - var/old_eye_blind = eye_blind - eye_blind = max(0, eye_blind + amount) - if(!old_eye_blind || !eye_blind && !HAS_TRAIT(src, TRAIT_BLIND)) - update_blindness() -/** - * Force set the blindness of a mob to some level - */ -/mob/proc/set_blindness(amount) - var/old_eye_blind = eye_blind - eye_blind = max(amount, 0) - if(!old_eye_blind || !eye_blind && !HAS_TRAIT(src, TRAIT_BLIND)) - update_blindness() - - -/// proc that adds and removes blindness overlays when necessary -/mob/proc/update_blindness() - switch(stat) - if(CONSCIOUS, SOFT_CRIT) - if(HAS_TRAIT(src, TRAIT_BLIND) || eye_blind) - throw_alert(ALERT_BLIND, /atom/movable/screen/alert/blind) - do_set_blindness(TRUE) - else - do_set_blindness(FALSE) - if(UNCONSCIOUS, HARD_CRIT) - do_set_blindness(TRUE) - if(DEAD) - do_set_blindness(FALSE) - - -///Proc that handles adding and removing the blindness overlays. -/mob/proc/do_set_blindness(now_blind) - if(now_blind) - overlay_fullscreen("blind", /atom/movable/screen/fullscreen/blind) - // You are blind why should you be able to make out details like color, only shapes near you - add_client_colour(/datum/client_colour/monochrome/blind) - else - clear_alert(ALERT_BLIND) - clear_fullscreen("blind") - remove_client_colour(/datum/client_colour/monochrome/blind) ///Adjust the disgust level of a mob /mob/proc/adjust_disgust(amount) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index aeacbe34d91..61fdac9fbbf 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -88,17 +88,16 @@ /datum/reagent/consumable/carrotjuice/on_mob_life(mob/living/carbon/affected_mob, delta_time, times_fired) affected_mob.adjust_eye_blur(-2 SECONDS * REM * delta_time) - affected_mob.adjust_blindness(-1 * REM * delta_time) + affected_mob.adjust_temp_blindness(-2 SECONDS * REM * delta_time) switch(current_cycle) if(1 to 20) //nothing if(21 to 110) if(DT_PROB(100 * (1 - (sqrt(110 - current_cycle) / 10)), delta_time)) - affected_mob.cure_nearsighted(list(EYE_DAMAGE)) + affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, -2) if(110 to INFINITY) - affected_mob.cure_nearsighted(list(EYE_DAMAGE)) - ..() - return + affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, -2) + return ..() /datum/reagent/consumable/berryjuice name = "Berry Juice" diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index cbee27a2ceb..0fa8b87ad84 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -383,16 +383,14 @@ var/mob/living/carbon/victim = exposed_mob if(methods & (TOUCH|VAPOR)) - var/pepper_proof = victim.is_pepper_proof() - //check for protection //actually handle the pepperspray effects - if (!(pepper_proof)) // you need both eye and mouth protection + if (!victim.is_pepper_proof()) // you need both eye and mouth protection if(prob(5)) victim.emote("scream") victim.emote("cry") victim.set_eye_blur_if_lower(10 SECONDS) - victim.adjust_blindness(3) // 6 seconds + victim.adjust_temp_blindness(6 SECONDS) victim.set_confusion_if_lower(5 SECONDS) victim.Knockdown(3 SECONDS) victim.add_movespeed_modifier(/datum/movespeed_modifier/reagent/pepperspray) @@ -498,7 +496,7 @@ if (!tear_proof) to_chat(exposed_mob, span_warning("Your eyes sting!")) victim.emote("cry") - victim.set_eye_blur_if_lower(6 SECONDS) + victim.adjust_eye_blur(6 SECONDS) /datum/reagent/consumable/sprinkles name = "Sprinkles" diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm index a6d5224d6c2..72f6d5a8e6c 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm @@ -28,13 +28,10 @@ ph = 7 liver_damage = 0 -/datum/reagent/impurity/methanol/on_mob_life(mob/living/carbon/owner, delta_time) - var/obj/item/organ/internal/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) - if(!eyes) - return ..() - eyes.applyOrganDamage(0.5 * REM * delta_time, required_organtype = affected_organtype) - ..() - +/datum/reagent/impurity/methanol/on_mob_life(mob/living/carbon/affected_mob, delta_time, times_fired) + var/obj/item/organ/internal/eyes/eyes = affected_mob.getorganslot(ORGAN_SLOT_EYES) + eyes?.applyOrganDamage(0.5 * REM * delta_time, required_organtype = affected_organtype) + return ..() //Chloral Hydrate - Impure Version /datum/reagent/impurity/chloralax diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 89f710dbf48..4e1c66c8886 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -667,26 +667,24 @@ restore_eyesight(prev_affected_mob, eyes) /datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/affected_mob, delta_time, times_fired) - affected_mob.adjust_blindness(-2 * REM * delta_time * normalise_creation_purity()) - affected_mob.adjust_eye_blur(-4 SECONDS * REM * delta_time * normalise_creation_purity()) + var/normalized_purity = normalise_creation_purity() + affected_mob.adjust_temp_blindness(-4 SECONDS * REM * delta_time * normalized_purity) + affected_mob.adjust_eye_blur(-4 SECONDS * REM * delta_time * normalized_purity) var/obj/item/organ/internal/eyes/eyes = affected_mob.getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return ..() - var/fix_prob = 10 - if(creation_purity >= 1) - fix_prob = 100 - eyes.applyOrganDamage(-2 * REM * delta_time * normalise_creation_purity(), required_organtype = affected_organtype) - if(HAS_TRAIT_FROM(affected_mob, TRAIT_BLIND, EYE_DAMAGE)) - if(DT_PROB(fix_prob, delta_time)) - to_chat(affected_mob, span_warning("Your vision slowly returns...")) - affected_mob.cure_blind(EYE_DAMAGE) - affected_mob.cure_nearsighted(EYE_DAMAGE) - affected_mob.set_eye_blur_if_lower(70 SECONDS) - else if(HAS_TRAIT_FROM(affected_mob, TRAIT_NEARSIGHT, EYE_DAMAGE)) - to_chat(affected_mob, span_warning("The blackness in your peripheral vision fades.")) - affected_mob.cure_nearsighted(EYE_DAMAGE) - affected_mob.set_eye_blur_if_lower(20 SECONDS) - ..() + if(eyes) + // Healing eye damage will cure nearsightedness and blindness from ... eye damage + eyes.applyOrganDamage(-2 * REM * delta_time * normalise_creation_purity(), required_organtype = affected_organtype) + // If our eyes are seriously damaged, we have a probability of causing eye blur while healing depending on purity + if(eyes.damaged && DT_PROB(16 - min(normalized_purity * 6, 12), delta_time)) + // While healing, gives some eye blur + if(affected_mob.is_blind_from(EYE_DAMAGE)) + to_chat(affected_mob, span_warning("Your vision slowly returns...")) + affected_mob.adjust_eye_blur(20 SECONDS) + else if(affected_mob.is_nearsighted_from(EYE_DAMAGE)) + to_chat(affected_mob, span_warning("The blackness in your peripheral vision begins to fade.")) + affected_mob.adjust_eye_blur(5 SECONDS) + + return ..() /datum/reagent/medicine/oculine/on_mob_delete(mob/living/affected_mob) var/obj/item/organ/internal/eyes/eyes = affected_mob.getorganslot(ORGAN_SLOT_EYES) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index b4d2025904c..928b35541f2 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -165,9 +165,9 @@ return FALSE var/mob/living/carbon/C = eater var/covered = "" - if(C.is_mouth_covered(head_only = 1)) + if(C.is_mouth_covered(ITEM_SLOT_HEAD)) covered = "headgear" - else if(C.is_mouth_covered(mask_only = 1)) + else if(C.is_mouth_covered(ITEM_SLOT_MASK)) covered = "mask" if(covered) var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]" diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm index 4bbe22bd565..f99e687448e 100644 --- a/code/modules/religion/burdened/psyker.dm +++ b/code/modules/religion/burdened/psyker.dm @@ -35,15 +35,31 @@ limb_id = BODYPART_ID_PSYKER is_dimorphic = FALSE should_draw_greyscale = FALSE - bodypart_traits = list(TRAIT_DISFIGURED, TRAIT_BALD, TRAIT_SHAVED, TRAIT_BLIND) + bodypart_traits = list(TRAIT_DISFIGURED, TRAIT_BALD, TRAIT_SHAVED) /obj/item/bodypart/head/psyker/try_attach_limb(mob/living/carbon/new_head_owner, special, abort) . = ..() - if(!. || !new_head_owner.dna?.species) + 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() /mob/living/carbon/human/proc/slow_psykerize() if(stat == DEAD || !get_bodypart(BODY_ZONE_HEAD) || istype(get_bodypart(BODY_ZONE_HEAD), /obj/item/bodypart/head/psyker)) diff --git a/code/modules/spells/spell_types/pointed/abyssal_gaze.dm b/code/modules/spells/spell_types/pointed/abyssal_gaze.dm index cfa6ea5dbcb..a7336ef7834 100644 --- a/code/modules/spells/spell_types/pointed/abyssal_gaze.dm +++ b/code/modules/spells/spell_types/pointed/abyssal_gaze.dm @@ -36,21 +36,8 @@ to_chat(cast_on, span_userdanger("A freezing darkness surrounds you...")) cast_on.playsound_local(get_turf(cast_on), 'sound/hallucinations/i_see_you1.ogg', 50, 1) owner.playsound_local(get_turf(owner), 'sound/effects/ghost2.ogg', 50, 1) - cast_on.become_blind(ABYSSAL_GAZE_BLIND) - addtimer(CALLBACK(src, PROC_REF(cure_blindness), cast_on), blind_duration) + cast_on.adjust_temp_blindness(blind_duration) if(ishuman(cast_on)) var/mob/living/carbon/human/human_cast_on = cast_on human_cast_on.adjust_coretemperature(-amount_to_cool) cast_on.adjust_bodytemperature(-amount_to_cool) - -/** - * cure_blidness: Cures Abyssal Gaze blindness from the target - * - * Arguments: - * * target The mob that is being cured of the blindness. - */ -/datum/action/cooldown/spell/pointed/abyssal_gaze/proc/cure_blindness(mob/living/carbon/cast_on) - if(QDELETED(cast_on) || !istype(cast_on)) - return - - cast_on.cure_blind(ABYSSAL_GAZE_BLIND) diff --git a/code/modules/spells/spell_types/pointed/blind.dm b/code/modules/spells/spell_types/pointed/blind.dm index 088e761af6f..982cb9be534 100644 --- a/code/modules/spells/spell_types/pointed/blind.dm +++ b/code/modules/spells/spell_types/pointed/blind.dm @@ -16,11 +16,9 @@ active_msg = "You prepare to blind a target..." /// The amount of blind to apply - var/eye_blind_amount = 10 + var/eye_blind_duration = 20 SECONDS /// The amount of blurriness to apply var/eye_blur_duration = 40 SECONDS - /// The duration of the blind mutation placed on the person - var/blind_mutation_duration = 30 SECONDS /datum/action/cooldown/spell/pointed/blind/is_valid_target(atom/cast_on) . = ..() @@ -40,12 +38,6 @@ return FALSE to_chat(cast_on, span_warning("Your eyes cry out in pain!")) - cast_on.adjust_blindness(eye_blind_amount) + cast_on.adjust_temp_blindness(eye_blind_duration) cast_on.set_eye_blur_if_lower(eye_blur_duration) - if(cast_on.dna && blind_mutation_duration > 0 SECONDS) - cast_on.dna.add_mutation(/datum/mutation/human/blind) - addtimer(CALLBACK(src, PROC_REF(fix_eyes), cast_on), blind_mutation_duration) return TRUE - -/datum/action/cooldown/spell/pointed/blind/proc/fix_eyes(mob/living/carbon/human/cast_on) - cast_on.dna?.remove_mutation(/datum/mutation/human/blind) diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 2157c5cfd69..a9daa1ab941 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -48,11 +48,9 @@ span_notice("[user] completes the surgery on [target]'s eyes."), ) display_pain(target, "Your vision blurs, but it seems like you can see a little better now!") - target.cure_blind(list(EYE_DAMAGE)) - target.set_blindness(0) - target.cure_nearsighted(list(EYE_DAMAGE)) + target.remove_status_effect(/datum/status_effect/temporary_blindness) target.set_eye_blur_if_lower(70 SECONDS) //this will fix itself slowly. - target_eyes.setOrganDamage(0) + target_eyes.setOrganDamage(0) // heals nearsightedness and blindness from eye damage return ..() /datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 72d1084a120..cf5c3a836bd 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -179,8 +179,13 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) return damage = clamp(damage + damage_amount, 0, maximum) var/mess = check_damage_thresholds(owner) - check_failing_thresholds() prev_damage = damage + + if(damage >= maxHealth) + organ_flags |= ORGAN_FAILING + else + organ_flags &= ~ORGAN_FAILING + if(mess && owner && owner.stat <= SOFT_CRIT) to_chat(owner, mess) @@ -213,13 +218,6 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) if(prev_damage == maxHealth) return now_fixed -///Checks if an organ should/shouldn't be failing and gives the appropriate organ flag -/obj/item/organ/proc/check_failing_thresholds() - if(damage >= maxHealth) - organ_flags |= ORGAN_FAILING - if(damage < maxHealth) - organ_flags &= ~ORGAN_FAILING - //Looking for brains? //Try code/modules/mob/living/carbon/brain/brain_item.dm diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 6ada1695018..f67ae77d1e5 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -20,79 +20,74 @@ high_threshold_cleared = "Your vision functions passably once more." low_threshold_cleared = "Your vision is cleared of any ailment." - var/sight_flags = 0 + /// Sight flags this eye pair imparts on its user. + var/sight_flags = NONE /// changes how the eyes overlay is applied, makes it apply over the lighting layer var/overlay_ignore_lighting = FALSE + /// How much a mob can see in the dark with these eyes var/see_in_dark = 2 + /// How much innate tint these eyes have var/tint = 0 + /// How much innare flash protection these eyes have, usually paired with tint + var/flash_protect = FLASH_PROTECTION_NONE + /// What level of invisibility these eyes can see + var/see_invisible = SEE_INVISIBLE_LIVING + /// How much alpha lighting has (basically, night vision) + var/lighting_alpha + var/eye_color_left = "" //set to a hex code to override a mob's left eye color var/eye_color_right = "" //set to a hex code to override a mob's right eye color var/eye_icon_state = "eyes" var/old_eye_color_left = "fff" var/old_eye_color_right = "fff" - var/flash_protect = FLASH_PROTECTION_NONE - var/see_invisible = SEE_INVISIBLE_LIVING - var/lighting_alpha - var/no_glasses + + /// Glasses cannot be worn over these eyes. Currently unused + var/no_glasses = FALSE /// indication that the eyes are undergoing some negative effect var/damaged = FALSE /// Native FOV that will be applied if a config is enabled var/native_fov = FOV_180_DEGREES //SKYRAT EDIT CHANGE -/obj/item/organ/internal/eyes/Insert(mob/living/carbon/eye_owner, special = FALSE, drop_if_replaced = FALSE, initialising) +/obj/item/organ/internal/eyes/Insert(mob/living/carbon/eye_owner, special = FALSE, drop_if_replaced = FALSE) . = ..() - if(ishuman(eye_owner)) - var/mob/living/carbon/human/human_owner = eye_owner - // SKYRAT EDIT ADDITION - if(human_owner.emissive_eyes) - is_emissive = TRUE - // SKYRAT EDIT END - old_eye_color_left = human_owner.eye_color_left - old_eye_color_right = human_owner.eye_color_right - if(initial(eye_color_left)) - human_owner.eye_color_left = eye_color_left - else - eye_color_left = human_owner.eye_color_left - if(initial(eye_color_right)) - human_owner.eye_color_right = eye_color_right - else - eye_color_right = human_owner.eye_color_right - if(HAS_TRAIT(human_owner, TRAIT_NIGHT_VISION) && !lighting_alpha) - lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT - if(CONFIG_GET(flag/native_fov) && native_fov) - human_owner.add_fov_trait(type, native_fov) - eye_owner.update_tint() - owner.update_sight() - if(eye_owner.has_dna() && ishuman(eye_owner)) - eye_owner.dna.species.handle_body(eye_owner) //updates eye icon + owner.cure_blind(NO_EYES) + apply_damaged_eye_effects() + refresh() +/// Refreshes the visuals of the eyes +/// If call_update is TRUE, we also will call udpate_body /obj/item/organ/internal/eyes/proc/refresh(call_update = TRUE) - if(ishuman(owner)) - var/mob/living/carbon/human/affected_human = owner - // SKYRAT EDIT ADDITION - if (affected_human.emissive_eyes) - is_emissive = TRUE - // SKYRAT EDIT END - old_eye_color_left = affected_human.eye_color_left - old_eye_color_right = affected_human.eye_color_right - if(initial(eye_color_left)) - affected_human.eye_color_left = eye_color_left - else - eye_color_left = affected_human.eye_color_left - if(initial(eye_color_right)) - affected_human.eye_color_right = eye_color_right - else - eye_color_right = affected_human.eye_color_right - if(HAS_TRAIT(affected_human, TRAIT_NIGHT_VISION) && !lighting_alpha) - lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT - owner.update_tint() owner.update_sight() - if(call_update && owner.has_dna() && ishuman(owner)) - var/mob/living/carbon/human/affected_human = owner - affected_human.dna.species.handle_body(affected_human) //updates eye icon + owner.update_tint() + if(!ishuman(owner)) + return -/obj/item/organ/internal/eyes/Remove(mob/living/carbon/eye_owner, special = 0) + var/mob/living/carbon/human/affected_human = owner + old_eye_color_left = affected_human.eye_color_left + old_eye_color_right = affected_human.eye_color_right + if(initial(eye_color_left)) + affected_human.eye_color_left = eye_color_left + else + eye_color_left = affected_human.eye_color_left + if(initial(eye_color_right)) + affected_human.eye_color_right = eye_color_right + else + eye_color_right = affected_human.eye_color_right + if(HAS_TRAIT(affected_human, TRAIT_NIGHT_VISION) && !lighting_alpha) + lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT + if(CONFIG_GET(flag/native_fov) && native_fov) + owner.add_fov_trait(type, native_fov) + + // SKYRAT EDIT ADDITION - EMISSIVES + if (affected_human.emissive_eyes) + is_emissive = TRUE + // SKYRAT EDIT END + + if(call_update) + owner.dna?.species?.handle_body(affected_human) //updates eye icon + +/obj/item/organ/internal/eyes/Remove(mob/living/carbon/eye_owner, special = FALSE) ..() if(ishuman(eye_owner)) var/mob/living/carbon/human/human_owner = eye_owner @@ -103,11 +98,18 @@ human_owner.update_body() if(native_fov) eye_owner.remove_fov_trait(type) + + // Cure blindness from eye damage eye_owner.cure_blind(EYE_DAMAGE) eye_owner.cure_nearsighted(EYE_DAMAGE) - eye_owner.set_blindness(0) + // Eye blind and temp blind go to, even if this is a bit of cheesy way to clear blindness eye_owner.remove_status_effect(/datum/status_effect/eye_blur) - eye_owner.clear_fullscreen("eye_damage", 0) + eye_owner.remove_status_effect(/datum/status_effect/temporary_blindness) + // Then become blind anyways (if not special) + if(!special) + eye_owner.become_blind(NO_EYES) + + eye_owner.update_tint() eye_owner.update_sight() is_emissive = FALSE // SKYRAT EDIT ADDITION @@ -157,31 +159,44 @@ eye_color_left = initial(eye_color_left) eye_color_right = initial(eye_color_right) -/obj/item/organ/internal/eyes/on_life(delta_time, times_fired) +/obj/item/organ/internal/eyes/applyOrganDamage(damage_amount, maximum, required_organtype) . = ..() - var/mob/living/carbon/eye_owner = owner - //various degrees of "oh fuck my eyes", from "point a laser at your eye" to "staring at the Sun" intensities - if(damage > 20) - damaged = TRUE - if((organ_flags & ORGAN_FAILING)) - eye_owner.become_blind(EYE_DAMAGE) - return + if(!owner) + return + apply_damaged_eye_effects() - var/obj/item/clothing/glasses/eyewear = eye_owner.glasses - var/has_prescription_glasses = istype(eyewear) && eyewear.vision_correction - - if(has_prescription_glasses) - return - - var/severity = damage > 30 ? 2 : 1 - eye_owner.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, severity) +/// Applies effects to our owner based on how damaged our eyes are +/obj/item/organ/internal/eyes/proc/apply_damaged_eye_effects() + // we're in healthy threshold, either try to heal (if damaged) or do nothing + if(damage <= low_threshold) + if(damaged) + damaged = FALSE + // clear nearsightedness from damage + owner.cure_nearsighted(EYE_DAMAGE) + // if we're still nearsighted, reset its severity + // this is kinda icky, ideally we'd track severity to source but that's way more complex + var/datum/status_effect/grouped/nearsighted/nearsightedness = owner.is_nearsighted() + nearsightedness?.set_nearsighted_severity(1) + // and cure blindness from damage + owner.cure_blind(EYE_DAMAGE) return - //called once since we don't want to keep clearing the screen of eye damage for people who are below 20 damage - if(damaged) - damaged = FALSE - eye_owner.clear_fullscreen("eye_damage") - eye_owner.cure_blind(EYE_DAMAGE) + //various degrees of "oh fuck my eyes", from "point a laser at your eye" to "staring at the Sun" intensities + // 50 - blind + // 49-31 - nearsighted (2 severity) + // 30-20 - nearsighted (1 severity) + if(organ_flags & ORGAN_FAILING) + // become blind from damage + owner.become_blind(EYE_DAMAGE) + + else + // become nearsighted from damage + owner.become_nearsighted(EYE_DAMAGE) + // update the severity of our nearsightedness based on our eye damage + var/datum/status_effect/grouped/nearsighted/nearsightedness = owner.is_nearsighted() + nearsightedness.set_nearsighted_severity(damage > high_threshold ? 2 : 1) + + damaged = TRUE /obj/item/organ/internal/eyes/night_vision see_in_dark = NIGHTVISION_FOV_RANGE @@ -564,7 +579,7 @@ ADD_TRAIT(adapted, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) /obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_life(delta_time, times_fired) - if(!HAS_TRAIT(owner, TRAIT_BLIND) && isturf(owner.loc) && owner.has_light_nearby(light_amount=0.5)) //we allow a little more than usual so we can produce light from the adapted eyes + if(!owner.is_blind() && isturf(owner.loc) && owner.has_light_nearby(light_amount=0.5)) //we allow a little more than usual so we can produce light from the adapted eyes to_chat(owner, span_danger("Your eyes! They burn in the light!")) applyOrganDamage(10) //blind quickly playsound(owner, 'sound/machines/grill/grillsizzle.ogg', 50) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 760abb6fd06..73209b2505f 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -88,6 +88,7 @@ #include "baseturfs.dm" #include "bespoke_id.dm" #include "binary_insert.dm" +#include "blindness.dm" #include "bloody_footprints.dm" #include "breath.dm" #include "cable_powernets.dm" diff --git a/code/modules/unit_tests/blindness.dm b/code/modules/unit_tests/blindness.dm new file mode 100644 index 00000000000..a738130dd9e --- /dev/null +++ b/code/modules/unit_tests/blindness.dm @@ -0,0 +1,147 @@ +#define HAS_SCREEN_OVERLAY(mob, type) (locate(type) in flatten_list(mob.screens)) +#define HAS_CLIENT_COLOR(mob, type) (locate(type) in mob.client_colours) + +/** + * Unit test to check that blindness adds the correct status effects, overlays, and client colors + * + * Also checks that blindness is added and removed correctly when it should and shouldn't be + */ +/datum/unit_test/blindness + +/datum/unit_test/blindness/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + var/obj/item/clothing/glasses/blindfold/blindfold = new(dummy.loc) + TEST_ASSERT(!dummy.is_blind(), "Dummy was blind on initialize, and shouldn't be.") + + // Become blind + dummy.become_blind("unit_test") + check_if_blind(dummy) + // Cure their blindness immediately + dummy.cure_blind("unit_test") + check_if_not_blind(dummy) + + // Become blindfolded, this one should blind us + dummy.equip_to_slot_if_possible(blindfold, ITEM_SLOT_EYES) + check_if_blind(dummy, status_message = "after being blindfolded") + // Become quirk blinded and mutation blindness, these shouldn't do anything since we're already blind + // Have to do a transfer here so we don't get a blindfold + var/datum/quirk/item_quirk/blindness/quirk = allocate(/datum/quirk/item_quirk/blindness) + quirk.add_to_holder(dummy, quirk_transfer = TRUE) + dummy.dna.add_mutation(/datum/mutation/human/blind) + + // Remove the blindfold. We should remain blinded + QDEL_NULL(blindfold) + check_if_blind(dummy, status_message = "after removing their blindfold BUT still being blinded") + // Remove the quirk. We should remain blinded again + dummy.remove_quirk(/datum/quirk/item_quirk/blindness) + check_if_blind(dummy, status_message = "after removing their quirk BUT still being blinded") + // Remove the mutation, this should unblind us + dummy.dna.remove_mutation(/datum/mutation/human/blind) + check_if_not_blind(dummy, status_message = "after removing their blind mutation and having no sources of blindness left") + + // Temp blindness + dummy.set_temp_blindness(10 SECONDS) + check_if_blind(dummy, status_message = "after being temporarily blinded") + // Now aheal, remove the temp blindness + dummy.fully_heal(ALL) + TEST_ASSERT(!dummy.has_status_effect(/datum/status_effect/temporary_blindness), "Dummy still had the temp blindness effect after being fullhealed.") + // Check that it worked out + check_if_not_blind(dummy, status_message = "after being ahealed while temporarily blinded") + +/datum/unit_test/blindness/proc/check_if_blind(mob/living/carbon/human/dummy, status_message = "despite being made blind") + // Check for the status effect, duh + TEST_ASSERT(dummy.is_blind(), "Dummy, [status_message], did not have the blind status effect.") + // Being more technical, we need to check for client color and screen overlays + TEST_ASSERT(HAS_CLIENT_COLOR(dummy, /datum/client_colour/monochrome/blind), "Dummy, [status_message], did not have the monochrome client color.") + TEST_ASSERT(HAS_SCREEN_OVERLAY(dummy, /atom/movable/screen/fullscreen/blind), "Dummy, [status_message], did not have a blind screen overlay in their list of screens.") + +/datum/unit_test/blindness/proc/check_if_not_blind(mob/living/carbon/human/dummy, status_message = "after being cured of blindness") + // Check for no status effect + TEST_ASSERT(!dummy.is_blind(), "Dummy, [status_message], still had the blindness status effect.") + // Check that the client color and screen overlay are gone + TEST_ASSERT(!HAS_CLIENT_COLOR(dummy, /datum/client_colour/monochrome/blind), "Dummy, [status_message], still had the monochrome client color.") + TEST_ASSERT(!HAS_SCREEN_OVERLAY(dummy, /atom/movable/screen/fullscreen/blind), "Dummy, [status_message], still had the blind sceen overlay.") + +/** + * Unit test to check that nearsighted is added and disabled correctly + */ +/datum/unit_test/nearsightedness + +/datum/unit_test/nearsightedness/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + var/obj/item/clothing/glasses/regular/glasses = allocate(/obj/item/clothing/glasses/regular) + + // Become quirk nearsighted + // Have to do a transfer here so we don't get glasses + var/datum/quirk/item_quirk/nearsighted/quirk = allocate(/datum/quirk/item_quirk/nearsighted) + quirk.add_to_holder(dummy, quirk_transfer = TRUE) + TEST_ASSERT(dummy.is_nearsighted(), "Dummy is not nearsighted after gaining the nearsighted quirk.") + TEST_ASSERT(HAS_SCREEN_OVERLAY(dummy, /atom/movable/screen/fullscreen/impaired), "Dummy didn't gain the nearsighted overlay after becoming nearsighted.") + TEST_ASSERT(dummy.is_nearsighted_currently(), "Dummy is not currently nearsighted, after gaining the nearsighted quirk.") + // Become naturally nearsighted + dummy.become_nearsighted("unit_test") + + // Equip the prescription glasses, they should disable nearsighted + dummy.equip_to_slot_if_possible(glasses, ITEM_SLOT_EYES) + TEST_ASSERT(dummy.is_nearsighted(), "Dummy was no longer nearsighted after putting on glasses. They should still be nearsighted, but it should be disabled.") + TEST_ASSERT(!HAS_SCREEN_OVERLAY(dummy, /atom/movable/screen/fullscreen/impaired), "Dummy still had the nearsighted overlay, even though they were wearing glasses.") + TEST_ASSERT(!dummy.is_nearsighted_currently(), "Dummy was nearsighted currently even though they were wearing glasses.") + + // Remove the glasses + QDEL_NULL(glasses) + TEST_ASSERT(HAS_SCREEN_OVERLAY(dummy, /atom/movable/screen/fullscreen/impaired), "Dummy still had the nearsighted overlay, even though they were wearing glasses.") + TEST_ASSERT(dummy.is_nearsighted_currently(), "Dummy is not currently nearsighted, after removing their glasses.") + + // And remove nearsightedness wholesale + dummy.remove_quirk(/datum/quirk/item_quirk/nearsighted) + dummy.cure_nearsighted("unit_test") + TEST_ASSERT(!dummy.is_nearsighted(), "Dummy is still nearsighted after being cured of it.") + TEST_ASSERT(!HAS_SCREEN_OVERLAY(dummy, /atom/movable/screen/fullscreen/impaired), "Dummy still had the nearsighted overlay after being cured of it.") + +/** + * Unit test to ensure eyes are properly blinded and nearsighted by eye damage + */ +/datum/unit_test/eye_damage + +/datum/unit_test/eye_damage/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + var/obj/item/organ/internal/eyes/eyes = dummy.getorganslot(ORGAN_SLOT_EYES) + TEST_ASSERT_NOTNULL(eyes, "Eye damage unit test spawned a dummy without eyes!") + + // Test blindness due to eye damage + // Cause critical eye damage + var/critical_damage = eyes.maxHealth + eyes.setOrganDamage(critical_damage) // ~50 damage + TEST_ASSERT(dummy.is_blind(), "After sustaining critical eye damage ([critical_damage]), the dummy was not blind.") + // Heal eye damage + eyes.setOrganDamage(0) + TEST_ASSERT(!dummy.is_blind(), "After healing from critical eye damage, the dummy was not unblinded.") + + // Test nearsightedness due to eye damage + var/datum/status_effect/grouped/nearsighted/nearsightedness + // Cause minor eye damage + var/minor_damage = eyes.maxHealth * 0.5 + eyes.applyOrganDamage(minor_damage) //~25 ddamage + TEST_ASSERT(dummy.is_nearsighted(), "After sustaining minor eye damage ([minor_damage]), the dummy was not nearsighted.") + // Check that the severity is correct + nearsightedness = dummy.is_nearsighted() + TEST_ASSERT_EQUAL(nearsightedness.overlay_severity, 1, "After taking minor eye damage, the dummy's nearsightedness was the incorrect severity.") + nearsightedness = null + // Heal eye damage + eyes.setOrganDamage(0) + TEST_ASSERT(!dummy.is_nearsighted(), "After curing eye damage, the dummy was still nearsighted.") + + // Cause major eye damage + var/major_damage = eyes.maxHealth * 0.7 + eyes.applyOrganDamage(major_damage) //~35 damage + TEST_ASSERT(dummy.is_nearsighted(), "After sustaining major eye damage ([major_damage]), the dummy was not nearsighted.") + // Check that the severity is correct + nearsightedness = dummy.is_nearsighted() + TEST_ASSERT_EQUAL(nearsightedness.overlay_severity, 2, "After taking major eye damage, the dummy's nearsightedness was the incorrect severity.") + nearsightedness = null + // Heal eye damage + eyes.setOrganDamage(0) + TEST_ASSERT(!dummy.is_nearsighted(), "After curing eye damage, the dummy was still nearsighted.") + +#undef HAS_SCREEN_OVERLAY +#undef HAS_CLIENT_COLOR diff --git a/modular_skyrat/modules/customization/modules/clothing/glasses/glasses.dm b/modular_skyrat/modules/customization/modules/clothing/glasses/glasses.dm index dc374b698a7..2ece175a3da 100644 --- a/modular_skyrat/modules/customization/modules/clothing/glasses/glasses.dm +++ b/modular_skyrat/modules/customization/modules/clothing/glasses/glasses.dm @@ -41,7 +41,7 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi' icon_state = "glasses_thin" inhand_icon_state = "glasses" - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/betterunshit name = "modern glasses" @@ -50,7 +50,7 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi' icon_state = "glasses_alt" inhand_icon_state = "glasses" - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/kim name = "binoclard lenses" @@ -59,7 +59,7 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi' icon_state = "binoclard_lenses" inhand_icon_state = "glasses" - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/trickblindfold/hamburg name = "thief visor" @@ -76,7 +76,7 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi' icon_state = "biker" inhand_icon_state = "welding-g" - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) // Like sunglasses, but without any protection /obj/item/clothing/glasses/fake_sunglasses diff --git a/modular_skyrat/modules/hairbrush/code/hairbrush.dm b/modular_skyrat/modules/hairbrush/code/hairbrush.dm index dfe862e18b3..5dae1a37d6e 100644 --- a/modular_skyrat/modules/hairbrush/code/hairbrush.dm +++ b/modular_skyrat/modules/hairbrush/code/hairbrush.dm @@ -28,7 +28,7 @@ if(!head) to_chat(user, span_warning("[human_target] has no head!")) return - if(human_target.is_mouth_covered(head_only = TRUE)) + if(human_target.is_mouth_covered(ITEM_SLOT_HEAD)) to_chat(user, span_warning("You can't brush [human_target]'s hair while [human_target.p_their()] head is covered!")) return if(!do_after(user, brush_speed, human_target)) diff --git a/modular_skyrat/modules/huds/code/glasses/HUD_Glasses.dm b/modular_skyrat/modules/huds/code/glasses/HUD_Glasses.dm index 9c3574cb807..56bfcd2ce05 100644 --- a/modular_skyrat/modules/huds/code/glasses/HUD_Glasses.dm +++ b/modular_skyrat/modules/huds/code/glasses/HUD_Glasses.dm @@ -4,7 +4,7 @@ icon = 'modular_skyrat/modules/huds/icons/huds.dmi' icon_state = "glasses_healthhud" worn_icon = 'modular_skyrat/modules/huds/icons/hudeyes.dmi' - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/hud/diagnostic/prescription name = "prescription diagnostic HUD" @@ -12,7 +12,7 @@ icon = 'modular_skyrat/modules/huds/icons/huds.dmi' icon_state = "glasses_diagnostichud" worn_icon = 'modular_skyrat/modules/huds/icons/hudeyes.dmi' - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/hud/security/prescription name = "prescription security HUD" @@ -20,7 +20,7 @@ icon = 'modular_skyrat/modules/huds/icons/huds.dmi' icon_state = "glasses_securityhud" worn_icon = 'modular_skyrat/modules/huds/icons/hudeyes.dmi' - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/hud/science/prescription name = "prescription science glasses" @@ -28,7 +28,7 @@ icon = 'modular_skyrat/modules/huds/icons/huds.dmi' icon_state = "glasses_sciencehud" worn_icon = 'modular_skyrat/modules/huds/icons/hudeyes.dmi' - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) flash_protect = FLASH_PROTECTION_NONE glass_colour_type = /datum/client_colour/glass_colour/purple resistance_flags = ACID_PROOF @@ -42,14 +42,14 @@ /obj/item/clothing/glasses/meson/prescription name = "prescription optical meson scanner" desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions. This one has prescription lens fitted in." - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/meson/engine/prescription name = "prescription engineering scanner goggles" desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, the T-ray Scanner mode lets you see underfloor objects such as cables and pipes, and the Radiation Scanner mode let's you see objects contaminated by radiation. Each lens has been replaced with a corrective lens." - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/meson/engine/tray/prescription name = "prescription optical t-ray scanner" desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, the T-ray Scanner mode lets you see underfloor objects such as cables and pipes, and the Radiation Scanner mode let's you see objects contaminated by radiation. This one has a lens that help correct eye sight." - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_glasses.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_glasses.dm index 5d27601e630..9106c2e8877 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_glasses.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_glasses.dm @@ -24,8 +24,6 @@ GLOBAL_LIST_INIT(loadout_glasses, generate_loadout_items(/datum/loadout_item/gla equipper.update_glasses_color(equipped_glasses, TRUE) if(equipped_glasses.tint) equipper.update_tint() - if(equipped_glasses.vision_correction) - equipper.clear_fullscreen("nearsighted") if(equipped_glasses.vision_flags \ || equipped_glasses.darkness_view \ || equipped_glasses.invis_override \ diff --git a/modular_skyrat/modules/modular_implants/code/nifs.dm b/modular_skyrat/modules/modular_implants/code/nifs.dm index 9dc5f3120c1..0624463c974 100644 --- a/modular_skyrat/modules/modular_implants/code/nifs.dm +++ b/modular_skyrat/modules/modular_implants/code/nifs.dm @@ -8,6 +8,8 @@ #define NIF_MINIMUM_DURABILITY 0 #define NIF_MINIMUM_POWER_LEVEL 0 +#define NIF_SETUP_BLINDNESS "nif_setup" + // This is the original NIF that other NIFs are based on. /obj/item/organ/internal/cyberimp/brain/nif name = "Nanite Implant Framework" @@ -267,9 +269,10 @@ var/percentage_done = (world.time - (calibration_duration - (calibration_time))) / calibration_time switch(percentage_done) if(NIF_CALIBRATION_STAGE_1 to NIF_CALIBRATION_STAGE_1_END) - linked_mob.set_blindness(5) + linked_mob.become_blind(NIF_SETUP_BLINDNESS) if(NIF_CALIBRATION_STAGE_2 to NIF_CALIBRATION_STAGE_2_END) + linked_mob.cure_blind(NIF_SETUP_BLINDNESS) var/random_ailment = rand(1, side_effect_risk) switch(random_ailment) if(1) @@ -473,3 +476,4 @@ #undef NIF_DURABILITY_LOSS_HALVED #undef NIF_MINIMUM_DURABILITY #undef NIF_MINIMUM_POWER_LEVEL +#undef NIF_SETUP_BLINDNESS diff --git a/modular_skyrat/modules/modular_items/code/modular_glasses.dm b/modular_skyrat/modules/modular_items/code/modular_glasses.dm index 99029b0a306..650dc2c5054 100644 --- a/modular_skyrat/modules/modular_items/code/modular_glasses.dm +++ b/modular_skyrat/modules/modular_items/code/modular_glasses.dm @@ -160,27 +160,27 @@ /obj/item/clothing/glasses/hud/ar/aviator/security/prescription name = "prescription security HUD aviators" desc = "A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records. This HUD has been fitted inside of a pair of sunglasses with toggleable electrochromatic tinting which. Has lenses that help correct eye sight." - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/hud/ar/aviator/health/prescription name = "prescription medical HUD aviators" desc = "A heads-up display that scans the humanoids in view and provides accurate data about their health status. This HUD has been fitted inside of a pair of sunglasses which has lenses that help correct eye sight." - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/hud/ar/aviator/meson/prescription name = "prescription meson HUD aviators" desc = "A heads-up display used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions. This HUD has been fitted inside of a pair of sunglasses which has lenses that help correct eye sight." - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/hud/ar/aviator/diagnostic/prescription name = "prescription diagnostic HUD aviators" desc = "A heads-up display capable of analyzing the integrity and status of robotics and exosuits. This HUD has been fitted inside of a pair of sunglasses which has lenses that help correct eye sight." - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) /obj/item/clothing/glasses/hud/ar/aviator/science/prescription name = "prescription science aviators" desc = "A pair of tacky purple aviator sunglasses that allow the wearer to recognize various chemical compounds with only a glance, which has lenses that help correct eye sight." - vision_correction = TRUE + clothing_traits = list(TRAIT_NEARSIGHTED_CORRECTED) // Retinal projector diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm index 6e4acb09314..bd94f02904a 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_quirks.dm @@ -266,7 +266,7 @@ owner.clear_mood_event("sadistic") /datum/brain_trauma/very_special/sadism/proc/someone_suffering() - if(HAS_TRAIT(owner, TRAIT_BLIND)) + if(owner.is_blind()) return FALSE for(var/mob/living/carbon/human/iterated_mob in oview(owner, 4)) if(!isliving(iterated_mob)) //ghosts ain't people diff --git a/modular_skyrat/modules/morenarcotics/code/cocaine_item.dm b/modular_skyrat/modules/morenarcotics/code/cocaine_item.dm index 531c3cc41a7..28f496281f2 100644 --- a/modular_skyrat/modules/morenarcotics/code/cocaine_item.dm +++ b/modular_skyrat/modules/morenarcotics/code/cocaine_item.dm @@ -45,9 +45,9 @@ if(!iscarbon(user)) return var/covered = "" - if(user.is_mouth_covered(head_only = 1)) + if(user.is_mouth_covered(ITEM_SLOT_HEAD)) covered = "headgear" - else if(user.is_mouth_covered(mask_only = 1)) + else if(user.is_mouth_covered(ITEM_SLOT_MASK)) covered = "mask" if(covered) to_chat(user, span_warning("You have to remove your [covered] first!")) diff --git a/modular_skyrat/modules/morenarcotics/code/opium.dm b/modular_skyrat/modules/morenarcotics/code/opium.dm index 03e20ce3b7d..fa6ada5d6b3 100644 --- a/modular_skyrat/modules/morenarcotics/code/opium.dm +++ b/modular_skyrat/modules/morenarcotics/code/opium.dm @@ -35,9 +35,9 @@ if(!iscarbon(user)) return var/covered = "" - if(user.is_mouth_covered(head_only = 1)) + if(user.is_mouth_covered(ITEM_SLOT_HEAD)) covered = "headgear" - else if(user.is_mouth_covered(mask_only = 1)) + else if(user.is_mouth_covered(ITEM_SLOT_MASK)) covered = "mask" if(covered) to_chat(user, span_warning("You have to remove your [covered] first!")) diff --git a/tgstation.dme b/tgstation.dme index bea0b4e4cc6..63a12719a8c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1411,6 +1411,7 @@ #include "code\datums\status_effects\song_effects.dm" #include "code\datums\status_effects\stacking_effect.dm" #include "code\datums\status_effects\wound_effects.dm" +#include "code\datums\status_effects\debuffs\blindness.dm" #include "code\datums\status_effects\debuffs\choke.dm" #include "code\datums\status_effects\debuffs\confusion.dm" #include "code\datums\status_effects\debuffs\debuffs.dm" @@ -1421,6 +1422,7 @@ #include "code\datums\status_effects\debuffs\fire_stacks.dm" #include "code\datums\status_effects\debuffs\hallucination.dm" #include "code\datums\status_effects\debuffs\jitteriness.dm" +#include "code\datums\status_effects\debuffs\pacifism.dm" #include "code\datums\status_effects\debuffs\screen_blur.dm" #include "code\datums\status_effects\debuffs\screwy_hud.dm" #include "code\datums\status_effects\debuffs\silenced.dm" @@ -3823,7 +3825,6 @@ #include "code\modules\mob\living\brain\MMI.dm" #include "code\modules\mob\living\brain\posibrain.dm" #include "code\modules\mob\living\brain\skillchip.dm" -#include "code\modules\mob\living\brain\status_procs.dm" #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_context.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" @@ -3853,7 +3854,6 @@ #include "code\modules\mob\living\carbon\alien\logout.dm" #include "code\modules\mob\living\carbon\alien\organs.dm" #include "code\modules\mob\living\carbon\alien\screen.dm" -#include "code\modules\mob\living\carbon\alien\status_procs.dm" #include "code\modules\mob\living\carbon\alien\adult\adult.dm" #include "code\modules\mob\living\carbon\alien\adult\adult_defense.dm" #include "code\modules\mob\living\carbon\alien\adult\adult_update_icons.dm" @@ -3963,7 +3963,6 @@ #include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" -#include "code\modules\mob\living\simple_animal\status_procs.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" #include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" #include "code\modules\mob\living\simple_animal\bot\construction.dm"