diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 376bfed9e4b..9ba5f5b691c 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -223,8 +223,6 @@ #define MAX_CHICKENS 50 -#define UNHEALING_EAR_DAMAGE 100 - #define INCORPOREAL_MOVE_BASIC 1 #define INCORPOREAL_MOVE_SHADOW 2 // leaves a trail of shadows diff --git a/code/datums/components/earhealing.dm b/code/datums/components/earhealing.dm index 6eb71285e0d..bd3d57480db 100644 --- a/code/datums/components/earhealing.dm +++ b/code/datums/components/earhealing.dm @@ -26,5 +26,5 @@ if(!HAS_TRAIT(wearer, TRAIT_DEAF)) var/obj/item/organ/ears/ears = wearer.getorganslot(ORGAN_SLOT_EARS) if (ears) - ears.deaf = max(ears.deaf - 1, (ears.ear_damage < UNHEALING_EAR_DAMAGE ? 0 : 1)) // Do not clear deafness while above the unhealing ear damage threshold - ears.ear_damage = max(ears.ear_damage - 0.1, 0) + ears.deaf = max(ears.deaf - 1, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged + ears.damage = max(ears.damage - 0.1, 0) diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index 7fadbdc3637..98800846449 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -50,9 +50,9 @@ Bonus if(5) if(power >= 2) var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) - if(istype(ears) && ears.ear_damage < UNHEALING_EAR_DAMAGE) + if(istype(ears) && ears.damage < ears.maxHealth) to_chat(M, "Your ears pop painfully and start bleeding!") - ears.ear_damage = max(ears.ear_damage, UNHEALING_EAR_DAMAGE) + ears.damage = max(ears.damage, ears.maxHealth) M.emote("scream") else to_chat(M, "Your ears pop and begin ringing loudly!") diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 0c17fa17705..bcc46f4bd26 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -100,8 +100,8 @@ else if(M.eye_blind || M.eye_blurry) M.set_blindness(0) M.set_blurriness(0) - else if(eyes.eye_damage > 0) - M.adjust_eye_damage(-1) + else if(eyes.damage > 0) + eyes.applyOrganDamage(-1) else if(prob(base_message_chance)) to_chat(M, "[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 healing feels more acute.")]") \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index eec16a30cd7..d2b33858cb7 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -53,20 +53,20 @@ Bonus if(3, 4) to_chat(M, "Your eyes burn!") M.blur_eyes(10) - M.adjust_eye_damage(1) + eyes.applyOrganDamage(1) else M.blur_eyes(20) - M.adjust_eye_damage(5) - if(eyes.eye_damage >= 10) + eyes.applyOrganDamage(5) + if(eyes.damage >= 10) M.become_nearsighted(EYE_DAMAGE) - if(prob(eyes.eye_damage - 10 + 1)) + if(prob(eyes.damage - 10 + 1)) if(!remove_eyes) if(!HAS_TRAIT(M, TRAIT_BLIND)) to_chat(M, "You go blind!") - M.become_blind(EYE_DAMAGE) + eyes.applyOrganDamage(eyes.maxHealth) else M.visible_message("[M]'s eyes fall out of their sockets!", "Your eyes fall out of their sockets!") eyes.Remove(M) eyes.forceMove(get_turf(M)) else - to_chat(M, "Your eyes burn horrifically!") \ No newline at end of file + to_chat(M, "Your eyes burn horrifically!") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 918e6f01319..b68b6537d19 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -486,12 +486,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) log_combat(user, M, "attacked", "[src.name]", "(INTENT: [uppertext(user.a_intent)])") - M.adjust_blurriness(3) - M.adjust_eye_damage(rand(2,4)) var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return - if(eyes.eye_damage >= 10) + M.adjust_blurriness(3) + eyes.applyOrganDamage(rand(2,4)) + if(eyes.damage >= 10) M.adjust_blurriness(15) if(M.stat != DEAD) to_chat(M, "Your eyes start to bleed profusely!") @@ -505,7 +505,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) M.adjust_blurriness(10) M.Unconscious(20) M.Paralyze(40) - if (prob(eyes.eye_damage - 10 + 1)) + if (prob(eyes.damage - 10 + 1)) M.become_blind(EYE_DAMAGE) to_chat(M, "You go blind!") diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index d649474177c..26aae058c29 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -144,8 +144,12 @@ GENE SCANNER var/mob/living/carbon/human/H = M if(H.undergoing_cardiac_arrest() && H.stat != DEAD) to_chat(user, "Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!") - if(H.undergoing_liver_failure() && H.stat != DEAD) - to_chat(user, "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!") + //organ failure messages + for(var/O in H.internal_organs) + var/obj/item/organ/organ = O + if(!istype(organ, /obj/item/organ/heart)) + if(organ.failing) + to_chat(user, organ.Assemble_Failure_Message()) to_chat(user, "Analyzing results for [M]:\n\tOverall status: [mob_status]") @@ -216,11 +220,11 @@ GENE SCANNER healthy = FALSE to_chat(user, "\tSubject is deaf.") else - if(ears.ear_damage) - to_chat(user, "\tSubject has [ears.ear_damage > UNHEALING_EAR_DAMAGE? "permanent ": "temporary "]hearing damage.") + if(ears.damage) + to_chat(user, "\tSubject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage.") healthy = FALSE if(ears.deaf) - to_chat(user, "\tSubject is [ears.ear_damage > UNHEALING_EAR_DAMAGE ? "permanently ": "temporarily "] deaf.") + to_chat(user, "\tSubject is [ears.damage > ears.maxHealth ? "permanently ": "temporarily "] deaf.") healthy = FALSE if(healthy) to_chat(user, "\tHealthy.") @@ -236,13 +240,13 @@ GENE SCANNER if(HAS_TRAIT(C, TRAIT_NEARSIGHT)) to_chat(user, "\tSubject is nearsighted.") healthy = FALSE - if(eyes.eye_damage > 30) + if(eyes.damage > 30) to_chat(user, "\tSubject has severe eye damage.") healthy = FALSE - else if(eyes.eye_damage > 20) + else if(eyes.damage > 20) to_chat(user, "\tSubject has significant eye damage.") healthy = FALSE - else if(eyes.eye_damage) + else if(eyes.damage) to_chat(user, "\tSubject has minor eye damage.") healthy = FALSE if(healthy) @@ -253,9 +257,10 @@ GENE SCANNER if(ishuman(M)) var/mob/living/carbon/human/H = M - var/ldamage = H.return_liver_damage() - if(ldamage > 10) - to_chat(user, "\t[ldamage > 45 ? "Severe" : "Minor"] liver damage detected.") + for(var/O in H.internal_organs) + var/obj/item/organ/organ = O + if((organ.damage > organ.low_threshold)&&(!istype(organ, /obj/item/organ/brain))) + to_chat(user, "\t[organ.damage > organ.high_threshold ? "Severe" : "Minor"] damaged detected within [organ].") if(advanced && H.has_dna()) to_chat(user, "\tGenetic Stability: [H.dna.stability]%.") diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 26b80f8b033..463cdb0591f 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -20,10 +20,11 @@ explosion(get_turf(user), 0, 0, 2, 0, TRUE) for(var/mob/living/carbon/human/H in range(2,user)) + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) to_chat(H, "You are blinded by a shower of blood!") H.Stun(20) H.blur_eyes(20) - H.adjust_eye_damage(5) + eyes.applyOrganDamage(5) H.confused += 3 for(var/mob/living/silicon/S in range(2,user)) to_chat(S, "Your sensors are disabled by a shower of blood!") diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm index 9d241148b44..a46fbd21249 100644 --- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm +++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm @@ -47,11 +47,12 @@ to_chat(H, "You push the spectacles down, but you can't see through the glass.") /obj/item/clothing/glasses/wraith_spectacles/proc/blind_cultist(mob/living/victim) + var/obj/item/organ/eyes/eyes = victim.getorganslot(ORGAN_SLOT_EYES) if(iscultist(victim)) to_chat(victim, "\"It looks like Nar'Sie's dogs really don't value their eyes.\"") to_chat(victim, "Your eyes explode with horrific pain!") victim.emote("scream") - victim.become_blind(EYE_DAMAGE) + eyes.applyOrganDamage(eyes.maxHealth) victim.adjust_blurriness(30) victim.adjust_blindness(30) return TRUE @@ -138,24 +139,26 @@ var/mob/living/carbon/human/H = owner var/glasses_right = istype(H.glasses, /obj/item/clothing/glasses/wraith_spectacles) var/obj/item/clothing/glasses/wraith_spectacles/WS = H.glasses + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(glasses_right && !WS.up && !GLOB.ratvar_awakens && !GLOB.ratvar_approaches) apply_eye_damage(H) else if(GLOB.ratvar_awakens) H.cure_nearsighted(list(EYE_DAMAGE)) H.cure_blind(list(EYE_DAMAGE)) - H.adjust_eye_damage(-eye_damage_done) + eyes.applyOrganDamage(-eye_damage_done) eye_damage_done = 0 else if(prob(50) && eye_damage_done) - H.adjust_eye_damage(-1) + eyes.applyOrganDamage(-1) eye_damage_done = max(0, eye_damage_done - 1) if(!eye_damage_done) qdel(src) /datum/status_effect/wraith_spectacles/proc/apply_eye_damage(mob/living/carbon/human/H) + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(HAS_TRAIT(H, TRAIT_BLIND)) return - H.adjust_eye_damage(0.5) + eyes.applyOrganDamage(0.5) eye_damage_done += 0.5 if(eye_damage_done >= 20) H.adjust_blurriness(2) @@ -166,7 +169,7 @@ if(eye_damage_done >= blind_breakpoint) if(!HAS_TRAIT(H, TRAIT_BLIND)) to_chat(H, "A piercing white light floods your vision. Suddenly, all goes dark!") - H.become_blind(EYE_DAMAGE) + eyes.applyOrganDamage(eyes.maxHealth) if(prob(min(20, 5 + eye_damage_done))) to_chat(H, "Your eyes continue to burn.") diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index d33ebc4070c..4ccdc7da0b2 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -45,13 +45,14 @@ /obj/item/clothing/glasses/proc/thermal_overload() if(ishuman(src.loc)) var/mob/living/carbon/human/H = src.loc + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(!(HAS_TRAIT(H, TRAIT_BLIND))) if(H.glasses == src) to_chat(H, "[src] overloads and blinds you!") H.flash_act(visual = 1) H.blind_eyes(3) H.blur_eyes(5) - H.adjust_eye_damage(5) + eyes.applyOrganDamage(5) /obj/item/clothing/glasses/meson name = "optical meson scanner" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 289f69d82f4..0be331d1171 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -796,9 +796,9 @@ /mob/living/carbon/fully_heal(admin_revive = FALSE) if(reagents) reagents.clear_reagents() - var/obj/item/organ/liver/L = getorganslot(ORGAN_SLOT_LIVER) - if(L) - L.damage = 0 + for(var/O in internal_organs) + var/obj/item/organ/organ = O + organ.setOrganDamage(0) var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain) if(B) B.brain_death = FALSE diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 8727ba694ec..266bbae9dfa 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -304,30 +304,30 @@ if (damage == 1) to_chat(src, "Your eyes sting a little.") if(prob(40)) - adjust_eye_damage(1) + eyes.applyOrganDamage(1) else if (damage == 2) to_chat(src, "Your eyes burn.") - adjust_eye_damage(rand(2, 4)) + eyes.applyOrganDamage(rand(2, 4)) else if( damage >= 3) to_chat(src, "Your eyes itch and burn severely!") - adjust_eye_damage(rand(12, 16)) + eyes.applyOrganDamage(rand(12, 16)) - if(eyes.eye_damage > 10) + if(eyes.damage > 10) blind_eyes(damage) blur_eyes(damage * rand(3, 6)) - if(eyes.eye_damage > 20) - if(prob(eyes.eye_damage - 20)) + if(eyes.damage > 20) + if(prob(eyes.damage - 20)) if(!HAS_TRAIT(src, TRAIT_NEARSIGHT)) to_chat(src, "Your eyes start to burn badly!") become_nearsighted(EYE_DAMAGE) - else if(prob(eyes.eye_damage - 25)) + else if(prob(eyes.damage - 25)) if(!HAS_TRAIT(src, TRAIT_BLIND)) to_chat(src, "You can't see anything!") - become_blind(EYE_DAMAGE) + eyes.applyOrganDamage(eyes.maxHealth) else to_chat(src, "Your eyes are really starting to hurt. This can't be good for you!") @@ -357,13 +357,13 @@ var/deaf = deafen_pwr * effect_amount adjustEarDamage(ear_damage,deaf) - if(ears.ear_damage >= 15) + if(ears.damage >= 15) to_chat(src, "Your ears start to ring badly!") - if(prob(ears.ear_damage - 5)) + if(prob(ears.damage - 5)) to_chat(src, "You can't hear anything!") - ears.ear_damage = min(ears.ear_damage, UNHEALING_EAR_DAMAGE) + ears.damage = min(ears.damage, ears.maxHealth) // you need earmuffs, inacusiate, or replacement - else if(ears.ear_damage >= 5) + else if(ears.damage >= 5) to_chat(src, "Your ears start to ring!") SEND_SOUND(src, sound('sound/weapons/flash_ring.ogg',0,1,0,250)) return effect_amount //how soundbanged we are diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 7c10ca81461..5a4e2600858 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -189,7 +189,6 @@ if(G.vision_correction) if(HAS_TRAIT(src, TRAIT_NEARSIGHT)) overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) - adjust_eye_damage(0) 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/life.dm b/code/modules/mob/living/carbon/life.dm index e40e582c21f..81585ecce57 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -593,16 +593,6 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put if(liver && liver.failing) return TRUE -/mob/living/carbon/proc/return_liver_damage() - var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) - if(liver) - return liver.damage - -/mob/living/carbon/proc/applyLiverDamage(var/d) - var/obj/item/organ/liver/L = getorganslot(ORGAN_SLOT_LIVER) - if(L) - L.damage += d - /mob/living/carbon/proc/liver_failure() reagents.end_metabolization(src, keep_liverless = TRUE) //Stops trait-based effects on reagents, to prevent permanent buffs reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE) diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index efbb855f2b5..8f8663687e2 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -1,6 +1,6 @@ //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, eye_blurry, druggy, TRAIT_BLIND trait, TRAIT_NEARSIGHT trait, and TRAIT_HUSK trait. +//eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, TRAIT_NEARSIGHT trait, and TRAIT_HUSK trait. /mob/living/carbon/IsParalyzed(include_stamcrit = TRUE) @@ -15,44 +15,6 @@ to_chat(src, "You're too exhausted to keep going...") stam_paralyzed = TRUE -/mob/living/carbon/damage_eyes(amount) - var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return - if(amount>0) - eyes.eye_damage = amount - if(eyes.eye_damage > 20) - if(eyes.eye_damage > 30) - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) - else - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) - -/mob/living/carbon/set_eye_damage(amount) - var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return - eyes.eye_damage = max(amount,0) - if(eyes.eye_damage > 20) - if(eyes.eye_damage > 30) - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) - else - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) - else - clear_fullscreen("eye_damage") - -/mob/living/carbon/adjust_eye_damage(amount) - var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return - eyes.eye_damage = max(eyes.eye_damage+amount, 0) - if(eyes.eye_damage > 20) - if(eyes.eye_damage > 30) - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) - else - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) - else - clear_fullscreen("eye_damage") - /mob/living/carbon/adjust_drugginess(amount) druggy = max(druggy+amount, 0) if(druggy) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3df938da0d1..f66de10a8fe 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -547,7 +547,7 @@ set_blindness(0) set_blurriness(0) set_dizziness(0) - set_eye_damage(0) + cure_nearsighted() cure_blind() cure_husk() @@ -1297,7 +1297,9 @@ if("eye_blind") set_blindness(var_value) if("eye_damage") - set_eye_damage(var_value) + var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) + if(E) + E.setOrganDamage(var_value) if("eye_blurry") set_blurriness(var_value) if("maxHealth") diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 86fa6cf8dc5..7a4f72b9b62 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -18,17 +18,6 @@ /mob/proc/set_dizziness(amount) dizziness = max(amount, 0) -/////////////////////////////////// EYE DAMAGE //////////////////////////////////// - -/mob/proc/damage_eyes(amount) - return - -/mob/proc/adjust_eye_damage(amount) - return - -/mob/proc/set_eye_damage(amount) - return - /////////////////////////////////// EYE_BLIND //////////////////////////////////// /mob/proc/blind_eyes(amount) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index f8bade6a1e6..3ddcfd98304 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -50,10 +50,12 @@ return ..() /obj/item/paperplane/suicide_act(mob/living/user) + var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) user.Stun(200) user.visible_message("[user] jams [src] in [user.p_their()] nose. It looks like [user.p_theyre()] trying to commit suicide!") user.adjust_blurriness(6) - user.adjust_eye_damage(rand(6,8)) + if(eyes) + eyes.applyOrganDamage(rand(6,8)) sleep(10) return (BRUTELOSS) @@ -114,12 +116,13 @@ if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman return var/mob/living/carbon/human/H = hit_atom + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(prob(hit_probability)) if(H.is_eyes_covered()) return visible_message("\The [src] hits [H] in the eye!") H.adjust_blurriness(6) - H.adjust_eye_damage(rand(6,8)) + eyes.applyOrganDamage(rand(6,8)) H.Paralyze(40) H.emote("scream") diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 5fd8ff3a25a..0cc76ef40bf 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -44,7 +44,7 @@ All effects don't start immediately, but rather get worse over time; the rate is C.drunkenness = max((C.drunkenness + (sqrt(volume) * booze_power * ALCOHOL_RATE)), 0) //Volume, power, and server alcohol rate effect how quickly one gets drunk var/obj/item/organ/liver/L = C.getorganslot(ORGAN_SLOT_LIVER) if (istype(L)) - C.applyLiverDamage((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * L.alcohol_tolerance, 0))/150) + L.applyOrganDamage(((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * L.alcohol_tolerance, 0))/150)) return ..() /datum/reagent/consumable/ethanol/reaction_obj(obj/O, reac_volume) @@ -182,17 +182,17 @@ All effects don't start immediately, but rather get worse over time; the rate is to_chat(M, "[pick("You have a really bad headache.", "Your eyes hurt.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]") if(prob(5) && iscarbon(M)) + var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if(HAS_TRAIT(M, TRAIT_BLIND)) - var/obj/item/organ/eyes/eye = M.getorganslot(ORGAN_SLOT_EYES) - if(istype(eye)) - eye.Remove(M) - eye.forceMove(get_turf(M)) + if(istype(eyes)) + eyes.Remove(M) + eyes.forceMove(get_turf(M)) to_chat(M, "You double over in pain as you feel your eyeballs liquify in your head!") M.emote("scream") M.adjustBruteLoss(15) else to_chat(M, "You scream in terror as you go blind!") - M.become_blind(EYE_DAMAGE) + eyes.applyOrganDamage(eyes.maxHealth) M.emote("scream") if(prob(3) && iscarbon(M)) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index c03605191bc..3777f8e412e 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -728,6 +728,7 @@ var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return + eyes.applyOrganDamage(-2) if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE)) if(prob(20)) to_chat(M, "Your vision slowly returns...") @@ -742,8 +743,6 @@ else if(M.eye_blind || M.eye_blurry) M.set_blindness(0) M.set_blurriness(0) - else if(eyes.eye_damage > 0) - M.adjust_eye_damage(-1) ..() /datum/reagent/medicine/atropine diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 9f6ba762d91..c52e92bb170 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -24,6 +24,7 @@ "[user] begins to perform surgery on [target]'s eyes.") /datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES) user.visible_message("[user] successfully fixes [target]'s eyes!", "You succeed in fixing [target]'s eyes.") display_results(user, target, "You succeed in fixing [target]'s eyes.", "[user] successfully fixes [target]'s eyes!", @@ -32,7 +33,7 @@ target.set_blindness(0) target.cure_nearsighted(list(EYE_DAMAGE)) target.blur_eyes(35) //this will fix itself slowly. - target.set_eye_damage(0) + E.setOrganDamage(0) return TRUE /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/ears.dm b/code/modules/surgery/organs/ears.dm index 34d0e49b9df..61024765817 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -10,10 +10,9 @@ // to hear anything. var/deaf = 0 - // `ear_damage` measures long term damage to the ears, if too high, + // `damage` in this case measures long term damage to the ears, if too high, // the person will not have either `deaf` or `ear_damage` decrease // without external aid (earmuffs, drugs) - var/ear_damage = 0 //Resistance against loud noises var/bang_protect = 0 @@ -23,17 +22,20 @@ /obj/item/organ/ears/on_life() if(!iscarbon(owner)) return + ..() var/mob/living/carbon/C = owner + if((damage < maxHealth) && failing) //ear damage can be repaired from the failing condition + failing = FALSE // genetic deafness prevents the body from using the ears, even if healthy if(HAS_TRAIT(C, TRAIT_DEAF)) deaf = max(deaf, 1) - else if(ear_damage < UNHEALING_EAR_DAMAGE) // if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs. - ear_damage = max(ear_damage - 0.05, 0) + else if(!failing) // if this organ is failing, do not clear deaf stacks. deaf = max(deaf - 1, 0) /obj/item/organ/ears/proc/restoreEars() deaf = 0 - ear_damage = 0 + damage = 0 + failing = FALSE var/mob/living/carbon/C = owner @@ -41,7 +43,7 @@ deaf = 1 /obj/item/organ/ears/proc/adjustEarDamage(ddmg, ddeaf) - ear_damage = max(ear_damage + (ddmg*damage_multiplier), 0) + damage = max(damage + (ddmg*damage_multiplier), 0) deaf = max(deaf + (ddeaf*damage_multiplier), 0) /obj/item/organ/ears/proc/minimumDeafTicks(value) @@ -116,5 +118,4 @@ name = "tin ears" desc = "The robust ears of a bronze golem. " damage_multiplier = 0.1 //STRONK - bang_protect = 1 //Fear me weaklings. - + bang_protect = 1 //Fear me weaklings. diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 3f477effa31..f701b049c55 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -8,7 +8,6 @@ var/sight_flags = 0 var/see_in_dark = 2 - var/eye_damage = 0 var/tint = 0 var/eye_color = "" //set to a hex code to override a mob's eye color var/eye_icon_state = "eyes" @@ -17,6 +16,10 @@ var/see_invisible = SEE_INVISIBLE_LIVING var/lighting_alpha var/no_glasses + var/damaged = FALSE //damaged indicates that our eyes are undergoing some level of negative effect + maxHealth = 50 //half the normal health max since we go blind at 30, a permanent blindness at 50 therefore makes sense unless medicine is administered + high_threshold = 20 + low_threshold = 10 /obj/item/organ/eyes/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = FALSE, initialising) . = ..() @@ -44,6 +47,29 @@ M.update_tint() M.update_sight() +/obj/item/organ/eyes/on_life() + ..() + var/mob/living/carbon/C = owner + //since we can repair fully damaged eyes, check if healing has occurred + if(failing && (damage < maxHealth)) + failing = FALSE + C.cure_blind(EYE_DAMAGE) + //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(failing) + C.become_blind(EYE_DAMAGE) + else if(damage > 30) + C.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) + else + C.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) + //called once since we don't want to keep clearing the screen of eye damage for people who are below 20 damage + else if(damaged) + damaged = FALSE + C.clear_fullscreen("eye_damage") + return + + /obj/item/organ/eyes/night_vision name = "shadow eyes" desc = "A spooky set of eyes that can see in the dark." diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 8bb5440f434..f38cc108862 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -49,10 +49,12 @@ return S /obj/item/organ/heart/on_life() + ..() if(owner.client && beating) var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE) var/sound/fastbeat = sound('sound/health/fastbeat.ogg', repeat = TRUE) var/mob/living/carbon/H = owner + if(H.health <= H.crit_threshold && beat != BEAT_SLOW) beat = BEAT_SLOW diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 9fc9b76172e..5f82752e977 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -9,13 +9,12 @@ zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_LIVER desc = "Pairing suggestion: chianti and fava beans." - var/damage = 0 //liver damage, 0 is no damage, damage=maxHealth causes liver failure var/alcohol_tolerance = ALCOHOL_RATE//affects how much damage the liver takes from alcohol - var/failing //is this liver failing? - var/maxHealth = LIVER_DEFAULT_HEALTH var/toxTolerance = LIVER_DEFAULT_TOX_TOLERANCE//maximum amount of toxins the liver can just shrug off var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY//affects how much damage toxins do to the liver var/filterToxins = TRUE //whether to filter toxins + maxHealth = LIVER_DEFAULT_HEALTH + Unique_Failure_Msg = "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!" #define HAS_SILENT_TOXIN 0 //don't provide a feedback message if this is the only toxin present #define HAS_NO_TOXIN 1 @@ -23,11 +22,9 @@ /obj/item/organ/liver/on_life() var/mob/living/carbon/C = owner - + ..() //perform general on_life() if(istype(C)) if(!failing)//can't process reagents with a failing liver - //slowly heal liver damage - damage = max(0, damage - 0.1) var/provide_pain_message = HAS_NO_TOXIN if(filterToxins && !HAS_TRAIT(owner, TRAIT_TOXINLOVER)) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 4452881bcf9..22ad518d406 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -1,3 +1,6 @@ +#define STANDARD_ORGAN_THRESHOLD 100 +#define STANDARD_ORGAN_HEALING 0.001 + /obj/item/organ name = "organ" icon = 'icons/obj/surgery.dmi' @@ -13,7 +16,24 @@ //Was this organ implanted/inserted/etc, if true will not be removed during species change. var/external = FALSE var/synthetic = FALSE // To distinguish between organic and synthetic organs + var/maxHealth = STANDARD_ORGAN_THRESHOLD + var/damage = 0 //total damage this organ has sustained + var/failing = FALSE //is this organ failing or not + var/healing_factor = STANDARD_ORGAN_HEALING //fraction of maxhealth healed per on_life() + var/high_threshold = STANDARD_ORGAN_THRESHOLD * 0.45 //when severe organ damage occurs + var/low_threshold = STANDARD_ORGAN_THRESHOLD * 0.1 //when minor organ damage occurs + var/Unique_Failure_Msg //certain organs may want unique failure messages for details on how to fix them +/obj/item/organ/proc/Assemble_Failure_Message() //need to assemble a failure message since we can't have variables be based off of the same object's variables + var/name_length + //if no unique failure message is set, output the generic one, otherwise give the one we have set + if(!Unique_Failure_Msg) + name_length = lentext(name) + if(name[name_length] == "s") //plural case, done without much sanitization since I don't know any organ that ends with an "s" that isn't plural at the moment + Unique_Failure_Msg = "Subject's [name] are too damaged to function, and needs to be replaced or fixed!" + else + Unique_Failure_Msg = "Subject's [name] is too damaged to function, and needs to be replaced or fixed!" + return Unique_Failure_Msg /obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) if(!iscarbon(M) || owner == M) @@ -53,6 +73,14 @@ return /obj/item/organ/proc/on_life() + var/mob/living/carbon/C = owner + //if we start to fail, cap our damage and fail the organ + if(damage > maxHealth) + failing = TRUE + damage = maxHealth + //repair organ damage if the organ is not failing + if((!failing) && C) + damage = max(0, damage - (maxHealth * healing_factor) ) return /obj/item/organ/examine(mob/user) @@ -101,6 +129,16 @@ /obj/item/organ/item_action_slot_check(slot,mob/user) return //so we don't grant the organ's action to mobs who pick up the organ. +/obj/item/organ/proc/applyOrganDamage(var/d) //use for damaging effects + damage = max(0, damage + d) + +/obj/item/organ/proc/setOrganDamage(var/d) //use mostly for admin heals + damage = CLAMP(d, 0 ,maxHealth) + if(d >= maxHealth) + failing = TRUE + else + failing = FALSE + //Looking for brains? //Try code/modules/mob/living/carbon/brain/brain_item.dm @@ -131,4 +169,4 @@ if(!getorganslot(ORGAN_SLOT_EARS)) var/obj/item/organ/ears/ears = new() - ears.Insert(src) + ears.Insert(src) \ No newline at end of file diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 38c32d5ac1c..a52e99ec152 100755 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -11,6 +11,7 @@ /obj/item/organ/stomach/on_life() var/mob/living/carbon/human/H = owner + ..() if(istype(H)) H.dna.species.handle_digestion(H) handle_disgust(H)