diff --git a/baystation12.dme b/baystation12.dme
index dd7bc51837a..a23ac7b0512 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -128,7 +128,6 @@
#define FILE_DIR "code/modules/critters"
#define FILE_DIR "code/modules/critters/hivebots"
#define FILE_DIR "code/modules/customitems"
-#define FILE_DIR "code/modules/DetectiveWork"
#define FILE_DIR "code/modules/flufftext"
#define FILE_DIR "code/modules/food"
#define FILE_DIR "code/modules/icon generation"
@@ -211,8 +210,6 @@
#define FILE_DIR "code/WorkInProgress/animusstation"
#define FILE_DIR "code/WorkInProgress/Apples"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
-#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/BirdMan"
-#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/jungle"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
#define FILE_DIR "code/WorkInProgress/carn"
@@ -977,10 +974,6 @@
#include "code\modules\critters\critter_defenses.dm"
#include "code\modules\critters\critters.dm"
#include "code\modules\critters\hivebots\hivebot.dm"
-#include "code\modules\DetectiveWork\detective_work.dm"
-#include "code\modules\DetectiveWork\evidence.dm"
-#include "code\modules\DetectiveWork\footprints_and_rag.dm"
-#include "code\modules\DetectiveWork\scanner.dm"
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
@@ -1349,6 +1342,7 @@
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\LaserComputer.dm"
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\SuperMatter.dm"
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\ZeroPointLaser.dm"
+#include "code\WorkInProgress\Chinsky\ashtray.dm"
#include "code\WorkInProgress\Ported\policetape.dm"
#include "code\WorkInProgress\SkyMarshal\Ultralight_procs.dm"
#include "code\ZAS\Airflow.dm"
diff --git a/code/WorkInProgress/Cael_Aislinn/BirdMan/birdman.dmi b/code/WorkInProgress/Cael_Aislinn/BirdMan/birdman.dmi
deleted file mode 100644
index e205840400f..00000000000
Binary files a/code/WorkInProgress/Cael_Aislinn/BirdMan/birdman.dmi and /dev/null differ
diff --git a/code/WorkInProgress/Chinsky/ashtray.dm b/code/WorkInProgress/Chinsky/ashtray.dm
index 26e5aef661d..9948c306630 100644
--- a/code/WorkInProgress/Chinsky/ashtray.dm
+++ b/code/WorkInProgress/Chinsky/ashtray.dm
@@ -17,7 +17,7 @@
/obj/item/ashtray/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (health < 1)
return
- if (istype(W,/obj/item/clothing/mask/cigarette))
+ if (istype(W,/obj/item/clothing/mask/cigarette) || istype(W, /obj/item/weapon/match))
if(user)
if (contents.len >= max_butts)
user << "This ashtray is full."
@@ -28,12 +28,15 @@
user.client.screen -= W
var/obj/item/clothing/mask/cigarette/cig = W
if (cig.lit == 1)
- src.visible_message("[user] crushes a [cig] in the [src], putting it out.")
+ src.visible_message("[user] crushes [cig] in [src], putting it out.")
cig.put_out()
else if (cig.lit == 0)
- user << "You place a [cig] in [src] without even smoking it. Why would you do that?"
+ if(istype(cig, /obj/item/weapon/match))
+ user << "You place [cig] in [src] without even lighting it. Why would you do that?"
+ else
+ user << "You place [cig] in [src] without even smoking it. Why would you do that?"
else if (cig.lit == -1)
- src.visible_message("[user] places a [cig] in the [src].")
+ src.visible_message("[user] places [cig] in [src].")
user.update_inv_l_hand()
user.update_inv_r_hand()
add_fingerprint(user)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 8ff15ce55d4..60b683d441b 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -228,6 +228,7 @@
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate(synd_mob), slot_wear_id)
if(synd_mob.backbag == 2) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(synd_mob), slot_back)
if(synd_mob.backbag == 3) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(synd_mob), slot_back)
+ if(synd_mob.backbag == 4) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(synd_mob), slot_back)
synd_mob.equip_to_slot_or_del(new /obj/item/ammo_magazine/a12mm(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/ammo_magazine/a12mm(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(synd_mob), slot_in_backpack)
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index d007cc1adec..dec9e7496cb 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -169,6 +169,7 @@
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(wizard_mob), slot_head)
if(wizard_mob.backbag == 2) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back)
if(wizard_mob.backbag == 3) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(wizard_mob), slot_back)
+ if(wizard_mob.backbag == 4) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(wizard_mob), slot_back)
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box(wizard_mob), slot_in_backpack)
// wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/scrying_gem(wizard_mob), slot_l_store) For scrying gem.
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store)
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 40a06ea8554..3c81adadc97 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -13,8 +13,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_cap(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_cap(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
var/obj/item/clothing/under/U = new /obj/item/clothing/under/rank/captain(H)
U.hastie = new /obj/item/clothing/tie/medal/gold/captain(U)
@@ -51,8 +53,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hop(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 27b6d5e82a1..274f5146b7b 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -12,8 +12,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
@@ -143,8 +145,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_mine (H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial (H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/pda/shaftminer(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
@@ -287,8 +291,10 @@ var/global/lawyer = 0//Checks for another lawyer
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(!lawyer)
lawyer = 1
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/bluesuit(H), slot_w_uniform)
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index a8420d59011..05ce3991464 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -13,8 +13,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/ce(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial (H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
@@ -43,8 +45,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
@@ -73,8 +77,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store)
@@ -100,8 +106,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_rob(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/roboticist(H), slot_belt)
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index d85527f7b9c..efd5ba1c55a 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -13,8 +13,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/cmo(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic (H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
@@ -43,8 +45,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic (H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
@@ -119,8 +123,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic (H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index ab2bb71d1df..0c0fe506f74 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -12,8 +12,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security (H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
@@ -49,8 +51,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt)
@@ -85,8 +89,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
@@ -131,8 +137,10 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 8296a3f670a..d2bb20e88b9 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -331,6 +331,10 @@ var/global/datum/controller/occupations/job_master
var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel_norm(H)
new /obj/item/weapon/storage/box(BPK)
H.equip_to_slot_or_del(BPK, slot_back,1)
+ if(4)
+ var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel(H)
+ new /obj/item/weapon/storage/box(BPK)
+ H.equip_to_slot_or_del(BPK, slot_back,1)
H << "You are the [rank]."
H << "As the [rank] you answer directly to [job.supervisors]. Special circumstances may change this."
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 7becd90b483..a4d36b2f10e 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -41,6 +41,7 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/device/assembly/timer(), \
new /obj/item/weapon/light/tube(), \
new /obj/item/weapon/light/bulb(), \
+ new /obj/item/ashtray/glass(), \
new /obj/item/weapon/camera_assembly(), \
)
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 3fbb649198c..e3c38410d33 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -181,11 +181,13 @@
/obj/machinery/atmospherics/unary/cryo_cell/proc/expel_gas()
if(air_contents.total_moles() < 1)
return
- var/datum/gas_mixture/expel_gas = new
- var/remove_amount = air_contents.total_moles()/100
- expel_gas = air_contents.remove(remove_amount)
- expel_gas.temperature = T20C // Lets expel hot gas and see if that helps people not die as they are removed
- loc.assume_air(expel_gas)
+// var/datum/gas_mixture/expel_gas = new
+// var/remove_amount = air_contents.total_moles()/50
+// expel_gas = air_contents.remove(remove_amount)
+
+ // Just have the gas disappear to nowhere.
+ //expel_gas.temperature = T20C // Lets expel hot gas and see if that helps people not die as they are removed
+ //loc.assume_air(expel_gas)
/obj/machinery/atmospherics/unary/cryo_cell/proc/go_out()
if(!( occupant ))
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 33a90375c28..963b18d14ac 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -62,10 +62,13 @@ ZIPPO
var/lit = 0
var/icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
var/icon_off = "cigoff"
- var/type_butt = /obj/item/weapon/cigbutt
+ var/butt_icon = "cigbutt"
+ var/butt_name = "Cigarette butt"
+ var/butt_desc = "A manky old cigarette butt."
var/lastHolder = null
var/smoketime = 300
var/chem_volume = 15
+ var/is_butt = 0
/obj/item/clothing/mask/cigarette/New()
..()
@@ -115,19 +118,20 @@ ZIPPO
/obj/item/clothing/mask/cigarette/afterattack(obj/item/weapon/reagent_containers/glass/glass, mob/user as mob)
..()
- if(istype(glass)) //you can dip cigarettes into beakers
- var/transfered = glass.reagents.trans_to(src, chem_volume)
- if(transfered) //if reagents were transfered, show the message
- user << "You dip \the [src] into \the [glass]."
- else //if not, either the beaker was empty, or the cigarette was full
- if(!glass.reagents.total_volume)
- user << "[glass] is empty."
- else
- user << "[src] is full."
+ if(!is_butt)
+ if(istype(glass)) //you can dip cigarettes into beakers
+ var/transfered = glass.reagents.trans_to(src, chem_volume)
+ if(transfered) //if reagents were transfered, show the message
+ user << "You dip \the [src] into \the [glass]."
+ else //if not, either the beaker was empty, or the cigarette was full
+ if(!glass.reagents.total_volume)
+ user << "[glass] is empty."
+ else
+ user << "[src] is full."
/obj/item/clothing/mask/cigarette/proc/light(var/flavor_text = "[usr] lights the [name].")
- if(!src.lit)
+ if(!src.lit && !is_butt)
src.lit = 1
damtype = "fire"
if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire
@@ -155,38 +159,49 @@ ZIPPO
var/turf/location = get_turf(src)
smoketime--
if(smoketime < 1)
- new type_butt(location)
- processing_objects.Remove(src)
+ put_out()
if(ismob(loc))
var/mob/living/M = loc
M << "Your [name] goes out."
M.u_equip(src) //un-equip it so the overlays can update
M.update_inv_wear_mask(0)
- del(src)
return
- if(location)
- location.hotspot_expose(700, 5)
- if(reagents && reagents.total_volume) // check if it has any reagents at all
- if(iscarbon(loc) && (src == loc:wear_mask)) // if it's in the human/monkey mouth, transfer reagents to the mob
- var/mob/living/carbon/C = loc
- if(prob(15)) // so it's not an instarape in case of acid
- reagents.reaction(C, INGEST)
- reagents.trans_to(C, REAGENTS_METABOLISM)
- else // else just remove some of the reagents
- reagents.remove_any(REAGENTS_METABOLISM)
+ if(!is_butt)
+ if(location)
+ location.hotspot_expose(700, 5)
+ if(!is_butt)
+ if(reagents && reagents.total_volume) // check if it has any reagents at all
+ if(iscarbon(loc) && (src == loc:wear_mask)) // if it's in the human/monkey mouth, transfer reagents to the mob
+ var/mob/living/carbon/C = loc
+ if(prob(15)) // so it's not an instarape in case of acid
+ reagents.reaction(C, INGEST)
+ reagents.trans_to(C, REAGENTS_METABOLISM)
+ else // else just remove some of the reagents
+ reagents.remove_any(REAGENTS_METABOLISM)
return
/obj/item/clothing/mask/cigarette/attack_self(mob/user as mob)
if(lit == 1)
- user.visible_message("[user] calmly drops and treads on the lit [src], putting it out instantly.")
- var/turf/T = get_turf(src)
- new type_butt(T)
- processing_objects.Remove(src)
- del(src)
+ var/mob/living/carbon/human/H = user
+ if(H.shoes)
+ user.visible_message("[user] crushes [src] on the sole of his shoes, putting it out instantly.")
+ else
+ user.visible_message("[user] spits oh his fingers, then puts down [src].")
+ put_out()
return ..()
+/obj/item/clothing/mask/cigarette/proc/put_out()
+ if(src.lit == 1)
+ src.lit = -1
+ src.is_butt = 1
+ icon_state = src.butt_icon
+ desc = src.butt_desc
+ name = src.butt_name
+ usr.update_inv_l_hand()
+ usr.update_inv_r_hand()
+
////////////
// CIGARS //
@@ -197,7 +212,10 @@ ZIPPO
icon_state = "cigaroff"
icon_on = "cigaron"
icon_off = "cigaroff"
- type_butt = /obj/item/weapon/cigbutt/cigarbutt
+ is_butt = 0
+ butt_icon = "cigarbutt"
+ butt_name = "Cigar butt"
+ butt_desc = "A manky old cigar butt."
throw_speed = 0.5
item_state = "cigaroff"
smoketime = 1500
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 022d415d3e7..cf241435d6b 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -2,12 +2,13 @@
name = "Grenade Casing"
icon_state = "chemg"
item_state = "flashbang"
+ desc = "A hand made chemical grenade."
w_class = 2.0
force = 2.0
var/stage = 0
var/state = 0
var/path = 0
- var/obj/item/weapon/circuitboard/circuit = null
+ var/obj/item/device/assembly_holder/detonator = null
var/list/beakers = new/list()
var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
var/affected_area = 3
@@ -18,30 +19,80 @@
R.my_atom = src
attack_self(mob/user as mob)
- if(stage > 1)
- ..()
+ if(!stage || stage==1)
+ if(detonator)
+// detonator.loc=src.loc
+ usr.put_in_hands(detonator)
+ detonator=null
+ stage=0
+ icon_state = initial(icon_state)
+ else if(beakers.len)
+ for(var/obj/B in beakers)
+ if(istype(B))
+ beakers -= B
+ user.put_in_hands(B)
+ name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
+ if(stage > 1 && !active && clown_check(user))
+ user << "You prime \the [name]!"
- attackby(obj/item/weapon/W as obj, mob/user as mob)//TODO:Have grenades use the new assembly things
+ log_attack("[user.name] ([user.ckey]) primed \a [src].")
+ log_admin("ATTACK: [user] ([user.ckey]) primed \a [src].")
+ message_admins("ATTACK: [user] ([user.ckey]) primed \a [src].")
- if(istype(W,/obj/item/device/assembly_holder) && !stage && path != 2)
+ activate()
+ add_fingerprint(user)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.throw_mode_on()
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+
+ if(istype(W,/obj/item/device/assembly_holder) && (!stage || stage==1) && path != 2)
+ var/obj/item/device/assembly_holder/det = W
+ if(istype(det.a_left,det.a_right.type) || (!isigniter(det.a_left) && !isigniter(det.a_right)))
+ user << "\red Assembly must contain one igniter."
+ return
+ if(!det.secured)
+ user << "\red Assembly must be secured with screwdriver."
+ return
path = 1
user << "\blue You add [W] to the metal casing."
playsound(src.loc, 'sound/items/Screwdriver2.ogg', 25, -3)
- del(W) //Okay so we're not really adding anything here. cheating.
+ user.remove_from_mob(det)
+ det.loc = src
+ detonator = det
icon_state = initial(icon_state) +"_ass"
- name = "unsecured grenade"
+ name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
stage = 1
- else if(istype(W,/obj/item/weapon/screwdriver) && stage == 1 && path != 2)
- path = 1
- if(beakers.len)
- user << "\blue You lock the assembly."
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
- name = "grenade"
- icon_state = initial(icon_state) +"_locked"
- stage = 2
- else
- user << "\red You need to add at least one beaker before locking the assembly."
- else if(is_type_in_list(W, allowed_containers) && stage == 1 && path != 2)
+ else if(istype(W,/obj/item/weapon/screwdriver) && path != 2)
+ if(stage == 1)
+ path = 1
+ if(beakers.len)
+ user << "\blue You lock the assembly."
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
+ name = "grenade"
+ icon_state = initial(icon_state) +"_locked"
+ stage = 2
+ else
+// user << "\red You need to add at least one beaker before locking the assembly."
+ user << "\blue You lock the empty assembly."
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
+ name = "fake grenade"
+ icon_state = initial(icon_state) +"_locked"
+ stage = 2
+ else if(stage == 2)
+ if(active && prob(95))
+ user << "\red You trigger the assembly!"
+ prime()
+ return
+ else
+ user << "\blue You unlock the assembly."
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
+ name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
+ icon_state = initial(icon_state) + (detonator?"_ass":"")
+ stage = 1
+ active = 0
+ else if(is_type_in_list(W, allowed_containers) && (!stage || stage==1) && path != 2)
path = 1
if(beakers.len == 2)
user << "\red The grenade can not hold more containers."
@@ -52,18 +103,47 @@
user.drop_item()
W.loc = src
beakers += W
+ stage = 1
+ name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
else
user << "\red \the [W] is empty."
+ examine()
+ set src in usr
+ usr << desc
+ if(detonator)
+ usr << "With attached [detonator.name]"
+
+ activate()
+ if(active) return
+ if(detonator)
+ if(!isigniter(detonator.a_left))
+ detonator.a_left.activate()
+ active = 1
+ if(!isigniter(detonator.a_right))
+ detonator.a_right.activate()
+ active = 1
+ if(active)
+ icon_state = initial(icon_state) + "_active"
+
+ return
+
+ proc/primed(var/primed = 1)
+ if(active)
+ icon_state = initial(icon_state) + (primed?"_primed":"_active")
+
prime()
+ if(!stage || stage<2) return
+
//if(prob(reliability))
var/has_reagents = 0
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
if(G.reagents.total_volume) has_reagents = 1
+ active = 0
if(!has_reagents)
+ icon_state = initial(icon_state) +"_locked"
playsound(src.loc, 'sound/items/Screwdriver2.ogg', 50, 1)
- state = 0
return
playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1)
@@ -91,6 +171,7 @@
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
G.loc = get_turf(src.loc)*/
+
/obj/item/weapon/grenade/chem_grenade/large
name = "Large Chem Grenade"
desc = "An oversized grenade that affects a larger area."
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index 3f2d4d576ba..c381a8d513d 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -20,12 +20,9 @@
log_admin("ATTACK: [user] ([user.ckey]) clumsily primed \a [src]")
message_admins("ATTACK: [user] ([user.ckey]) clumsily primed \a [src]")
- active = 1
- icon_state = initial(icon_state) + "_active"
- playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
+ activate()
+ add_fingerprint(user)
spawn(5)
- if(user)
- user.drop_item()
prime()
return 0
return 1
@@ -67,20 +64,27 @@
log_admin("ATTACK: [user] ([user.ckey]) primed \a [src].")
message_admins("ATTACK: [user] ([user.ckey]) primed \a [src].")
- active = 1
- icon_state = initial(icon_state) + "_active"
+ activate()
add_fingerprint(user)
if(iscarbon(user))
var/mob/living/carbon/C = user
C.throw_mode_on()
- spawn(det_time)
- if(user)
- user.drop_item()
- prime()
- return
return
+/obj/item/weapon/grenade/proc/activate()
+ if(active)
+ return
+
+ icon_state = initial(icon_state) + "_active"
+ active = 1
+ playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
+
+ spawn(det_time)
+ prime()
+ return
+
+
/obj/item/weapon/grenade/proc/prime()
// playsound(loc, 'sound/items/Welder2.ogg', 25, 1)
var/turf/T = get_turf(src)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index b48b2475ebe..8d62310aa15 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -15,9 +15,8 @@
/obj/proc/process()
processing_objects.Remove(src)
return 0
-//skytodo
-/*
-/obj/assume_air(datum/air_group/giver)
+
+/obj/assume_air(datum/gas_mixture/giver)
if(loc)
return loc.assume_air(giver)
else
@@ -34,7 +33,7 @@
return loc.return_air()
else
return null
-*/
+
/obj/proc/handle_internal_lifeform(mob/lifeform_inside_me, breath_request)
//Return: (NONSTANDARD)
// null if object handles breathing logic for lifeform
diff --git a/code/modules/DetectiveWork/detective_work.dm b/code/modules/DetectiveWork/detective_work.dm
deleted file mode 100644
index 2dc409beb6f..00000000000
--- a/code/modules/DetectiveWork/detective_work.dm
+++ /dev/null
@@ -1,626 +0,0 @@
-//CONTAINS: Suit fibers and Detective's Scanning Computer
-
-atom/var/list/suit_fibers
-
-atom/proc/add_fibers(mob/living/carbon/human/M)
- if(M.gloves && istype(M.gloves,/obj/item/clothing/))
- var/obj/item/clothing/gloves/G = M.gloves
- if(G.transfer_blood) //bloodied gloves transfer blood to touched objects
- if(add_blood(G.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
- G.transfer_blood--
- else if(M.bloody_hands)
- if(add_blood(M.bloody_hands_mob))
- M.bloody_hands--
- 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
-
-var/const/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 = "\improper High-Res Forensic Scanning Computer"
- icon_state = "forensic"
- var/obj/item/scanning
- var/temp = ""
- var/canclear = 1
- var/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.
- var/list/files
-//This holds objects (1) without prints, and their fibers(2) and blood(3).
- var/list/misc
- var/obj/item/weapon/f_card/card
-
- var/scan_data = ""
- var/scan_name = ""
- var/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 += "[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 += "{Access Database}
"
- dat += "[scan_data]"
- if(scan_data && !scan_process)
- dat += "
{Erase Data}"
- 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
- if (allowed(M))
- authenticated = 1
- 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.get_active_hand()
- 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") //Processing a fingerprint card.
- var/mob/M = usr
- var/obj/item/I = M.get_active_hand()
- if(!(I && istype(I,/obj/item/weapon/f_card)))
- I = card
- if(I && istype(I,/obj/item/weapon/f_card))
- card = I
- if(!card.fingerprints)
- card.fingerprints = list()
- 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()
- else
- usr << "\red Invalid Object Rejected."
- if("database") //Viewing all records in each database
- canclear = 1
- if(href_list["delete_record"])
- delete_dossier(href_list["delete_record"])
- if(href_list["delete_aux"])
- delete_record(href_list["delete_aux"])
- if((!misc || !misc.len) && (!files || !files.len))
- temp = "Database is empty."
- else
- if(files && files.len)
- temp = "Criminal Evidence Database
"
- temp += "Consolidated data points:
"
- for(var/print in files)
- var/list/file = files[print]
- temp += "{[file[2]]}
"
- temp += "
{Insert Finger Print Card (To complete a Dossier)}
"
- else
- temp = ""
- if(misc && misc.len)
- temp += "Auxiliary Evidence Database
"
- temp += "This is where anything without fingerprints goes.
"
- for(var/atom in misc)
- var/list/data_entry = misc[atom]
- temp += "{[data_entry[3]]}
"
- if("record") //Viewing a record from the "files" database.
- canclear = 0
- if(files)
- var/list/dossier = files[href_list["identifier"]]
- if(href_list["ren"])
- var/new_title = copytext(sanitize(input("Rename to what?", "Dossier Editing", "Dossier [files.Find(href_list["identifier"])]") as null|text),1,MAX_MESSAGE_LEN)
- if(new_title)
- dossier[2] = new_title
- else
- usr << "Illegal or blank name."
- temp = "Criminal Evidence Database
"
- temp += "Consolidated data points: [dossier[2]]
"
- var/print_string = "Fingerprints: Print not complete!
"
- if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE)
- print_string = "Fingerprints: (80% or higher completion reached)
[dossier[1]]
"
- temp += print_string
- for(var/object in dossier)
- if(object == dossier[1] || object == dossier[2])
- continue
- temp += "
"
- var/list/outputs = dossier[object]
- var/list/prints = outputs[1]
- temp += "Object: [outputs[4]]
"
- temp += " Fingerprints:
"
- temp += " [prints.len] Unique fingerprints found.
"
- var/complete_prints = 0
- for(var/print in prints)
- if(stringpercent(prints[print]) <= FINGERPRINT_COMPLETE)
- complete_prints++
- temp += " [prints[print]]
"
- if(complete_prints)
- temp += " And [prints.len - complete_prints] unknown unique prints.
"
- else
- temp += " No prints of sufficient completeness.
"
- var/list/fibers = outputs[2]
- if(fibers && fibers.len)
- temp += " Fibers:
"
- for(var/j = 1, j <= fibers.len, j++)
- temp += " [fibers[j]]
"
- var/list/blood = outputs[3]
- if(blood && blood.len)
- temp += " Blood:
"
- for(var/named in blood)
- temp += " Type: [blood[named]], DNA: [named]
"
- temp += "
{Rename this Dossier}"
- temp += "
{Delete this Dossier}"
- temp += "
{Print}"
- else
- temp = "ERROR. Database not found!
"
- temp += "
{Return}"
- if("databaseprint") //Printing from the "files" database.
- if(files)
- var/obj/item/weapon/paper/P = new(loc)
- P.name = "\improper Database File (Dossier [files.Find(href_list["identifier"])])"
- P.overlays += "paper_words"
- P.info = "Criminal Evidence Database
"
- var/list/dossier = files[href_list["identifier"]]
- P.info += "Consolidated data points: [dossier[2]]
"
- var/print_string = "Fingerprints: Print not complete!
"
- if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE)
- print_string = "Fingerprints: (80% or higher completion reached)
[dossier[1]]
"
- P.info += print_string
- for(var/object in dossier)
- if(object == dossier[1] || object == dossier[2])
- continue
- P.info += "
"
- var/list/outputs = dossier[object]
- var/list/prints = outputs[1]
- P.info += "Object: [outputs[4]]
"
- P.info += " Fingerprints:
"
- P.info += " [prints.len] Unique fingerprints found.
"
- var/complete_prints = 0
- for(var/print in prints)
- if(stringpercent(prints[print]) <= FINGERPRINT_COMPLETE)
- complete_prints++
- P.info += " [prints[print]]
"
- if(complete_prints)
- P.info += " And [prints.len - complete_prints] unknown unique prints.
"
- else
- P.info += " No prints of sufficient completeness.
"
- var/list/fibers = outputs[2]
- if(fibers && fibers.len)
- P.info += " Fibers:
"
- for(var/j = 1, j <= fibers.len, j++)
- P.info += " [fibers[j]]
"
- var/list/blood = outputs[3]
- if(blood && blood.len)
- P.info += " Blood:
"
- for(var/named in blood)
- P.info += " Type: [blood[named]], DNA: [named]
"
- else
- usr << "ERROR. Database not found!
"
- if("auxiliary") //Viewing a record from the "misc" database.
- canclear = 0
- if(misc)
- temp = "Auxiliary Evidence Database
"
- var/list/outputs = misc[href_list["identifier"]]
- temp += "Consolidated data points: [outputs[3]]
"
- var/list/prints = outputs[4]
- if(prints)
- temp += " Fingerprints:
"
- temp += " [prints.len] Unique fingerprints found.
"
- var/complete_prints = 0
- for(var/print in prints)
- if(stringpercent(prints[print]) <= FINGERPRINT_COMPLETE)
- complete_prints++
- temp += " [prints[print]]
"
- if(complete_prints)
- temp += " And [prints.len - complete_prints] unknown unique prints.
"
- else
- temp += " No prints of sufficient completeness.
"
- var/list/fibers = outputs[1]
- if(fibers && fibers.len)
- temp += " Fibers:
"
- for(var/fiber in fibers)
- temp += " [fiber]
"
- var/list/blood = outputs[2]
- if(blood && blood.len)
- temp += " Blood:
"
- for(var/named in blood)
- temp += " Type: [blood[named]], DNA: [named]
"
- temp += "
{Delete This Record}"
- temp += "
{Print}"
- else
- temp = "ERROR. Database not found!
"
- temp += "
{Return}"
- if("auxiliaryprint") //Printing from the "misc" database.
- if(misc)
- var/obj/item/weapon/paper/P = new(loc)
- var/list/outputs = misc[href_list["identifier"]]
- P.name = "\improper Auxiliary Database File ([outputs[3]])"
- P.overlays += "paper_words"
- P.info = "Auxiliary Evidence Database
"
- P.info += "Consolidated data points: [outputs[3]]
"
- var/list/prints = outputs[4]
- if(prints)
- P.info += " Fingerprints:
"
- P.info += " [prints.len] Unique fingerprints found.
"
- var/complete_prints = 0
- for(var/print in prints)
- if(stringpercent(prints[print]) <= FINGERPRINT_COMPLETE)
- complete_prints++
- P.info += " [prints[print]]
"
- if(complete_prints)
- P.info += " And [prints.len - complete_prints] unknown unique prints.
"
- else
- P.info += " No prints of sufficient completeness.
"
- var/list/fibers = outputs[1]
- if(fibers && fibers.len)
- P.info += " Fibers:
"
- for(var/fiber in fibers)
- P.info += " [fiber]
"
- var/list/blood = outputs[2]
- if(blood && blood.len)
- P.info += " Blood:
"
- for(var/named in blood)
- P.info += " Type: [blood[named]], DNA: [named]
"
- else
- usr << "ERROR. Database not found!
"
- 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
- if(scanning)
- scan_process = 0
- scan_name = scanning.name
- scan_data = "[scanning]
"
- if (scanning.blood_DNA)
- scan_data += "Blood Found:
"
- for(var/blood in scanning.blood_DNA)
- scan_data += "Blood type: [scanning.blood_DNA[blood]]\nDNA: [blood]
"
- else
- scan_data += "No Blood Found
"
- if(!scanning.fingerprints)
- scan_data += "No Fingerprints Found
"
- else
- scan_data += "Isolated [scanning.fingerprints.len] Fingerprints. Loaded into database.
"
- add_data(scanning)
-
- if(!scanning.suit_fibers)
- scan_data += "No Fibers/Materials Located
"
- else
- scan_data += "Fibers/Materials Found:
"
- for(var/data in scanning.suit_fibers)
- scan_data += "- [data]
"
- if(istype(scanning,/obj/item/device/detective_scanner) || (istype(scanning, /obj/item/device/pda) && scanning:cartridge && scanning:cartridge.access_security))
- scan_data += "
Data transfered from \the [scanning] to Database.
"
- add_data_scanner(scanning)
- else if(!scanning.fingerprints)
- scan_data += "
Add to Database?
"
- else
- temp = "Scan Failed: No Object"
-
-
- if("print") //Printing scan data
- if(scan_data)
- temp = "Scan Data Printed."
- var/obj/item/weapon/paper/P = new(loc)
- P.name = "\improper Scan Data ([scan_name])"
- P.info = "[scan_data]"
- P.overlays += "paper_words"
- else
- temp = "Print Failed: No Data"
- if("erase")
- scan_data = ""
- if("cancel")
- scan_process = 0
- if("add") //Adding an object (Manually) to the database.
- if(scanning)
- add_data(scanning)
- else
- temp = "Data Transfer Failed: No Object."
- if("rename")
- if(!files || !files[href_list["identifier"]])
- temp = "ERROR: Record/Database not found!"
- else
- var/new_title = copytext(sanitize(input("Rename to what?", "Dossier Editing", "Dossier [files.Find(href_list["identifier"])]") as null|text),1,MAX_MESSAGE_LEN)
- if(new_title)
- var/list/file = files[href_list["identifier"]]
- file[2] = new_title
- updateUsrDialog()
-
- ex_act()
- return
-
-
- proc/add_data_scanner(var/obj/item/device/W)
- if(istype(W, /obj/item/device/detective_scanner))
- if(W:stored)
- for(var/atom in W:stored)
- var/list/data = W:stored[atom]
- add_data_master(atom,data[1],data[2],data[3],data[4])
- W:stored = list()
- else if(istype(W, /obj/item/device/pda) && W:cartridge && W:cartridge.access_security)
- if(W:cartridge.stored_data)
- for(var/atom in W:cartridge.stored_data)
- var/list/data = W:cartridge.stored_data[atom]
- add_data_master(atom,data[1],data[2],data[3],data[4])
- W:cartridge.stored_data = list()
- return
-
- proc/add_data(var/atom/scanned_atom)
- return add_data_master("\ref [scanned_atom]", scanned_atom.fingerprints,\
- scanned_atom.suit_fibers, scanned_atom.blood_DNA, "[scanned_atom.name] (Direct Scan)")
-
-
-
-/********************************
-*****DO NOT DIRECTLY CALL ME*****
-********************************/
- proc/add_data_master(var/atom_reference, var/list/atom_fingerprints, var/list/atom_suit_fibers, var/list/atom_blood_DNA, var/atom_name)
-//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.
-
- if(!misc)
- misc = list()
- var/list/data_entry = misc[atom_reference]
- if(data_entry)
- var/list/fibers = data_entry[1]
- if(!fibers)
- fibers = list()
- if(atom_suit_fibers)
- for(var/fiber in atom_suit_fibers) //Fibers~~~
- if(!fibers.Find(fiber)) //It isn't! Add!
- fibers += fiber
- var/list/blood = data_entry[2]
- if(!blood)
- blood = list()
- if(atom_blood_DNA)
- for(var/main_blood in atom_blood_DNA)
- if(!blood[main_blood])
- blood[main_blood] = atom_blood_DNA[blood]
- var/list/prints = data_entry[4]
- if(!prints && atom_fingerprints)
- prints = list()
- if(atom_fingerprints)
- for(var/print in atom_fingerprints)
- if(!prints[print])
- prints[print] = atom_fingerprints[print]
- else
- var/list/templist[4]
- templist[1] = atom_suit_fibers
- templist[2] = atom_blood_DNA
- templist[3] = atom_name
- templist[4] = atom_fingerprints
- misc[atom_reference] = templist //Store it!
- //Has prints.
- if(atom_fingerprints)
- if(!files)
- files = list()
- for(var/main_print in atom_fingerprints)
- data_entry = files[main_print]
- if(data_entry)//The print is already in here!
- var/list/internal_atom = data_entry[atom_reference] //Lets see if we can find the current object
- if(internal_atom)
- //We must be on a roll! Just update what needs to be updated.
- var/list/internal_prints = internal_atom[1]
- for(var/print in atom_fingerprints) //Sorry for the double loop! D:
- var/associated_print = internal_prints[print]
- var/reference_print = atom_fingerprints[print]
- if(associated_print && associated_print != reference_print) //It does not match
- internal_prints[print] = stringmerge(associated_print, reference_print)
- else if(!associated_print)
- internal_prints[print] = reference_print
- //If the main print was updated, lets update the master as well.
- if(print == main_print && (!associated_print || (associated_print && associated_print != reference_print)))
- update_fingerprints(main_print, internal_prints[print])
- //Fibers.
- var/list/fibers = internal_atom[2]
- if(!fibers)
- fibers = list()
- if(atom_suit_fibers)
- for(var/fiber in atom_suit_fibers) //Fibers~~~
- if(!fibers.Find(fiber)) //It isn't! Add!
- fibers += fiber
- //Blood.
- var/list/blood = internal_atom[3]
- if(!blood)
- blood = list()
- if(atom_blood_DNA)
- for(var/main_blood in atom_blood_DNA)
- if(!blood[main_blood])
- blood[main_blood] = atom_blood_DNA[blood]
-
- continue
- //It's not in there! We gotta add it.
- update_fingerprints(main_print, atom_fingerprints[main_print])
- var/list/data_point[4]
- data_point[1] = atom_fingerprints
- data_point[2] = atom_suit_fibers
- data_point[3] = atom_blood_DNA
- data_point[4] = atom_name
- data_entry[atom_reference] = data_point
- continue
- //No print at all! New data entry, go!
- var/list/data_point[4]
- data_point[1] = atom_fingerprints
- data_point[2] = atom_suit_fibers
- data_point[3] = atom_blood_DNA
- data_point[4] = atom_name
- var/list/new_file[2]
- new_file[1] = atom_fingerprints[main_print]
- new_file[2] = "Dossier [files.len + 1]"
- new_file[atom_reference] = data_point
- files[main_print] = new_file
- return 1
-/********************************
-***END DO NOT DIRECTLY CALL ME***
-********************************/
-
- proc/update_fingerprints(var/ref_print, var/new_print)
- var/list/master = files[ref_print]
- if(master)
- master[1] = stringmerge(master[1],new_print)
- else
- CRASH("Fucking hell. Something went wrong, and it tried to update a null print or something. Tell SkyMarshal (and give him this call stack)")
- return
-
- proc/process_card() //Same as above, but for fingerprint cards
- if(card.fingerprints && !(card.amount > 1) && islist(card.fingerprints) && files && files.len)
- usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints."
- var/found = 0
- for(var/master_print in card.fingerprints)
- var/list/data_entry = files[master_print]
- if(data_entry)
- found = 1
- data_entry[1] = master_print
- if(found)
- usr << "The machinery finds it can complete a match."
- else
- usr << "No match found."
- 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/atom_ref) //Deletes an entry in the misc database at the given location
- if(misc && misc.len)
- misc.Remove(atom_ref)
- return
-
- proc/delete_dossier(var/print) //Deletes a Dossier at a given location.
- if(files && files.len)
- files.Remove(print)
- return
-
- detective
- icon_state = "old"
- name = "PowerScan Mk.I"
\ No newline at end of file
diff --git a/code/modules/DetectiveWork/evidence.dm b/code/modules/DetectiveWork/evidence.dm
deleted file mode 100644
index a5aa48dd5c2..00000000000
--- a/code/modules/DetectiveWork/evidence.dm
+++ /dev/null
@@ -1,80 +0,0 @@
-//CONTAINS: Evidence bags
-
-/obj/item/weapon/evidencebag
- name = "evidence bag"
- desc = "An empty evidence bag."
- icon = 'icons/obj/storage.dmi'
- icon_state = "evidenceobj"
- w_class = 1
-
-/obj/item/weapon/evidencebag/afterattack(obj/item/O, mob/user as mob)
- if(!in_range(O,user))
- return
-
- if(istype(O, /obj/item/weapon/storage))
- return ..()
-
- if(!istype(O) || O.anchored == 1)
- user << "You can't put that inside \the [src]!"
- return ..()
-
- if(istype(O, /obj/item/weapon/evidencebag))
- user << "You find putting an evidence bag in another evidence bag to be slightly absurd."
- return
-
- if(contents.len)
- user << "\The [src] already has something inside it."
- return ..()
-
- if(!isturf(O.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up.
- if(istype(O.loc,/obj/item/weapon/storage)) //in a container.
- var/obj/item/weapon/storage/U = O.loc
- user.client.screen -= O
- U.contents.Remove(O)
- else if(user.l_hand == O) //in a hand
- user.drop_l_hand()
- else if(user.r_hand == O) //in a hand
- user.drop_r_hand()
- else
- return
-
- user.visible_message("\The [user] puts \a [O] into \a [src]", "You put \the [O] inside \the [src].",\
- "You hear a rustle as someone puts something into a plastic bag.")
- icon_state = "evidence"
- var/image/I = image("icon"=O, "layer"=FLOAT_LAYER) //take a snapshot. (necessary to stop the underlays appearing under our inventory-HUD slots ~Carn
- underlays += I
- 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 (contents.len)
- var/obj/item/I = contents[1]
- user.visible_message("\The [user] takes \a [I] out of \a [src]", "You take \the [I] out of \the [src].",\
- "You hear someone rustle around in a plastic bag, and remove something.")
- underlays = null //remove the underlays
- user.put_in_hands(I)
- w_class = 1
- icon_state = "evidenceobj"
- desc = "An empty evidence bag."
-
- else
- user << "\The [src] is empty."
- 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
\ No newline at end of file
diff --git a/code/modules/DetectiveWork/footprints_and_rag.dm b/code/modules/DetectiveWork/footprints_and_rag.dm
deleted file mode 100644
index 4aceed22ec0..00000000000
--- a/code/modules/DetectiveWork/footprints_and_rag.dm
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
-obj/item/clothing/shoes/var
- track_blood = 0
- mob/living/carbon/human/track_blood_mob
- track_blood_type*/
-mob/var
- bloody_hands = 0
- mob/living/carbon/human/bloody_hands_mob
- track_blood
- mob/living/carbon/human/track_blood_mob
- track_blood_type
-obj/item/clothing/gloves/var
- transfer_blood = 0
- mob/living/carbon/human/bloody_hands_mob
-
-/*
-obj/effect/decal/cleanable/var
- track_amt = 3
- mob/blood_owner
-
-turf/Exited(mob/living/carbon/human/M)
- if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
- if(!istype(src, /turf/space)) // Bloody tracks code starts here
- var/dofoot = 1
- if(istype(M,/mob/living/simple_animal))
- if(!(istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/constructwraith)))
- dofoot = 0
-
- if(dofoot)
-
- 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),M.track_blood_type)
- else if(istype(M,/mob/living/carbon/human))
- if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes))
- var/obj/item/clothing/shoes/S = M.shoes
- if(S.track_blood > 0)
- S.track_blood--
- src.add_bloody_footprints(S.track_blood_mob,1,M.dir,S.name,S.track_blood_type) // And bloody tracks end here
- . = ..()
-turf/Entered(mob/living/carbon/human/M)
- if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
- var/dofoot = 1
- if(istype(M,/mob/living/simple_animal))
- if(!(istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/constructwraith)))
- dofoot = 0
-
- if(dofoot)
-
- if(M.track_blood > 0)
- M.track_blood--
- src.add_bloody_footprints(M.track_blood_mob,0,M.dir,get_tracks(M),M.track_blood_type)
- else if(istype(M,/mob/living/carbon/human))
- if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes) && !istype(src,/turf/space))
- var/obj/item/clothing/shoes/S = M.shoes
- if(S.track_blood > 0)
- S.track_blood--
- src.add_bloody_footprints(S.track_blood_mob,0,M.dir,S.name,S.track_blood_type)
-
-
- for(var/obj/effect/decal/cleanable/B in src)
- if(B:track_amt <= 0) continue
- if(B.type != /obj/effect/decal/cleanable/blood/tracks)
- if(istype(B, /obj/effect/decal/cleanable/xenoblood) || istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/oil) || istype(B, /obj/effect/decal/cleanable/robot_debris))
-
- var/track_type = "blood"
- if(istype(B, /obj/effect/decal/cleanable/xenoblood))
- track_type = "xeno"
- else if(istype(B, /obj/effect/decal/cleanable/oil) || istype(B, /obj/effect/decal/cleanable/robot_debris))
- track_type = "oil"
-
- if(istype(M,/mob/living/carbon/human))
- if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes))
- var/obj/item/clothing/shoes/S = M.shoes
- S.add_blood(B.blood_owner)
- S.track_blood_mob = B.blood_owner
- S.track_blood = max(S.track_blood,8)
- S.track_blood_type = track_type
- else
- M.add_blood(B.blood_owner)
- M.track_blood_mob = B.blood_owner
- M.track_blood = max(M.track_blood,rand(4,8))
- M.track_blood_type = track_type
- B.track_amt--
- break
- . = ..()
-
-turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info,bloodcolor)
- for(var/obj/effect/decal/cleanable/blood/tracks/T in src)
- if(T.dir == d && findtext(T.icon_state, bloodcolor))
- if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
- T.desc = "These bloody footprints appear to have been made by [info]."
- if(!T.blood_DNA)
- T.blood_DNA = list()
- if(istype(M,/mob/living/carbon/human))
- T.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
- else if(istype(M,/mob/living/carbon/alien))
- T.blood_DNA["UNKNOWN DNA"] = "X*"
- else if(istype(M,/mob/living/carbon/monkey))
- T.blood_DNA["Non-human DNA"] = "A+"
- return
- var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
- this.icon = 'icons/effects/footprints.dmi'
-
- var/preiconstate = ""
-
- if(info == "animal paws")
- preiconstate = "paw"
- else if(info == "alien claws")
- preiconstate = "claw"
- else if(info == "small alien feet")
- preiconstate = "paw"
-
- if(leaving)
- this.icon_state = "[bloodcolor][preiconstate]2"
- else
- this.icon_state = "[bloodcolor][preiconstate]1"
- this.dir = d
-
- if(bloodcolor == "blood")
- this.desc = "These bloody footprints appear to have been made by [info]."
- else if(bloodcolor == "xeno")
- this.desc = "These acidic bloody footprints appear to have been made by [info]."
- else if(bloodcolor == "oil")
- this.name = "oil"
- this.desc = "These oil footprints appear to have been made by [info]."
-
- if(istype(M,/mob/living/carbon/human))
- if(!this.blood_DNA)
- this.blood_DNA = list()
- this.blood_DNA[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) || istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/crab))
- . = "animal paws"
- else if(istype(M,/mob/living/silicon/robot))
- . = "robot feet"
- else if(istype(M,/mob/living/carbon/alien/humanoid))
- . = "alien claws"
- else if(istype(M,/mob/living/carbon/alien/larva))
- . = "small alien 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/reagent_containers/glass/rag
- name = "damp rag"
- desc = "For cleaning up messes, you suppose."
- w_class = 1
- icon = 'icons/obj/toy.dmi'
- icon_state = "rag"
- amount_per_transfer_from_this = 5
- possible_transfer_amounts = list(5)
- volume = 5
- can_be_placed_into = null
-
- attack(atom/target as obj|turf|area, mob/user as mob , flag)
- if(ismob(target) && target.reagents && reagents.total_volume)
- user.visible_message("\red \The [target] has been smothered with \the [src] by \the [user]!", "\red You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise")
- src.reagents.reaction(target, INGEST)
- spawn(5) src.reagents.clear_reagents()
- return
- else
- ..()
-
- afterattack(atom/A as obj|turf|area, mob/user as mob)
- if(istype(A) && src in user)
- 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
-
- examine()
- if (!usr)
- return
- usr << "That's \a [src]."
- usr << desc
- return
\ No newline at end of file
diff --git a/code/modules/DetectiveWork/scanner.dm b/code/modules/DetectiveWork/scanner.dm
deleted file mode 100644
index 09eb646a448..00000000000
--- a/code/modules/DetectiveWork/scanner.dm
+++ /dev/null
@@ -1,172 +0,0 @@
-//CONTAINS: Detective's Scanner
-
-/obj/item/device/detective_scanner
- name = "Scanner"
- desc = "Used to scan objects for DNA and fingerprints."
- icon_state = "forensic1"
- var/amount = 20.0
- var/list/stored = list()
- w_class = 3.0
- item_state = "electronic"
- flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
- slot_flags = SLOT_BELT
-
- attackby(obj/item/weapon/f_card/W as obj, mob/user as mob)
- ..()
- if (istype(W, /obj/item/weapon/f_card))
- if (W.fingerprints)
- return
- if (src.amount == 20)
- return
- if (W.amount + src.amount > 20)
- src.amount = 20
- W.amount = W.amount + src.amount - 20
- else
- src.amount += W.amount
- //W = null
- del(W)
- add_fingerprint(user)
- if (W)
- W.add_fingerprint(user)
- return
-
- attack(mob/living/carbon/human/M as mob, mob/user as mob)
- if (!ishuman(M))
- user << "\red [M] is not human and cannot have the fingerprints."
- return 0
- if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
- user << "\blue No fingerprints found on [M]"
- return 0
- else
- if (src.amount < 1)
- user << text("\blue Fingerprints scanned on [M]. Need more cards to print.")
- else
- src.amount--
- var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
- F.amount = 1
- F.add_fingerprint(M)
- F.icon_state = "fingerprint1"
- F.name = text("FPrintC- '[M.name]'")
-
- user << "\blue Done printing."
- user << "\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]"
- if ( !M.blood_DNA || !M.blood_DNA.len )
- user << "\blue No blood found on [M]"
- if(M.blood_DNA)
- del(M.blood_DNA)
- else
- user << "\blue Blood found on [M]. Analysing..."
- spawn(15)
- for(var/blood in M.blood_DNA)
- user << "\blue Blood type: [M.blood_DNA[blood]]\nDNA: [blood]"
- return
-
- afterattack(atom/A as obj|turf|area, mob/user as mob)
- if(!in_range(A,user))
- return
- if(loc != user)
- return
- if(istype(A,/obj/machinery/computer/forensic_scanning)) //breaks shit.
- return
- if(istype(A,/obj/item/weapon/f_card))
- user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\""
- return
-
- add_fingerprint(user)
-
-
- //Special case for blood splaters.
- if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
- if(!isnull(A.blood_DNA))
- for(var/blood in A.blood_DNA)
- user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
- return
-
- //General
- if ((!A.fingerprints || !A.fingerprints.len) && !A.suit_fibers && !A.blood_DNA)
- user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
- "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\
- "You hear a faint hum of electrical equipment.")
- return 0
-
- if(add_data(A))
- user << "\blue Object already in internal memory. Consolidating data..."
- return
-
-
- //PRINTS
- if(!A.fingerprints || !A.fingerprints.len)
- if(A.fingerprints)
- del(A.fingerprints)
- else
- user << "\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
- var/list/complete_prints = list()
- for(var/i in A.fingerprints)
- var/print = A.fingerprints[i]
- if(stringpercent(print) <= FINGERPRINT_COMPLETE)
- complete_prints += print
- if(complete_prints.len < 1)
- user << "\blue No intact prints found"
- else
- user << "\blue Found [complete_prints.len] intact prints"
- for(var/i in complete_prints)
- user << "\blue [i]"
-
- //FIBERS
- if(A.suit_fibers)
- user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
-
- //Blood
- if (A.blood_DNA)
- user << "\blue Blood found on [A]. Analysing..."
- spawn(15)
- for(var/blood in A.blood_DNA)
- user << "Blood type: \red [A.blood_DNA[blood]] \t \black DNA: \red [blood]"
- if(prob(80) || !A.fingerprints)
- user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
- "You finish scanning \the [A].",\
- "You hear a faint hum of electrical equipment.")
- return 0
- else
- user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]\n[user.gender == MALE ? "He" : "She"] seems to perk up slightly at the readout." ,\
- "The results of the scan pique your interest.",\
- "You hear a faint hum of electrical equipment, and someone making a thoughtful noise.")
- return 0
- return
-
- proc/add_data(atom/A as mob|obj|turf|area)
- //I love hashtables.
- var/list/data_entry = stored["\ref [A]"]
- if(islist(data_entry)) //Yay, it was already stored!
- //Merge the fingerprints.
- var/list/data_prints = data_entry[1]
- for(var/print in A.fingerprints)
- var/merged_print = data_prints[print]
- if(!merged_print)
- data_prints[print] = A.fingerprints[print]
- else
- data_prints[print] = stringmerge(data_prints[print],A.fingerprints[print])
-
- //Now the fibers
- var/list/fibers = data_entry[2]
- if(!fibers)
- fibers = list()
- if(A.suit_fibers && A.suit_fibers.len)
- 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 = data_entry[3]
- if(!blood)
- blood = list()
- if(A.blood_DNA && A.blood_DNA.len)
- for(var/main_blood in A.blood_DNA)
- if(!blood[main_blood])
- blood[main_blood] = A.blood_DNA[blood]
- return 1
- var/list/sum_list[4] //Pack it back up!
- sum_list[1] = A.fingerprints
- sum_list[2] = A.suit_fibers
- sum_list[3] = A.blood_DNA
- sum_list[4] = "\The [A] in \the [get_area(A)]"
- stored["\ref [A]"] = sum_list
- return 0
\ No newline at end of file
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 030e9402d55..e021cd41585 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -44,6 +44,8 @@
a_right = D2
name = "[D.name]-[D2.name] assembly"
update_icon()
+ usr.put_in_hands(src)
+
return 1
@@ -154,8 +156,10 @@
if("Right") a_right.attack_self(user)
return
else
- a_left.attack_self(user)
- a_right.attack_self(user)
+ if(!istype(a_left,/obj/item/device/assembly/igniter))
+ a_left.attack_self(user)
+ if(!istype(a_right,/obj/item/device/assembly/igniter))
+ a_right.attack_self(user)
else
var/turf/T = get_turf(src)
if(!T) return 0
@@ -172,6 +176,8 @@
process_activation(var/obj/D, var/normal = 1, var/special = 1)
if(!D) return 0
+ if(!secured)
+ visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
if((normal) && (a_right) && (a_left))
if(a_right != D)
a_right.pulsed(0)
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index 181d8d6c6f7..390372211a6 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -7,23 +7,31 @@
w_amt = 10
origin_tech = "magnets=1"
+ wires = WIRE_RECEIVE
+
secured = 1
activate()
if(!..()) return 0//Cooldown check
- var/turf/location = get_turf(loc)
- if(location)
- location.hotspot_expose(1000,1000)
- if (istype(src.loc,/obj/item/device/assembly_holder))
- if (istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/))
- var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc
- if (tank && tank.modded)
- tank.explode()
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ if(holder && istype(holder.loc,/obj/item/weapon/grenade/chem_grenade))
+ var/obj/item/weapon/grenade/chem_grenade/grenade = holder.loc
+ grenade.prime()
+ else
+ var/turf/location = get_turf(loc)
+ if(location)
+ location.hotspot_expose(1000,1000)
+ if (istype(src.loc,/obj/item/device/assembly_holder))
+ if (istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/))
+ var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc
+ if (tank && tank.modded)
+ tank.explode()
+
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+
return 1
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 45861f38401..4ce70a164eb 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -9,6 +9,8 @@
w_amt = 100
origin_tech = "magnets=2"
+ wires = WIRE_PULSE
+
secured = 0
var/on = 0
@@ -100,7 +102,8 @@
trigger_beam()
if((!secured)||(!on)||(cooldown > 0)) return 0
pulse(0)
- visible_message("\icon[src] *beep* *beep*")
+ if(!holder)
+ visible_message("\icon[src] *beep* *beep*")
cooldown = 2
spawn(10)
process_cooldown()
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index 235869667d6..3549fe9954f 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -7,12 +7,16 @@
w_amt = 50
origin_tech = "magnets=1"
+ wires = WIRE_PULSE
+
secured = 0
var/scanning = 0
var/timing = 0
var/time = 10
+ var/range = 2
+
proc
toggle_scan()
sense()
@@ -44,9 +48,14 @@
sense()
- if((!secured)||(!scanning)||(cooldown > 0)) return 0
+ var/obj/mainloc = loc
+ if(holder) mainloc=holder.loc
+// if(scanning && cooldown <= 0)
+// mainloc.visible_message("\icon[src] *boop* *boop*", "*boop* *boop*")
+ if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0
pulse(0)
- visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
+ if(!holder)
+ mainloc.visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
cooldown = 2
spawn(10)
process_cooldown()
@@ -54,6 +63,13 @@
process()
+ if(scanning)
+ var/obj/mainloc = loc
+ if(holder) mainloc=holder.loc
+ for(var/mob/living/A in range(range,mainloc))
+ if (A.move_speed < 12)
+ sense()
+
if(timing && (time >= 0))
time--
if(timing && time <= 0)
@@ -88,6 +104,9 @@
attached_overlays += "prox_scanning"
if(holder)
holder.update_icon()
+ if(holder && istype(holder.loc,/obj/item/weapon/grenade/chem_grenade))
+ var/obj/item/weapon/grenade/chem_grenade/grenade = holder.loc
+ grenade.primed(scanning)
return
@@ -104,6 +123,7 @@
var/second = time % 60
var/minute = (time - second) / 60
var/dat = text("Proximity Sensor\n[] []:[]\n- - + +\n", (timing ? text("Arming", src) : text("Not Arming", src)), minute, second, src, src, src, src)
+ dat += text("
Range: - [] +", src, range, src)
dat += "
[scanning?"Armed":"Unarmed"] (Movement sensor active when armed!)"
dat += "
Refresh"
dat += "
Close"
@@ -131,6 +151,11 @@
time += tp
time = min(max(round(time), 0), 600)
+ if(href_list["range"])
+ var/r = text2num(href_list["range"])
+ range += r
+ range = min(max(range, 1), 5)
+
if(href_list["close"])
usr << browse(null, "window=prox")
return
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index a626ffeddcc..6f70ad1a875 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -31,7 +31,7 @@
spawn(10)
process_cooldown()
- signal()
+// signal()
return 1
update_icon()
@@ -126,7 +126,7 @@
else if(holder)
holder.process_activation(src, 1, 0)
else
- ..()
+ ..(radio)
return 1
@@ -136,8 +136,9 @@
if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0
pulse(1)
- for(var/mob/O in hearers(1, src.loc))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ if(!holder)
+ for(var/mob/O in hearers(1, src.loc))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
return
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 3cce208ebe7..fc7c65b39bf 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -7,6 +7,8 @@
w_amt = 10
origin_tech = "magnets=1"
+ wires = WIRE_PULSE
+
secured = 0
var/timing = 0
@@ -37,7 +39,8 @@
timer_end()
if((!secured)||(cooldown > 0)) return 0
pulse(0)
- visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
+ if(!holder)
+ visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
cooldown = 2
spawn(10)
process_cooldown()
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 08e60eadafa..ebe481ef0e9 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -7,6 +7,28 @@
w_class = 2
gas_transfer_coefficient = 0.10
permeability_coefficient = 0.50
+ var/hanging = 0
+
+ verb/toggle()
+ set category = "Object"
+ set name = "Adjust mask"
+ set src in usr
+
+ if(usr.canmove && !usr.stat && !usr.restrained())
+ if(!src.hanging)
+ src.hanging = !src.hanging
+ gas_transfer_coefficient = 1 //gas is now escaping to the turf and vice versa
+ flags_inv |= MASKCOVERSMOUTH | MASKINTERNALS
+ icon_state = "breathdown"
+ usr << "Your mask is now hanging on your neck."
+
+ else
+ src.hanging = !src.hanging
+ gas_transfer_coefficient = 0.10
+ flags_inv &= ~(MASKCOVERSMOUTH | MASKINTERNALS)
+ icon_state = "breath"
+ usr << "You pull the mask up to cover your face."
+ usr.update_inv_wear_mask()
/obj/item/clothing/mask/breath/medical
desc = "A close-fitting sterile mask that can be connected to an air supply."
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index f1ebad3b0c1..355d838df6a 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -103,21 +103,27 @@
armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10)
allowed = list(/obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse_rifle, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/gun/energy/taser, /obj/item/weapon/melee/baton)
-//Wizard Rig
-/obj/item/clothing/head/helmet/space/rig/wizard
- name = "gem-encrusted hardsuit helmet"
- icon_state = "rig0-wiz"
- item_state = "wiz_helm"
- color = "wiz"
- unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
- armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60)
+//Atmos Rig
+/obj/item/clothing/head/helmet/space/rig/atmos
+ name = "atmospherics pressure suit helmet"
+ icon_state = "rig0-atmos"
+ item_state = "atmos_helm"
+ color = "atmos"
+ flags = STOPSPRESSUREDMAGE
+ armor = list(melee = 40, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 0)
+ gas_transfer_coefficient = 0
+ permeability_coefficient = 0
+ heat_protection = HEAD
+ max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECITON_TEMPERATURE
-/obj/item/clothing/suit/space/rig/wizard
- icon_state = "rig-wiz"
- name = "gem-encrusted hardsuit"
- item_state = "wiz_hardsuit"
- slowdown = 1
- w_class = 3
- unacidable = 1
- armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60)
- allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank/emergency_oxygen)
\ No newline at end of file
+/obj/item/clothing/suit/space/rig/atmos
+ icon_state = "rig-atmos"
+ name = "atmospherics pressure suit"
+ item_state = "atmos_hardsuit"
+ flags = STOPSPRESSUREDMAGE
+ armor = list(melee = 40, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 0)
+ gas_transfer_coefficient = 0
+ permeability_coefficient = 0
+ slowdown = 1.0
+ heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+ max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECITON_TEMPERATURE
\ No newline at end of file
diff --git a/code/modules/clothing/suits/suit_cramp.dm b/code/modules/clothing/suits/suit_cramp.dm
index 455ae543254..5c134b9a017 100644
--- a/code/modules/clothing/suits/suit_cramp.dm
+++ b/code/modules/clothing/suits/suit_cramp.dm
@@ -34,6 +34,7 @@
if(interrupted_cramps)
cramp_damage_caused = 0
+/*
/obj/item/clothing/suit/bio_suit/causes_cramps = 1
/obj/item/clothing/suit/armor/riot/causes_cramps = 1
/obj/item/clothing/suit/fire/causes_cramps = 1
@@ -44,4 +45,5 @@
//ergonomically designed space suits
/obj/item/clothing/suit/space/space_ninja/causes_cramps = 0
-/obj/item/clothing/suit/space/pirate/causes_cramps = 0
\ No newline at end of file
+/obj/item/clothing/suit/space/pirate/causes_cramps = 0
+*/
\ No newline at end of file
diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm
deleted file mode 100644
index dc6cb9293a8..00000000000
--- a/code/modules/detectivework/detective_work.dm
+++ /dev/null
@@ -1,626 +0,0 @@
-//CONTAINS: Suit fibers and Detective's Scanning Computer
-
-atom/var/list/suit_fibers
-
-atom/proc/add_fibers(mob/living/carbon/human/M)
- if(M.gloves && istype(M.gloves,/obj/item/clothing/))
- var/obj/item/clothing/gloves/G = M.gloves
- if(G.transfer_blood) //bloodied gloves transfer blood to touched objects
- if(add_blood(G.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
- G.transfer_blood--
- else if(M.bloody_hands)
- if(add_blood(M.bloody_hands_mob))
- M.bloody_hands--
- 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
-
-var/const/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 = "\improper High-Res Forensic Scanning Computer"
- icon_state = "forensic"
- var/obj/item/scanning
- var/temp = ""
- var/canclear = 1
- var/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.
- var/list/files
-//This holds objects (1) without prints, and their fibers(2) and blood(3).
- var/list/misc
- var/obj/item/weapon/f_card/card
-
- var/scan_data = ""
- var/scan_name = ""
- var/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 += "[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 += "{Access Database}
"
- dat += "[scan_data]"
- if(scan_data && !scan_process)
- dat += "
{Erase Data}"
- 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
- if (allowed(M))
- authenticated = 1
- 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.get_active_hand()
- 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") //Processing a fingerprint card.
- var/mob/M = usr
- var/obj/item/I = M.get_active_hand()
- if(!(I && istype(I,/obj/item/weapon/f_card)))
- I = card
- if(I && istype(I,/obj/item/weapon/f_card))
- card = I
- if(!card.fingerprints)
- card.fingerprints = list()
- 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()
- else
- usr << "\red Invalid Object Rejected."
- if("database") //Viewing all records in each database
- canclear = 1
- if(href_list["delete_record"])
- delete_dossier(href_list["delete_record"])
- if(href_list["delete_aux"])
- delete_record(href_list["delete_aux"])
- if((!misc || !misc.len) && (!files || !files.len))
- temp = "Database is empty."
- else
- if(files && files.len)
- temp = "Criminal Evidence Database
"
- temp += "Consolidated data points:
"
- for(var/print in files)
- var/list/file = files[print]
- temp += "{[file[2]]}
"
- temp += "
{Insert Finger Print Card (To complete a Dossier)}
"
- else
- temp = ""
- if(misc && misc.len)
- temp += "Auxiliary Evidence Database
"
- temp += "This is where anything without fingerprints goes.
"
- for(var/atom in misc)
- var/list/data_entry = misc[atom]
- temp += "{[data_entry[3]]}
"
- if("record") //Viewing a record from the "files" database.
- canclear = 0
- if(files)
- var/list/dossier = files[href_list["identifier"]]
- if(href_list["ren"])
- var/new_title = copytext(sanitize(input("Rename to what?", "Dossier Editing", "Dossier [files.Find(href_list["identifier"])]") as null|text),1,MAX_MESSAGE_LEN)
- if(new_title)
- dossier[2] = new_title
- else
- usr << "Illegal or blank name."
- temp = "Criminal Evidence Database
"
- temp += "Consolidated data points: [dossier[2]]
"
- var/print_string = "Fingerprints: Print not complete!
"
- if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE)
- print_string = "Fingerprints: (80% or higher completion reached)
[dossier[1]]
"
- temp += print_string
- for(var/object in dossier)
- if(object == dossier[1] || object == dossier[2])
- continue
- temp += "
"
- var/list/outputs = dossier[object]
- var/list/prints = outputs[1]
- temp += "Object: [outputs[4]]
"
- temp += " Fingerprints:
"
- temp += " [prints.len] Unique fingerprints found.
"
- var/complete_prints = 0
- for(var/print in prints)
- if(stringpercent(prints[print]) <= FINGERPRINT_COMPLETE)
- complete_prints++
- temp += " [prints[print]]
"
- if(complete_prints)
- temp += " And [prints.len - complete_prints] unknown unique prints.
"
- else
- temp += " No prints of sufficient completeness.
"
- var/list/fibers = outputs[2]
- if(fibers && fibers.len)
- temp += " Fibers:
"
- for(var/j = 1, j <= fibers.len, j++)
- temp += " [fibers[j]]
"
- var/list/blood = outputs[3]
- if(blood && blood.len)
- temp += " Blood:
"
- for(var/named in blood)
- temp += " Type: [blood[named]], DNA: [named]
"
- temp += "
{Rename this Dossier}"
- temp += "
{Delete this Dossier}"
- temp += "
{Print}"
- else
- temp = "ERROR. Database not found!
"
- temp += "
{Return}"
- if("databaseprint") //Printing from the "files" database.
- if(files)
- var/obj/item/weapon/paper/P = new(loc)
- P.name = "\improper Database File (Dossier [files.Find(href_list["identifier"])])"
- P.overlays += "paper_words"
- P.info = "Criminal Evidence Database
"
- var/list/dossier = files[href_list["identifier"]]
- P.info += "Consolidated data points: [dossier[2]]
"
- var/print_string = "Fingerprints: Print not complete!
"
- if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE)
- print_string = "Fingerprints: (80% or higher completion reached)
[dossier[1]]
"
- P.info += print_string
- for(var/object in dossier)
- if(object == dossier[1] || object == dossier[2])
- continue
- P.info += "
"
- var/list/outputs = dossier[object]
- var/list/prints = outputs[1]
- P.info += "Object: [outputs[4]]
"
- P.info += " Fingerprints:
"
- P.info += " [prints.len] Unique fingerprints found.
"
- var/complete_prints = 0
- for(var/print in prints)
- if(stringpercent(prints[print]) <= FINGERPRINT_COMPLETE)
- complete_prints++
- P.info += " [prints[print]]
"
- if(complete_prints)
- P.info += " And [prints.len - complete_prints] unknown unique prints.
"
- else
- P.info += " No prints of sufficient completeness.
"
- var/list/fibers = outputs[2]
- if(fibers && fibers.len)
- P.info += " Fibers:
"
- for(var/j = 1, j <= fibers.len, j++)
- P.info += " [fibers[j]]
"
- var/list/blood = outputs[3]
- if(blood && blood.len)
- P.info += " Blood:
"
- for(var/named in blood)
- P.info += " Type: [blood[named]], DNA: [named]
"
- else
- usr << "ERROR. Database not found!
"
- if("auxiliary") //Viewing a record from the "misc" database.
- canclear = 0
- if(misc)
- temp = "Auxiliary Evidence Database
"
- var/list/outputs = misc[href_list["identifier"]]
- temp += "Consolidated data points: [outputs[3]]
"
- var/list/prints = outputs[4]
- if(prints)
- temp += " Fingerprints:
"
- temp += " [prints.len] Unique fingerprints found.
"
- var/complete_prints = 0
- for(var/print in prints)
- if(stringpercent(prints[print]) <= FINGERPRINT_COMPLETE)
- complete_prints++
- temp += " [prints[print]]
"
- if(complete_prints)
- temp += " And [prints.len - complete_prints] unknown unique prints.
"
- else
- temp += " No prints of sufficient completeness.
"
- var/list/fibers = outputs[1]
- if(fibers && fibers.len)
- temp += " Fibers:
"
- for(var/fiber in fibers)
- temp += " [fiber]
"
- var/list/blood = outputs[2]
- if(blood && blood.len)
- temp += " Blood:
"
- for(var/named in blood)
- temp += " Type: [blood[named]], DNA: [named]
"
- temp += "
{Delete This Record}"
- temp += "
{Print}"
- else
- temp = "ERROR. Database not found!
"
- temp += "
{Return}"
- if("auxiliaryprint") //Printing from the "misc" database.
- if(misc)
- var/obj/item/weapon/paper/P = new(loc)
- var/list/outputs = misc[href_list["identifier"]]
- P.name = "\improper Auxiliary Database File ([outputs[3]])"
- P.overlays += "paper_words"
- P.info = "Auxiliary Evidence Database
"
- P.info += "Consolidated data points: [outputs[3]]
"
- var/list/prints = outputs[4]
- if(prints)
- P.info += " Fingerprints:
"
- P.info += " [prints.len] Unique fingerprints found.
"
- var/complete_prints = 0
- for(var/print in prints)
- if(stringpercent(prints[print]) <= FINGERPRINT_COMPLETE)
- complete_prints++
- P.info += " [prints[print]]
"
- if(complete_prints)
- P.info += " And [prints.len - complete_prints] unknown unique prints.
"
- else
- P.info += " No prints of sufficient completeness.
"
- var/list/fibers = outputs[1]
- if(fibers && fibers.len)
- P.info += " Fibers:
"
- for(var/fiber in fibers)
- P.info += " [fiber]
"
- var/list/blood = outputs[2]
- if(blood && blood.len)
- P.info += " Blood:
"
- for(var/named in blood)
- P.info += " Type: [blood[named]], DNA: [named]
"
- else
- usr << "ERROR. Database not found!
"
- 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
- if(scanning)
- scan_process = 0
- scan_name = scanning.name
- scan_data = "[scanning]
"
- if (scanning.blood_DNA)
- scan_data += "Blood Found:
"
- for(var/blood in scanning.blood_DNA)
- scan_data += "Blood type: [scanning.blood_DNA[blood]]\nDNA: [blood]
"
- else
- scan_data += "No Blood Found
"
- if(!scanning.fingerprints)
- scan_data += "No Fingerprints Found
"
- else
- scan_data += "Isolated [scanning.fingerprints.len] Fingerprints. Loaded into database.
"
- add_data(scanning)
-
- if(!scanning.suit_fibers)
- scan_data += "No Fibers/Materials Located
"
- else
- scan_data += "Fibers/Materials Found:
"
- for(var/data in scanning.suit_fibers)
- scan_data += "- [data]
"
- if(istype(scanning,/obj/item/device/detective_scanner) || (istype(scanning, /obj/item/device/pda) && scanning:cartridge && scanning:cartridge.access_security))
- scan_data += "
Data transfered from \the [scanning] to Database.
"
- add_data_scanner(scanning)
- else if(!scanning.fingerprints)
- scan_data += "
Add to Database?
"
- else
- temp = "Scan Failed: No Object"
-
-
- if("print") //Printing scan data
- if(scan_data)
- temp = "Scan Data Printed."
- var/obj/item/weapon/paper/P = new(loc)
- P.name = "\improper Scan Data ([scan_name])"
- P.info = "[scan_data]"
- P.overlays += "paper_words"
- else
- temp = "Print Failed: No Data"
- if("erase")
- scan_data = ""
- if("cancel")
- scan_process = 0
- if("add") //Adding an object (Manually) to the database.
- if(scanning)
- add_data(scanning)
- else
- temp = "Data Transfer Failed: No Object."
- if("rename")
- if(!files || !files[href_list["identifier"]])
- temp = "ERROR: Record/Database not found!"
- else
- var/new_title = copytext(sanitize(input("Rename to what?", "Dossier Editing", "Dossier [files.Find(href_list["identifier"])]") as null|text),1,MAX_MESSAGE_LEN)
- if(new_title)
- var/list/file = files[href_list["identifier"]]
- file[2] = new_title
- updateUsrDialog()
-
- ex_act()
- return
-
-
- proc/add_data_scanner(var/obj/item/device/W)
- if(istype(W, /obj/item/device/detective_scanner))
- if(W:stored)
- for(var/atom in W:stored)
- var/list/data = W:stored[atom]
- add_data_master(atom,data[1],data[2],data[3],data[4])
- W:stored = list()
- else if(istype(W, /obj/item/device/pda) && W:cartridge && W:cartridge.access_security)
- if(W:cartridge.stored_data)
- for(var/atom in W:cartridge.stored_data)
- var/list/data = W:cartridge.stored_data[atom]
- add_data_master(atom,data[1],data[2],data[3],data[4])
- W:cartridge.stored_data = list()
- return
-
- proc/add_data(var/atom/scanned_atom)
- return add_data_master("\ref [scanned_atom]", scanned_atom.fingerprints,\
- scanned_atom.suit_fibers, scanned_atom.blood_DNA, "[scanned_atom.name] (Direct Scan)")
-
-
-
-/********************************
-*****DO NOT DIRECTLY CALL ME*****
-********************************/
- proc/add_data_master(var/atom_reference, var/list/atom_fingerprints, var/list/atom_suit_fibers, var/list/atom_blood_DNA, var/atom_name)
-//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.
-
- if(!misc)
- misc = list()
- var/list/data_entry = misc[atom_reference]
- if(data_entry)
- var/list/fibers = data_entry[1]
- if(!fibers)
- fibers = list()
- if(atom_suit_fibers)
- for(var/fiber in atom_suit_fibers) //Fibers~~~
- if(!fibers.Find(fiber)) //It isn't! Add!
- fibers += fiber
- var/list/blood = data_entry[2]
- if(!blood)
- blood = list()
- if(atom_blood_DNA)
- for(var/main_blood in atom_blood_DNA)
- if(!blood[main_blood])
- blood[main_blood] = atom_blood_DNA[blood]
- var/list/prints = data_entry[4]
- if(!prints && atom_fingerprints)
- prints = list()
- if(atom_fingerprints)
- for(var/print in atom_fingerprints)
- if(!prints[print])
- prints[print] = atom_fingerprints[print]
- else
- var/list/templist[4]
- templist[1] = atom_suit_fibers
- templist[2] = atom_blood_DNA
- templist[3] = atom_name
- templist[4] = atom_fingerprints
- misc[atom_reference] = templist //Store it!
- //Has prints.
- if(atom_fingerprints)
- if(!files)
- files = list()
- for(var/main_print in atom_fingerprints)
- data_entry = files[main_print]
- if(data_entry)//The print is already in here!
- var/list/internal_atom = data_entry[atom_reference] //Lets see if we can find the current object
- if(internal_atom)
- //We must be on a roll! Just update what needs to be updated.
- var/list/internal_prints = internal_atom[1]
- for(var/print in atom_fingerprints) //Sorry for the double loop! D:
- var/associated_print = internal_prints[print]
- var/reference_print = atom_fingerprints[print]
- if(associated_print && associated_print != reference_print) //It does not match
- internal_prints[print] = stringmerge(associated_print, reference_print)
- else if(!associated_print)
- internal_prints[print] = reference_print
- //If the main print was updated, lets update the master as well.
- if(print == main_print && (!associated_print || (associated_print && associated_print != reference_print)))
- update_fingerprints(main_print, internal_prints[print])
- //Fibers.
- var/list/fibers = internal_atom[2]
- if(!fibers)
- fibers = list()
- if(atom_suit_fibers)
- for(var/fiber in atom_suit_fibers) //Fibers~~~
- if(!fibers.Find(fiber)) //It isn't! Add!
- fibers += fiber
- //Blood.
- var/list/blood = internal_atom[3]
- if(!blood)
- blood = list()
- if(atom_blood_DNA)
- for(var/main_blood in atom_blood_DNA)
- if(!blood[main_blood])
- blood[main_blood] = atom_blood_DNA[blood]
-
- continue
- //It's not in there! We gotta add it.
- update_fingerprints(main_print, atom_fingerprints[main_print])
- var/list/data_point[4]
- data_point[1] = atom_fingerprints
- data_point[2] = atom_suit_fibers
- data_point[3] = atom_blood_DNA
- data_point[4] = atom_name
- data_entry[atom_reference] = data_point
- continue
- //No print at all! New data entry, go!
- var/list/data_point[4]
- data_point[1] = atom_fingerprints
- data_point[2] = atom_suit_fibers
- data_point[3] = atom_blood_DNA
- data_point[4] = atom_name
- var/list/new_file[2]
- new_file[1] = atom_fingerprints[main_print]
- new_file[2] = "Dossier [files.len + 1]"
- new_file[atom_reference] = data_point
- files[main_print] = new_file
- return 1
-/********************************
-***END DO NOT DIRECTLY CALL ME***
-********************************/
-
- proc/update_fingerprints(var/ref_print, var/new_print)
- var/list/master = files[ref_print]
- if(master)
- master[1] = stringmerge(master[1],new_print)
- else
- CRASH("Fucking hell. Something went wrong, and it tried to update a null print or something. Tell SkyMarshal (and give him this call stack)")
- return
-
- proc/process_card() //Same as above, but for fingerprint cards
- if(card.fingerprints && !(card.amount > 1) && islist(card.fingerprints) && files && files.len)
- usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints."
- var/found = 0
- for(var/master_print in card.fingerprints)
- var/list/data_entry = files[master_print]
- if(data_entry)
- found = 1
- data_entry[1] = master_print
- if(found)
- usr << "The machinery finds it can complete a match."
- else
- usr << "No match found."
- 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/atom_ref) //Deletes an entry in the misc database at the given location
- if(misc && misc.len)
- misc.Remove(atom_ref)
- return
-
- proc/delete_dossier(var/print) //Deletes a Dossier at a given location.
- if(files && files.len)
- files.Remove(print)
- return
-
- detective
- icon_state = "old"
- name = "PowerScan Mk.I"
\ No newline at end of file
diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm
deleted file mode 100644
index 7326f35ba23..00000000000
--- a/code/modules/detectivework/evidence.dm
+++ /dev/null
@@ -1,80 +0,0 @@
-//CONTAINS: Evidence bags
-
-/obj/item/weapon/evidencebag
- name = "evidence bag"
- desc = "An empty evidence bag."
- icon = 'icons/obj/storage.dmi'
- icon_state = "evidenceobj"
- w_class = 1
-
-/obj/item/weapon/evidencebag/afterattack(obj/item/O, mob/user as mob)
- if(!in_range(O,user))
- return
-
- if(istype(O, /obj/item/weapon/storage))
- return ..()
-
- if(!istype(O) || O.anchored == 1)
- user << "You can't put that inside \the [src]!"
- return ..()
-
- if(istype(O, /obj/item/weapon/evidencebag))
- user << "You find putting an evidence bag in another evidence bag to be slightly absurd."
- return
-
- if(contents.len)
- user << "\The [src] already has something inside it."
- return ..()
-
- if(!isturf(O.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up.
- if(istype(O.loc,/obj/item/weapon/storage)) //in a container.
- var/obj/item/weapon/storage/U = O.loc
- user.client.screen -= O
- U.contents.Remove(O)
- else if(user.l_hand == O) //in a hand
- user.drop_l_hand()
- else if(user.r_hand == O) //in a hand
- user.drop_r_hand()
- else
- return
-
- user.visible_message("\The [user] puts \a [O] into \a [src]", "You put \the [O] inside \the [src].",\
- "You hear a rustle as someone puts something into a plastic bag.")
- icon_state = "evidence"
- var/image/I = image("icon"=O, "layer"=FLOAT_LAYER) //take a snapshot. (necessary to stop the underlays appearing under our inventory-HUD slots ~Carn
- underlays += I
- 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 (contents.len)
- var/obj/item/I = contents[1]
- user.visible_message("\The [user] takes \a [I] out of \a [src]", "You take \the [I] out of \the [src].",\
- "You hear someone rustle around in a plastic bag, and remove something.")
- underlays = null //remove the underlays
- user.put_in_hands(I)
- w_class = 1
- icon_state = "evidenceobj"
- desc = "An empty evidence bag."
-
- else
- user << "\The [src] is empty."
- 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
\ No newline at end of file
diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm
deleted file mode 100644
index f39aca8750c..00000000000
--- a/code/modules/detectivework/footprints_and_rag.dm
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
-obj/item/clothing/shoes/var
- track_blood = 0
- mob/living/carbon/human/track_blood_mob
- track_blood_type*/
-mob/var
- bloody_hands = 0
- mob/living/carbon/human/bloody_hands_mob
- track_blood
- mob/living/carbon/human/track_blood_mob
- track_blood_type
-obj/item/clothing/gloves/var
- transfer_blood = 0
- mob/living/carbon/human/bloody_hands_mob
-
-/*
-obj/effect/decal/cleanable/var
- track_amt = 3
- mob/blood_owner
-
-turf/Exited(mob/living/carbon/human/M)
- if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
- if(!istype(src, /turf/space)) // Bloody tracks code starts here
- var/dofoot = 1
- if(istype(M,/mob/living/simple_animal))
- if(!(istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/constructwraith)))
- dofoot = 0
-
- if(dofoot)
-
- 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),M.track_blood_type)
- else if(istype(M,/mob/living/carbon/human))
- if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes))
- var/obj/item/clothing/shoes/S = M.shoes
- if(S.track_blood > 0)
- S.track_blood--
- src.add_bloody_footprints(S.track_blood_mob,1,M.dir,S.name,S.track_blood_type) // And bloody tracks end here
- . = ..()
-turf/Entered(mob/living/carbon/human/M)
- if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
- var/dofoot = 1
- if(istype(M,/mob/living/simple_animal))
- if(!(istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/constructwraith)))
- dofoot = 0
-
- if(dofoot)
-
- if(M.track_blood > 0)
- M.track_blood--
- src.add_bloody_footprints(M.track_blood_mob,0,M.dir,get_tracks(M),M.track_blood_type)
- else if(istype(M,/mob/living/carbon/human))
- if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes) && !istype(src,/turf/space))
- var/obj/item/clothing/shoes/S = M.shoes
- if(S.track_blood > 0)
- S.track_blood--
- src.add_bloody_footprints(S.track_blood_mob,0,M.dir,S.name,S.track_blood_type)
-
-
- for(var/obj/effect/decal/cleanable/B in src)
- if(B:track_amt <= 0) continue
- if(B.type != /obj/effect/decal/cleanable/blood/tracks)
- if(istype(B, /obj/effect/decal/cleanable/xenoblood) || istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/oil) || istype(B, /obj/effect/decal/cleanable/robot_debris))
-
- var/track_type = "blood"
- if(istype(B, /obj/effect/decal/cleanable/xenoblood))
- track_type = "xeno"
- else if(istype(B, /obj/effect/decal/cleanable/oil) || istype(B, /obj/effect/decal/cleanable/robot_debris))
- track_type = "oil"
-
- if(istype(M,/mob/living/carbon/human))
- if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes))
- var/obj/item/clothing/shoes/S = M.shoes
- S.add_blood(B.blood_owner)
- S.track_blood_mob = B.blood_owner
- S.track_blood = max(S.track_blood,8)
- S.track_blood_type = track_type
- else
- M.add_blood(B.blood_owner)
- M.track_blood_mob = B.blood_owner
- M.track_blood = max(M.track_blood,rand(4,8))
- M.track_blood_type = track_type
- B.track_amt--
- break
- . = ..()
-
-turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info,bloodcolor)
- for(var/obj/effect/decal/cleanable/blood/tracks/T in src)
- if(T.dir == d && findtext(T.icon_state, bloodcolor))
- if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
- T.desc = "These bloody footprints appear to have been made by [info]."
- if(!T.blood_DNA)
- T.blood_DNA = list()
- if(istype(M,/mob/living/carbon/human))
- T.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
- else if(istype(M,/mob/living/carbon/alien))
- T.blood_DNA["UNKNOWN DNA"] = "X*"
- else if(istype(M,/mob/living/carbon/monkey))
- T.blood_DNA["Non-human DNA"] = "A+"
- return
- var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
- this.icon = 'icons/effects/footprints.dmi'
-
- var/preiconstate = ""
-
- if(info == "animal paws")
- preiconstate = "paw"
- else if(info == "alien claws")
- preiconstate = "claw"
- else if(info == "small alien feet")
- preiconstate = "paw"
-
- if(leaving)
- this.icon_state = "[bloodcolor][preiconstate]2"
- else
- this.icon_state = "[bloodcolor][preiconstate]1"
- this.dir = d
-
- if(bloodcolor == "blood")
- this.desc = "These bloody footprints appear to have been made by [info]."
- else if(bloodcolor == "xeno")
- this.desc = "These acidic bloody footprints appear to have been made by [info]."
- else if(bloodcolor == "oil")
- this.name = "oil"
- this.desc = "These oil footprints appear to have been made by [info]."
-
- if(istype(M,/mob/living/carbon/human))
- if(!this.blood_DNA)
- this.blood_DNA = list()
- this.blood_DNA[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) || istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/crab))
- . = "animal paws"
- else if(istype(M,/mob/living/silicon/robot))
- . = "robot feet"
- else if(istype(M,/mob/living/carbon/alien/humanoid))
- . = "alien claws"
- else if(istype(M,/mob/living/carbon/alien/larva))
- . = "small alien 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/reagent_containers/glass/rag
- name = "damp rag"
- desc = "For cleaning up messes, you suppose."
- w_class = 1
- icon = 'icons/obj/toy.dmi'
- icon_state = "rag"
- amount_per_transfer_from_this = 5
- possible_transfer_amounts = list(5)
- volume = 5
- can_be_placed_into = null
-
- attack(atom/target as obj|turf|area, mob/user as mob , flag)
- if(ismob(target) && target.reagents && reagents.total_volume)
- user.visible_message("\red \The [target] has been smothered with \the [src] by \the [user]!", "\red You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise")
- src.reagents.reaction(target, INGEST)
- spawn(5) src.reagents.clear_reagents()
- return
- else
- ..()
-
- afterattack(atom/A as obj|turf|area, mob/user as mob)
- if(istype(A) && src in user)
- 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
-
- examine()
- if (!usr)
- return
- usr << "That's \a [src]."
- usr << desc
- return
\ No newline at end of file
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
deleted file mode 100644
index c3d1b481ac3..00000000000
--- a/code/modules/detectivework/scanner.dm
+++ /dev/null
@@ -1,172 +0,0 @@
-//CONTAINS: Detective's Scanner
-
-/obj/item/device/detective_scanner
- name = "Scanner"
- desc = "Used to scan objects for DNA and fingerprints."
- icon_state = "forensic1"
- var/amount = 20.0
- var/list/stored = list()
- w_class = 3.0
- item_state = "electronic"
- flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
- slot_flags = SLOT_BELT
-
- attackby(obj/item/weapon/f_card/W as obj, mob/user as mob)
- ..()
- if (istype(W, /obj/item/weapon/f_card))
- if (W.fingerprints)
- return
- if (src.amount == 20)
- return
- if (W.amount + src.amount > 20)
- src.amount = 20
- W.amount = W.amount + src.amount - 20
- else
- src.amount += W.amount
- //W = null
- del(W)
- add_fingerprint(user)
- if (W)
- W.add_fingerprint(user)
- return
-
- attack(mob/living/carbon/human/M as mob, mob/user as mob)
- if (!ishuman(M))
- user << "\red [M] is not human and cannot have the fingerprints."
- return 0
- if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
- user << "\blue No fingerprints found on [M]"
- return 0
- else
- if (src.amount < 1)
- user << text("\blue Fingerprints scanned on [M]. Need more cards to print.")
- else
- src.amount--
- var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
- F.amount = 1
- F.add_fingerprint(M)
- F.icon_state = "fingerprint1"
- F.name = text("FPrintC- '[M.name]'")
-
- user << "\blue Done printing."
- user << "\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]"
- if ( !M.blood_DNA || !M.blood_DNA.len )
- user << "\blue No blood found on [M]"
- if(M.blood_DNA)
- del(M.blood_DNA)
- else
- user << "\blue Blood found on [M]. Analysing..."
- spawn(15)
- for(var/blood in M.blood_DNA)
- user << "\blue Blood type: [M.blood_DNA[blood]]\nDNA: [blood]"
- return
-
- afterattack(atom/A as obj|turf|area, mob/user as mob)
- if(!in_range(A,user))
- return
- if(loc != user)
- return
- if(istype(A,/obj/machinery/computer/forensic_scanning)) //breaks shit.
- return
- if(istype(A,/obj/item/weapon/f_card))
- user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\""
- return
-
- add_fingerprint(user)
-
-
- //Special case for blood splaters.
- if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
- if(!isnull(A.blood_DNA))
- for(var/blood in A.blood_DNA)
- user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
- return
-
- //General
- if ((!A.fingerprints || !A.fingerprints.len) && !A.suit_fibers && !A.blood_DNA)
- user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
- "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\
- "You hear a faint hum of electrical equipment.")
- return 0
-
- if(add_data(A))
- user << "\blue Object already in internal memory. Consolidating data..."
- return
-
-
- //PRINTS
- if(!A.fingerprints || !A.fingerprints.len)
- if(A.fingerprints)
- del(A.fingerprints)
- else
- user << "\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
- var/list/complete_prints = list()
- for(var/i in A.fingerprints)
- var/print = A.fingerprints[i]
- if(stringpercent(print) <= FINGERPRINT_COMPLETE)
- complete_prints += print
- if(complete_prints.len < 1)
- user << "\blue No intact prints found"
- else
- user << "\blue Found [complete_prints.len] intact prints"
- for(var/i in complete_prints)
- user << "\blue [i]"
-
- //FIBERS
- if(A.suit_fibers)
- user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
-
- //Blood
- if (A.blood_DNA)
- user << "\blue Blood found on [A]. Analysing..."
- spawn(15)
- for(var/blood in A.blood_DNA)
- user << "Blood type: \red [A.blood_DNA[blood]] \t \black DNA: \red [blood]"
- if(prob(80) || !A.fingerprints)
- user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
- "You finish scanning \the [A].",\
- "You hear a faint hum of electrical equipment.")
- return 0
- else
- user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]\n[user.gender == MALE ? "He" : "She"] seems to perk up slightly at the readout." ,\
- "The results of the scan pique your interest.",\
- "You hear a faint hum of electrical equipment, and someone making a thoughtful noise.")
- return 0
- return
-
- proc/add_data(atom/A as mob|obj|turf|area)
- //I love hashtables.
- var/list/data_entry = stored["\ref [A]"]
- if(islist(data_entry)) //Yay, it was already stored!
- //Merge the fingerprints.
- var/list/data_prints = data_entry[1]
- for(var/print in A.fingerprints)
- var/merged_print = data_prints[print]
- if(!merged_print)
- data_prints[print] = A.fingerprints[print]
- else
- data_prints[print] = stringmerge(data_prints[print],A.fingerprints[print])
-
- //Now the fibers
- var/list/fibers = data_entry[2]
- if(!fibers)
- fibers = list()
- if(A.suit_fibers && A.suit_fibers.len)
- 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 = data_entry[3]
- if(!blood)
- blood = list()
- if(A.blood_DNA && A.blood_DNA.len)
- for(var/main_blood in A.blood_DNA)
- if(!blood[main_blood])
- blood[main_blood] = A.blood_DNA[blood]
- return 1
- var/list/sum_list[4] //Pack it back up!
- sum_list[1] = A.fingerprints
- sum_list[2] = A.suit_fibers
- sum_list[3] = A.blood_DNA
- sum_list[4] = "\The [A] in \the [get_area(A)]"
- stored["\ref [A]"] = sum_list
- return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 9feea5312e2..f1d0716e3a1 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -184,8 +184,8 @@
src.r_hand = null
update_inv_r_hand()
- //check later on if our species can't wear some clothes
- var/cur_species = get_species()
+ //check later on if our species can't wear some clothes. Hawk: Bugger that. Just tell them in the roundstart messages! We whitelist them!
+// var/cur_species = get_species()
W.loc = src
switch(slot)
@@ -231,7 +231,7 @@
W.equipped(src, slot)
update_inv_glasses(redraw_mob)
if(slot_gloves)
- var/broken = 0
+ /*var/broken = 0
if(cur_species == "Tajaran")
if(prob(5))
src.visible_message("\red Your claws burst out of the [W], ripping them to shreds!", "\red [src]'s claws burst out of the [W], ripping them to shreds!", "\red You hear a ripping, tearing sound!")
@@ -255,7 +255,7 @@
if(!broken)
src.gloves = W
W.equipped(src, slot)
- update_inv_gloves(redraw_mob)
+ update_inv_gloves(redraw_mob)*/
if(slot_head)
src.head = W
if(head.flags & BLOCKHAIR)
@@ -265,10 +265,11 @@
W.equipped(src, slot)
update_inv_head(redraw_mob)
if(slot_shoes)
- var/broken = 0
+ /*var/broken = 0
if(cur_species == "Tajaran")
if(prob(5))
src.visible_message("\red Your feet burst out of the [W], ripping them to shreds!", "\red [src]'s feet burst out of the [W], ripping them to shreds!", "\red You hear a ripping, tearing sound!")
+ affecting.take_damage(5, 0, 0)
var/datum/organ/external/affecting = get_organ("l_foot")
if(affecting)
affecting.take_damage(2.5, 0, 0)
@@ -280,6 +281,7 @@
del(W)
else if(prob(50))
src << "\red You hurt your feet forcing them into the [W]!"
+ update_inv_shoes(redraw_mob)
var/datum/organ/external/affecting = get_organ("r_foot")
if(affecting)
affecting.take_damage(2.5, 0, 0)
@@ -289,15 +291,15 @@
if(!broken)
src.shoes = W
W.equipped(src, slot)
- update_inv_shoes(redraw_mob)
+ update_inv_shoes(redraw_mob)*/
if(slot_wear_suit)
src.wear_suit = W
W.equipped(src, slot)
- update_inv_wear_suit(redraw_mob)
if(istype(W,/obj/item/clothing/suit) && W:causes_cramps)
src << "\red You put on the [W]. It's pretty heavy and uncomfortable."
spawn(rand(MIN_CRAMP_TIME, MAX_CRAMP_TIME))
W:cramp_up()
+ update_inv_wear_suit(redraw_mob)
if(slot_w_uniform)
src.w_uniform = W
W.equipped(src, slot)
@@ -322,9 +324,8 @@
src << "\red You are trying to eqip this item to an unsupported inventory slot. How the heck did you manage that? Stop it..."
return
-
//can't quite fit some alien bodyparts
- if( W.body_parts_covered & LOWER_TORSO && W.flags_inv & HIDEJUMPSUIT && (cur_species == "Tajaran" || cur_species == "Soghun"))
+ /*if( W.body_parts_covered & LOWER_TORSO && W.flags_inv & HIDEJUMPSUIT && (cur_species == "Tajaran" || cur_species == "Soghun"))
if(prob(50))
src << "\red You twist your tail trying to fit it into the [W]!"
var/datum/organ/external/affecting = get_organ("chest")
@@ -335,8 +336,7 @@
src << "\red You twist your eartails trying to fit them into the [W]!"
var/datum/organ/external/affecting = get_organ("head")
if(affecting)
- affecting.take_damage(5, 0, 0)
-
+ affecting.take_damage(5, 0, 0)*/
W.layer = 20
return
@@ -697,4 +697,4 @@ It can still be worn/put on as normal.
if(source && target)
if(source.machine == target)
target.show_inv(source)
- del(src)
\ No newline at end of file
+ del(src)
diff --git a/code/modules/mob/new_player/preferences.dm b/code/modules/mob/new_player/preferences.dm
index a0ddc987a63..5f2030a39c2 100644
--- a/code/modules/mob/new_player/preferences.dm
+++ b/code/modules/mob/new_player/preferences.dm
@@ -16,7 +16,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "Love-Hearts", "Black2", "Grey2", "Stripey", "Kinky", "None") //Curse whoever made male/female underwear diffrent colours
var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "Babydoll", "Baby-Blue", "Green", "Pink", "Kinky", "None")
-var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel")
+var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
var/const/BE_TRAITOR =(1<<0)
var/const/BE_OPERATIVE =(1<<1)
@@ -708,14 +708,14 @@ datum/preferences
randomize_skin_tone()
if("bag")
- backbag = rand(1,3)
+ backbag = rand(1,4)
if("all")
gender = pick(MALE,FEMALE)
randomize_name()
age = rand(17,45)
underwear = rand(1,12)
- backbag = rand(1,3)
+ backbag = rand(1,4)
randomize_hair_color("hair")
randomize_hair(gender)
randomize_hair_color("facial")
@@ -1192,7 +1192,7 @@ datum/preferences
underwear = 1 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me.
character.underwear = underwear
- if(backbag > 3 || backbag < 1)
+ if(backbag > 4 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index d17daa84c56..3eb4e92ee26 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -267,7 +267,7 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- else if(backbag == 3)
+ else if(backbag == 3 || backbag == 4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
else if(job_civilian_high)//I hate how this looks, but there's no reason to go through this switch if it's empty
@@ -277,90 +277,124 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- else if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(BARTENDER)
clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- else if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(BOTANIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "ggloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apron"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- else if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-hyd"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-hyd"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(CHEF)
clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(JANITOR)
clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(LIBRARIAN)
clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(QUARTERMASTER)
clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "clipboard"), ICON_UNDERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(CARGOTECH)
clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(MINER)
clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(LAWYER)
clothes_s = new /icon('icons/mob/uniform.dmi', "lawyer_blue_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "briefcase"), ICON_UNDERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(CHAPLAIN)
clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(CLOWN)
clothes_s = new /icon('icons/mob/uniform.dmi', "clown_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "clown"), ICON_UNDERLAY)
@@ -373,10 +407,13 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "mime"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "suspenders"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
else if(job_medsci_high)
switch(job_medsci_high)
@@ -385,61 +422,82 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "clipboard"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(SCIENTIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(CHEMIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-chem"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-chem"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(CMO)
clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/items_lefthand.dmi', "firstaid"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(DOCTOR)
clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/items_lefthand.dmi', "firstaid"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(GENETICIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-gen"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-gen"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(VIROLOGIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "sterile"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-vir"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-vir"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
else if(job_engsec_high)
switch(job_engsec_high)
@@ -450,30 +508,39 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "caparmor"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-cap"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(HOS)
clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(WARDEN)
clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(DETECTIVE)
clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
@@ -481,19 +548,25 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "detective"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(OFFICER)
clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(CHIEF)
clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
@@ -501,51 +574,63 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_white"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(ENGINEER)
clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_yellow"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(ATMOSTECH)
clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(ROBOTICIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
- if(backbag == 2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- if(backbag == 3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(AI)//Gives AI and borgs assistant-wear, so they can still customize their character
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- else if(backbag == 3)
+ else if(backbag == 3 || backbag == 4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(CYBORG)
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
- else if(backbag == 3)
+ else if(backbag == 3 || backbag == 4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
preview_icon.Blend(eyes_s, ICON_OVERLAY)
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 0388dd0a9e6..fbdd6cfa420 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -1498,8 +1498,9 @@ datum
if(M.bodytemperature < 170)
M.adjustCloneLoss(-1)
M.adjustOxyLoss(-3)
- M.heal_organ_damage(3,3)
- M.adjustToxLoss(-3)
+ if(prob(50))
+ M.heal_organ_damage(1,1)
+ M.adjustToxLoss(-1)
..()
return
@@ -1515,8 +1516,8 @@ datum
if(M.bodytemperature < 170)
M.adjustCloneLoss(-3)
M.adjustOxyLoss(-3)
- M.heal_organ_damage(3,3)
- M.adjustToxLoss(-3)
+ M.heal_organ_damage(1,1)
+ M.adjustToxLoss(-1)
..()
return
diff --git a/config/admins.txt b/config/admins.txt
index c2b5bf032eb..f4da1f17b52 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -25,3 +25,4 @@ strumpetplaya - Retired Admin
tastyfish - Retired Admin
uristqwerty - Game Master
wrongnumber - Game Admin
+gaben - Game Admin
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 153cedbe6ae..6ca3c2b923d 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi
index 18da4b7bf42..ffac5f672c1 100644
Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ
diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi
index 74b5eed3a29..f73d9ee81da 100644
Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 28dc9e85870..f530d9c8dfe 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 3f4b469b4bf..93759acf412 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 90e750a0e0d..34a06d7da3b 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 332352db315..bd508172d67 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
old mode 100755
new mode 100644
index 057dc69a262..638d1d48da5
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index d548e040c65..d7586a9e82d 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