mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 11:43:31 +00:00
Final updates on Fingerprints
fix for traitors getting assassinate and protect targets for the same person Ported blood rejection
This commit is contained in:
@@ -49,6 +49,8 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
|
|||||||
suit_fibers += "Material from a pair of [M.gloves.name]."
|
suit_fibers += "Material from a pair of [M.gloves.name]."
|
||||||
if(!suit_fibers.len) del suit_fibers
|
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
|
obj/machinery/computer/forensic_scanning
|
||||||
name = "High-Res Forensic Scanning Computer"
|
name = "High-Res Forensic Scanning Computer"
|
||||||
@@ -67,9 +69,9 @@ obj/machinery/computer/forensic_scanning
|
|||||||
// 3: All fibers on the object
|
// 3: All fibers on the object
|
||||||
// 4: All blood 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.
|
//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()
|
list/files
|
||||||
//This holds objects (1) without prints, and their fibers(2) and blood(3).
|
//This holds objects (1) without prints, and their fibers(2) and blood(3).
|
||||||
list/misc = list()
|
list/misc
|
||||||
obj/item/weapon/f_card/card
|
obj/item/weapon/f_card/card
|
||||||
|
|
||||||
scan_data = ""
|
scan_data = ""
|
||||||
@@ -102,15 +104,16 @@ obj/machinery/computer/forensic_scanning
|
|||||||
if(scanning)
|
if(scanning)
|
||||||
if(scan_process)
|
if(scan_process)
|
||||||
dat += "Scan Object: {[scanning.name]}<br>"
|
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
|
else
|
||||||
if(isai) dat += "Scan Object: {[scanning.name]}<br>"
|
if(isai) dat += "Scan Object: {[scanning.name]}<br>"
|
||||||
else dat += "Scan Object: <a href='?src=\ref[src];operation=eject'>{[scanning.name]}</a><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
|
else
|
||||||
if(isai) dat += "{No Object Inserted}<br>"
|
if(isai) dat += "{No Object Inserted}<br>"
|
||||||
else dat += "<a href='?src=\ref[src];operation=insert'>{No Object Inserted}</a><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>"
|
dat += "<tt>[scan_data]</tt>"
|
||||||
if(scan_data && !scan_process)
|
if(scan_data && !scan_process)
|
||||||
dat += "<br><a href='?src=\ref[src];operation=erase'>{Erase Data}</a>"
|
dat += "<br><a href='?src=\ref[src];operation=erase'>{Erase Data}</a>"
|
||||||
@@ -122,59 +125,56 @@ obj/machinery/computer/forensic_scanning
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
proc/add_data_scanner(var/obj/item/device/detective_scanner/W as obj)
|
proc/add_data_scanner(var/obj/item/device/detective_scanner/W)
|
||||||
for(var/i = 1, i < W.stored.len, i++)
|
for(var/i = 1, i < (W.stored.len + 1), i++)
|
||||||
var/list/data = W.stored[i]
|
var/list/data = W.stored[i]
|
||||||
var/atom/A = new
|
add_data(data[1],1,data[2],data[3],data[4])
|
||||||
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)
|
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,
|
//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.
|
//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
|
||||||
|
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
|
var/merged = 0
|
||||||
for(var/i = 1, i < misc.len, i++) //Lets see if we can find it.
|
if(!misc)
|
||||||
var/list/templist = misc[i]
|
misc = list()
|
||||||
var/check = templist[1]
|
if(misc)
|
||||||
if(check == A) //There it is!
|
for(var/i = 1, i < (misc.len + 1), i++) //Lets see if we can find it.
|
||||||
merged = 1
|
var/list/templist = misc[i]
|
||||||
var/list/fibers = templist[2]
|
var/check = templist[1]
|
||||||
if(A.suit_fibers)
|
if(check == A) //There it is!
|
||||||
for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
|
merged = 1
|
||||||
var/test_print1 = A.suit_fibers[j]
|
var/list/fibers = templist[2]
|
||||||
var/found = 0
|
if(!fibers)
|
||||||
for(var/k = 1, k <= fibers.len, k++) //Lets see if the fiber is already in there
|
fibers = list()
|
||||||
var/test_print2 = fibers[k]
|
if(A.suit_fibers)
|
||||||
if(test_print2 == test_print1) //It is! Do nothing!
|
for(var/j = 1, j < (A.suit_fibers.len + 1), j++) //Fibers~~~
|
||||||
found = 1
|
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
|
||||||
break
|
fibers += A.suit_fibers[j]
|
||||||
if(!found) //It isn't! Add!
|
var/list/blood = templist[3]
|
||||||
fibers += A.suit_fibers[j]
|
if(!blood)
|
||||||
var/list/blood = templist[3]
|
blood = list()
|
||||||
if(A.blood_DNA)
|
if(A.blood_DNA)
|
||||||
for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
|
for(var/j = 1, j < (A.blood_DNA.len + 1), j++) //Blood~~~
|
||||||
var/test_print1 = A.blood_DNA[j]
|
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
|
||||||
var/found = 0
|
blood += A.blood_DNA[j]
|
||||||
for(var/k = 1, k <= blood.len, k++) //Lets see if the fiber is already in there
|
var/list/sum_list[3] //Pack it back up!
|
||||||
var/test_print2 = blood[k]
|
sum_list[1] = A
|
||||||
if(test_print2 == test_print1) //It is! Do nothing!
|
sum_list[2] = fibers
|
||||||
found = 1
|
sum_list[3] = blood
|
||||||
break
|
misc[i] = sum_list //Store it!
|
||||||
if(!found) //It isn't! Add!
|
break //We found it, we're done here.
|
||||||
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!
|
if(!merged) //Nope! Guess we have to add it!
|
||||||
var/list/templist[4]
|
var/list/templist[4]
|
||||||
templist[1] = A
|
templist[1] = A
|
||||||
@@ -184,30 +184,34 @@ obj/machinery/computer/forensic_scanning
|
|||||||
misc[misc.len] = templist //Store it!
|
misc[misc.len] = templist //Store it!
|
||||||
return !merged
|
return !merged
|
||||||
else //Has prints.
|
else //Has prints.
|
||||||
var/list/found_prints[A.fingerprints.len]
|
var/list/found_prints[A.fingerprints.len + 1]
|
||||||
for(var/i = 1, i < found_prints.len, i++)
|
for(var/i = 1, i < (found_prints.len + 1), i++)
|
||||||
found_prints[i] = 0
|
found_prints[i] = 0
|
||||||
for(var/i = 1, i < files.len, i++) //Lets see if we can find the owner of the prints
|
if(!files)
|
||||||
var/merged = 0
|
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_list = files[i]
|
||||||
var/list/perp_prints = params2list(perp_list[1])
|
var/list/perp_prints = params2list(perp_list[1])
|
||||||
var/perp = perp_prints[1]
|
var/perp = perp_prints[1]
|
||||||
for(var/m = 1, m < A.fingerprints.len, m++) //Compare database prints with prints on object.
|
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/list/test_prints_list = params2list(A.fingerprints[m])
|
||||||
var/checker = test_prints_list[1]
|
var/checker = test_prints_list[1]
|
||||||
if(checker == perp) //Found 'em! Merge!
|
if(checker == perp) //Found 'em! Merge!
|
||||||
found_prints[m] = 1
|
found_prints[m] = 1
|
||||||
for(var/n = 2, n < perp_list.len, n++) //Lets see if it is already in the database
|
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]
|
var/list/target = perp_list[n]
|
||||||
if(target[1] == A) //Found the original object!
|
if(target[1] == A) //Found the original object!
|
||||||
merged = 1
|
found2 = 1
|
||||||
var/list/prints = target[2]
|
var/list/prints = target[2]
|
||||||
|
if(!prints)
|
||||||
|
prints = list()
|
||||||
if(A.fingerprints)
|
if(A.fingerprints)
|
||||||
for(var/j = 1, j < A.fingerprints.len, j++) //Fingerprints~~~
|
for(var/j = 1, j < (A.fingerprints.len + 1), j++) //Fingerprints~~~
|
||||||
var/list/print_test1 = params2list(A.fingerprints[j])
|
var/list/print_test1 = params2list(A.fingerprints[j])
|
||||||
var/test_print1 = print_test1[1]
|
var/test_print1 = print_test1[1]
|
||||||
var/found = 0
|
var/found = 0
|
||||||
for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there
|
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/list/print_test2 = params2list(prints[k])
|
||||||
var/test_print2 = print_test2[1]
|
var/test_print2 = print_test2[1]
|
||||||
if(test_print2 == test_print1) //It is! Merge!
|
if(test_print2 == test_print1) //It is! Merge!
|
||||||
@@ -217,28 +221,18 @@ obj/machinery/computer/forensic_scanning
|
|||||||
if(!found) //It isn't! Add!
|
if(!found) //It isn't! Add!
|
||||||
prints += A.fingerprints[j]
|
prints += A.fingerprints[j]
|
||||||
var/list/fibers = target[3]
|
var/list/fibers = target[3]
|
||||||
|
if(!fibers)
|
||||||
|
fibers = list()
|
||||||
if(A.suit_fibers)
|
if(A.suit_fibers)
|
||||||
for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
|
for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
|
||||||
var/test_print1 = A.suit_fibers[j]
|
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
|
||||||
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]
|
fibers += A.suit_fibers[j]
|
||||||
var/list/blood = target[4]
|
var/list/blood = target[4]
|
||||||
|
if(!blood)
|
||||||
|
blood = list()
|
||||||
if(A.blood_DNA)
|
if(A.blood_DNA)
|
||||||
for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
|
for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
|
||||||
var/test_print1 = A.blood_DNA[j]
|
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
|
||||||
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]
|
blood += A.blood_DNA[j]
|
||||||
var/list/sum_list[4] //Pack it back up!
|
var/list/sum_list[4] //Pack it back up!
|
||||||
sum_list[1] = A
|
sum_list[1] = A
|
||||||
@@ -248,65 +242,78 @@ obj/machinery/computer/forensic_scanning
|
|||||||
perp_list[n] = sum_list //Store it!
|
perp_list[n] = sum_list //Store it!
|
||||||
files[i] = perp_list
|
files[i] = perp_list
|
||||||
break //We found it, we're done here.
|
break //We found it, we're done here.
|
||||||
if(merged)
|
if(!found2) //Add a new datapoint to this perp!
|
||||||
update_fingerprints(i) //Lets update the calculated sum of the stored prints.
|
var/list/sum_list[4]
|
||||||
for(var/m = 1, m < found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint!
|
sum_list[1] = A
|
||||||
if(found_prints.len[m] == 0)
|
sum_list[2] = A.fingerprints
|
||||||
var/list/newperp[2]
|
sum_list[3] = A.suit_fibers
|
||||||
var/list/sum_list
|
sum_list[4] = A.blood_DNA
|
||||||
sum_list[1] = A
|
perp_list.len++
|
||||||
sum_list[2] = A.fingerprints
|
perp_list[perp_list.len] = sum_list
|
||||||
sum_list[3] = A.suit_fibers
|
files[i] = perp_list
|
||||||
sum_list[4] = A.blood_DNA
|
for(var/m = 1, m < found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint!
|
||||||
newperp[2] = sum_list
|
if(found_prints[m] == 0)
|
||||||
newperp[1] = A.fingerprints[m]
|
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.len++
|
||||||
files[files.len] = newperp
|
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
|
return
|
||||||
|
|
||||||
|
|
||||||
proc/update_fingerprints(var/index) //I am tired, but this updates the master print, which is used to determine completion of a print.
|
proc/update_fingerprints() //I am tired, but this updates the master print, which is used to determine completion of a print.
|
||||||
if(!index)
|
for(var/k = 1, k < (files.len + 1), k++)
|
||||||
return
|
var/list/perp_list = files[k]
|
||||||
var/list/perp_list = files[1]
|
var/list/perp_prints = params2list(perp_list[1])
|
||||||
var/list/perp_prints = params2list(perp_list[1])
|
var/perp = perp_prints[1]
|
||||||
var/perp = perp_prints[1]
|
var/list/found_prints = list()
|
||||||
var/list/found_prints = list()
|
for(var/i = 2, i < (perp_list.len + 1), i++)
|
||||||
for(var/i = 2, i < perp_list.len, i++)
|
var/list/test_list = perp_list[i]
|
||||||
var/list/test_list = perp_list[i]
|
var/list/test_prints = test_list[2]
|
||||||
var/list/test_prints = test_list[2]
|
for(var/j = 1, j < (test_prints.len + 1), j++)
|
||||||
for(var/j = 1, j < test_prints.len)
|
var/list/test_list_2 = params2list(test_prints[j])
|
||||||
var/list/test_list_2 = params2list(test_prints[j])
|
var/test_prints_2 = test_list_2[1]
|
||||||
var/test_prints_2 = test_list_2[1]
|
if(test_prints_2 == perp)
|
||||||
if(test_prints_2 == perp)
|
found_prints += test_list_2[2]
|
||||||
found_prints += test_list_2[2]
|
break
|
||||||
break
|
for(var/prints in found_prints)
|
||||||
for(var/prints in found_prints)
|
perp_prints[2] = stringmerge(perp_prints[2],prints)
|
||||||
perp_prints[2] = stringmerge(perp_prints[2],prints)
|
perp_list[1] = perp + "&" + perp_prints[2]
|
||||||
perp_list[1] = perp + "&" + perp_prints[2]
|
files[k] = perp_list
|
||||||
files[1] = perp_list
|
|
||||||
return
|
return
|
||||||
|
|
||||||
// attackby(var/obj/item/device/detective_scanner/W as obj, mob/user as mob)
|
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 (istype(W, /obj/item/device/detective_scanner))
|
if(card.fingerprints)
|
||||||
//
|
for(var/k = 1, k < (card.fingerprints.len + 1), k++)
|
||||||
//What follows is massive. It cross references all stored data in the scanner with the other stored data,
|
var/list/test_prints = params2list(card.fingerprints[k])
|
||||||
//and what is already in the computer. Not sure how bad the lag may/may not be.
|
var/print = test_prints[1]
|
||||||
//
|
for(var/i = 1, i < (files.len + 1), i++)
|
||||||
// var/list/data = W.stored
|
var/list/test_list = files[i]
|
||||||
// if(files.len || misc.len)
|
var/list/perp_prints = params2list(test_list[1])
|
||||||
//
|
var/perp = perp_prints[1]
|
||||||
//
|
if(perp == print)
|
||||||
//
|
test_list[1] = print + "&" + print
|
||||||
// else
|
files[i] = test_list
|
||||||
//
|
break
|
||||||
//
|
del(card)
|
||||||
// src.add_fingerprint(user)
|
return
|
||||||
// if (W)
|
|
||||||
// W.add_fingerprint(user)
|
|
||||||
// return
|
|
||||||
|
|
||||||
|
proc/get_name(var/atom/A)
|
||||||
|
return A.name
|
||||||
|
|
||||||
Topic(href,href_list)
|
Topic(href,href_list)
|
||||||
switch(href_list["operation"])
|
switch(href_list["operation"])
|
||||||
@@ -349,6 +356,141 @@ obj/machinery/computer/forensic_scanning
|
|||||||
I.loc = src
|
I.loc = src
|
||||||
else
|
else
|
||||||
temp = "Invalid Object Rejected."
|
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[2]) <= FINGERPRINT_COMPLETE)
|
||||||
|
print_string = "Fingerprints: (80% or higher completion reached)<br>" + prints[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[2]) <= FINGERPRINT_COMPLETE)
|
||||||
|
print_string = "Fingerprints: " + prints[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("scan")
|
||||||
if(scanning)
|
if(scanning)
|
||||||
scan_process = 3
|
scan_process = 3
|
||||||
@@ -380,19 +522,19 @@ obj/machinery/computer/forensic_scanning
|
|||||||
scan_data = "<u>[scanning]</u><br><br>"
|
scan_data = "<u>[scanning]</u><br><br>"
|
||||||
if (scanning.blood_DNA)
|
if (scanning.blood_DNA)
|
||||||
scan_data += "Blood Found:<br>"
|
scan_data += "Blood Found:<br>"
|
||||||
for(var/i = 1, i < scanning.blood_DNA.len, i++)
|
for(var/i = 1, i < (scanning.blood_DNA.len + 1), i++)
|
||||||
var/list/templist = scanning.blood_DNA[i]
|
var/list/templist = scanning.blood_DNA[i]
|
||||||
scan_data += "-Blood type: [templist[2]]\nDNA: [templist[1]]<br><br>"
|
scan_data += "-Blood type: [templist[2]]\nDNA: [templist[1]]<br><br>"
|
||||||
else
|
else
|
||||||
scan_data += "No Blood Found<br><br>"
|
scan_data += "No Blood Found<br><br>"
|
||||||
if (!( scanning.fingerprints.len ))
|
if (!length(scanning.fingerprints))
|
||||||
scan_data += "No Fingerprints Found<br><br>"
|
scan_data += "No Fingerprints Found<br><br>"
|
||||||
else
|
else
|
||||||
var/list/L = scanning.fingerprints
|
var/list/L = scanning.fingerprints
|
||||||
scan_data += "Isolated [L.len] Fingerprints. Loaded into database.<br>"
|
scan_data += "Isolated [L.len] Fingerprints. Loaded into database.<br>"
|
||||||
add_data(scanning)
|
add_data(scanning)
|
||||||
|
|
||||||
if(!scanning.suit_fibers.len)
|
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
|
var/obj/item/device/detective_scanner/scanner = scanning
|
||||||
if(scanner.stored_name)
|
if(scanner.stored_name)
|
||||||
@@ -418,7 +560,8 @@ obj/machinery/computer/forensic_scanning
|
|||||||
scan_data += "- [data]<br>"
|
scan_data += "- [data]<br>"
|
||||||
if(istype(scanning,/obj/item/device/detective_scanner))
|
if(istype(scanning,/obj/item/device/detective_scanner))
|
||||||
scan_data += "<br><b>Data transfered from Scanner to Database.</b><br>"
|
scan_data += "<br><b>Data transfered from Scanner to Database.</b><br>"
|
||||||
else if(!scanning.fingerprints.len)
|
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>"
|
scan_data += "<br><b><a href='?src=\ref[src];operation=add'>Add to Database?</a></b><br>"
|
||||||
else
|
else
|
||||||
temp = "Scan Failed: No Object"
|
temp = "Scan Failed: No Object"
|
||||||
@@ -538,8 +681,8 @@ proc/get_tracks(mob/M)
|
|||||||
|
|
||||||
proc/blood_incompatible(donor,receiver)
|
proc/blood_incompatible(donor,receiver)
|
||||||
var
|
var
|
||||||
donor_antigen = copytext(donor,1,2)
|
donor_antigen = copytext(donor,1,lentext(donor))
|
||||||
receiver_antigen = copytext(receiver,1,2)
|
receiver_antigen = copytext(receiver,1,lentext(receiver))
|
||||||
donor_rh = findtext("+",donor)
|
donor_rh = findtext("+",donor)
|
||||||
receiver_rh = findtext("+",receiver)
|
receiver_rh = findtext("+",receiver)
|
||||||
if(donor_rh && !receiver_rh) return 1
|
if(donor_rh && !receiver_rh) return 1
|
||||||
|
|||||||
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
|
||||||
|
..()
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
layer = 2
|
layer = 2
|
||||||
var/level = 2
|
var/level = 2
|
||||||
var/flags = FPRINT
|
var/flags = FPRINT
|
||||||
var/list/fingerprints
|
var/list/fingerprints = list()
|
||||||
var/list/fingerprintshidden = new/list()
|
var/list/fingerprintshidden = new/list()
|
||||||
var/fingerprintslast = null
|
var/fingerprintslast = null
|
||||||
var/list/blood_DNA = null
|
var/list/blood_DNA = null
|
||||||
|
|||||||
@@ -93,32 +93,25 @@
|
|||||||
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
|
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
|
||||||
src.fingerprintslast = H.key
|
src.fingerprintslast = H.key
|
||||||
return 0
|
return 0
|
||||||
if (!( src.fingerprints ))
|
|
||||||
src.fingerprints = list(text("[]&[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), rand(40,60))))
|
|
||||||
if(src.fingerprintslast != H.key)
|
|
||||||
src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
|
|
||||||
src.fingerprintslast = H.key
|
|
||||||
return 1
|
|
||||||
else
|
else
|
||||||
if(src.fingerprintslast != H.key)
|
if(src.fingerprintslast != H.key)
|
||||||
src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
|
src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
|
||||||
src.fingerprintslast = H.key
|
src.fingerprintslast = H.key
|
||||||
var/new_prints = 0
|
var/new_prints = 0
|
||||||
var/prints
|
var/prints
|
||||||
for(var/i = 1, i < src.fingerprints.len, i++)
|
for(var/i = 1, i < (src.fingerprints.len + 1), i++)
|
||||||
var/list/L = params2list(src.fingerprints[i])
|
var/list/L = params2list(src.fingerprints[i])
|
||||||
if(L[1] == md5(H.dna.uni_identity))
|
if(L[1] == md5(H.dna.uni_identity))
|
||||||
new_prints = i
|
new_prints = i
|
||||||
prints = L[2]
|
prints = L[2]
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
src.fingerprints[i] = L[1] + "&" + stars(L[2], rand(90,95))
|
src.fingerprints[i] = L[1] + "&" + stars(L[2], rand(80,90))
|
||||||
if(new_prints)
|
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)))))
|
src.fingerprints[new_prints] = text("[]&[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), rand(15,30))))
|
||||||
return 1
|
else if(new_prints == 0)
|
||||||
else
|
src.fingerprints += text("[]&[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), rand(15,30)))
|
||||||
src.fingerprints += text("[]&[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), rand(40,60)))
|
return 1
|
||||||
return 1
|
|
||||||
else
|
else
|
||||||
if(src.fingerprintslast != M.key)
|
if(src.fingerprintslast != M.key)
|
||||||
src.fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key)
|
src.fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key)
|
||||||
@@ -140,26 +133,37 @@
|
|||||||
I.Blend(new /icon('blood.dmi', "itemblood"),ICON_MULTIPLY)
|
I.Blend(new /icon('blood.dmi', "itemblood"),ICON_MULTIPLY)
|
||||||
I.Blend(new /icon(src.icon, src.icon_state),ICON_UNDERLAY)
|
I.Blend(new /icon(src.icon, src.icon_state),ICON_UNDERLAY)
|
||||||
src.icon = I
|
src.icon = I
|
||||||
src.blood_DNA.len++
|
if(src.blood_DNA)
|
||||||
src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes, M.b_type)
|
src.blood_DNA.len++
|
||||||
|
src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
|
||||||
|
else
|
||||||
|
var/list/blood_DNA_temp[1]
|
||||||
|
blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.b_type)
|
||||||
|
src.blood_DNA = blood_DNA_temp
|
||||||
else if (istype(src, /turf/simulated))
|
else if (istype(src, /turf/simulated))
|
||||||
var/turf/simulated/source2 = src
|
var/turf/simulated/source2 = src
|
||||||
var/list/objsonturf = range(0,src)
|
var/list/objsonturf = range(0,src)
|
||||||
var/i
|
if(objsonturf)
|
||||||
for(i=1, i<=objsonturf.len, i++)
|
for(var/i=1, i<=objsonturf.len, i++)
|
||||||
if(istype(objsonturf[i],/obj/effect/decal/cleanable/blood))
|
if(istype(objsonturf[i],/obj/effect/decal/cleanable/blood))
|
||||||
return
|
return
|
||||||
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source2)
|
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source2)
|
||||||
this.blood_DNA.len++
|
var/list/blood_DNA_temp[1]
|
||||||
this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes, M.b_type)
|
blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.b_type)
|
||||||
|
this.blood_DNA = blood_DNA_temp
|
||||||
this.virus2 = M.virus2
|
this.virus2 = M.virus2
|
||||||
for(var/datum/disease/D in M.viruses)
|
for(var/datum/disease/D in M.viruses)
|
||||||
var/datum/disease/newDisease = new D.type
|
var/datum/disease/newDisease = new D.type
|
||||||
this.viruses += newDisease
|
this.viruses += newDisease
|
||||||
newDisease.holder = this
|
newDisease.holder = this
|
||||||
else if (istype(src, /mob/living/carbon/human))
|
else if (istype(src, /mob/living/carbon/human))
|
||||||
src.blood_DNA.len++
|
if(src.blood_DNA)
|
||||||
src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
|
src.blood_DNA.len++
|
||||||
|
src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
|
||||||
|
else
|
||||||
|
var/list/blood_DNA_temp[1]
|
||||||
|
blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.b_type)
|
||||||
|
src.blood_DNA = blood_DNA_temp
|
||||||
else
|
else
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -69,7 +69,6 @@
|
|||||||
|
|
||||||
unique_enzymes = md5(character.real_name)
|
unique_enzymes = md5(character.real_name)
|
||||||
original_name = character.real_name
|
original_name = character.real_name
|
||||||
b_type = character.b_type
|
|
||||||
reg_dna[unique_enzymes] = character.real_name
|
reg_dna[unique_enzymes] = character.real_name
|
||||||
|
|
||||||
/////////////////////////// DNA DATUM
|
/////////////////////////// DNA DATUM
|
||||||
|
|||||||
@@ -109,7 +109,8 @@
|
|||||||
objective = steal_objective
|
objective = steal_objective
|
||||||
var/inthere = 0
|
var/inthere = 0
|
||||||
for(var/j, j<= target.len, j++)
|
for(var/j, j<= target.len, j++)
|
||||||
if(target[j] == objective)
|
var/datum/objective/temp = target[j]
|
||||||
|
if(temp:target == objective:target)
|
||||||
inthere = 1
|
inthere = 1
|
||||||
break
|
break
|
||||||
if(!inthere)
|
if(!inthere)
|
||||||
|
|||||||
@@ -429,6 +429,8 @@ About the new airlock wires panel:
|
|||||||
return 0
|
return 0
|
||||||
if(!prob(prb))
|
if(!prob(prb))
|
||||||
return 0 //you lucked out, no shock for you
|
return 0 //you lucked out, no shock for you
|
||||||
|
if(istype(usr.equipped(),/obj/item/weapon/shard))
|
||||||
|
return 0
|
||||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||||
s.set_up(5, 1, src)
|
s.set_up(5, 1, src)
|
||||||
s.start() //sparks always.
|
s.start() //sparks always.
|
||||||
@@ -817,10 +819,10 @@ About the new airlock wires panel:
|
|||||||
usr.machine = src
|
usr.machine = src
|
||||||
if (href_list["wires"])
|
if (href_list["wires"])
|
||||||
var/t1 = text2num(href_list["wires"])
|
var/t1 = text2num(href_list["wires"])
|
||||||
if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) ))
|
if (!istype(usr.equipped(), /obj/item/weapon/wirecutters) || !istype(usr.equipped(),/obj/item/weapon/shard))
|
||||||
usr << "You need wirecutters!"
|
usr << "You need wirecutters!"
|
||||||
return
|
return
|
||||||
if (src.isWireColorCut(t1))
|
if (src.isWireColorCut(t1) && istype(usr.equipped(), /obj/item/weapon/wirecutters))
|
||||||
src.mend(t1)
|
src.mend(t1)
|
||||||
else
|
else
|
||||||
src.cut(t1)
|
src.cut(t1)
|
||||||
|
|||||||
@@ -85,7 +85,7 @@
|
|||||||
/obj/structure/closet/secure_closet/detective
|
/obj/structure/closet/secure_closet/detective
|
||||||
name = "Detective"
|
name = "Detective"
|
||||||
req_access = list(access_forensics_lockers)
|
req_access = list(access_forensics_lockers)
|
||||||
icon_state = "cabinetdetective"
|
icon_state = "cabinetdetective_locked"
|
||||||
icon_closed = "cabinetdetective"
|
icon_closed = "cabinetdetective"
|
||||||
icon_locked = "cabinetdetective_locked"
|
icon_locked = "cabinetdetective_locked"
|
||||||
icon_opened = "cabinetdetective_open"
|
icon_opened = "cabinetdetective_open"
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ MASS SPECTROMETER
|
|||||||
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
|
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
|
||||||
return
|
return
|
||||||
|
|
||||||
afterattack(atom/A as mob|obj|turf|area, mob/user as mob)
|
afterattack(atom/A as obj|turf|area, mob/user as mob)
|
||||||
if(src.loc != user)
|
if(src.loc != user)
|
||||||
return 0
|
return 0
|
||||||
src.add_fingerprint(user)
|
src.add_fingerprint(user)
|
||||||
@@ -141,34 +141,42 @@ MASS SPECTROMETER
|
|||||||
var/list/templist = A.blood_DNA[i]
|
var/list/templist = A.blood_DNA[i]
|
||||||
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
|
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
|
||||||
return
|
return
|
||||||
if (!( A.fingerprints ) && !(A.suit_fibers) && !(A.blood_DNA))
|
var/duplicate = 0
|
||||||
|
if ((!A.fingerprints || A.fingerprints.len == 0) && !(A.suit_fibers) && !(A.blood_DNA))
|
||||||
user << "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!"
|
user << "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!"
|
||||||
return 0
|
return 0
|
||||||
else if (A.blood_DNA)
|
else if (A.blood_DNA)
|
||||||
user << "\blue Blood found on [A]. Analysing..."
|
user << "\blue Blood found on [A]. Analysing..."
|
||||||
sleep(15)
|
sleep(15)
|
||||||
var/duplicate = add_data(A)
|
if(!duplicate)
|
||||||
if(duplicate)
|
duplicate = 1
|
||||||
user << "\blue Blood already in memory."
|
var/i = add_data(A)
|
||||||
for(var/i = 1, i < A.blood_DNA.len, i++)
|
if(i)
|
||||||
|
user << "\blue Blood already in memory."
|
||||||
|
for(var/i = 1, i < (A.blood_DNA.len + 1), i++)
|
||||||
var/list/templist = A.blood_DNA[i]
|
var/list/templist = A.blood_DNA[i]
|
||||||
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
|
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
|
||||||
else
|
else
|
||||||
user << "\blue No Blood Located"
|
user << "\blue No Blood Located"
|
||||||
if(!( A.fingerprints ))
|
if(!A.fingerprints || A.fingerprints.len == 0)
|
||||||
user << "\blue No Fingerprints Located."
|
user << "\blue No Fingerprints Located."
|
||||||
else
|
else
|
||||||
user << text("\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve.")
|
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)
|
||||||
if(duplicate)
|
duplicate = 1
|
||||||
user << "\blue Figerprints already in memory."
|
var/i = add_data(A)
|
||||||
|
if(i)
|
||||||
|
user << "\blue Fingerprints already in memory."
|
||||||
if(!A.suit_fibers)
|
if(!A.suit_fibers)
|
||||||
user << "\blue No Fibers/Materials Located."
|
user << "\blue No Fibers/Materials Located."
|
||||||
else
|
else
|
||||||
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
|
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
|
||||||
var/duplicate = add_data(A)
|
|
||||||
if(duplicate)
|
if(!duplicate)
|
||||||
user << "\blue Fibers/Materials already in memory."
|
duplicate = 1
|
||||||
|
var/i = add_data(A)
|
||||||
|
if(i)
|
||||||
|
user << "\blue Fibers/Materials already in memory."
|
||||||
// else
|
// else
|
||||||
// if ((src.amount < 1 && src.printing))
|
// if ((src.amount < 1 && src.printing))
|
||||||
// user << "\blue Fingerprints found. Need more cards to print."
|
// user << "\blue Fingerprints found. Need more cards to print."
|
||||||
@@ -188,18 +196,20 @@ MASS SPECTROMETER
|
|||||||
|
|
||||||
proc/add_data(atom/A as mob|obj|turf|area)
|
proc/add_data(atom/A as mob|obj|turf|area)
|
||||||
var/merged = 0
|
var/merged = 0
|
||||||
for(var/i = 1, i < stored.len, i++) //Lets see if the object is already in there!
|
for(var/i = 1, i < (stored.len + 1), i++) //Lets see if the object is already in there!
|
||||||
var/list/temp = stored[i]
|
var/list/temp = stored[i]
|
||||||
var/checker = temp[1]
|
var/checker = temp[1]
|
||||||
if(checker == A) //It is! Merge!
|
if(checker == A) //It is! Merge!
|
||||||
merged = 1
|
merged = 1
|
||||||
var/list/prints = temp[2]
|
var/list/prints = temp[2]
|
||||||
|
if(!prints)
|
||||||
|
prints = list()
|
||||||
if(A.fingerprints)
|
if(A.fingerprints)
|
||||||
for(var/j = 1, j < A.fingerprints.len, j++) //Fingerprints~~~
|
for(var/j = 1, j < (A.fingerprints.len + 1), j++) //Fingerprints~~~
|
||||||
var/list/print_test1 = params2list(A.fingerprints[j])
|
var/list/print_test1 = params2list(A.fingerprints[j])
|
||||||
var/test_print1 = print_test1[1]
|
var/test_print1 = print_test1[1]
|
||||||
var/found = 0
|
var/found = 0
|
||||||
for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there
|
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/list/print_test2 = params2list(prints[k])
|
||||||
var/test_print2 = print_test2[1]
|
var/test_print2 = print_test2[1]
|
||||||
if(test_print2 == test_print1) //It is! Merge!
|
if(test_print2 == test_print1) //It is! Merge!
|
||||||
@@ -209,28 +219,18 @@ MASS SPECTROMETER
|
|||||||
if(!found) //It isn't! Add!
|
if(!found) //It isn't! Add!
|
||||||
prints += A.fingerprints[j]
|
prints += A.fingerprints[j]
|
||||||
var/list/fibers = temp[3]
|
var/list/fibers = temp[3]
|
||||||
|
if(!fibers)
|
||||||
|
fibers = list()
|
||||||
if(A.suit_fibers)
|
if(A.suit_fibers)
|
||||||
for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
|
for(var/j = 1, j < (A.suit_fibers.len + 1), j++) //Fibers~~~
|
||||||
var/test_print1 = A.suit_fibers[j]
|
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
|
||||||
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]
|
fibers += A.suit_fibers[j]
|
||||||
var/list/blood = temp[4]
|
var/list/blood = temp[4]
|
||||||
|
if(!blood)
|
||||||
|
blood = list()
|
||||||
if(A.blood_DNA)
|
if(A.blood_DNA)
|
||||||
for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
|
for(var/j = 1, j < (A.blood_DNA.len + 1), j++) //Blood~~~
|
||||||
var/test_print1 = A.blood_DNA[j]
|
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
|
||||||
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]
|
blood += A.blood_DNA[j]
|
||||||
var/list/sum_list[4] //Pack it back up!
|
var/list/sum_list[4] //Pack it back up!
|
||||||
sum_list[1] = A
|
sum_list[1] = A
|
||||||
@@ -247,7 +247,7 @@ MASS SPECTROMETER
|
|||||||
sum_list[4] = A.blood_DNA
|
sum_list[4] = A.blood_DNA
|
||||||
stored.len++
|
stored.len++
|
||||||
stored[stored.len] = sum_list
|
stored[stored.len] = sum_list
|
||||||
return !merged
|
return merged
|
||||||
|
|
||||||
|
|
||||||
/obj/item/device/healthanalyzer
|
/obj/item/device/healthanalyzer
|
||||||
|
|||||||
@@ -228,7 +228,7 @@
|
|||||||
user << "\blue The wardrobe is full."
|
user << "\blue The wardrobe is full."
|
||||||
return
|
return
|
||||||
user << "\blue You pick up all the items."
|
user << "\blue You pick up all the items."
|
||||||
user.visible_message("\blue [user] gathers up the pile of stuff, and puts it into \the [src]")
|
user.visible_message("\blue [user] gathers up the pile of stuff, and puts it into \the [W]")
|
||||||
I.update_icon()
|
I.update_icon()
|
||||||
|
|
||||||
/obj/item/attack_self(mob/user as mob)
|
/obj/item/attack_self(mob/user as mob)
|
||||||
|
|||||||
@@ -201,11 +201,11 @@ FINGERPRINT CARD
|
|||||||
|
|
||||||
/obj/item/weapon/f_card/proc/display()
|
/obj/item/weapon/f_card/proc/display()
|
||||||
|
|
||||||
if (src.fingerprints)
|
if (length(src.fingerprints))
|
||||||
var/dat = "<B>Fingerprints on Card</B><HR>"
|
var/dat = "<B>Fingerprints on Card</B><HR>"
|
||||||
var/L = params2list(src.fingerprints)
|
for(var/i = 1, i < (src.fingerprints.len + 1), i++)
|
||||||
for(var/i in L)
|
var/list/L = params2list(src.fingerprints[i])
|
||||||
dat += text("[]<BR>", i)
|
dat += text("[]<BR>", L[1])
|
||||||
//Foreach goto(41)
|
//Foreach goto(41)
|
||||||
return dat
|
return dat
|
||||||
else
|
else
|
||||||
@@ -270,7 +270,7 @@ FINGERPRINT CARD
|
|||||||
|
|
||||||
..()
|
..()
|
||||||
if (!istype(usr, /mob/living/silicon))
|
if (!istype(usr, /mob/living/silicon))
|
||||||
if (src.fingerprints)
|
if (length(src.fingerprints))
|
||||||
if (src.amount > 1)
|
if (src.amount > 1)
|
||||||
var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( (ismob(src.loc) ? src.loc.loc : src.loc) )
|
var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( (ismob(src.loc) ? src.loc.loc : src.loc) )
|
||||||
F.amount = --src.amount
|
F.amount = --src.amount
|
||||||
|
|||||||
@@ -19,15 +19,10 @@
|
|||||||
usr << "Your message has been broadcast to administrators."
|
usr << "Your message has been broadcast to administrators."
|
||||||
log_admin("HELP: [key_name(src)]: [msg]")
|
log_admin("HELP: [key_name(src)]: [msg]")
|
||||||
|
|
||||||
var/list/replacechars = list("'","\"",">","<","(",")")
|
/* var/list/replacechars = list("'","\"",">","<","(",")")
|
||||||
for(var/rep in replacechars)
|
for(var/rep in replacechars)
|
||||||
var/list/temp = dd_text2list(msg, rep)
|
msg = dd_replacetext(msg, rep, "")
|
||||||
if(temp.len > 1)
|
world << msg*/
|
||||||
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]")
|
send2adminirc("#bs12admin","HELP: [src.key]: [msg]")
|
||||||
if(tension_master)
|
if(tension_master)
|
||||||
tension_master.new_adminhelp()
|
tension_master.new_adminhelp()
|
||||||
|
|||||||
@@ -196,19 +196,27 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
|
attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
|
||||||
if(!istype(B, /obj/item/weapon/reagent_containers/glass))
|
if(!istype(B, /obj/item/weapon/reagent_containers/glass) && !istype(B,/obj/item/weapon/reagent_containers/syringe))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(src.beaker)
|
if(src.beaker)
|
||||||
user << "A beaker is already loaded into the machine."
|
if(istype(beaker,/obj/item/weapon/reagent_containers/syringe))
|
||||||
|
user << "A syringe is already loaded into the machine."
|
||||||
|
else
|
||||||
|
user << "A beaker is already loaded into the machine."
|
||||||
return
|
return
|
||||||
|
|
||||||
src.beaker = B
|
src.beaker = B
|
||||||
user.drop_item()
|
user.drop_item()
|
||||||
B.loc = src
|
B.loc = src
|
||||||
user << "You add the beaker to the machine!"
|
if(istype(B,/obj/item/weapon/reagent_containers/syringe))
|
||||||
src.updateUsrDialog()
|
user << "You add the syringe to the machine!"
|
||||||
icon_state = "mixer1"
|
src.updateUsrDialog()
|
||||||
|
icon_state = "mixers"
|
||||||
|
else
|
||||||
|
user << "You add the beaker to the machine!"
|
||||||
|
src.updateUsrDialog()
|
||||||
|
icon_state = "mixer1"
|
||||||
|
|
||||||
Topic(href, href_list)
|
Topic(href, href_list)
|
||||||
if(stat & BROKEN) return
|
if(stat & BROKEN) return
|
||||||
@@ -222,7 +230,18 @@
|
|||||||
if (href_list["analyze"])
|
if (href_list["analyze"])
|
||||||
var/dat = ""
|
var/dat = ""
|
||||||
if(!condi)
|
if(!condi)
|
||||||
dat += "<TITLE>Chemmaster 3000</TITLE>Chemical infos:<BR><BR>Name:<BR>[href_list["name"]]<BR><BR>Description:<BR>[href_list["desc"]]<BR><BR><BR><A href='?src=\ref[src];main=1'>(Back)</A>"
|
if(href_list["name"] == "Blood")
|
||||||
|
var/datum/reagent/blood/G
|
||||||
|
for(var/datum/reagent/F in R.reagent_list)
|
||||||
|
if(F.name == href_list["name"])
|
||||||
|
G = F
|
||||||
|
break
|
||||||
|
var/A = G.name
|
||||||
|
var/B = G.data["blood_type"]
|
||||||
|
var/C = G.data["blood_DNA"]
|
||||||
|
dat += "<TITLE>Chemmaster 3000</TITLE>Chemical infos:<BR><BR>Name:<BR>[A]<BR><BR>Description:<BR>Blood Type: [B]<br>DNA: [C]<BR><BR><BR><A href='?src=\ref[src];main=1'>(Back)</A>"
|
||||||
|
else
|
||||||
|
dat += "<TITLE>Chemmaster 3000</TITLE>Chemical infos:<BR><BR>Name:<BR>[href_list["name"]]<BR><BR>Description:<BR>[href_list["desc"]]<BR><BR><BR><A href='?src=\ref[src];main=1'>(Back)</A>"
|
||||||
else
|
else
|
||||||
dat += "<TITLE>Condimaster 3000</TITLE>Condiment infos:<BR><BR>Name:<BR>[href_list["name"]]<BR><BR>Description:<BR>[href_list["desc"]]<BR><BR><BR><A href='?src=\ref[src];main=1'>(Back)</A>"
|
dat += "<TITLE>Condimaster 3000</TITLE>Condiment infos:<BR><BR>Name:<BR>[href_list["name"]]<BR><BR>Description:<BR>[href_list["desc"]]<BR><BR><BR><A href='?src=\ref[src];main=1'>(Back)</A>"
|
||||||
usr << browse(dat, "window=chem_master;size=575x400")
|
usr << browse(dat, "window=chem_master;size=575x400")
|
||||||
@@ -316,7 +335,7 @@
|
|||||||
dat += "Add to buffer:<BR>"
|
dat += "Add to buffer:<BR>"
|
||||||
for(var/datum/reagent/G in R.reagent_list)
|
for(var/datum/reagent/G in R.reagent_list)
|
||||||
dat += "[G.name] , [G.volume] Units - "
|
dat += "[G.name] , [G.volume] Units - "
|
||||||
dat += "<A href='?src=\ref[src];analyze=1;desc=[G.description];name=[G.name]'>(Analyze)</A> "
|
dat += "<A href='?src=\ref[src];analyze=1;desc=[G.description];name=[G.name];reagent=[G]'>(Analyze)</A> "
|
||||||
dat += "<A href='?src=\ref[src];add1=[G.id]'>(1)</A> "
|
dat += "<A href='?src=\ref[src];add1=[G.id]'>(1)</A> "
|
||||||
if(G.volume >= 5) dat += "<A href='?src=\ref[src];add5=[G.id]'>(5)</A> "
|
if(G.volume >= 5) dat += "<A href='?src=\ref[src];add5=[G.id]'>(5)</A> "
|
||||||
if(G.volume >= 10) dat += "<A href='?src=\ref[src];add10=[G.id]'>(10)</A> "
|
if(G.volume >= 10) dat += "<A href='?src=\ref[src];add10=[G.id]'>(10)</A> "
|
||||||
|
|||||||
@@ -101,6 +101,12 @@ datum
|
|||||||
id = "blood"
|
id = "blood"
|
||||||
reagent_state = LIQUID
|
reagent_state = LIQUID
|
||||||
color = "#C80000" // rgb: 200, 0, 0
|
color = "#C80000" // rgb: 200, 0, 0
|
||||||
|
on_mob_life(var/mob/living/M)
|
||||||
|
if(istype(M, /mob/living/carbon/human) && blood_incompatible(data["blood_type"],M.dna.b_type))
|
||||||
|
M.adjustToxLoss(rand(1.5,3))
|
||||||
|
M.adjustOxyLoss(rand(1.5,3))
|
||||||
|
..()
|
||||||
|
return
|
||||||
|
|
||||||
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||||
var/datum/reagent/blood/self = src
|
var/datum/reagent/blood/self = src
|
||||||
|
|||||||
@@ -863,6 +863,7 @@
|
|||||||
amount_per_transfer_from_this = 5
|
amount_per_transfer_from_this = 5
|
||||||
possible_transfer_amounts = null //list(5,10,15)
|
possible_transfer_amounts = null //list(5,10,15)
|
||||||
volume = 15
|
volume = 15
|
||||||
|
var/has_blood = 0
|
||||||
var/mode = SYRINGE_DRAW
|
var/mode = SYRINGE_DRAW
|
||||||
|
|
||||||
on_reagent_change()
|
on_reagent_change()
|
||||||
@@ -1023,6 +1024,10 @@
|
|||||||
|
|
||||||
update_icon()
|
update_icon()
|
||||||
var/rounded_vol = round(reagents.total_volume,5)
|
var/rounded_vol = round(reagents.total_volume,5)
|
||||||
|
has_blood = 0
|
||||||
|
for(var/datum/reagent/blood/B in reagents.reagent_list)
|
||||||
|
has_blood = 1
|
||||||
|
break
|
||||||
if(ismob(loc))
|
if(ismob(loc))
|
||||||
var/mode_t
|
var/mode_t
|
||||||
switch(mode)
|
switch(mode)
|
||||||
@@ -1030,9 +1035,9 @@
|
|||||||
mode_t = "d"
|
mode_t = "d"
|
||||||
if (SYRINGE_INJECT)
|
if (SYRINGE_INJECT)
|
||||||
mode_t = "i"
|
mode_t = "i"
|
||||||
icon_state = "[mode_t][rounded_vol]"
|
icon_state = "[mode_t][(has_blood?"b":"")][rounded_vol]"
|
||||||
else
|
else
|
||||||
icon_state = "[rounded_vol]"
|
icon_state = "[(has_blood?"b":"")][rounded_vol]"
|
||||||
item_state = "syringe_[rounded_vol]"
|
item_state = "syringe_[rounded_vol]"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
mob/living/carbon/verb/give()
|
mob/living/carbon/verb/give()
|
||||||
|
set category = "IC"
|
||||||
set name = "Give"
|
set name = "Give"
|
||||||
set src in view(1)
|
set src in view(1)
|
||||||
if(src.stat == 2 || usr.stat == 2|| src.client == null)
|
if(src.stat == 2 || usr.stat == 2|| src.client == null)
|
||||||
@@ -42,6 +43,7 @@ mob/living/carbon/verb/give()
|
|||||||
src.l_hand = I
|
src.l_hand = I
|
||||||
else
|
else
|
||||||
usr << "Their hands are full."
|
usr << "Their hands are full."
|
||||||
|
return
|
||||||
else
|
else
|
||||||
usr.drop_item(I)
|
usr.drop_item(I)
|
||||||
src.r_hand = I
|
src.r_hand = I
|
||||||
@@ -70,6 +72,7 @@ mob/living/carbon/verb/give()
|
|||||||
src.r_hand = I
|
src.r_hand = I
|
||||||
else
|
else
|
||||||
usr << "Their hands are full."
|
usr << "Their hands are full."
|
||||||
|
return
|
||||||
else
|
else
|
||||||
usr.drop_item(I)
|
usr.drop_item(I)
|
||||||
src.l_hand = I
|
src.l_hand = I
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ emp_act
|
|||||||
else H.add_blood(src)
|
else H.add_blood(src)
|
||||||
if(H.wear_suit) H.wear_suit.add_blood(src)
|
if(H.wear_suit) H.wear_suit.add_blood(src)
|
||||||
else if(H.w_uniform) H.w_uniform.add_blood(src)
|
else if(H.w_uniform) H.w_uniform.add_blood(src)
|
||||||
|
if(H.shoes) H.shoes.add_blood(src)
|
||||||
|
|
||||||
switch(hit_area)
|
switch(hit_area)
|
||||||
if("head")//Harder to score a stun but if you do it lasts a bit longer
|
if("head")//Harder to score a stun but if you do it lasts a bit longer
|
||||||
|
|||||||
@@ -354,6 +354,7 @@
|
|||||||
proc/create_character()
|
proc/create_character()
|
||||||
spawning = 1
|
spawning = 1
|
||||||
var/mob/living/carbon/human/new_character = new(loc)
|
var/mob/living/carbon/human/new_character = new(loc)
|
||||||
|
new_character.be_syndicate = src.preferences.be_special
|
||||||
|
|
||||||
close_spawn_windows()
|
close_spawn_windows()
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 29 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 947 B After Width: | Height: | Size: 1.1 KiB |
Reference in New Issue
Block a user