From 07e8ee1f503a5b24e8b57f48cbaed896755d0d46 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Wed, 30 May 2018 18:13:26 -0700 Subject: [PATCH] Merge pull request #5289 from fludd12/splat Prometheans can now be revived as originally intended. --- code/modules/organs/internal/brain.dm | 93 +++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 21807e2c22..ee1056344f 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -137,10 +137,103 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) icon_state = "green slime extract" parent_organ = BP_TORSO clone_source = TRUE + flags = OPENCONTAINER /obj/item/organ/internal/brain/slime/is_open_container() return 1 +/obj/item/organ/internal/brain/slime/New() + ..() + create_reagents(50) + +/obj/item/organ/internal/brain/slime/proc/reviveBody() + var/datum/dna2/record/R = new /datum/dna2/record() + R.dna = brainmob.dna + R.ckey = brainmob.ckey + R.id = copytext(md5(brainmob.real_name), 2, 6) + R.name = R.dna.real_name + R.types = DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE + R.languages = brainmob.languages + R.flavor = list() + for(var/datum/modifier/mod in brainmob.modifiers) + if(mod.flags & MODIFIER_GENETIC) + R.genetic_modifiers.Add(mod.type) + + var/datum/mind/clonemind = brainmob.mind + + if(!istype(clonemind, /datum/mind)) //not a mind + return 0 + if(clonemind.current && clonemind.current.stat != DEAD) //mind is associated with a non-dead body + return 0 + if(clonemind.active) //somebody is using that mind + if(ckey(clonemind.key) != R.ckey) + return 0 + else + for(var/mob/observer/dead/G in player_list) + if(G.ckey == R.ckey) + if(G.can_reenter_corpse) + break + else + return 0 + + for(var/modifier_type in R.genetic_modifiers) //Can't be revived. Probably won't happen...? + if(istype(modifier_type, /datum/modifier/no_clone)) + return 0 + + var/mob/living/carbon/human/H = new /mob/living/carbon/human(get_turf(src), R.dna.species) + + if(!R.dna) + H.dna = new /datum/dna() + H.dna.real_name = H.real_name + else + H.dna = R.dna + + H.UpdateAppearance() + H.sync_organ_dna() + if(!R.dna.real_name) //to prevent null names + R.dna.real_name = "promethean ([rand(0,999)])" + H.real_name = R.dna.real_name + + H.nutrition = 260 //Enough to try to regenerate ONCE. + H.adjustBruteLoss(40) + H.adjustFireLoss(40) + H.Paralyse(4) + H.updatehealth() + for(var/obj/item/organ/external/E in H.organs) //They've still gotta congeal, but it's faster than the clone sickness they'd normally get. + if(E && E.organ_tag == BP_L_ARM || E.organ_tag == BP_R_ARM || E.organ_tag == BP_L_LEG || E.organ_tag == BP_R_LEG) + E.removed() + qdel(E) + E = null + H.regenerate_icons() + clonemind.transfer_to(H) + for(var/modifier_type in R.genetic_modifiers) + H.add_modifier(modifier_type) + + for(var/datum/language/L in R.languages) + H.add_language(L.name) + H.flavor_texts = R.flavor.Copy() + qdel(src) + return 1 + +/datum/chemical_reaction/promethean_brain_revival + name = "Promethean Revival" + id = "prom_revival" + result = null + required_reagents = list("phoron" = 40) + result_amount = 1 + +/datum/chemical_reaction/promethean_brain_revival/can_happen(var/datum/reagents/holder) + if(holder.my_atom && istype(holder.my_atom, /obj/item/organ/internal/brain/slime)) + return ..() + return FALSE + +/datum/chemical_reaction/promethean_brain_revival/on_reaction(var/datum/reagents/holder) + var/obj/item/organ/internal/brain/slime/brain = holder.my_atom + if(brain.reviveBody()) + brain.visible_message("[brain] bubbles, surrounding itself with a rapidly expanding mass of slime!") + else + brain.visible_message("[brain] shifts strangely, but falls still.") + /obj/item/organ/internal/brain/golem name = "chem" desc = "A tightly furled roll of paper, covered with indecipherable runes."