BS12 Detective Work port.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3229 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
joe.heinemeyer@gmail.com
2012-03-02 05:23:08 +00:00
parent 39b8f7b798
commit 113beeb052
35 changed files with 9900 additions and 8470 deletions
+4
View File
@@ -142,6 +142,8 @@
verbs += /client/proc/everyone_random
verbs += /client/proc/only_one // Fateweaver suggested I do this - Doohl
verbs += /client/proc/deadmin_self
verbs += /client/proc/cmd_debug_prints
verbs += /client/proc/cmd_debug_blood
if (holder.level >= 5)//Game Admin********************************************************************
verbs += /obj/admins/proc/view_txt_log
@@ -417,6 +419,8 @@
verbs -= /client/proc/jumptocoord
verbs -= /client/proc/everyone_random
verbs -= /client/proc/cmd_switch_radio
verbs -= /client/proc/cmd_debug_prints
verbs -= /client/proc/cmd_debug_blood
return
+70
View File
@@ -716,3 +716,73 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.update_clothing()
return
/client/proc/cmd_debug_blood()
set category = "Debug"
set name = "Analyze all blood_DNA"
// to prevent REALLY stupid activations
switch(alert("Are you sure?", ,"Yes", "No"))
if("No")
return
world << "\red ALERT! \black Standby for high CPU bugtesting to determine missing blood_DNA values!"
world << "\red THIS WILL PROBABLY LAG LIKE HELL."
world << "Initiating in 10 BYOND seconds..."
log_admin("[key_name(src)] has initiated a scan of all blood_DNA lists!")
message_admins("[key_name_admin(src)] has initiated a scan of all blood_DNA lists!", 0)
sleep(100)
world << "\red SCAN INITIATED."
spawn(0) //I am not stupid enough to leave that in a regular loop.
for(var/atom/O in world)
if(!islist(O.blood_DNA))
var/turf/T = get_turf(O)
if(istype(O.loc,/turf))
src << "[O] at [T.x],[T.y],[T.z] has a non-list blood_DNA variable! (Last touched by [O.fingerprintslast])"
else
src << "[O] in [O.loc] at [T.x],[T.y],[T.z] has a non-list blood_DNA variable! (Last touched by [O.fingerprintslast])"
world << "\red SCAN COMPLETE."
world << "Thank you for your patience."
return
/client/proc/cmd_debug_prints()
set category = "Debug"
set name = "Analyze all fingerprints"
// to prevent REALLY stupid activations
switch(alert("Are you sure?", ,"Yes", "No"))
if("No")
return
world << "\red ALERT! \black Standby for high CPU bugtesting to determine incorrect fingerprint values!"
world << "\red THIS WILL PROBABLY LAG LIKE HELL."
world << "Initiating in 10 BYOND seconds..."
log_admin("[key_name(src)] has initiated a scan of all fingerprints!")
message_admins("[key_name_admin(src)] has initiated a scan of all fingerprints!", 0)
sleep(100)
world << "\red SCAN INITIATED."
spawn(0) //I am not stupid enough to leave that in a regular loop.
for(var/atom/O in world)
if(istype(O, /mob)) //Lets not.
continue
if(!islist(O.fingerprints))
var/turf/T = get_turf(O)
if(istype(O.loc,/turf))
src << "[O] at [T.x],[T.y],[T.z] has a non-list fingerprints variable! (Last touched by [O.fingerprintslast])"
else
src << "[O] in [O.loc] at [T.x],[T.y],[T.z] has a non-list fingerprints variable! (Last touched by [O.fingerprintslast])"
else if (O.fingerprints.len)
for(var/i = 1, i <= O.fingerprints.len, i++)
if(length(O.fingerprints[i]) != 69)
var/turf/T = get_turf(O)
if(isnull(T))
src << "[O] at [O.loc] has a fingerprints variable of incorrect length! (TURF NOT FOUND). (Last touched by [O.fingerprintslast])"
else
if(istype(O.loc,/turf))
src << "[O] at [T.x],[T.y],[T.z] has a fingerprints variable of incorrect length! (Last touched by [O.fingerprintslast])"
else
src << "[O] in [O.loc] at [T.x],[T.y],[T.z] has a fingerprints variable of incorrect length! (Last touched by [O.fingerprintslast])"
break
world << "\red SCAN COMPLETE."
world << "Thank you for your patience."
return
+3 -4
View File
@@ -135,8 +135,7 @@ datum
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here
if(!blood_prop) //first blood!
blood_prop = new(T)
blood_prop.blood_DNA = self.data["blood_DNA"]
blood_prop.blood_type = self.data["blood_type"]
blood_prop.blood_DNA = list(list(self.data["blood_DNA"],self.data["blood_type"]))
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
@@ -148,7 +147,7 @@ datum
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA = self.data["blood_DNA"]
blood_prop.blood_DNA = list(list("Non-Human DNA","A+"))
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
blood_prop.viruses += newVirus
@@ -165,7 +164,7 @@ datum
var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA = self.data["blood_DNA"]
blood_prop.blood_DNA = list(list("UNKNOWN DNA STRUCTURE","X*"))
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type
blood_prop.viruses += newVirus
+1 -1
View File
@@ -933,7 +933,7 @@
B.data["resistances"] = T.resistances.Copy()
if(istype(target, /mob/living/carbon/human))//I wish there was some hasproperty operation...
var/mob/living/carbon/human/HT = target
B.data["blood_type"] = copytext(HT.b_type,1,0)
B.data["blood_type"] = copytext(HT.dna.b_type,1,0)
var/list/temp_chem = list()
for(var/datum/reagent/R in target.reagents.reagent_list)
temp_chem += R.name
@@ -0,0 +1,832 @@
//gloves w_uniform wear_suit shoes
atom/var/list/suit_fibers
atom/proc/add_fibers(mob/living/carbon/human/M)
if(M.gloves)
if(M.gloves.transfer_blood)
if(add_blood(M.gloves.bloody_hands_mob))
M.gloves.transfer_blood--
//world.log << "[M.gloves] added blood to [src] from [M.gloves.bloody_hands_mob]"
else if(M.bloody_hands)
if(add_blood(M.bloody_hands_mob))
M.bloody_hands--
//world.log << "[M] added blood to [src] from [M.bloody_hands_mob]"
if(!suit_fibers) suit_fibers = list()
var/fibertext
var/item_multiplier = istype(src,/obj/item)?1.2:1
if(M.wear_suit)
fibertext = "Material from \a [M.wear_suit]."
if(prob(10*item_multiplier) && !(fibertext in suit_fibers))
//world.log << "Added fibertext: [fibertext]"
suit_fibers += fibertext
if(!(M.wear_suit.body_parts_covered & 32))
if(M.w_uniform)
fibertext = "Fibers from \a [M.w_uniform]."
if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed.
//world.log << "Added fibertext: [fibertext]"
suit_fibers += fibertext
if(!(M.wear_suit.body_parts_covered & 64))
if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
//world.log << "Added fibertext: [fibertext]"
suit_fibers += fibertext
else if(M.w_uniform)
fibertext = "Fibers from \a [M.w_uniform]."
if(prob(15*item_multiplier) && !(fibertext in suit_fibers))
// "Added fibertext: [fibertext]"
suit_fibers += fibertext
if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
//world.log << "Added fibertext: [fibertext]"
suit_fibers += "Material from a pair of [M.gloves.name]."
else if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
//world.log << "Added fibertext: [fibertext]"
suit_fibers += "Material from a pair of [M.gloves.name]."
if(!suit_fibers.len) del suit_fibers
atom/proc/get_duplicate(var/atom/location)
var/atom/movable/temp_atom = new /atom/movable(location)
temp_atom.name = src.name
temp_atom.desc = src.desc
temp_atom.icon = src.icon
temp_atom.icon_state = src.icon_state
temp_atom.fingerprints = src.fingerprints
temp_atom.blood_DNA = src.blood_DNA
temp_atom.suit_fibers = src.suit_fibers
if(src.original_atom)
temp_atom.original_atom = src.original_atom
else
temp_atom.original_atom = src
return temp_atom
#define FINGERPRINT_COMPLETE 6 //This is the output of the stringpercent(print) proc, and means about 80% of
//the print must be there for it to be complete. (Prints are 32 digits)
obj/machinery/computer/forensic_scanning
name = "High-Res Forensic Scanning Computer"
icon_state = "forensic"
var
obj/item/scanning
temp = ""
canclear = 1
authenticated = 0
//Here's the structure for files: each entry is a list, and entry one in that list is the string of their
//full and scrambled fingerprint. This acts as the method to arrange evidence. Each subsequent entry is list
//in the form (from entries):
// 1: Object
// 2: All prints on the object
// 3: All fibers on the object
// 4: All blood on the object
//This is then used to show what objects were used to "find" the full print, as well as the fibers on it.
list/files
//This holds objects (1) without prints, and their fibers(2) and blood(3).
list/misc
obj/item/weapon/f_card/card
scan_data = ""
scan_name = ""
scan_process = 0
req_access = list(access_forensics_lockers)
New()
..()
new /obj/item/weapon/book/manual/detective(get_turf(src))
return
attack_ai(mob/user)
return attack_hand(user)
attack_hand(mob/user)
if(..())
return
user.machine = src
var/dat = ""
var/isai = 0
if(istype(usr,/mob/living/silicon))
isai = 1
if(temp)
dat += "<tt>[temp]</tt><br><br>"
if(canclear) dat += "<a href='?src=\ref[src];operation=clear'>{Clear Screen}</a>"
else
if(!authenticated)
dat += "<a href='?src=\ref[src];operation=login'>{Log In}</a>"
else
dat += "<a href='?src=\ref[src];operation=logout'>{Log Out}</a><br><hr><br>"
if(scanning)
if(scan_process)
dat += "Scan Object: {[scanning.name]}<br>"
dat += "<a href='?src=\ref[src];operation=cancel'>{Cancel Scan}</a> {Print}<br>"
else
if(isai) dat += "Scan Object: {[scanning.name]}<br>"
else dat += "Scan Object: <a href='?src=\ref[src];operation=eject'>{[scanning.name]}</a><br>"
dat += "<a href='?src=\ref[src];operation=scan'>{Scan}</a> <a href='?src=\ref[src];operation=print'>{Print}</a><br>"
else
if(isai) dat += "{No Object Inserted}<br>"
else dat += "<a href='?src=\ref[src];operation=insert'>{No Object Inserted}</a><br>"
dat += "{Scan} <a href='?src=\ref[src];operation=print'>{Print}</a><br>"
dat += "<a href='?src=\ref[src];operation=database'>{Access Database}</a><br><br>"
dat += "<tt>[scan_data]</tt>"
if(scan_data && !scan_process)
dat += "<br><a href='?src=\ref[src];operation=erase'>{Erase Data}</a>"
user << browse(dat,"window=scanner")
onclose(user,"scanner")
Topic(href,href_list)
switch(href_list["operation"])
if("login")
var/mob/M = usr
if(istype(M,/mob/living/silicon))
authenticated = 1
updateDialog()
return
var/obj/item/weapon/card/id/I = M.equipped()
if (I && istype(I))
if(src.check_access(I))
authenticated = 1
//usr << "\green Access Granted"
//if(!authenticated)
//usr << "\red Access Denied"
if("logout")
authenticated = 0
if("clear")
if(canclear)
temp = null
if("eject")
if(scanning)
scanning.loc = loc
scanning = null
else
temp = "Eject Failed: No Object"
if("insert")
var/mob/M = usr
var/obj/item/I = M.equipped()
if(I && istype(I))
if(istype(I, /obj/item/weapon/evidencebag))
scanning = I.contents[1]
scanning.loc = src
I.overlays -= scanning
I.icon_state = "evidenceobj"
else
scanning = I
M.drop_item()
I.loc = src
else
usr << "Invalid Object Rejected."
if("card")
var/mob/M = usr
var/obj/item/I = M.equipped()
if(!(I && istype(I,/obj/item/weapon/f_card)))
I = card
if(I && istype(I,/obj/item/weapon/f_card))
card = I
if(card.amount > 1 || !card.fingerprints.len)
usr << "\red ERROR: No prints/too many cards."
if(card.loc == src)
card.loc = src.loc
card = null
return
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(href_list["delete_record"])
delete_dossier(text2num(href_list["delete_record"]))
if(href_list["delete_aux"])
delete_record(text2num(href_list["delete_aux"]))
if((!misc || !misc.len) && (!files || !files.len))
temp = "Database is empty."
for(var/atom/A in contents)
if(A == scanning)
continue
del(A)
else
if(files && files.len)
temp = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points:<br>"
for(var/i = 1, i <= files.len, i++)
temp += "<a href='?src=\ref[src];operation=record;identifier=[i]'>{Dossier [i]}</a><br>"
temp += "<br><a href='?src=\ref[src];operation=card'>{Insert Finger Print Card}</a><br><br><br>"
else
temp = ""
if(misc && misc.len)
if(href_list["delete"])
delete_record(text2num(href_list["delete"]))
temp += "<b>Auxiliary Evidence Database</b><br><br>"
temp += "This is where anything without fingerprints goes.<br><br>"
for(var/i = 1, i <= misc.len, i++)
var/list/temp_list = misc[i]
var/item_name = get_name(temp_list[1])
temp += "<a href='?src=\ref[src];operation=auxiliary;identifier=[i]'>{[item_name]}</a><br>"
if("record")
canclear = 0
if(files)
temp = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
var/identifier = text2num(href_list["identifier"])
var/list/dossier = files[identifier]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: (80% or higher completion reached)<br>" + prints[num2text(2)] + "<br>"
temp += print_string
for(var/i = 2, i <= dossier.len, 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 && fibers.len)
var/dat = "[fibers[1]]"
for(var/j = 2, j <= fibers.len, 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 && blood.len)
var/dat = "[blood[1]]"
if(blood.len > 1)
for(var/j = 2, j <= blood.len, 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;delete_record=[href_list["identifier"]]'>{Delete this Dossier}</a>"
temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("databaseprint")
if(files)
var/obj/item/weapon/paper/P = new(loc)
P.name = "Database File (Dossier [href_list["identifier"]])"
P.overlays += "paper_words"
P.info = "<b>Criminal Evidence Database</b><br><br>"
P.info += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
var/list/dossier = files[text2num(href_list["identifier"])]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: " + prints[num2text(2)] + "<BR>"
P.info += print_string
for(var/i = 2, i <= dossier.len, 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 && fibers.len)
var/dat = "[fibers[1]]"
for(var/j = 2, j <= fibers.len, 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 && blood.len)
var/dat = "[blood[1]]"
if(blood.len > 1)
for(var/j = 2, j <= blood.len, 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 && fibers.len)
var/dat = "[fibers[1]]"
for(var/j = 2, j <= fibers.len, 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 && blood.len)
var/dat = "[blood[1]]"
for(var/j = 2, j <= blood.len, 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;delete_aux=[href_list["identifier"]]'>{Delete This Record}</a>"
temp += "<br><a href='?src=\ref[src];operation=auxiliaryprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("auxiliaryprint")
if(misc)
var/obj/item/weapon/paper/P = new(loc)
var/identifier = text2num(href_list["identifier"])
var/list/outputs = misc[identifier]
var/item_name = get_name(outputs[1])
P.name = "Auxiliary Database File ([item_name])"
P.overlays += "paper_words"
P.info = "<b>Auxiliary Evidence Database</b><br><br>"
P.info += "Consolidated data points: [item_name]<br>"
var/list/fibers = outputs[2]
if(fibers && fibers.len)
var/dat = "[fibers[1]]"
for(var/j = 2, j <= fibers.len, 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."
var/list/blood = outputs[3]
if(blood && blood.len)
var/dat = "[blood[1]]"
for(var/j = 2, j <= blood.len, 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.<br>"
else
usr << "ERROR. Database not found!<br>"
if("scan")
if(istype(scanning,/obj/item/weapon/f_card))
card = scanning
scanning = initial(scanning)
process_card()
else if(scanning)
scan_process = 3
scan_data = "Scanning [scanning]: 25% complete"
updateDialog()
sleep(50)
if(!scan_process)
scan_data = null
updateDialog()
return
scan_data = "Scanning [scanning]: 50% complete"
updateDialog()
scan_process = 2
sleep(50)
if(!scan_process)
scan_data = null
updateDialog()
return
scan_data = "Scanning [scanning]: 75% complete"
updateDialog()
scan_process = 1
sleep(50)
if(!scan_process)
scan_data = null
updateDialog()
return
scan_process = 0
scan_name = scanning.name
scan_data = "<u>[scanning]</u><br><br>"
if (scanning.blood_DNA.len)
scan_data += "Blood Found:<br>"
for(var/i = 1, i <= scanning.blood_DNA.len, i++)
var/list/templist = scanning.blood_DNA[i]
scan_data += "-Blood type: [templist[2]]\nDNA: [templist[1]]<br><br>"
else
scan_data += "No Blood Found<br><br>"
if (!length(scanning.fingerprints))
scan_data += "No Fingerprints Found<br><br>"
else
var/list/L = scanning.fingerprints
scan_data += "Isolated [L.len] Fingerprints. Loaded into database.<br>"
add_data(scanning)
if(!scanning.suit_fibers)
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"
else*/
scan_data += "No Fibers/Materials Located<br>"
else
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"*/
scan_data += "Fibers/Materials Found:<br>"
for(var/data in scanning.suit_fibers)
scan_data += "- [data]<br>"
if(istype(scanning,/obj/item/device/detective_scanner))
scan_data += "<br><b>Data transfered from Scanner to Database.</b><br>"
add_data_scanner(scanning)
else if(!length(scanning.fingerprints))
scan_data += "<br><b><a href='?src=\ref[src];operation=add'>Add to Database?</a></b><br>"
else
temp = "Scan Failed: No Object"
if("print")
if(scan_data)
temp = "Scan Data Printed."
var/obj/item/weapon/paper/P = new(loc)
P.name = "Scan Data ([scan_name])"
P.info = "<tt>[scan_data]</tt>"
P.overlays += "paper_words"
else
temp = "Print Failed: No Data"
if("erase")
scan_data = ""
if("cancel")
scan_process = 0
if("add")
if(scanning)
add_data(scanning)
else
temp = "Data Transfer Failed: No Object."
updateUsrDialog()
verb/reset()
set name = "Reset Database"
set category = "Object"
set src in oview(1)
temp = ""
add_fingerprint(usr)
files = list()
misc = list()
for(var/atom/A in contents)
if(A == scanning)
continue
del(A)
return
ex_act()
return
proc/add_data_scanner(var/obj/item/device/detective_scanner/W)
for(var/i = 1, i <= W.stored.len, i++)
var/list/data = W.stored[i]
add_data(data[1],1,data[2],data[3],data[4])
W.stored = list()
for(var/atom/A in W.contents)
del(A)
return
proc/add_data(var/atom/A, var/override = 0, var/tempfingerprints, var/tempsuit_fibers,var/tempblood_DNA)
//What follows is massive. It cross references all stored data in the scanner with the other stored data,
//and what is already in the computer. Not sure how bad the lag may/may not be.
var
backup_prints
backup_fibers
backup_DNA
if(override)
backup_prints = A.fingerprints
A.fingerprints = tempfingerprints
backup_fibers = A.suit_fibers
A.suit_fibers = tempsuit_fibers
backup_DNA = A.blood_DNA
A.blood_DNA = tempblood_DNA
if((!A.fingerprints || !length(A.fingerprints))) //No prints
var/merged = 0
if(!misc)
misc = list()
if(misc)
for(var/i = 1, i <= misc.len, i++) //Lets see if we can find it.
var/list/templist = misc[i]
var/atom/check = templist[1]
if(check.original_atom == A || check.original_atom == A.original_atom) //There it is!
merged = 1
var/list/fibers = templist[2]
if(!fibers)
fibers = list()
if(A.suit_fibers)
for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
fibers += A.suit_fibers[j]
var/list/blood = templist[3]
if(!blood)
blood = list()
if(A.blood_DNA)
for(var/j = 1, j <= A.blood_DNA.len, j++) //Blood~~~
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
blood += A.blood_DNA[j]
var/list/sum_list[3] //Pack it back up!
sum_list[1] = check
sum_list[2] = fibers
sum_list[3] = blood
misc[i] = sum_list //Store it!
break //We found it, we're done here.
if(!merged) //Nope! Guess we have to add it!
var/list/templist[3]
templist[1] = A.get_duplicate(src)
templist[2] = A.suit_fibers
templist[3] = A.blood_DNA
misc.len++
misc[misc.len] = templist //Store it!
return !merged
else //Has prints.
var/list/found_prints[A.fingerprints.len + 1]
for(var/i = 1, i <= found_prints.len, i++)
found_prints[i] = 0
if(!files)
files = list()
for(var/i = 1, i <= files.len, i++) //Lets see if we can find the owner of the prints
var/list/perp_list = files[i]
var/list/perp_prints = params2list(perp_list[1])
var/perp = perp_prints[num2text(1)]
var/found2 = 0
for(var/m = 1, m <= A.fingerprints.len, m++) //Compare database prints with prints on object.
var/list/test_prints_list = params2list(A.fingerprints[m])
var/checker = test_prints_list[num2text(1)]
if(checker == perp) //Found 'em! Merge!
found_prints[m] = 1
for(var/n = 2, n <= perp_list.len, n++) //Lets see if it is already in the database
var/list/target = perp_list[n]
var/atom/atom_checker = target[1]
if(atom_checker.original_atom == A || atom_checker.original_atom == A.original_atom) //Found the original object!
found2 = 1
var/list/prints = target[2]
if(!prints)
prints = list()
if(A.fingerprints)
for(var/j = 1, j <= A.fingerprints.len, j++) //Fingerprints~~~
var/list/print_test1 = params2list(A.fingerprints[j])
var/test_print1 = print_test1[num2text(1)]
var/found = 0
for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there
var/list/print_test2 = params2list(prints[k])
var/test_print2 = print_test2[num2text(1)]
if(test_print2 == test_print1) //It is! Merge!
prints[k] = "1=" + test_print2 + "&2=" + stringmerge(print_test2[num2text(2)],print_test1[num2text(2)])
found = 1
break //We found it, we're done here.
if(!found) //It isn't! Add!
prints += A.fingerprints[j]
var/list/fibers = target[3]
if(!fibers)
fibers = list()
if(A.suit_fibers)
for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
fibers += A.suit_fibers[j]
var/list/blood = target[4]
if(!blood)
blood = list()
if(A.blood_DNA)
for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
blood += A.blood_DNA[j]
var/list/sum_list[4] //Pack it back up!
sum_list[1] = atom_checker
sum_list[2] = prints
sum_list[3] = fibers
sum_list[4] = blood
perp_list[n] = sum_list //Store it!
files[i] = perp_list
break //We found it, we're done here.
if(!found2) //Add a new datapoint to this perp!
var/list/sum_list[4]
sum_list[1] = A.get_duplicate(src)
sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers
sum_list[4] = A.blood_DNA
perp_list.len++
perp_list[perp_list.len] = sum_list
files[i] = perp_list
for(var/m = 1, m < found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint!
if(found_prints[m] == 0)
var/list/newperp[2]
var/list/sum_list[4]
sum_list[1] = A.get_duplicate(src)
sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers
sum_list[4] = A.blood_DNA
newperp[2] = sum_list
newperp[1] = A.fingerprints[m]
if(!files)
files = newperp
else
files.len++
files[files.len] = newperp
update_fingerprints() //Lets update the calculated sum of the stored prints.
if(override)
A.fingerprints = backup_prints
A.suit_fibers = backup_fibers
A.blood_DNA = backup_DNA
return
proc/update_fingerprints() //I am tired, but this updates the master print from evidence, which is used to determine completion of a print.
for(var/k = 1, k <= files.len, k++)
var/list/perp_list = files[k]
var/list/perp_prints = params2list(perp_list[1])
var/perp = perp_prints[num2text(1)]
var/list/found_prints = list()
for(var/i = 2, i <= perp_list.len, i++)
var/list/test_list = perp_list[i]
var/list/test_prints = test_list[2]
for(var/j = 1, j <= test_prints.len, j++)
var/list/test_list_2 = params2list(test_prints[j])
var/test_prints_2 = test_list_2[num2text(1)]
if(test_prints_2 == perp)
found_prints += test_list_2[num2text(2)]
break
for(var/prints in found_prints)
perp_prints[num2text(2)] = stringmerge(perp_prints[num2text(2)],prints)
perp_list[1] = "1=" + perp + "&2=" + perp_prints[num2text(2)]
files[k] = perp_list
return
proc/process_card() //Same as above, but for fingerprint cards
if(card.fingerprints && !(card.amount > 1))
for(var/k = 1, k <= card.fingerprints.len, k++)
var/list/test_prints = params2list(card.fingerprints[k])
var/print = test_prints[num2text(1)]
for(var/i = 1, i <= files.len, i++)
var/list/test_list = files[i]
var/list/perp_prints = params2list(test_list[1])
var/perp = perp_prints[num2text(1)]
if(perp == print)
test_list[1] = "1=" + print + "&2=" + print
files[i] = test_list
break
del(card)
else
usr << "\red ERROR: No prints/too many cards."
if(card.loc == src)
card.loc = src.loc
card = null
return
return
proc/delete_record(var/location) //Deletes an entry in the misc database at the given location
if(misc && misc.len)
for(var/i = location, i < misc.len, i++)
misc[i] = misc[i+i]
misc.len--
return
proc/get_name(var/atom/A) //HurrDurr
return A.name
proc/delete_dossier(var/location) //Deletes a Dossier at a given location.
if(files && files.len)
if(files.len > location)
for(var/i = location, i < files.len, i++)
files[i] = files[i + 1]
if(files.len >= location)
files[files.len] = list()
files.len--
return
detective
icon_state = "old"
name = "PowerScan Mk.I"
obj/item/clothing/shoes/var
track_blood = 0
mob/living/carbon/human/track_blood_mob
mob/var
bloody_hands = 0
mob/living/carbon/human/bloody_hands_mob
track_blood
mob/living/carbon/human/track_blood_mob
obj/item/clothing/gloves/var
transfer_blood = 0
mob/living/carbon/human/bloody_hands_mob
obj/effect/decal/cleanable/blood/var
track_amt = 2
mob/blood_owner
turf/Exited(mob/living/carbon/human/M)
if(istype(M,/mob/living))
if(!istype(src, /turf/space)) // Bloody tracks code starts here
if(M.track_blood > 0)
M.track_blood--
src.add_bloody_footprints(M.track_blood_mob,1,M.dir,get_tracks(M))
else if(istype(M,/mob/living/carbon/human))
if(M.shoes)
if(M.shoes.track_blood > 0)
M.shoes.track_blood--
src.add_bloody_footprints(M.shoes.track_blood_mob,1,M.dir,M.shoes.name) // And bloody tracks end here
. = ..()
turf/Entered(mob/living/carbon/human/M)
if(istype(M,/mob/living))
if(M.track_blood > 0)
M.track_blood--
src.add_bloody_footprints(M.track_blood_mob,0,M.dir,get_tracks(M))
else if(istype(M,/mob/living/carbon/human))
if(M.shoes && !istype(src,/turf/space))
if(M.shoes.track_blood > 0)
M.shoes.track_blood--
src.add_bloody_footprints(M.shoes.track_blood_mob,0,M.dir,M.shoes.name)
for(var/obj/effect/decal/cleanable/blood/B in src)
if(B.track_amt <= 0) continue
if(B.type != /obj/effect/decal/cleanable/blood/tracks)
if(istype(M,/mob/living/carbon/human))
if(M.shoes)
M.shoes.add_blood(B.blood_owner)
M.shoes.track_blood_mob = B.blood_owner
M.shoes.track_blood = max(M.shoes.track_blood,8)
else
M.add_blood(B.blood_owner)
M.track_blood_mob = B.blood_owner
M.track_blood = max(M.track_blood,rand(4,8))
B.track_amt--
break
. = ..()
turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
for(var/obj/effect/decal/cleanable/blood/tracks/T in src)
if(T.dir == d)
if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
T.desc = "These bloody footprints appear to have been made by [info]."
if(istype(M,/mob/living/carbon/human))
T.blood_DNA.len++
T.blood_DNA[T.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
return
var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
this.icon = 'footprints.dmi'
if(leaving)
this.icon_state = "blood2"
else
this.icon_state = "blood1"
this.dir = d
this.desc = "These bloody footprints appear to have been made by [info]."
if(istype(M,/mob/living/carbon/human))
if(this.blood_DNA.len)
this.blood_DNA.len++
this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
else
this.blood_DNA = list(list(M.dna.unique_enzymes,M.dna.b_type))
proc/get_tracks(mob/M)
if(istype(M,/mob/living))
if(istype(M,/mob/living/carbon/human))
. = "human feet"
else if(istype(M,/mob/living/carbon/monkey))
. = "monkey paws"
else if(istype(M,/mob/living/silicon/robot))
. = "robot feet"
else
. = "an unknown creature"
proc/blood_incompatible(donor,receiver)
var
donor_antigen = copytext(donor,1,lentext(donor))
receiver_antigen = copytext(receiver,1,lentext(receiver))
donor_rh = findtext("+",donor)
receiver_rh = findtext("+",receiver)
if(donor_rh && !receiver_rh) return 1
switch(receiver_antigen)
if("A")
if(donor_antigen != "A" && donor_antigen != "O") return 1
if("B")
if(donor_antigen != "B" && donor_antigen != "O") return 1
if("O")
if(donor_antigen != "O") return 1
//AB is a universal receiver.
return 0
/obj/item/weapon/rag
name = "damp rag"
desc = "For cleaning up messes, I suppose."
w_class = 1
icon = 'toy.dmi'
icon_state = "rag"
afterattack(atom/A as obj|turf|area, mob/user as mob)
if(istype(A))
user.visible_message("[user] starts to wipe down [A] with [src]!")
if(do_after(user,30))
user.visible_message("[user] finishes wiping off the [A]!")
A.clean_blood()
return
+69
View File
@@ -0,0 +1,69 @@
//CONTAINS:
//Evidence bags and stuff
///////////
//Shamelessly ripped from Mini's old code.
/obj/item/weapon/evidencebag
name = "evidence bag"
desc = "An empty evidence bag."
icon = 'storage.dmi'
icon_state = "evidenceobj"
w_class = 1
/* buggy and stuff
/obj/item/weapon/evidencebag/attackby(obj/item/weapon/O, mob/user as mob)
return src.afterattack(O, user)
*/
/obj/item/weapon/evidencebag/afterattack(obj/item/O, mob/user as mob)
if(istype(O, /obj/item/weapon/storage) && O in user)
return ..()
if(!(O && istype(O)) || O.anchored == 1)
user << "You can't put that inside the [src]!"
return ..()
if(O in user)
user << "You are wearing that."
return
if(src.contents.len > 0)
user << "The [src] already has something inside it."
return ..()
if(istype(O.loc,/obj/item/weapon/storage))
var/obj/item/weapon/storage/U = O.loc
user.client.screen -= O
U.contents.Remove(O)
user << "You put the [O] inside the [src]."
icon_state = "evidence"
src.overlays += O
desc = "An evidence bag containing \a [O]. [O.desc]"
O.loc = src
w_class = O.w_class
return
/obj/item/weapon/evidencebag/attack_self(mob/user as mob)
if (src.contents.len > 0)
var/obj/item/I = src.contents[1]
user << "You take the [I] out of the [src]."
src.overlays -= I
I.loc = get_turf(user.loc)
w_class = 1
src.icon_state = "evidenceobj"
desc = "An empty evidence bag."
else
user << "[src] is empty."
src.icon_state = "evidenceobj"
return
/obj/item/weapon/storage/box/evidence
name = "evidence bag box"
desc = "A box claiming to contain evidence bags."
New()
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/f_card(src)
..()
return
@@ -381,7 +381,7 @@
if (!t1)
t1 = wear_suit.icon_state
overlays += image("icon" = 'mob.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (wear_suit.blood_DNA)
if (wear_suit.blood_DNA.len)
if (istype(wear_suit, /obj/item/clothing/suit/armor))
overlays += image("icon" = 'blood.dmi', "icon_state" = "armorblood[!lying ? "" : "2"]", "layer" = MOB_LAYER)
else
@@ -406,7 +406,7 @@
if (!t1)
t1 = head.icon_state
overlays += image("icon" = 'mob.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (head.blood_DNA)
if (head.blood_DNA.len)
overlays += image("icon" = 'blood.dmi', "icon_state" = "helmetblood[!lying ? "" : "2"]", "layer" = MOB_LAYER)
head.screen_loc = ui_oclothing
+22 -22
View File
@@ -35,20 +35,20 @@
skipears = src.head.flags_inv & HIDEEARS
if (src.w_uniform && !skipjumpsuit)
if (src.w_uniform.blood_DNA)
usr << "\red [src.name] is wearing a[src.w_uniform.blood_DNA ? " bloody " : " "] \icon[src.w_uniform] [src.w_uniform.name]!"
if (src.w_uniform.blood_DNA.len)
usr << "\red [src.name] is wearing a[src.w_uniform.blood_DNA.len ? " bloody " : " "] \icon[src.w_uniform] [src.w_uniform.name]!"
else
usr << "\blue [src.name] is wearing a \icon[src.w_uniform] [src.w_uniform.name]."
if (src.wear_suit)
if (src.wear_suit.blood_DNA)
usr << "\red [src.name] has a[src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name] on!"
if (src.wear_suit.blood_DNA.len)
usr << "\red [src.name] has a[src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name] on!"
else
usr << "\blue [src.name] has a \icon[src.wear_suit] [src.wear_suit.name] on."
if (src.head)
if (src.head.blood_DNA)
usr << "\red [src.name] has a[src.head.blood_DNA ? " bloody " : " "] \icon[src.head] [src.head.name] on his head!"
if (src.head.blood_DNA.len)
usr << "\red [src.name] has a[src.head.blood_DNA.len ? " bloody " : " "] \icon[src.head] [src.head.name] on his head!"
else
usr << "\blue [src.name] has a \icon[src.head] [src.head.name] on."
@@ -59,47 +59,47 @@
usr << "\blue [src.name] has a \icon[src.ears] [src.ears.name] by [t_his] mouth."
if (src.wear_mask && !skipmask)
if (src.wear_mask.blood_DNA)
usr << "\red [src.name] has a[src.wear_mask.blood_DNA ? " bloody " : " "] \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face!"
if (src.wear_mask.blood_DNA.len)
usr << "\red [src.name] has a[src.wear_mask.blood_DNA.len ? " bloody " : " "] \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face!"
else
usr << "\blue [src.name] has a \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face."
if (src.l_hand)
if (src.l_hand.blood_DNA)
usr << "\red [src.name] has a[src.l_hand.blood_DNA ? " bloody " : " "] \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand!"
if (src.l_hand.blood_DNA.len)
usr << "\red [src.name] has a[src.l_hand.blood_DNA.len ? " bloody " : " "] \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand!"
else
usr << "\blue [src.name] has a \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand."
if (src.r_hand)
if (src.r_hand.blood_DNA)
usr << "\red [src.name] has a[src.r_hand.blood_DNA ? " bloody " : " "] \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand!"
if (src.r_hand.blood_DNA.len)
usr << "\red [src.name] has a[src.r_hand.blood_DNA.len ? " bloody " : " "] \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand!"
else
usr << "\blue [src.name] has a \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand."
if (src.belt)
if (src.belt.blood_DNA)
usr << "\red [src.name] has a[src.belt.blood_DNA ? " bloody " : " "] \icon[src.belt] [src.belt.name] on [t_his] belt!"
if (src.belt.blood_DNA.len)
usr << "\red [src.name] has a[src.belt.blood_DNA.len ? " bloody " : " "] \icon[src.belt] [src.belt.name] on [t_his] belt!"
else
usr << "\blue [src.name] has a \icon[src.belt] [src.belt.name] on [t_his] belt."
if(src.s_store && !skipsuitstorage)
if(src.s_store.blood_DNA)
usr << "\red [src.name] has a[src.s_store.blood_DNA ? " bloody " : " "] \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]!"
if(src.s_store.blood_DNA.len)
usr << "\red [src.name] has a[src.s_store.blood_DNA.len ? " bloody " : " "] \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]!"
else
usr << "\blue [src.name] has a \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]."
usr << "\blue [src.name] has a \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]."
if (src.shoes && !skipshoes)
usr << "[src.shoes.blood_DNA ? "\red" : "\blue"] [src.name] is wearing[src.shoes.blood_DNA ? " bloody " : " "] \icon[src.shoes] [src.shoes.name] on [t_his] feet."
usr << "[src.shoes.blood_DNA.len ? "\red" : "\blue"] [src.name] is wearing[src.shoes.blood_DNA.len ? " bloody " : " "] \icon[src.shoes] [src.shoes.name] on [t_his] feet."
if (src.gloves && !skipgloves)
if (src.gloves.blood_DNA)
if (src.gloves.blood_DNA.len)
usr << "\red [src.name] has bloody \icon[src.gloves] [src.gloves.name] on [t_his] hands!"
else
usr << "\blue [src.name] has \icon[src.gloves] [src.gloves.name] on [t_his] hands."
else if (src.blood_DNA)
usr << "\red [src.name] has[src.blood_DNA ? " bloody " : " "] hands!"
else if (src.blood_DNA.len)
usr << "\red [src.name] has[src.blood_DNA.len ? " bloody " : " "] hands!"
if (src.glasses && !skipeyes)
if (src.glasses.blood_DNA)
if (src.glasses.blood_DNA.len)
usr << "\red [src.name] has bloody \icon[src.glasses] [src.glasses.name] on [t_his] eyes!"
else
usr << "\blue [src.name] has \icon[src.glasses] [src.glasses.name] on [t_his] eyes."
+12 -8
View File
@@ -853,7 +853,7 @@
overlays += image("icon" = 'uniform_fat.dmi', "icon_state" = "[t1][!lying ? "_s" : "_l"]", "layer" = MOB_LAYER)
else
overlays += image("icon" = 'uniform.dmi', "icon_state" = text("[][]",t1, (!(lying) ? "_s" : "_l")), "layer" = MOB_LAYER)
if (w_uniform.blood_DNA)
if (w_uniform.blood_DNA.len)
var/icon/stain_icon = icon('blood.dmi', "uniformblood[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
@@ -874,10 +874,10 @@
if (!t1)
t1 = gloves.icon_state
overlays += image("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (gloves.blood_DNA)
if (gloves.blood_DNA.len)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
else if (blood_DNA)
else if (blood_DNA.len)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
// Glasses
@@ -892,7 +892,7 @@
if (shoes)
var/t1 = shoes.icon_state
overlays += image("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (shoes.blood_DNA)
if (shoes.blood_DNA.len)
var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Radio
/* if (w_radio)
@@ -946,7 +946,7 @@
var/t1 = wear_suit.icon_state
overlays += image("icon" = 'suit.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (wear_suit)
if (wear_suit.blood_DNA)
if (wear_suit.blood_DNA.len)
var/icon/stain_icon = null
if (istype(wear_suit, /obj/item/clothing/suit/armor/vest || /obj/item/clothing/suit/wcoat))
stain_icon = icon('blood.dmi', "armorblood[!lying ? "" : "2"]")
@@ -982,7 +982,7 @@
var/t1 = wear_mask.icon_state
overlays += image("icon" = 'mask.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (!istype(wear_mask, /obj/item/clothing/mask/cigarette))
if (wear_mask.blood_DNA)
if (wear_mask.blood_DNA.len)
var/icon/stain_icon = icon('blood.dmi', "maskblood[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
wear_mask.screen_loc = ui_mask
@@ -994,7 +994,7 @@
if(istype(head,/obj/item/clothing/head/kitty))
head_icon = (( lying ) ? head:mob2 : head:mob)
overlays += image("icon" = head_icon, "layer" = MOB_LAYER)
if (head.blood_DNA)
if (head.blood_DNA.len)
var/icon/stain_icon = icon('blood.dmi', "helmetblood[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
head.screen_loc = ui_head
@@ -2274,4 +2274,8 @@ It can still be worn/put on as normal.
/mob/living/carbon/human/Paralyse(amount)
if(mutations & HULK)
return
..()
..()
/mob/living/carbon/human/proc/check_dna()
dna.check_integrity(src)
return
@@ -367,6 +367,7 @@
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo
new_character.dna.ready_dna(new_character)
new_character.dna.b_type = preferences.b_type
if(mind)
mind.transfer_to(new_character)
mind.original = new_character
@@ -601,7 +601,6 @@ datum/preferences
character.gender = gender
character.age = age
character.b_type = b_type
character.r_eyes = r_eyes
character.g_eyes = g_eyes