diff --git a/code/WorkInProgress/Cael_Aislinn/MultiZ.dm b/code/WorkInProgress/Cael_Aislinn/MultiZ.dm
index b2faa092850..855e26e14ab 100644
--- a/code/WorkInProgress/Cael_Aislinn/MultiZ.dm
+++ b/code/WorkInProgress/Cael_Aislinn/MultiZ.dm
@@ -195,15 +195,15 @@
..()
*/
- var/obj/effect/decal/cleanable/blood/B = new(src.loc)
- var/list/blood_DNA_temp[1]
- blood_DNA_temp[1] = list(H.dna.unique_enzymes, H.dna.b_type)
- B.blood_DNA = blood_DNA_temp
- B.virus2 = H.virus2
- for(var/datum/disease/D in H.viruses)
- var/datum/disease/newDisease = new D.type
- B.viruses += newDisease
- newDisease.holder = B
+ // var/obj/effect/decal/cleanable/blood/B = new(src.loc)
+ // var/list/blood_DNA_temp[1]
+ // blood_DNA_temp[1] = list(H.dna.unique_enzymes, H.dna.b_type)
+ // B.blood_DNA = blood_DNA_temp
+ // B.virus2 = H.virus2
+ // for(var/datum/disease/D in H.viruses)
+ // var/datum/disease/newDisease = new D.type
+ // B.viruses += newDisease
+ // newDisease.holder = B
H:weakened = max(H:weakened,2)
H:updatehealth()
diff --git a/code/defines/atom.dm b/code/defines/atom.dm
index f04d83c77fc..d725f656503 100644
--- a/code/defines/atom.dm
+++ b/code/defines/atom.dm
@@ -17,9 +17,6 @@
// replaced by OPENCONTAINER flags and atom/proc/is_open_container()
///Chemistry.
- //Detective Work, used for the duplicate data points kept in the scanners
- var/list/original_atom
-
proc/assume_air(datum/air_group/giver)
del(giver)
return null
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index 21236b1c9ff..e3f843eaf80 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -2,17 +2,6 @@
return
/atom/proc/attack_hand(mob/user as mob)
- if(ishuman(user) || ismonkey(user))
- if (user.hand)
- var/datum/organ/external/temp = user:organs["l_hand"]
- if(temp.destroyed)
- user << "\red Yo- wait a minute."
- return
- else
- var/datum/organ/external/temp = user:organs["r_hand"]
- if(temp.destroyed)
- user << "\red Yo- wait a minute."
- return
return
/atom/proc/attack_paw(mob/user as mob)
@@ -115,68 +104,68 @@
if(isnull(M.key)) return
if (!( flags ) & 256)
return
+ //Smudge up dem prints some
+ for(var/P in fingerprints)
+ var/test_print = stars(fingerprints[P], rand(85,95))
+ if(stringpercent(test_print) == 32) //She's full of stars! (No actual print left)
+ fingerprints.Remove(P)
+ else
+ fingerprints[P] = test_print
if (ishuman(M))
+ //Add the list if it does not exist.
if(!fingerprintshidden)
fingerprintshidden = list()
+ //Fibers~
add_fibers(M)
+ //He has no prints!
if (M.mutations2 & mFingerprints)
if(fingerprintslast != M.key)
fingerprintshidden += "(Has no fingerprints) Real name: [M.real_name], Key: [M.key]"
fingerprintslast = M.key
return 0
+ //Now, lets get to the dirty work.
+ //First, make sure their DNA makes sense.
var/mob/living/carbon/human/H = M
if (!istype(H.dna, /datum/dna) || !H.dna.uni_identity || (length(H.dna.uni_identity) != 32))
if(!istype(H.dna, /datum/dna))
H.dna = new /datum/dna(null)
H.check_dna()
+ //Now, deal with gloves.
if (H.gloves && H.gloves != src)
if(fingerprintslast != H.key)
fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
fingerprintslast = H.key
H.gloves.add_fingerprint(M)
+ //Deal with gloves the pass finger/palm prints.
if(H.gloves != src)
if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex))
return 0
else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex) && !istype(H.gloves, /obj/item/clothing/gloves/fingerless))
return 0
+ //More adminstuffz
if(fingerprintslast != H.key)
fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
fingerprintslast = H.key
+ //Make the list if it does not exist.
if(!fingerprints)
fingerprints = list()
- var/new_prints = 0
- var/prints
- for(var/i = 1, i <= fingerprints.len, i++)
- var/list/L = params2list(fingerprints[i])
- if(L[num2text(1)] == md5(H.dna.uni_identity))
- new_prints = i
- prints = L[num2text(2)]
- break
- else
- var/test_print = stars(L[num2text(2)], rand(80,90))
- if(stringpercent(test_print) == 32)
- if(fingerprints.len == 1)
- fingerprints = list()
- else
- fingerprints.Cut(i,i+1)
- else
- fingerprints[i] = "1=[L[num2text(1)]]&2=[test_print]"
- if(new_prints)
- fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), (H.gloves ? rand(10,20) : rand(25,40)))))
+ //Hash this shit.
+ var/full_print = md5(H.dna.uni_identity)
+ var/print = fingerprints[full_print] //Find if the print is already there.
+ //It is not! We need to add it!
+ if(!print)
+ fingerprints[full_print] = stars(full_print, H.gloves ? rand(10,20) : rand(25,40))
+ //It's there, lets merge this shit!
else
- if(!fingerprints || !fingerprints.len)
- fingerprints = list(text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40))))
- else
- fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))
- for(var/i = 1, i <= fingerprints.len, i++)
- if(length(fingerprints[i]) != 69)
- fingerprints.Remove(fingerprints[i])
- if(fingerprints && !fingerprints.len) del(fingerprints)
+ fingerprints[full_print] = stringmerge(print, stars(full_print, (H.gloves ? rand(10,20) : rand(25,40))))
return 1
else
if(fingerprintslast != M.key)
fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key)
fingerprintslast = M.key
+ //Cleaning up shit.
+ if(fingerprints && !fingerprints.len)
+ del(fingerprints)
return
//returns 1 if made bloody, returns 0 otherwise
@@ -211,11 +200,9 @@
O.overlays += O.blood_overlay
//if this blood isn't already in the list, add it
- for(var/i = 1, i <= O.blood_DNA.len, i++)
- if((O.blood_DNA[i][1] == M.dna.unique_enzymes) && (O.blood_DNA[i][2] == M.dna.b_type))
- return 0 //already bloodied with this blood. Cannot add more.
- O.blood_DNA.len++
- O.blood_DNA[O.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
+ if(blood_DNA[M.dna.unique_enzymes])
+ return 0 //already bloodied with this blood. Cannot add more.
+ blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
return 1 //we applied blood to the item
//adding blood to turfs
@@ -224,8 +211,8 @@
//get one blood decal and infect it with virus from M.viruses
for(var/obj/effect/decal/cleanable/blood/B in T.contents)
- B.blood_DNA.len++
- B.blood_DNA[B.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
+ if(!B.blood_DNA[M.dna.unique_enzymes])
+ B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
B.virus2 += M.virus2
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
@@ -235,7 +222,7 @@
//if there isn't a blood decal already, make one.
var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(T)
- newblood.blood_DNA = list(list(M.dna.unique_enzymes, M.dna.b_type))
+ newblood.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
newblood.blood_owner = M
newblood.virus2 = M.virus2
for(var/datum/disease/D in M.viruses)
@@ -248,11 +235,9 @@
else if (istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
//if this blood isn't already in the list, add it
- for(var/i = 1, i <= H.blood_DNA.len, i++)
- if((H.blood_DNA[i][1] == M.dna.unique_enzymes) && (H.blood_DNA[i][2] == M.dna.b_type))
- return 0 //already bloodied with this blood. Cannot add more.
- H.blood_DNA.len++
- H.blood_DNA[H.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
+ if(blood_DNA[H.dna.unique_enzymes])
+ return 0 //already bloodied with this blood. Cannot add more.
+ blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
return 1 //we applied blood to the item
return
@@ -275,7 +260,7 @@
if( istype(src, /turf/simulated) )
var/turf/simulated/source1 = src
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source1)
- this.blood_DNA = list(M.dna.unique_enzymes, M.dna.b_type)
+ this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
this.OriginalMob = M.dna.original_name
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
@@ -286,7 +271,7 @@
if( istype(src, /turf/simulated) )
var/turf/simulated/source2 = src
var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(source2)
- this.blood_DNA = list(list("UNKNOWN BLOOD","X*"))
+ this.blood_DNA["UNKNOWN BLOOD"] = "X*"
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
this.viruses += newDisease
@@ -305,9 +290,9 @@
/atom/proc/clean_blood()
- if (!( src.flags ) & 256)
+ if (!flags & 256)
return
- if ( src.blood_DNA )
+ if (blood_DNA )
//Cleaning blood off of mobs
if (istype (src, /mob/living/carbon))
@@ -340,25 +325,14 @@
if(blood_DNA && istype(blood_DNA, /list) && !blood_DNA.len)
del(blood_DNA)
- if(src.fingerprints && src.fingerprints.len)
- var/done = 0
- while(!done)
- done = 1
- for(var/i = 1, i < (src.fingerprints.len + 1), i++)
- var/list/prints = params2list(src.fingerprints[i])
- var/test_print = prints["2"]
- var/new_print = stars(test_print, rand(1,20))
- if(stringpercent(new_print) == 32)
- if(src.fingerprints.len == 1)
- src.fingerprints = list()
- else
- for(var/j = (i + 1), j < (src.fingerprints.len), j++)
- src.fingerprints[j-1] = src.fingerprints[j]
- src.fingerprints.len--
- done = 0
- break
- else
- src.fingerprints[i] = "1=" + prints["1"] + "&2=" + new_print
+ if(fingerprints && fingerprints.len)
+ //Smudge up dem prints some
+ for(var/P in fingerprints)
+ var/test_print = stars(fingerprints[P], rand(10,20))
+ if(stringpercent(test_print) == 32) //She's full of stars! (No actual print left)
+ fingerprints.Remove(P)
+ else
+ fingerprints[P] = test_print
if(fingerprints && !fingerprints.len)
del(fingerprints)
if(istype(src, /mob/living/carbon/human))
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 10e78b95e57..9d720356481 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -801,7 +801,7 @@
H.apply_damage(0.5*damage, BRUTE, "r_arm")
var/obj/effect/decal/cleanable/blood/B = new(src.loc)
- B.blood_DNA = list(list(H.dna.unique_enzymes, H.dna.b_type))
+ B.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
bloodiness += 4
diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm
index c8924d62c7d..2c834a06ea7 100644
--- a/code/game/magic/cultist/ritual.dm
+++ b/code/game/magic/cultist/ritual.dm
@@ -562,7 +562,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
R.word2 = w2
R.word3 = w3
R.check_icon()
- R.blood_DNA = list(list(H.dna.unique_enzymes, H.dna.b_type))
+ R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
return
else
user << "The book seems full of illegible scribbles. Is this a joke?"
@@ -607,7 +607,7 @@ 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 = list(list(H.dna.unique_enzymes, H.dna.b_type))
+ R.blood_DNA[H.dna.unique_enzymes] = H.dna.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/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm
index 104274ab246..e221c6a0291 100755
--- a/code/game/objects/devices/PDA/PDA.dm
+++ b/code/game/objects/devices/PDA/PDA.dm
@@ -814,9 +814,8 @@
else
user << "\blue Blood found on [C]. Analysing..."
spawn(15)
- 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]]"
+ for(var/blood in C:blood_DNA)
+ user << "\blue Blood type: [C:blood_DNA[blood]]\nDNA: [blood]"
if(4)
for (var/mob/O in viewers(C, null))
@@ -838,16 +837,15 @@
var/list/prints = A:fingerprints
var/list/complete_prints = list()
for(var/i in prints)
- var/list/templist = params2list(i)
- var/temp = stringpercent(templist["2"])
- if(temp <= 6)
- complete_prints += templist["2"]
+ var/print = prints[i]
+ if(stringpercent(print) <= FINGERPRINT_COMPLETE)
+ complete_prints += print
if(complete_prints.len < 1)
user << "\blue No intact prints found"
else
user << "\blue Found [complete_prints.len] intact prints"
for(var/i in complete_prints)
- user << "\blue " + i
+ user << "\blue [i]"
if(3)
if(!isnull(A.reagents))
diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm
index f8b2c6963fd..17b62e1f119 100644
--- a/code/game/objects/devices/scanners.dm
+++ b/code/game/objects/devices/scanners.dm
@@ -85,7 +85,7 @@ MASS SPECTROMETER
src.amount += W.amount
//W = null
del(W)
- src.add_fingerprint(user)
+ add_fingerprint(user)
if (W)
W.add_fingerprint(user)
return
@@ -110,9 +110,6 @@ MASS SPECTROMETER
else
if (src.amount < 1)
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)
else
src.amount--
var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
@@ -122,7 +119,7 @@ MASS SPECTROMETER
F.name = text("FPrintC- '[M.name]'")
user << "\blue Done printing."
- user << text("\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]")
+ user << "\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]"
if ( !M.blood_DNA || !M.blood_DNA.len )
user << "\blue No blood found on [M]"
if(M.blood_DNA)
@@ -130,16 +127,15 @@ MASS SPECTROMETER
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]]"
+ for(var/blood in M.blood_DNA)
+ user << "\blue Blood type: [M.blood_DNA[blood]]\nDNA: [blood]"
return
afterattack(atom/A as obj|turf|area, mob/user as mob)
if(!(locate(A) in oview(1,user)))
return
if(src.loc != user)
- return 0
+ return
if(istype(A,/obj/machinery/computer/forensic_scanning)) //breaks shit.
return
if(istype(A,/obj/item/weapon/f_card))
@@ -147,17 +143,21 @@ MASS SPECTROMETER
return
if(!A.fingerprints)
A.fingerprints = list()
- src.add_fingerprint(user)
+ add_fingerprint(user)
+
+ //Special case for blood splaters.
if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
if(!isnull(A.blood_DNA))
- 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]]"
+ for(var/blood in A.blood_DNA)
+ user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
return
var/duplicate = 0
+ //General
if ((!A.fingerprints || !A.fingerprints.len) && !A.suit_fibers && !A.blood_DNA)
user << "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!"
return 0
+
+ //BLOOD
else if (A.blood_DNA)
user << "\blue Blood found on [A]. Analysing..."
sleep(15)
@@ -166,11 +166,12 @@ MASS SPECTROMETER
var/i = add_data(A)
if(i)
user << "\blue Blood already in memory."
- for(var/i = 1, i < (A.blood_DNA.len + 1), i++)
- var/list/templist = A.blood_DNA[i]
- user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
+ for(var/blood in A.blood_DNA)
+ user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
else
user << "\blue No Blood Located"
+
+ //PRINTS
if(!A.fingerprints || !A.fingerprints.len)
user << "\blue No Fingerprints Located."
if(A.fingerprints)
@@ -182,6 +183,8 @@ MASS SPECTROMETER
var/i = add_data(A)
if(i)
user << "\blue Fingerprints already in memory."
+
+ //FIBERS
if(!A.suit_fibers)
user << "\blue No Fibers/Materials Located."
else
@@ -192,78 +195,44 @@ MASS SPECTROMETER
var/i = add_data(A)
if(i)
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 + 1), i++) //Lets see if the object is already in there!
- var/list/temp = stored[i]
- var/atom/checker = temp[1]
- var/atom_checker_scan = (A.original_atom ? checker.original_atom[1] == A.original_atom[1] : 0)
- if(checker.original_atom[1] == A || atom_checker_scan) //It is! Merge!
- merged = 1
- var/list/prints = temp[2]
- if(!prints)
- prints = list()
- if(A.fingerprints && A.fingerprints.len)
- for(var/j = 1, j <= A.fingerprints.len, j++) //Fingerprints~~~
- var/list/print_test1 = params2list(A.fingerprints[j])
- var/test_print1 = print_test1[num2text(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[num2text(1)]
- if(test_print2 == test_print1) //It is! Merge!
- prints[k] = test_print2 + "&" + stringmerge(print_test2[num2text(2)],print_test1[num2text(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(!fibers)
- fibers = list()
- if(A.suit_fibers && A.suit_fibers.len)
- for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~
- if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
- fibers += A.suit_fibers[j]
- var/list/blood = temp[4]
- if(!blood)
- blood = list()
- if(A.blood_DNA && A.blood_DNA.len)
- for(var/j = 1, j <= A.blood_DNA.len, j++) //Blood~~~
- if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
- blood += A.blood_DNA[j]
- var/list/sum_list[4] //Pack it back up!
- sum_list[1] = checker
- 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.get_duplicate(src)
- 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
+ //I love hashtables.
+ var/list/data_entry = stored["\ref [A]"]
+ if(islist(data_entry)) //Yay, it was already stored!
+ //Merge the fingerprints.
+ var/list/data_prints = data_entry[1]
+ for(var/print in A.fingerprints)
+ var/merged_print = data_prints[print]
+ if(!merged_print)
+ data_prints[print] = A.fingerprints[print]
+ else
+ data_prints[print] = stringmerge(data_prints[print],A.fingerprints[print])
+
+ //Now the fibers
+ var/list/fibers = data_entry[2]
+ if(!fibers)
+ fibers = list()
+ if(A.suit_fibers && A.suit_fibers.len)
+ for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~
+ if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
+ fibers += A.suit_fibers[j]
+ var/list/blood = data_entry[3]
+ if(!blood)
+ blood = list()
+ if(A.blood_DNA && A.blood_DNA.len)
+ for(var/main_blood in A.blood_DNA)
+ if(!blood[main_blood])
+ blood[main_blood] = A.blood_DNA[blood]
+ return 1
+ var/list/sum_list[4] //Pack it back up!
+ sum_list[1] = A.fingerprints
+ sum_list[2] = A.suit_fibers
+ sum_list[3] = A.blood_DNA
+ sum_list[4] = "\The [A] in [get_area(A)]"
+ stored["\ref [A]"] = sum_list
+ return 0
/obj/item/device/healthanalyzer
diff --git a/code/game/objects/gibs.dm b/code/game/objects/gibs.dm
index e3325833eef..547f5eac6e9 100644
--- a/code/game/objects/gibs.dm
+++ b/code/game/objects/gibs.dm
@@ -51,13 +51,13 @@
viruus.holder = gib
viruus.spread_type = CONTACT_FEET
if(MobDNA)
- gib.blood_DNA = list(list(MobDNA.unique_enzymes, MobDNA.b_type))
+ gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
if(MobDNA.original_name != "Unknown")
gib.OriginalMob = MobDNA.original_name
else if(istype(src, /obj/effect/gibspawner/xeno))
- gib.blood_DNA = list(list("UNKNOWN DNA", "X*"))
+ gib.blood_DNA["UNKNOWN DNA"] = "X*"
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
- gib.blood_DNA = list(list("Non-human DNA", "A+"))
+ gib.blood_DNA["Non-human DNA"] = "A+"
var/list/directions = gibdirections[i]
if(directions.len)
gib.streak(directions)
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 1f4b10b3705..6c0ea9cdbb3 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -207,13 +207,10 @@ FINGERPRINT CARD
/obj/item/weapon/f_card/proc/display()
if(!fingerprints) return
- if (!istype(src.fingerprints, /list))
- src.fingerprints = params2list(src.fingerprints)
- if (length(src.fingerprints))
+ if (length(fingerprints))
var/dat = "Fingerprints on Card
"
- for(var/i = 1, i < (src.fingerprints.len + 1), i++)
- var/list/L = params2list(src.fingerprints[i])
- dat += text("[]
", L["1"])
+ for(var/name in fingerprints)
+ dat += "[name]
"
//Foreach goto(41)
return dat
else
@@ -273,7 +270,7 @@ FINGERPRINT CARD
else
src.name = "Finger Print Card"
W.add_fingerprint(user)
- src.add_fingerprint(user)
+ add_fingerprint(user)
return
/obj/item/weapon/f_card/add_fingerprint()
diff --git a/code/game/objects/tank.dm b/code/game/objects/tank.dm
index beaa3b21a08..cb2bb08bc53 100644
--- a/code/game/objects/tank.dm
+++ b/code/game/objects/tank.dm
@@ -159,8 +159,8 @@
var/pressure = air_contents.return_pressure()
if(pressure > TANK_FRAGMENT_PRESSURE)
if(!istype(src.loc,/obj/item/device/transfer_valve))
- message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].")
- log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].")
+ message_admins("Explosive tank rupture! last key to touch the tank was [fingerprintslast].")
+ log_game("Explosive tank rupture! last key to touch the tank was [fingerprintslast].")
//world << "\blue[x],[y] tank is exploding: [pressure] kPa"
//Give the gas a chance to build up more pressure through reacting
air_contents.react()
diff --git a/code/modules/DetectiveWork/detective_work.dm b/code/modules/DetectiveWork/detective_work.dm
index b0bd6604534..fba676fd9bb 100644
--- a/code/modules/DetectiveWork/detective_work.dm
+++ b/code/modules/DetectiveWork/detective_work.dm
@@ -47,22 +47,7 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
suit_fibers += "Material from a pair of [M.gloves.name]."
if(!suit_fibers.len) del suit_fibers
-atom/proc/get_duplicate(var/atom/location)
- var/atom/movable/temp_atom = new /atom/movable(location)
- temp_atom.name = src.name
- temp_atom.desc = src.desc
- temp_atom.icon = src.icon
- temp_atom.icon_state = src.icon_state
- temp_atom.fingerprints = src.fingerprints
- temp_atom.blood_DNA = src.blood_DNA
- temp_atom.suit_fibers = src.suit_fibers
- if(src.original_atom)
- temp_atom.original_atom = src.original_atom
- else
- temp_atom.original_atom = list(src)
- return temp_atom
-
-#define FINGERPRINT_COMPLETE 6 //This is the output of the stringpercent(print) proc, and means about 80% of
+var/const/FINGERPRINT_COMPLETE = 6 //This is the output of the stringpercent(print) proc, and means about 80% of
//the print must be there for it to be complete. (Prints are 32 digits)
obj/machinery/computer/forensic_scanning
@@ -204,96 +189,90 @@ obj/machinery/computer/forensic_scanning
if("database")
canclear = 1
if(href_list["delete_record"])
- delete_dossier(text2num(href_list["delete_record"]))
+ delete_dossier(href_list["delete_record"])
if(href_list["delete_aux"])
- delete_record(text2num(href_list["delete_aux"]))
+ delete_record(href_list["delete_aux"])
if((!misc || !misc.len) && (!files || !files.len))
temp = "Database is empty."
- for(var/atom/A in contents)
- if(A == scanning)
- continue
- del(A)
else
if(files && files.len)
temp = "Criminal Evidence Database
"
temp += "Consolidated data points:
"
- for(var/i = 1, i <= files.len, i++)
- temp += "{Dossier [i]}
"
+ var/i = 1
+ for(var/print in files)
+ temp += "{Dossier [i]}
"
+ i++
temp += "
{Insert Finger Print Card (To complete a Dossier)}
"
else
temp = ""
if(misc && misc.len)
- if(href_list["delete"])
- delete_record(text2num(href_list["delete"]))
temp += "Auxiliary Evidence Database
"
temp += "This is where anything without fingerprints goes.
"
- for(var/i = 1, i <= misc.len, i++)
- var/list/temp_list = misc[i]
- var/item_name = get_name(temp_list[1])
- temp += "{[item_name]}
"
+ for(var/atom in misc)
+ var/list/data_entry = misc[atom]
+ temp += "{[data_entry[3]]}
"
if("record")
canclear = 0
if(files)
temp = "Criminal Evidence Database
"
- temp += "Consolidated data points: Dossier [href_list["identifier"]]
"
- var/identifier = text2num(href_list["identifier"])
- var/list/dossier = files[identifier]
- var/list/prints = params2list(dossier[1])
+ temp += "Consolidated data points: Dossier [files.Find(href_list["identifier"])]
"
+ var/list/dossier = files[href_list["identifier"]]
var/print_string = "Fingerprints: Print not complete!
"
- if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
- print_string = "Fingerprints: (80% or higher completion reached)
" + prints[num2text(2)] + "
"
+ if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE)
+ print_string = "Fingerprints: (80% or higher completion reached)
[dossier[1]]
"
temp += print_string
- for(var/i = 2, i <= dossier.len, i++)
+ for(var/object in dossier)
+ if(object == dossier[1])
+ continue
temp += "
"
- var/list/outputs = dossier[i]
- var/item_name = get_name(outputs[1])
- var/list/prints_len = outputs[2]
- temp += "Object: [item_name]
"
+ var/list/outputs = dossier[object]
+ var/list/prints_len = outputs[1]
+ temp += "Object: [outputs[4]]
"
temp += " Fingerprints:
"
temp += " [prints_len.len] Unique fingerprints found.
"
- var/list/fibers = outputs[3]
+ var/list/fibers = outputs[2]
if(fibers && fibers.len)
temp += " Fibers:
"
for(var/j = 1, j <= fibers.len, j++)
temp += " [fibers[j]]
"
- var/list/blood = outputs[4]
+ var/list/blood = outputs[3]
if(blood && blood.len)
temp += " Blood:
"
for(var/j = 1, j <= blood.len, j++)
var/list/templist2 = blood[j]
temp += " Type: [templist2[2]], DNA: [templist2[1]]
"
+ temp += "
{Delete this Dossier}"
+ temp += "
{Print}"
else
temp = "ERROR. Database not found!
"
- temp += "
{Delete this Dossier}"
- temp += "
{Print}"
temp += "
{Return}"
if("databaseprint")
if(files)
var/obj/item/weapon/paper/P = new(loc)
- P.name = "Database File (Dossier [href_list["identifier"]])"
+ P.name = "Database File (Dossier [files.Find(href_list["identifier"])])"
P.overlays += "paper_words"
P.info = "Criminal Evidence Database
"
P.info += "Consolidated data points: Dossier [href_list["identifier"]]
"
- var/list/dossier = files[text2num(href_list["identifier"])]
- var/list/prints = params2list(dossier[1])
+ var/list/dossier = files[href_list["identifier"]]
var/print_string = "Fingerprints: Print not complete!
"
- if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
- print_string = "Fingerprints: " + prints[num2text(2)] + "
"
+ if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE)
+ print_string = "Fingerprints: (80% or higher completion reached)
[dossier[1]]
"
P.info += print_string
- for(var/i = 2, i <= dossier.len, i++)
+ for(var/object in dossier)
+ if(object == dossier[1])
+ continue
P.info += "
"
- var/list/outputs = dossier[i]
- var/item_name = get_name(outputs[1])
- var/list/prints_len = outputs[2]
- P.info += "Object: [item_name]
"
+ var/list/outputs = dossier[object]
+ var/list/prints_len = outputs[1]
+ P.info += "Object: [outputs[4]]
"
P.info += " Fingerprints:
"
P.info += " [prints_len.len] Unique fingerprints found.
"
- var/list/fibers = outputs[3]
+ var/list/fibers = outputs[2]
if(fibers && fibers.len)
P.info += " Fibers:
"
for(var/j = 1, j <= fibers.len, j++)
P.info += " [fibers[j]]
"
- var/list/blood = outputs[4]
+ var/list/blood = outputs[3]
if(blood && blood.len)
P.info += " Blood:
"
for(var/j = 1, j <= blood.len, j++)
@@ -305,42 +284,38 @@ obj/machinery/computer/forensic_scanning
canclear = 0
if(misc)
temp = "Auxiliary Evidence Database
"
- var/identifier = text2num(href_list["identifier"])
- var/list/outputs = misc[identifier]
- var/item_name = get_name(outputs[1])
- temp += "Consolidated data points: [item_name]
"
- var/list/fibers = outputs[2]
+ var/list/outputs = misc[href_list["identifier"]]
+ temp += "Consolidated data points: [outputs[3]]
"
+ var/list/fibers = outputs[1]
if(fibers && fibers.len)
temp += " Fibers:
"
for(var/j = 1, j <= fibers.len, j++)
temp += "
[fibers[j]]"
- var/list/blood = outputs[3]
+ var/list/blood = outputs[2]
if(blood && blood.len)
temp += " Blood:
"
for(var/j = 1, j <= blood.len, j++)
var/list/templist2 = blood[j]
temp += " Type: [templist2[2]], DNA: [templist2[1]]
"
+ temp += "
{Delete This Record}"
+ temp += "
{Print}"
else
temp = "ERROR. Database not found!
"
- temp += "
{Delete This Record}"
- temp += "
{Print}"
temp += "
{Return}"
if("auxiliaryprint")
if(misc)
var/obj/item/weapon/paper/P = new(loc)
- var/identifier = text2num(href_list["identifier"])
- var/list/outputs = misc[identifier]
- var/item_name = get_name(outputs[1])
- P.name = "Auxiliary Database File ([item_name])"
+ var/list/outputs = misc[href_list["identifier"]]
+ P.name = "Auxiliary Database File ([outputs[3]])"
P.overlays += "paper_words"
P.info = "Auxiliary Evidence Database
"
- P.info += "Consolidated data points: [item_name]
"
- var/list/fibers = outputs[2]
+ P.info += "Consolidated data points: [outputs[3]]
"
+ var/list/fibers = outputs[1]
if(fibers && fibers.len)
P.info += " Fibers:
"
for(var/j = 1, j <= fibers.len, j++)
P.info += "
[fibers[j]]"
- var/list/blood = outputs[3]
+ var/list/blood = outputs[2]
if(blood && blood.len)
P.info += " Blood:
"
for(var/j = 1, j <= blood.len, j++)
@@ -383,9 +358,8 @@ obj/machinery/computer/forensic_scanning
scan_data = "[scanning]
"
if (scanning.blood_DNA)
scan_data += "Blood Found:
"
- 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]]
"
+ for(var/blood in scanning.blood_DNA)
+ scan_data += "Blood type: [scanning.blood_DNA[blood]]\nDNA: [blood]
"
else
scan_data += "No Blood Found
"
if(!scanning.fingerprints)
@@ -448,221 +422,138 @@ obj/machinery/computer/forensic_scanning
temp = "Data Transfer Failed: No Object."
updateUsrDialog()
- verb/reset()
- set name = "Reset Database"
- set category = "Object"
- set src in oview(1)
- temp = ""
- add_fingerprint(usr)
- files = list()
- misc = list()
- for(var/atom/A in contents)
- if(A == scanning)
- continue
- del(A)
- return
-
-
ex_act()
return
proc/add_data_scanner(var/obj/item/device/detective_scanner/W)
if(W.stored)
- for(var/i = 1, i <= W.stored.len, i++)
- var/list/data = W.stored[i]
- add_data(data[1],1,data[2],data[3],data[4])
+ for(var/atom in W.stored)
+ var/list/data = W.stored[atom]
+ add_data_master(atom,data[1],data[2],data[3],data[4])
W.stored = list()
- for(var/atom/A in W.contents)
- del(A)
return
+ proc/add_data(var/atom/scanned_atom)
+ return add_data_master("\ref [scanned_atom]", scanned_atom.fingerprints,\
+ scanned_atom.suit_fibers, scanned_atom.blood_DNA, scanned_atom.name)
- proc/add_data(var/atom/A, var/override = 0, var/tempfingerprints, var/tempsuit_fibers,var/tempblood_DNA)
+
+
+/********************************
+*****DO NOT DIRECTLY CALL ME*****
+********************************/
+ proc/add_data_master(var/atom_reference, var/list/atom_fingerprints, var/list/atom_suit_fibers, var/list/atom_blood_DNA, var/atom_name)
//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
- backup_prints
- backup_fibers
- backup_DNA
- if(override)
- backup_prints = A.fingerprints
- A.fingerprints = tempfingerprints
- backup_fibers = A.suit_fibers
- A.suit_fibers = tempsuit_fibers
- backup_DNA = A.blood_DNA
- A.blood_DNA = tempblood_DNA
- if(!A.fingerprints) //No prints
- var/merged = 0
+
+ if(!atom_fingerprints) //No prints
if(!misc)
misc = list()
- if(misc)
- for(var/i = 1, i <= misc.len, i++) //Lets see if we can find it.
- var/list/templist = misc[i]
- var/atom/check = templist[1]
- var/atom_checker_scan = (A.original_atom ? check.original_atom[1] == A.original_atom[1] : 0)
- if(check.original_atom[1] == A || atom_checker_scan) //There it is!
- merged = 1
- var/list/fibers = templist[2]
- if(!fibers)
- fibers = list()
- if(A.suit_fibers)
- for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~
- if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
- fibers += A.suit_fibers[j]
- var/list/blood = templist[3]
- if(!blood)
- blood = list()
- if(A.blood_DNA)
- for(var/j = 1, j <= A.blood_DNA.len, j++) //Blood~~~
- if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
- blood += A.blood_DNA[j]
- var/list/sum_list[3] //Pack it back up!
- sum_list[1] = check
- 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[3]
- templist[1] = A.get_duplicate(src)
- 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
- if(!files)
- files = list()
- for(var/i = 1, i <= files.len, i++) //Lets see if we can find the owner of the prints
- var/list/perp_list = files[i]
- var/list/perp_prints = params2list(perp_list[1])
- var/perp = perp_prints[num2text(1)]
- var/found2 = 0
- 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[num2text(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]
- var/atom/atom_checker = target[1]
- var/atom_checker_scan = (A.original_atom ? atom_checker.original_atom[1] == A.original_atom[1] : 0)
- if(atom_checker.original_atom[1] == A || atom_checker_scan) //Found the original object!
- found2 = 1
- var/list/prints = target[2]
- if(!prints)
- prints = list()
- 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[num2text(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[num2text(1)]
- if(test_print2 == test_print1) //It is! Merge!
- prints[k] = "1=" + test_print2 + "&2=" + stringmerge(print_test2[num2text(2)],print_test1[num2text(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(!fibers)
- fibers = list()
- if(A.suit_fibers)
- for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
- if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
- fibers += A.suit_fibers[j]
- var/list/blood = target[4]
- if(!blood)
- blood = list()
- if(A.blood_DNA)
- for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
- if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
- blood += A.blood_DNA[j]
- var/list/sum_list[4] //Pack it back up!
- sum_list[1] = atom_checker
- 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(!found2) //Add a new datapoint to this perp!
- var/list/sum_list[4]
- sum_list[1] = A.get_duplicate(src)
- sum_list[2] = A.fingerprints
- sum_list[3] = A.suit_fibers
- sum_list[4] = A.blood_DNA
- perp_list.len++
- perp_list[perp_list.len] = sum_list
- files[i] = perp_list
- for(var/m = 1, m <= found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint!
- if(found_prints[m] == 0)
- var/list/newperp[2]
- var/list/sum_list[4]
- sum_list[1] = A.get_duplicate(src)
- 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]
- if(!files)
- files = newperp
- else
- files.len++
- files[files.len] = newperp
- update_fingerprints() //Lets update the calculated sum of the stored prints.
- if(override)
- A.fingerprints = backup_prints
- A.suit_fibers = backup_fibers
- A.blood_DNA = backup_DNA
- return
+ var/list/data_entry = misc[atom_reference]
+ if(data_entry)
+ var/list/fibers = data_entry[1]
+ if(!fibers)
+ fibers = list()
+ if(atom_suit_fibers)
+ for(var/j = 1, j <= atom_suit_fibers.len, j++) //Fibers~~~
+ if(!fibers.Find(atom_suit_fibers[j])) //It isn't! Add!
+ fibers += atom_suit_fibers[j]
+ var/list/blood = data_entry[2]
+ if(!blood)
+ blood = list()
+ if(atom_blood_DNA)
+ for(var/main_blood in atom_blood_DNA)
+ if(!blood[main_blood])
+ blood[main_blood] = atom_blood_DNA[blood]
+ return 1
+ var/list/templist[2]
+ templist[1] = atom_suit_fibers
+ templist[2] = atom_blood_DNA
+ templist[3] = atom_name
+ misc[atom_reference] = templist //Store it!
+ return 0
+ //Has prints.
+ if(!files)
+ files = list()
+ for(var/main_print in atom_fingerprints)
+ var/list/data_entry = files[main_print]
+ if(data_entry)//The print is already in here!
+ var/list/internal_atom = data_entry[atom_reference] //Lets see if we can find the current object
+ if(internal_atom)
+ //We must be on a roll! Just update what needs to be updated.
+ var/list/internal_prints = internal_atom[1]
+ for(var/print in atom_fingerprints) //Sorry for the double loop! D:
+ var/associated_print = internal_prints[print]
+ var/reference_print = atom_fingerprints[print]
+ if(associated_print && associated_print != reference_print) //It does not match
+ internal_prints[print] = stringmerge(associated_print, reference_print)
+ else if(!associated_print)
+ internal_prints[print] = reference_print
+ //If the main print was updated, lets update the master as well.
+ if(print == main_print && (!associated_print || (associated_print && associated_print != reference_print)))
+ update_fingerprints(main_print, internal_prints[print])
+ //Fibers.
+ var/list/fibers = internal_atom[2]
+ if(!fibers)
+ fibers = list()
+ if(atom_suit_fibers)
+ for(var/j = 1, j < atom_suit_fibers.len, j++) //Fibers~~~
+ if(!fibers.Find(atom_suit_fibers[j])) //It isn't! Add!
+ fibers += atom_suit_fibers[j]
+ //Blood.
+ var/list/blood = internal_atom[3]
+ if(!blood)
+ blood = list()
+ if(atom_blood_DNA)
+ for(var/main_blood in atom_blood_DNA)
+ if(!blood[main_blood])
+ blood[main_blood] = atom_blood_DNA[blood]
+ continue
+ //It's not in there! We gotta add it.
+ update_fingerprints(main_print, atom_fingerprints[main_print])
+ var/list/data_point[4]
+ data_point[1] = atom_fingerprints
+ data_point[2] = atom_suit_fibers
+ data_point[3] = atom_blood_DNA
+ data_point[4] = atom_name
+ data_entry[atom_reference] = data_point
+ continue
+ //No print at all! New data entry, go!
+ var/list/data_point[4]
+ data_point[1] = atom_fingerprints
+ data_point[2] = atom_suit_fibers
+ data_point[3] = atom_blood_DNA
+ data_point[4] = atom_name
+ var/list/new_file[1]
+ new_file[1] = atom_fingerprints[main_print]
+ new_file[atom_reference] = data_point
+ files[main_print] = new_file
+ return 1
+/********************************
+***END DO NOT DIRECTLY CALL ME***
+********************************/
- proc/update_fingerprints() //I am tired, but this updates the master print from evidence, which is used to determine completion of a print.
- for(var/k = 1, k <= files.len, k++)
- var/list/perp_list = files[k]
- var/list/perp_prints = params2list(perp_list[1])
- var/perp = perp_prints[num2text(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, j++)
- var/list/test_list_2 = params2list(test_prints[j])
- var/test_prints_2 = test_list_2[num2text(1)]
- if(test_prints_2 == perp)
- found_prints += test_list_2[num2text(2)]
- break
- for(var/prints in found_prints)
- perp_prints[num2text(2)] = stringmerge(perp_prints[num2text(2)],prints)
- perp_list[1] = "1=" + perp + "&2=" + perp_prints[num2text(2)]
- files[k] = perp_list
+ proc/update_fingerprints(var/ref_print, var/new_print)
+ var/list/master = files[ref_print]
+ if(master)
+ master[1] = stringmerge(master[1],new_print)
+ else
+ CRASH("Fucking hell. Something went wrong, and it tried to update a null print or something. Tell SkyMarshal")
return
proc/process_card() //Same as above, but for fingerprint cards
if(card.fingerprints && !(card.amount > 1) && islist(card.fingerprints) && files && files.len)
usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints."
var/found = 0
- for(var/k = 1, k <= card.fingerprints.len, k++)
- var/list/test_prints = params2list(card.fingerprints[k])
- var/print = test_prints[num2text(1)]
- for(var/i = 1, i <= files.len, i++)
- var/list/test_list = files[i]
- var/list/perp_prints = params2list(test_list[1])
- var/perp = perp_prints[num2text(1)]
- if(perp == print)
- test_list[1] = "1=" + print + "&2=" + print
- files[i] = test_list
- found = 1
- break
+ for(var/master_print in card.fingerprints)
+ var/list/data_entry = files[master_print]
+ if(data_entry)
+ found = 1
+ data_entry[1] = master_print
if(found)
- usr << "The machinery finds can completes a match."
+ usr << "The machinery finds it can complete a match."
else
usr << "No match found."
del(card)
@@ -674,24 +565,14 @@ obj/machinery/computer/forensic_scanning
return
return
- proc/delete_record(var/location) //Deletes an entry in the misc database at the given location
+ proc/delete_record(var/atom_ref) //Deletes an entry in the misc database at the given location
if(misc && misc.len)
- for(var/i = location, i < misc.len, i++)
- misc[i] = misc[i+i]
- misc.len--
+ misc.Remove(atom_ref)
return
- proc/get_name(var/atom/A) //HurrDurr
- return A.name
-
- proc/delete_dossier(var/location) //Deletes a Dossier at a given location.
+ proc/delete_dossier(var/print) //Deletes a Dossier at a given location.
if(files && files.len)
- if(files.len > location)
- for(var/i = location, i < files.len, i++)
- files[i] = files[i + 1]
- if(files.len >= location)
- files[files.len] = list()
- files.len--
+ files.Remove(print)
return
detective
@@ -784,17 +665,17 @@ turf/Entered(mob/living/carbon/human/M)
turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info,bloodcolor)
for(var/obj/effect/decal/cleanable/blood/tracks/T in src)
- if(T.dir == d && findtext(T.icon, bloodcolor))
+ if(T.dir == d && findtext(T.icon_state, bloodcolor))
if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
T.desc = "These bloody footprints appear to have been made by [info]."
- if(T.blood_DNA)
- T.blood_DNA.len++
+ if(!T.blood_DNA)
+ T.blood_DNA = list()
if(istype(M,/mob/living/carbon/human))
- T.blood_DNA[T.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
+ T.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
else if(istype(M,/mob/living/carbon/alien))
- T.blood_DNA[T.blood_DNA.len] = list("UNKNOWN DNA","X*")
+ T.blood_DNA["UNKNOWN DNA"] = "X*"
else if(istype(M,/mob/living/carbon/monkey))
- T.blood_DNA[T.blood_DNA.len] = list("Non-human DNA","A+")
+ T.blood_DNA["Non-human DNA"] = "A+"
return
var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
this.icon = 'footprints.dmi'
@@ -819,14 +700,13 @@ turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info,bloodco
else if(bloodcolor == "xeno")
this.desc = "These acidic bloody footprints appear to have been made by [info]."
else if(bloodcolor == "oil")
+ this.name = "oil"
this.desc = "These oil footprints appear to have been made by [info]."
if(istype(M,/mob/living/carbon/human))
- if(this.blood_DNA.len)
- this.blood_DNA.len++
- this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
- else
- this.blood_DNA = list(list(M.dna.unique_enzymes,M.dna.b_type))
+ if(!this.blood_DNA)
+ this.blood_DNA = list()
+ this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
proc/get_tracks(mob/M)
if(istype(M,/mob/living))
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index 07eea6110a1..fb439d5b993 100644
--- a/code/modules/chemical/Chemistry-Reagents.dm
+++ b/code/modules/chemical/Chemistry-Reagents.dm
@@ -155,13 +155,11 @@ datum
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here
if(!blood_prop) //first blood!
blood_prop = new(T)
- blood_prop.blood_DNA = list(list(self.data["blood_DNA"], self.data["blood_type"]))
+ blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"]
else
if(!blood_prop.blood_DNA)
- blood_prop.blood_DNA = list(list(self.data["blood_DNA"], self.data["blood_type"]))
- else
- blood_prop.blood_DNA.len++
- blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list(self.data["blood_DNA"], self.data["blood_type"])
+ blood_prop.blood_DNA = list()
+ blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"]
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
@@ -185,13 +183,11 @@ datum
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
- blood_prop.blood_DNA = list(list(self.data["blood_DNA"],"A+"))
+ blood_prop.blood_DNA[self.data["blood_DNA"]] = "A+"
else
if(!blood_prop.blood_DNA)
- blood_prop.blood_DNA = list(list(self.data["blood_DNA"],"A+"))
- else
- blood_prop.blood_DNA.len++
- blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list(self.data["blood_DNA"], "A+")
+ blood_prop.blood_DNA = list()
+ blood_prop.blood_DNA[self.data["blood_DNA"]] = "A+"
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
@@ -209,13 +205,11 @@ datum
var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
- blood_prop.blood_DNA = list(list("UNKNOWN DNA","X*"))
+ blood_prop.blood_DNA["UNKNOWN DNA"] = "X*"
else
if(!blood_prop.blood_DNA)
- blood_prop.blood_DNA = list(list("UNKNOWN DNA","X*"))
- else
- blood_prop.blood_DNA.len++
- blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list("UNKNOWN DNA","X*")
+ blood_prop.blood_DNA = list()
+ blood_prop.blood_DNA["UNKNOWN DNA"] = "X*"
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index f6a90249965..95dd32c1362 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -164,15 +164,15 @@
iconL.Remove(G.icon_state)
if(nums.len >= 3)
var/obj/effect/decal/cleanable/blood/drip/D = pick(nums)
- D.blood_DNA.len++
- D.blood_DNA[D.blood_DNA.len] = list(dna.unique_enzymes,dna.b_type)
+ D.blood_DNA[dna.unique_enzymes] = dna.b_type
if(virus2)
D.virus2 = virus2.getcopy()
return
var/obj/effect/decal/cleanable/blood/drip/this = new(T)
this.icon_state = pick(iconL)
- this.blood_DNA = list(list(dna.unique_enzymes,dna.b_type))
+ this.blood_DNA = list()
+ this.blood_DNA[dna.unique_enzymes] = dna.b_type
this.blood_owner = src
if(virus2)
diff --git a/code/modules/mob/organ/organ_external.dm b/code/modules/mob/organ/organ_external.dm
index 49e47ec16df..cee50ecb1d0 100644
--- a/code/modules/mob/organ/organ_external.dm
+++ b/code/modules/mob/organ/organ_external.dm
@@ -92,11 +92,9 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
if(!istype(H))
return
if(H.dna)
- if(blood_DNA && blood_DNA.len)
- blood_DNA.len++
- blood_DNA[blood_DNA.len] = list(H.dna.unique_enzymes, H.dna.b_type)
- else
- blood_DNA = list(list(H.dna.unique_enzymes, H.dna.b_type))
+ if(!blood_DNA)
+ blood_DNA = list()
+ blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
var/icon/I = new /icon(icon, icon_state)