diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 10b8d580447..5a0132f6bd8 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -37,11 +37,15 @@ brainmob.client.screen.len = null //clear the hud /obj/item/organ/brain/proc/transfer_identity(var/mob/living/carbon/H) - name = "\the [H]'s [initial(src.name)]" brainmob = new(src) - brainmob.name = H.real_name - brainmob.real_name = H.real_name - brainmob.dna = H.dna.Clone() + if(isnull(dna)) // someone didn't set this right... + log_to_dd("[src] at [loc] did not contain a dna datum at time of removed.") + dna = H.dna.Clone() + name = "\the [dna.real_name]'s [initial(src.name)]" + brainmob.dna = dna.Clone() // Silly baycode, what you do +// brainmob.dna = H.dna.Clone() Putting in and taking out a brain doesn't make it a carbon copy of the original brain of the body you put it in + brainmob.name = dna.real_name + brainmob.real_name = dna.real_name brainmob.timeofhostdeath = H.timeofdeath if(H.mind) H.mind.transfer_to(brainmob) @@ -59,33 +63,38 @@ /obj/item/organ/brain/removed(var/mob/living/user) if(!owner) return ..() // Probably a redundant removal; just bail - name = "[owner.real_name]'s brain" - - var/mob/living/simple_animal/borer/borer = owner.has_brain_worms() - - if(borer) - borer.detatch() //Should remove borer if the brain is removed - RR - - owner.brain_op_stage = 4.0 var/obj/item/organ/brain/B = src - if(istype(B) && istype(owner)) + if(istype(B) && istype(owner) && is_primary_organ()) + var/mob/living/simple_animal/borer/borer = owner.has_brain_worms() + + if(borer) + borer.detatch() //Should remove borer if the brain is removed - RR + + owner.brain_op_stage = 4.0 B.transfer_identity(owner) ..() /obj/item/organ/brain/replaced(var/mob/living/target) - if(target.key) - target.ghostize() - var/mob/living/carbon/C = target - if(istype(C)) - C.brain_op_stage = 1.0 - if(brainmob) - if(brainmob.mind) - brainmob.mind.transfer_to(target) - else - target.key = brainmob.key + var/brain_already_exists = 0 + if(istype(target,/mob/living/carbon/human)) // No more IPC multibrain shenanigans + var/mob/living/carbon/human/H = target + if(organ_tag in H.internal_organs_by_name) + brain_already_exists = 1 + + if(!brain_already_exists) + if(target.key) + target.ghostize() + var/mob/living/carbon/C = target + if(istype(C)) + C.brain_op_stage = 1.0 + if(brainmob) + if(brainmob.mind) + brainmob.mind.transfer_to(target) + else + target.key = brainmob.key ..() /obj/item/organ/brain/slime diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 8b277409dd3..ad91f6c152e 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -93,4 +93,4 @@ sight &= ~SEE_OBJS see_in_dark = 2 see_invisible = SEE_INVISIBLE_LIVING - handle_hud_icons_health() \ No newline at end of file + handle_hud_icons_health() diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index e7d4fd89eba..62449b727c1 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -256,13 +256,14 @@ var/list/organ_cache = list() take_damage(0,3) /obj/item/organ/proc/removed(var/mob/living/user) - if(!istype(owner)) return - owner.internal_organs_by_name[organ_tag] = null - owner.internal_organs_by_name -= organ_tag - owner.internal_organs_by_name -= null + if(is_primary_organ()) + owner.internal_organs_by_name[organ_tag] = null + owner.internal_organs_by_name -= organ_tag + owner.internal_organs_by_name -= null // uh what does this line even do this seems silly + owner.internal_organs -= src var/obj/item/organ/external/affected = owner.get_organ(parent_organ) @@ -275,7 +276,7 @@ var/list/organ_cache = list() if(!organ_blood || !organ_blood.data["blood_DNA"]) owner.vessel.trans_to(src, 5, 1, 1) - if(owner && vital) + if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead if(user) user.attack_log += "\[[time_stamp()]\] removed a vital organ ([src]) from [key_name(owner)] (INTENT: [uppertext(user.a_intent)])" owner.attack_log += "\[[time_stamp()]\] had a vital organ ([src]) removed by [key_name(user)] (INTENT: [uppertext(user.a_intent)])" @@ -291,7 +292,8 @@ var/list/organ_cache = list() processing_objects -= src target.internal_organs |= src affected.internal_organs |= src - target.internal_organs_by_name[organ_tag] = src + if (!(organ_tag in target.internal_organs_by_name)) + target.internal_organs_by_name[organ_tag] = src // In case multiple of the same type are inserted, only the first one is the primary organ src.loc = target if(robotic) status |= ORGAN_ROBOT @@ -326,4 +328,16 @@ var/list/organ_cache = list() qdel(src) /obj/item/organ/proc/surgeryize() - return \ No newline at end of file + return + +/* +Returns 1 if this is the organ that is handling all the functionalities of that particular organ slot +Returns 0 if it isn't +I use this so that this can be made better once the organ overhaul rolls out -- Crazylemon +*/ +/obj/item/organ/proc/is_primary_organ(var/mob/living/carbon/human/O = null) + if (isnull(O)) + O = owner + if (!istype(owner)) // You're not the primary organ of ANYTHING, bucko + return 0 + return src == O.internal_organs_by_name[organ_tag] \ No newline at end of file diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 1c6ca1d176b..e1ab07b028e 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -855,7 +855,8 @@ Note that amputating the affected organ does in fact remove the infection from t release_restraints(victim) victim.organs -= src - victim.organs_by_name[limb_name] = null // Remove from owner's vars. + if(is_primary_organ(victim)) + victim.organs_by_name[limb_name] = null // Remove from owner's vars. //Robotic limbs explode if sabotaged. if(is_robotic && sabotaged) @@ -885,3 +886,10 @@ Note that amputating the affected organ does in fact remove the infection from t "\red Your [name] melts away!", \ "\red You hear a sickening sizzle.") disfigured = 1 + +/obj/item/organ/external/is_primary_organ(var/mob/living/carbon/human/O = null) + if (isnull(O)) + O = owner + if (!istype(O)) // You're not the primary organ of ANYTHING, bucko + return 0 + return src == O.organs_by_name[limb_name] diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index 6663f833bef..c11b8e028ab 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -137,7 +137,7 @@ /obj/item/organ/external/head/removed() if(owner) - name = "[owner.real_name]'s head" + name = "[dna.real_name]'s head" owner.unEquip(owner.glasses) owner.unEquip(owner.head) owner.unEquip(owner.l_ear) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index b0b840d138c..f3a5abd2ac8 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -206,18 +206,20 @@ return 0 target.op_stage.current_organ = null + target.op_stage.organ_ref = null var/list/attached_organs = list() - for(var/organ in target.internal_organs_by_name) - var/obj/item/organ/I = target.internal_organs_by_name[organ] + for(var/organ in affected.internal_organs) + var/obj/item/organ/I = organ if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) - attached_organs |= organ + attached_organs[I.organ_tag] = I var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs if(!organ_to_remove) return 0 target.op_stage.current_organ = organ_to_remove + target.op_stage.organ_ref = attached_organs[organ_to_remove] return ..() && organ_to_remove @@ -234,7 +236,7 @@ user.visible_message("\blue [user] has separated [target]'s [target.op_stage.current_organ] with \the [tool]." , \ "\blue You have separated [target]'s [target.op_stage.current_organ] with \the [tool].") - var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ] + var/obj/item/organ/I = target.op_stage.organ_ref if(I && istype(I)) I.status |= ORGAN_CUT_AWAY @@ -259,20 +261,26 @@ if (!..()) return 0 + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + if(!istype(affected)) + return 0 target.op_stage.current_organ = null + target.op_stage.organ_ref = null var/list/removable_organs = list() - for(var/organ in target.internal_organs_by_name) - var/obj/item/organ/I = target.internal_organs_by_name[organ] - if((I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) - removable_organs |= organ + for(var/organ in affected.internal_organs) + var/obj/item/organ/I = organ + if(istype(I) && (I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) + removable_organs[I.organ_tag] = I var/organ_to_remove = input(user, "Which organ do you want to remove?") as null|anything in removable_organs if(!organ_to_remove) return 0 target.op_stage.current_organ = organ_to_remove + target.op_stage.organ_ref = removable_organs[organ_to_remove] return ..() begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -287,10 +295,9 @@ // Extract the organ! if(target.op_stage.current_organ) - var/obj/item/organ/O = target.internal_organs_by_name[target.op_stage.current_organ] + var/obj/item/organ/O = target.op_stage.organ_ref if(O && istype(O)) O.removed(user) - target.op_stage.current_organ = null fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -391,19 +398,26 @@ if (!..()) return 0 + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + if(!istype(affected)) + return 0 + target.op_stage.current_organ = null + target.op_stage.organ_ref = null var/list/removable_organs = list() - for(var/organ in target.internal_organs_by_name) - var/obj/item/organ/I = target.internal_organs_by_name[organ] - if(I && (I.status & ORGAN_CUT_AWAY) && !(I.status & ORGAN_ROBOT) && I.parent_organ == target_zone) - removable_organs |= organ + for(var/organ in affected.internal_organs) + var/obj/item/organ/I = organ + if(I && istype(I) && (I.status & ORGAN_CUT_AWAY) && !(I.status & ORGAN_ROBOT) && I.parent_organ == target_zone) + removable_organs[I.organ_tag] = I var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs if(!organ_to_replace) return 0 target.op_stage.current_organ = organ_to_replace + target.op_stage.organ_ref = removable_organs[organ_to_replace] return ..() begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -416,7 +430,7 @@ user.visible_message("\blue [user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \ "\blue You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].") - var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ] + var/obj/item/organ/I = target.op_stage.organ_ref if(I && istype(I)) I.status &= ~ORGAN_CUT_AWAY diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index fa6fd6f215f..cf2fe5cd6a4 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -289,18 +289,20 @@ return 0 target.op_stage.current_organ = null + target.op_stage.organ_ref = null var/list/attached_organs = list() - for(var/organ in target.internal_organs_by_name) - var/obj/item/organ/I = target.internal_organs_by_name[organ] - if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) - attached_organs |= organ + for(var/organ in affected.internal_organs) + var/obj/item/organ/I = organ + if(I && istype(I) && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) + attached_organs[I.organ_tag] = I var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs if(!organ_to_remove) return 0 target.op_stage.current_organ = organ_to_remove + target.op_stage.organ_ref = attached_organs[organ_to_remove] return ..() && organ_to_remove @@ -338,18 +340,20 @@ return 0 target.op_stage.current_organ = null + target.op_stage.organ_ref = null var/list/removable_organs = list() - for(var/organ in target.internal_organs_by_name) - var/obj/item/organ/I = target.internal_organs_by_name[organ] - if(I && (I.status & ORGAN_CUT_AWAY) && (I.status & ORGAN_ROBOT) && I.parent_organ == target_zone) - removable_organs |= organ + for(var/organ in affected.internal_organs) + var/obj/item/organ/I = organ + if(I && istype(I) && (I.status & ORGAN_CUT_AWAY) && (I.status & ORGAN_ROBOT) && I.parent_organ == target_zone) + removable_organs[I.organ_tag] = I var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs if(!organ_to_replace) return 0 target.op_stage.current_organ = organ_to_replace + target.op_stage.organ_ref = removable_organs[organ_to_replace] return ..() begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index d353c4f49f7..6b7d0fe1456 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -131,4 +131,5 @@ var/ribcage = 0 var/head_reattach = 0 var/current_organ = "organ" + var/obj/item/organ/organ_ref = null var/list/in_progress = list() \ No newline at end of file