Final updates on Fingerprints

fix for traitors getting assassinate and protect targets for the same person
Ported blood rejection
This commit is contained in:
SkyMarshal
2012-01-31 02:00:45 -07:00
parent 6648061dcb
commit beffc2299a
20 changed files with 554 additions and 221 deletions

View File

@@ -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 += "&nbsp;&nbsp;&nbsp;&nbsp;[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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;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 += "&nbsp;&nbsp;&nbsp;&nbsp;[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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;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

View 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
..()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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