Merge branch 'DetectiveWork' of https://github.com/SkyMarshal/Baystation12 into SkyMarshal-DetectiveWork

Notes:
Fucking hell. Makes the detective backend shit non-retarded. <3 Hashtables.
Map changes. Some improvements/adjustments to code to work with the map changes.

Conflicts:
	baystation12.dme
This commit is contained in:
Erthilo
2012-05-10 16:48:01 +01:00
18 changed files with 4752 additions and 4564 deletions

View File

@@ -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()

View File

@@ -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

View File

@@ -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))

View File

@@ -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

View File

@@ -486,7 +486,17 @@
autolinkers = list("bus3", "bus4") // Bus units 3 and 4
freq_listening = list(1459, 1353, 1357, 1359) // common, command, engineering, security
/obj/machinery/telecomms/receiver/antiqua_left
id = "Receiver A"
network = "tcommsat"
autolinkers = list("bus1") // link to bus units 1 and 2
freq_listening = list(1351, 1355, 1347, 1349) // science, medical, cargo, mining
/obj/machinery/telecomms/receiver/antiqua_right
id = "Receiver B"
network = "tcommsat"
autolinkers = list("bus2") // Bus units 3 and 4
freq_listening = list(1459, 1353, 1357, 1359) // common, command, engineering, security
/obj/machinery/telecomms/bus/preset_one
id = "Bus 1"
@@ -508,6 +518,15 @@
network = "tcommsat"
autolinkers = list("bus4", "processor4", "engineering", "common")
/obj/machinery/telecomms/bus/antiqua_one
id = "Bus 1"
network = "tcommsat"
autolinkers = list("bus1", "processor1", "science", "medical", "cargo", "mining")
/obj/machinery/telecomms/bus/antiqua_two
id = "Bus 2"
network = "tcommsat"
autolinkers = list("bus2", "processor2", "cargo", "mining", "engineering", "common")
/obj/machinery/telecomms/processor/preset_one

View File

@@ -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")

View File

@@ -831,9 +831,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))
@@ -855,16 +854,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))

View File

@@ -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

View File

@@ -52,13 +52,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)

View File

@@ -228,13 +228,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 = "<B>Fingerprints on Card</B><HR>"
for(var/i = 1, i < (src.fingerprints.len + 1), i++)
var/list/L = params2list(src.fingerprints[i])
dat += text("[]<BR>", L["1"])
for(var/name in fingerprints)
dat += "[name]<BR>"
//Foreach goto(41)
return dat
else
@@ -294,7 +291,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()

View File

@@ -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()

View File

