diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 4effab8bd78..4d4e601ce72 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -16,6 +16,9 @@ var/loading = 0 // Nice loading text var/autoprocess = 0 var/obj/machinery/clonepod/selected_pod + // 0: Standard body scan + // 1: The "Best" scan available + var/scan_mode = 1 light_color = LIGHT_COLOR_DARKBLUE @@ -31,7 +34,7 @@ if(!scanner || !pods.len || !autoprocess || stat & NOPOWER) return - if(scanner.occupant && (scanner.scan_level > 2)) + if(scanner.occupant && can_autoprocess()) scan_mob(scanner.occupant) for (var/obj/machinery/clonepod/pod in pods) @@ -135,6 +138,8 @@ data["loading"] = loading data["autoprocess"] = autoprocess + data["can_brainscan"] = can_brainscan() // You'll need tier 4s for this + data["scan_mode"] = scan_mode if(scanner && pods.len && ((scanner.scan_level > 2) || canpodautoprocess)) data["autoallowed"] = 1 @@ -184,13 +189,16 @@ if(loading) return - if ((href_list["scan"]) && (!isnull(src.scanner))) + if (href_list["scan"] && scanner && scanner.occupant) scantemp = "Scanner ready." loading = 1 spawn(20) - src.scan_mob(src.scanner.occupant) + if(can_brainscan() && scan_mode) + scan_mob(scanner.occupant, scan_brain = 1) + else + scan_mob(scanner.occupant) loading = 0 nanomanager.update_uis(src) @@ -335,21 +343,36 @@ src.menu = text2num(href_list["menu"]) temp = "" scantemp = "Scanner ready." + else if (href_list["toggle_mode"]) + if(can_brainscan()) + scan_mode = !scan_mode + else + scan_mode = 0 src.add_fingerprint(usr) nanomanager.update_uis(src) return -/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob) +/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob, var/scan_brain = 0) if (stat & NOPOWER) return if (scanner.stat & (NOPOWER|BROKEN)) return + if (scan_brain && !can_brainscan()) + return if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (subject.species.flags & NO_SCAN)) scantemp = "Error: Unable to locate valid genetic data." nanomanager.update_uis(src) return - if (!subject.get_int_organ(/obj/item/organ/internal/brain)) + if("brain" in subject.internal_organs_by_name) + var/obj/item/organ/brain/Brn = subject.internal_organs_by_name["brain"] + if(istype(Brn)) + var/datum/species/S = all_species[Brn.dna.species] // stepladder code wooooo + if(S.flags & NO_SCAN) + scantemp = "Error: Subject's brain is incompatible." + nanomanager.update_uis(src) + return + if (subject.brain_op_stage == 4.0) scantemp = "Error: No signs of intelligence detected." nanomanager.update_uis(src) return @@ -365,6 +388,10 @@ scantemp = "Error: Mental interface failure." nanomanager.update_uis(src) return + if (scan_brain && !("brain" in subject.internal_organs_by_name)) + scantemp = "Error: No brain found." + nanomanager.update_uis(src) + return if (!isnull(find_record(subject.ckey))) scantemp = "Subject already in database." nanomanager.update_uis(src) @@ -373,13 +400,25 @@ subject.dna.check_integrity() var/datum/dna2/record/R = new /datum/dna2/record() - R.dna=subject.dna R.ckey = subject.ckey - R.id= copytext(md5(subject.real_name), 2, 6) - R.name=R.dna.real_name + var/extra_info = "" + if(scan_brain) + var/obj/item/organ/B = subject.internal_organs_by_name["brain"] + B.dna.check_integrity() + R.dna=B.dna.Clone() + var/datum/species/S = all_species[R.dna.species] + if(S.flags & NO_SCAN) + extra_info = "Proper genetic interface not found, defaulting to genetic data of the body." + R.dna.species = subject.species.name + R.id= copytext(md5(B.dna.real_name), 2, 6) + R.name=B.dna.real_name + else + R.dna=subject.dna.Clone() + R.id= copytext(md5(subject.real_name), 2, 6) + R.name=R.dna.real_name + R.types=DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE R.languages=subject.languages - //Add an implant if needed var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) if (isnull(imp)) @@ -394,7 +433,7 @@ R.mind = "\ref[subject.mind]" src.records += R - scantemp = "Subject successfully scanned." + scantemp = "Subject successfully scanned. " + extra_info nanomanager.update_uis(src) //Find a specific record by key. @@ -404,4 +443,10 @@ if (R.ckey == find_key) selected_record = R break - return selected_record \ No newline at end of file + return selected_record + +/obj/machinery/computer/cloning/proc/can_autoprocess() + return (scanner && scanner.scan_level > 2) + +/obj/machinery/computer/cloning/proc/can_brainscan() + return (scanner && scanner.scan_level > 3) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 6ef6ef0707c..a44b3d20450 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/brain +/obj/item/organ/brain name = "brain" health = 400 //They need to live awhile longer than other organs. max_damage = 200 @@ -13,30 +13,33 @@ var/mob/living/carbon/brain/brainmob = null organ_tag = "brain" parent_organ = "head" - slot = "brain" vital = 1 -/obj/item/organ/internal/brain/surgeryize() +/obj/item/organ/brain/attack_self(mob/user as mob) + return //let's not have players taken out of the round as easily as a click, once you have their brain. + +/obj/item/organ/brain/surgeryize() if(!owner) return owner.ear_damage = 0 //Yeah, didn't you...hear? The ears are totally inside the brain. owner.ear_deaf = 0 -/obj/item/organ/internal/brain/xeno +/obj/item/organ/brain/xeno name = "thinkpan" desc = "It looks kind of like an enormous wad of purple bubblegum." - icon_state = "brain-x-d" + icon = 'icons/mob/alien.dmi' + icon_state = "chitin" -/obj/item/organ/internal/brain/New() +/obj/item/organ/brain/New() ..() spawn(5) if(brainmob && brainmob.client) brainmob.client.screen.len = null //clear the hud -/obj/item/organ/internal/brain/proc/transfer_identity(var/mob/living/carbon/H) +/obj/item/organ/brain/proc/transfer_identity(var/mob/living/carbon/H) brainmob = new(src) if(isnull(dna)) // someone didn't set this right... - log_to_dd("[src] at [loc] did not contain a dna datum at time of removal.") + 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 @@ -50,18 +53,18 @@ brainmob << "You feel slightly disoriented. That's normal when you're just a [initial(src.name)]." callHook("debrain", list(brainmob)) -/obj/item/organ/internal/brain/examine(mob/user) // -- TLE +/obj/item/organ/brain/examine(mob/user) // -- TLE ..(user) if(brainmob && brainmob.client)//if thar be a brain inside... the brain. user << "You can feel the small spark of life still left in this one." else user << "This one seems particularly lifeless. Perhaps it will regain some of its luster later.." -/obj/item/organ/internal/brain/remove(var/mob/living/user,var/special) +/obj/item/organ/brain/removed(var/mob/living/user) if(!owner) return ..() // Probably a redundant removal; just bail - var/obj/item/organ/internal/brain/B = src + var/obj/item/organ/brain/B = src if(istype(B) && istype(owner) && is_primary_organ()) var/mob/living/simple_animal/borer/borer = owner.has_brain_worms() @@ -73,12 +76,12 @@ ..() -/obj/item/organ/internal/brain/insert(var/mob/living/target) +/obj/item/organ/brain/replaced(var/mob/living/target) 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(target.get_int_organ(/obj/item/organ/internal/brain)) + var/mob/living/carbon/human/H = target + if(organ_tag in H.internal_organs_by_name) brain_already_exists = 1 if(!brain_already_exists) @@ -94,22 +97,19 @@ target.key = brainmob.key ..() -/obj/item/organ/internal/brain/prepare_eat() - return // Too important to eat. - -/obj/item/organ/internal/brain/slime +/obj/item/organ/brain/slime name = "slime core" desc = "A complex, organic knot of jelly and crystalline particles." icon = 'icons/mob/slimes.dmi' icon_state = "green slime extract" -/obj/item/organ/internal/brain/golem - name = "chem" +/obj/item/organ/brain/golem + name = "Runic mind" desc = "A tightly furled roll of paper, covered with indecipherable runes." icon = 'icons/obj/wizard.dmi' icon_state = "scroll" -/obj/item/organ/internal/brain/Destroy() //copypasted from MMIs. +/obj/item/organ/brain/Destroy() //copypasted from MMIs. if(brainmob) qdel(brainmob) brainmob = null