mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 15:45:25 +01:00
BS12 Detective Work port.
git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3229 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 += " [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> [fibers[j]]"
|
||||
temp += " Fibers: [dat]<br>"
|
||||
else
|
||||
temp += " 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> [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;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 += " [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> [fibers[j]]"
|
||||
P.info += " Fibers: [dat]<br>"
|
||||
else
|
||||
P.info += " 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> [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 && fibers.len)
|
||||
var/dat = "[fibers[1]]"
|
||||
for(var/j = 2, j <= fibers.len, j++)
|
||||
dat += "<br> [fibers[j]]"
|
||||
temp += " Fibers: [dat]<br>"
|
||||
else
|
||||
temp += " 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> [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;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> [fibers[j]]"
|
||||
P.info += " Fibers: [dat]<br>"
|
||||
else
|
||||
P.info += " 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> [blood[j]]"
|
||||
P.info += " Blood: [dat]<br>"
|
||||
else
|
||||
P.info += " 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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user