@@ -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 = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points:<br>"
for(var/i = 1, i <= files.len, i++)
temp += "<a href='?src=\ref[src];operation=record;identifier=[i]'>{Dossier [i]}</a><br>"
var/i = 1
for(var/print in files)
temp += "<a href='?src=\ref[src];operation=record;identifier=[print]'>{Dossier [i]}</a><br>"
i++
temp += "<br><a href='?src=\ref[src];operation=card'>{Insert Finger Print Card (To complete a Dossier)}</a><br><br><br>"
else
temp = ""
if(misc && misc.len)
if(href_list["delete"])
delete_record(text2num(href_list["delete"]))
temp += "<b>Auxiliary Evidence Database</b><br><br>"
temp += "This is where anything without fingerprints goes.<br><br>"
for(var/i = 1, i <= misc.len, i++)
var/list/temp_list = misc[i]
var/item_name = get_name(temp_list[1])
temp += "<a href='?src=\ref[src];operation=auxiliary;identifier=[i]'>{[item_name]}</a><br>"
for(var/atom in misc)
var/list/data_entry = misc[atom]
temp += "<a href='?src=\ref[src];operation=auxiliary;identifier=[atom]'>{[data_entry[3]]}</a><br>"
if("record")
canclear = 0
if(files)
temp = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
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"])]<br>"
var/list/dossier = files[href_list["identifier"]]
var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: (80% or higher completion reached)<br>" + prints[num2text(2)] + "<br>"
if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: (80% or higher completion reached)<br>[dossier[1]]<br>"
temp += print_string
for(var/i = 2, i <= dossier.len, i++)
for(var/object in dossier)
if(object == dossier[1])
continue
temp += "<hr>"
var/list/outputs = dossier[i]
var/item_name = get_name(outputs[1])
var/list/prints_len = outputs[2]
temp += "<big><b>Object:</b> [item_name]</big><br>"
var/list/outputs = dossier[object]
var/list/prints_len = outputs[1]
temp += "<big><b>Object:</b> [outputs[4]]</big><br>"
temp += "&nbsp<b>Fingerprints:</b><br>"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>"
var/list/fibers = outputs[3]
var/list/fibers = outputs[2]
if(fibers && fibers.len)
temp += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++)
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]<br>"
var/list/blood = outputs[4]
var/list/blood = outputs[3]
if(blood && blood.len)
temp += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++)
var/list/templist2 = blood[j]
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [templist2[2]], DNA: [templist2[1]]<br>"
temp += "<br><a href='?src=\ref[src];operation=database;delete_record=[href_list["identifier"]]'>{Delete this Dossier}</a>"
temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
else
temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=database;delete_record=[href_list["identifier"]]'>{Delete this Dossier}</a>"
temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
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 = "<b>Criminal Evidence Database</b><br><br>"
P.info += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
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!<br>"
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: " + prints[num2text(2)] + "<BR>"
if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: (80% or higher completion reached)<br>[dossier[1]]<br>"
P.info += print_string
for(var/i = 2, i <= dossier.len, i++)
for(var/object in dossier)
if(object == dossier[1])
continue
P.info += "<hr>"
var/list/outputs = dossier[i]
var/item_name = get_name(outputs[1])
var/list/prints_len = outputs[2]
P.info += "<big><b>Object:</b> [item_name]</big><br>"
var/list/outputs = dossier[object]
var/list/prints_len = outputs[1]
P.info += "<big><b>Object:</b> [outputs[4]]</big><br>"
P.info += "&nbsp<b>Fingerprints:</b><br>"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>"
var/list/fibers = outputs[3]
var/list/fibers = outputs[2]
if(fibers && fibers.len)
P.info += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++)
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]<br>"
var/list/blood = outputs[4]
var/list/blood = outputs[3]
if(blood && blood.len)
P.info += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++)
@@ -305,42 +284,38 @@ obj/machinery/computer/forensic_scanning
canclear = 0
if(misc)
temp = "<b>Auxiliary Evidence Database</b><br><br>"
var/identifier = text2num(href_list["identifier"])
var/list/outputs = misc[identifier]
var/item_name = get_name(outputs[1])
temp += "<big><b>Consolidated data points:</b> [item_name]</big><br>"
var/list/fibers = outputs[2]
var/list/outputs = misc[href_list["identifier"]]
temp += "<big><b>Consolidated data points:</b> [outputs[3]]</big><br>"
var/list/fibers = outputs[1]
if(fibers && fibers.len)
temp += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++)
temp += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
var/list/blood = outputs[3]
var/list/blood = outputs[2]
if(blood && blood.len)
temp += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++)
var/list/templist2 = blood[j]
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [templist2[2]], DNA: [templist2[1]]<br>"
temp += "<br><a href='?src=\ref[src];operation=database;delete_aux=[href_list["identifier"]]'>{Delete This Record}</a>"
temp += "<br><a href='?src=\ref[src];operation=auxiliaryprint;identifier=[href_list["identifier"]]'>{Print}</a>"
else
temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=database;delete_aux=[href_list["identifier"]]'>{Delete This Record}</a>"
temp += "<br><a href='?src=\ref[src];operation=auxiliaryprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
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 = "<b>Auxiliary Evidence Database</b><br><br>"
P.info += "<big><b>Consolidated data points:</b> [item_name]</big><br>"
var/list/fibers = outputs[2]
P.info += "<big><b>Consolidated data points:</b> [outputs[3]]</big><br>"
var/list/fibers = outputs[1]
if(fibers && fibers.len)
P.info += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++)
P.info += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
var/list/blood = outputs[3]
var/list/blood = outputs[2]
if(blood && blood.len)
P.info += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++)
@@ -383,9 +358,8 @@ obj/machinery/computer/forensic_scanning
scan_data = "<u>[scanning]</u><br><br>"
if (scanning.blood_DNA)
scan_data += "Blood Found:<br>"
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]]<br><br>"
for(var/blood in scanning.blood_DNA)
scan_data += "Blood type: [scanning.blood_DNA[blood]]\nDNA: [blood]<br><br>"
else
scan_data += "No Blood Found<br><br>"
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))

View File

@@ -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
@@ -3414,4 +3408,4 @@ datum
holder.remove_reagent(src.id, 0.2)
data++
..()
return
return

View File

@@ -175,15 +175,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)

View File

@@ -94,11 +94,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)

View File

