From e83748257545b654c8e5fccf718ba3f90986189e Mon Sep 17 00:00:00 2001 From: Farie82 Date: Fri, 3 Dec 2021 13:24:05 +0100 Subject: [PATCH] Embedded objects stay embedded on dismembered limbs. Can be removed by sharp objects (#16839) --- code/datums/spells/summonitem.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 3 +- code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/surgery/organs/organ_external.dm | 30 +++++++++++++++++-- .../modules/surgery/remove_embedded_object.dm | 2 +- 6 files changed, 33 insertions(+), 8 deletions(-) diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 2e7d3d8278a..b5bbdd08608 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -79,7 +79,7 @@ for(var/X in C.bodyparts) var/obj/item/organ/external/part = X if(item_to_retrieve in part.embedded_objects) - part.embedded_objects -= item_to_retrieve + part.remove_embedded_object(item_to_retrieve) to_chat(C, "\The [item_to_retrieve] that was embedded in your [part] has mysteriously vanished. How fortunate!") if(!C.has_embedded_objects()) C.clear_alert("embeddedobject") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 68e29086ce1..6f0b582f885 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -613,7 +613,7 @@ if(do_after(usr, time_taken, needhand = 1, target = src)) if(!I || !L || I.loc != src || !(I in L.embedded_objects)) return - L.embedded_objects -= I + L.remove_embedded_object(I) L.receive_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. I.forceMove(get_turf(src)) usr.put_in_hands(I) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 29708f16c78..51379830c49 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -549,9 +549,8 @@ emp_act if(prob(I.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE)) throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) var/obj/item/organ/external/L = pick(bodyparts) - L.embedded_objects |= I + L.add_embedded_object(I) I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! - I.forceMove(src) L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier) visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") hitpush = FALSE diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 7d27dc92209..6a6aa7700c8 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -838,7 +838,7 @@ if(prob(I.embedded_fall_chance)) BP.receive_damage(I.w_class*I.embedded_fall_pain_multiplier) - BP.embedded_objects -= I + BP.remove_embedded_object(I) I.forceMove(get_turf(src)) visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!") if(!has_embedded_objects()) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index f84219fc898..a44e3c1242d 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -94,6 +94,14 @@ return ..() +/obj/item/organ/external/examine(mob/user) + . = ..() + + var/list/embedded_names = list() + for(var/obj/item/I in embedded_objects) + embedded_names += "[I]" + if(length(embedded_names)) + . += "You can see [english_list(embedded_names)] embedded." /obj/item/organ/external/update_health() damage = min(max_damage, (brute_dam + burn_dam)) @@ -574,6 +582,7 @@ Note that amputating the affected organ does in fact remove the infection from t "You begin to cut open [src]...") if(do_after(user, 54, target = src)) drop_organs(user) + drop_embedded_objects() else return ..() @@ -719,8 +728,10 @@ Note that amputating the affected organ does in fact remove the infection from t victim.splinted_limbs -= src for(var/obj/item/I in embedded_objects) - embedded_objects -= I + UnregisterSignal(I, COMSIG_MOVABLE_MOVED) // Else it gets removed from the embedded list I.forceMove(src) + RegisterSignal(I, COMSIG_MOVABLE_MOVED, .proc/remove_embedded_object) + if(!owner.has_embedded_objects()) owner.clear_alert("embeddedobject") @@ -799,6 +810,21 @@ Note that amputating the affected organ does in fact remove the infection from t if(data["dna"]) sync_colour_to_dna() +/obj/item/organ/external/proc/remove_embedded_object(obj/item/I) + embedded_objects -= I + UnregisterSignal(I, COMSIG_MOVABLE_MOVED) + +/obj/item/organ/external/proc/drop_embedded_objects() + var/turf/T = get_turf(src) + for(var/obj/item/I in embedded_objects) + remove_embedded_object(I) + forceMove(T) + +/obj/item/organ/external/proc/add_embedded_object(obj/item/I) + embedded_objects += I + I.forceMove(owner) + RegisterSignal(I, COMSIG_MOVABLE_MOVED, .proc/remove_embedded_object) + //Remove all embedded objects from all limbs on the carbon mob /mob/living/carbon/human/proc/remove_all_embedded_objects() var/turf/T = get_turf(src) @@ -806,7 +832,7 @@ Note that amputating the affected organ does in fact remove the infection from t for(var/X in bodyparts) var/obj/item/organ/external/L = X for(var/obj/item/I in L.embedded_objects) - L.embedded_objects -= I + L.remove_embedded_object(I) I.forceMove(T) clear_alert("embeddedobject") diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 2040138640f..098e92ca4af 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -50,8 +50,8 @@ var/objects = 0 for(var/obj/item/I in L.embedded_objects) objects++ + L.remove_embedded_object(I) I.forceMove(get_turf(H)) - L.embedded_objects -= I if(!H.has_embedded_objects()) H.clear_alert("embeddedobject")