Readded detective work, with much bugfixing and optimizations.

Any PDA that can access the Security Records can, via the forensic scanner function (that was already there) store data on what was scanned, the same way that the Detective's scanner can.
Scanning a PDA with said stored data in the Detective's computer-o-doom will transfer the data from the PDA to the computer's database.
Made some area names improper as needed (Only ones where it makes sense to be improper.)
Updated changelog.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3713 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
joeheinemeyer@gmail.com
2012-06-01 20:32:26 +00:00
parent c90048c7aa
commit e0d605c2eb
24 changed files with 918 additions and 758 deletions
File diff suppressed because it is too large Load Diff
+66 -74
View File
@@ -62,7 +62,7 @@
return
/atom/proc/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (!(istype(W, /obj/item/weapon/grab) ) && !(istype(W, /obj/item/weapon/plastique)) && !(istype(W, /obj/item/weapon/cleaner)) && !(istype(W, /obj/item/weapon/chemsprayer)) && !(istype(W, /obj/item/weapon/pepperspray)) && !(istype(W, /obj/item/weapon/plantbgone)) && !(istype(W, /obj/item/weapon/packageWrap)))
if (!(istype(W, /obj/item/weapon/grab) ) && !(istype(W, /obj/item/weapon/plastique)) && !(istype(W, /obj/item/weapon/cleaner)) && !(istype(W, /obj/item/weapon/chemsprayer)) && !(istype(W, /obj/item/weapon/pepperspray)) && !(istype(W, /obj/item/weapon/plantbgone)) && !(istype(W, /obj/item/weapon/packageWrap)) && !istype(W, /obj/item/device/detective_scanner))
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O << "\red <B>[src] has been hit by [user] with [W]</B>"
@@ -98,64 +98,62 @@
if(isnull(M.key)) return
if (!( src.flags ) & FPRINT)
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)
//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(src.fingerprintslast != H.key)
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
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))
return 0
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
//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 <= src.fingerprints.len, i++)
var/list/L = params2list(src.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(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--
else
src.fingerprints[i] = "1=[L[num2text(1)]]&2=[test_print]"
if(new_prints)
src.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)))))
else if(new_prints == 0)
if(!src.fingerprints)
src.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
src.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 <= src.fingerprints.len, i++)
if(length(src.fingerprints[i]) != 69)
src.fingerprints.Remove(src.fingerprints[i])
if(fingerprints && !fingerprints.len) del(fingerprints)
//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
fingerprints[full_print] = stringmerge(print, stars(full_print, (H.gloves ? rand(10,20) : rand(25,40))))
return 1
else
if(src.fingerprintslast != M.key)
src.fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key)
src.fingerprintslast = M.key
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
@@ -190,11 +188,10 @@
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
@@ -203,8 +200,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
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
B.viruses += newDisease
@@ -213,7 +210,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
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
newblood.viruses += newDisease
@@ -224,11 +221,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
@@ -251,7 +246,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(list(M.dna.unique_enzymes,M.dna.b_type))
this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
this.viruses += newDisease
@@ -261,6 +256,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["UNKNOWN BLOOD"] = "X*"
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
this.viruses += newDisease
@@ -281,12 +277,15 @@
if (!( src.flags ) & FPRINT)
return
if ( src.blood_DNA )
if (blood_DNA)
//Cleaning blood off of mobs
if (istype (src, /mob/living/carbon))
var/mob/living/carbon/M = src
del(M.blood_DNA)
if(ishuman(src))
var/mob/living/carbon/human/H = src
H.bloody_hands = 0
//Cleaning blood off of items
else if (istype (src, /obj/item))
@@ -295,6 +294,10 @@
if(O.blood_overlay)
O.overlays.Remove(O.blood_overlay)
if(istype(src, /obj/item/clothing/gloves))
var/obj/item/clothing/gloves/G = src
G.transfer_blood = 0
//Cleaning blood off of turfs
else if (istype(src, /turf/simulated))
var/turf/simulated/T = src
@@ -307,25 +310,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))
+4
View File
@@ -106,9 +106,13 @@
var/obj/item/weapon/storage/box/survival/Evipack = new /obj/item/weapon/storage/box/survival(H)
H.equip_if_possible(Evipack, H.slot_r_hand)
new /obj/item/weapon/fcardholder(Evipack)
H.equip_if_possible(new /obj/item/weapon/storage/box/evidence(H), H.slot_l_hand)
H.equip_if_possible(new /obj/item/device/detective_scanner(H), H.slot_r_store)
else
H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/weapon/fcardholder(H), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/weapon/storage/box/evidence(H), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/device/detective_scanner(H), H.slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
+2 -1
View File
@@ -797,7 +797,8 @@
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 = list()
B.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
bloodiness += 4
+5
View File
@@ -22,6 +22,8 @@
return
}
*/
if(istype(W, /obj/item/device/detective_scanner))
return
return src.attack_hand(user)
/obj/machinery/door_control/attack_hand(mob/user as mob)
@@ -103,6 +105,9 @@
return src.attack_hand(user)
/obj/machinery/driver_button/attackby(obj/item/weapon/W, mob/user as mob)
if(istype(W, /obj/item/device/detective_scanner))
return
return src.attack_hand(user)
/obj/machinery/driver_button/attack_hand(mob/user as mob)
+2
View File
@@ -985,6 +985,8 @@ About the new airlock wires panel:
if(src.isElectrified())
if(src.shock(user, 75))
return
if(istype(C, /obj/item/device/detective_scanner))
return
src.add_fingerprint(user)
if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density))
+2
View File
@@ -115,6 +115,8 @@
attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/device/detective_scanner))
return
if(src.operating || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them.
src.add_fingerprint(user)
if(!src.requiresID())
+2
View File
@@ -60,6 +60,8 @@
src.sd_SetLuminosity(0)
/obj/machinery/sparker/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/device/detective_scanner))
return
if (istype(W, /obj/item/weapon/screwdriver))
add_fingerprint(user)
src.disable = !src.disable
+4 -2
View File
@@ -580,7 +580,8 @@ 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 = list()
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?"
@@ -625,7 +626,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
var/obj/effect/rune/R = new /obj/effect/rune
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
R.blood_DNA = list(list(H.dna.unique_enzymes, H.dna.b_type))
R.blood_DNA = list()
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")
@@ -170,6 +170,8 @@
new /obj/item/weapon/storage/fcard_kit(src)
new /obj/item/weapon/fcardholder(src)
new /obj/item/weapon/clipboard(src)
new /obj/item/device/detective_scanner(src)
new /obj/item/weapon/storage/box/evidence(src)
return
+21 -19
View File
@@ -835,9 +835,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))
@@ -852,23 +851,26 @@
/obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user as mob)
switch(scanmode)
if(2)
if (!A.fingerprints)
user << "\blue Unable to locate any fingerprints on [A]!"
else
user << "\blue Isolated [A:fingerprints.len] fingerprints."
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"]
if(complete_prints.len < 1)
user << "\blue No intact prints found"
if(!istype(A, /obj/item/weapon/f_card))
if (!A.fingerprints)
user << "\blue Unable to locate any fingerprints on [A]!"
else
user << "\blue Found [complete_prints.len] intact prints"
for(var/i in complete_prints)
user << "\blue " + i
user << "\blue Isolated [A:fingerprints.len] fingerprints."
var/list/prints = A:fingerprints
var/list/complete_prints = list()
for(var/i in prints)
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]"
if(cartridge && cartridge.access_security)
cartridge.add_data(A)
user << "Data added to internal storage. Scan with a High-Resolution Scanner to retreive."
if(3)
if(!isnull(A.reagents))
+38
View File
@@ -30,6 +30,7 @@
var/list/powermonitors = list()
var/message1 // used for status_displays
var/message2
var/list/stored_data = list()
engineering
name = "Power-ON Cartridge"
@@ -598,6 +599,43 @@ Code:
else
menu += "ERROR: Unable to determine current location."
proc/add_data(atom/A as mob|obj|turf|area)
//I love hashtables.
var/list/data_entry = stored_data["\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 \the [get_area(A)]"
stored_data["\ref [A]"] = sum_list
return 0
/obj/item/weapon/cartridge/Topic(href, href_list)
..()
+162
View File
@@ -60,6 +60,168 @@ MASS SPECTROMETER
if(M)
M.invisibility = 2
/obj/item/device/detective_scanner
name = "Scanner"
desc = "Used to scan objects for DNA and fingerprints."
icon_state = "forensic1"
var/amount = 20.0
var/list/stored = list()
w_class = 3.0
item_state = "electronic"
flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
slot_flags = SLOT_BELT
attackby(obj/item/weapon/f_card/W as obj, mob/user as mob)
..()
if (istype(W, /obj/item/weapon/f_card))
if (W.fingerprints)
return
if (src.amount == 20)
return
if (W.amount + src.amount > 20)
src.amount = 20
W.amount = W.amount + src.amount - 20
else
src.amount += W.amount
//W = null
del(W)
add_fingerprint(user)
if (W)
W.add_fingerprint(user)
return
attack(mob/living/carbon/human/M as mob, mob/user as mob)
if (!ishuman(M))
user << "\red [M] is not human and cannot have the fingerprints."
return 0
if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
user << "\blue No fingerprints found on [M]"
return 0
else
if (src.amount < 1)
user << text("\blue Fingerprints scanned on [M]. Need more cards to print.")
else
src.amount--
var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
F.amount = 1
F.add_fingerprint(M)
F.icon_state = "fingerprint1"
F.name = text("FPrintC- '[M.name]'")
user << "\blue Done printing."
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)
del(M.blood_DNA)
else
user << "\blue Blood found on [M]. Analysing..."
spawn(15)
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(!in_range(A,user))
return
if(loc != user)
return
if(istype(A,/obj/machinery/computer/forensic_scanning)) //breaks shit.
return
if(istype(A,/obj/item/weapon/f_card))
user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\""
return
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/blood in A.blood_DNA)
user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
return
//General
if ((!A.fingerprints || !A.fingerprints.len) && !A.suit_fibers && !A.blood_DNA)
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\
"You hear a faint hum of electrical equipment.")
return 0
if(add_data(A))
user << "\blue Object already in internal memory. Consolidating data..."
return
//PRINTS
if(!A.fingerprints || !A.fingerprints.len)
if(A.fingerprints)
del(A.fingerprints)
else
user << "\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
//FIBERS
if(A.suit_fibers)
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
//Blood
if (A.blood_DNA)
user << "\blue Blood found on [A]. Analysing..."
spawn(15)
for(var/blood in A.blood_DNA)
user << "Blood type: \red [A.blood_DNA[blood]] \t \black DNA: \red [blood]"
if(prob(5))
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"You finish scanning \the [A].",\
"You hear a faint hum of electrical equipment.")
return 0
else
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]\n[user.gender == MALE ? "He" : "She"] seems to perk up slightly at the readout." ,\
"The results of the scan pique your interest.",\
"You hear a faint hum of electrical equipment, and someone making a thoughtful noise.")
return 0
return
proc/add_data(atom/A as mob|obj|turf|area)
//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 \the [get_area(A)]"
stored["\ref [A]"] = sum_list
return 0
/obj/item/device/healthanalyzer
name = "Health Analyzer"
icon_state = "health"
+4 -3
View File
@@ -51,12 +51,13 @@
gib.viruses += viruus
viruus.holder = gib
viruus.spread_type = CONTACT_FEET
gib.blood_DNA = list()
if(MobDNA)
gib.blood_DNA = list(list(MobDNA.unique_enzymes, MobDNA.b_type))
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
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)
+6 -11
View File
@@ -192,18 +192,13 @@ FINGERPRINT CARD
return
/obj/item/weapon/f_card/proc/display()
if(!fingerprints) return
if (!istype(src.fingerprints, /list))
src.fingerprints = params2list(src.fingerprints)
if (length(src.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"])
//Foreach goto(41)
return dat
else
if(!fingerprints || !fingerprints.len)
return "<B>There are no fingerprints on this card.</B>"
else
var/dat = "<B>Fingerprints on Card</B><HR>"
for(var/name in fingerprints)
dat += "[name]<BR>"
return dat
return
/*
+3 -3
View File
@@ -135,7 +135,7 @@ 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"]
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
@@ -147,7 +147,7 @@ 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("Non-Human DNA","A+"))
blood_prop.blood_DNA["Non-Human DNA"] = "A+"
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
blood_prop.viruses += newVirus
@@ -164,7 +164,7 @@ 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 STRUCTURE","X*"))
blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*"
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
blood_prop.viruses += newVirus
+1 -1
View File
@@ -12,7 +12,7 @@
icon_state = "detective"
item_state = "det_suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/cigpacket,/obj/item/weapon/lighter,/obj/item/device/taperecorder)
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/cigpacket,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+322 -406
View File
@@ -1,14 +1,13 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
//gloves w_uniform wear_suit shoes
atom/var/list/suit_fibers
atom/proc/add_fibers(mob/living/carbon/human/M)
if(M.gloves)
if(M.gloves.transfer_blood) //bloodied gloves transfer blood to touched objects
if(add_blood(M.gloves.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
M.gloves.transfer_blood--
if(M.gloves && istype(M.gloves,/obj/item/clothing/))
var/obj/item/clothing/gloves/G = M.gloves
if(G.transfer_blood) //bloodied gloves transfer blood to touched objects
if(add_blood(G.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
G.transfer_blood--
else if(M.bloody_hands)
if(add_blood(M.bloody_hands_mob))
M.bloody_hands--
@@ -49,31 +48,17 @@ 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
name = "High-Res Forensic Scanning Computer"
icon_state = "forensic"
var/obj/item/scanning
var/temp = ""
var/canclear = 1
var/authenticated = 0
var
obj/item/scanning
temp = ""
canclear = 1
authenticated = 0
//Here's the structure for files: each entry is a list, and entry one in that list is the string of their
//full and scrambled fingerprint. This acts as the method to arrange evidence. Each subsequent entry is list
@@ -83,14 +68,14 @@ obj/machinery/computer/forensic_scanning
// 3: All fibers on the object
// 4: All blood on the object
//This is then used to show what objects were used to "find" the full print, as well as the fibers on it.
var/list/files
list/files
//This holds objects (1) without prints, and their fibers(2) and blood(3).
var/list/misc
var/obj/item/weapon/f_card/card
list/misc
obj/item/weapon/f_card/card
var/scan_data = ""
var/scan_name = ""
var/scan_process = 0
scan_data = ""
scan_name = ""
scan_process = 0
req_access = list(access_forensics_lockers)
@@ -182,7 +167,7 @@ obj/machinery/computer/forensic_scanning
I.loc = src
else
usr << "Invalid Object Rejected."
if("card")
if("card") //Processing a fingerprint card.
var/mob/M = usr
var/obj/item/I = M.equipped()
if(!(I && istype(I,/obj/item/weapon/f_card)))
@@ -202,151 +187,137 @@ obj/machinery/computer/forensic_scanning
process_card()
else
usr << "\red Invalid Object Rejected."
if("database")
if("database") //Viewing all records in each 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>"
if("record")
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") //Viewing a record from the "files" database.
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>"
for(var/named in blood)
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [blood[named]], DNA: [named]<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("databaseprint") //Printing from the "files" database.
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++)
var/list/templist2 = blood[j]
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [templist2[2]], DNA: [templist2[1]]<br>"
for(var/named in blood)
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [blood[named]], DNA: [named]<br>"
else
usr << "ERROR. Database not found!<br>"
if("auxiliary")
if("auxiliary") //Viewing a record from the "misc" database.
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>"
for(var/named in blood)
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [blood[named]], DNA: [named]<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("auxiliaryprint") //Printing from the "misc" database.
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++)
var/list/templist2 = blood[j]
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [templist2[2]], DNA: [templist2[1]]<br>"
for(var/named in blood)
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [blood[named]], DNA: [named]<br>"
else
usr << "ERROR. Database not found!<br>"
if("scan")
@@ -379,57 +350,57 @@ obj/machinery/computer/forensic_scanning
scan_data = null
updateDialog()
return
scan_process = 0
scan_name = scanning.name
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>"
else
scan_data += "No Blood Found<br><br>"
if(!scanning.fingerprints)
scan_data += "No Fingerprints Found<br><br>"
else
var/list/L = scanning.fingerprints
scan_data += "Isolated [L.len] Fingerprints. Loaded into database.<br>"
add_data(scanning)
if(scanning)
scan_process = 0
scan_name = scanning.name
scan_data = "<u>[scanning]</u><br><br>"
if (scanning.blood_DNA)
scan_data += "Blood Found:<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)
scan_data += "No Fingerprints Found<br><br>"
else
var/list/L = scanning.fingerprints
scan_data += "Isolated [L.len] Fingerprints. Loaded into database.<br>"
add_data(scanning)
if(!scanning.suit_fibers)
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"
else*/
scan_data += "No Fibers/Materials Located<br>"
else
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"*/
if(!scanning.suit_fibers)
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"
else*/
scan_data += "No Fibers/Materials Located<br>"
else
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"*/
scan_data += "Fibers/Materials Found:<br>"
for(var/data in scanning.suit_fibers)
scan_data += "- [data]<br>"
if(istype(scanning,/obj/item/device/detective_scanner))
scan_data += "<br><b>Data transfered from Scanner to Database.</b><br>"
add_data_scanner(scanning)
else if(!scanning.fingerprints)
scan_data += "<br><b><a href='?src=\ref[src];operation=add'>Add to Database?</a></b><br>"
scan_data += "Fibers/Materials Found:<br>"
for(var/data in scanning.suit_fibers)
scan_data += "- [data]<br>"
if(istype(scanning,/obj/item/device/detective_scanner) || (istype(scanning, /obj/item/device/pda) && scanning:cartridge && scanning:cartridge.access_security))
scan_data += "<br><b>Data transfered from Scanner to Database.</b><br>"
add_data_scanner(scanning)
else if(!scanning.fingerprints)
scan_data += "<br><b><a href='?src=\ref[src];operation=add'>Add to Database?</a></b><br>"
else
temp = "Scan Failed: No Object"
if("print")
if("print") //Printing scan data
if(scan_data)
temp = "Scan Data Printed."
var/obj/item/weapon/paper/P = new(loc)
@@ -442,226 +413,151 @@ obj/machinery/computer/forensic_scanning
scan_data = ""
if("cancel")
scan_process = 0
if("add")
if("add") //Adding an object (Manually) to the database.
if(scanning)
add_data(scanning)
else
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])
W.stored = list()
for(var/atom/A in W.contents)
del(A)
proc/add_data_scanner(var/obj/item/device/W)
if(istype(W, /obj/item/device/detective_scanner))
if(W:stored)
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()
else if(istype(W, /obj/item/device/pda) && W:cartridge && W:cartridge.access_security)
if(W:cartridge.stored_data)
for(var/atom in W:cartridge.stored_data)
var/list/data = W:cartridge.stored_data[atom]
add_data_master(atom,data[1],data[2],data[3],data[4])
W:cartridge.stored_data = list()
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
var/backup_fibers
var/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(!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(!misc)
misc = list()
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]
else
var/list/templist[3]
templist[1] = atom_suit_fibers
templist[2] = atom_blood_DNA
templist[3] = atom_name
misc[atom_reference] = templist //Store it!
//Has prints.
if(atom_fingerprints)
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.len ? 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
for(var/main_print in atom_fingerprints)
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 (and give him this call stack)")
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
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)
@@ -673,34 +569,24 @@ 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
icon_state = "old"
name = "PowerScan Mk.I"
/*
obj/item/clothing/shoes/var
track_blood = 0
mob/living/carbon/human/track_blood_mob
track_blood_type
track_blood_type*/
mob/var
bloody_hands = 0
mob/living/carbon/human/bloody_hands_mob
@@ -711,30 +597,32 @@ obj/item/clothing/gloves/var
transfer_blood = 0
mob/living/carbon/human/bloody_hands_mob
/*
obj/effect/decal/cleanable/var
track_amt = 3
mob/blood_owner
/*
turf/Exited(mob/living/carbon/human/M)
if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
var/dofoot = 1
if(istype(M,/mob/living/simple_animal))
if(!(istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/constructwraith)))
dofoot = 0
if(!istype(src, /turf/space)) // Bloody tracks code starts here
var/dofoot = 1
if(istype(M,/mob/living/simple_animal))
if(!(istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/constructwraith)))
dofoot = 0
if(dofoot)
if(dofoot)
if(!istype(src, /turf/space)) // Bloody tracks code starts here
if(M.track_blood > 0)
M.track_blood--
src.add_bloody_footprints(M.track_blood_mob,1,M.dir,get_tracks(M),M.track_blood_type)
else if(istype(M,/mob/living/carbon/human))
if(M.shoes)
if(M.shoes.track_blood > 0)
M.shoes.track_blood--
src.add_bloody_footprints(M.shoes.track_blood_mob,1,M.dir,M.shoes.name,M.shoes.track_blood_type) // And bloody tracks end here
. = ..()
if(!istype(src, /turf/space)) // Bloody tracks code starts here
if(M.track_blood > 0)
M.track_blood--
src.add_bloody_footprints(M.track_blood_mob,1,M.dir,get_tracks(M),M.track_blood_type)
else if(istype(M,/mob/living/carbon/human))
if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = M.shoes
if(S.track_blood > 0)
S.track_blood--
src.add_bloody_footprints(S.track_blood_mob,1,M.dir,S.name,S.track_blood_type) // And bloody tracks end here
. = ..()
turf/Entered(mob/living/carbon/human/M)
if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
var/dofoot = 1
@@ -748,10 +636,11 @@ turf/Entered(mob/living/carbon/human/M)
M.track_blood--
src.add_bloody_footprints(M.track_blood_mob,0,M.dir,get_tracks(M),M.track_blood_type)
else if(istype(M,/mob/living/carbon/human))
if(M.shoes && !istype(src,/turf/space))
if(M.shoes.track_blood > 0)
M.shoes.track_blood--
src.add_bloody_footprints(M.shoes.track_blood_mob,0,M.dir,M.shoes.name,M.shoes.track_blood_type)
if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes) && !istype(src,/turf/space))
var/obj/item/clothing/shoes/S = M.shoes
if(S.track_blood > 0)
S.track_blood--
src.add_bloody_footprints(S.track_blood_mob,0,M.dir,S.name,S.track_blood_type)
for(var/obj/effect/decal/cleanable/B in src)
@@ -766,11 +655,12 @@ turf/Entered(mob/living/carbon/human/M)
track_type = "oil"
if(istype(M,/mob/living/carbon/human))
if(M.shoes)
M.shoes.add_blood(B.blood_owner)
M.shoes.track_blood_mob = B.blood_owner
M.shoes.track_blood = max(M.shoes.track_blood,8)
M.shoes.track_blood_type = track_type
if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = M.shoes
S.add_blood(B.blood_owner)
S.track_blood_mob = B.blood_owner
S.track_blood = max(S.track_blood,8)
S.track_blood_type = track_type
else
M.add_blood(B.blood_owner)
M.track_blood_mob = B.blood_owner
@@ -782,17 +672,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'
@@ -817,14 +707,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))
@@ -839,14 +728,15 @@ proc/get_tracks(mob/M)
else if(istype(M,/mob/living/carbon/alien/larva))
. = "small alien feet"
else
. = "an unknown creature"
*/
. = "an unknown creature"*/
proc/blood_incompatible(donor,receiver)
var/donor_antigen = copytext(donor,1,lentext(donor))
var/receiver_antigen = copytext(receiver,1,lentext(receiver))
var/donor_rh = findtext("+",donor)
var/receiver_rh = findtext("+",receiver)
var
donor_antigen = copytext(donor,1,lentext(donor))
receiver_antigen = copytext(receiver,1,lentext(receiver))
donor_rh = findtext("+",donor)
receiver_rh = findtext("+",receiver)
if(donor_rh && !receiver_rh) return 1
switch(receiver_antigen)
if("A")
@@ -859,16 +749,42 @@ proc/blood_incompatible(donor,receiver)
return 0
/obj/item/weapon/rag
New() // So I don't have to grab maplock
spawn(1)
new/obj/item/weapon/reagent_containers/glass/rag(loc)
del src
/obj/item/weapon/reagent_containers/glass/rag
name = "damp rag"
desc = "For cleaning up messes, I suppose."
desc = "For cleaning up messes, you suppose."
w_class = 1
icon = 'toy.dmi'
icon_state = "rag"
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5)
volume = 5
can_be_placed_into = null
attack(atom/target as obj|turf|area, mob/user as mob , flag)
if(ismob(target) && target.reagents && reagents.total_volume)
user.visible_message("\red \The [target] has been smothered with \the [src] by \the [user]!", "\red You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise")
src.reagents.reaction(target, TOUCH)
spawn(5) src.reagents.clear_reagents()
return
else
..()
afterattack(atom/A as obj|turf|area, mob/user as mob)
if(istype(A))
if(istype(A) && src in user)
user.visible_message("[user] starts to wipe down [A] with [src]!")
if(do_after(user,30))
user.visible_message("[user] finishes wiping off the [A]!")
A.clean_blood()
return
examine()
if (!usr)
return
usr << "That's \a [src]."
usr << desc
return
+28 -20
View File
@@ -1,8 +1,6 @@
//CONTAINS:
//Evidence bags and stuff
///////////
//Shamelessly ripped from Mini's old code.
/obj/item/weapon/evidencebag
name = "evidence bag"
desc = "An empty evidence bag."
@@ -10,30 +8,38 @@
icon_state = "evidenceobj"
w_class = 1
/* buggy and stuff
/obj/item/weapon/evidencebag/attackby(obj/item/weapon/O, mob/user as mob)
return src.afterattack(O, user)
*/
/obj/item/weapon/evidencebag/afterattack(obj/item/O, mob/user as mob)
if(!in_range(O,user))
return
if(istype(O, /obj/item/weapon/storage) && O in user)
return ..()
if(!(O && istype(O)) || O.anchored == 1)
user << "You can't put that inside the [src]!"
user << "You can't put that inside \the [src]!"
return ..()
if(O in user)
if(istype(O, /obj/item/weapon/evidencebag))
user << "You find putting an evidence bag in another evidence bag to be slightly absurd."
return
if(O in user && (user.l_hand != O && user.r_hand != O)) //If it is in their inventory, but not in their hands, don't grab it off of them.
user << "You are wearing that."
return
if(src.contents.len > 0)
if(contents.len)
user << "The [src] already has something inside it."
return ..()
if(istype(O.loc,/obj/item/weapon/storage))
var/obj/item/weapon/storage/U = O.loc
user.client.screen -= O
U.contents.Remove(O)
user << "You put the [O] inside the [src]."
user.visible_message("\The [user] puts \a [O] into \a [src]", "You put \the [O] inside \the [src].",\
"You hear a rustle as someone puts something into a plastic bag.")
icon_state = "evidence"
src.overlays += O
overlays += O
desc = "An evidence bag containing \a [O]. [O.desc]"
O.loc = src
w_class = O.w_class
@@ -41,17 +47,19 @@
/obj/item/weapon/evidencebag/attack_self(mob/user as mob)
if (src.contents.len > 0)
var/obj/item/I = src.contents[1]
user << "You take the [I] out of the [src]."
src.overlays -= I
I.loc = get_turf(user.loc)
if (contents.len)
var/obj/item/I = contents[1]
user.visible_message("\The [user] takes \a [I] out of \a [src]", "You take \the [I] out of \the [src].",\
"You hear someone rustle around in a plastic bag, and remove something.")
overlays -= I
user.put_in_hands(I)
w_class = 1
src.icon_state = "evidenceobj"
icon_state = "evidenceobj"
desc = "An empty evidence bag."
else
user << "[src] is empty."
src.icon_state = "evidenceobj"
user << "\The [src] is empty."
icon_state = "evidenceobj"
return
/obj/item/weapon/storage/box/evidence
@@ -145,8 +145,12 @@ emp_act
else if(H.w_uniform) H.w_uniform.add_blood(src)
if (H.gloves)
H.gloves.add_blood(H)
H.gloves:transfer_blood = 2
H.gloves:bloody_hands_mob = H
else
H.add_blood(H)
H.bloody_hands = 2
H.bloody_hands_mob = H
switch(hit_area)
if("head")//Harder to score a stun but if you do it lasts a bit longer
+11
View File
@@ -269,3 +269,14 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
return 0
/mob/proc/put_in_hands(var/obj/item/I) //A suprisingly useful proc. Allows a simple way to place an object in a mob's hands, or, if they are full, on the ground below them.
if(!r_hand)
I.loc = src
r_hand = I
I.layer = 20
else if(!l_hand)
I.loc = src
l_hand = I
I.layer = 20
else
I.loc = get_turf(src)
+9
View File
@@ -46,6 +46,15 @@ Stuff which is in development and not yet visible to players or just code relate
should be listed in the changelog upon commit tho. Thanks. -->
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
<div class="commit sansserif">
<h2 class="date">Friday, June 1st</h2>
<h3 class="author">SkyMarshal updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Readded fingerprints and detective work, after lots of debugging and optimization.</li>
<li class="rscadd">Any PDA with access to the Security Records can now, by the normal forensic scanner function, store data the same way as the detective's scanner. Scanning the PDA in the detective's computer will copy all scanned data into the database.</li>
<li class="wip">If something goes wrong, please contact SkyMarshal on the #bs12 channel on irc.sorcery.net</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">Friday, June 1st</h2>
+2 -2
View File
@@ -829,7 +829,7 @@
"apW" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"apX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"apY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/security/detectives_office)
"apZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"apZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/closet/secure_closet/detective,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"aqa" = (/turf/simulated/floor{dir = 10; icon_state = "carpetside"},/area/security/detectives_office)
"aqb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/floor{icon_state = "carpetside"},/area/security/detectives_office)
"aqc" = (/turf/simulated/floor{dir = 6; icon_state = "carpetside"},/area/security/detectives_office)
@@ -879,7 +879,7 @@
"aqU" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; frequency = 1439; icon_state = "off"; id_tag = null; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light/small,/obj/item/weapon/camera_test{desc = "A one use - polaroid camera. 30 photos left."; name = "detectives camera"; pictures_left = 30},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"aqV" = (/obj/structure/table/woodentable,/obj/item/ammo_magazine/c38,/obj/item/ammo_magazine/c38,/obj/item/weapon/gun/projectile/detective,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"aqW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"aqX" = (/obj/machinery/camera{c_tag = "Detective's Office"; dir = 1},/obj/structure/closet/secure_closet/detective,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"aqX" = (/obj/machinery/camera{c_tag = "Detective's Office"; dir = 1},/obj/machinery/computer/forensic_scanning,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"aqY" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/light,/obj/item/weapon/cartridge/lawyer,/turf/simulated/floor{icon_state = "wood"},/area/lawoffice)
"aqZ" = (/obj/structure/table/woodentable,/obj/machinery/camera{c_tag = "Law Office"; dir = 1; network = "SS13"},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/computer/security/telescreen{name = "Prison Monitor"; network = "Prison"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor{icon_state = "wood"},/area/lawoffice)
"ara" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/photocopier,/turf/simulated/floor{icon_state = "wood"},/area/lawoffice)
+2
View File
@@ -823,6 +823,8 @@
#include "code\modules\critters\critter_defenses.dm"
#include "code\modules\critters\critters.dm"
#include "code\modules\critters\hivebots\hivebot.dm"
#include "code\modules\detectivework\detective_work.dm"
#include "code\modules\detectivework\evidence.dm"
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"