diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm
index 69ecba9f7c8..9931a750095 100644
--- a/code/modules/antagonists/abductor/equipment/glands/heal.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm
@@ -12,23 +12,37 @@
if(!(owner.mob_biotypes & MOB_ORGANIC))
return
+ for(var/implant in owner.implants)
+ reject_implant(implant)
+ return
+
for(var/organ in owner.internal_organs)
if(istype(organ, /obj/item/organ/cyberimp))
- reject_implant(organ)
+ reject_cyberimp(organ)
return
+ var/obj/item/organ/appendix/appendix = owner.getorganslot(ORGAN_SLOT_APPENDIX)
+ if((!appendix && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (appendix && ((appendix.organ_flags & ORGAN_FAILING) || (appendix.organ_flags & ORGAN_SYNTHETIC))))
+ replace_appendix(appendix)
+ return
+
var/obj/item/organ/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER)
- if((!liver/* && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)*/) || (liver && ((liver.damage > (liver.maxHealth / 2)) || (istype(liver, /obj/item/organ/liver/cybernetic)))))
+ if((!liver && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)) || (liver && ((liver.damage > liver.high_threshold) || (liver.organ_flags & ORGAN_SYNTHETIC))))
replace_liver(liver)
return
var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS)
- if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && (istype(lungs, /obj/item/organ/lungs/cybernetic))))
+ if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && ((lungs.damage > lungs.high_threshold) || (lungs.organ_flags & ORGAN_SYNTHETIC))))
replace_lungs(lungs)
return
+ var/obj/item/organ/stomach/stomach = owner.getorganslot(ORGAN_SLOT_STOMACH)
+ if((!stomach && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (stomach && ((stomach.damage > stomach.high_threshold) || (stomach.organ_flags & ORGAN_SYNTHETIC))))
+ replace_stomach(stomach)
+ return
+
var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES)
- if(!eyes || (eyes && ((HAS_TRAIT_FROM(owner, TRAIT_NEARSIGHT, EYE_DAMAGE)) || (HAS_TRAIT_FROM(owner, TRAIT_BLIND, EYE_DAMAGE)) || (istype(eyes, /obj/item/organ/eyes/robotic)))))
+ if(!eyes || (eyes && ((eyes.damage > eyes.low_threshold) || (eyes.organ_flags & ORGAN_SYNTHETIC))))
replace_eyes(eyes)
return
@@ -62,12 +76,33 @@
replace_chest(chest)
return
-/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/organ/cyberimp/implant)
+/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/implant/implant)
+ owner.visible_message("[owner] vomits up a tiny mangled implant!", "You suddenly vomit up a tiny mangled implant!")
+ owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
+ implant.removed(owner)
+ qdel(implant)
+
+/obj/item/organ/heart/gland/heal/proc/reject_cyberimp(obj/item/organ/cyberimp/implant)
owner.visible_message("[owner] vomits up his [implant.name]!", "You suddenly vomit up your [implant.name]!")
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
implant.Remove(owner)
implant.forceMove(owner.drop_location())
+/obj/item/organ/heart/gland/heal/proc/replace_appendix(obj/item/organ/appendix/appendix)
+ if(appendix)
+ owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
+ appendix.Remove(owner)
+ appendix.forceMove(owner.drop_location())
+ owner.visible_message("[owner] vomits up his [appendix.name]!", "You suddenly vomit up your [appendix.name]!")
+ else
+ to_chat(owner, "You feel a weird rumble in your bowels...")
+
+ var/appendix_type = /obj/item/organ/appendix
+ if(owner?.dna?.species?.mutantappendix)
+ appendix_type = owner.dna.species.mutantappendix
+ var/obj/item/organ/appendix/new_appendix = new appendix_type()
+ new_appendix.Insert(owner)
+
/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver)
if(liver)
owner.visible_message("[owner] vomits up his [liver.name]!", "You suddenly vomit up your [liver.name]!")
@@ -98,6 +133,21 @@
var/obj/item/organ/lungs/new_lungs = new lung_type()
new_lungs.Insert(owner)
+/obj/item/organ/heart/gland/heal/proc/replace_stomach(obj/item/organ/stomach/stomach)
+ if(stomach)
+ owner.visible_message("[owner] vomits up his [stomach.name]!", "You suddenly vomit up your [stomach.name]!")
+ owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
+ stomach.Remove(owner)
+ stomach.forceMove(owner.drop_location())
+ else
+ to_chat(owner, "You feel a weird rumble in your bowels...")
+
+ var/stomach_type = /obj/item/organ/stomach
+ if(owner?.dna?.species?.mutantstomach)
+ stomach_type = owner.dna.species.mutantstomach
+ var/obj/item/organ/stomach/new_stomach = new stomach_type()
+ new_stomach.Insert(owner)
+
/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes)
if(eyes)
owner.visible_message("[owner]'s [eyes.name] fall out of their sockets!", "Your [eyes.name] fall out of their sockets!")
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 11019c4b64d..ce3e434095f 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -211,7 +211,7 @@
owner.losebreath += 10
severe_cooldown = world.time + 20 SECONDS
if(prob(emp_vulnerability/severity)) //Chance of permanent effects
- organ_flags = ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon.
+ organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon.
Stop()
owner.visible_message("[owner] clutches at [owner.p_their()] chest as if [owner.p_their()] heart is stopping!", \
"You feel a terrible pain in your chest, as if your heart has stopped!")
diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm
index 1e3e3b7cf87..ce6e6831eab 100755
--- a/code/modules/surgery/organs/liver.dm
+++ b/code/modules/surgery/organs/liver.dm
@@ -117,4 +117,4 @@
owner.adjustToxLoss(10)
severe_cooldown = world.time + 10 SECONDS
if(prob(emp_vulnerability/severity)) //Chance of permanent effects
- organ_flags = ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon.
+ organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon.
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index 9c0ef493d19..a07e1d6a0bb 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -498,4 +498,4 @@
owner.losebreath += 20
severe_cooldown = world.time + 30 SECONDS
if(prob(emp_vulnerability/severity)) //Chance of permanent effects
- organ_flags = ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon.
+ organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon.