diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 10b8d580447..e06d9d3788e 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -69,23 +69,35 @@ owner.brain_op_stage = 4.0 var/obj/item/organ/brain/B = src - if(istype(B) && istype(owner)) + if(istype(B) && istype(owner) && owner.internal_organs_by_name[organ_tag] == src) 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 + 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/die() if(brainmob) - if(brainmob.mind) - brainmob.mind.transfer_to(target) - else - target.key = brainmob.key + brainmob.death(0) ..() /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 2a191c46217..1a3ccdf0ca6 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -4,7 +4,7 @@ radiation -= 3 adjustToxLoss(3) updatehealth() - if(!container) + if(!container) // The brains are containers - Theory: Everyone on the station is secretly a highly-advanced cyborg, wearing meat shells src << "You feel weak." else src << "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED." diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index e7d4fd89eba..5176f1a02d8 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -257,12 +257,17 @@ var/list/organ_cache = list() /obj/item/organ/proc/removed(var/mob/living/user) + var/primary_organ = 1 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(owner.internal_organs_by_name[organ_tag] == src) + owner.internal_organs_by_name[organ_tag] = null + owner.internal_organs_by_name -= organ_tag + owner.internal_organs_by_name -= null + else + primary_organ = 0 + owner.internal_organs -= src var/obj/item/organ/external/affected = owner.get_organ(parent_organ) @@ -275,7 +280,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 && 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 +296,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