mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Merge branch 'master' of git://github.com/Baystation12/Baystation12
Signed-off-by: CaelAislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
@@ -19,5 +19,5 @@
|
||||
user << "The [src] is empty."
|
||||
return
|
||||
var/obj/item/weapon/paper/P = input(user,"Choose a sheet to take out.","[src]", "Cancel") as null|obj in src.contents
|
||||
if(in_range(src,user))
|
||||
if(!isnull(P) && in_range(src,user))
|
||||
P.loc = user.loc
|
||||
74
code/WorkInProgress/SkyMarshal/evidence.dm
Normal file
74
code/WorkInProgress/SkyMarshal/evidence.dm
Normal file
@@ -0,0 +1,74 @@
|
||||
//CONTAINS:
|
||||
//Evidence bags and stuff
|
||||
///////////
|
||||
//Shamelessly ripped from Mini's old code.
|
||||
|
||||
/obj/item/weapon/evidencebag
|
||||
name = "evidence bag"
|
||||
desc = "An empty evidence bag."
|
||||
icon = 'storage.dmi'
|
||||
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(istype(O, /obj/item/weapon/storage) && O in user)
|
||||
user << "You put the evidence bag into the [O]."
|
||||
return ..()
|
||||
if(!(O && istype(O)) || O.anchored == 1)
|
||||
user << "You can't put that inside the [src]!"
|
||||
return ..()
|
||||
if(O in user)
|
||||
user << "You are wearing that."
|
||||
return
|
||||
if(src.contents.len > 0)
|
||||
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)
|
||||
if(istype(O.loc,/obj/item/clothing/suit/storage/))
|
||||
var/obj/item/clothing/suit/storage/U = O.loc
|
||||
user.client.screen -= O
|
||||
U.contents.Remove(O)
|
||||
user << "You put the [O] inside the [src]."
|
||||
icon_state = "evidence"
|
||||
src.overlays += O
|
||||
desc = "An evidence bag containing \a [O]. [O.desc]"
|
||||
O.loc = src
|
||||
w_class = O.w_class
|
||||
return
|
||||
|
||||
|
||||
/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)
|
||||
w_class = 1
|
||||
src.icon_state = "evidenceobj"
|
||||
desc = "An empty evidence bag."
|
||||
else
|
||||
user << "[src] is empty."
|
||||
src.icon_state = "evidenceobj"
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/box/evidence
|
||||
name = "evidence bag box"
|
||||
desc = "A box claiming to contain evidence bags."
|
||||
New()
|
||||
new /obj/item/weapon/evidencebag(src)
|
||||
new /obj/item/weapon/evidencebag(src)
|
||||
new /obj/item/weapon/evidencebag(src)
|
||||
new /obj/item/weapon/evidencebag(src)
|
||||
new /obj/item/weapon/evidencebag(src)
|
||||
new /obj/item/weapon/evidencebag(src)
|
||||
new /obj/item/weapon/f_card(src)
|
||||
..()
|
||||
return
|
||||
@@ -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)
|
||||
|
||||
@@ -49,24 +49,42 @@ 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
|
||||
|
||||
#define 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
|
||||
|
||||
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
|
||||
//This holds objects (1) without prints, and their fibers(2) and blood(3).
|
||||
list/misc
|
||||
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
|
||||
@@ -86,22 +104,217 @@ obj/machinery/computer/forensic_scanning
|
||||
if(scanning)
|
||||
if(scan_process)
|
||||
dat += "Scan Object: {[scanning.name]}<br>"
|
||||
dat += "<a href='?src=\ref[src];operation=cancel'>{Cancel Scan}</a> {Print}<br><br>"
|
||||
dat += "<a href='?src=\ref[src];operation=cancel'>{Cancel Scan}</a> {Print}<br>"
|
||||
else
|
||||
if(isai) dat += "Scan Object: {[scanning.name]}<br>"
|
||||
else dat += "Scan Object: <a href='?src=\ref[src];operation=eject'>{[scanning.name]}</a><br>"
|
||||
dat += "<a href='?src=\ref[src];operation=scan'>{Scan}</a> <a href='?src=\ref[src];operation=print'>{Print}</a><br><br>"
|
||||
dat += "<a href='?src=\ref[src];operation=scan'>{Scan}</a> <a href='?src=\ref[src];operation=print'>{Print}</a><br>"
|
||||
else
|
||||
if(isai) dat += "{No Object Inserted}<br>"
|
||||
else dat += "<a href='?src=\ref[src];operation=insert'>{No Object Inserted}</a><br>"
|
||||
dat += "{Scan} <a href='?src=\ref[src];operation=print'>{Print}</a><br><br>"
|
||||
dat += "{Scan} <a href='?src=\ref[src];operation=print'>{Print}</a><br>"
|
||||
dat += "<a href='?src=\ref[src];operation=database'>{Access Database}</a><br><br>"
|
||||
dat += "<tt>[scan_data]</tt>"
|
||||
if(scan_data && !scan_process)
|
||||
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)
|
||||
for(var/i = 1, i < (W.stored.len + 1), i++)
|
||||
var/list/data = W.stored[i]
|
||||
add_data(data[1],1,data[2],data[3],data[4])
|
||||
|
||||
|
||||
proc/add_data(var/atom/A, var/override = 0, var/tempfingerprints, var/tempsuit_fibers,var/tempblood_DNA)
|
||||
//What follows is massive. It cross references all stored data in the scanner with the other stored data,
|
||||
//and what is already in the computer. Not sure how bad the lag may/may not be.
|
||||
var
|
||||
backup_prints
|
||||
backup_fibers
|
||||
backup_DNA
|
||||
if(override)
|
||||
backup_prints = A.fingerprints
|
||||
A.fingerprints = tempfingerprints
|
||||
backup_fibers = A.suit_fibers
|
||||
A.suit_fibers = tempsuit_fibers
|
||||
backup_DNA = A.blood_DNA
|
||||
A.blood_DNA = tempblood_DNA
|
||||
if((!A.fingerprints || !length(A.fingerprints))) //No prints
|
||||
var/merged = 0
|
||||
if(!misc)
|
||||
misc = list()
|
||||
if(misc)
|
||||
for(var/i = 1, i < (misc.len + 1), 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(!fibers)
|
||||
fibers = list()
|
||||
if(A.suit_fibers)
|
||||
for(var/j = 1, j < (A.suit_fibers.len + 1), 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 + 1), 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] = 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[3]
|
||||
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 + 1]
|
||||
for(var/i = 1, i < (found_prints.len + 1), i++)
|
||||
found_prints[i] = 0
|
||||
if(!files)
|
||||
files = list()
|
||||
for(var/i = 1, i < (files.len + 1), 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 + 1), 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 + 1), n++) //Lets see if it is already in the database
|
||||
var/list/target = perp_list[n]
|
||||
if(target[1] == A) //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 + 1), 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 + 1), 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] = 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(!found2) //Add a new datapoint to this perp!
|
||||
var/list/sum_list[4]
|
||||
sum_list[1] = A
|
||||
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
|
||||
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
|
||||
|
||||
|
||||
proc/update_fingerprints() //I am tired, but this updates the master print, which is used to determine completion of a print.
|
||||
for(var/k = 1, k < (files.len + 1), 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 + 1), i++)
|
||||
var/list/test_list = perp_list[i]
|
||||
var/list/test_prints = test_list[2]
|
||||
for(var/j = 1, j < (test_prints.len + 1), 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
|
||||
return
|
||||
|
||||
proc/process_card() //I am tired, but this updates the master print from a fingerprint card
|
||||
//which is used to determine completion of a print.
|
||||
if(card.fingerprints)
|
||||
for(var/k = 1, k < (card.fingerprints.len + 1), k++)
|
||||
var/list/test_prints = params2list(card.fingerprints[k])
|
||||
var/print = test_prints[num2text(1)]
|
||||
for(var/i = 1, i < (files.len + 1), 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
|
||||
del(card)
|
||||
return
|
||||
|
||||
proc/get_name(var/atom/A)
|
||||
return A.name
|
||||
|
||||
Topic(href,href_list)
|
||||
switch(href_list["operation"])
|
||||
if("login")
|
||||
@@ -135,7 +348,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
|
||||
@@ -143,6 +356,141 @@ obj/machinery/computer/forensic_scanning
|
||||
I.loc = src
|
||||
else
|
||||
temp = "Invalid Object Rejected."
|
||||
if("card")
|
||||
var/mob/M = usr
|
||||
var/obj/item/I = M.equipped()
|
||||
if(I && istype(I,/obj/item/weapon/f_card))
|
||||
card = I
|
||||
M.drop_item()
|
||||
I.loc = src
|
||||
process_card()
|
||||
usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints."
|
||||
else
|
||||
usr << "\red Invalid Object Rejected."
|
||||
if("database")
|
||||
canclear = 1
|
||||
if(!misc && !files)
|
||||
temp = "Database is empty."
|
||||
else
|
||||
if(files)
|
||||
temp = "<b>Criminal Evidence Database</b><br><br>"
|
||||
temp += "Consolidated data points:<br>"
|
||||
for(var/i = 1, i < (files.len + 1), i++)
|
||||
temp += "<a href='?src=\ref[src];operation=record;identifier=[i]'>{Dossier [i]}</a><br>"
|
||||
temp += "<br><a href='?src=\ref[src];operation=card'>{Insert Finger Print Card}</a><br><br><br>"
|
||||
else
|
||||
temp = ""
|
||||
if(misc)
|
||||
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 + 1), 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")
|
||||
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])
|
||||
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>"
|
||||
temp += print_string
|
||||
for(var/i = 2, i < (dossier.len + 1), i++)
|
||||
var/list/outputs = dossier[i]
|
||||
var/item_name = get_name(outputs[1])
|
||||
var/list/prints_len = outputs[2]
|
||||
temp += "Object: [item_name]<br>"
|
||||
temp += " [prints_len.len] Unique fingerprints found.<br>"
|
||||
var/list/fibers = outputs[3]
|
||||
if(fibers)
|
||||
var/dat = "[fibers[1]]"
|
||||
for(var/j = 2, j < (fibers.len + 1), j++)
|
||||
dat += ",<br> [fibers[j]]"
|
||||
temp += " Fibers: [dat]<br>"
|
||||
else
|
||||
temp += " No fibers found.<br>"
|
||||
var/list/blood = outputs[4]
|
||||
if(blood)
|
||||
var/dat = "[blood[1]]"
|
||||
if(blood.len > 1)
|
||||
for(var/j = 2, j < (blood.len + 1), j++)
|
||||
dat += ",<br> [blood[j]]"
|
||||
temp += " Blood: [dat]<br>"
|
||||
else
|
||||
temp += " No blood found.<br>"
|
||||
else
|
||||
temp = "ERROR. Database not found!<br>"
|
||||
temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
|
||||
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
|
||||
if("databaseprint")
|
||||
if(files)
|
||||
var/obj/item/weapon/paper/P = new(loc)
|
||||
P.name = "Database File (Dossier [href_list["identifier"]])"
|
||||
P.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/print_string = "Fingerprints: Print not complete!<br>"
|
||||
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
|
||||
print_string = "Fingerprints: " + prints[num2text(2)] + "<BR>"
|
||||
P.info += print_string
|
||||
for(var/i = 2, i < (dossier.len + 1), i++)
|
||||
var/list/outputs = dossier[i]
|
||||
var/item_name = get_name(outputs[1])
|
||||
var/list/prints_len = outputs[2]
|
||||
P.info += "Object: [item_name]<br>"
|
||||
P.info += " [prints_len.len] Unique fingerprints found.<br>"
|
||||
var/list/fibers = outputs[3]
|
||||
if(fibers)
|
||||
var/dat = "[fibers[1]]"
|
||||
for(var/j = 2, j < (fibers.len + 1), j++)
|
||||
dat += ",<br> [fibers[j]]"
|
||||
P.info += " Fibers: [dat]<br>"
|
||||
else
|
||||
P.info += " No fibers found.<br>"
|
||||
var/list/blood = outputs[4]
|
||||
if(blood)
|
||||
var/dat = "[blood[1]]"
|
||||
if(blood.len > 1)
|
||||
for(var/j = 2, j < (blood.len + 1), j++)
|
||||
dat += ",<br> [blood[j]]"
|
||||
P.info += " Blood: [dat]<br>"
|
||||
else
|
||||
P.info += " No blood found."
|
||||
else
|
||||
usr << "ERROR. Database not found!<br>"
|
||||
if("auxiliary")
|
||||
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 += "Consolidated data points: [item_name]<br>"
|
||||
var/list/fibers = outputs[2]
|
||||
if(fibers)
|
||||
var/dat = "[fibers[1]]"
|
||||
for(var/j = 2, j < (fibers.len + 1), j++)
|
||||
dat += ",<br> [fibers[j]]"
|
||||
temp += " Fibers: [dat]<br>"
|
||||
else
|
||||
temp += " No fibers found."
|
||||
var/list/blood = outputs[3]
|
||||
if(blood)
|
||||
var/dat = "[blood[1]]"
|
||||
for(var/j = 2, j < (blood.len + 1), j++)
|
||||
dat += ",<br> [blood[j]]"
|
||||
temp += " Blood: [dat]<br>"
|
||||
else
|
||||
temp += " No blood found.<br>"
|
||||
else
|
||||
temp = "ERROR. Database not found!<br>"
|
||||
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
|
||||
if("scan")
|
||||
if(scanning)
|
||||
scan_process = 3
|
||||
@@ -174,20 +522,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 + 1), 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 (!length(scanning.fingerprints))
|
||||
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(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 +543,26 @@ obj/machinery/computer/forensic_scanning
|
||||
scan_data += "- [data]<br>"
|
||||
else
|
||||
scan_data += "No Fibers/Materials Data<br>"
|
||||
else
|
||||
scan_data += "No Fibers/Materials Located<br>"
|
||||
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>"
|
||||
add_data_scanner(scanning)
|
||||
else if(!length(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"
|
||||
|
||||
@@ -227,6 +580,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
|
||||
@@ -244,10 +602,12 @@ mob/var
|
||||
obj/item/clothing/gloves/var
|
||||
transfer_blood = 0
|
||||
mob/living/carbon/human/bloody_hands_mob
|
||||
/*
|
||||
obj/decal/cleanable/blood/var/track_amt = 3
|
||||
|
||||
|
||||
obj/effect/decal/cleanable/blood/var
|
||||
track_amt = 3
|
||||
mob/blood_owner
|
||||
|
||||
turf/Exited(mob/living/carbon/human/M)
|
||||
if(istype(M,/mob/living))
|
||||
if(!istype(src, /turf/space)) // Bloody tracks code starts here
|
||||
@@ -271,9 +631,9 @@ turf/Entered(mob/living/carbon/human/M)
|
||||
M.shoes.track_blood--
|
||||
src.add_bloody_footprints(M.shoes.track_blood_mob,0,M.dir,M.shoes.name)
|
||||
|
||||
for(var/obj/decal/cleanable/blood/B in src)
|
||||
for(var/obj/effect/decal/cleanable/blood/B in src)
|
||||
if(B.track_amt <= 0) continue
|
||||
if(B.type != /obj/decal/cleanable/blood/tracks && B.type != /obj/decal/cleanable/blood/drip)
|
||||
if(B.type != /obj/effect/decal/cleanable/blood/tracks)
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
if(M.shoes)
|
||||
M.shoes.add_blood(B.blood_owner)
|
||||
@@ -282,30 +642,31 @@ turf/Entered(mob/living/carbon/human/M)
|
||||
else
|
||||
M.add_blood(B.blood_owner)
|
||||
M.track_blood_mob = B.blood_owner
|
||||
M.track_blood = max(M.track_blood,8)
|
||||
M.track_blood = max(M.track_blood,rand(4,8))
|
||||
B.track_amt--
|
||||
break
|
||||
. = ..()
|
||||
|
||||
turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
|
||||
for(var/obj/decal/cleanable/blood/tracks/T in src)
|
||||
for(var/obj/effect/decal/cleanable/blood/tracks/T in src)
|
||||
if(T.dir == d)
|
||||
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/decal/cleanable/blood/tracks/this = new(src)
|
||||
var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
|
||||
this.icon = 'footprints.dmi'
|
||||
if(leaving)
|
||||
this.icon_state = "steps2"
|
||||
this.icon_state = "blood2"
|
||||
else
|
||||
this.icon_state = "steps1"
|
||||
this.icon_state = "blood1"
|
||||
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))
|
||||
@@ -320,8 +681,8 @@ proc/get_tracks(mob/M)
|
||||
|
||||
proc/blood_incompatible(donor,receiver)
|
||||
var
|
||||
donor_antigen = copytext(donor,1,2)
|
||||
receiver_antigen = copytext(receiver,1,2)
|
||||
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
|
||||
@@ -333,5 +694,4 @@ proc/blood_incompatible(donor,receiver)
|
||||
if("O")
|
||||
if(donor_antigen != "O") return 1
|
||||
//AB is a universal receiver.
|
||||
return 0
|
||||
*/
|
||||
return 0
|
||||
154
code/WorkInProgress/meteors.dm
Normal file
154
code/WorkInProgress/meteors.dm
Normal file
@@ -0,0 +1,154 @@
|
||||
#define METEOR_TEMPERATURE
|
||||
|
||||
/var/const/meteor_wave_delay = 625 //minimum wait between waves in tenths of seconds
|
||||
//set to at least 100 unless you want evarr ruining every round
|
||||
|
||||
/var/const/meteors_in_wave = 20
|
||||
/var/const/meteors_in_small_wave = 10
|
||||
|
||||
/proc/meteor_wave(var/number = meteors_in_wave)
|
||||
if(!ticker || wavesecret)
|
||||
return
|
||||
|
||||
var/startx
|
||||
var/starty
|
||||
var/endx
|
||||
var/endy
|
||||
var/turf/pickedstart
|
||||
var/turf/pickedgoal
|
||||
switch(pick(1,2,3,4))
|
||||
if(1) //NORTH
|
||||
starty = world.maxy-3
|
||||
startx = rand(1, world.maxx-1)
|
||||
endy = 1
|
||||
endx = rand(1, world.maxx-1)
|
||||
if(2) //EAST
|
||||
starty = rand(1,world.maxy-1)
|
||||
startx = world.maxx-3
|
||||
endy = rand(1, world.maxy-1)
|
||||
endx = 1
|
||||
if(3) //SOUTH
|
||||
starty = 3
|
||||
startx = rand(1, world.maxx-1)
|
||||
endy = world.maxy-1
|
||||
endx = rand(1, world.maxx-1)
|
||||
if(4) //WEST
|
||||
starty = rand(1, world.maxy-1)
|
||||
startx = 3
|
||||
endy = rand(1,world.maxy-1)
|
||||
endx = world.maxx-1
|
||||
pickedstart = locate(startx, starty, 1)
|
||||
pickedgoal = locate(endx, endy, 1)
|
||||
wavesecret = 1
|
||||
for(var/i = 0 to number)
|
||||
spawn(rand(10,100))
|
||||
spawn_meteor(pickedstart, pickedgoal)
|
||||
spawn(meteor_wave_delay)
|
||||
wavesecret = 0
|
||||
|
||||
/proc/spawn_meteors(var/turf/pickedstart, var/turf/pickedgoal, var/number = meteors_in_small_wave)
|
||||
for(var/i = 0; i < number; i++)
|
||||
spawn(0)
|
||||
spawn_meteor(pickedstart, pickedgoal)
|
||||
|
||||
/proc/spawn_meteor(var/turf/pickedstart, var/turf/pickedgoal)
|
||||
|
||||
var/route = rand(1,5)
|
||||
var/turf/tempgoal = pickedgoal
|
||||
for(var/i, i < route, i++)
|
||||
tempgoal = get_step(tempgoal,rand(1,8))
|
||||
|
||||
var/obj/effect/meteor/M
|
||||
switch(rand(1, 100))
|
||||
if(1 to 15)
|
||||
M = new /obj/effect/meteor/big(pickedstart)
|
||||
if(16 to 75)
|
||||
M = new /obj/effect/meteor( pickedstart )
|
||||
if(76 to 100)
|
||||
M = new /obj/effect/meteor/small( pickedstart )
|
||||
|
||||
M.dest = tempgoal
|
||||
|
||||
do
|
||||
sleep(1)
|
||||
walk_towards(M, M.dest, 1)
|
||||
while (!istype(M.loc, /turf/space) || pickedstart.loc.name != "Space" ) //FUUUCK, should never happen.
|
||||
|
||||
return
|
||||
|
||||
/obj/effect/meteor
|
||||
name = "meteor"
|
||||
icon = 'meteor.dmi'
|
||||
icon_state = "flaming"
|
||||
density = 1
|
||||
anchored = 1.0
|
||||
var/hits = 1
|
||||
var/dest
|
||||
pass_flags = PASSTABLE
|
||||
|
||||
/obj/effect/meteor/small
|
||||
name = "small meteor"
|
||||
icon_state = "smallf"
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
|
||||
/obj/effect/meteor/Move()
|
||||
var/turf/T = src.loc
|
||||
if (istype(T, /turf))
|
||||
T.hotspot_expose(METEOR_TEMPERATURE, 1000)
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/effect/meteor/Bump(atom/A)
|
||||
spawn(0)
|
||||
for(var/mob/M in range(10, src))
|
||||
if(!M.stat && !istype(M, /mob/living/silicon/ai)) //bad idea to shake an ai's view
|
||||
shake_camera(M, 3, 1)
|
||||
if (A)
|
||||
A.meteorhit(src)
|
||||
playsound(src.loc, 'meteorimpact.ogg', 40, 1)
|
||||
if (--src.hits <= 0)
|
||||
if(prob(15))// && !istype(A, /obj/structure/grille))
|
||||
explosion(src.loc, 4, 5, 6, 7, 0)
|
||||
playsound(src.loc, "explosion", 50, 1)
|
||||
del(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/meteor/ex_act(severity)
|
||||
|
||||
if (severity < 4)
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/effect/meteor/big
|
||||
name = "big meteor"
|
||||
hits = 5
|
||||
|
||||
ex_act(severity)
|
||||
return
|
||||
|
||||
Bump(atom/A)
|
||||
spawn(0)
|
||||
for(var/mob/M in range(10, src))
|
||||
if(!M.stat && !istype(M, /mob/living/silicon/ai)) //bad idea to shake an ai's view
|
||||
shake_camera(M, 3, 1)
|
||||
if (A)
|
||||
if(isobj(A))
|
||||
del(A)
|
||||
else
|
||||
A.meteorhit(src)
|
||||
src.hits--
|
||||
return
|
||||
playsound(src.loc, 'meteorimpact.ogg', 40, 1)
|
||||
if (--src.hits <= 0)
|
||||
if(prob(15) && !istype(A, /obj/structure/grille))
|
||||
explosion(src.loc, 1, 2, 3, 4, 0)
|
||||
playsound(src.loc, "explosion", 50, 1)
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/effect/meteor/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/pickaxe))
|
||||
del(src)
|
||||
return
|
||||
..()
|
||||
Reference in New Issue
Block a user