diff --git a/code/WorkInProgress/SkyMarshal/evidence.dm b/code/WorkInProgress/SkyMarshal/evidence.dm
index c349adf3323..e78bf737a73 100644
--- a/code/WorkInProgress/SkyMarshal/evidence.dm
+++ b/code/WorkInProgress/SkyMarshal/evidence.dm
@@ -38,7 +38,7 @@
U.contents.Remove(O)
user << "You put the [O] inside the [src]."
icon_state = "evidence"
- src.underlays += O
+ src.overlays += O
desc = "An evidence bag containing \a [O]. [O.desc]"
O.loc = src
w_class = O.w_class
@@ -49,7 +49,7 @@
if (src.contents.len > 0)
var/obj/item/I = src.contents[1]
user << "You take the [I] out of the [src]."
- src.underlays -= I
+ src.overlays -= I
I.loc = get_turf(user.loc)
w_class = 1
src.icon_state = "evidenceobj"
diff --git a/code/WorkInProgress/SkyMarshal/wardrobes.dm b/code/WorkInProgress/SkyMarshal/wardrobes.dm
index 80c0c6c310f..9cb9942a944 100644
--- a/code/WorkInProgress/SkyMarshal/wardrobes.dm
+++ b/code/WorkInProgress/SkyMarshal/wardrobes.dm
@@ -5,6 +5,7 @@
icon_state = "wardrobe"
item_state = "wardrobe"
w_class = 4
+ layer = 2.9
var
descriptor = "various clothing."
@@ -34,7 +35,7 @@
examine()
set src in usr
..()
- usr << "It claims to contain [contents.len ? descriptor : descriptor + "...but it looks empty"]"
+ usr << "It claims to contain [contents.len ? descriptor : descriptor + "... but it looks empty"]"
return
update_icon()
@@ -481,7 +482,6 @@
new /obj/item/weapon/pen(src)
new /obj/item/weapon/clipboard(src)
new /obj/item/device/pda/quartermaster(src)
- new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/device/radio/headset/heads/qm(src)
new /obj/item/clothing/shoes/black(src)
@@ -497,7 +497,6 @@
new /obj/item/weapon/storage/box(BPK)
new /obj/item/weapon/pen(src)
new /obj/item/device/pda/quartermaster(src)
- new /obj/item/clothing/gloves/black(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/under/rank/cargo(src)
@@ -518,7 +517,6 @@
new /obj/item/weapon/pickaxe(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/clothing/glasses/meson(src)
- new /obj/item/clothing/gloves/black(src)
new /obj/item/device/radio/headset/headset_mine(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/under/rank/miner(src)
diff --git a/code/WorkInProgress/detective_work.dm b/code/WorkInProgress/detective_work.dm
index e076193adba..154cfdb3fb4 100644
--- a/code/WorkInProgress/detective_work.dm
+++ b/code/WorkInProgress/detective_work.dm
@@ -53,20 +53,36 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
obj/machinery/computer/forensic_scanning
name = "High-Res Forensic Scanning Computer"
icon_state = "forensic"
- var/obj/item/scanning
- var/temp = ""
- var/canclear = 1
- var/authenticated = 0
+ var
+ obj/item/scanning
+ temp = ""
+ canclear = 1
+ authenticated = 0
- var/scan_data = ""
- var/scan_name = ""
- var/scan_process = 0
+//Here's the structure for files: each entry is a list, and entry one in that list is the string of their
+//full and scrambled fingerprint. This acts as the method to arrange evidence. Each subsequent entry is list
+//in the form (from entries):
+// 1: Object
+// 2: All prints on the object
+// 3: All fibers on the object
+// 4: All blood on the object
+//This is then used to show what objects were used to "find" the full print, as well as the fibers on it.
+ list/files = list()
+//This holds objects (1) without prints, and their fibers(2) and blood(3).
+ list/misc = list()
+ obj/item/weapon/f_card/card
+
+ scan_data = ""
+ scan_name = ""
+ scan_process = 0
req_access = list(access_forensics_lockers)
+
attack_ai(mob/user)
return attack_hand(user)
+
attack_hand(mob/user)
if(..())
return
@@ -100,8 +116,198 @@ obj/machinery/computer/forensic_scanning
dat += "
{Erase Data}"
user << browse(dat,"window=scanner")
onclose(user,"scanner")
+
+
ex_act()
return
+
+
+ proc/add_data_scanner(var/obj/item/device/detective_scanner/W as obj)
+ for(var/i = 1, i < W.stored.len, i++)
+ var/list/data = W.stored[i]
+ var/atom/A = new
+ A = W
+ world << "[A] at [A.loc]"
+ A.fingerprints = data[2]
+ A.suit_fibers = data[3]
+ A.blood_DNA = data[4]
+ add_data(A,1)
+ del(A)
+
+
+ proc/add_data(var/atom/A, var/override = 0)
+//What follows is massive. It cross references all stored data in the scanner with the other stored data,
+//and what is already in the computer. Not sure how bad the lag may/may not be.
+ if((!A.fingerprints || A.fingerprints.len < 1) && !override) //No prints
+ var/merged = 0
+ for(var/i = 1, i < misc.len, i++) //Lets see if we can find it.
+ var/list/templist = misc[i]
+ var/check = templist[1]
+ if(check == A) //There it is!
+ merged = 1
+ var/list/fibers = templist[2]
+ if(A.suit_fibers)
+ for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
+ var/test_print1 = A.suit_fibers[j]
+ var/found = 0
+ for(var/k = 1, k <= fibers.len, k++) //Lets see if the fiber is already in there
+ var/test_print2 = fibers[k]
+ if(test_print2 == test_print1) //It is! Do nothing!
+ found = 1
+ break
+ if(!found) //It isn't! Add!
+ fibers += A.suit_fibers[j]
+ var/list/blood = templist[3]
+ if(A.blood_DNA)
+ for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
+ var/test_print1 = A.blood_DNA[j]
+ var/found = 0
+ for(var/k = 1, k <= blood.len, k++) //Lets see if the fiber is already in there
+ var/test_print2 = blood[k]
+ if(test_print2 == test_print1) //It is! Do nothing!
+ found = 1
+ break
+ if(!found) //It isn't! Add!
+ blood += A.blood_DNA[j]
+ var/list/sum_list[3] //Pack it back up!
+ sum_list[1] = A
+ sum_list[2] = fibers
+ sum_list[3] = blood
+ misc[i] = sum_list //Store it!
+ break //We found it, we're done here.
+ if(!merged) //Nope! Guess we have to add it!
+ var/list/templist[4]
+ templist[1] = A
+ templist[2] = A.suit_fibers
+ templist[3] = A.blood_DNA
+ misc.len++
+ misc[misc.len] = templist //Store it!
+ return !merged
+ else //Has prints.
+ var/list/found_prints[A.fingerprints.len]
+ for(var/i = 1, i < found_prints.len, i++)
+ found_prints[i] = 0
+ for(var/i = 1, i < files.len, i++) //Lets see if we can find the owner of the prints
+ var/merged = 0
+ var/list/perp_list = files[i]
+ var/list/perp_prints = params2list(perp_list[1])
+ var/perp = perp_prints[1]
+ for(var/m = 1, m < A.fingerprints.len, m++) //Compare database prints with prints on object.
+ var/list/test_prints_list = params2list(A.fingerprints[m])
+ var/checker = test_prints_list[1]
+ if(checker == perp) //Found 'em! Merge!
+ found_prints[m] = 1
+ for(var/n = 2, n < perp_list.len, n++) //Lets see if it is already in the database
+ var/list/target = perp_list[n]
+ if(target[1] == A) //Found the original object!
+ merged = 1
+ var/list/prints = target[2]
+ if(A.fingerprints)
+ for(var/j = 1, j < A.fingerprints.len, j++) //Fingerprints~~~
+ var/list/print_test1 = params2list(A.fingerprints[j])
+ var/test_print1 = print_test1[1]
+ var/found = 0
+ for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there
+ var/list/print_test2 = params2list(prints[k])
+ var/test_print2 = print_test2[1]
+ if(test_print2 == test_print1) //It is! Merge!
+ prints[k] = test_print2 + "&" + stringmerge(print_test2[2],print_test1[2])
+ found = 1
+ break //We found it, we're done here.
+ if(!found) //It isn't! Add!
+ prints += A.fingerprints[j]
+ var/list/fibers = target[3]
+ if(A.suit_fibers)
+ for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
+ var/test_print1 = A.suit_fibers[j]
+ var/found = 0
+ for(var/k = 1, k <= fibers.len, k++) //Lets see if the fiber is already in there
+ var/test_print2 = fibers[k]
+ if(test_print2 == test_print1) //It is! Do nothing!
+ found = 1
+ break //We found it, we're done here.
+ if(!found) //It isn't! Add!
+ fibers += A.suit_fibers[j]
+ var/list/blood = target[4]
+ if(A.blood_DNA)
+ for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
+ var/test_print1 = A.blood_DNA[j]
+ var/found = 0
+ for(var/k = 1, k <= blood.len, k++) //Lets see if the blood is already in there
+ var/test_print2 = blood[k]
+ if(test_print2 == test_print1) //It is! Do nothing!
+ found = 1
+ break //We found it, we're done here.
+ if(!found) //It isn't! Add!
+ blood += A.blood_DNA[j]
+ var/list/sum_list[4] //Pack it back up!
+ sum_list[1] = A
+ sum_list[2] = prints
+ sum_list[3] = fibers
+ sum_list[4] = blood
+ perp_list[n] = sum_list //Store it!
+ files[i] = perp_list
+ break //We found it, we're done here.
+ if(merged)
+ update_fingerprints(i) //Lets update the calculated sum of the stored prints.
+ for(var/m = 1, m < found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint!
+ if(found_prints.len[m] == 0)
+ var/list/newperp[2]
+ var/list/sum_list
+ sum_list[1] = A
+ sum_list[2] = A.fingerprints
+ sum_list[3] = A.suit_fibers
+ sum_list[4] = A.blood_DNA
+ newperp[2] = sum_list
+ newperp[1] = A.fingerprints[m]
+ files.len++
+ files[files.len] = newperp
+ return
+
+
+ proc/update_fingerprints(var/index) //I am tired, but this updates the master print, which is used to determine completion of a print.
+ if(!index)
+ return
+ var/list/perp_list = files[1]
+ var/list/perp_prints = params2list(perp_list[1])
+ var/perp = perp_prints[1]
+ var/list/found_prints = list()
+ for(var/i = 2, i < perp_list.len, i++)
+ var/list/test_list = perp_list[i]
+ var/list/test_prints = test_list[2]
+ for(var/j = 1, j < test_prints.len)
+ var/list/test_list_2 = params2list(test_prints[j])
+ var/test_prints_2 = test_list_2[1]
+ if(test_prints_2 == perp)
+ found_prints += test_list_2[2]
+ break
+ for(var/prints in found_prints)
+ perp_prints[2] = stringmerge(perp_prints[2],prints)
+ perp_list[1] = perp + "&" + perp_prints[2]
+ files[1] = perp_list
+ return
+
+// attackby(var/obj/item/device/detective_scanner/W as obj, mob/user as mob)
+// ..()
+// if (istype(W, /obj/item/device/detective_scanner))
+//
+//What follows is massive. It cross references all stored data in the scanner with the other stored data,
+//and what is already in the computer. Not sure how bad the lag may/may not be.
+//
+// var/list/data = W.stored
+// if(files.len || misc.len)
+//
+//
+//
+// else
+//
+//
+// src.add_fingerprint(user)
+// if (W)
+// W.add_fingerprint(user)
+// return
+
+
Topic(href,href_list)
switch(href_list["operation"])
if("login")
@@ -135,7 +341,7 @@ obj/machinery/computer/forensic_scanning
if(istype(I, /obj/item/weapon/evidencebag))
scanning = I.contents[1]
scanning.loc = src
- I.underlays = null
+ I.overlays -= scanning
I.icon_state = "evidenceobj"
else
scanning = I
@@ -174,20 +380,20 @@ obj/machinery/computer/forensic_scanning
scan_data = "[scanning]
"
if (scanning.blood_DNA)
scan_data += "Blood Found:
"
- scan_data += "-Blood type: [scanning.blood_type]\nDNA: [scanning.blood_DNA]
"
+ for(var/i = 1, i < scanning.blood_DNA.len, i++)
+ var/list/templist = scanning.blood_DNA[i]
+ scan_data += "-Blood type: [templist[2]]\nDNA: [templist[1]]
"
else
scan_data += "No Blood Found
"
- if (!( scanning.fingerprints ))
+ if (!( scanning.fingerprints.len ))
scan_data += "No Fingerprints Found
"
else
- var/list/L = params2list(scanning.fingerprints)
- scan_data += "Isolated [L.len] Fingerprints:
"
- for(var/i in L)
- scan_data += "#[L.Find(i)] - [i]
"
- scan_data += "
"
+ var/list/L = scanning.fingerprints
+ scan_data += "Isolated [L.len] Fingerprints. Loaded into database.
"
+ add_data(scanning)
- if(!scanning.suit_fibers)
- if(istype(scanning,/obj/item/device/detective_scanner))
+ if(!scanning.suit_fibers.len)
+ /*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:
"
@@ -195,21 +401,25 @@ obj/machinery/computer/forensic_scanning
scan_data += "- [data]
"
else
scan_data += "No Fibers/Materials Data
"
- else
- scan_data += "No Fibers/Materials Located
"
+ else*/
+ scan_data += "No Fibers/Materials Located
"
else
- if(istype(scanning,/obj/item/device/detective_scanner))
+ /*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:
"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]
"
else
- scan_data += "No Fibers/Materials Data
"
+ scan_data += "No Fibers/Materials Data
"*/
scan_data += "Fibers/Materials Found:
"
for(var/data in scanning.suit_fibers)
scan_data += "- [data]
"
+ if(istype(scanning,/obj/item/device/detective_scanner))
+ scan_data += "
Data transfered from Scanner to Database.
"
+ else if(!scanning.fingerprints.len)
+ scan_data += "
Add to Database?
"
else
temp = "Scan Failed: No Object"
@@ -227,6 +437,11 @@ obj/machinery/computer/forensic_scanning
scan_data = ""
if("cancel")
scan_process = 0
+ if("add")
+ if(scanning)
+ add_data(scanning)
+ else
+ temp = "Data Transfer Failed: No Object."
updateUsrDialog()
detective
@@ -295,8 +510,8 @@ turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
T.desc = "These bloody footprints appear to have been made by [info]."
if(istype(M,/mob/living/carbon/human))
- T.blood_DNA = M.dna.unique_enzymes
- T.blood_type = M.b_type
+ T.blood_DNA.len++
+ T.blood_DNA[T.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
return
var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
this.icon = 'footprints.dmi'
@@ -307,8 +522,8 @@ turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
this.dir = d
this.desc = "These bloody footprints appear to have been made by [info]."
if(istype(M,/mob/living/carbon/human))
- this.blood_DNA = M.dna.unique_enzymes
- this.blood_type = M.b_type
+ this.blood_DNA.len++
+ this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
proc/get_tracks(mob/M)
if(istype(M,/mob/living))
diff --git a/code/defines/atom.dm b/code/defines/atom.dm
index bd86699be59..df67c320852 100644
--- a/code/defines/atom.dm
+++ b/code/defines/atom.dm
@@ -5,8 +5,7 @@
var/list/fingerprints
var/list/fingerprintshidden = new/list()
var/fingerprintslast = null
- var/blood_DNA = null
- var/blood_type = null
+ var/list/blood_DNA = null
var/last_bumped = 0
var/pass_flags = 0
diff --git a/code/defines/obj/closet.dm b/code/defines/obj/closet.dm
index 5ff8567d826..5c2d5442c9d 100644
--- a/code/defines/obj/closet.dm
+++ b/code/defines/obj/closet.dm
@@ -13,6 +13,7 @@
var/health = 100 //Might be a bit much, dono can always change later //Nerfed -Pete
var/lastbang //
var/lasttry = 0
+ layer = 2.8
/obj/structure/closet/acloset
name = "Strange closet"
diff --git a/code/defines/obj/decal.dm b/code/defines/obj/decal.dm
index 3bf577c6777..86fb51cc2a3 100644
--- a/code/defines/obj/decal.dm
+++ b/code/defines/obj/decal.dm
@@ -49,8 +49,7 @@
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
var/list/viruses = list()
- blood_DNA = null
- blood_type = null
+ blood_DNA = list()
var/datum/disease2/disease/virus2 = null
var/OriginalMob = null
diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm
index 0bfdb8d640a..cfd3dbfb00b 100644
--- a/code/defines/procs/helpers.dm
+++ b/code/defines/procs/helpers.dm
@@ -1511,4 +1511,16 @@ proc/get_opposite(var/checkdir)
newtext = copytext(newtext,1,i) + a + copytext(newtext, i+1)
else //The lists disagree, Uh-oh!
return 0
- return newtext
\ No newline at end of file
+ return newtext
+
+/proc/stringpercent(var/text,character = "*")
+//This proc returns the number of chars of the string that is the character
+//This is used for detective work to determine fingerprint completion.
+ if(!text || !character)
+ return 0
+ var/count = 0
+ for(var/i = 1, i < lentext(text), i++)
+ var/a = copytext(text,i,i+1)
+ if(a == character)
+ count++
+ return count
\ No newline at end of file
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index a0a32c53677..02753978f7f 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -88,7 +88,6 @@
var/mob/living/carbon/human/H = M
if (!istype(H.dna, /datum/dna))
return 0
- world << md5(H.dna.uni_identity)
if (H.gloves)
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
@@ -112,6 +111,8 @@
new_prints = i
prints = L[2]
break
+ else
+ src.fingerprints[i] = L[1] + "&" + stars(L[2], rand(90,95))
if(new_prints)
src.fingerprints[new_prints] = list(text("[]&[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), rand(40,60)))))
return 1
@@ -139,8 +140,8 @@
I.Blend(new /icon('blood.dmi', "itemblood"),ICON_MULTIPLY)
I.Blend(new /icon(src.icon, src.icon_state),ICON_UNDERLAY)
src.icon = I
- src.blood_DNA = M.dna.unique_enzymes
- src.blood_type = M.b_type
+ src.blood_DNA.len++
+ src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes, M.b_type)
else if (istype(src, /turf/simulated))
var/turf/simulated/source2 = src
var/list/objsonturf = range(0,src)
@@ -149,16 +150,16 @@
if(istype(objsonturf[i],/obj/effect/decal/cleanable/blood))
return
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source2)
- this.blood_DNA = M.dna.unique_enzymes
- this.blood_type = M.b_type
+ this.blood_DNA.len++
+ this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes, M.b_type)
this.virus2 = M.virus2
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
this.viruses += newDisease
newDisease.holder = this
else if (istype(src, /mob/living/carbon/human))
- src.blood_DNA = M.dna.unique_enzymes
- src.blood_type = M.b_type
+ src.blood_DNA.len++
+ src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
else
return
else
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 1c99ec8bda7..c94ca9f46f4 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -4,7 +4,7 @@
var/struc_enzymes = null
var/uni_identity = null
var/original_name = "Unknown"
- var/b_type
+ var/b_type = "A+"
/datum/dna/proc/check_integrity()
//Lazy.
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index f1198e1cd1d..70e1d553f87 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -53,7 +53,9 @@ Devices and Tools;
/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox;
/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module;
/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator;
-/obj/item/weapon/plastique:2:C-4;
+/obj/item/weapon/plastique:2:C-4 (Destroys walls);
+/obj/item/weapon/syndie/c4explosive:4:Low Power Explosive Charge, with Detonator;
+/obj/item/weapon/syndie/c4explosive/heavy:7:High (!) Power Explosive Charge, with Detonator;
/obj/item/device/powersink:5:Powersink (DANGER!);
/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!);
Whitespace:Seperator;
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 4a0ccefa6d4..fac3a9671ff 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -82,7 +82,6 @@
H.equip_if_possible(new /obj/item/clothing/under/rank/cargo(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/quartermaster(H), H.slot_belt)
- H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(H), H.slot_glasses)
H.equip_if_possible(new /obj/item/weapon/clipboard(H), H.slot_r_store)
return 1
@@ -104,7 +103,6 @@
H.equip_if_possible(new /obj/item/clothing/under/rank/cargo(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/quartermaster(H), H.slot_belt)
- H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
return 1
@@ -124,7 +122,6 @@
H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/miner(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
- H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
H.equip_if_possible(new /obj/item/weapon/crowbar(H), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/weapon/satchel(H), H.slot_in_backpack)
return 1
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 4b63a63689f..441a7f06fbe 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -805,8 +805,8 @@
H.apply_damage(0.5*damage, BRUTE, "r_arm")
var/obj/effect/decal/cleanable/blood/B = new(src.loc)
- B.blood_DNA = H.dna.unique_enzymes
- B.blood_type = H.b_type
+ B.blood_DNA.len++
+ B.blood_DNA[B.blood_DNA.len] = list(H.dna.unique_enzymes, H.b_type)
bloodiness += 4
diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm
index 04e8ca46bb9..65e74484210 100644
--- a/code/game/magic/cultist/ritual.dm
+++ b/code/game/magic/cultist/ritual.dm
@@ -555,8 +555,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
R.word2 = w2
R.word3 = w3
R.check_icon()
- R.blood_DNA = H.dna.unique_enzymes
- R.blood_type = H.b_type
+ R.blood_DNA.len++
+ R.blood_DNA[R.blood_DNA.len] = list(H.dna.unique_enzymes, H.b_type)
return
else
user << "The book seems full of illegible scribbles. Is this a joke?"
@@ -601,8 +601,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
var/obj/effect/rune/R = new /obj/effect/rune
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- R.blood_DNA = H.dna.unique_enzymes
- R.blood_type = H.b_type
+ R.blood_DNA.len++
+ R.blood_DNA[R.blood_DNA.len] = list(H.dna.unique_enzymes, H.b_type)
switch(r)
if("teleport")
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm
index c92c206c71d..95511f603d7 100644
--- a/code/game/magic/cultist/runes.dm
+++ b/code/game/magic/cultist/runes.dm
@@ -898,7 +898,7 @@ var/list/sacrificed = list()
culcount++
if(culcount >= 5)
for(var/obj/effect/rune/R in world)
- if(R.blood_DNA == src.blood_DNA && R.blood_type == src.blood_type)
+ if(R.blood_DNA == src.blood_DNA)
for(var/mob/living/M in orange(2,R))
M.take_overall_damage(0,15)
if (R.invisibility>M.see_invisible)
@@ -908,7 +908,7 @@ var/list/sacrificed = list()
var/turf/T = get_turf(R)
T.hotspot_expose(700,125)
for(var/obj/effect/decal/cleanable/blood/B in world)
- if(B.blood_DNA == src.blood_DNA && B.blood_type == src.blood_type)
+ if(B.blood_DNA == src.blood_DNA)
for(var/mob/living/M in orange(1,B))
M.take_overall_damage(0,5)
M << "\red Blood suddenly ignites, burning you!"
diff --git a/code/game/objects/blood.dm b/code/game/objects/blood.dm
index e8185cbe20e..26c01049058 100644
--- a/code/game/objects/blood.dm
+++ b/code/game/objects/blood.dm
@@ -21,7 +21,6 @@
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
b.blood_DNA = blood_DNA
- b.blood_type = blood_type
b.OriginalMob = OriginalMob
for(var/datum/disease/D in src.viruses)
b.viruses += D
diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm
index 7bcda1ad743..c9abad11b99 100644
--- a/code/game/objects/devices/PDA/PDA.dm
+++ b/code/game/objects/devices/PDA/PDA.dm
@@ -743,7 +743,9 @@
else
user << "\blue Blood found on [C]. Analysing..."
spawn(15)
- user << "\blue Blood type: [C:blood_type]\nDNA: [C:blood_DNA]"
+ for(var/i = 1, i < C:blood_DNA.len, i++)
+ var/list/templist = C:blood_DNA[i]
+ user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
if(4)
for (var/mob/O in viewers(C, null))
@@ -761,10 +763,9 @@
if (!A.fingerprints)
user << "\blue Unable to locate any fingerprints on [A]!"
else
- var/list/L = params2list(A:fingerprints)
- user << "\blue Isolated [L.len] fingerprints."
- for(var/i in L)
- user << "\blue \t [i]"
+ user << "\blue Isolated [A:fingerprints.len] fingerprints."
+// for(var/i in L)
+// user << "\blue \t [i]"
if(3)
if(!isnull(A.reagents))
diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm
index 4166d44e120..06b16694e8a 100644
--- a/code/game/objects/devices/scanners.dm
+++ b/code/game/objects/devices/scanners.dm
@@ -65,124 +65,189 @@ MASS SPECTROMETER
icon_state = "forensic0"
var/amount = 20.0
var/printing = 0.0
- var/fibers_index = 0
- var/list/stored_fibers = list()
- var/list/stored_name = list()
- var/prints_index = 0
- var/list/stored_prints = list()
- var/list/prints_name = list()
+ var/list/stored = list()
w_class = 3.0
item_state = "electronic"
flags = FPRINT | TABLEPASS | ONBELT | CONDUCT | USEDELAY
-/obj/item/device/detective_scanner/attackby(obj/item/weapon/f_card/W as obj, mob/user as mob)
- ..()
-
- if (istype(W, /obj/item/weapon/f_card))
- if (W.fingerprints)
- return
- if (src.amount == 20)
- return
- if (W.amount + src.amount > 20)
- src.amount = 20
- W.amount = W.amount + src.amount - 20
- else
- src.amount += W.amount
- //W = null
- del(W)
- src.add_fingerprint(user)
- if (W)
- W.add_fingerprint(user)
- return
-
-/obj/item/device/detective_scanner/attack_self(mob/user as mob)
-
- src.printing = !( src.printing )
- if(src.printing)
- user << "\blue Printing turned on"
- else
- user << "\blue Printing turned off"
- src.icon_state = text("forensic[]", src.printing)
- add_fingerprint(user)
- return
-
-/obj/item/device/detective_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob)
-
- if (!ishuman(M))
- user << "\red [M] is not human and cannot have the fingerprints."
- return 0
- if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
- user << "\blue No fingerprints found on [M]"
- return 0
- else
- if ((src.amount < 1 && src.printing))
- user << text("\blue Fingerprints scanned on [M]. Need more cards to print.")
- src.printing = 0
- src.icon_state = text("forensic[]", src.printing)
- if (src.printing)
- src.amount--
- var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
- F.amount = 1
- F.fingerprints = md5(M.dna.uni_identity)
- F.icon_state = "fingerprint1"
- F.name = text("FPrintC- '[M.name]'")
- user << "\blue Done printing."
- user << text("\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]")
- if ( !(M.blood_DNA) )
- user << "\blue No blood found on [M]"
- else
- user << "\blue Blood found on [M]. Analysing..."
- spawn(15)
- user << "\blue Blood type: [M.blood_type]\nDNA: [M.blood_DNA]"
- return
-
-/obj/item/device/detective_scanner/afterattack(atom/A as mob|obj|turf|area, mob/user as mob)
- if(src.loc != user)
- return 0
- src.add_fingerprint(user)
- if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
- if(A.blood_DNA)
- user << "\blue Blood type: [A.blood_type]\nDNA: [A.blood_DNA]"
+ attackby(obj/item/weapon/f_card/W as obj, mob/user as mob)
+ ..()
+ if (istype(W, /obj/item/weapon/f_card))
+ if (W.fingerprints)
+ return
+ if (src.amount == 20)
+ return
+ if (W.amount + src.amount > 20)
+ src.amount = 20
+ W.amount = W.amount + src.amount - 20
+ else
+ src.amount += W.amount
+ //W = null
+ del(W)
+ src.add_fingerprint(user)
+ if (W)
+ W.add_fingerprint(user)
return
- if (!( A.fingerprints ) && !(A.suit_fibers) && !(A.blood_DNA))
- user << "\blue Unable to locate any fingerprints, materials, fibers, or fingerprints on [A]!"
- return 0
- else if (A.blood_DNA)
- user << "\blue Blood found on [A]. Analysing..."
- sleep(15)
- user << "\blue Blood type: [A.blood_type]\nDNA: [A.blood_DNA]"
- else
- user << "\blue No blood found on [A]."
- if(!( A.fingerprints ))
- user << "\blue Unable to locate any fingerprints on [A]!"
- else
- var/list/L = params2list(A.fingerprints)
- stored_prints[prints_index] = L
- prints_name[prints_index] = A.name
- user << text("\blue Isolated [L.len] fingerprints. Stored in memory.")
- if(!A.suit_fibers)
- user << "\blue No Fibers/Materials Located."
- else
- user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
- stored_fibers[fibers_index] = A.suit_fibers
- stored_name[fibers_index] = A.name
-// else
-// if ((src.amount < 1 && src.printing))
-// user << "\blue Fingerprints found. Need more cards to print."
-// src.printing = 0
-// src.icon_state = text("forensic[]", src.printing)
-// if (src.printing)
-// src.amount--
-// var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
-// F.amount = 1
-// F.fingerprints = A.fingerprints
-// F.icon_state = "fingerprint1"
-// user << "\blue Done printing."
-// for(var/i in L)
-// user << text("\blue \t [i]")
-// //Foreach goto(186)
- return
+
+ attack_self(mob/user as mob)
+ src.printing = !( src.printing )
+ if(src.printing)
+ user << "\blue Printing turned on"
+ else
+ user << "\blue Printing turned off"
+ src.icon_state = text("forensic[]", src.printing)
+ add_fingerprint(user)
+ return
+
+ attack(mob/living/carbon/human/M as mob, mob/user as mob)
+ if (!ishuman(M))
+ user << "\red [M] is not human and cannot have the fingerprints."
+ return 0
+ if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
+ user << "\blue No fingerprints found on [M]"
+ return 0
+ else
+ if ((src.amount < 1 && src.printing))
+ user << text("\blue Fingerprints scanned on [M]. Need more cards to print.")
+ src.printing = 0
+ src.icon_state = text("forensic[]", src.printing)
+ if (src.printing)
+ src.amount--
+ var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
+ F.amount = 1
+ F.fingerprints = md5(M.dna.uni_identity)
+ F.icon_state = "fingerprint1"
+ F.name = text("FPrintC- '[M.name]'")
+ user << "\blue Done printing."
+ user << text("\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]")
+ if ( !(M.blood_DNA) )
+ user << "\blue No blood found on [M]"
+ else
+ user << "\blue Blood found on [M]. Analysing..."
+ spawn(15)
+ for(var/i = 1, i < M.blood_DNA.len, i++)
+ var/list/templist = M.blood_DNA[i]
+ user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
+ return
+
+ afterattack(atom/A as mob|obj|turf|area, mob/user as mob)
+ if(src.loc != user)
+ return 0
+ src.add_fingerprint(user)
+ if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
+ if(!isnull(A.blood_DNA.len))
+ for(var/i = 1, i < A.blood_DNA.len, i++)
+ var/list/templist = A.blood_DNA[i]
+ user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
+ return
+ if (!( A.fingerprints ) && !(A.suit_fibers) && !(A.blood_DNA))
+ user << "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!"
+ return 0
+ else if (A.blood_DNA)
+ user << "\blue Blood found on [A]. Analysing..."
+ sleep(15)
+ var/duplicate = add_data(A)
+ if(duplicate)
+ user << "\blue Blood already in memory."
+ for(var/i = 1, i < A.blood_DNA.len, i++)
+ var/list/templist = A.blood_DNA[i]
+ user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
+ else
+ user << "\blue No Blood Located"
+ if(!( A.fingerprints ))
+ user << "\blue No Fingerprints Located."
+ else
+ user << text("\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve.")
+ var/duplicate = add_data(A)
+ if(duplicate)
+ user << "\blue Figerprints already in memory."
+ if(!A.suit_fibers)
+ user << "\blue No Fibers/Materials Located."
+ else
+ user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
+ var/duplicate = add_data(A)
+ if(duplicate)
+ user << "\blue Fibers/Materials already in memory."
+ // else
+ // if ((src.amount < 1 && src.printing))
+ // user << "\blue Fingerprints found. Need more cards to print."
+ // src.printing = 0
+ // src.icon_state = text("forensic[]", src.printing)
+ // if (src.printing)
+ // src.amount--
+ // var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
+ // F.amount = 1
+ // F.fingerprints = A.fingerprints
+ // F.icon_state = "fingerprint1"
+ // user << "\blue Done printing."
+ // for(var/i in L)
+ // user << text("\blue \t [i]")
+ // //Foreach goto(186)
+ return
+
+ proc/add_data(atom/A as mob|obj|turf|area)
+ var/merged = 0
+ for(var/i = 1, i < stored.len, i++) //Lets see if the object is already in there!
+ var/list/temp = stored[i]
+ var/checker = temp[1]
+ if(checker == A) //It is! Merge!
+ merged = 1
+ var/list/prints = temp[2]
+ if(A.fingerprints)
+ for(var/j = 1, j < A.fingerprints.len, j++) //Fingerprints~~~
+ var/list/print_test1 = params2list(A.fingerprints[j])
+ var/test_print1 = print_test1[1]
+ var/found = 0
+ for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there
+ var/list/print_test2 = params2list(prints[k])
+ var/test_print2 = print_test2[1]
+ if(test_print2 == test_print1) //It is! Merge!
+ prints[k] = test_print2 + "&" + stringmerge(print_test2[2],print_test1[2])
+ found = 1
+ break //We found it, we're done here.
+ if(!found) //It isn't! Add!
+ prints += A.fingerprints[j]
+ var/list/fibers = temp[3]
+ if(A.suit_fibers)
+ for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
+ var/test_print1 = A.suit_fibers[j]
+ var/found = 0
+ for(var/k = 1, k <= fibers.len, k++) //Lets see if the fiber is already in there
+ var/test_print2 = fibers[k]
+ if(test_print2 == test_print1) //It is! Do nothing!
+ found = 1
+ break //We found it, we're done here.
+ if(!found) //It isn't! Add!
+ fibers += A.suit_fibers[j]
+ var/list/blood = temp[4]
+ if(A.blood_DNA)
+ for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
+ var/test_print1 = A.blood_DNA[j]
+ var/found = 0
+ for(var/k = 1, k <= blood.len, k++) //Lets see if the blood is already in there
+ var/test_print2 = blood[k]
+ if(test_print2 == test_print1) //It is! Do nothing!
+ found = 1
+ break //We found it, we're done here.
+ if(!found) //It isn't! Add!
+ blood += A.blood_DNA[j]
+ var/list/sum_list[4] //Pack it back up!
+ sum_list[1] = A
+ sum_list[2] = prints
+ sum_list[3] = fibers
+ sum_list[4] = blood
+ stored[i] = sum_list //Store it!
+ break //We found it, we're done here.
+ if(!merged) //Uh, oh! New data point!
+ var/list/sum_list[4] //Pack it back up!
+ sum_list[1] = A
+ sum_list[2] = A.fingerprints
+ sum_list[3] = A.suit_fibers
+ sum_list[4] = A.blood_DNA
+ stored.len++
+ stored[stored.len] = sum_list
+ return !merged
/obj/item/device/healthanalyzer
@@ -198,50 +263,50 @@ MASS SPECTROMETER
m_amt = 200
origin_tech = "magnets=1;biotech=1"
-/obj/item/device/healthanalyzer/attack(mob/M as mob, mob/user as mob)
- if ((user.mutations & CLUMSY || user.getBrainLoss() >= 60) && prob(50))
- user << text("\red You try to analyze the floor's vitals!")
+ attack(mob/M as mob, mob/user as mob)
+ if ((user.mutations & CLUMSY || user.getBrainLoss() >= 60) && prob(50))
+ user << text("\red You try to analyze the floor's vitals!")
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1)
+ user.show_message(text("\blue Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1)
+ user.show_message(text("\blue \t Damage Specifics: [0]-[0]-[0]-[0]"), 1)
+ user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1)
+ user.show_message("\blue Body Temperature: ???", 1)
+ return
+ if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ usr << "\red You don't have the dexterity to do this!"
+ return
for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1)
- user.show_message(text("\blue Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1)
- user.show_message(text("\blue \t Damage Specifics: [0]-[0]-[0]-[0]"), 1)
+ O.show_message(text("\red [] has analyzed []'s vitals!", user, M), 1)
+ //Foreach goto(67)
+ var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss())))
+ if((M.reagents && M.reagents.has_reagent("zombiepowder")) || (M.changeling && M.changeling.changeling_fakedeath))
+ user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, "dead"), 1)
+ user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", fake_oxy < 50 ? "\red [fake_oxy]" : fake_oxy , M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1)
+ else
+ user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health))), 1)
+ user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.getOxyLoss() > 50 ? "\red [M.getOxyLoss()]" : M.getOxyLoss(), M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1)
user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1)
- user.show_message("\blue Body Temperature: ???", 1)
+ user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
+ if((M.changeling && M.changeling.changeling_fakedeath) || (M.reagents && M.reagents.has_reagent("zombiepowder")))
+ user.show_message(text("\blue [] | [] | [] | []", fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1)
+ else
+ user.show_message(text("\blue [] | [] | [] | []", M.getOxyLoss() > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1)
+ if (M.getCloneLoss())
+ user.show_message(text("\red Subject appears to have been imperfectly cloned."), 1)
+ for(var/datum/disease/D in M.viruses)
+ if(!D.hidden[SCANNER])
+ user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]"))
+ if (M.reagents && M.reagents.get_reagent_amount("inaprovaline"))
+ user.show_message(text("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1)
+ if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0)
+ user.show_message(text("\red Subject is brain dead."), 1)
+ else if (M.getBrainLoss() >= 60)
+ user.show_message(text("\red Severe brain damage detected. Subject likely to have mental retardation."), 1)
+ else if (M.getBrainLoss() >= 10)
+ user.show_message(text("\red Significant brain damage detected. Subject may have had a concussion."), 1)
+ src.add_fingerprint(user)
return
- if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- usr << "\red You don't have the dexterity to do this!"
- return
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] has analyzed []'s vitals!", user, M), 1)
- //Foreach goto(67)
- var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss())))
- if((M.reagents && M.reagents.has_reagent("zombiepowder")) || (M.changeling && M.changeling.changeling_fakedeath))
- user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, "dead"), 1)
- user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", fake_oxy < 50 ? "\red [fake_oxy]" : fake_oxy , M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1)
- else
- user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health))), 1)
- user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.getOxyLoss() > 50 ? "\red [M.getOxyLoss()]" : M.getOxyLoss(), M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1)
- user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1)
- user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
- if((M.changeling && M.changeling.changeling_fakedeath) || (M.reagents && M.reagents.has_reagent("zombiepowder")))
- user.show_message(text("\blue [] | [] | [] | []", fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1)
- else
- user.show_message(text("\blue [] | [] | [] | []", M.getOxyLoss() > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1)
- if (M.getCloneLoss())
- user.show_message(text("\red Subject appears to have been imperfectly cloned."), 1)
- for(var/datum/disease/D in M.viruses)
- if(!D.hidden[SCANNER])
- user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]"))
- if (M.reagents && M.reagents.get_reagent_amount("inaprovaline"))
- user.show_message(text("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1)
- if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0)
- user.show_message(text("\red Subject is brain dead."), 1)
- else if (M.getBrainLoss() >= 60)
- user.show_message(text("\red Severe brain damage detected. Subject likely to have mental retardation."), 1)
- else if (M.getBrainLoss() >= 10)
- user.show_message(text("\red Significant brain damage detected. Subject may have had a concussion."), 1)
- src.add_fingerprint(user)
- return
/obj/item/device/analyzer
diff --git a/code/game/objects/gibs.dm b/code/game/objects/gibs.dm
index 0cc61f85493..f60aaa89e2c 100644
--- a/code/game/objects/gibs.dm
+++ b/code/game/objects/gibs.dm
@@ -51,9 +51,8 @@
viruus.holder = gib
viruus.spread_type = CONTACT_FEET
if(MobDNA)
- gib.blood_DNA = MobDNA.unique_enzymes
- if(MobDNA.b_type)
- gib.blood_type = MobDNA.b_type
+ gib.blood_DNA.len++
+ gib.blood_DNA[gib.blood_DNA.len] = list(MobDNA.unique_enzymes, MobDNA.b_type)
if(MobDNA.original_name != "Unknown")
gib.OriginalMob = MobDNA.original_name
var/list/directions = gibdirections[i]
diff --git a/code/game/objects/stacks/stack.dm b/code/game/objects/stacks/stack.dm
index 3ca6fc7dce3..4f44c828fa0 100644
--- a/code/game/objects/stacks/stack.dm
+++ b/code/game/objects/stacks/stack.dm
@@ -82,7 +82,6 @@
/obj/item/stack/proc/copy_evidences(obj/item/stack/from as obj)
src.blood_DNA = from.blood_DNA
- src.blood_type = from.blood_type
src.fingerprints = from.fingerprints
src.fingerprintshidden = from.fingerprintshidden
src.fingerprintslast = from.fingerprintslast
@@ -157,7 +156,7 @@
t1 += " [n*R.res_amount]x"
if (!(max_multiplier in multipliers))
t1 += " [max_multiplier*R.res_amount]x"
-
+
t1 += "