MAJOR UPDATE: Detective/Fingerprints update

bugfix for wardrobes
blood type is now handled by datum/dna, and blood_DNA for atoms is a list of list, each sub list containing DNA and blood-type. (This allows multiple blood splatters)
added BS12 give command and explosives
Map update to remove blob spawn.
This commit is contained in:
SkyMarshal
2012-01-30 15:24:38 -07:00
parent 5dba3ccf88
commit 6648061dcb
31 changed files with 3717 additions and 3425 deletions

View File

@@ -38,7 +38,7 @@
U.contents.Remove(O)
user << "You put the [O] inside the [src]."
icon_state = "evidence"
src.underlays += O
src.overlays += O
desc = "An evidence bag containing \a [O]. [O.desc]"
O.loc = src
w_class = O.w_class
@@ -49,7 +49,7 @@
if (src.contents.len > 0)
var/obj/item/I = src.contents[1]
user << "You take the [I] out of the [src]."
src.underlays -= I
src.overlays -= I
I.loc = get_turf(user.loc)
w_class = 1
src.icon_state = "evidenceobj"

View File

@@ -5,6 +5,7 @@
icon_state = "wardrobe"
item_state = "wardrobe"
w_class = 4
layer = 2.9
var
descriptor = "various clothing."
@@ -34,7 +35,7 @@
examine()
set src in usr
..()
usr << "It claims to contain [contents.len ? descriptor : descriptor + "...but it looks empty"]"
usr << "It claims to contain [contents.len ? descriptor : descriptor + "... but it looks empty"]"
return
update_icon()
@@ -481,7 +482,6 @@
new /obj/item/weapon/pen(src)
new /obj/item/weapon/clipboard(src)
new /obj/item/device/pda/quartermaster(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/device/radio/headset/heads/qm(src)
new /obj/item/clothing/shoes/black(src)
@@ -497,7 +497,6 @@
new /obj/item/weapon/storage/box(BPK)
new /obj/item/weapon/pen(src)
new /obj/item/device/pda/quartermaster(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/under/rank/cargo(src)
@@ -518,7 +517,6 @@
new /obj/item/weapon/pickaxe(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/clothing/glasses/meson(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/device/radio/headset/headset_mine(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/under/rank/miner(src)

View File

@@ -53,20 +53,36 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
obj/machinery/computer/forensic_scanning
name = "High-Res Forensic Scanning Computer"
icon_state = "forensic"
var/obj/item/scanning
var/temp = ""
var/canclear = 1
var/authenticated = 0
var
obj/item/scanning
temp = ""
canclear = 1
authenticated = 0
var/scan_data = ""
var/scan_name = ""
var/scan_process = 0
//Here's the structure for files: each entry is a list, and entry one in that list is the string of their
//full and scrambled fingerprint. This acts as the method to arrange evidence. Each subsequent entry is list
//in the form (from entries):
// 1: Object
// 2: All prints on the object
// 3: All fibers on the object
// 4: All blood on the object
//This is then used to show what objects were used to "find" the full print, as well as the fibers on it.
list/files = list()
//This holds objects (1) without prints, and their fibers(2) and blood(3).
list/misc = list()
obj/item/weapon/f_card/card
scan_data = ""
scan_name = ""
scan_process = 0
req_access = list(access_forensics_lockers)
attack_ai(mob/user)
return attack_hand(user)
attack_hand(mob/user)
if(..())
return
@@ -100,8 +116,198 @@ obj/machinery/computer/forensic_scanning
dat += "<br><a href='?src=\ref[src];operation=erase'>{Erase Data}</a>"
user << browse(dat,"window=scanner")
onclose(user,"scanner")
ex_act()
return
proc/add_data_scanner(var/obj/item/device/detective_scanner/W as obj)
for(var/i = 1, i < W.stored.len, i++)
var/list/data = W.stored[i]
var/atom/A = new
A = W
world << "[A] at [A.loc]"
A.fingerprints = data[2]
A.suit_fibers = data[3]
A.blood_DNA = data[4]
add_data(A,1)
del(A)
proc/add_data(var/atom/A, var/override = 0)
//What follows is massive. It cross references all stored data in the scanner with the other stored data,
//and what is already in the computer. Not sure how bad the lag may/may not be.
if((!A.fingerprints || A.fingerprints.len < 1) && !override) //No prints
var/merged = 0
for(var/i = 1, i < misc.len, i++) //Lets see if we can find it.
var/list/templist = misc[i]
var/check = templist[1]
if(check == A) //There it is!
merged = 1
var/list/fibers = templist[2]
if(A.suit_fibers)
for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
var/test_print1 = A.suit_fibers[j]
var/found = 0
for(var/k = 1, k <= fibers.len, k++) //Lets see if the fiber is already in there
var/test_print2 = fibers[k]
if(test_print2 == test_print1) //It is! Do nothing!
found = 1
break
if(!found) //It isn't! Add!
fibers += A.suit_fibers[j]
var/list/blood = templist[3]
if(A.blood_DNA)
for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
var/test_print1 = A.blood_DNA[j]
var/found = 0
for(var/k = 1, k <= blood.len, k++) //Lets see if the fiber is already in there
var/test_print2 = blood[k]
if(test_print2 == test_print1) //It is! Do nothing!
found = 1
break
if(!found) //It isn't! Add!
blood += A.blood_DNA[j]
var/list/sum_list[3] //Pack it back up!
sum_list[1] = A
sum_list[2] = fibers
sum_list[3] = blood
misc[i] = sum_list //Store it!
break //We found it, we're done here.
if(!merged) //Nope! Guess we have to add it!
var/list/templist[4]
templist[1] = A
templist[2] = A.suit_fibers
templist[3] = A.blood_DNA
misc.len++
misc[misc.len] = templist //Store it!
return !merged
else //Has prints.
var/list/found_prints[A.fingerprints.len]
for(var/i = 1, i < found_prints.len, i++)
found_prints[i] = 0
for(var/i = 1, i < files.len, i++) //Lets see if we can find the owner of the prints
var/merged = 0
var/list/perp_list = files[i]
var/list/perp_prints = params2list(perp_list[1])
var/perp = perp_prints[1]
for(var/m = 1, m < A.fingerprints.len, m++) //Compare database prints with prints on object.
var/list/test_prints_list = params2list(A.fingerprints[m])
var/checker = test_prints_list[1]
if(checker == perp) //Found 'em! Merge!
found_prints[m] = 1
for(var/n = 2, n < perp_list.len, n++) //Lets see if it is already in the database
var/list/target = perp_list[n]
if(target[1] == A) //Found the original object!
merged = 1
var/list/prints = target[2]
if(A.fingerprints)
for(var/j = 1, j < A.fingerprints.len, j++) //Fingerprints~~~
var/list/print_test1 = params2list(A.fingerprints[j])
var/test_print1 = print_test1[1]
var/found = 0
for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there
var/list/print_test2 = params2list(prints[k])
var/test_print2 = print_test2[1]
if(test_print2 == test_print1) //It is! Merge!
prints[k] = test_print2 + "&" + stringmerge(print_test2[2],print_test1[2])
found = 1
break //We found it, we're done here.
if(!found) //It isn't! Add!
prints += A.fingerprints[j]
var/list/fibers = target[3]
if(A.suit_fibers)
for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
var/test_print1 = A.suit_fibers[j]
var/found = 0
for(var/k = 1, k <= fibers.len, k++) //Lets see if the fiber is already in there
var/test_print2 = fibers[k]
if(test_print2 == test_print1) //It is! Do nothing!
found = 1
break //We found it, we're done here.
if(!found) //It isn't! Add!
fibers += A.suit_fibers[j]
var/list/blood = target[4]
if(A.blood_DNA)
for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
var/test_print1 = A.blood_DNA[j]
var/found = 0
for(var/k = 1, k <= blood.len, k++) //Lets see if the blood is already in there
var/test_print2 = blood[k]
if(test_print2 == test_print1) //It is! Do nothing!
found = 1
break //We found it, we're done here.
if(!found) //It isn't! Add!
blood += A.blood_DNA[j]
var/list/sum_list[4] //Pack it back up!
sum_list[1] = A
sum_list[2] = prints
sum_list[3] = fibers
sum_list[4] = blood
perp_list[n] = sum_list //Store it!
files[i] = perp_list
break //We found it, we're done here.
if(merged)
update_fingerprints(i) //Lets update the calculated sum of the stored prints.
for(var/m = 1, m < found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint!
if(found_prints.len[m] == 0)
var/list/newperp[2]
var/list/sum_list
sum_list[1] = A
sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers
sum_list[4] = A.blood_DNA
newperp[2] = sum_list
newperp[1] = A.fingerprints[m]
files.len++
files[files.len] = newperp
return
proc/update_fingerprints(var/index) //I am tired, but this updates the master print, which is used to determine completion of a print.
if(!index)
return
var/list/perp_list = files[1]
var/list/perp_prints = params2list(perp_list[1])
var/perp = perp_prints[1]
var/list/found_prints = list()
for(var/i = 2, i < perp_list.len, i++)
var/list/test_list = perp_list[i]
var/list/test_prints = test_list[2]
for(var/j = 1, j < test_prints.len)
var/list/test_list_2 = params2list(test_prints[j])
var/test_prints_2 = test_list_2[1]
if(test_prints_2 == perp)
found_prints += test_list_2[2]
break
for(var/prints in found_prints)
perp_prints[2] = stringmerge(perp_prints[2],prints)
perp_list[1] = perp + "&" + perp_prints[2]
files[1] = perp_list
return
// attackby(var/obj/item/device/detective_scanner/W as obj, mob/user as mob)
// ..()
// if (istype(W, /obj/item/device/detective_scanner))
//
//What follows is massive. It cross references all stored data in the scanner with the other stored data,
//and what is already in the computer. Not sure how bad the lag may/may not be.
//
// var/list/data = W.stored
// if(files.len || misc.len)
//
//
//
// else
//
//
// src.add_fingerprint(user)
// if (W)
// W.add_fingerprint(user)
// return
Topic(href,href_list)
switch(href_list["operation"])
if("login")
@@ -135,7 +341,7 @@ obj/machinery/computer/forensic_scanning
if(istype(I, /obj/item/weapon/evidencebag))
scanning = I.contents[1]
scanning.loc = src
I.underlays = null
I.overlays -= scanning
I.icon_state = "evidenceobj"
else
scanning = I
@@ -174,20 +380,20 @@ obj/machinery/computer/forensic_scanning
scan_data = "<u>[scanning]</u><br><br>"
if (scanning.blood_DNA)
scan_data += "Blood Found:<br>"
scan_data += "-Blood type: [scanning.blood_type]\nDNA: [scanning.blood_DNA]<br><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 ))
if (!( scanning.fingerprints.len ))
scan_data += "No Fingerprints Found<br><br>"
else
var/list/L = params2list(scanning.fingerprints)
scan_data += "Isolated [L.len] Fingerprints:<br>"
for(var/i in L)
scan_data += "#[L.Find(i)] - [i]<br>"
scan_data += "<br>"
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))
if(!scanning.suit_fibers.len)
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
@@ -195,21 +401,25 @@ obj/machinery/computer/forensic_scanning
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"
else
else*/
scan_data += "No Fibers/Materials Located<br>"
else
if(istype(scanning,/obj/item/device/detective_scanner))
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"
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>"
else if(!scanning.fingerprints.len)
scan_data += "<br><b><a href='?src=\ref[src];operation=add'>Add to Database?</a></b><br>"
else
temp = "Scan Failed: No Object"
@@ -227,6 +437,11 @@ obj/machinery/computer/forensic_scanning
scan_data = ""
if("cancel")
scan_process = 0
if("add")
if(scanning)
add_data(scanning)
else
temp = "Data Transfer Failed: No Object."
updateUsrDialog()
detective
@@ -295,8 +510,8 @@ turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
T.desc = "These bloody footprints appear to have been made by [info]."
if(istype(M,/mob/living/carbon/human))
T.blood_DNA = M.dna.unique_enzymes
T.blood_type = M.b_type
T.blood_DNA.len++
T.blood_DNA[T.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
return
var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
this.icon = 'footprints.dmi'
@@ -307,8 +522,8 @@ turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
this.dir = d
this.desc = "These bloody footprints appear to have been made by [info]."
if(istype(M,/mob/living/carbon/human))
this.blood_DNA = M.dna.unique_enzymes
this.blood_type = M.b_type
this.blood_DNA.len++
this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
proc/get_tracks(mob/M)
if(istype(M,/mob/living))

View File

@@ -5,8 +5,7 @@
var/list/fingerprints
var/list/fingerprintshidden = new/list()
var/fingerprintslast = null
var/blood_DNA = null
var/blood_type = null
var/list/blood_DNA = null
var/last_bumped = 0
var/pass_flags = 0

View File

@@ -13,6 +13,7 @@
var/health = 100 //Might be a bit much, dono can always change later //Nerfed -Pete
var/lastbang //
var/lasttry = 0
layer = 2.8
/obj/structure/closet/acloset
name = "Strange closet"

View File

@@ -49,8 +49,7 @@
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
var/list/viruses = list()
blood_DNA = null
blood_type = null
blood_DNA = list()
var/datum/disease2/disease/virus2 = null
var/OriginalMob = null

View File

@@ -1512,3 +1512,15 @@ proc/get_opposite(var/checkdir)
else //The lists disagree, Uh-oh!
return 0
return newtext
/proc/stringpercent(var/text,character = "*")
//This proc returns the number of chars of the string that is the character
//This is used for detective work to determine fingerprint completion.
if(!text || !character)
return 0
var/count = 0
for(var/i = 1, i < lentext(text), i++)
var/a = copytext(text,i,i+1)
if(a == character)
count++
return count

View File

@@ -88,7 +88,6 @@
var/mob/living/carbon/human/H = M
if (!istype(H.dna, /datum/dna))
return 0
world << md5(H.dna.uni_identity)
if (H.gloves)
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
@@ -112,6 +111,8 @@
new_prints = i
prints = L[2]
break
else
src.fingerprints[i] = L[1] + "&" + stars(L[2], rand(90,95))
if(new_prints)
src.fingerprints[new_prints] = list(text("[]&[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), rand(40,60)))))
return 1
@@ -139,8 +140,8 @@
I.Blend(new /icon('blood.dmi', "itemblood"),ICON_MULTIPLY)
I.Blend(new /icon(src.icon, src.icon_state),ICON_UNDERLAY)
src.icon = I
src.blood_DNA = M.dna.unique_enzymes
src.blood_type = M.b_type
src.blood_DNA.len++
src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes, M.b_type)
else if (istype(src, /turf/simulated))
var/turf/simulated/source2 = src
var/list/objsonturf = range(0,src)
@@ -149,16 +150,16 @@
if(istype(objsonturf[i],/obj/effect/decal/cleanable/blood))
return
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source2)
this.blood_DNA = M.dna.unique_enzymes
this.blood_type = M.b_type
this.blood_DNA.len++
this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes, M.b_type)
this.virus2 = M.virus2
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
this.viruses += newDisease
newDisease.holder = this
else if (istype(src, /mob/living/carbon/human))
src.blood_DNA = M.dna.unique_enzymes
src.blood_type = M.b_type
src.blood_DNA.len++
src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
else
return
else

View File

@@ -4,7 +4,7 @@
var/struc_enzymes = null
var/uni_identity = null
var/original_name = "Unknown"
var/b_type
var/b_type = "A+"
/datum/dna/proc/check_integrity()
//Lazy.

View File

@@ -53,7 +53,9 @@ Devices and Tools;
/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox;
/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module;
/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator;
/obj/item/weapon/plastique:2:C-4;
/obj/item/weapon/plastique:2:C-4 (Destroys walls);
/obj/item/weapon/syndie/c4explosive:4:Low Power Explosive Charge, with Detonator;
/obj/item/weapon/syndie/c4explosive/heavy:7:High (!) Power Explosive Charge, with Detonator;
/obj/item/device/powersink:5:Powersink (DANGER!);
/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!);
Whitespace:Seperator;

View File

@@ -82,7 +82,6 @@
H.equip_if_possible(new /obj/item/clothing/under/rank/cargo(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/quartermaster(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(H), H.slot_glasses)
H.equip_if_possible(new /obj/item/weapon/clipboard(H), H.slot_r_store)
return 1
@@ -104,7 +103,6 @@
H.equip_if_possible(new /obj/item/clothing/under/rank/cargo(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/quartermaster(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
return 1
@@ -124,7 +122,6 @@
H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/miner(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
H.equip_if_possible(new /obj/item/weapon/crowbar(H), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/weapon/satchel(H), H.slot_in_backpack)
return 1

View File

@@ -805,8 +805,8 @@
H.apply_damage(0.5*damage, BRUTE, "r_arm")
var/obj/effect/decal/cleanable/blood/B = new(src.loc)
B.blood_DNA = H.dna.unique_enzymes
B.blood_type = H.b_type
B.blood_DNA.len++
B.blood_DNA[B.blood_DNA.len] = list(H.dna.unique_enzymes, H.b_type)
bloodiness += 4

View File

@@ -555,8 +555,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
R.word2 = w2
R.word3 = w3
R.check_icon()
R.blood_DNA = H.dna.unique_enzymes
R.blood_type = H.b_type
R.blood_DNA.len++
R.blood_DNA[R.blood_DNA.len] = list(H.dna.unique_enzymes, H.b_type)
return
else
user << "The book seems full of illegible scribbles. Is this a joke?"
@@ -601,8 +601,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
var/obj/effect/rune/R = new /obj/effect/rune
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
R.blood_DNA = H.dna.unique_enzymes
R.blood_type = H.b_type
R.blood_DNA.len++
R.blood_DNA[R.blood_DNA.len] = list(H.dna.unique_enzymes, H.b_type)
switch(r)
if("teleport")
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")

View File

@@ -898,7 +898,7 @@ var/list/sacrificed = list()
culcount++
if(culcount >= 5)
for(var/obj/effect/rune/R in world)
if(R.blood_DNA == src.blood_DNA && R.blood_type == src.blood_type)
if(R.blood_DNA == src.blood_DNA)
for(var/mob/living/M in orange(2,R))
M.take_overall_damage(0,15)
if (R.invisibility>M.see_invisible)
@@ -908,7 +908,7 @@ var/list/sacrificed = list()
var/turf/T = get_turf(R)
T.hotspot_expose(700,125)
for(var/obj/effect/decal/cleanable/blood/B in world)
if(B.blood_DNA == src.blood_DNA && B.blood_type == src.blood_type)
if(B.blood_DNA == src.blood_DNA)
for(var/mob/living/M in orange(1,B))
M.take_overall_damage(0,5)
M << "\red Blood suddenly ignites, burning you!"

View File

@@ -21,7 +21,6 @@
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
b.blood_DNA = blood_DNA
b.blood_type = blood_type
b.OriginalMob = OriginalMob
for(var/datum/disease/D in src.viruses)
b.viruses += D

View File

@@ -743,7 +743,9 @@
else
user << "\blue Blood found on [C]. Analysing..."
spawn(15)
user << "\blue Blood type: [C:blood_type]\nDNA: [C:blood_DNA]"
for(var/i = 1, i < C:blood_DNA.len, i++)
var/list/templist = C:blood_DNA[i]
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
if(4)
for (var/mob/O in viewers(C, null))
@@ -761,10 +763,9 @@
if (!A.fingerprints)
user << "\blue Unable to locate any fingerprints on [A]!"
else
var/list/L = params2list(A:fingerprints)
user << "\blue Isolated [L.len] fingerprints."
for(var/i in L)
user << "\blue \t [i]"
user << "\blue Isolated [A:fingerprints.len] fingerprints."
// for(var/i in L)
// user << "\blue \t [i]"
if(3)
if(!isnull(A.reagents))

View File

@@ -65,20 +65,14 @@ MASS SPECTROMETER
icon_state = "forensic0"
var/amount = 20.0
var/printing = 0.0
var/fibers_index = 0
var/list/stored_fibers = list()
var/list/stored_name = list()
var/prints_index = 0
var/list/stored_prints = list()
var/list/prints_name = list()
var/list/stored = list()
w_class = 3.0
item_state = "electronic"
flags = FPRINT | TABLEPASS | ONBELT | CONDUCT | USEDELAY
/obj/item/device/detective_scanner/attackby(obj/item/weapon/f_card/W as obj, mob/user as mob)
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
@@ -96,8 +90,7 @@ MASS SPECTROMETER
W.add_fingerprint(user)
return
/obj/item/device/detective_scanner/attack_self(mob/user as mob)
attack_self(mob/user as mob)
src.printing = !( src.printing )
if(src.printing)
user << "\blue Printing turned on"
@@ -107,8 +100,7 @@ MASS SPECTROMETER
add_fingerprint(user)
return
/obj/item/device/detective_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob)
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
@@ -134,56 +126,129 @@ MASS SPECTROMETER
else
user << "\blue Blood found on [M]. Analysing..."
spawn(15)
user << "\blue Blood type: [M.blood_type]\nDNA: [M.blood_DNA]"
for(var/i = 1, i < M.blood_DNA.len, i++)
var/list/templist = M.blood_DNA[i]
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
return
/obj/item/device/detective_scanner/afterattack(atom/A as mob|obj|turf|area, mob/user as mob)
afterattack(atom/A as mob|obj|turf|area, mob/user as mob)
if(src.loc != user)
return 0
src.add_fingerprint(user)
if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
if(A.blood_DNA)
user << "\blue Blood type: [A.blood_type]\nDNA: [A.blood_DNA]"
if(!isnull(A.blood_DNA.len))
for(var/i = 1, i < A.blood_DNA.len, i++)
var/list/templist = A.blood_DNA[i]
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
return
if (!( A.fingerprints ) && !(A.suit_fibers) && !(A.blood_DNA))
user << "\blue Unable to locate any fingerprints, materials, fibers, or fingerprints on [A]!"
user << "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!"
return 0
else if (A.blood_DNA)
user << "\blue Blood found on [A]. Analysing..."
sleep(15)
user << "\blue Blood type: [A.blood_type]\nDNA: [A.blood_DNA]"
var/duplicate = add_data(A)
if(duplicate)
user << "\blue Blood already in memory."
for(var/i = 1, i < A.blood_DNA.len, i++)
var/list/templist = A.blood_DNA[i]
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
else
user << "\blue No blood found on [A]."
user << "\blue No Blood Located"
if(!( A.fingerprints ))
user << "\blue Unable to locate any fingerprints on [A]!"
user << "\blue No Fingerprints Located."
else
var/list/L = params2list(A.fingerprints)
stored_prints[prints_index] = L
prints_name[prints_index] = A.name
user << text("\blue Isolated [L.len] fingerprints. Stored in memory.")
user << text("\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve.")
var/duplicate = add_data(A)
if(duplicate)
user << "\blue Figerprints already in memory."
if(!A.suit_fibers)
user << "\blue No Fibers/Materials Located."
else
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
stored_fibers[fibers_index] = A.suit_fibers
stored_name[fibers_index] = A.name
// else
// if ((src.amount < 1 && src.printing))
// user << "\blue Fingerprints found. Need more cards to print."
// src.printing = 0
// src.icon_state = text("forensic[]", src.printing)
// if (src.printing)
// src.amount--
// var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
// F.amount = 1
// F.fingerprints = A.fingerprints
// F.icon_state = "fingerprint1"
// user << "\blue Done printing."
// for(var/i in L)
// user << text("\blue \t [i]")
// //Foreach goto(186)
var/duplicate = add_data(A)
if(duplicate)
user << "\blue Fibers/Materials already in memory."
// else
// if ((src.amount < 1 && src.printing))
// user << "\blue Fingerprints found. Need more cards to print."
// src.printing = 0
// src.icon_state = text("forensic[]", src.printing)
// if (src.printing)
// src.amount--
// var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
// F.amount = 1
// F.fingerprints = A.fingerprints
// F.icon_state = "fingerprint1"
// user << "\blue Done printing."
// for(var/i in L)
// user << text("\blue \t [i]")
// //Foreach goto(186)
return
proc/add_data(atom/A as mob|obj|turf|area)
var/merged = 0
for(var/i = 1, i < stored.len, i++) //Lets see if the object is already in there!
var/list/temp = stored[i]
var/checker = temp[1]
if(checker == A) //It is! Merge!
merged = 1
var/list/prints = temp[2]
if(A.fingerprints)
for(var/j = 1, j < A.fingerprints.len, j++) //Fingerprints~~~
var/list/print_test1 = params2list(A.fingerprints[j])
var/test_print1 = print_test1[1]
var/found = 0
for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there
var/list/print_test2 = params2list(prints[k])
var/test_print2 = print_test2[1]
if(test_print2 == test_print1) //It is! Merge!
prints[k] = test_print2 + "&" + stringmerge(print_test2[2],print_test1[2])
found = 1
break //We found it, we're done here.
if(!found) //It isn't! Add!
prints += A.fingerprints[j]
var/list/fibers = temp[3]
if(A.suit_fibers)
for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
var/test_print1 = A.suit_fibers[j]
var/found = 0
for(var/k = 1, k <= fibers.len, k++) //Lets see if the fiber is already in there
var/test_print2 = fibers[k]
if(test_print2 == test_print1) //It is! Do nothing!
found = 1
break //We found it, we're done here.
if(!found) //It isn't! Add!
fibers += A.suit_fibers[j]
var/list/blood = temp[4]
if(A.blood_DNA)
for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
var/test_print1 = A.blood_DNA[j]
var/found = 0
for(var/k = 1, k <= blood.len, k++) //Lets see if the blood is already in there
var/test_print2 = blood[k]
if(test_print2 == test_print1) //It is! Do nothing!
found = 1
break //We found it, we're done here.
if(!found) //It isn't! Add!
blood += A.blood_DNA[j]
var/list/sum_list[4] //Pack it back up!
sum_list[1] = A
sum_list[2] = prints
sum_list[3] = fibers
sum_list[4] = blood
stored[i] = sum_list //Store it!
break //We found it, we're done here.
if(!merged) //Uh, oh! New data point!
var/list/sum_list[4] //Pack it back up!
sum_list[1] = A
sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers
sum_list[4] = A.blood_DNA
stored.len++
stored[stored.len] = sum_list
return !merged
/obj/item/device/healthanalyzer
name = "Health Analyzer"
@@ -198,7 +263,7 @@ MASS SPECTROMETER
m_amt = 200
origin_tech = "magnets=1;biotech=1"
/obj/item/device/healthanalyzer/attack(mob/M as mob, mob/user as mob)
attack(mob/M as mob, mob/user as mob)
if ((user.mutations & CLUMSY || user.getBrainLoss() >= 60) && prob(50))
user << text("\red You try to analyze the floor's vitals!")
for(var/mob/O in viewers(M, null))

View File

@@ -51,9 +51,8 @@
viruus.holder = gib
viruus.spread_type = CONTACT_FEET
if(MobDNA)
gib.blood_DNA = MobDNA.unique_enzymes
if(MobDNA.b_type)
gib.blood_type = MobDNA.b_type
gib.blood_DNA.len++
gib.blood_DNA[gib.blood_DNA.len] = list(MobDNA.unique_enzymes, MobDNA.b_type)
if(MobDNA.original_name != "Unknown")
gib.OriginalMob = MobDNA.original_name
var/list/directions = gibdirections[i]

View File

@@ -82,7 +82,6 @@
/obj/item/stack/proc/copy_evidences(obj/item/stack/from as obj)
src.blood_DNA = from.blood_DNA
src.blood_type = from.blood_type
src.fingerprints = from.fingerprints
src.fingerprintshidden = from.fingerprintshidden
src.fingerprintslast = from.fingerprintslast

View File

@@ -1690,7 +1690,7 @@
dat += "<table cellspacing=5><tr><th>Name</th><th>DNA</th><th>Blood Type</th></tr>"
for(var/mob/living/carbon/human/H in world)
if(H.dna && H.ckey)
dat += "<tr><td>[H]</td><td>[H.dna.unique_enzymes]</td><td>[H.b_type]</td></tr>"
dat += "<tr><td>[H]</td><td>[H.dna.unique_enzymes]</td><td>[H.dna.b_type]</td></tr>"
dat += "</table>"
usr << browse(dat, "window=DNA;size=440x410")
if("fingerprints")

View File

@@ -21,7 +21,12 @@
var/list/replacechars = list("'","\"",">","<","(",")")
for(var/rep in replacechars)
msg = dd_list2text((dd_text2list(msg, rep)))
var/list/temp = dd_text2list(msg, rep)
if(temp.len > 1)
for(var/i = 1, i < temp.len, i++)
world << temp[i]
temp[i] = copytext(temp[i],1,lentext(temp[i]))
msg = dd_list2text(temp)
world << msg
send2adminirc("#bs12admin","HELP: [src.key]: [msg]")
if(tension_master)

View File

@@ -339,7 +339,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
new_character.name = record_found.fields["name"]
new_character.gender = record_found.fields["sex"]//Sex
new_character.age = record_found.fields["age"]//Age
new_character.b_type = record_found.fields["b_type"]//Blood type
new_character.dna.b_type = record_found.fields["b_type"]//Blood type
//We will update their appearance when determining DNA.
else
new_character.gender = MALE

View File

@@ -149,8 +149,8 @@ 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 = self.data["blood_DNA"]
blood_prop.blood_type = self.data["blood_type"]
blood_prop.blood_DNA.len++
blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list(self.data["blood_DNA"], self.data["blood_type"])
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
@@ -174,7 +174,7 @@ datum
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA = self.data["blood_DNA"]
blood_prop.blood_DNA = list(self.data["blood_DNA"])
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
blood_prop.viruses += newVirus
@@ -191,7 +191,7 @@ datum
var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA = self.data["blood_DNA"]
blood_prop.blood_DNA = list(self.data["blood_DNA"])
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
blood_prop.viruses += newVirus

View File

@@ -950,8 +950,7 @@
if(T.resistances&&T.resistances.len)
B.data["resistances"] = T.resistances.Copy()
if(istype(target, /mob/living/carbon/human))//I wish there was some hasproperty operation...
var/mob/living/carbon/human/HT = target
B.data["blood_type"] = copytext(HT.b_type,1,0)
B.data["blood_type"] = copytext(T.dna.b_type,1,0)
var/list/temp_chem = list()
for(var/datum/reagent/R in target.reagents.reagent_list)
temp_chem += R.name

View File

@@ -379,7 +379,7 @@
if (!t1)
t1 = wear_suit.icon_state
overlays += image("icon" = 'mob.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (wear_suit.blood_DNA)
if (wear_suit.blood_DNA.len)
if (istype(wear_suit, /obj/item/clothing/suit/armor))
overlays += image("icon" = 'blood.dmi', "icon_state" = "armorblood[!lying ? "" : "2"]", "layer" = MOB_LAYER)
else
@@ -404,7 +404,7 @@
if (!t1)
t1 = head.icon_state
overlays += image("icon" = 'mob.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (head.blood_DNA)
if (head.blood_DNA.len)
overlays += image("icon" = 'blood.dmi', "icon_state" = "helmetblood[!lying ? "" : "2"]", "layer" = MOB_LAYER)
head.screen_loc = ui_oclothing

View File

@@ -21,7 +21,7 @@
var/b_eyes = 0.0
var/s_tone = 0.0
var/age = 30.0
var/b_type = "A+"
var/b_type
var/obj/item/clothing/suit/wear_suit = null
var/obj/item/clothing/under/w_uniform = null

View File

@@ -303,7 +303,7 @@
G.fields["fingerprint"] = text("[]", md5(H.dna.uni_identity))
G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable"
M.fields["b_type"] = text("[]", H.b_type)
M.fields["b_type"] = text("[]", H.dna.b_type)
M.fields["b_dna"] = H.dna.unique_enzymes
M.fields["mi_dis"] = "None"
M.fields["mi_dis_d"] = "No minor disabilities have been declared."
@@ -327,7 +327,7 @@
L.fields["age"] = H.age
L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]")
L.fields["rank"] = H.mind.assigned_role
L.fields["b_type"] = H.b_type
L.fields["b_type"] = H.dna.b_type
L.fields["b_dna"] = H.dna.unique_enzymes
L.fields["enzymes"] = H.dna.struc_enzymes
L.fields["identity"] = H.dna.uni_identity

View File

@@ -669,7 +669,7 @@ datum/preferences
character.gender = gender
character.age = age
character.b_type = b_type
character.dna.b_type = b_type
character.r_eyes = r_eyes
character.g_eyes = g_eyes

View File

@@ -92,8 +92,8 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
if(!istype(H))
return
if(H.dna)
blood_DNA = H.dna.unique_enzymes
blood_type = H.b_type
blood_DNA.len++
blood_DNA[blood_DNA.len] = list(H.dna.unique_enzymes, H.dna.b_type)
var/icon/I = new /icon(icon, icon_state)

View File

@@ -65,7 +65,9 @@
if ( !(H.blood_DNA) )
dat += "\blue No blood found on [H]\n"
else
dat += "\blue Blood type: [H.blood_type]\nDNA: [H.blood_DNA]\n"
for(var/i = 1, i < H.blood_DNA.len, i++)
var/list/templist = H.blood_DNA[i]
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
if (!A.fingerprints)
dat += "\blue Unable to locate any fingerprints on [A]!\n"

File diff suppressed because it is too large Load Diff