diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 99a62b83131..b1fc3398af0 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -375,6 +375,13 @@
update_icon()
return
else
+ var/obj/item/organ/internal/heart/heart = H.get_int_organ(/obj/item/organ/internal/heart)
+ if(heart.status & ORGAN_DEAD)
+ user.visible_message("[defib] buzzes: Resuscitation failed - Heart necrosis detected.")
+ playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
+ busy = 0
+ update_icon()
+ return
H.set_heartattack(FALSE)
user.visible_message("[defib] pings: Cardiac arrhythmia corrected.")
M.visible_message("[M]'s body convulses a bit.")
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index d1b44798b85..c9f89743e7c 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -92,13 +92,14 @@
//Mitocholide is hard enough to get, it's probably fair to make this all internal organs
for(var/obj/item/organ/internal/I in H.internal_organs)
- I.receive_damage(-0.4)
+ I.heal_internal_damage(0.4)
..()
/datum/reagent/medicine/mitocholide/reaction_obj(obj/O, volume)
if(istype(O, /obj/item/organ))
var/obj/item/organ/Org = O
- Org.rejuvenate()
+ if(!Org.is_robotic())
+ Org.rejuvenate()
/datum/reagent/medicine/cryoxadone
name = "Cryoxadone"
@@ -520,7 +521,7 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
if(istype(E))
- E.receive_damage(-1)
+ E.heal_internal_damage(1)
M.AdjustEyeBlurry(-1)
M.AdjustEarDamage(-1)
if(prob(50))
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 43820adbed1..59643723d78 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -32,8 +32,15 @@
return
Stop()
+/obj/item/organ/internal/heart/necrotize()
+ ..()
+ Stop()
+
/obj/item/organ/internal/heart/attack_self(mob/user)
..()
+ if(status & ORGAN_DEAD)
+ to_chat(user, "You can't restart a dead heart.")
+ return
if(!beating)
Restart()
spawn(80)
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index d485c3d87ac..7f54eb60d9d 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -73,13 +73,11 @@
blood_DNA = list()
blood_DNA[dna.unique_enzymes] = dna.b_type
-/obj/item/organ/proc/necrotize(update_sprite=TRUE)
- if(is_robotic())
- return
+/obj/item/organ/proc/necrotize(update_sprite = TRUE)
damage = max_damage
status |= ORGAN_DEAD
processing_objects -= src
- if(dead_icon)
+ if(dead_icon && !is_robotic())
icon_state = dead_icon
if(owner && vital)
owner.death()
@@ -221,21 +219,23 @@
/obj/item/organ/proc/receive_damage(amount, silent = 0)
if(tough)
return
- if(is_robotic())
- damage = between(0, damage + (amount * 0.8), max_damage)
- else
- damage = between(0, damage + amount, max_damage)
+ damage = between(0, damage + amount, max_damage)
- //only show this if the organ is not robotic
- if(owner && parent_organ && amount > 0)
- var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
- if(parent && !silent)
- owner.custom_pain("Something inside your [parent.name] hurts a lot.")
+ //only show this if the organ is not robotic
+ if(owner && parent_organ && amount > 0)
+ var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
+ if(parent && !silent)
+ owner.custom_pain("Something inside your [parent.name] hurts a lot.")
//check if we've hit max_damage
if(damage >= max_damage)
necrotize()
+/obj/item/organ/proc/heal_internal_damage(amount, robo_repair = FALSE)
+ if(is_robotic() && !robo_repair)
+ return
+ damage = max(damage - amount, 0)
+
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
status &= ~ORGAN_BROKEN
status &= ~ORGAN_SPLINTED
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 7fbfedf849f..11e16d10b1a 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -208,7 +208,12 @@
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I && I.damage)
- if(I.is_robotic() && istype(tool, /obj/item/stack/nanopaste))
+ if(!I.is_robotic() && !istype (tool, /obj/item/stack/nanopaste))
+ if(!(I.sterile))
+ spread_germs_to_organ(I, user, tool)
+ user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \
+ "You start treating damage to [target]'s [I.name] with [tool_name]." )
+ else if(I.is_robotic() && istype(tool, /obj/item/stack/nanopaste))
user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \
"You start treating damage to [target]'s [I.name] with [tool_name]." )
@@ -241,7 +246,11 @@
if(I)
I.surgeryize()
if(I && I.damage)
- if(I.is_robotic() && istype(tool, /obj/item/stack/nanopaste))
+ if(!I.is_robotic() && !istype (tool, /obj/item/stack/nanopaste))
+ user.visible_message(" [user] treats damage to [target]'s [I.name] with [tool_name].", \
+ " You treat damage to [target]'s [I.name] with [tool_name]." )
+ I.damage = 0
+ else if(I.is_robotic() && istype (tool, /obj/item/stack/nanopaste))
user.visible_message(" [user] treats damage to [target]'s [I.name] with [tool_name].", \
" You treat damage to [target]'s [I.name] with [tool_name]." )
I.damage = 0