From b80d9e213da25b4703483ae468fb2d32325a8fb5 Mon Sep 17 00:00:00 2001 From: Sirryan2002 <80364400+Sirryan2002@users.noreply.github.com> Date: Tue, 30 Aug 2022 13:52:51 -0400 Subject: [PATCH] Organ Deletion Upon Removal is now handled by base procs instead of overrides (#18624) * organs fix * minor tweak * documentation changes * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> * requested changes Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> --- code/modules/surgery/organs/mmi_holder.dm | 6 +++--- code/modules/surgery/organs/organ.dm | 16 ++++++++++++++- code/modules/surgery/organs/organ_internal.dm | 14 ++++++++----- code/modules/surgery/organs/parasites.dm | 20 ++++++------------- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/code/modules/surgery/organs/mmi_holder.dm b/code/modules/surgery/organs/mmi_holder.dm index bd885471ff1..c9ef718a0b1 100644 --- a/code/modules/surgery/organs/mmi_holder.dm +++ b/code/modules/surgery/organs/mmi_holder.dm @@ -3,6 +3,8 @@ name = "Man-Machine Interface" parent_organ = "chest" status = ORGAN_ROBOT + destroy_on_removal = TRUE + var/obj/item/mmi/stored_mmi /obj/item/organ/internal/brain/mmi_holder/Destroy() @@ -22,9 +24,7 @@ owner.mind.transfer_to(stored_mmi.brainmob) stored_mmi.forceMove(get_turf(owner)) stored_mmi = null - ..() - if(!QDELETED(src)) - qdel(src) + return ..() /obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi() if(!stored_mmi) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 7cd174d2197..ffd3c7f4ae4 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -31,11 +31,14 @@ var/hidden_pain = FALSE //will it skip pain messages? var/requires_robotic_bodypart = FALSE + ///Should this organ be destroyed on removal? + var/destroy_on_removal = FALSE + /obj/item/organ/Destroy() STOP_PROCESSING(SSobj, src) if(owner) - remove(owner, 1) + remove(owner, TRUE) QDEL_LIST_ASSOC_VAL(autopsy_data) QDEL_NULL(dna) return ..() @@ -229,6 +232,14 @@ status &= ~ORGAN_SPLINTED status |= ORGAN_ROBOT +/* + * remove + * + * Removes the organ from the user properly. + * If the organ is vital, it will kill the user. + * The proc returns the organ removed (i.e. `src`) assuming it was removed successfully; +* otherwise, or if the organ gets destroyed in the process, it returns null. +*/ /obj/item/organ/proc/remove(mob/living/user, special = 0) if(!istype(owner)) return @@ -245,6 +256,9 @@ add_attack_logs(user, owner, "Removed vital organ ([src])", !!user ? ATKLOG_FEW : ATKLOG_ALL) owner.death() owner = null + if(destroy_on_removal && !QDELETED(src)) + qdel(src) + return return src /obj/item/organ/proc/replaced(mob/living/carbon/human/target) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 76dfcf16f5b..8e701d3f6f4 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -72,6 +72,9 @@ var/datum/action/A = X A.Remove(M) START_PROCESSING(SSobj, src) + if(destroy_on_removal && !QDELETED(src)) + qdel(src) + return return src /obj/item/organ/internal/emp_act(severity) @@ -202,6 +205,8 @@ w_class = WEIGHT_CLASS_TINY parent_organ = "head" slot = "brain_tumor" + destroy_on_removal = TRUE + var/organhonked = 0 var/suffering_delay = 900 var/datum/component/squeak @@ -217,14 +222,13 @@ squeak = M.AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg' = 1), 50, falloff_exponent = 20) /obj/item/organ/internal/honktumor/remove(mob/living/carbon/M, special = 0) - . = ..() M.dna.SetSEState(GLOB.clumsyblock, FALSE) M.dna.SetSEState(GLOB.comicblock, FALSE) singlemutcheck(M, GLOB.clumsyblock, MUTCHK_FORCED) singlemutcheck(M, GLOB.comicblock, MUTCHK_FORCED) M.RemoveElement(/datum/element/waddling) QDEL_NULL(squeak) - qdel(src) + return ..() /obj/item/organ/internal/honktumor/on_life() if(organhonked < world.time) @@ -269,6 +273,8 @@ w_class = WEIGHT_CLASS_TINY parent_organ = "groin" slot = "honk_bladder" + destroy_on_removal = TRUE + var/datum/component/squeak /obj/item/organ/internal/honkbladder/insert(mob/living/carbon/M, special = 0) @@ -276,10 +282,8 @@ squeak = M.AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50, falloff_exponent = 20) /obj/item/organ/internal/honkbladder/remove(mob/living/carbon/M, special = 0) - . = ..() - QDEL_NULL(squeak) - qdel(src) + return ..() /obj/item/organ/internal/beard name = "beard organ" diff --git a/code/modules/surgery/organs/parasites.dm b/code/modules/surgery/organs/parasites.dm index 5bc1f991357..a4232251dca 100644 --- a/code/modules/surgery/organs/parasites.dm +++ b/code/modules/surgery/organs/parasites.dm @@ -5,6 +5,8 @@ name = "spider eggs" icon = 'icons/effects/effects.dmi' icon_state = "eggs" + destroy_on_removal = TRUE + var/stage = 1 /obj/item/organ/internal/body_egg/spider_eggs/on_life() @@ -33,13 +35,8 @@ owner.gib() /obj/item/organ/internal/body_egg/spider_eggs/remove(mob/living/carbon/M, special = 0) - ..() M.reagents.del_reagent("spidereggs") //purge all remaining spider eggs reagent if caught, in time. - if(!QDELETED(src)) - qdel(src) // prevent people re-implanting them into others - return null - - + return ..() // Terror Spiders - white spider infection @@ -47,6 +44,7 @@ name = "terror eggs" icon = 'icons/effects/effects.dmi' icon_state = "eggs" + destroy_on_removal = TRUE var/cycle_num = 0 // # of on_life() cycles completed, never reset var/egg_progress = 0 // # of on_life() cycles completed, unlike cycle_num this is reset on each hatch event @@ -102,11 +100,5 @@ eggs_hatched++ to_chat(owner, "A strange prickling sensation moves across your skin... then suddenly the whole world seems to spin around you!") owner.Paralyse(20 SECONDS) - if(infection_completed && !QDELETED(src)) - qdel(src) - -/obj/item/organ/internal/body_egg/terror_eggs/remove(mob/living/carbon/M, special = 0) - ..() - if(!QDELETED(src)) - qdel(src) // prevent people re-implanting them into others - return null + if(infection_completed) + remove(owner)