diff --git a/baystation12.dme b/baystation12.dme
index 870226bfa50..3535be05090 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -968,6 +968,7 @@
#include "code\modules\research\server.dm"
#include "code\WorkInProgress\AI_Visibility.dm"
#include "code\WorkInProgress\buildmode.dm"
+#include "code\WorkInProgress\detective_work.dm"
#include "code\WorkInProgress\explosion_particles.dm"
#include "code\WorkInProgress\mapload\dmm_suite.dm"
#include "code\WorkInProgress\mapload\reader.dm"
diff --git a/code/WorkInProgress/detective_work.dm b/code/WorkInProgress/detective_work.dm
new file mode 100644
index 00000000000..e74ba63c4a3
--- /dev/null
+++ b/code/WorkInProgress/detective_work.dm
@@ -0,0 +1,330 @@
+//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
+
+
+obj/machinery/computer/forensic_scanning
+ name = "High-Res Forensic Scanning Computer"
+ icon_state = "forensic"
+ var/obj/item/scanning
+ var/temp = ""
+ var/canclear = 1
+ var/authenticated = 0
+
+ var/scan_data = ""
+ var/scan_name = ""
+ var/scan_process = 0
+
+ req_access = list(access_forensics_lockers)
+
+ 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 += "[temp]
"
+ if(canclear) dat += "{Clear Screen}"
+ else
+ if(!authenticated)
+ dat += "{Log In}"
+ else
+ dat += "{Log Out}
"
+ if(scanning)
+ if(scan_process)
+ dat += "Scan Object: {[scanning.name]}
"
+ dat += "{Cancel Scan} {Print}
"
+ else
+ if(isai) dat += "Scan Object: {[scanning.name]}
"
+ else dat += "Scan Object: {[scanning.name]}
"
+ dat += "{Scan} {Print}
"
+ else
+ if(isai) dat += "{No Object Inserted}
"
+ else dat += "{No Object Inserted}
"
+ dat += "{Scan} {Print}
"
+ dat += "[scan_data]"
+ if(scan_data && !scan_process)
+ dat += "
{Erase Data}"
+ user << browse(dat,"window=scanner")
+ onclose(user,"scanner")
+ ex_act()
+ return
+ 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))
+ scanning = I
+ M.drop_item()
+ I.loc = src
+ else
+ temp = "Invalid Object Rejected."
+ if("scan")
+ 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 = "[scanning]
"
+ if (scanning.blood_DNA)
+ scan_data += "Blood Found:
"
+ scan_data += "-Blood type: [scanning.blood_type]\nDNA: [scanning.blood_DNA]
"
+ else
+ scan_data += "No Blood Found
"
+ if (!( scanning.fingerprints ))
+ scan_data += "No Fingerprints Found
"
+ else
+ var/list/L = params2list(scanning.fingerprints)
+ scan_data += "Isolated [L.len] Fingerprints:
"
+ for(var/i in L)
+ scan_data += "#[L.Find(i)] - [i]
"
+ scan_data += "
"
+
+ 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]:
"
+ for(var/data in scanner.stored_fibers)
+ scan_data += "- [data]
"
+ else
+ scan_data += "No Fibers/Materials Data
"
+ else
+ scan_data += "No Fibers/Materials Located
"
+ 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]:
"
+ for(var/data in scanner.stored_fibers)
+ scan_data += "- [data]
"
+ else
+ scan_data += "No Fibers/Materials Data
"
+
+ scan_data += "Fibers/Materials Found:
"
+ for(var/data in scanning.suit_fibers)
+ scan_data += "- [data]
"
+ 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 = "[scan_data]"
+ else
+ temp = "Print Failed: No Data"
+ if("erase")
+ scan_data = ""
+ if("cancel")
+ scan_process = 0
+ updateUsrDialog()
+
+ 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/decal/cleanable/blood/var/track_amt = 3
+
+
+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/decal/cleanable/blood/B in src)
+ if(B.track_amt <= 0) continue
+ if(B.type != /obj/decal/cleanable/blood/tracks && B.type != /obj/decal/cleanable/blood/drip)
+ if(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,8)
+ B.track_amt--
+ break
+ . = ..()
+
+turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
+ for(var/obj/decal/cleanable/blood/tracks/T in src)
+ if(T.dir == d)
+ if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
+ T.desc = "These bloody footprints appear to have been made by [info]."
+ if(istype(M,/mob/living/carbon/human))
+ T.blood_DNA = M.dna.unique_enzymes
+ T.blood_type = M.b_type
+ return
+ var/obj/decal/cleanable/blood/tracks/this = new(src)
+ if(leaving)
+ this.icon_state = "steps2"
+ else
+ this.icon_state = "steps1"
+ this.dir = d
+ this.desc = "These bloody footprints appear to have been made by [info]."
+ if(istype(M,/mob/living/carbon/human))
+ this.blood_DNA = M.dna.unique_enzymes
+ this.blood_type = M.b_type
+
+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,2)
+ receiver_antigen = copytext(receiver,1,2)
+ 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
+*/
\ No newline at end of file
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index 52521e8ebad..bc2deaf3dc0 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -81,6 +81,7 @@
/atom/proc/add_fingerprint(mob/living/M as mob)
if(isnull(M)) return
if(isnull(M.key)) return
+ add_fibers(M)
if (!( src.flags ) & 256)
return
if (ishuman(M))
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 0cbb3d48be3..6d6749d7f71 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -141,14 +141,13 @@
return 1
if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access
return 0
- for(var/req in src.req_access)
- if(!(req in I.access)) //doesn't have this access
- return 0
if(src.req_one_access && src.req_one_access.len)
for(var/req in src.req_one_access)
if(req in I.access) //has an access from the single access list
return 1
- return 0
+ for(var/req in src.req_access)
+ if(!(req in I.access)) //doesn't have this access
+ return 0
return 1
@@ -158,14 +157,14 @@
if(!src.req_access.len && (!src.req_one_access || !src.req_one_access.len)) return 1
if(!L) return 0
if(!istype(L, /list)) return 0
- for(var/req in src.req_access)
- if(!(req in L)) //doesn't have this access
- return 0
if(src.req_one_access && src.req_one_access.len)
for(var/req in src.req_one_access)
if(req in L) //has an access from the single access list
return 1
- return 0
+ for(var/req in src.req_access)
+ if(!(req in L)) //doesn't have this access
+ return 0
+
return 1
@@ -176,7 +175,7 @@
if("Station Engineer")
return list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks)
if("Assistant")
- return list(access_maint_tunnels)
+ return list()
if("Chaplain")
return list(access_morgue, access_chapel_office, access_crematorium)
if("Detective")
@@ -192,9 +191,9 @@
if("Captain")
return get_all_accesses()
if("Security Officer")
- return list(access_security, access_brig, access_court)
+ return list(access_security, access_brig, access_court, access_maint_tunnels)
if("Warden")
- return list(access_security, access_brig, access_armory, access_court)
+ return list(access_security, access_brig, access_armory, access_court, access_maint_tunnels)
if("Scientist")
return list(access_tox, access_tox_storage, access_research, access_xenobiology)
if("Head of Security")
diff --git a/code/game/jobs/job/captian.dm b/code/game/jobs/job/captian.dm
index 3a260e367df..c84c339a1d6 100644
--- a/code/game/jobs/job/captian.dm
+++ b/code/game/jobs/job/captian.dm
@@ -11,7 +11,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/captain(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/device/pda/captain(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/suit/armor/captain(H), H.slot_wear_suit)
@@ -40,7 +39,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/heads/hop(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/head_of_personnel(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/heads/hop(H), H.slot_belt)
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 810185ea97d..42680a51d58 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -16,7 +16,6 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/bartender(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/clothing/suit/armor/vest(H), H.slot_wear_suit)
@@ -123,7 +122,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_mine (H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/engineer(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/miner(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
@@ -244,7 +242,6 @@ var/global/lawyer = 0//Checks for another lawyer
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
if(!lawyer)
lawyer = 1
H.equip_if_possible(new /obj/item/clothing/under/lawyer/bluesuit(H), H.slot_w_uniform)
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 2a26e147daf..a0af39e115e 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -11,7 +11,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/heads/ce(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/engineer(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/chief_engineer(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/device/pda/heads/ce(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
@@ -35,7 +34,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_eng(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/engineer(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/engineer(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/orange(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/engineering(H), H.slot_belt)
@@ -59,7 +57,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_eng(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/atmospheric_technician(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/engineering(H), H.slot_belt)
@@ -80,7 +77,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_eng(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/roboticist(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/engineering(H), H.slot_belt)
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 24096fcdb1a..175502ebaba 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -11,7 +11,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/heads/cmo(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/chief_medical_officer(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/heads/cmo(H), H.slot_belt)
@@ -35,7 +34,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_med(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/medical(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/white(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/medical(H), H.slot_belt)
@@ -59,7 +57,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_medsci(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/geneticist(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/white(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/medical(H), H.slot_belt)
@@ -82,7 +79,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_med(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/medical(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/device/pda/medical(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/mask/surgical(H), H.slot_wear_mask)
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 7bc066e7649..5626d9f7fad 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -10,7 +10,6 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/weapon/storage/backpack/security (H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/device/radio/headset/heads/hos(H), H.slot_ears)
H.equip_if_possible(new /obj/item/clothing/under/rank/head_of_security(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/jackboots(H), H.slot_shoes)
@@ -18,7 +17,6 @@
H.equip_if_possible(new /obj/item/clothing/suit/armor/hos(H), H.slot_wear_suit)
H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
H.equip_if_possible(new /obj/item/clothing/head/helmet/HoS(H), H.slot_head)
- H.equip_if_possible(new /obj/item/clothing/mask/gas/emergency(H), H.slot_wear_mask)
H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses/sechud(H), H.slot_glasses)
H.equip_if_possible(new /obj/item/weapon/handcuffs(H), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/weapon/gun/energy/gun(H), H.slot_s_store)
@@ -42,7 +40,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_sec(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack/security(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/warden(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/jackboots(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/security(H), H.slot_belt)
@@ -50,7 +47,6 @@
H.equip_if_possible(new /obj/item/clothing/head/helmet/warden(H), H.slot_head)
H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses/sechud(H), H.slot_glasses)
- H.equip_if_possible(new /obj/item/clothing/mask/gas/emergency(H), H.slot_wear_mask)
H.equip_if_possible(new /obj/item/weapon/handcuffs(H), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/device/flash(H), H.slot_l_store)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
@@ -73,7 +69,6 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_sec(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/det(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/detective(H), H.slot_belt)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index df35f882a3d..39f28cc5a72 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -227,7 +227,6 @@ var/global/datum/controller/occupations/job_master
H.equip_if_possible(new /obj/item/device/radio/headset(H), H.slot_ears)
var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack(H)
- new /obj/item/weapon/storage/box/survival(BPK)
H.equip_if_possible(BPK, H.slot_back,1)
return 1
diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm
index e0241beb40d..0e0216f7267 100644
--- a/code/game/objects/devices/scanners.dm
+++ b/code/game/objects/devices/scanners.dm
@@ -65,6 +65,8 @@ MASS SPECTROMETER
icon_state = "forensic0"
var/amount = 20.0
var/printing = 0.0
+ var/list/stored_fibers = null
+ var/stored_name = null
w_class = 3.0
item_state = "electronic"
flags = FPRINT | TABLEPASS | ONBELT | CONDUCT | USEDELAY
diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm
index ca81bb608a1..6aca44d0e4e 100644
--- a/maps/tgstation.2.0.8.dmm
+++ b/maps/tgstation.2.0.8.dmm
@@ -769,7 +769,7 @@
"aoO" = (/turf/simulated/floor{dir = 10; icon_state = "carpetside"},/area/security/detectives_office)
"aoP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/floor{icon_state = "carpetside"},/area/security/detectives_office)
"aoQ" = (/turf/simulated/floor{dir = 6; icon_state = "carpetside"},/area/security/detectives_office)
-"aoR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
+"aoR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/forensic_scanning,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"aoS" = (/obj/structure/closet/lawcloset,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "wood"},/area/lawoffice)
"aoT" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{icon_state = "wood"},/area/lawoffice)
"aoU" = (/obj/structure/stool/chair,/obj/effect/landmark/start{name = "Lawyer"},/turf/simulated/floor{icon_state = "wood"},/area/lawoffice)
@@ -1518,11 +1518,11 @@
"aDj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/secondary/entry)
"aDk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/maintenance/fpmaint2)
"aDl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/storage/primary)
-"aDm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Primary Tool Storage"; req_access_txt = "12"},/turf/simulated/floor,/area/storage/primary)
+"aDm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Primary Tool Storage"; req_access_txt = "0"},/turf/simulated/floor,/area/storage/primary)
"aDn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/storage/primary)
"aDo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/storage/primary)
"aDp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/storage/primary)
-"aDq" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Primary Tool Storage"; req_access_txt = "12"},/turf/simulated/floor,/area/storage/primary)
+"aDq" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Primary Tool Storage"; req_access_txt = "0"},/turf/simulated/floor,/area/storage/primary)
"aDr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 1},/turf/simulated/floor/plating,/area/storage/primary)
"aDs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/fpmaint)
"aDt" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/disposalpipe/segment{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
@@ -2706,8 +2706,8 @@
"bab" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment{dir = 1},/obj/machinery/door/window/northleft{name = "Reception Window"; req_access = null; req_access_txt = "0"},/obj/machinery/door/window/southleft{name = "Research and Development"; req_access_txt = "7"},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bac" = (/obj/structure/table/reinforced,/obj/machinery/door/window/northright{name = "Reception Window"; req_access_txt = "0"},/obj/machinery/door/window/southright{name = "Research and Development"; req_access_txt = "7"},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bad" = (/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
-"bae" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Research Division Access"; req_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor,/area/medical/research{name = "Research Division"})
-"baf" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor,/area/medical/research{name = "Research Division"})
+"bae" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Research Division Access"; req_access_txt = "47"; req_one_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor,/area/medical/research{name = "Research Division"})
+"baf" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Research Division Access"; req_access_txt = "47"; req_one_access_txt = "1"},/turf/simulated/floor,/area/medical/research{name = "Research Division"})
"bag" = (/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bah" = (/obj/machinery/camera{c_tag = "Arrivals Auxiliary Docking"; dir = 8; network = "SS13"},/turf/simulated/floor,/area/hallway/secondary/entry)
"bai" = (/obj/machinery/door_control{name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 2; id = "Disposal Exit"},/turf/simulated/floor/plating,/area/maintenance/disposal)
@@ -2861,7 +2861,7 @@
"bda" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"bdb" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"bdc" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
-"bdd" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Chemistry"; req_access_txt = "33; 7"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
+"bdd" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Chemistry"; req_access_txt = "33; 7"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"bde" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/lab)
"bdf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/lab)
"bdg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/lab)
@@ -3002,8 +3002,8 @@
"bfL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/toxins/lab)
"bfM" = (/obj/item/weapon/stock_parts/console_screen,/obj/structure/table,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bfN" = (/obj/effect/sign/biohazard,/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
-"bfO" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/medical{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor,/area/medical/research{name = "Research Division"})
-"bfP" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/medical{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor,/area/medical/research{name = "Research Division"})
+"bfO" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/medical{name = "Research Division Access"; req_access_txt = "47"; req_one_access_txt = "1"},/turf/simulated/floor,/area/medical/research{name = "Research Division"})
+"bfP" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/medical{name = "Research Division Access"; req_access_txt = "47"; req_one_access_txt = "1"},/turf/simulated/floor,/area/medical/research{name = "Research Division"})
"bfQ" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bfR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bfS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/effect/sign/securearea{name = "EXTERNAL AIRLOCK"; desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; pixel_x = -1},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
@@ -3226,8 +3226,8 @@
"bkb" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bkc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/medbay)
"bkd" = (/obj/effect/sign/redcross,/turf/simulated/wall,/area/medical/medbay)
-"bke" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Medbay"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
-"bkf" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Medbay"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
+"bke" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Medbay"; req_access_txt = "5"; req_one_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
+"bkf" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Medbay"; req_access_txt = "5"; req_one_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bkg" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue)
"bkh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bki" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
@@ -4829,7 +4829,7 @@
"bOS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall,/area/maintenance/asmaint)
"bOT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bOU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = "90Curve"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"bOV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/door/airlock/maintenance{name = "Medical Maintenance"; req_access_txt = "5"},/obj/structure/disposalpipe/segment{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay)
+"bOV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/door/airlock/maintenance{name = "Medical Maintenance"; req_access_txt = "5"; req_one_access_txt = "1"},/obj/structure/disposalpipe/segment{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay)
"bOW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/wall,/area/medical/medbay)
"bOX" = (/obj/structure/disposalpipe/segment{dir = 1},/turf/simulated/wall/r_wall,/area/medical/virology)
"bOY" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 6; icon_state = "intact-r-f"; initialize_directions = 6; level = 1; name = "pipe"},/turf/simulated/wall/r_wall,/area/medical/virology)