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)