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)