@@ -603,20 +603,6 @@
if(!istype(D, /obj/machinery/disposal/toilet))//So it does not drain gas from a toilet which does not function on it.
gas = D.air_contents// transfer gas resv. into holder object
//Check for any living mobs trigger hasmob.
//hasmob effects whether the package goes to cargo or its tagged destination.
for(var/mob/living/M in D)
if(M && M.stat != 2)
hasmob = 1
//Checks 1 contents level deep. This means that players can be sent through disposals...
//...but it should require a second person to open the package. (i.e. person inside a wrapped locker)
for(var/obj/O in D)
if(O.contents)
for(var/mob/living/M in O.contents)
if(M && M.stat != 2)
hasmob = 1
// now everything inside the disposal gets put into the holder
// note AM since can contain mobs or objs
for(var/atom/movable/AM in D)
@@ -664,7 +650,7 @@
//
if(!(count--))
tomail = 1 //So loops end up in the mail room.
destinationTag = "Mail Office"
destinationTag = null
return
@@ -1102,6 +1088,31 @@
screen = 0
icon_state_old = null
nonsorting
NE
dir = 1
icon_state = "pipe-j1s"
NW
dir = 1
icon_state = "pipe-j2s"
ES
dir = 4
icon_state = "pipe-j1s"
EN
dir = 4
icon_state = "pipe-j2s"
SW
dir = 2
icon_state = "pipe-j1s"
SE
dir = 2
icon_state = "pipe-j2s"
WN
dir = 8
icon_state = "pipe-j1s"
WS
dir = 81
icon_state = "pipe-j2s"
New()
..()
@@ -1129,22 +1140,15 @@
if(service)
return posdir //If it's being worked on, it isn't sorting.
if(sortTag)
for(var/i, i <= backType.len, i++)
if(sortTag == src.backType[i])
return negdir
if(sortTag in backType)
return negdir
else if (!sortTag && mailsort)
return sortdir
else if (!sortTag && !mailsort)
return posdir
if(fromdir != sortdir) // probably came from the negdir
var/issort = 0
for(var/i, i <= sortType.len, i++)
if(sortTag == src.sortType[i])
issort = 1
if(issort) //if destination matches filtered type...
if(sortTag in sortType)
return sortdir // exit through sortdirection
else
return posdir
@@ -1240,6 +1244,68 @@
sortType -= variable
updateUsrDialog()
//a three-way junction that sorts objects
/obj/structure/disposalpipe/mailjunction
name = "\improper Package Discrimination Unit"
desc = "An underfloor disposal pipe that is racist against packages."
icon_state = "pipe-j1s"
var
posdir = 0
negdir = 0
sortdir = 0
screen = 0
New()
..()
posdir = dir
if(icon_state == "pipe-j1s")
sortdir = turn(posdir, -90)
negdir = turn(posdir, 180)
else
icon_state = "pipe-j2s"
sortdir = turn(posdir, 90)
negdir = turn(posdir, 180)
dpdir = sortdir | posdir | negdir
update()
return
// next direction to move
// if coming in from negdir, then next is primary dir or sortdir
// if coming in from posdir, then flip around and go back to posdir
// if coming in from sortdir, go to posdir
nextdir(var/package)
//var/flipdir = turn(fromdir, 180)
if(package)
return sortdir
else
return posdir // so go with the flow to positive direction
transfer(var/obj/structure/disposalholder/H)
var/package = locate(/obj/structure/bigDelivery) in H
if(!package)
package = locate(/obj/item/smallDelivery) in H
var/nextdir = nextdir(package)
H.dir = nextdir
var/turf/T = H.nextloc()
var/obj/structure/disposalpipe/P = H.findpipe(T)
if(P)
// find other holder in next loc, if inactive merge it with current
var/obj/structure/disposalholder/H2 = locate() in P
if(H2 && !H2.active)
H.merge(H2)
H.loc = P
else // if wasn't a pipe, then set loc to turf
H.loc = T
return null
return P
//a trunk joining to a disposal bin or outlet on the same turf
/obj/structure/disposalpipe/trunk
icon_state = "pipe-t"

View File

@@ -248,10 +248,9 @@
desc = "Used to set the destination of properly wrapped packages."
icon_state = "forensic0"
var/currTag = null
var/list/spaceList = list(0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0) // Breaks up departments with whitespace.
var/list/spaceList = list(0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0) // Breaks up departments with whitespace.
var/list/locationList = list("Disposals",
"Mail Office", "Cargo Bay", "QM Office",
"Mining Base", "Mining West", "Mining North",
"Mail Office", "Cargo Bay", "QM Office","Mining Bay",
"Locker Room", "Tool Storage", "Laundry Room", "Toilets",
"Security", "Courtroom", "Detective's Office", "Law Office",
"Research Division", "Research Director", "Genetics",

File diff suppressed because it is too large Load Diff