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